diff --git a/basebmp/test/basictest.cxx b/basebmp/test/basictest.cxx index 15d2da39851a..d4d836a4b553 100644 --- a/basebmp/test/basictest.cxx +++ b/basebmp/test/basictest.cxx @@ -30,7 +30,7 @@ // autogenerated file with codegen.pl -#include +#include #include #include diff --git a/basebmp/test/bmpmasktest.cxx b/basebmp/test/bmpmasktest.cxx index afadcad3b3fb..1b9e4ca0c68f 100644 --- a/basebmp/test/bmpmasktest.cxx +++ b/basebmp/test/bmpmasktest.cxx @@ -30,7 +30,7 @@ // autogenerated file with codegen.pl -#include +#include #include #include diff --git a/basebmp/test/bmptest.cxx b/basebmp/test/bmptest.cxx index 33ed58c25402..978c4bbe6243 100644 --- a/basebmp/test/bmptest.cxx +++ b/basebmp/test/bmptest.cxx @@ -30,7 +30,7 @@ // autogenerated file with codegen.pl -#include +#include #include #include diff --git a/basebmp/test/cliptest.cxx b/basebmp/test/cliptest.cxx index 2172b0b667a7..41da8cac617a 100644 --- a/basebmp/test/cliptest.cxx +++ b/basebmp/test/cliptest.cxx @@ -30,7 +30,7 @@ // autogenerated file with codegen.pl -#include +#include #include #include diff --git a/basebmp/test/filltest.cxx b/basebmp/test/filltest.cxx index fcc4e5df5fa3..ba25cfa9044e 100644 --- a/basebmp/test/filltest.cxx +++ b/basebmp/test/filltest.cxx @@ -30,7 +30,7 @@ // autogenerated file with codegen.pl -#include +#include #include #include diff --git a/basebmp/test/linetest.cxx b/basebmp/test/linetest.cxx index 1a424864f893..b78175128eba 100644 --- a/basebmp/test/linetest.cxx +++ b/basebmp/test/linetest.cxx @@ -30,7 +30,7 @@ // autogenerated file with codegen.pl -#include +#include #include #include diff --git a/basebmp/test/makefile.mk b/basebmp/test/makefile.mk index 43165b831a64..f7a5dded4cf1 100644 --- a/basebmp/test/makefile.mk +++ b/basebmp/test/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -57,7 +57,7 @@ CFLAGS += -fno-inline # SunStudio 12 (-m64 and -m32 modes): three test cases of the unit tests fail # if compiled with default -xalias_level (and optimization level -xO3) -.IF "$(OS)"=="SOLARIS" +.IF "$(OS)"=="SOLARIS" # For Sun Studio 8 this switch does not work: compilation fails on bitmapdevice.cxx .IF "$(CCNUMVER)"!="00050005" CDEFS+=-xalias_level=compatible @@ -65,9 +65,10 @@ CDEFS+=-xalias_level=compatible .ENDIF # --- Common ---------------------------------------------------------- +.IF "$(L10N_framework)"=="" # BEGIN ---------------------------------------------------------------- -# auto generated Target:tests by codegen.pl +# auto generated Target:tests by codegen.pl SHL1OBJS= \ $(SLO)$/basictest.obj \ $(SLO)$/bmpmasktest.obj \ @@ -85,17 +86,17 @@ SHL1OBJS= \ # here, because not yet delivered. Need the functionality to test, so # we're linking it in statically. Need to keep this in sync with # source/makefile.mk - SHL1TARGET= tests SHL1STDLIBS= $(SALLIB) \ + $(TESTSHL2LIB)\ $(CPPUNITLIB) \ - $(BASEGFXLIB) + $(BASEGFXLIB) SHL1IMPLIB= i$(SHL1TARGET) DEF1NAME =$(SHL1TARGET) -SHL1VERSIONMAP = export.map - +SHL1VERSIONMAP = export.map +.ENDIF # END ------------------------------------------------------------------ #APP2TARGET= bmpdemo @@ -111,7 +112,7 @@ SHL1VERSIONMAP = export.map # $(CPPUHELPERLIB) \ # $(UCBHELPERLIB) \ # $(SALLIB) \ -# $(VCLLIB) +# $(VCLLIB) # #.IF "$(GUI)"!="UNX" #APP2DEF= $(MISC)$/$(TARGET).def @@ -119,19 +120,21 @@ SHL1VERSIONMAP = export.map #------------------------------- All object files ------------------------------- # do this here, so we get right dependencies -SLOFILES=$(SHL1OBJS) +SLOFILES=$(SHL1OBJS) # --- Targets ------------------------------------------------------ .INCLUDE : target.mk -.INCLUDE : _cppunit.mk +.INCLUDE : _cppunit.mk # --- Enable test execution in normal build ------------------------ +.IF "$(L10N_framework)"=="" unittest : $(SHL1TARGETN) @echo ---------------------------------------------------------- @echo - start unit test on library $(SHL1TARGETN) @echo ---------------------------------------------------------- - $(AUGMENT_LIBRARY_PATH) testshl2 -sf $(mktmp ) $(SHL1TARGETN) + $(TESTSHL2) -sf $(mktmp ) $(SHL1TARGETN) ALLTAR : unittest +.ENDIF diff --git a/basebmp/test/masktest.cxx b/basebmp/test/masktest.cxx index 61f329f094f2..94e5bc42a5ea 100644 --- a/basebmp/test/masktest.cxx +++ b/basebmp/test/masktest.cxx @@ -30,7 +30,7 @@ // autogenerated file with codegen.pl -#include +#include #include #include diff --git a/basebmp/test/polytest.cxx b/basebmp/test/polytest.cxx index e35c8c834bd9..da118e4b6d8a 100644 --- a/basebmp/test/polytest.cxx +++ b/basebmp/test/polytest.cxx @@ -30,7 +30,7 @@ // autogenerated file with codegen.pl -#include +#include #include #include diff --git a/basegfx/inc/basegfx/color/bcolortools.hxx b/basegfx/inc/basegfx/color/bcolortools.hxx new file mode 100644 index 000000000000..b4906727d08b --- /dev/null +++ b/basegfx/inc/basegfx/color/bcolortools.hxx @@ -0,0 +1,76 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: bcolor.hxx,v $ + * + * $Revision: 1.2 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _BGFX_COLOR_BCOLORTOOLS_HXX +#define _BGFX_COLOR_BCOLORTOOLS_HXX + +#include + +////////////////////////////////////////////////////////////////////////////// + +namespace basegfx +{ + class BColor; + + namespace tools + { + /// Transform from RGB to HSL + BColor rgb2hsl(const BColor& rRGBColor); + /// Transform from HSL to RGB + BColor hsl2rgb(const BColor& rHSLColor); + + /// Transform from RGB to HSV + BColor rgb2hsv(const BColor& rRGBColor); + /// Transform from HSV to RGB + BColor hsv2rgb(const BColor& rHSVColor); + + /// Transform from R'G'B' to YIQ (NTSC color model - Y is used in monochrome mode) + BColor rgb2yiq(const BColor& rRGBColor); + /// Transform from YIQ to R'G'B' (NTSC color model - Y is used in monochrome mode) + BColor yiq2rgb(const BColor& rYIQColor); + + /// Transform from R'G'B' to Y'PbPr (the [0,1]x[-.5,.5]x[-.5,.5] equivalent of Y'CbCr (which is scaled into 8bit)) + BColor rgb2ypbpr(const BColor& rRGBColor); + /// Transform from Y'PbPr (the [0,1]x[-.5,.5]x[-.5,.5] equivalent of Y'CbCr (which is scaled into 8bit)) into R'G'B' + BColor ypbpr2rgb(const BColor& rYPbPrColor); + + /// Transform from CIE XYZ into Rec. 709 RGB (D65 white point) + BColor ciexyz2rgb( const BColor& rXYZColor ); + /// Transform from Rec. 709 RGB (D65 white point) into CIE XYZ + BColor rgb2ciexyz( const BColor& rRGBColor ); + + } +} // end of namespace basegfx + +#endif /* _BGFX_COLOR_BCOLORTOOLS_HXX */ + +////////////////////////////////////////////////////////////////////////////// +// eof diff --git a/basegfx/inc/basegfx/curve/b2dcubicbezier.hxx b/basegfx/inc/basegfx/curve/b2dcubicbezier.hxx index 4dc2f45568f1..81be451499ea 100644 --- a/basegfx/inc/basegfx/curve/b2dcubicbezier.hxx +++ b/basegfx/inc/basegfx/curve/b2dcubicbezier.hxx @@ -203,6 +203,22 @@ namespace basegfx sense to use reserve(4) at the vector as preparation. */ void getAllExtremumPositions(::std::vector< double >& rResults) const; + + /** Get optimum-split position on this segment + + This method calculates the positions of all points of the segment + that have the maximimum distance to the corresponding line from + startpoint-endpoint. This helps to approximate the bezier curve + with a minimum number of line segments + + @param fResults + Result positions are in the range ]0.0 .. 1.0[ + Cubic beziers have at most two of these positions + + @return + Returns the number of split positions found + */ + int getMaxDistancePositions( double fResults[2]) const; }; } // end of namespace basegfx diff --git a/basegfx/inc/basegfx/polygon/b2dpolygon.hxx b/basegfx/inc/basegfx/polygon/b2dpolygon.hxx index ee12d55d460b..c0de4b57ced8 100644 --- a/basegfx/inc/basegfx/polygon/b2dpolygon.hxx +++ b/basegfx/inc/basegfx/polygon/b2dpolygon.hxx @@ -7,7 +7,6 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: b2dpolygon.hxx,v $ - * $Revision: 1.14 $ * * This file is part of OpenOffice.org. * @@ -88,7 +87,9 @@ namespace basegfx /// Coordinate insert/append void insert(sal_uInt32 nIndex, const basegfx::B2DPoint& rPoint, sal_uInt32 nCount = 1); - void append(const basegfx::B2DPoint& rPoint, sal_uInt32 nCount = 1); + void append(const basegfx::B2DPoint& rPoint, sal_uInt32 nCount); + void append(const basegfx::B2DPoint& rPoint); + void reserve(sal_uInt32 nCount); /// Basic ControlPoint interface basegfx::B2DPoint getPrevControlPoint(sal_uInt32 nIndex) const; diff --git a/basegfx/inc/basegfx/polygon/b2dpolypolygoncutter.hxx b/basegfx/inc/basegfx/polygon/b2dpolypolygoncutter.hxx index 9474e51e3904..12532ff078f3 100644 --- a/basegfx/inc/basegfx/polygon/b2dpolypolygoncutter.hxx +++ b/basegfx/inc/basegfx/polygon/b2dpolypolygoncutter.hxx @@ -104,6 +104,15 @@ namespace basegfx // DIFF: Return all areas where CandidateA is not covered by CandidateB (cut B out of A) B2DPolyPolygon solvePolygonOperationDiff(const B2DPolyPolygon& rCandidateA, const B2DPolyPolygon& rCandidateB); + /** merge all single PolyPolygons to a single, OR-ed PolyPolygon + + @param rInput + The source PolyPolygons + + @return A single PolyPolygon containing the Or-merged result + */ + B2DPolyPolygon mergeToSinglePolyPolygon(const std::vector< basegfx::B2DPolyPolygon >& rInput); + } // end of namespace tools } // end of namespace basegfx diff --git a/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx b/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx index 5c75edd7f262..c4687b3cfc5f 100644 --- a/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx +++ b/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx @@ -262,6 +262,20 @@ namespace basegfx bool equal(const B2DPolyPolygon& rCandidateA, const B2DPolyPolygon& rCandidateB, const double& rfSmallValue); bool equal(const B2DPolyPolygon& rCandidateA, const B2DPolyPolygon& rCandidateB); + /** snap some polygon coordinates to discrete coordinates + + This method allows to snap some polygon points to discrete (integer) values + which equals e.g. a snap to discrete coordinates. It will snap points of + horizontal and vertical edges + + @param rCandidate + The source polygon + + @return + The modified version of the source polygon + */ + B2DPolyPolygon snapPointsOfHorizontalOrVerticalEdges(const B2DPolyPolygon& rCandidate); + } // end of namespace tools } // end of namespace basegfx diff --git a/basegfx/inc/basegfx/range/b1drange.hxx b/basegfx/inc/basegfx/range/b1drange.hxx index efca06d92dfd..366431c3cd50 100644 --- a/basegfx/inc/basegfx/range/b1drange.hxx +++ b/basegfx/inc/basegfx/range/b1drange.hxx @@ -7,7 +7,6 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: b1drange.hxx,v $ - * $Revision: 1.15 $ * * This file is part of OpenOffice.org. * @@ -131,6 +130,11 @@ namespace basegfx return maRange.overlaps(rRange.maRange); } + bool overlapsMore(const B1DRange& rRange) const + { + return maRange.overlapsMore(rRange.maRange); + } + void expand(double fValue) { maRange.expand(fValue); diff --git a/basegfx/inc/basegfx/range/b2drange.hxx b/basegfx/inc/basegfx/range/b2drange.hxx index 66892865399f..8a70d4782f47 100644 --- a/basegfx/inc/basegfx/range/b2drange.hxx +++ b/basegfx/inc/basegfx/range/b2drange.hxx @@ -7,7 +7,6 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: b2drange.hxx,v $ - * $Revision: 1.19 $ * * This file is part of OpenOffice.org. * @@ -222,6 +221,14 @@ namespace basegfx ); } + bool overlapsMore(const B2DRange& rRange) const + { + return ( + maRangeX.overlapsMore(rRange.maRangeX) + && maRangeY.overlapsMore(rRange.maRangeY) + ); + } + void expand(const B2DTuple& rTuple) { maRangeX.expand(rTuple.getX()); diff --git a/basegfx/inc/basegfx/range/basicrange.hxx b/basegfx/inc/basegfx/range/basicrange.hxx index a7c402c905c8..59d13cf530c0 100644 --- a/basegfx/inc/basegfx/range/basicrange.hxx +++ b/basegfx/inc/basegfx/range/basicrange.hxx @@ -7,7 +7,6 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: basicrange.hxx,v $ - * $Revision: 1.15 $ * * This file is part of OpenOffice.org. * @@ -142,6 +141,14 @@ namespace basegfx } } + bool overlapsMore(const BasicRange& rRange) const + { + if(isEmpty() || rRange.isEmpty()) + return false; + // returns true if the overlap is more than just a touching at the limits + return ((rRange.mnMaximum > mnMinimum) && (rRange.mnMinimum < mnMaximum)); + } + bool operator==( const BasicRange& rRange ) const { return (mnMinimum == rRange.mnMinimum && mnMaximum == rRange.mnMaximum); diff --git a/basegfx/prj/d.lst b/basegfx/prj/d.lst index 9dd6085bbc7f..a58cd33e4f9c 100644 --- a/basegfx/prj/d.lst +++ b/basegfx/prj/d.lst @@ -96,6 +96,7 @@ mkdir: %_DEST%\inc%_EXT%\basegfx\tools mkdir: %_DEST%\inc%_EXT%\basegfx\color ..\inc\basegfx\color\bcolor.hxx %_DEST%\inc%_EXT%\basegfx\color\bcolor.hxx +..\inc\basegfx\color\bcolortools.hxx %_DEST%\inc%_EXT%\basegfx\color\bcolortools.hxx ..\inc\basegfx\color\bcolormodifier.hxx %_DEST%\inc%_EXT%\basegfx\color\bcolormodifier.hxx mkdir: %_DEST%\inc%_EXT%\basegfx\pixel diff --git a/basegfx/source/color/bcolortools.cxx b/basegfx/source/color/bcolortools.cxx new file mode 100644 index 000000000000..1c7d2b222fff --- /dev/null +++ b/basegfx/source/color/bcolortools.cxx @@ -0,0 +1,272 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: bcolor.cxx,v $ + * + * $Revision: 1.2 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_basegfx.hxx" + +#include +#include +#include + +////////////////////////////////////////////////////////////////////////////// + +namespace basegfx { namespace tools +{ + BColor rgb2hsl(const BColor& rRGBColor) + { + const double r=rRGBColor.getRed(), g=rRGBColor.getGreen(), b=rRGBColor.getBlue(); + const double minVal = ::std::min( ::std::min( r, g ), b ); + const double maxVal = ::std::max( ::std::max( r, g ), b ); + const double d = maxVal - minVal; + + double h=0, s=0, l=0; + + l = (maxVal + minVal) / 2.0; + + if( ::basegfx::fTools::equalZero(d) ) + { + s = h = 0; // hue undefined (achromatic case) + } + else + { + s = l > 0.5 ? d/(2.0-maxVal-minVal) : + d/(maxVal + minVal); + + if( r == maxVal ) + h = (g - b)/d; + else if( g == maxVal ) + h = 2.0 + (b - r)/d; + else + h = 4.0 + (r - h)/d; + + h *= 60.0; + + if( h < 0.0 ) + h += 360.0; + } + + return BColor(h,s,l); + } + + static inline double hsl2rgbHelper( double nValue1, double nValue2, double nHue ) + { + // clamp hue to [0,360] + nHue = fmod( nHue, 360.0 ); + + // cope with wrap-arounds + if( nHue < 0.0 ) + nHue += 360.0; + + if( nHue < 60.0 ) + return nValue1 + (nValue2 - nValue1)*nHue/60.0; + else if( nHue < 180.0 ) + return nValue2; + else if( nHue < 240.0 ) + return nValue1 + (nValue2 - nValue1)*(240.0 - nHue)/60.0; + else + return nValue1; + } + + BColor hsl2rgb(const BColor& rHSLColor) + { + const double h=rHSLColor.getRed(), s=rHSLColor.getGreen(), l=rHSLColor.getBlue(); + + if( fTools::equalZero(s) ) + return BColor(l, l, l ); // achromatic case + + const double nVal1( l <= 0.5 ? l*(1.0 + s) : l + s - l*s ); + const double nVal2( 2.0*l - nVal1 ); + + return BColor( + hsl2rgbHelper(nVal2, + nVal1, + h + 120.0), + hsl2rgbHelper(nVal2, + nVal1, + h), + hsl2rgbHelper(nVal2, + nVal1, + h - 120.0) ); + } + + BColor rgb2hsv(const BColor& rRGBColor) + { + const double r=rRGBColor.getRed(), g=rRGBColor.getGreen(), b=rRGBColor.getBlue(); + const double maxVal = std::max(std::max(r,g),b); + const double minVal = std::min(std::min(r,g),b); + const double delta = maxVal-minVal; + + double h=0, s=0, v=0; + + v = maxVal; + if( fTools::equalZero(v) ) + s = 0; + else + s = delta / v; + + if( !fTools::equalZero(s) ) + { + if( maxVal == r ) + { + h = (g - b) / delta; + } + else if( maxVal == g ) + { + h = 2.0 + (b - r) / delta; + } + else + { + h = 4.0 + (r - g) / delta; + } + + h *= 60.0; + + if( h < 0 ) + h += 360; + } + + return BColor(h,s,v); + } + + BColor hsv2rgb(const BColor& rHSVColor) + { + double h=rHSVColor.getRed(); + const double s=rHSVColor.getGreen(), v=rHSVColor.getBlue(); + + if( fTools::equalZero(s) ) + { + // achromatic case: no hue. + return BColor(v,v,v); + } + else + { + if( fTools::equal(h,360) ) + h = 0; // 360 degrees is equivalent to 0 degrees + + h /= 60.0; + const sal_Int32 intval = static_cast< sal_Int32 >( h ); + const double f = h - intval; + const double p = v*(1.0-s); + const double q = v*(1.0-(s*f)); + const double t = v*(1.0-(s*(1.0-f))); + + /* which hue area? */ + switch( intval ) + { + case 0: + return BColor(v,t,p); + + case 1: + return BColor(q,v,p); + + case 2: + return BColor(p,v,t); + + case 3: + return BColor(p,q,v); + + case 4: + return BColor(t,p,v); + + case 5: + return BColor(v,p,q); + + default: + // hue overflow + return BColor(); + } + } + } + + BColor rgb2yiq(const BColor& rRGBColor) + { + // from Foley, van Dam, Computer Graphics + const double r=rRGBColor.getRed(), g=rRGBColor.getGreen(), b=rRGBColor.getBlue(); + return BColor( + 0.299*r + 0.587*g + 0.114*b, + 0.596*r - 0.274*g - 0.322*b, + 0.211*r - 0.522*g + 0.311*b); + } + + BColor yiq2rgb(const BColor& rYIQColor) + { + // from Foley, van Dam, Computer Graphics + const double y=rYIQColor.getRed(), i=rYIQColor.getGreen(), q=rYIQColor.getBlue(); + return BColor( + y + 0.956*i + 0.623*q, + y - 0.272*i - 0.648*q, + y - 1.105*i + 1.705*q ); + } + + BColor ciexyz2rgb( const BColor& rXYZColor ) + { + // from Poynton color faq, and SMPTE RP 177-1993, Derivation + // of Basic Television Color Equations + const double x=rXYZColor.getRed(), y=rXYZColor.getGreen(), z=rXYZColor.getBlue(); + return BColor( + 3.240479*x - 1.53715*y - 0.498535*z, + -0.969256*x + 1.875991*y + 0.041556*z, + 0.055648*x - 0.204043*y + 1.057311*z ); + } + + BColor rgb2ciexyz( const BColor& rRGBColor ) + { + // from Poynton color faq, and SMPTE RP 177-1993, Derivation + // of Basic Television Color Equations + const double r=rRGBColor.getRed(), g=rRGBColor.getGreen(), b=rRGBColor.getBlue(); + return BColor( + 0.412453*r + 0.35758*g + 0.180423*b, + 0.212671*r + 0.71516*g + 0.072169*b, + 0.019334*r + 0.119193*g + 0.950227*b); + } + + BColor rgb2ypbpr(const BColor& rRGBColor) + { + const double r=rRGBColor.getRed(), g=rRGBColor.getGreen(), b=rRGBColor.getBlue(); + return BColor( + 0.299*r + 0.587*g + 0.114*b, + -0.168736*r - 0.331264*g + 0.5*b, + 0.5*r - 0.418688*g - 0.081312*b); + } + + BColor ypbpr2rgb(const BColor& rYPbPrColor) + { + const double y=rYPbPrColor.getRed(), pb=rYPbPrColor.getGreen(), pr=rYPbPrColor.getBlue(); + return BColor( + 1.*y + 0.*pb + 1.402*pr, + 1.*y - 0.344136*pb - 0.714136*pr, + 1.*y + 1.772*pb + 0.*pr); + } + +} } // end of namespace basegfx + +////////////////////////////////////////////////////////////////////////////// +// eof diff --git a/basegfx/source/color/makefile.mk b/basegfx/source/color/makefile.mk index 9fd79701d65a..77b91a82f3ac 100644 --- a/basegfx/source/color/makefile.mk +++ b/basegfx/source/color/makefile.mk @@ -45,6 +45,7 @@ TARGET=color SLOFILES= \ $(SLO)$/bcolor.obj \ + $(SLO)$/bcolortools.obj \ $(SLO)$/bcolormodifier.obj # --- Targets ---------------------------------- diff --git a/basegfx/source/curve/b2dcubicbezier.cxx b/basegfx/source/curve/b2dcubicbezier.cxx index 76d1b74ddbca..83c620df7870 100644 --- a/basegfx/source/curve/b2dcubicbezier.cxx +++ b/basegfx/source/curve/b2dcubicbezier.cxx @@ -7,7 +7,6 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: b2dcubicbezier.cxx,v $ - * $Revision: 1.16 $ * * This file is part of OpenOffice.org. * @@ -443,21 +442,32 @@ namespace basegfx bool bAIsTrivial(aVecA.equalZero()); bool bBIsTrivial(aVecB.equalZero()); + // #i102241# prepare inverse edge length to normalize cross values; + // else the small compare value used in fTools::equalZero + // will be length dependent and this detection will work as less + // precise as longer the edge is. In principle, the length of the control + // vector would need to be used too, but to be trivial it is assumed to + // be of roughly equal length to the edge, so edge length can be used + // for both. Only needed when one of both is not trivial per se. + const double fInverseEdgeLength(bAIsTrivial && bBIsTrivial + ? 1.0 + : 1.0 / aEdge.getLength()); + // if A is not zero, check if it could be if(!bAIsTrivial) { - // parallel to edge? Check aVecA, aEdge - // B2DVector::areParallel is too correct, uses differences in the e15 region, - // thus do own test here - const double fValA(aVecA.getX() * aEdge.getY()); - const double fValB(aVecA.getY() * aEdge.getX()); + // #i102241# parallel to edge? Check aVecA, aEdge. Use cross() which does what + // we need here with the precision we need + const double fCross(aVecA.cross(aEdge) * fInverseEdgeLength); - if(fTools::equalZero(fabs(fValA) - fabs(fValB))) + if(fTools::equalZero(fCross)) { // get scale to edge. Use bigger distance for numeric quality - const double fScale(fabs(aEdge.getX()) > fabs(aEdge.getY()) ? aVecA.getX() / aEdge.getX() : aVecA.getY() / aEdge.getY()); + const double fScale(fabs(aEdge.getX()) > fabs(aEdge.getY()) + ? aVecA.getX() / aEdge.getX() + : aVecA.getY() / aEdge.getY()); - // end point of vector in edge range? + // relative end point of vector in edge range? if(fTools::moreOrEqual(fScale, 0.0) && fTools::lessOrEqual(fScale, 1.0)) { bAIsTrivial = true; @@ -470,13 +480,14 @@ namespace basegfx if(bAIsTrivial && !bBIsTrivial) { // parallel to edge? Check aVecB, aEdge - const double fValA(aVecB.getX() * aEdge.getY()); - const double fValB(aVecB.getY() * aEdge.getX()); + const double fCross(aVecB.cross(aEdge) * fInverseEdgeLength); - if(fTools::equalZero(fabs(fValA) - fabs(fValB))) + if(fTools::equalZero(fCross)) { // get scale to edge. Use bigger distance for numeric quality - const double fScale(fabs(aEdge.getX()) > fabs(aEdge.getY()) ? aVecB.getX() / aEdge.getX() : aVecB.getY() / aEdge.getY()); + const double fScale(fabs(aEdge.getX()) > fabs(aEdge.getY()) + ? aVecB.getX() / aEdge.getX() + : aVecB.getY() / aEdge.getY()); // end point of vector in edge range? Caution: controlB is directed AGAINST edge if(fTools::lessOrEqual(fScale, 0.0) && fTools::moreOrEqual(fScale, -1.0)) @@ -1033,6 +1044,65 @@ namespace basegfx impCheckExtremumResult(fCY / (2 * fBY), rResults); } } + + int B2DCubicBezier::getMaxDistancePositions( double pResult[2]) const + { + // the distance from the bezier to a line through start and end + // is proportional to (ENDx-STARTx,ENDy-STARTy)*(+BEZIERy(t),-BEZIERx(t)) + // this distance becomes zero for at least t==0 and t==1 + // its extrema that are between 0..1 are interesting as split candidates + // its derived function has the form dD/dt = fA*t^2 + 2*fB*t + fC + const B2DPoint aRelativeEndPoint(maEndPoint-maStartPoint); + const double fA = 3 * (maEndPoint.getX() - maControlPointB.getX()) * aRelativeEndPoint.getY() + - 3 * (maEndPoint.getY() - maControlPointB.getY()) * aRelativeEndPoint.getX(); + const double fB = (maControlPointB.getX() - maControlPointA.getX()) * aRelativeEndPoint.getY() + - (maControlPointB.getY() - maControlPointA.getY()) * aRelativeEndPoint.getX(); + const double fC = (maControlPointA.getX() - maStartPoint.getX()) * aRelativeEndPoint.getY() + - (maControlPointA.getY() - maStartPoint.getY()) * aRelativeEndPoint.getX(); + + // test for degenerated case: non-cubic curve + if( fTools::equalZero(fA) ) + { + // test for degenerated case: straight line + if( fTools::equalZero(fB) ) + return 0; + + // degenerated case: quadratic bezier + pResult[0] = -fC / (2*fB); + + // test root: ignore it when it is outside the curve + int nCount = ((pResult[0] > 0) && (pResult[0] < 1)); + return nCount; + } + + // derivative is polynomial of order 2 + // check if the polynomial has non-imaginary roots + const double fD = fB*fB - fA*fC; + if( fD >= 0.0 ) // TODO: is this test needed? geometrically not IMHO + { + // calculate the first root + const double fS = sqrt(fD); + const double fQ = fB + ((fB >= 0) ? +fS : -fS); + pResult[0] = fQ / fA; + // test root: ignore it when it is outside the curve + int nCount = ((pResult[0] > 0) && (pResult[0] < 1)); + + // ignore multiplicit roots + if( !fTools::equalZero(fD) ) + { + // calculate the second root + const double fRoot = fC / fQ; + pResult[ nCount ] = fC / fQ; + // test root: ignore it when it is outside the curve + nCount += ((fRoot > 0) && (fRoot < 1)); + } + + return nCount; + } + + return 0; + } + } // end of namespace basegfx // eof diff --git a/basegfx/source/polygon/b2dlinegeometry.cxx b/basegfx/source/polygon/b2dlinegeometry.cxx index 0cda1036e13b..1a9264ab769e 100644 --- a/basegfx/source/polygon/b2dlinegeometry.cxx +++ b/basegfx/source/polygon/b2dlinegeometry.cxx @@ -352,13 +352,12 @@ namespace basegfx // Unfortunately, while it would be geometrically correct to not add // the in-between points EdgeEnd and EdgeStart, it leads to rounding // errors when converting to integer polygon coordinates for painting - const B2DVector aEdgeVector(rEdge.getEndPoint() - rEdge.getStartPoint()); - if(rEdge.isBezier()) { // prepare target and data common for upper and lower B2DPolygon aBezierPolygon; - const double fEdgeLength(aEdgeVector.getLength()); + const B2DVector aPureEdgeVector(rEdge.getEndPoint() - rEdge.getStartPoint()); + const double fEdgeLength(aPureEdgeVector.getLength()); const bool bIsEdgeLengthZero(fTools::equalZero(fEdgeLength)); const B2DVector aTangentA(rEdge.getTangent(0.0)); const B2DVector aTangentB(rEdge.getTangent(1.0)); @@ -441,7 +440,11 @@ namespace basegfx } else { - const B2DVector aPerpendEdgeVector(getNormalizedPerpendicular(aEdgeVector) * fHalfLineWidth); + // #i101491# emulate rEdge.getTangent call which applies a factor of 0.3 to the + // full-length edge vector to have numerically exactly the same results as in the + // createAreaGeometryForJoin implementation + const B2DVector aEdgeTangent((rEdge.getEndPoint() - rEdge.getStartPoint()) * 0.3); + const B2DVector aPerpendEdgeVector(getNormalizedPerpendicular(aEdgeTangent) * fHalfLineWidth); B2DPolygon aEdgePolygon; // create upper edge @@ -495,45 +498,75 @@ namespace basegfx } } - // create first polygon part for edge - aEdgePolygon.append(aEndPoint); - aEdgePolygon.append(rPoint); - aEdgePolygon.append(aStartPoint); - - if(B2DLINEJOIN_MITER == eJoin) + switch(eJoin) { - // Look for the cut point between start point along rTangentPrev and - // end point along rTangentEdge. -rTangentEdge should be used, but since - // the cut value is used for interpolating along the first edge, the negation - // is not needed since the same fCut will be found on the first edge. - // If it exists, insert it to complete the mitered fill polygon. - double fCutPos(0.0); - tools::findCut(aStartPoint, rTangentPrev, aEndPoint, rTangentEdge, CUTFLAG_ALL, &fCutPos); - - if(0.0 != fCutPos) + case B2DLINEJOIN_MITER : { - const B2DPoint aCutPoint(interpolate(aStartPoint, aStartPoint + rTangentPrev, fCutPos)); - aEdgePolygon.append(aCutPoint); - } - } - else if(B2DLINEJOIN_ROUND == eJoin) - { - // use tooling to add needed EllipseSegment - double fAngleStart(atan2(rPerpendPrev.getY(), rPerpendPrev.getX())); - double fAngleEnd(atan2(rPerpendEdge.getY(), rPerpendEdge.getX())); + aEdgePolygon.append(aEndPoint); + aEdgePolygon.append(rPoint); + aEdgePolygon.append(aStartPoint); - // atan2 results are [-PI .. PI], consolidate to [0.0 .. 2PI] - if(fAngleStart < 0.0) + // Look for the cut point between start point along rTangentPrev and + // end point along rTangentEdge. -rTangentEdge should be used, but since + // the cut value is used for interpolating along the first edge, the negation + // is not needed since the same fCut will be found on the first edge. + // If it exists, insert it to complete the mitered fill polygon. + double fCutPos(0.0); + tools::findCut(aStartPoint, rTangentPrev, aEndPoint, rTangentEdge, CUTFLAG_ALL, &fCutPos); + + if(0.0 != fCutPos) + { + const B2DPoint aCutPoint(interpolate(aStartPoint, aStartPoint + rTangentPrev, fCutPos)); + aEdgePolygon.append(aCutPoint); + } + + break; + } + case B2DLINEJOIN_ROUND : { - fAngleStart += F_2PI; - } + // use tooling to add needed EllipseSegment + double fAngleStart(atan2(rPerpendPrev.getY(), rPerpendPrev.getX())); + double fAngleEnd(atan2(rPerpendEdge.getY(), rPerpendEdge.getX())); - if(fAngleEnd < 0.0) + // atan2 results are [-PI .. PI], consolidate to [0.0 .. 2PI] + if(fAngleStart < 0.0) + { + fAngleStart += F_2PI; + } + + if(fAngleEnd < 0.0) + { + fAngleEnd += F_2PI; + } + + const B2DPolygon aBow(tools::createPolygonFromEllipseSegment(rPoint, fHalfLineWidth, fHalfLineWidth, fAngleStart, fAngleEnd)); + + if(aBow.count() > 1) + { + // #i101491# + // use the original start/end positions; the ones from bow creation may be numerically + // different due to their different creation. To guarantee good merging quality with edges + // and edge roundings (and to reduce point count) + aEdgePolygon = aBow; + aEdgePolygon.setB2DPoint(0, aStartPoint); + aEdgePolygon.setB2DPoint(aEdgePolygon.count() - 1, aEndPoint); + aEdgePolygon.append(rPoint); + + break; + } + else + { + // wanted fall-through to default + } + } + default: // B2DLINEJOIN_BEVEL { - fAngleEnd += F_2PI; - } + aEdgePolygon.append(aEndPoint); + aEdgePolygon.append(rPoint); + aEdgePolygon.append(aStartPoint); - aEdgePolygon.append(tools::createPolygonFromEllipseSegment(rPoint, fHalfLineWidth, fHalfLineWidth, fAngleStart, fAngleEnd)); + break; + } } // create last polygon part for edge diff --git a/basegfx/source/polygon/b2dpolygon.cxx b/basegfx/source/polygon/b2dpolygon.cxx index 467a4b90f516..48d00ddcec7d 100644 --- a/basegfx/source/polygon/b2dpolygon.cxx +++ b/basegfx/source/polygon/b2dpolygon.cxx @@ -7,7 +7,6 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: b2dpolygon.cxx,v $ - * $Revision: 1.22 $ * * This file is part of OpenOffice.org. * @@ -123,6 +122,16 @@ public: maVector[nIndex].setCoordinate(rValue); } + void reserve(sal_uInt32 nCount) + { + maVector.reserve(nCount); + } + + void append(const CoordinateData2D& rValue) + { + maVector.push_back(rValue); + } + void insert(sal_uInt32 nIndex, const CoordinateData2D& rValue, sal_uInt32 nCount) { if(nCount) @@ -380,6 +389,17 @@ public: } } + void append(const ControlVectorPair2D& rValue) + { + maVector.push_back(rValue); + + if(!rValue.getPrevVector().equalZero()) + mnUsedVectors += 1; + + if(!rValue.getNextVector().equalZero()) + mnUsedVectors += 1; + } + void insert(sal_uInt32 nIndex, const ControlVectorPair2D& rValue, sal_uInt32 nCount) { if(nCount) @@ -741,6 +761,24 @@ public: maPoints.setCoordinate(nIndex, rValue); } + void reserve(sal_uInt32 nCount) + { + maPoints.reserve(nCount); + } + + void append(const basegfx::B2DPoint& rPoint) + { + mpBufferedData.reset(); // TODO: is this needed? + const CoordinateData2D aCoordinate(rPoint); + maPoints.append(aCoordinate); + + if(mpControlVector) + { + const ControlVectorPair2D aVectorPair; + mpControlVector->append(aVectorPair); + } + } + void insert(sal_uInt32 nIndex, const basegfx::B2DPoint& rPoint, sal_uInt32 nCount) { if(nCount) @@ -1190,6 +1228,11 @@ namespace basegfx } } + void B2DPolygon::reserve(sal_uInt32 nCount) + { + mpPolygon->reserve(nCount); + } + void B2DPolygon::insert(sal_uInt32 nIndex, const B2DPoint& rPoint, sal_uInt32 nCount) { OSL_ENSURE(nIndex <= mpPolygon->count(), "B2DPolygon Insert outside range (!)"); @@ -1208,6 +1251,11 @@ namespace basegfx } } + void B2DPolygon::append(const B2DPoint& rPoint) + { + mpPolygon->append(rPoint); + } + B2DPoint B2DPolygon::getPrevControlPoint(sal_uInt32 nIndex) const { OSL_ENSURE(nIndex < mpPolygon->count(), "B2DPolygon access outside range (!)"); diff --git a/basegfx/source/polygon/b2dpolygoncutandtouch.cxx b/basegfx/source/polygon/b2dpolygoncutandtouch.cxx index a1b7a69775ad..da6ff8904725 100644 --- a/basegfx/source/polygon/b2dpolygoncutandtouch.cxx +++ b/basegfx/source/polygon/b2dpolygoncutandtouch.cxx @@ -7,7 +7,6 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: b2dpolygoncutandtouch.cxx,v $ - * $Revision: 1.8 $ * * This file is part of OpenOffice.org. * @@ -110,7 +109,10 @@ namespace basegfx { // #i76891# mergeTemporaryPointsAndPolygon redesigned to be able to correctly handle // single edges with/without control points - if(rTempPoints.size()) + // #i101491# added counter for non-changing element count + const sal_uInt32 nTempPointCount(rTempPoints.size()); + + if(nTempPointCount) { B2DPolygon aRetval; const sal_uInt32 nCount(rCandidate.count()); @@ -138,7 +140,7 @@ namespace basegfx double fLeftStart(0.0); // now add all points targeted to be at this index - while(nNewInd < rTempPoints.size() && rTempPoints[nNewInd].getIndex() == a) + while(nNewInd < nTempPointCount && rTempPoints[nNewInd].getIndex() == a) { const temporaryPoint& rTempPoint = rTempPoints[nNewInd++]; @@ -160,7 +162,7 @@ namespace basegfx else { // add all points targeted to be at this index - while(nNewInd < rTempPoints.size() && rTempPoints[nNewInd].getIndex() == a) + while(nNewInd < nTempPointCount && rTempPoints[nNewInd].getIndex() == a) { const temporaryPoint& rTempPoint = rTempPoints[nNewInd++]; const B2DPoint aNewPoint(rTempPoint.getPoint()); @@ -427,6 +429,7 @@ namespace basegfx // create subdivided polygons and find cuts between them // Keep adaptiveSubdivideByCount due to needed quality + aTempPolygonA.reserve(SUBDIVIDE_FOR_CUT_TEST_COUNT + 8); aTempPolygonA.append(rCubicA.getStartPoint()); rCubicA.adaptiveSubdivideByCount(aTempPolygonA, SUBDIVIDE_FOR_CUT_TEST_COUNT); aTempPolygonEdge.append(rCurrB); @@ -467,8 +470,10 @@ namespace basegfx // create subdivided polygons and find cuts between them // Keep adaptiveSubdivideByCount due to needed quality + aTempPolygonA.reserve(SUBDIVIDE_FOR_CUT_TEST_COUNT + 8); aTempPolygonA.append(rCubicA.getStartPoint()); rCubicA.adaptiveSubdivideByCount(aTempPolygonA, SUBDIVIDE_FOR_CUT_TEST_COUNT); + aTempPolygonB.reserve(SUBDIVIDE_FOR_CUT_TEST_COUNT + 8); aTempPolygonB.append(rCubicB.getStartPoint()); rCubicB.adaptiveSubdivideByCount(aTempPolygonB, SUBDIVIDE_FOR_CUT_TEST_COUNT); @@ -494,6 +499,13 @@ namespace basegfx const B2DCubicBezier& rCubicA, sal_uInt32 nInd, temporaryPointVector& rTempPoints) { + // avoid expensive part of this method if possible + // TODO: use hasAnyExtremum() method instead when it becomes available + double fDummy; + const bool bHasAnyExtremum = rCubicA.getMinimumExtremumPosition( fDummy ); + if( !bHasAnyExtremum ) + return; + // find all self-intersections on the given bezier segment. Add an entry to the tempPoints // for each self intersection point with the cut value describing the relative position on given // bezier segment. @@ -502,6 +514,7 @@ namespace basegfx // create subdivided polygon and find cuts on it // Keep adaptiveSubdivideByCount due to needed quality + aTempPolygon.reserve(SUBDIVIDE_FOR_CUT_TEST_COUNT + 8); aTempPolygon.append(rCubicA.getStartPoint()); rCubicA.adaptiveSubdivideByCount(aTempPolygon, SUBDIVIDE_FOR_CUT_TEST_COUNT); findCuts(aTempPolygon, aTempPointVector); @@ -554,7 +567,14 @@ namespace basegfx const bool bEdgeBIsCurve(aCubicB.isBezier()); const B2DRange aRangeB(aCubicB.getRange()); - if(aRangeA.overlaps(aRangeB)) + // only overlapping segments need to be tested + // consecutive segments touch of course + bool bOverlap = false; + if( b > a+1) + bOverlap = aRangeA.overlaps(aRangeB); + else + bOverlap = aRangeA.overlapsMore(aRangeB); + if( bOverlap) { if(bEdgeAIsCurve && bEdgeBIsCurve) { @@ -596,7 +616,13 @@ namespace basegfx const B2DPoint aNextB(rCandidate.getB2DPoint(b + 1L == nPointCount ? 0L : b + 1L)); const B2DRange aRangeB(aCurrB, aNextB); - if(aRangeA.overlaps(aRangeB)) + // consecutive segments touch of course + bool bOverlap = false; + if( b > a+1) + bOverlap = aRangeA.overlaps(aRangeB); + else + bOverlap = aRangeA.overlapsMore(aRangeB); + if( bOverlap) { findEdgeCutsTwoEdges(aCurrA, aNextA, aCurrB, aNextB, a, b, rTempPoints, rTempPoints); } @@ -685,6 +711,7 @@ namespace basegfx // create subdivided polygon and find cuts on it // Keep adaptiveSubdivideByCount due to needed quality + aTempPolygon.reserve(SUBDIVIDE_FOR_CUT_TEST_COUNT + 8); aTempPolygon.append(rCubicA.getStartPoint()); rCubicA.adaptiveSubdivideByCount(aTempPolygon, SUBDIVIDE_FOR_CUT_TEST_COUNT); findTouches(aTempPolygon, rPointPolygon, aTempPointVector); @@ -793,7 +820,13 @@ namespace basegfx const bool bEdgeBIsCurve(aCubicB.isBezier()); const B2DRange aRangeB(aCubicB.getRange()); - if(aRangeA.overlaps(aRangeB)) + // consecutive segments touch of course + bool bOverlap = false; + if( b > a+1) + bOverlap = aRangeA.overlaps(aRangeB); + else + bOverlap = aRangeA.overlapsMore(aRangeB); + if( bOverlap) { if(bEdgeAIsCurve && bEdgeBIsCurve) { @@ -835,7 +868,13 @@ namespace basegfx const B2DPoint aNextB(rCandidateB.getB2DPoint(b + 1L == nPointCountB ? 0L : b + 1L)); const B2DRange aRangeB(aCurrB, aNextB); - if(aRangeA.overlaps(aRangeB)) + // consecutive segments touch of course + bool bOverlap = false; + if( b > a+1) + bOverlap = aRangeA.overlaps(aRangeB); + else + bOverlap = aRangeA.overlapsMore(aRangeB); + if( bOverlap) { // test for simple edge-edge cuts findEdgeCutsTwoEdges(aCurrA, aNextA, aCurrB, aNextB, a, b, rTempPointsA, rTempPointsB); diff --git a/basegfx/source/polygon/b2dpolygontools.cxx b/basegfx/source/polygon/b2dpolygontools.cxx index c1e5dc80d8c4..7485387c6cb9 100644 --- a/basegfx/source/polygon/b2dpolygontools.cxx +++ b/basegfx/source/polygon/b2dpolygontools.cxx @@ -7,7 +7,6 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: b2dpolygontools.cxx,v $ - * $Revision: 1.29.4.1 $ * * This file is part of OpenOffice.org. * @@ -192,6 +191,9 @@ namespace basegfx B2DCubicBezier aBezier; aBezier.setStartPoint(rCandidate.getB2DPoint(0)); + // perf: try to avoid too many realloctions by guessing the result's pointcount + aRetval.reserve(nPointCount*4); + // add start point (always) aRetval.append(aBezier.getStartPoint()); @@ -272,6 +274,9 @@ namespace basegfx B2DCubicBezier aBezier; aBezier.setStartPoint(rCandidate.getB2DPoint(0)); + // perf: try to avoid too many realloctions by guessing the result's pointcount + aRetval.reserve(nPointCount*4); + // add start point (always) aRetval.append(aBezier.getStartPoint()); @@ -342,6 +347,9 @@ namespace basegfx B2DCubicBezier aBezier; aBezier.setStartPoint(rCandidate.getB2DPoint(0)); + // perf: try to avoid too many realloctions by guessing the result's pointcount + aRetval.reserve(nPointCount*4); + // add start point (always) aRetval.append(aBezier.getStartPoint()); @@ -3269,6 +3277,9 @@ namespace basegfx B2DCubicBezier aBezier; aBezier.setStartPoint(rCandidate.getB2DPoint(0)); + // try to avoid costly reallocations + aRetval.reserve( nEdgeCount+1); + // add start point aRetval.append(aBezier.getStartPoint()); diff --git a/basegfx/source/polygon/b2dpolypolygoncutter.cxx b/basegfx/source/polygon/b2dpolypolygoncutter.cxx index b06e6fbafff7..0674bfe3953e 100644 --- a/basegfx/source/polygon/b2dpolypolygoncutter.cxx +++ b/basegfx/source/polygon/b2dpolypolygoncutter.cxx @@ -929,6 +929,85 @@ namespace basegfx } } + B2DPolyPolygon mergeToSinglePolyPolygon(const std::vector< basegfx::B2DPolyPolygon >& rInput) + { + std::vector< basegfx::B2DPolyPolygon > aInput(rInput); + + // first step: prepareForPolygonOperation and simple merge of non-overlapping + // PolyPolygons for speedup; this is possible for the wanted OR-operation + if(aInput.size()) + { + std::vector< basegfx::B2DPolyPolygon > aResult; + aResult.reserve(aInput.size()); + + for(sal_uInt32 a(0); a < aInput.size(); a++) + { + const basegfx::B2DPolyPolygon aCandidate(prepareForPolygonOperation(aInput[a])); + + if(aResult.size()) + { + const B2DRange aCandidateRange(aCandidate.getB2DRange()); + bool bCouldMergeSimple(false); + + for(sal_uInt32 b(0); !bCouldMergeSimple && b < aResult.size(); b++) + { + basegfx::B2DPolyPolygon aTarget(aResult[b]); + const B2DRange aTargetRange(aTarget.getB2DRange()); + + if(!aCandidateRange.overlaps(aTargetRange)) + { + aTarget.append(aCandidate); + aResult[b] = aTarget; + bCouldMergeSimple = true; + } + } + + if(!bCouldMergeSimple) + { + aResult.push_back(aCandidate); + } + } + else + { + aResult.push_back(aCandidate); + } + } + + aInput = aResult; + } + + // second step: melt pairwise to a single PolyPolygon + while(aInput.size() > 1) + { + std::vector< basegfx::B2DPolyPolygon > aResult; + aResult.reserve((aInput.size() / 2) + 1); + + for(sal_uInt32 a(0); a < aInput.size(); a += 2) + { + if(a + 1 < aInput.size()) + { + // a pair for processing + aResult.push_back(solvePolygonOperationOr(aInput[a], aInput[a + 1])); + } + else + { + // last single PolyPolygon; copy to target to not lose it + aResult.push_back(aInput[a]); + } + } + + aInput = aResult; + } + + // third step: get result + if(1 == aInput.size()) + { + return aInput[0]; + } + + return B2DPolyPolygon(); + } + ////////////////////////////////////////////////////////////////////////////// } // end of namespace tools diff --git a/basegfx/source/polygon/b2dpolypolygontools.cxx b/basegfx/source/polygon/b2dpolypolygontools.cxx index c92f2f29147b..e6b3a448530d 100644 --- a/basegfx/source/polygon/b2dpolypolygontools.cxx +++ b/basegfx/source/polygon/b2dpolypolygontools.cxx @@ -569,6 +569,18 @@ namespace basegfx return equal(rCandidateA, rCandidateB, fSmallValue); } + B2DPolyPolygon snapPointsOfHorizontalOrVerticalEdges(const B2DPolyPolygon& rCandidate) + { + B2DPolyPolygon aRetval; + + for(sal_uInt32 a(0L); a < rCandidate.count(); a++) + { + aRetval.append(snapPointsOfHorizontalOrVerticalEdges(rCandidate.getB2DPolygon(a))); + } + + return aRetval; + } + } // end of namespace tools } // end of namespace basegfx diff --git a/basegfx/source/polygon/b3dpolygontools.cxx b/basegfx/source/polygon/b3dpolygontools.cxx index ea303886dd88..52e0f0fcc36f 100644 --- a/basegfx/source/polygon/b3dpolygontools.cxx +++ b/basegfx/source/polygon/b3dpolygontools.cxx @@ -875,52 +875,147 @@ namespace basegfx } else { + bool bRetval(false); const B3DVector aPlaneNormal(rCandidate.getNormal()); if(!aPlaneNormal.equalZero()) { - const double fAbsX(fabs(aPlaneNormal.getX())); - const double fAbsY(fabs(aPlaneNormal.getY())); - const double fAbsZ(fabs(aPlaneNormal.getZ())); + const sal_uInt32 nPointCount(rCandidate.count()); - if(fAbsX > fAbsY && fAbsX > fAbsZ) + if(nPointCount) { - // normal points mostly in X-Direction, use YZ-Polygon projection for check - B3DHomMatrix aTrans; + B3DPoint aCurrentPoint(rCandidate.getB3DPoint(nPointCount - 1)); + const double fAbsX(fabs(aPlaneNormal.getX())); + const double fAbsY(fabs(aPlaneNormal.getY())); + const double fAbsZ(fabs(aPlaneNormal.getZ())); - aTrans.set(0, 0, 0.0); - aTrans.set(0, 1, 1.0); - aTrans.set(1, 1, 0.0); - aTrans.set(1, 2, 1.0); + if(fAbsX > fAbsY && fAbsX > fAbsZ) + { + // normal points mostly in X-Direction, use YZ-Polygon projection for check + // x -> y, y -> z + for(sal_uInt32 a(0); a < nPointCount; a++) + { + const B3DPoint aPreviousPoint(aCurrentPoint); + aCurrentPoint = rCandidate.getB3DPoint(a); - const B2DPolygon aYZ(createB2DPolygonFromB3DPolygon(rCandidate, aTrans)); + // cross-over in Z? + const bool bCompZA(fTools::more(aPreviousPoint.getZ(), rPoint.getZ())); + const bool bCompZB(fTools::more(aCurrentPoint.getZ(), rPoint.getZ())); - return isInside(aYZ, B2DPoint(rPoint.getY(), rPoint.getZ()), bWithBorder); - } - else if(fAbsY > fAbsX && fAbsY > fAbsZ) - { - // normal points mostly in Y-Direction, use XZ-Polygon projection for check - B3DHomMatrix aTrans; + if(bCompZA != bCompZB) + { + // cross-over in Y? + const bool bCompYA(fTools::more(aPreviousPoint.getY(), rPoint.getY())); + const bool bCompYB(fTools::more(aCurrentPoint.getY(), rPoint.getY())); - aTrans.set(1, 1, 0.0); - aTrans.set(1, 2, 1.0); + if(bCompYA == bCompYB) + { + if(bCompYA) + { + bRetval = !bRetval; + } + } + else + { + const double fCompare( + aCurrentPoint.getY() - (aCurrentPoint.getZ() - rPoint.getZ()) * + (aPreviousPoint.getY() - aCurrentPoint.getY()) / + (aPreviousPoint.getZ() - aCurrentPoint.getZ())); - const B2DPolygon aXZ(createB2DPolygonFromB3DPolygon(rCandidate, aTrans)); + if(fTools::more(fCompare, rPoint.getY())) + { + bRetval = !bRetval; + } + } + } + } + } + else if(fAbsY > fAbsX && fAbsY > fAbsZ) + { + // normal points mostly in Y-Direction, use XZ-Polygon projection for check + // x -> x, y -> z + for(sal_uInt32 a(0); a < nPointCount; a++) + { + const B3DPoint aPreviousPoint(aCurrentPoint); + aCurrentPoint = rCandidate.getB3DPoint(a); - return isInside(aXZ, B2DPoint(rPoint.getX(), rPoint.getZ()), bWithBorder); - } - else - { - // normal points mostly in Z-Direction, use XY-Polygon projection for check - B3DHomMatrix aTrans; + // cross-over in Z? + const bool bCompZA(fTools::more(aPreviousPoint.getZ(), rPoint.getZ())); + const bool bCompZB(fTools::more(aCurrentPoint.getZ(), rPoint.getZ())); - const B2DPolygon aXY(createB2DPolygonFromB3DPolygon(rCandidate, aTrans)); + if(bCompZA != bCompZB) + { + // cross-over in X? + const bool bCompXA(fTools::more(aPreviousPoint.getX(), rPoint.getX())); + const bool bCompXB(fTools::more(aCurrentPoint.getX(), rPoint.getX())); - return isInside(aXY, B2DPoint(rPoint.getX(), rPoint.getY()), bWithBorder); + if(bCompXA == bCompXB) + { + if(bCompXA) + { + bRetval = !bRetval; + } + } + else + { + const double fCompare( + aCurrentPoint.getX() - (aCurrentPoint.getZ() - rPoint.getZ()) * + (aPreviousPoint.getX() - aCurrentPoint.getX()) / + (aPreviousPoint.getZ() - aCurrentPoint.getZ())); + + if(fTools::more(fCompare, rPoint.getX())) + { + bRetval = !bRetval; + } + } + } + } + } + else + { + // normal points mostly in Z-Direction, use XY-Polygon projection for check + // x -> x, y -> y + for(sal_uInt32 a(0); a < nPointCount; a++) + { + const B3DPoint aPreviousPoint(aCurrentPoint); + aCurrentPoint = rCandidate.getB3DPoint(a); + + // cross-over in Y? + const bool bCompYA(fTools::more(aPreviousPoint.getY(), rPoint.getY())); + const bool bCompYB(fTools::more(aCurrentPoint.getY(), rPoint.getY())); + + if(bCompYA != bCompYB) + { + // cross-over in X? + const bool bCompXA(fTools::more(aPreviousPoint.getX(), rPoint.getX())); + const bool bCompXB(fTools::more(aCurrentPoint.getX(), rPoint.getX())); + + if(bCompXA == bCompXB) + { + if(bCompXA) + { + bRetval = !bRetval; + } + } + else + { + const double fCompare( + aCurrentPoint.getX() - (aCurrentPoint.getY() - rPoint.getY()) * + (aPreviousPoint.getX() - aCurrentPoint.getX()) / + (aPreviousPoint.getY() - aCurrentPoint.getY())); + + if(fTools::more(fCompare, rPoint.getX())) + { + bRetval = !bRetval; + } + } + } + } + } } } - return false; + return bRetval; } } diff --git a/basegfx/test/basegfx1d.cxx b/basegfx/test/basegfx1d.cxx index f058b0034fa7..454ed23289b2 100644 --- a/basegfx/test/basegfx1d.cxx +++ b/basegfx/test/basegfx1d.cxx @@ -33,7 +33,7 @@ #include "precompiled_basegfx.hxx" // autogenerated file with codegen.pl -#include +#include namespace basegfx1d { diff --git a/basegfx/test/basegfx2d.cxx b/basegfx/test/basegfx2d.cxx index 8b732e465a51..ab6715467dba 100644 --- a/basegfx/test/basegfx2d.cxx +++ b/basegfx/test/basegfx2d.cxx @@ -33,7 +33,7 @@ #include "precompiled_basegfx.hxx" // autogenerated file with codegen.pl -#include +#include #include #include @@ -43,6 +43,8 @@ #include #include #include +#include +#include #include @@ -1443,6 +1445,178 @@ public: CPPUNIT_TEST_SUITE_END(); }; // class b2dvector +class bcolor : public CppUnit::TestFixture +{ + BColor maWhite; + BColor maBlack; + BColor maRed; + BColor maGreen; + BColor maBlue; + BColor maYellow; + BColor maMagenta; + BColor maCyan; + +public: + bcolor() : + maWhite(1,1,1), + maBlack(0,0,0), + maRed(1,0,0), + maGreen(0,1,0), + maBlue(0,0,1), + maYellow(1,1,0), + maMagenta(1,0,1), + maCyan(0,1,1) + {} + + + // initialise your test code values here. + void setUp() + { + } + + void tearDown() + { + } + + // insert your test code here. + void hslTest() + { + CPPUNIT_ASSERT_MESSAGE("white", + tools::rgb2hsl(maWhite) == BColor(0,0,1)); + CPPUNIT_ASSERT_MESSAGE("black", + tools::rgb2hsl(maBlack) == BColor(0,0,0)); + CPPUNIT_ASSERT_MESSAGE("red", + tools::rgb2hsl(maRed) == BColor(0,1,0.5)); + CPPUNIT_ASSERT_MESSAGE("green", + tools::rgb2hsl(maGreen) == BColor(120,1,0.5)); + CPPUNIT_ASSERT_MESSAGE("blue", + tools::rgb2hsl(maBlue) == BColor(240,1,0.5)); + CPPUNIT_ASSERT_MESSAGE("yellow", + tools::rgb2hsl(maYellow) == BColor(60,1,0.5)); + CPPUNIT_ASSERT_MESSAGE("magenta", + tools::rgb2hsl(maMagenta) == BColor(300,1,0.5)); + CPPUNIT_ASSERT_MESSAGE("cyan", + tools::rgb2hsl(maCyan) == BColor(180,1,0.5)); + + CPPUNIT_ASSERT_MESSAGE("roundtrip white", + tools::hsl2rgb(tools::rgb2hsl(maWhite)) == maWhite); + CPPUNIT_ASSERT_MESSAGE("roundtrip black", + tools::hsl2rgb(tools::rgb2hsl(maBlack)) == maBlack); + CPPUNIT_ASSERT_MESSAGE("roundtrip red", + tools::hsl2rgb(tools::rgb2hsl(maRed)) == maRed); + CPPUNIT_ASSERT_MESSAGE("roundtrip green", + tools::hsl2rgb(tools::rgb2hsl(maGreen)) == maGreen); + CPPUNIT_ASSERT_MESSAGE("roundtrip blue", + tools::hsl2rgb(tools::rgb2hsl(maBlue)) == maBlue); + CPPUNIT_ASSERT_MESSAGE("roundtrip yellow", + tools::hsl2rgb(tools::rgb2hsl(maYellow)) == maYellow); + CPPUNIT_ASSERT_MESSAGE("roundtrip magenta", + tools::hsl2rgb(tools::rgb2hsl(maMagenta)) == maMagenta); + CPPUNIT_ASSERT_MESSAGE("roundtrip cyan", + tools::hsl2rgb(tools::rgb2hsl(maCyan)) == maCyan); + + CPPUNIT_ASSERT_MESSAGE("grey10", + tools::rgb2hsl(maWhite*.1) == BColor(0,0,.1)); + CPPUNIT_ASSERT_MESSAGE("grey90", + tools::rgb2hsl(maWhite*.9) == BColor(0,0,.9)); + CPPUNIT_ASSERT_MESSAGE("red/2", + tools::rgb2hsl(maRed*.5) == BColor(0,1,0.25)); + CPPUNIT_ASSERT_MESSAGE("green/2", + tools::rgb2hsl(maGreen*.5) == BColor(120,1,0.25)); + CPPUNIT_ASSERT_MESSAGE("blue/2", + tools::rgb2hsl(maBlue*.5) == BColor(240,1,0.25)); + CPPUNIT_ASSERT_MESSAGE("yellow/2", + tools::rgb2hsl(maYellow*.5) == BColor(60,1,0.25)); + CPPUNIT_ASSERT_MESSAGE("magenta/2", + tools::rgb2hsl(maMagenta*.5) == BColor(300,1,0.25)); + CPPUNIT_ASSERT_MESSAGE("cyan/2", + tools::rgb2hsl(maCyan*.5) == BColor(180,1,0.25)); + + CPPUNIT_ASSERT_MESSAGE("pastel", + tools::rgb2hsl(BColor(.75,.25,.25)) == BColor(0,.5,.5)); + } + + // insert your test code here. + void hsvTest() + { + CPPUNIT_ASSERT_MESSAGE("white", + tools::rgb2hsv(maWhite) == BColor(0,0,1)); + CPPUNIT_ASSERT_MESSAGE("black", + tools::rgb2hsv(maBlack) == BColor(0,0,0)); + CPPUNIT_ASSERT_MESSAGE("red", + tools::rgb2hsv(maRed) == BColor(0,1,1)); + CPPUNIT_ASSERT_MESSAGE("green", + tools::rgb2hsv(maGreen) == BColor(120,1,1)); + CPPUNIT_ASSERT_MESSAGE("blue", + tools::rgb2hsv(maBlue) == BColor(240,1,1)); + CPPUNIT_ASSERT_MESSAGE("yellow", + tools::rgb2hsv(maYellow) == BColor(60,1,1)); + CPPUNIT_ASSERT_MESSAGE("magenta", + tools::rgb2hsv(maMagenta) == BColor(300,1,1)); + CPPUNIT_ASSERT_MESSAGE("cyan", + tools::rgb2hsv(maCyan) == BColor(180,1,1)); + + CPPUNIT_ASSERT_MESSAGE("roundtrip white", + tools::hsv2rgb(tools::rgb2hsv(maWhite)) == maWhite); + CPPUNIT_ASSERT_MESSAGE("roundtrip black", + tools::hsv2rgb(tools::rgb2hsv(maBlack)) == maBlack); + CPPUNIT_ASSERT_MESSAGE("roundtrip red", + tools::hsv2rgb(tools::rgb2hsv(maRed)) == maRed); + CPPUNIT_ASSERT_MESSAGE("roundtrip green", + tools::hsv2rgb(tools::rgb2hsv(maGreen)) == maGreen); + CPPUNIT_ASSERT_MESSAGE("roundtrip blue", + tools::hsv2rgb(tools::rgb2hsv(maBlue)) == maBlue); + CPPUNIT_ASSERT_MESSAGE("roundtrip yellow", + tools::hsv2rgb(tools::rgb2hsv(maYellow)) == maYellow); + CPPUNIT_ASSERT_MESSAGE("roundtrip magenta", + tools::hsv2rgb(tools::rgb2hsv(maMagenta)) == maMagenta); + CPPUNIT_ASSERT_MESSAGE("roundtrip cyan", + tools::hsv2rgb(tools::rgb2hsv(maCyan)) == maCyan); + + CPPUNIT_ASSERT_MESSAGE("grey10", + tools::rgb2hsv(maWhite*.1) == BColor(0,0,.1)); + CPPUNIT_ASSERT_MESSAGE("grey90", + tools::rgb2hsv(maWhite*.9) == BColor(0,0,.9)); + CPPUNIT_ASSERT_MESSAGE("red/2", + tools::rgb2hsv(maRed*.5) == BColor(0,1,0.5)); + CPPUNIT_ASSERT_MESSAGE("green/2", + tools::rgb2hsv(maGreen*.5) == BColor(120,1,0.5)); + CPPUNIT_ASSERT_MESSAGE("blue/2", + tools::rgb2hsv(maBlue*.5) == BColor(240,1,0.5)); + CPPUNIT_ASSERT_MESSAGE("yellow/2", + tools::rgb2hsv(maYellow*.5) == BColor(60,1,0.5)); + CPPUNIT_ASSERT_MESSAGE("magenta/2", + tools::rgb2hsv(maMagenta*.5) == BColor(300,1,0.5)); + CPPUNIT_ASSERT_MESSAGE("cyan/2", + tools::rgb2hsv(maCyan*.5) == BColor(180,1,0.5)); + + CPPUNIT_ASSERT_MESSAGE("pastel", + tools::rgb2hsv(BColor(.5,.25,.25)) == BColor(0,.5,.5)); + } + + void ciexyzTest() + { + tools::rgb2ciexyz(maWhite); + tools::rgb2ciexyz(maBlack); + tools::rgb2ciexyz(maRed); + tools::rgb2ciexyz(maGreen); + tools::rgb2ciexyz(maBlue); + tools::rgb2ciexyz(maYellow); + tools::rgb2ciexyz(maMagenta); + tools::rgb2ciexyz(maCyan); + } + + // Change the following lines only, if you add, remove or rename + // member functions of the current class, + // because these macros are need by auto register mechanism. + + CPPUNIT_TEST_SUITE(bcolor); + CPPUNIT_TEST(hslTest); + CPPUNIT_TEST(hsvTest); + CPPUNIT_TEST(ciexyzTest); + CPPUNIT_TEST_SUITE_END(); +}; // class b2dvector + // ----------------------------------------------------------------------------- //CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(basegfx2d::b2dmultirange, "basegfx2d"); CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(basegfx2d::b2dsvgdimpex, "basegfx2d"); @@ -1458,6 +1632,7 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(basegfx2d::b2dquadraticbezier, "basegfx2d" CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(basegfx2d::b2drange, "basegfx2d"); CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(basegfx2d::b2dtuple, "basegfx2d"); CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(basegfx2d::b2dvector, "basegfx2d"); +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(basegfx2d::bcolor, "basegfx2d"); } // namespace basegfx2d diff --git a/basegfx/test/basegfx3d.cxx b/basegfx/test/basegfx3d.cxx index fc59ffbced4e..f0fe463ce23d 100644 --- a/basegfx/test/basegfx3d.cxx +++ b/basegfx/test/basegfx3d.cxx @@ -33,7 +33,7 @@ #include "precompiled_basegfx.hxx" // autogenerated file with codegen.pl -#include +#include namespace basegfx3d { diff --git a/basegfx/test/makefile.mk b/basegfx/test/makefile.mk index d0fbfaf9e7c6..da61c60f9308 100644 --- a/basegfx/test/makefile.mk +++ b/basegfx/test/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -46,7 +46,7 @@ SHL1OBJS= \ $(SLO)$/basegfx1d.obj \ $(SLO)$/basegfx2d.obj \ $(SLO)$/basegfx3d.obj \ - $(SLO)$/testtools.obj + $(SLO)$/testtools.obj # linking statically against basegfx parts SHL1LIBS=\ @@ -58,6 +58,7 @@ SHL1LIBS=\ $(SLB)$/range.lib \ $(SLB)$/tuple.lib \ $(SLB)$/tools.lib \ + $(SLB)$/color.lib \ $(SLB)$/vector.lib SHL1TARGET= basegfx_tests @@ -65,23 +66,24 @@ SHL1STDLIBS= \ $(SALLIB) \ $(CPPUHELPERLIB) \ $(CPPULIB) \ + $(TESTSHL2LIB) \ $(CPPUNITLIB) SHL1IMPLIB= i$(SHL1TARGET) DEF1NAME =$(SHL1TARGET) -SHL1VERSIONMAP = export.map +SHL1VERSIONMAP = export.map # END ------------------------------------------------------------------ #------------------------------- All object files ------------------------------- # do this here, so we get right dependencies -SLOFILES=$(SHL1OBJS) +SLOFILES=$(SHL1OBJS) # --- Targets ------------------------------------------------------ .INCLUDE : target.mk -.INCLUDE : _cppunit.mk +.INCLUDE : _cppunit.mk # --- Enable testshl2 execution in normal build ------------------------ @@ -89,7 +91,7 @@ $(MISC)$/unittest_succeeded : $(SHL1TARGETN) @echo ---------------------------------------------------------- @echo - start unit test on library $(SHL1TARGETN) @echo ---------------------------------------------------------- - $(AUGMENT_LIBRARY_PATH) testshl2 -sf $(mktmp ) -forward $(BIN)$/ $(SHL1TARGETN) + $(TESTSHL2) -sf $(mktmp ) -forward $(BIN)$/ $(SHL1TARGETN) $(TOUCH) $@ ALLTAR : $(MISC)$/unittest_succeeded diff --git a/canvas/source/cairo/cairo_canvasfont.cxx b/canvas/source/cairo/cairo_canvasfont.cxx index 3ef5db762c60..c6fa0847e660 100644 --- a/canvas/source/cairo/cairo_canvasfont.cxx +++ b/canvas/source/cairo/cairo_canvasfont.cxx @@ -37,6 +37,7 @@ #include #include +#include #include "cairo_canvasfont.hxx" #include "cairo_textlayout.hxx" @@ -86,6 +87,8 @@ namespace cairocanvas maFont->SetWeight( static_cast(rFontRequest.FontDescription.FontDescription.Weight) ); maFont->SetItalic( (rFontRequest.FontDescription.FontDescription.Letterform<=8) ? ITALIC_NONE : ITALIC_NORMAL ); + maFont->SetLanguage(MsLangId::convertLocaleToLanguage(rFontRequest.Locale)); + // adjust to stretched/shrinked font if( !::rtl::math::approxEqual( rFontMatrix.m00, rFontMatrix.m11) ) { diff --git a/canvas/source/cairo/cairo_canvashelper.cxx b/canvas/source/cairo/cairo_canvashelper.cxx index f1c54e9b4ab7..9cf2dd978759 100644 --- a/canvas/source/cairo/cairo_canvashelper.cxx +++ b/canvas/source/cairo/cairo_canvashelper.cxx @@ -888,7 +888,7 @@ namespace cairocanvas nY = aP.getY(); cairo_matrix_transform_point( &aOrigMatrix, &nX, &nY ); - if( ! bIsBezier && bIsRectangle ) { + if( ! bIsBezier && (bIsRectangle || aOperation == Clip) ) { nX = basegfx::fround( nX ); nY = basegfx::fround( nY ); } diff --git a/canvas/source/cairo/cairo_textlayout.cxx b/canvas/source/cairo/cairo_textlayout.cxx index f822749cab20..08a4e7a70fa1 100644 --- a/canvas/source/cairo/cairo_textlayout.cxx +++ b/canvas/source/cairo/cairo_textlayout.cxx @@ -44,6 +44,12 @@ #include #include #include +#ifdef max +#undef max +#endif +#ifdef min +#undef min +#endif #endif #include diff --git a/canvas/source/cairo/makefile.mk b/canvas/source/cairo/makefile.mk index bd54254abf7e..27a1aeb6dcd7 100644 --- a/canvas/source/cairo/makefile.mk +++ b/canvas/source/cairo/makefile.mk @@ -49,7 +49,7 @@ DLLPRE = # --- X11 Mac build currently doesn't work with cairo ----------- .IF "$(OS)" == "MACOSX" && "$(GUIBASE)" == "unx" @all: - @echo "Cannot build cairocanvas with X11..." + @echo "Cannot build cairocanvas with X11..." .ENDIF .ENDIF @@ -65,7 +65,7 @@ CFLAGS+=-I$(SOLARINCDIR)/cairo .IF "$(verbose)"!="" || "$(VERBOSE)"!="" CDEFS+= -DVERBOSE .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/cairo_cachedbitmap.obj \ $(SLO)$/cairo_cairo.obj \ $(SLO)$/cairo_canvas.obj \ @@ -84,7 +84,7 @@ SLOFILES = $(SLO)$/cairo_cachedbitmap.obj \ SHL1TARGET=$(TARGET).uno -SHL1STDLIBS= $(CPPULIB) $(TKLIB) $(SALLIB) $(VCLLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(TOOLSLIB) +SHL1STDLIBS= $(CPPULIB) $(TKLIB) $(SALLIB) $(VCLLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(TOOLSLIB) $(I18NISOLANGLIB) .IF "$(GUI)"=="UNX" @@ -97,7 +97,6 @@ SHL1STDLIBS+= -lcairo .IF "$(GUIBASE)"=="aqua" # native Mac OS X (Quartz) SLOFILES+= $(SLO)$/cairo_quartz_cairo.obj -OBJCXXFLAGS=-x objective-c++ -fobjc-exceptions CFLAGSCXX+=$(OBJCXXFLAGS) .ELSE # "$(GUIBASE)"=="aqua" @@ -131,7 +130,7 @@ SHL1VERSIONMAP=exports.map DEF1NAME=$(SHL1TARGET) DEF1EXPORTFILE=exports.dxp - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/canvas/source/directx/dx_9rm.cxx b/canvas/source/directx/dx_9rm.cxx index 932a15e1f5c1..acef323ddc1b 100755 --- a/canvas/source/directx/dx_9rm.cxx +++ b/canvas/source/directx/dx_9rm.cxx @@ -956,11 +956,43 @@ namespace dxcanvas { if(hr != D3DERR_DEVICELOST) return false; - hr = mpDevice->Reset(&mad3dpp); - if(SUCCEEDED(hr)) - return true; - if(hr == D3DERR_DEVICELOST) - return true; + + // interestingly enough, sometimes the Reset() below + // *still* causes DeviceLost errors. So, cycle until + // DX was kind enough to really reset the device... + do + { + mpVertexBuffer.reset(); + hr = mpDevice->Reset(&mad3dpp); + if(SUCCEEDED(hr)) + { + IDirect3DVertexBuffer9 *pVB(NULL); + DWORD aFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1); + if( FAILED(mpDevice->CreateVertexBuffer(sizeof(dxvertex)*maNumVertices, + D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, + aFVF, + D3DPOOL_DEFAULT, + &pVB, + NULL)) ) + { + throw lang::NoSupportException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( + "Could not create DirectX device - out of memory!")),NULL); + } + mpVertexBuffer=COMReference(pVB); + + // retry after the restore + if(SUCCEEDED(mpSwapChain->Present(&aRect,&aRect,NULL,NULL,0))) + return true; + } + + TimeValue aTimeout; + aTimeout.Seconds=1; + aTimeout.Nanosec=0; + osl_waitThread(&aTimeout); + } + while(hr == D3DERR_DEVICELOST); + return false; } diff --git a/canvas/source/directx/dx_config.cxx b/canvas/source/directx/dx_config.cxx index 48f44e3ba816..e124d4d78e6a 100755 --- a/canvas/source/directx/dx_config.cxx +++ b/canvas/source/directx/dx_config.cxx @@ -144,6 +144,9 @@ namespace dxcanvas } } + void DXCanvasItem::Notify( const com::sun::star::uno::Sequence& ) {} + void DXCanvasItem::Commit() {} + bool DXCanvasItem::isDeviceUsable( const DeviceInfo& rDeviceInfo ) const { return maValues.find(rDeviceInfo) == maValues.end(); diff --git a/canvas/source/directx/dx_config.hxx b/canvas/source/directx/dx_config.hxx index 34deddb509a7..1fffcb2ed56e 100644 --- a/canvas/source/directx/dx_config.hxx +++ b/canvas/source/directx/dx_config.hxx @@ -77,6 +77,8 @@ namespace dxcanvas bool isBlacklistCurrentDevice() const; void blacklistDevice( const DeviceInfo& rDeviceInfo ); void adaptMaxTextureSize( basegfx::B2IVector& io_maxTextureSize ) const; + virtual void Notify( const com::sun::star::uno::Sequence& aPropertyNames); + virtual void Commit(); private: typedef std::set< DeviceInfo > ValueSet; diff --git a/canvas/source/directx/dx_surfacegraphics.cxx b/canvas/source/directx/dx_surfacegraphics.cxx index 128095c1315d..8b9af6be6827 100755 --- a/canvas/source/directx/dx_surfacegraphics.cxx +++ b/canvas/source/directx/dx_surfacegraphics.cxx @@ -34,6 +34,8 @@ #include "dx_surfacegraphics.hxx" #include "dx_impltools.hxx" +using namespace ::com::sun::star; + namespace dxcanvas { namespace @@ -75,11 +77,12 @@ namespace dxcanvas tools::setupGraphics( *pGraphics ); pRet.reset(pGraphics, GraphicsDeleter(rSurface, aHDC)); + return pRet; } else rSurface->ReleaseDC( aHDC ); } - return pRet; + throw uno::RuntimeException(); } } diff --git a/canvas/source/directx/dx_textlayout_drawhelper.cxx b/canvas/source/directx/dx_textlayout_drawhelper.cxx index f44d8aa4a518..358bd1e9d74f 100755 --- a/canvas/source/directx/dx_textlayout_drawhelper.cxx +++ b/canvas/source/directx/dx_textlayout_drawhelper.cxx @@ -52,6 +52,7 @@ #include #include "dx_impltools.hxx" #include +#include #include "dx_textlayout_drawhelper.hxx" #include "dx_bitmap.hxx" #include "dx_canvasfont.hxx" @@ -135,6 +136,8 @@ namespace dxcanvas aFont.SetWeight( static_cast(rFontRequest.FontDescription.FontDescription.Weight) ); aFont.SetItalic( (rFontRequest.FontDescription.FontDescription.Letterform<=8) ? ITALIC_NONE : ITALIC_NORMAL ); + aFont.SetLanguage(MsLangId::convertLocaleToLanguage(rFontRequest.Locale)); + // setup font color aFont.SetColor( aColor ); aFont.SetFillColor( aColor ); diff --git a/canvas/source/directx/dx_winstuff.hxx b/canvas/source/directx/dx_winstuff.hxx index e5e7e4ffb4ae..1c64506c0f21 100755 --- a/canvas/source/directx/dx_winstuff.hxx +++ b/canvas/source/directx/dx_winstuff.hxx @@ -97,25 +97,18 @@ #undef DrawText -// Needed for #?$&/@ gdiplus header -#ifndef max -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#define __WORKAROUND_MAX_DEFINED__ -#endif - -#ifndef min -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#define __WORKAROUND_MIN_DEFINED__ -#endif - +#ifdef __MINGW32__ +using ::std::max; +using ::std::min; +#endif + #include -#ifdef __WORKAROUND_MAX_DEFINED__ -#undef max +#ifdef min +# undef min #endif - -#ifdef __WORKAROUND_MIN_DEFINED__ -#undef min +#ifdef max +# undef max #endif namespace dxcanvas diff --git a/canvas/source/directx/makefile.mk b/canvas/source/directx/makefile.mk index c1d210dfcf64..1a9db2ec51c0 100644 --- a/canvas/source/directx/makefile.mk +++ b/canvas/source/directx/makefile.mk @@ -96,7 +96,7 @@ GDIPLUS_SLOFILES = \ $(SLO)$/dx_canvas.obj GDIPLUS_SLOFILES += $(SHARED_SLOFILES) -STDLIBS= $(CPPULIB) $(TKLIB) $(SALLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(VCLLIB) $(TOOLSLIB) $(UNOTOOLSLIB) +STDLIBS= $(CPPULIB) $(TKLIB) $(SALLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(VCLLIB) $(TOOLSLIB) $(UNOTOOLSLIB) $(I18NISOLANGLIB) ######################################################## @@ -194,7 +194,7 @@ LIB3OBJFILES = $(GDIPLUS_SLOFILES) SHL3TARGET=$(TARGET3).uno # Links import libraries. -SHL3STDLIBS= $(CPPULIB) $(TKLIB) $(SALLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(VCLLIB) $(TOOLSLIB) $(UNOTOOLSLIB) +SHL3STDLIBS= $(CPPULIB) $(TKLIB) $(SALLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(VCLLIB) $(TOOLSLIB) $(UNOTOOLSLIB) $(I18NISOLANGLIB) # Specifies an import library to create. For Win32 only. SHL3IMPLIB=i$(TARGET3).lib diff --git a/canvas/source/factory/makefile.mk b/canvas/source/factory/makefile.mk index 3e9611412463..1051b953ae81 100644 --- a/canvas/source/factory/makefile.mk +++ b/canvas/source/factory/makefile.mk @@ -37,7 +37,7 @@ ENABLE_EXCEPTIONS = TRUE .INCLUDE : settings.mk DLLPRE = - +.IF "$(L10N_framework)"=="" SLOFILES = \ $(SLO)$/cf_service.obj @@ -55,6 +55,6 @@ SHL1LIBS = $(SLB)$/$(TARGET).lib SHL1DEF = $(MISC)$/$(SHL1TARGET).def DEF1NAME = $(SHL1TARGET) - +.ENDIF .INCLUDE : target.mk diff --git a/canvas/source/null/makefile.mk b/canvas/source/null/makefile.mk index 76e372c56fd7..99a6bbab93a4 100644 --- a/canvas/source/null/makefile.mk +++ b/canvas/source/null/makefile.mk @@ -45,7 +45,7 @@ DLLPRE = .IF "$(verbose)"!="" || "$(VERBOSE)"!="" CDEFS+= -DVERBOSE .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/null_canvasbitmap.obj \ $(SLO)$/null_canvascustomsprite.obj \ $(SLO)$/null_canvasfont.obj \ @@ -68,7 +68,7 @@ SHL1VERSIONMAP=exports.map DEF1NAME=$(SHL1TARGET) DEF1EXPORTFILE=exports.dxp - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/canvas/source/simplecanvas/makefile.mk b/canvas/source/simplecanvas/makefile.mk index 6417ddb0c650..c0a60250ab85 100644 --- a/canvas/source/simplecanvas/makefile.mk +++ b/canvas/source/simplecanvas/makefile.mk @@ -45,7 +45,7 @@ DLLPRE = .IF "$(verbose)"!="" || "$(VERBOSE)"!="" CDEFS+= -DVERBOSE .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/simplecanvasimpl.obj SHL1TARGET=$(TARGET).uno @@ -60,6 +60,7 @@ SHL1VERSIONMAP=exports.map DEF1NAME=$(SHL1TARGET) DEF1EXPORTFILE=exports.dxp +.ENDIF # ========================================================================== diff --git a/canvas/source/tools/makefile.mk b/canvas/source/tools/makefile.mk index bf99a00febfc..9dc9967fac82 100644 --- a/canvas/source/tools/makefile.mk +++ b/canvas/source/tools/makefile.mk @@ -51,7 +51,7 @@ CDEFS+= -DPROFILER #CFLAGS +:= /Ox /Ot # THIS IS IMPORTANT - +.IF "$(L10N_framework)"=="" SLOFILES = \ $(SLO)$/cachedprimitivebase.obj \ $(SLO)$/canvascustomspritehelper.obj \ @@ -95,7 +95,7 @@ DEFLIB1NAME =$(TARGET) .IF "$(GUI)" == "WNT" SHL1STDLIBS += $(WINMMLIB) $(KERNEL32LIB) .ENDIF - +.ENDIF # ========================================================================== diff --git a/canvas/source/vcl/canvasfont.cxx b/canvas/source/vcl/canvasfont.cxx index 9fb69875ecde..d5b276901594 100644 --- a/canvas/source/vcl/canvasfont.cxx +++ b/canvas/source/vcl/canvasfont.cxx @@ -35,7 +35,7 @@ #include #include - +#include #include #include "canvasfont.hxx" @@ -67,6 +67,8 @@ namespace vclcanvas maFont->SetWeight( static_cast(rFontRequest.FontDescription.FontDescription.Weight) ); maFont->SetItalic( (rFontRequest.FontDescription.FontDescription.Letterform<=8) ? ITALIC_NONE : ITALIC_NORMAL ); + maFont->SetLanguage(MsLangId::convertLocaleToLanguage(rFontRequest.Locale)); + // adjust to stretched/shrinked font if( !::rtl::math::approxEqual( rFontMatrix.m00, rFontMatrix.m11) ) { @@ -125,8 +127,19 @@ namespace vclcanvas { tools::LocalGuard aGuard; - // TODO(F1) - return rendering::FontMetrics(); + OutputDevice& rOutDev = mpOutDevProvider->getOutDev(); + VirtualDevice aVDev( rOutDev ); + aVDev.SetFont(getVCLFont()); + const ::FontMetric& aMetric( aVDev.GetFontMetric() ); + + return rendering::FontMetrics( + aMetric.GetAscent(), + aMetric.GetDescent(), + aMetric.GetIntLeading(), + aMetric.GetExtLeading(), + 0, + aMetric.GetDescent() / 2.0, + aMetric.GetAscent() / 2.0); } uno::Sequence< double > SAL_CALL CanvasFont::getAvailableSizes( ) throw (uno::RuntimeException) diff --git a/canvas/source/vcl/makefile.mk b/canvas/source/vcl/makefile.mk index 781cd58d8b91..fdfdd62d16b8 100644 --- a/canvas/source/vcl/makefile.mk +++ b/canvas/source/vcl/makefile.mk @@ -73,7 +73,7 @@ SLOFILES = $(SLO)$/backbuffer.obj \ SHL1TARGET=$(TARGET).uno -SHL1STDLIBS= $(TOOLSLIB) $(TKLIB) $(CPPULIB) $(SALLIB) $(VCLLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(GOODIESLIB) +SHL1STDLIBS= $(TOOLSLIB) $(TKLIB) $(CPPULIB) $(SALLIB) $(VCLLIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(CANVASTOOLSLIB) $(GOODIESLIB) $(I18NISOLANGLIB) SHL1IMPLIB=i$(TARGET) SHL1LIBS=$(SLB)$/$(TARGET).lib diff --git a/canvas/source/vcl/textlayout.cxx b/canvas/source/vcl/textlayout.cxx index f9fa6f6dc4d2..5787f32cf4bf 100644 --- a/canvas/source/vcl/textlayout.cxx +++ b/canvas/source/vcl/textlayout.cxx @@ -35,6 +35,7 @@ #include #include +#include #include #include @@ -42,6 +43,7 @@ #include #include +#include #include "impltools.hxx" #include "textlayout.hxx" @@ -116,16 +118,104 @@ namespace vclcanvas { tools::LocalGuard aGuard; - // TODO(F1) - return uno::Sequence< uno::Reference< rendering::XPolyPolygon2D > >(); + OutputDevice& rOutDev = mpOutDevProvider->getOutDev(); + VirtualDevice aVDev( rOutDev ); + aVDev.SetFont( mpFont->getVCLFont() ); + + setupLayoutMode( aVDev, mnTextDirection ); + + const rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + NULL); + + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D(1,0,0,0,1,0), + NULL, + uno::Sequence(4), + rendering::CompositeOperation::SOURCE); + + ::boost::scoped_array< sal_Int32 > aOffsets(new sal_Int32[maLogicalAdvancements.getLength()]); + setupTextOffsets(aOffsets.get(), maLogicalAdvancements, aViewState, aRenderState); + + uno::Sequence< uno::Reference< rendering::XPolyPolygon2D> > aOutlineSequence; + ::basegfx::B2DPolyPolygonVector aOutlines; + if (aVDev.GetTextOutlines( + aOutlines, + maText.Text, + ::canvas::tools::numeric_cast(maText.StartPosition), + ::canvas::tools::numeric_cast(maText.StartPosition), + ::canvas::tools::numeric_cast(maText.Length), + FALSE, + 0, + aOffsets.get())) + { + aOutlineSequence.realloc(aOutlines.size()); + sal_Int32 nIndex (0); + for (::basegfx::B2DPolyPolygonVector::const_iterator + iOutline(aOutlines.begin()), + iEnd(aOutlines.end()); + iOutline!=iEnd; + ++iOutline) + { + aOutlineSequence[nIndex++] = ::basegfx::unotools::xPolyPolygonFromB2DPolyPolygon( + mxDevice, + *iOutline); + } + } + + return aOutlineSequence; } uno::Sequence< geometry::RealRectangle2D > SAL_CALL TextLayout::queryInkMeasures( ) throw (uno::RuntimeException) { tools::LocalGuard aGuard; - // TODO(F1) - return uno::Sequence< geometry::RealRectangle2D >(); + + OutputDevice& rOutDev = mpOutDevProvider->getOutDev(); + VirtualDevice aVDev( rOutDev ); + aVDev.SetFont( mpFont->getVCLFont() ); + + setupLayoutMode( aVDev, mnTextDirection ); + + const rendering::ViewState aViewState( + geometry::AffineMatrix2D(1,0,0, 0,1,0), + NULL); + + rendering::RenderState aRenderState ( + geometry::AffineMatrix2D(1,0,0,0,1,0), + NULL, + uno::Sequence(4), + rendering::CompositeOperation::SOURCE); + + ::boost::scoped_array< sal_Int32 > aOffsets(new sal_Int32[maLogicalAdvancements.getLength()]); + setupTextOffsets(aOffsets.get(), maLogicalAdvancements, aViewState, aRenderState); + + MetricVector aMetricVector; + uno::Sequence aBoundingBoxes; + if (aVDev.GetGlyphBoundRects( + Point(0,0), + maText.Text, + ::canvas::tools::numeric_cast(maText.StartPosition), + ::canvas::tools::numeric_cast(maText.Length), + ::canvas::tools::numeric_cast(maText.StartPosition), + aMetricVector)) + { + aBoundingBoxes.realloc(aMetricVector.size()); + sal_Int32 nIndex (0); + for (MetricVector::const_iterator + iMetric(aMetricVector.begin()), + iEnd(aMetricVector.end()); + iMetric!=iEnd; + ++iMetric) + { + aBoundingBoxes[nIndex++] = geometry::RealRectangle2D( + iMetric->getX(), + iMetric->getY(), + iMetric->getX() + iMetric->getWidth(), + iMetric->getY() + iMetric->getHeight()); + } + } + return aBoundingBoxes; } uno::Sequence< geometry::RealRectangle2D > SAL_CALL TextLayout::queryMeasures( ) throw (uno::RuntimeException) @@ -171,7 +261,7 @@ namespace vclcanvas setupLayoutMode( aVDev, mnTextDirection ); - const sal_Int32 nAboveBaseline( -aMetric.GetIntLeading() - aMetric.GetAscent() ); + const sal_Int32 nAboveBaseline( /*-aMetric.GetIntLeading()*/ - aMetric.GetAscent() ); const sal_Int32 nBelowBaseline( aMetric.GetDescent() ); if( maLogicalAdvancements.getLength() ) diff --git a/comphelper/inc/comphelper/docpasswordhelper.hxx b/comphelper/inc/comphelper/docpasswordhelper.hxx new file mode 100644 index 000000000000..90927a3e9c6c --- /dev/null +++ b/comphelper/inc/comphelper/docpasswordhelper.hxx @@ -0,0 +1,212 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: docpasswordhelper.hxx,v $ + * $Revision: 1.1 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef COMPHELPER_DOCPASSWORDHELPR_HXX +#define COMPHELPER_DOCPASSWORDHELPR_HXX + +#include "comphelper/comphelperdllapi.h" +#include +#include "comphelper/docpasswordrequest.hxx" + +namespace com { namespace sun { namespace star { namespace task { class XInteractionHandler; } } } } + +namespace comphelper { + +class MediaDescriptor; + +// ============================================================================ + +enum DocPasswordVerifierResult +{ + DocPasswordVerifierResult_OK, + DocPasswordVerifierResult_WRONG_PASSWORD, + DocPasswordVerifierResult_ABORT +}; + +// ============================================================================ + +/** Base class for a password verifier used by the DocPasswordHelper class + below. + + Users have to implement the virtual function and pass an instance of the + verifier to one of the password request functions. + */ +class COMPHELPER_DLLPUBLIC IDocPasswordVerifier +{ +public: + virtual ~IDocPasswordVerifier(); + + /** Will be called everytime a password needs to be verified. + + @return The result of the verification. + - DocPasswordVerifierResult_OK, if and only if the passed password + is valid and can be used to process the related document. + - DocPasswordVerifierResult_WRONG_PASSWORD, if the password is + wrong. The user may be asked again for a new password. + - DocPasswordVerifierResult_ABORT, if an unrecoverable error + occured while password verification. The password request loop + will be aborted. + */ + virtual DocPasswordVerifierResult verifyPassword( const ::rtl::OUString& rPassword ) = 0; + +}; + +// ============================================================================ + +/** Helper that asks for a document password and checks its validity. + */ +class COMPHELPER_DLLPUBLIC DocPasswordHelper +{ +public: + // ------------------------------------------------------------------------ + + /** This helper function tries to request and verify a password to load a + protected document. + + First, the list of default passwords will be tried if provided. This is + needed by import filters for external file formats that have to check a + predefined password in some cases without asking the user for a + password. Every password is checked using the passed password verifier. + + If not successful, the passed password of a medium is tried, that has + been set e.g. by an API call to load a document. If existing, the + password is checked using the passed password verifier. + + If still not successful, the passed interaction handler is used to + request a password from the user. This will be repeated until the + passed password verifier validates the entered password, or if the user + chooses to cancel password input. + + @param rVerifier + The password verifier used to check every processed password. + + @param rMediaPassword + If not empty, will be passed to the password validator before + requesting a password from the user. This password usually should + be querried from a media descriptor. + + @param rxInteractHandler + The interaction handler that will be used to request a password + from the user, e.g. by showing a password input dialog. + + @param rDocumentName + The name of the related document that will be shown in the password + input dialog. + + @param eRequestType + The password request type that will be passed to the + DocPasswordRequest object created internally. See + docpasswordrequest.hxx for more details. + + @param pDefaultPasswords + If not null, contains default passwords that will be tried before a + password will be requested from the media descriptor or the user. + + @param pbIsDefaultPassword + (output parameter) If not null, the type of the found password will + be returned. True means the password has been found in the passed + list of default passwords. False means the password has been taken + from the rMediaPassword parameter or has been entered by the user. + + @return + If not empty, contains the password that has been validated by the + passed password verifier. If empty, no valid password has been + found, or the user has chossen to cancel password input. + */ + static ::rtl::OUString requestAndVerifyDocPassword( + IDocPasswordVerifier& rVerifier, + const ::rtl::OUString& rMediaPassword, + const ::com::sun::star::uno::Reference< + ::com::sun::star::task::XInteractionHandler >& rxInteractHandler, + const ::rtl::OUString& rDocumentName, + DocPasswordRequestType eRequestType, + const ::std::vector< ::rtl::OUString >* pDefaultPasswords = 0, + bool* pbIsDefaultPassword = 0 ); + + // ------------------------------------------------------------------------ + + /** This helper function tries to find a password for the document + described by the passed media descriptor. + + First, the list of default passwords will be tried if provided. This is + needed by import filters for external file formats that have to check a + predefined password in some cases without asking the user for a + password. Every password is checked using the passed password verifier. + + If not successful, the passed media descriptor is asked for a password, + that has been set e.g. by an API call to load a document. If existing, + the password is checked using the passed password verifier. + + If still not successful, the interaction handler contained in the + passed nmedia descriptor is used to request a password from the user. + This will be repeated until the passed password verifier validates the + entered password, or if the user chooses to cancel password input. + + @param rVerifier + The password verifier used to check every processed password. + + @param rMediaDesc + The media descriptor of the document that needs to be opened with + a password. If a valid password (that is not contained in the + passed list of default passwords) was found, it will be inserted + into the "Password" property of this descriptor. + + @param eRequestType + The password request type that will be passed to the + DocPasswordRequest object created internally. See + docpasswordrequest.hxx for more details. + + @param pDefaultPasswords + If not null, contains default passwords that will be tried before a + password will be requested from the media descriptor or the user. + + @return + If not empty, contains the password that has been validated by the + passed password verifier. If empty, no valid password has been + found, or the user has chossen to cancel password input. + */ + static ::rtl::OUString requestAndVerifyDocPassword( + IDocPasswordVerifier& rVerifier, + MediaDescriptor& rMediaDesc, + DocPasswordRequestType eRequestType, + const ::std::vector< ::rtl::OUString >* pDefaultPasswords = 0 ); + + // ------------------------------------------------------------------------ + +private: + ~DocPasswordHelper(); +}; + +// ============================================================================ + +} // namespace comphelper + +#endif + diff --git a/comphelper/inc/comphelper/docpasswordrequest.hxx b/comphelper/inc/comphelper/docpasswordrequest.hxx new file mode 100644 index 000000000000..b1e042e876bd --- /dev/null +++ b/comphelper/inc/comphelper/docpasswordrequest.hxx @@ -0,0 +1,91 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: docpasswordrequest.hxx,v $ + * $Revision: 1.1 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef COMPHELPER_DOCPASSWORDREQUEST_HXX +#define COMPHELPER_DOCPASSWORDREQUEST_HXX + +#include "comphelper/comphelperdllapi.h" +#include +#include +#include + +namespace comphelper { + +// ============================================================================ + +/** Selects which UNO document password request type to use. */ +enum DocPasswordRequestType +{ + DocPasswordRequestType_STANDARD, /// Uses the standard com.sun.star.task.DocumentPasswordRequest request. + DocPasswordRequestType_MS /// Uses the com.sun.star.task.DocumentMSPasswordRequest request. +}; + +// ============================================================================ + +class AbortContinuation; +class PasswordContinuation; + +/** Implements the task.XInteractionRequest interface for requesting a password + string for a document. + */ +class COMPHELPER_DLLPUBLIC DocPasswordRequest : public ::cppu::WeakImplHelper1< ::com::sun::star::task::XInteractionRequest > +{ +public: + explicit DocPasswordRequest( + DocPasswordRequestType eType, + ::com::sun::star::task::PasswordRequestMode eMode, + const ::rtl::OUString& rDocumentName ); + virtual ~DocPasswordRequest(); + + bool isAbort() const; + bool isPassword() const; + ::rtl::OUString getPassword() const; + +private: + virtual ::com::sun::star::uno::Any SAL_CALL + getRequest() throw( ::com::sun::star::uno::RuntimeException ); + + virtual ::com::sun::star::uno::Sequence< + ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation > > SAL_CALL + getContinuations() throw( ::com::sun::star::uno::RuntimeException ); + +private: + ::com::sun::star::uno::Any maRequest; + ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation > > maContinuations; + AbortContinuation* mpAbort; + PasswordContinuation* mpPassword; +}; + +// ============================================================================ + +} // namespace comphelper + +#endif + diff --git a/comphelper/inc/comphelper/mediadescriptor.hxx b/comphelper/inc/comphelper/mediadescriptor.hxx index 5cd36d2e687b..e388c0b4ca3c 100644 --- a/comphelper/inc/comphelper/mediadescriptor.hxx +++ b/comphelper/inc/comphelper/mediadescriptor.hxx @@ -74,8 +74,10 @@ class COMPHELPER_DLLPUBLIC MediaDescriptor : public SequenceAsHashMap does not work as expected under windows (under unix it works as well) these way must be used :-( */ + static const ::rtl::OUString& PROP_ABORTED(); static const ::rtl::OUString& PROP_ASTEMPLATE(); static const ::rtl::OUString& PROP_CHARACTERSET(); + static const ::rtl::OUString& PROP_COMPONENTDATA(); static const ::rtl::OUString& PROP_DEEPDETECTION(); static const ::rtl::OUString& PROP_DETECTSERVICE(); static const ::rtl::OUString& PROP_DOCUMENTSERVICE(); diff --git a/comphelper/inc/comphelper/processfactory.hxx b/comphelper/inc/comphelper/processfactory.hxx index d2ae887ba341..9b24f8e784ac 100644 --- a/comphelper/inc/comphelper/processfactory.hxx +++ b/comphelper/inc/comphelper/processfactory.hxx @@ -79,10 +79,19 @@ COMPHELPER_DLLPUBLIC ::com::sun::star::uno::Reference< ::com::sun::star::uno::XI const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& _rArgs ) SAL_THROW( ( ::com::sun::star::uno::RuntimeException ) ); +/** + * This function gets the process service factory's default component context. + * If no service factory is set the function returns a null interface. + */ +COMPHELPER_DLLPUBLIC +::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > +getProcessComponentContext(); + } + extern "C" { -/// @internal +/// @internal ATTENTION returns ACQUIRED pointer! release it explicitly! COMPHELPER_DLLPUBLIC ::com::sun::star::uno::XComponentContext * comphelper_getProcessComponentContext(); diff --git a/comphelper/inc/comphelper/servicedecl.hxx b/comphelper/inc/comphelper/servicedecl.hxx index a11598bdca85..7b77d3ba29e7 100644 --- a/comphelper/inc/comphelper/servicedecl.hxx +++ b/comphelper/inc/comphelper/servicedecl.hxx @@ -169,21 +169,20 @@ template struct with_args; /// @internal namespace detail { - template -class ServiceImpl - : public ::cppu::ImplInheritanceHelper1, +class OwnServiceImpl + : public ImplT, private ::boost::noncopyable { - typedef ::cppu::ImplInheritanceHelper1 BaseT; + typedef ImplT BaseT; public: - ServiceImpl( + OwnServiceImpl( ServiceDecl const& rServiceDecl, css::uno::Sequence const& args, css::uno::Reference const& xContext ) - : BaseT(args, xContext), m_rServiceDecl(rServiceDecl) {} - ServiceImpl( + :BaseT(args, xContext), m_rServiceDecl(rServiceDecl) {} + OwnServiceImpl( ServiceDecl const& rServiceDecl, css::uno::Reference const& xContext ) : BaseT(xContext), m_rServiceDecl(rServiceDecl) {} @@ -206,6 +205,22 @@ private: ServiceDecl const& m_rServiceDecl; }; +template +class ServiceImpl : public OwnServiceImpl< ::cppu::ImplInheritanceHelper1 > +{ +typedef OwnServiceImpl< ::cppu::ImplInheritanceHelper1 > ServiceImpl_BASE; +public: + ServiceImpl( + ServiceDecl const& rServiceDecl, + css::uno::Sequence const& args, + css::uno::Reference const& xContext ) + : ServiceImpl_BASE(rServiceDecl, args, xContext) {} + ServiceImpl( + ServiceDecl const& rServiceDecl, + css::uno::Reference const& xContext ) + : ServiceImpl_BASE(rServiceDecl, xContext) {} +}; + template struct PostProcessDefault { css::uno::Reference @@ -230,7 +245,7 @@ struct CreateFunc > { const& xContext ) const { return m_postProcessFunc( - new ServiceImpl( rServiceDecl, xContext ) ); + new ImplT( rServiceDecl, xContext ) ); } }; @@ -247,7 +262,7 @@ struct CreateFunc > { const& xContext ) const { return m_postProcessFunc( - new ServiceImpl( rServiceDecl, args, xContext ) ); + new ImplT( rServiceDecl, args, xContext ) ); } }; @@ -261,18 +276,17 @@ struct CreateFunc > { or just (uno::Reference) */ template > -struct class_ { +struct serviceimpl_base { typedef ImplT_ ImplT; - typedef detail::ServiceImpl ServiceImplT; detail::CreateFuncF const m_createFunc; - typedef detail::PostProcessDefault PostProcessDefaultT; + typedef detail::PostProcessDefault PostProcessDefaultT; /** Default ctor. Implementation class without args, expecting component context as single argument. */ - class_() : m_createFunc( + serviceimpl_base() : m_createFunc( detail::CreateFunc( PostProcessDefaultT() ) ) {} @@ -284,11 +298,29 @@ struct class_ { uno::Reference */ template - explicit class_( PostProcessFuncT const& postProcessFunc ) + explicit serviceimpl_base( PostProcessFuncT const& postProcessFunc ) : m_createFunc( detail::CreateFunc( postProcessFunc ) ) {} }; +template > +struct class_ : public serviceimpl_base< detail::ServiceImpl, WithArgsT > +{ + typedef serviceimpl_base< detail::ServiceImpl, WithArgsT > baseT; + /** Default ctor. Implementation class without args, expecting + component context as single argument. + */ + class_() : baseT() {} + template + /** Ctor to pass a post processing function/functor. + + @tpl PostProcessDefaultT let your compiler deduce this + @param postProcessFunc function/functor that gets the yet unacquired + ImplT_ pointer returning a + uno::Reference + */ + explicit class_( PostProcessFuncT const& postProcessFunc ) : baseT( postProcessFunc ) {} +}; // // component_... helpers with arbitrary service declarations: diff --git a/comphelper/inc/comphelper/stl_types.hxx b/comphelper/inc/comphelper/stl_types.hxx index aeb6342048c9..4b3126043a08 100644 --- a/comphelper/inc/comphelper/stl_types.hxx +++ b/comphelper/inc/comphelper/stl_types.hxx @@ -49,6 +49,7 @@ #include +#include #include #include @@ -191,6 +192,59 @@ inline mem_fun1_t<_Tp,_Arg> mem_fun(void (_Tp::*__f)(_Arg)) return mem_fun1_t<_Tp,_Arg>(__f); } +//......................................................................... +/** output iterator that appends OUStrings into an OUStringBuffer. + */ +class OUStringBufferAppender : + public ::std::iterator< ::std::output_iterator_tag, void, void, void, void> +{ +public: + typedef OUStringBufferAppender Self; + typedef ::std::output_iterator_tag iterator_category; + typedef void value_type; + typedef void reference; + typedef void pointer; + typedef size_t difference_type; + + OUStringBufferAppender(::rtl::OUStringBuffer & i_rBuffer) + : m_rBuffer(i_rBuffer) { } + Self & operator=(::rtl::OUString const & i_rStr) + { + m_rBuffer.append( i_rStr ); + return *this; + } + Self & operator*() { return *this; } // so operator= works + Self & operator++() { return *this; } + Self & operator++(int) { return *this; } + +private: + ::rtl::OUStringBuffer & m_rBuffer; +}; + +//......................................................................... +/** algorithm similar to std::copy, but inserts a separator between elements. + */ +template< typename ForwardIter, typename OutputIter, typename T > +OutputIter intersperse( + ForwardIter start, ForwardIter end, OutputIter out, T const & separator) +{ + if (start != end) { + *out = *start; + ++start; + ++out; + } + + while (start != end) { + *out = separator; + ++out; + *out = *start; + ++start; + ++out; + } + + return out; +} + //......................................................................... } //... namespace comphelper ................................................ diff --git a/comphelper/inc/comphelper/stlunosequence.hxx b/comphelper/inc/comphelper/stlunosequence.hxx index 2ffe08cb6b75..c9bc525cabd6 100644 --- a/comphelper/inc/comphelper/stlunosequence.hxx +++ b/comphelper/inc/comphelper/stlunosequence.hxx @@ -5,9 +5,9 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: stlunosequence.hxx,v $ + * $RCSfile: $ * - * $Revision: 1.3 $ + * $Revision: $ * * This file is part of OpenOffice.org. * @@ -31,457 +31,59 @@ #define _COMPHELPER_STLUNOITERATOR_HXX #include -#include #include -namespace comphelper { namespace stlunosequence { - template - class StlSequence; - - template - class StlSequenceIterator : public std::iterator - { - public: - typedef ::std::random_access_iterator_tag iterator_category; - typedef V& reference; - typedef V value_type; - typedef sal_Int32 difference_type; - typedef V* pointer; - typedef const V& const_reference; - - StlSequenceIterator(); - StlSequenceIterator(S * uno_sequence, typename StlSequenceIterator::difference_type index); - - reference operator*() const; - StlSequenceIterator& operator++(); - StlSequenceIterator operator++(int); - StlSequenceIterator& operator--(); - StlSequenceIterator operator--(int); - StlSequenceIterator& operator+=(const typename StlSequenceIterator::difference_type by); - StlSequenceIterator& operator-=(const typename StlSequenceIterator::difference_type by); - StlSequenceIterator operator+(const typename StlSequenceIterator::difference_type by) const; - StlSequenceIterator operator-(const typename StlSequenceIterator::difference_type by) const; - typename StlSequenceIterator::difference_type operator-(const StlSequenceIterator& to) const; - - bool operator==(const StlSequenceIterator& other) const; - bool operator!=(const StlSequenceIterator& other) const; - bool operator<(const StlSequenceIterator& other) const; - reference operator[](const typename StlSequenceIterator::difference_type by) const; - - - protected: - friend class StlSequence; - S * m_UnoSequence; - typename StlSequenceIterator::difference_type m_Index; - }; - - template - class StlSequenceConstIterator : public StlSequenceIterator - { - public: - typedef const V& reference; - StlSequenceConstIterator(); - StlSequenceConstIterator(S * uno_sequence, typename StlSequenceIterator::difference_type by); - typename StlSequenceIterator::const_reference operator*() const - { - return (*(this->m_UnoSequence))[this->m_Index]; - } - - typename StlSequenceIterator::const_reference operator[](const typename StlSequenceIterator::difference_type by) const - { - return (*(this->m_UnoSequence))[this->m_Index+by]; - } - }; - - template - class StlSequence - { - public: - typedef sal_Int32 size_type; - typedef V& reference; - typedef const V& const_reference; - typedef sal_Int32 difference_type; - typedef V value_type; - typedef StlSequenceIterator iterator; - typedef StlSequenceConstIterator const_iterator; - - StlSequence(S& uno_sequence); - - typename StlSequence::size_type size() const; - typename StlSequence::size_type max_size() const; - bool empty() const; - void swap(StlSequence& other); - typename StlSequence::iterator begin(); - typename StlSequence::iterator end(); - typename StlSequence::const_iterator begin() const; - typename StlSequence::const_iterator end() const; - - bool operator==(const StlSequence& other) const; - bool operator!=(const StlSequence& other) const; - bool operator<(const StlSequence& other) const; - bool operator>(const StlSequence& other) const; - bool operator<=(const StlSequence& other) const; - bool operator>=(const StlSequence& other) const; - - - private: - friend class StlSequenceIterator; - S * m_UnoSequence; - static const typename StlSequence::size_type begin_of_sequence; - static const typename StlSequence::size_type end_of_sequence; - }; - - //StlSequenceIterator - template - StlSequenceIterator::StlSequenceIterator() - : m_UnoSequence(0), m_Index(StlSequence::end_of_sequence) - {} - - template - StlSequenceConstIterator::StlSequenceConstIterator() - {} - - template - StlSequenceIterator::StlSequenceIterator(S * uno_sequence, typename StlSequenceIterator::difference_type index) - : m_UnoSequence(uno_sequence), m_Index(index) - {} - - template - StlSequenceConstIterator::StlSequenceConstIterator(S * uno_sequence, typename StlSequenceIterator::difference_type index) - : StlSequenceIterator(uno_sequence, index) - {} - - template - inline typename StlSequenceIterator::reference StlSequenceIterator::operator*() const - { - return (*m_UnoSequence)[m_Index]; - } - - template - inline StlSequenceIterator& StlSequenceIterator::operator++() - { - ++m_Index; - if(m_Index>=m_UnoSequence->getLength()) - m_Index = StlSequence::end_of_sequence; - return *this; - } - - template - inline StlSequenceIterator StlSequenceIterator::operator++(int) - { - StlSequenceIterator temp = *this; - ++*this; - return temp; - } - - template - inline StlSequenceIterator& StlSequenceIterator::operator--() - { - if(m_Index==StlSequence::end_of_sequence) - m_Index = m_UnoSequence->getLength(); - --m_Index; - return *this; - } - - template - inline StlSequenceIterator StlSequenceIterator::operator--(int) - { - StlSequenceIterator temp = *this; - --*this; - return temp; - } - - template - inline StlSequenceIterator& StlSequenceIterator::operator+=(const typename StlSequenceIterator::difference_type by) - { - if(by<0) - { - this->operator-=(-by); - return *this; - } - if(by==0) - return *this; - m_Index+=by; - if(m_Index>=m_UnoSequence->getLength()) - m_Index=StlSequence::end_of_sequence; - return *this; - } - - template - inline StlSequenceIterator& StlSequenceIterator::operator-=(const typename StlSequenceIterator::difference_type by) - { - if(by<0) - { - if(-by==by) return *this; // breaking infinitive loop on MIN_INT - this->operator+=(-by); - return *this; - } - if(by==0) - return *this; - if(m_Index==StlSequence::end_of_sequence) - m_Index=m_UnoSequence->getLength(); - m_Index-=by; - return *this; - } - - template - inline StlSequenceIterator StlSequenceIterator::operator+(const typename StlSequenceIterator::difference_type by) const - { - StlSequenceIterator result = StlSequenceIterator(*this); - result+=by; - return result; - } - - template - inline StlSequenceIterator StlSequenceIterator::operator-(const typename StlSequenceIterator::difference_type by) const - { - StlSequenceIterator result = StlSequenceIterator(*this); - result-=by; - return result; - } - - template - inline typename StlSequenceIterator::difference_type StlSequenceIterator::operator-(const StlSequenceIterator& to) const - { - if(m_Index==StlSequence::end_of_sequence ^ to.m_Index==StlSequence::end_of_sequence) - { - if(m_Index==StlSequence::end_of_sequence) - return m_UnoSequence->getLength()-to.m_Index; - else - return m_Index-m_UnoSequence->getLength(); - } - return m_Index-to.m_Index; - } - - template - inline bool StlSequenceIterator::operator==(const StlSequenceIterator& other) const - { - return (m_Index == other.m_Index); - } - - template - inline bool StlSequenceIterator::operator!=(const StlSequenceIterator& other) const - { - return !this->operator==(other); - } - - template - inline bool StlSequenceIterator::operator<(const StlSequenceIterator& other) const - { - if(m_Index==StlSequence::end_of_sequence ^ other.m_Index==StlSequence::end_of_sequence) - return other.m_Index==StlSequence::end_of_sequence; - return m_Index - inline typename StlSequenceIterator::reference StlSequenceIterator::operator[](const typename StlSequenceIterator::difference_type by) const - { - return (*(this->m_UnoSequence))[this->m_Index+by]; - } - - // StlSequence - template - StlSequence::StlSequence(S& uno_sequence) - : m_UnoSequence(&uno_sequence) - {} - - template - inline typename StlSequence::size_type StlSequence::size() const - { - return m_UnoSequence->getLength(); - } - - template - inline typename StlSequence::size_type StlSequence::max_size() const - { - return this->size(); - } - - template - inline bool StlSequence::empty() const - { - return this->size() == 0; - } - - template - inline void StlSequence::swap(StlSequence& other) - { - ::std::swap(*this, other); - } - - template - inline typename StlSequence::iterator StlSequence::begin() - { - return typename StlSequence::iterator(m_UnoSequence, begin_of_sequence); - } - - template - inline typename StlSequence::iterator StlSequence::end() - { - return typename StlSequence::iterator(m_UnoSequence, end_of_sequence); - } - - template - inline typename StlSequence::const_iterator StlSequence::begin() const - { - return typename StlSequence::const_iterator(m_UnoSequence, begin_of_sequence); - } - - template - inline typename StlSequence::const_iterator StlSequence::end() const - { - return typename StlSequence::const_iterator(m_UnoSequence, end_of_sequence); - } - - template - inline bool StlSequence::operator==(const StlSequence& other) const - { - if(this->size() != other.size()) return false; - return ::std::equal(this->begin(), this->end(), other.begin()); - } - - template - inline bool StlSequence::operator<(const StlSequence& other) const - { - return ::std::lexicographical_compare(this->begin(), this->end(), other.begin(), other.end()); - } - - template - inline bool StlSequence::operator!=(const StlSequence& other) const - { return !(*this == other); } - - template - inline bool StlSequence::operator>(const StlSequence& other) const - { return (other < *this); } - - template - inline bool StlSequence::operator<=(const StlSequence& other) const - { return !(other < *this); } - - template - inline bool StlSequence::operator>=(const StlSequence& other) const - { return !(*this < other); } - - template - const typename StlSequence::size_type StlSequence::begin_of_sequence = 0; - - template - const typename StlSequence::size_type StlSequence::end_of_sequence = -1; -}} - namespace comphelper { /** - @short a wrapper-class that provides stl-container-like access to an existing - ::com::sun::star::uno::Sequence - @descr This template class allows using an existing ::com::sun::star::uno::Sequence - like any other stl container. It provides standard-compliant mutable random access - iterators. Because random access iterators are the most generic iterators defined - by the stl, any stl algorithm can be applied to the Sequence. -

- This is just a basic stl forward container, but _not_ an stl sequence (the size of the - ::com::sun::star::uno::Sequence cannot be changed using the StlUnoSequence interface). - Inserts are expensive operations on ::com::sun::star::uno::Sequence - use - ::std::copy() to a efficient stl container implementing the stl sequence interface - and the available insert iterator adapters you need those. -

- @attention There is one requirement of an stl container that this class does not meet: - It is _not_ owner of its contents and thus it does not destroy its contents when destructed. - @attention No additional boundschecking over the requirements of the STL are performed. - E.g. sequence.begin()-- results in undefined behavior. - @attention StlUnoSequence is not threadsafe. -

- Example: (creating a ::std::list from a ::com::sun::star::uno::Sequence) - - ::com::sun::star::uno::Sequence uno_seq(10); - ::comphelper::StlUnoSequence stl_seq(&uno_seq); - ::std::list stl_list(stl_seq.begin(), stl_seq.end()); - -

- Example: (sorting ::com::sun::star::uno::Sequence inplace) - - ::com::sun::star::uno::Sequence uno_seq(10); - ::comphelper::StlUnoSequence stl_seq(&uno_seq); - ::std::sort(stl_seq.begin(), stl_seq.end()); - -

- Example: (counting occurrences of 4711 in a ::com::sun::star::uno::Sequence) - - ::com::sun::star::uno::Sequence uno_seq(10); - ::comphelper::StlUnoSequence stl_seq(&uno_seq); - sal_Int32 count = 0; - ::std::count(stl_seq.begin(), stl_seq.end(), 4711, count); - -

- Example: (inserting the second half of one Sequence after the first element of another) - - ::com::sun::star::uno::Sequence uno_seq1(10); - ::com::sun::star::uno::Sequence uno_seq2(10); - ::com::sun::star::uno::Sequence result(15); - ::comphelper::StlUnoSequence stl_seq1(&uno_seq1); - ::comphelper::StlUnoSequence stl_seq2(&uno_seq1); - ::comphelper::StlUnoSequence stl_result(&result); - ::std::list temp(uno_seq1.begin(), uno_seq1.end()); - ::std::copy(uno_seq2.begin()+5, uno_seq2.end(), ::std::insert_iterator< ::std::list >(temp, ++temp.begin())); - ::std::copy(temp.begin(), temp.end(), result.begin()); - + @short stl-container-like access to an existing ::com::sun::star::uno::Sequence + @descr These template functions allows using an existing + ::com::sun::star::uno::Sequence using stl algorithms. They provides + standard-compliant mutable random access iterators. Because random access + iterators are the most generic iterators defined by the stl, any stl algorithm + can be applied to the Sequence (excluding algorithms requiring output + iterators). +

+ Example: (creating a ::std::list from a ::com::sun::star::uno::Sequence) + + ::com::sun::star::uno::Sequence aSeq(10); + ::std::list stl_list(stl_begin(aSeq), stl_end(aSeq)); + +

+ Example: (sorting ::com::sun::star::uno::Sequence inplace) + + ::com::sun::star::uno::Sequence aSeq(10); + ::std::sort(stl_begin(aSeq), stl_seq.end(aSeq)); + +

+ Example: (counting occurrences of 4711 in a ::com::sun::star::uno::Sequence) + + ::com::sun::star::uno::Sequence aSeq(10); + sal_Int32 count = 0; + ::std::count(stl_begin(aSeq), stl_end(aSeq), 4711, count); + +

- @see http://www.sgi.com/tech/stl/Container.html - @see http://www.sgi.com/tech/stl/Sequence.html - @see http://www.sgi.com/tech/stl/RandomAccessIterator.html + @see http://www.sgi.com/tech/stl/Container.html + @see http://www.sgi.com/tech/stl/Sequence.html + @see http://www.sgi.com/tech/stl/RandomAccessIterator.html */ template - class StlUnoSequence : public stlunosequence::StlSequence< ::com::sun::star::uno::Sequence, V> - { - public: - /* - @short named constructor (these are needed to keep const-correctness) - */ - static StlUnoSequence createInstance(::com::sun::star::uno::Sequence& uno_sequence) - { return StlUnoSequence(uno_sequence); } - /* - @short named constructor (these are needed to keep const-correctness) - */ - static const StlUnoSequence createInstance(const ::com::sun::star::uno::Sequence& uno_sequence) - { return StlUnoSequence(const_cast< ::com::sun::star::uno::Sequence& >(uno_sequence)); } - private: - StlUnoSequence(::com::sun::star::uno::Sequence& uno_sequence) - : stlunosequence::StlSequence< ::com::sun::star::uno::Sequence, V>(uno_sequence) - {} - }; + V* stl_begin(::com::sun::star::uno::Sequence& rSeq) + { return rSeq.getArray(); } - /* - @short shortcut for StlUnoSequence::createInstance(uno_sequence).begin() - */ template - typename StlUnoSequence::iterator stl_begin(::com::sun::star::uno::Sequence& uno_sequence) - { return StlUnoSequence::createInstance(uno_sequence).begin(); } + V* stl_end(::com::sun::star::uno::Sequence& rSeq) + { return rSeq.getArray() + rSeq.getLength(); } - /* - @short shortcut for StlUnoSequence::createInstance(uno_sequence).end() - */ template - typename StlUnoSequence::iterator stl_end(::com::sun::star::uno::Sequence& uno_sequence) - { return StlUnoSequence::createInstance(uno_sequence).end(); } + const V* stl_begin(const ::com::sun::star::uno::Sequence& rSeq) + { return rSeq.getConstArray(); } - /* - @short shortcut for StlUnoSequence::createInstance(uno_sequence).begin() - */ template - typename StlUnoSequence::const_iterator stl_begin(const ::com::sun::star::uno::Sequence& uno_sequence) - { - return StlUnoSequence::createInstance(uno_sequence).begin(); - } - - /* - @short shortcut for StlUnoSequence::createInstance(uno_sequence).end() - */ - template - typename StlUnoSequence::const_iterator stl_end(const ::com::sun::star::uno::Sequence& uno_sequence) - { - return StlUnoSequence::createInstance(uno_sequence).end(); - } + const V* stl_end(const ::com::sun::star::uno::Sequence& rSeq) + { return rSeq.getConstArray() + rSeq.getLength(); } } #endif diff --git a/comphelper/inc/comphelper/storagehelper.hxx b/comphelper/inc/comphelper/storagehelper.hxx index b99f7e1233ca..efb5431959ba 100644 --- a/comphelper/inc/comphelper/storagehelper.hxx +++ b/comphelper/inc/comphelper/storagehelper.hxx @@ -48,9 +48,6 @@ namespace comphelper { -sal_Bool COMPHELPER_DLLPUBLIC IsValidZipEntryFileName( - const sal_Unicode *pChar, sal_Int32 nLength, sal_Bool bSlashAllowed ); - class COMPHELPER_DLLPUBLIC OStorageHelper { public: diff --git a/comphelper/qa/makefile.mk b/comphelper/qa/makefile.mk index cfc597570bc4..52c57a9d77de 100644 --- a/comphelper/qa/makefile.mk +++ b/comphelper/qa/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -43,7 +43,7 @@ INCPRE += $(MISC)$/$(TARGET)$/inc SHL1TARGET = $(TARGET)_weakbag SHL1OBJS = $(SLO)$/test_weakbag.obj -SHL1STDLIBS = $(CPPUHELPERLIB) $(CPPULIB) $(CPPUNITLIB) $(SALLIB) +SHL1STDLIBS = $(CPPUHELPERLIB) $(CPPULIB) $(CPPUNITLIB) $(TESTSHL2LIB) $(SALLIB) SHL1VERSIONMAP = version.map SHL1IMPLIB = i$(SHL1TARGET) DEF1NAME = $(SHL1TARGET) @@ -55,4 +55,4 @@ SLOFILES = $(SHL1OBJS) ALLTAR: test test .PHONY: $(SHL1TARGETN) - testshl2 $(SHL1TARGETN) + $(TESTSHL2) $(SHL1TARGETN) diff --git a/comphelper/qa/test_string.cxx b/comphelper/qa/test_string.cxx index 035e56fdb8c4..c237158beccc 100644 --- a/comphelper/qa/test_string.cxx +++ b/comphelper/qa/test_string.cxx @@ -32,7 +32,7 @@ #include "sal/config.h" #include "comphelper/string.hxx" -#include "cppunit/simpleheader.hxx" +#include "testshl/simpleheader.hxx" #include "rtl/string.h" #include "rtl/ustring.h" #include "rtl/ustring.hxx" diff --git a/comphelper/qa/test_weakbag.cxx b/comphelper/qa/test_weakbag.cxx index dd4a8356eb5a..470ac2eef6c0 100644 --- a/comphelper/qa/test_weakbag.cxx +++ b/comphelper/qa/test_weakbag.cxx @@ -35,7 +35,7 @@ #include "com/sun/star/uno/XInterface.hpp" #include "comphelper/weakbag.hxx" #include "cppuhelper/weak.hxx" -#include "cppunit/simpleheader.hxx" +#include "testshl/simpleheader.hxx" namespace { diff --git a/comphelper/source/misc/comphelper_services.cxx b/comphelper/source/misc/comphelper_services.cxx index 77ab145e2581..8fa318a92eb1 100644 --- a/comphelper/source/misc/comphelper_services.cxx +++ b/comphelper/source/misc/comphelper_services.cxx @@ -39,6 +39,7 @@ extern void createRegistryInfo_AnyCompareFactory(); extern void createRegistryInfo_OfficeInstallationDirectories(); extern void createRegistryInfo_OInstanceLocker(); extern void createRegistryInfo_Map(); +extern void createRegistryInfo_OSimpleLogRing(); //........................................................................ namespace comphelper { namespace module @@ -63,6 +64,7 @@ namespace comphelper { namespace module createRegistryInfo_OfficeInstallationDirectories(); createRegistryInfo_OInstanceLocker(); createRegistryInfo_Map(); + createRegistryInfo_OSimpleLogRing(); } } } diff --git a/comphelper/source/misc/docpasswordhelper.cxx b/comphelper/source/misc/docpasswordhelper.cxx new file mode 100644 index 000000000000..1f362c02f881 --- /dev/null +++ b/comphelper/source/misc/docpasswordhelper.cxx @@ -0,0 +1,152 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: docpasswordhelper.cxx,v $ + * $Revision: 1.1 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_comphelper.hxx" + +#include "comphelper/docpasswordhelper.hxx" +#include +#include "comphelper/mediadescriptor.hxx" + +using ::rtl::OUString; +using ::com::sun::star::uno::Exception; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::UNO_SET_THROW; +using ::com::sun::star::task::PasswordRequestMode; +using ::com::sun::star::task::PasswordRequestMode_PASSWORD_ENTER; +using ::com::sun::star::task::PasswordRequestMode_PASSWORD_REENTER; +using ::com::sun::star::task::XInteractionHandler; +using ::com::sun::star::task::XInteractionRequest; + +namespace comphelper { + +// ============================================================================ + +IDocPasswordVerifier::~IDocPasswordVerifier() +{ +} + +// ============================================================================ + +/*static*/ OUString DocPasswordHelper::requestAndVerifyDocPassword( + IDocPasswordVerifier& rVerifier, + const OUString& rMediaPassword, + const Reference< XInteractionHandler >& rxInteractHandler, + const OUString& rDocumentName, + DocPasswordRequestType eRequestType, + const ::std::vector< OUString >* pDefaultPasswords, + bool* pbIsDefaultPassword ) +{ + OUString aPassword; + DocPasswordVerifierResult eResult = DocPasswordVerifierResult_WRONG_PASSWORD; + + // first, try provided default passwords + if( pbIsDefaultPassword ) + *pbIsDefaultPassword = false; + if( pDefaultPasswords ) + { + for( ::std::vector< OUString >::const_iterator aIt = pDefaultPasswords->begin(), aEnd = pDefaultPasswords->end(); (eResult == DocPasswordVerifierResult_WRONG_PASSWORD) && (aIt != aEnd); ++aIt ) + { + aPassword = *aIt; + OSL_ENSURE( aPassword.getLength() > 0, "DocPasswordHelper::requestAndVerifyDocPassword - unexpected empty default password" ); + if( aPassword.getLength() > 0 ) + { + eResult = rVerifier.verifyPassword( aPassword ); + if( pbIsDefaultPassword ) + *pbIsDefaultPassword = eResult == DocPasswordVerifierResult_OK; + } + } + } + + // try media password (skip, if result is OK or ABORT) + if( eResult == DocPasswordVerifierResult_WRONG_PASSWORD ) + { + aPassword = rMediaPassword; + if( aPassword.getLength() > 0 ) + eResult = rVerifier.verifyPassword( aPassword ); + } + + // request a password (skip, if result is OK or ABORT) + if( (eResult == DocPasswordVerifierResult_WRONG_PASSWORD) && rxInteractHandler.is() ) try + { + PasswordRequestMode eRequestMode = PasswordRequestMode_PASSWORD_ENTER; + while( eResult == DocPasswordVerifierResult_WRONG_PASSWORD ) + { + DocPasswordRequest* pRequest = new DocPasswordRequest( eRequestType, eRequestMode, rDocumentName ); + Reference< XInteractionRequest > xRequest( pRequest ); + rxInteractHandler->handle( xRequest ); + if( pRequest->isPassword() ) + { + aPassword = pRequest->getPassword(); + if( aPassword.getLength() > 0 ) + eResult = rVerifier.verifyPassword( aPassword ); + } + else + { + eResult = DocPasswordVerifierResult_ABORT; + } + eRequestMode = PasswordRequestMode_PASSWORD_REENTER; + } + } + catch( Exception& ) + { + } + + return (eResult == DocPasswordVerifierResult_OK) ? aPassword : OUString(); +} + +/*static*/ OUString DocPasswordHelper::requestAndVerifyDocPassword( + IDocPasswordVerifier& rVerifier, + MediaDescriptor& rMediaDesc, + DocPasswordRequestType eRequestType, + const ::std::vector< OUString >* pDefaultPasswords ) +{ + OUString aMediaPassword = rMediaDesc.getUnpackedValueOrDefault( + MediaDescriptor::PROP_PASSWORD(), OUString() ); + Reference< XInteractionHandler > xInteractHandler = rMediaDesc.getUnpackedValueOrDefault( + MediaDescriptor::PROP_INTERACTIONHANDLER(), Reference< XInteractionHandler >() ); + OUString aDocumentName = rMediaDesc.getUnpackedValueOrDefault( + MediaDescriptor::PROP_URL(), OUString() ); + + bool bIsDefaultPassword = false; + OUString aPassword = requestAndVerifyDocPassword( + rVerifier, aMediaPassword, xInteractHandler, aDocumentName, eRequestType, pDefaultPasswords, &bIsDefaultPassword ); + + // insert valid password into media descriptor (but not a default password) + if( (aPassword.getLength() > 0) && !bIsDefaultPassword ) + rMediaDesc[ MediaDescriptor::PROP_PASSWORD() ] <<= aPassword; + + return aPassword; +} + +// ============================================================================ + +} // namespace comphelper + diff --git a/comphelper/source/misc/docpasswordrequest.cxx b/comphelper/source/misc/docpasswordrequest.cxx new file mode 100644 index 000000000000..187642e10fe9 --- /dev/null +++ b/comphelper/source/misc/docpasswordrequest.cxx @@ -0,0 +1,153 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: docpasswordrequest.cxx,v $ + * $Revision: 1.1 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_comphelper.hxx" + +#include "comphelper/docpasswordrequest.hxx" +#include +#include +#include +#include + +using ::rtl::OUString; +using ::com::sun::star::uno::Any; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::RuntimeException; +using ::com::sun::star::uno::Sequence; +using ::com::sun::star::uno::XInterface; +using ::com::sun::star::task::InteractionClassification_QUERY; +using ::com::sun::star::task::DocumentMSPasswordRequest; +using ::com::sun::star::task::DocumentPasswordRequest; +using ::com::sun::star::task::PasswordRequestMode; +using ::com::sun::star::task::XInteractionAbort; +using ::com::sun::star::task::XInteractionContinuation; +using ::com::sun::star::task::XInteractionPassword; + +namespace comphelper { + +// ============================================================================ + +class AbortContinuation : public ::cppu::WeakImplHelper1< XInteractionAbort > +{ +public: + inline explicit AbortContinuation() : mbSelected( false ) {} + + inline bool isSelected() const { return mbSelected; } + inline void reset() { mbSelected = false; } + + virtual void SAL_CALL select() throw( RuntimeException ) { mbSelected = true; } + +private: + bool mbSelected; +}; + +// ============================================================================ + +class PasswordContinuation : public ::cppu::WeakImplHelper1< XInteractionPassword > +{ +public: + inline explicit PasswordContinuation() : mbSelected( false ) {} + + inline bool isSelected() const { return mbSelected; } + inline void reset() { mbSelected = false; } + + virtual void SAL_CALL select() throw( RuntimeException ) { mbSelected = true; } + virtual void SAL_CALL setPassword( const OUString& rPass ) throw( RuntimeException ) { maPassword = rPass; } + virtual OUString SAL_CALL getPassword() throw( RuntimeException ) { return maPassword; } + +private: + OUString maPassword; + bool mbSelected; +}; + +// ============================================================================ + +DocPasswordRequest::DocPasswordRequest( DocPasswordRequestType eType, + PasswordRequestMode eMode, const OUString& rDocumentName ) +{ + switch( eType ) + { + case DocPasswordRequestType_STANDARD: + { + DocumentPasswordRequest aRequest( OUString(), Reference< XInterface >(), + InteractionClassification_QUERY, eMode, rDocumentName ); + maRequest <<= aRequest; + } + break; + case DocPasswordRequestType_MS: + { + DocumentMSPasswordRequest aRequest( OUString(), Reference< XInterface >(), + InteractionClassification_QUERY, eMode, rDocumentName ); + maRequest <<= aRequest; + } + break; + /* no 'default', so compilers will complain about missing + implementation of a new enum value. */ + } + + maContinuations.realloc( 2 ); + maContinuations[ 0 ].set( mpAbort = new AbortContinuation ); + maContinuations[ 1 ].set( mpPassword = new PasswordContinuation ); +} + +DocPasswordRequest::~DocPasswordRequest() +{ +} + +bool DocPasswordRequest::isAbort() const +{ + return mpAbort->isSelected(); +} + +bool DocPasswordRequest::isPassword() const +{ + return mpPassword->isSelected(); +} + +OUString DocPasswordRequest::getPassword() const +{ + return mpPassword->getPassword(); +} + +Any SAL_CALL DocPasswordRequest::getRequest() throw( RuntimeException ) +{ + return maRequest; +} + +Sequence< Reference< XInteractionContinuation > > SAL_CALL DocPasswordRequest::getContinuations() throw( RuntimeException ) +{ + return maContinuations; +} + +// ============================================================================ + +} // namespace comphelper + diff --git a/comphelper/source/misc/documentiologring.cxx b/comphelper/source/misc/documentiologring.cxx new file mode 100644 index 000000000000..8b999aaf4449 --- /dev/null +++ b/comphelper/source/misc/documentiologring.cxx @@ -0,0 +1,182 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: documentiologring.hxx,v $ + * $Revision: 1.0 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_comphelper.hxx" + +#include +#include + +#include + +#include "documentiologring.hxx" + +using namespace ::com::sun::star; + +namespace comphelper +{ + +// ---------------------------------------------------------- +OSimpleLogRing::OSimpleLogRing( const uno::Reference< uno::XComponentContext >& /*xContext*/ ) +: m_aMessages( SIMPLELOGRING_SIZE ) +, m_bInitialized( sal_False ) +, m_bFull( sal_False ) +, m_nPos( 0 ) +{ +} + +// ---------------------------------------------------------- +OSimpleLogRing::~OSimpleLogRing() +{ +} + +// ---------------------------------------------------------- +uno::Sequence< ::rtl::OUString > SAL_CALL OSimpleLogRing::getSupportedServiceNames_static() +{ + uno::Sequence< rtl::OUString > aResult( 1 ); + aResult[0] = getServiceName_static(); + return aResult; +} + +// ---------------------------------------------------------- +::rtl::OUString SAL_CALL OSimpleLogRing::getImplementationName_static() +{ + return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.logging.SimpleLogRing" ) ); +} + +// ---------------------------------------------------------- +::rtl::OUString SAL_CALL OSimpleLogRing::getSingletonName_static() +{ + return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.logging.DocumentIOLogRing" ) ); +} + +// ---------------------------------------------------------- +::rtl::OUString SAL_CALL OSimpleLogRing::getServiceName_static() +{ + return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.logging.SimpleLogRing" ) ); +} + +// ---------------------------------------------------------- +uno::Reference< uno::XInterface > SAL_CALL OSimpleLogRing::Create( const uno::Reference< uno::XComponentContext >& rxContext ) +{ + return static_cast< cppu::OWeakObject* >( new OSimpleLogRing( rxContext ) ); +} + +// XSimpleLogRing +// ---------------------------------------------------------- +void SAL_CALL OSimpleLogRing::logString( const ::rtl::OUString& aMessage ) throw (uno::RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + m_aMessages[m_nPos] = aMessage; + if ( ++m_nPos >= m_aMessages.getLength() ) + { + m_nPos = 0; + m_bFull = sal_True; + } + + // if used once then default initialized + m_bInitialized = sal_True; +} + +// ---------------------------------------------------------- +uno::Sequence< ::rtl::OUString > SAL_CALL OSimpleLogRing::getCollectedLog() throw (uno::RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + sal_Int32 nResLen = m_bFull ? m_aMessages.getLength() : m_nPos; + sal_Int32 nStart = m_bFull ? m_nPos : 0; + uno::Sequence< ::rtl::OUString > aResult( nResLen ); + + for ( sal_Int32 nInd = 0; nInd < nResLen; nInd++ ) + aResult[nInd] = m_aMessages[ ( nStart + nInd ) % m_aMessages.getLength() ]; + + // if used once then default initialized + m_bInitialized = sal_True; + + return aResult; +} + +// XInitialization +// ---------------------------------------------------------- +void SAL_CALL OSimpleLogRing::initialize( const uno::Sequence< uno::Any >& aArguments ) throw (uno::Exception, uno::RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + if ( m_bInitialized ) + throw frame::DoubleInitializationException(); + + if ( !m_refCount ) + throw uno::RuntimeException(); // the object must be refcounted already! + + sal_Int32 nLen = 0; + if ( aArguments.getLength() == 1 && ( aArguments[0] >>= nLen ) && nLen ) + m_aMessages.realloc( nLen ); + else + throw lang::IllegalArgumentException( + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Nonnull size is expected as the first argument!" ) ), + uno::Reference< uno::XInterface >(), + 0 ); + + m_bInitialized = sal_True; +} + +// XServiceInfo +// ---------------------------------------------------------- +::rtl::OUString SAL_CALL OSimpleLogRing::getImplementationName() throw (uno::RuntimeException) +{ + return getImplementationName_static(); +} + +// ---------------------------------------------------------- +::sal_Bool SAL_CALL OSimpleLogRing::supportsService( const ::rtl::OUString& aServiceName ) throw (uno::RuntimeException) +{ + const uno::Sequence< rtl::OUString > & aSupportedNames = getSupportedServiceNames_static(); + for ( sal_Int32 nInd = 0; nInd < aSupportedNames.getLength(); nInd++ ) + { + if ( aSupportedNames[ nInd ].equals( aServiceName ) ) + return sal_True; + } + + return sal_False; +} + +// ---------------------------------------------------------- +uno::Sequence< ::rtl::OUString > SAL_CALL OSimpleLogRing::getSupportedServiceNames() throw (uno::RuntimeException) +{ + return getSupportedServiceNames_static(); +} + +} // namespace comphelper + +void createRegistryInfo_OSimpleLogRing() +{ + static ::comphelper::module::OAutoRegistration< ::comphelper::OSimpleLogRing > aAutoRegistration; + static ::comphelper::module::OSingletonRegistration< ::comphelper::OSimpleLogRing > aSingletonRegistration; +} diff --git a/comphelper/source/misc/documentiologring.hxx b/comphelper/source/misc/documentiologring.hxx new file mode 100644 index 000000000000..b2b935c478af --- /dev/null +++ b/comphelper/source/misc/documentiologring.hxx @@ -0,0 +1,91 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: documentiologring.hxx,v $ + * $Revision: 1.0 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef __DOCUMENTIOLOGRING_HXX_ +#define __DOCUMENTIOLOGRING_HXX_ + +#include +#include +#include +#include + +#include +#include + +#define SIMPLELOGRING_SIZE 256 + +namespace comphelper +{ + +class OSimpleLogRing : public ::cppu::WeakImplHelper3< ::com::sun::star::logging::XSimpleLogRing, + ::com::sun::star::lang::XInitialization, + ::com::sun::star::lang::XServiceInfo > +{ + ::osl::Mutex m_aMutex; + ::com::sun::star::uno::Sequence< ::rtl::OUString > m_aMessages; + + sal_Bool m_bInitialized; + sal_Bool m_bFull; + sal_Int32 m_nPos; + +public: + OSimpleLogRing( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& xContext ); + virtual ~OSimpleLogRing(); + + static ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL + getSupportedServiceNames_static(); + + static ::rtl::OUString SAL_CALL getImplementationName_static(); + + static ::rtl::OUString SAL_CALL getSingletonName_static(); + + static ::rtl::OUString SAL_CALL getServiceName_static(); + + static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL + Create( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext ); + +// XSimpleLogRing + virtual void SAL_CALL logString( const ::rtl::OUString& aMessage ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getCollectedLog() throw (::com::sun::star::uno::RuntimeException); + +// XInitialization + virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); + +// XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException); + +}; + +} // namespace comphelper + +#endif + diff --git a/comphelper/source/misc/makefile.mk b/comphelper/source/misc/makefile.mk index 1d473e6c5365..d0ffc368fd20 100644 --- a/comphelper/source/misc/makefile.mk +++ b/comphelper/source/misc/makefile.mk @@ -57,7 +57,10 @@ SLOFILES= \ $(SLO)$/componentcontext.obj \ $(SLO)$/componentmodule.obj \ $(SLO)$/configurationhelper.obj \ + $(SLO)$/docpasswordhelper.obj \ + $(SLO)$/docpasswordrequest.obj \ $(SLO)$/documentinfo.obj \ + $(SLO)$/documentiologring.obj \ $(SLO)$/evtlistenerhlp.obj \ $(SLO)$/ihwrapnofilter.obj \ $(SLO)$/instancelocker.obj \ diff --git a/comphelper/source/misc/mediadescriptor.cxx b/comphelper/source/misc/mediadescriptor.cxx index da0dd71a5520..44578f840da9 100644 --- a/comphelper/source/misc/mediadescriptor.cxx +++ b/comphelper/source/misc/mediadescriptor.cxx @@ -114,6 +114,12 @@ namespace css = ::com::sun::star; /*----------------------------------------------- 10.03.2004 07:35 -----------------------------------------------*/ +const ::rtl::OUString& MediaDescriptor::PROP_ABORTED() +{ + static const ::rtl::OUString sProp(RTL_CONSTASCII_USTRINGPARAM("Aborted")); + return sProp; +} + const ::rtl::OUString& MediaDescriptor::PROP_ASTEMPLATE() { static const ::rtl::OUString sProp(RTL_CONSTASCII_USTRINGPARAM("AsTemplate")); @@ -126,6 +132,12 @@ const ::rtl::OUString& MediaDescriptor::PROP_CHARACTERSET() return sProp; } +const ::rtl::OUString& MediaDescriptor::PROP_COMPONENTDATA() +{ + static const ::rtl::OUString sProp(RTL_CONSTASCII_USTRINGPARAM("ComponentData")); + return sProp; +} + const ::rtl::OUString& MediaDescriptor::PROP_DEEPDETECTION() { static const ::rtl::OUString sProp(RTL_CONSTASCII_USTRINGPARAM("DeepDetection")); @@ -726,8 +738,13 @@ class StillReadWriteInteraction : public ::ucbhelper::InterceptedInteraction css::ucb::InteractiveIOException exIO; xRequest->getRequest() >>= exIO; bAbort = ( - (exIO.Code == css::ucb::IOErrorCode_ACCESS_DENIED ) || - (exIO.Code == css::ucb::IOErrorCode_LOCKING_VIOLATION ) + (exIO.Code == css::ucb::IOErrorCode_ACCESS_DENIED ) + || (exIO.Code == css::ucb::IOErrorCode_LOCKING_VIOLATION ) +#ifdef MACOSX + // this is a workaround for MAC, on this platform if the file is locked + // the returned error code looks to be wrong + || (exIO.Code == css::ucb::IOErrorCode_GENERAL ) +#endif ); } break; diff --git a/comphelper/source/misc/string.cxx b/comphelper/source/misc/string.cxx index 77a251372d85..e9437528b0de 100644 --- a/comphelper/source/misc/string.cxx +++ b/comphelper/source/misc/string.cxx @@ -36,10 +36,13 @@ #include #include -#include "comphelper/string.hxx" -#include "rtl/ustring.hxx" -#include "sal/types.h" -#include "comphelper/stlunosequence.hxx" +#include +#include +#include + +#include +#include +#include namespace comphelper { namespace string { @@ -96,12 +99,12 @@ rtl::OUString searchAndReplaceAsciiL( ::rtl::OUString convertCommaSeparated( ::com::sun::star::uno::Sequence< ::rtl::OUString > const& i_rSeq) { - ::rtl::OUString ret; - for (sal_Int32 i = 0; i < i_rSeq.getLength(); ++i) { - if (i != 0) ret += ::rtl::OUString::createFromAscii(", "); - ret += i_rSeq[i]; - } - return ret; + ::rtl::OUStringBuffer buf; + ::comphelper::intersperse( + ::comphelper::stl_begin(i_rSeq), ::comphelper::stl_end(i_rSeq), + ::comphelper::OUStringBufferAppender(buf), + ::rtl::OUString::createFromAscii(", ")); + return buf.makeStringAndClear(); } ::com::sun::star::uno::Sequence< ::rtl::OUString > @@ -119,10 +122,6 @@ rtl::OUString searchAndReplaceAsciiL( } while (idx >= 0); ::com::sun::star::uno::Sequence< ::rtl::OUString > kws(vec.size()); std::copy(vec.begin(), vec.end(), stl_begin(kws)); - /* - for (size_t i = 0; i < vec.size(); ++i) { - kws[i] = vec.at(i); - }*/ return kws; } diff --git a/comphelper/source/misc/types.cxx b/comphelper/source/misc/types.cxx index 2b20fd9acca3..2a9180c038b0 100644 --- a/comphelper/source/misc/types.cxx +++ b/comphelper/source/misc/types.cxx @@ -87,8 +87,7 @@ sal_Bool operator ==(const Time& _rLeft, const Time& _rRight) sal_Int32 getINT32(const Any& _rAny) { sal_Int32 nReturn = 0; - _rAny >>= nReturn; - + OSL_VERIFY( _rAny >>= nReturn ); return nReturn; } @@ -96,7 +95,7 @@ sal_Int32 getINT32(const Any& _rAny) sal_Int16 getINT16(const Any& _rAny) { sal_Int16 nReturn = 0; - _rAny >>= nReturn; + OSL_VERIFY( _rAny >>= nReturn ); return nReturn; } @@ -104,7 +103,7 @@ sal_Int16 getINT16(const Any& _rAny) double getDouble(const Any& _rAny) { double nReturn = 0.0; - _rAny >>= nReturn; + OSL_VERIFY( _rAny >>= nReturn ); return nReturn; } @@ -112,7 +111,7 @@ double getDouble(const Any& _rAny) float getFloat(const Any& _rAny) { float nReturn = 0.0; - _rAny >>= nReturn; + OSL_VERIFY( _rAny >>= nReturn ); return nReturn; } @@ -120,7 +119,7 @@ float getFloat(const Any& _rAny) ::rtl::OUString getString(const Any& _rAny) { ::rtl::OUString nReturn; - _rAny >>= nReturn; + OSL_VERIFY( _rAny >>= nReturn ); return nReturn; } diff --git a/comphelper/source/misc/uieventslogger.cxx b/comphelper/source/misc/uieventslogger.cxx index 3ff875a4e67d..b88abff17f4a 100644 --- a/comphelper/source/misc/uieventslogger.cxx +++ b/comphelper/source/misc/uieventslogger.cxx @@ -218,11 +218,15 @@ namespace comphelper // public UiEventsLogger interface sal_Bool UiEventsLogger::isEnabled() { - try { - UiEventsLogger_Impl::prepareMutex(); - Guard singleton_guard(UiEventsLogger_Impl::singleton_mutex); - return UiEventsLogger_Impl::getInstance()->m_Active; - } catch(...) { return false; } // never throws + if ( UiEventsLogger_Impl::getEnabledFromCfg() ) + { + try { + UiEventsLogger_Impl::prepareMutex(); + Guard singleton_guard(UiEventsLogger_Impl::singleton_mutex); + return UiEventsLogger_Impl::getInstance()->m_Active; + } catch(...) { return false; } // never throws + } // if ( ) + return sal_False; } sal_Int32 UiEventsLogger::getSessionLogEventCount() @@ -375,9 +379,20 @@ namespace comphelper } else logdata[2] = UNKNOWN_ORIGIN; - logdata[3] = url.Complete; if(url.Complete.match(URL_FILE)) logdata[3] = URL_FILE; + else + logdata[3] = url.Main; + OSL_TRACE("UiEventsLogger Logging: %s,%s,%s,%s,%s,%s,%s,%s", + OUStringToOString(logdata[0],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[1],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[2],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[3],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[4],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[5],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[6],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[7],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[8],RTL_TEXTENCODING_UTF8).getStr()); m_Logger->log(LogLevel::INFO, m_Formatter->formatMultiColumn(logdata)); m_SessionLogEventCount++; } @@ -386,6 +401,16 @@ namespace comphelper { Sequence logdata = Sequence(COLUMNS); logdata[0] = ETYPE_ROTATED; + OSL_TRACE("UiEventsLogger Logging: %s,%s,%s,%s,%s,%s,%s,%s", + OUStringToOString(logdata[0],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[1],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[2],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[3],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[4],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[5],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[6],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[7],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[8],RTL_TEXTENCODING_UTF8).getStr()); m_Logger->log(LogLevel::INFO, m_Formatter->formatMultiColumn(logdata)); } @@ -407,6 +432,16 @@ namespace comphelper logdata[6] = id; logdata[7] = method; logdata[8] = param; + OSL_TRACE("UiEventsLogger Logging: %s,%s,%s,%s,%s,%s,%s,%s", + OUStringToOString(logdata[0],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[1],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[2],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[3],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[4],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[5],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[6],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[7],RTL_TEXTENCODING_UTF8).getStr(), + OUStringToOString(logdata[8],RTL_TEXTENCODING_UTF8).getStr()); m_Logger->log(LogLevel::INFO, m_Formatter->formatMultiColumn(logdata)); m_SessionLogEventCount++; } diff --git a/comphelper/source/processfactory/processfactory.cxx b/comphelper/source/processfactory/processfactory.cxx index 0f50f4a4cb01..c4eac583e3c0 100644 --- a/comphelper/source/processfactory/processfactory.cxx +++ b/comphelper/source/processfactory/processfactory.cxx @@ -98,24 +98,30 @@ Reference< XInterface > createProcessComponentWithArguments( const ::rtl::OUStri return xComponent; } -} // namesapce comphelper - -extern "C" { -uno::XComponentContext * comphelper_getProcessComponentContext() +Reference< XComponentContext > getProcessComponentContext() { - uno::Reference xRet; + Reference< XComponentContext > xRet; uno::Reference const xProps( comphelper::getProcessServiceFactory(), uno::UNO_QUERY ); if (xProps.is()) { try { - xRet.set( xProps->getPropertyValue( - rtl::OUString( + xRet.set( xProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DefaultContext") ) ), uno::UNO_QUERY ); } catch (beans::UnknownPropertyException const&) { } } + return xRet; +} + +} // namespace comphelper + +extern "C" { +uno::XComponentContext * comphelper_getProcessComponentContext() +{ + uno::Reference xRet; + xRet = ::comphelper::getProcessComponentContext(); if (xRet.is()) xRet->acquire(); return xRet.get(); diff --git a/comphelper/source/property/ChainablePropertySetInfo.cxx b/comphelper/source/property/ChainablePropertySetInfo.cxx index b27cef88319c..c5d134eb9982 100644 --- a/comphelper/source/property/ChainablePropertySetInfo.cxx +++ b/comphelper/source/property/ChainablePropertySetInfo.cxx @@ -76,7 +76,7 @@ void ChainablePropertySetInfo::add( PropertyInfo* pMap, sal_Int32 nCount ) { OUString aName( pMap->mpName, pMap->mnNameLen, RTL_TEXTENCODING_ASCII_US ); -#ifndef PRODUCT +#ifdef DBG_UTIL PropertyInfoHash::iterator aIter = maMap.find( aName ); if( aIter != maMap.end() ) OSL_ENSURE( sal_False, "Warning: PropertyInfo added twice, possible error!"); diff --git a/comphelper/source/property/MasterPropertySetInfo.cxx b/comphelper/source/property/MasterPropertySetInfo.cxx index e74d21b2d755..91a9a17856d4 100644 --- a/comphelper/source/property/MasterPropertySetInfo.cxx +++ b/comphelper/source/property/MasterPropertySetInfo.cxx @@ -84,7 +84,7 @@ void MasterPropertySetInfo::add( PropertyInfo* pMap, sal_Int32 nCount, sal_uInt8 { OUString aName( pMap->mpName, pMap->mnNameLen, RTL_TEXTENCODING_ASCII_US ); -#ifndef PRODUCT +#ifdef DBG_UTIL PropertyDataHash::iterator aIter = maMap.find( aName ); if( aIter != maMap.end() ) OSL_ENSURE( sal_False, "Warning: PropertyInfo added twice, possible error!"); @@ -102,7 +102,7 @@ void MasterPropertySetInfo::add( PropertyInfoHash &rHash, sal_uInt8 nMapId ) while ( aIter != aEnd ) { -#ifndef PRODUCT +#ifdef DBG_UTIL PropertyDataHash::iterator aDebugIter = maMap.find( (*aIter).first ); if( aDebugIter != maMap.end() ) OSL_ENSURE( sal_False, "Warning: PropertyInfo added twice, possible error!"); diff --git a/comphelper/source/property/genericpropertyset.cxx b/comphelper/source/property/genericpropertyset.cxx index 08dd26dcf0ec..19911709860d 100644 --- a/comphelper/source/property/genericpropertyset.cxx +++ b/comphelper/source/property/genericpropertyset.cxx @@ -180,8 +180,7 @@ void GenericPropertySet::_setPropertyValues( const PropertyMapEntry** ppEntries, aEvt.PropertyName = aPropertyName; aEvt.NewValue = *pValues; aGuard.clear(); - pHelper->forEach( - ::boost::bind(&XPropertyChangeListener::propertyChange,_1,boost::cref(aEvt))); + pHelper->notifyEach( &XPropertyChangeListener::propertyChange, aEvt ); aGuard.reset(); } diff --git a/comphelper/source/property/propertybag.cxx b/comphelper/source/property/propertybag.cxx index a56793e05769..383e1cc2c5aa 100644 --- a/comphelper/source/property/propertybag.cxx +++ b/comphelper/source/property/propertybag.cxx @@ -168,10 +168,11 @@ namespace comphelper // will throw an UnknownPropertyException if necessary if ( ( rProp.Attributes & PropertyAttribute::REMOVEABLE ) == 0 ) throw NotRemoveableException( ::rtl::OUString(), NULL ); + const sal_Int32 nHandle = rProp.Handle; - revokeProperty( rProp.Handle ); + revokeProperty( nHandle ); - m_pImpl->aDefaults.erase( rProp.Handle ); + m_pImpl->aDefaults.erase( nHandle ); } //-------------------------------------------------------------------- diff --git a/comphelper/source/property/propertycontainerhelper.cxx b/comphelper/source/property/propertycontainerhelper.cxx index 9d1662d1ecf2..7f5db1d6cf7e 100644 --- a/comphelper/source/property/propertycontainerhelper.cxx +++ b/comphelper/source/property/propertycontainerhelper.cxx @@ -76,12 +76,12 @@ namespace // comparing two property descriptions (by name) struct PropertyDescriptionNameMatch : public ::std::unary_function< PropertyDescription, bool > { - const ::rtl::OUString& m_rCompare; + ::rtl::OUString m_rCompare; PropertyDescriptionNameMatch( const ::rtl::OUString& _rCompare ) : m_rCompare( _rCompare ) { } bool operator() (const PropertyDescription& x ) const { - return x.aProperty.Name == m_rCompare; + return x.aProperty.Name.equals(m_rCompare); } }; } diff --git a/comphelper/source/property/propertysetinfo.cxx b/comphelper/source/property/propertysetinfo.cxx index e155d695e2c9..83b769553331 100644 --- a/comphelper/source/property/propertysetinfo.cxx +++ b/comphelper/source/property/propertysetinfo.cxx @@ -82,7 +82,7 @@ void PropertyMapImpl::add( PropertyMapEntry* pMap, sal_Int32 nCount ) throw() { OUString aName( pMap->mpName, pMap->mnNameLen, RTL_TEXTENCODING_ASCII_US ); -#ifndef PRODUCT +#ifdef DBG_UTIL PropertyMap::iterator aIter = maPropertyMap.find( aName ); if( aIter != maPropertyMap.end() ) { diff --git a/comphelper/source/streaming/memorystream.cxx b/comphelper/source/streaming/memorystream.cxx index 3afd9b555a84..a2baef21010e 100644 --- a/comphelper/source/streaming/memorystream.cxx +++ b/comphelper/source/streaming/memorystream.cxx @@ -35,15 +35,16 @@ #include #include +#include #include -#include +#include #include #include using ::rtl::OUString; using ::cppu::OWeakObject; -using ::cppu::WeakImplHelper3; +using ::cppu::WeakImplHelper4; using namespace ::com::sun::star::io; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; @@ -52,7 +53,7 @@ using namespace ::osl; namespace comphelper { -class UNOMemoryStream : public WeakImplHelper3 < XStream, XSeekableInputStream, XOutputStream > +class UNOMemoryStream : public WeakImplHelper4 < XStream, XSeekableInputStream, XOutputStream, XTruncate > { public: UNOMemoryStream(); @@ -79,6 +80,9 @@ public: virtual void SAL_CALL flush() throw (NotConnectedException, BufferSizeExceededException, IOException, RuntimeException); virtual void SAL_CALL closeOutput() throw (NotConnectedException, BufferSizeExceededException, IOException, RuntimeException); + // XTruncate + virtual void SAL_CALL truncate() throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException); + // XServiceInfo - static versions (used for component registration) static ::rtl::OUString SAL_CALL getImplementationName_static(); static Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames_static(); @@ -116,8 +120,7 @@ sal_Int32 SAL_CALL UNOMemoryStream::readBytes( Sequence< sal_Int8 >& aData, sal_ throw IOException(); nBytesToRead = std::min( nBytesToRead, available() ); - if( aData.getLength() < nBytesToRead ) - aData.realloc( nBytesToRead ); + aData.realloc( nBytesToRead ); if( nBytesToRead ) { @@ -157,9 +160,16 @@ void SAL_CALL UNOMemoryStream::closeInput() throw (NotConnectedException, IOExce // XSeekable void SAL_CALL UNOMemoryStream::seek( sal_Int64 location ) throw (IllegalArgumentException, IOException, RuntimeException) { - if( (location < 0) || (location > SAL_MAX_INT32) || (location > static_cast< sal_Int64 >( maData.size() )) ) + if( (location < 0) || (location > SAL_MAX_INT32) ) throw IllegalArgumentException( OUString(RTL_CONSTASCII_USTRINGPARAM("this implementation does not support more than 2GB!")), Reference< XInterface >(static_cast(this)), 0 ); + // seek operation should be able to resize the stream + if ( location > static_cast< sal_Int64 >( maData.size() ) ) + maData.resize( static_cast< sal_Int32 >( location ) ); + + if ( location > static_cast< sal_Int64 >( maData.size() ) ) + maData.resize( static_cast< sal_Int32 >( location ) ); + mnCursor = static_cast< sal_Int32 >( location ); } @@ -206,6 +216,13 @@ void SAL_CALL UNOMemoryStream::closeOutput() throw (NotConnectedException, Buffe mnCursor = 0; } +//XTruncate +void SAL_CALL UNOMemoryStream::truncate() throw (IOException, RuntimeException) +{ + maData.resize( 0 ); + mnCursor = 0; +} + ::rtl::OUString SAL_CALL UNOMemoryStream::getImplementationName_static() { static const OUString sImplName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.MemoryStream" ) ); diff --git a/cppcanvas/source/mtfrenderer/implrenderer.cxx b/cppcanvas/source/mtfrenderer/implrenderer.cxx index 6269cfb11ef4..c6f9a295b332 100644 --- a/cppcanvas/source/mtfrenderer/implrenderer.cxx +++ b/cppcanvas/source/mtfrenderer/implrenderer.cxx @@ -83,6 +83,7 @@ #include #include #include +#include #include #include @@ -956,6 +957,9 @@ namespace cppcanvas rParms.mrParms.maFontLetterForm.getValue() : (rFont.GetItalic() == ITALIC_NONE) ? 0 : 9; + LanguageType aLang = rFont.GetLanguage(); + aFontRequest.Locale = MsLangId::convertLanguageToLocale(aLang, false); + // setup state-local text transformation, // if the font be rotated const short nFontAngle( rFont.GetOrientation() ); diff --git a/cppcanvas/util/makefile.mk b/cppcanvas/util/makefile.mk index a5ac026e262c..4d0ff2a8dc55 100644 --- a/cppcanvas/util/makefile.mk +++ b/cppcanvas/util/makefile.mk @@ -50,7 +50,7 @@ LIB1FILES=\ SHL1TARGET= $(TARGET)$(DLLPOSTFIX) SHL1IMPLIB= i$(TARGET) -SHL1STDLIBS= $(TOOLSLIB) $(CPPULIB) $(SALLIB) $(VCLLIB) $(COMPHELPERLIB) $(CANVASTOOLSLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) +SHL1STDLIBS= $(TOOLSLIB) $(CPPULIB) $(SALLIB) $(VCLLIB) $(COMPHELPERLIB) $(CANVASTOOLSLIB) $(CPPUHELPERLIB) $(BASEGFXLIB) $(I18NISOLANGLIB) .IF "$(debug)$(dbgutil)"!="" SHL1STDLIBS += $(CPPUHELPERLIB) diff --git a/dtrans/prj/build.lst b/dtrans/prj/build.lst index 95d697d6ebd3..bd9c73582361 100644 --- a/dtrans/prj/build.lst +++ b/dtrans/prj/build.lst @@ -10,8 +10,6 @@ dr dtrans\source\win32\dnd nmake - w dr_win32_dnd dr_cnttype dr_win32_misc.w dr dtrans\source\win32\dtobj nmake - w dr_win32_dtobj dr_win32_clipb.w dr_win32_misc.w dr_win32_ftransl.w dr_inc NULL dr dtrans\source\os2\clipb nmake - p dr_os2_clipb dr_inc NULL dr dtrans\util nmake - all dr_util dr_cnttype dr_win32_misc.w dr_win32_mtaole.w dr_win32_ftransl.w dr_win32_clipb.w dr_win32_dnd.w dr_win32_dtobj.w dr_inc NULL -dr dtrans\source\X11 nmake - u dr_X11 dr_inc NULL -dr dtrans\source\aqua nmake - u dr_aqua dr_inc NULL dr dtrans\source\generic nmake - all dr_generic dr_inc NULL diff --git a/dtrans/prj/d.lst b/dtrans/prj/d.lst index bfa7e3b86d6d..a1a7c2e95480 100644 --- a/dtrans/prj/d.lst +++ b/dtrans/prj/d.lst @@ -5,6 +5,5 @@ ..\source\win32\clipb\sysdtrans.xml %_DEST%\xml%_EXT%\sysdtrans.xml ..\source\win32\dnd\dnd.xml %_DEST%\xml%_EXT%\dnd.xml ..\source\win32\ftransl\ftransl.xml %_DEST%\xml%_EXT%\ftransl.xml -..\source\X11\dtransX11.xml %_DEST%\xml%_EXT%\dtransX11.xml ..\source\cnttype\mcnttype.xml %_DEST%\xml%_EXT%\mcnttype.xml ..\source\generic\dtrans.xml %_DEST%\xml%_EXT%\dtrans.xml diff --git a/dtrans/source/X11/X11_service.cxx b/dtrans/source/X11/X11_service.cxx deleted file mode 100644 index b288d74a0513..000000000000 --- a/dtrans/source/X11/X11_service.cxx +++ /dev/null @@ -1,303 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: X11_service.cxx,v $ - * $Revision: 1.11 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" - -#include -#include -#include -#include -#include // declaration of generic uno interface -#include // mapping stuff -#include -#include - -using namespace rtl; -using namespace cppu; -using namespace com::sun::star::lang; -using namespace com::sun::star::datatransfer::clipboard; -using namespace com::sun::star::awt; -using namespace x11; - -namespace x11 { - -class X11ClipboardFactory : public ::cppu::WeakComponentImplHelper1 < - ::com::sun::star::lang::XSingleServiceFactory -> -{ - ::osl::Mutex m_aMutex; - ::std::hash_map< OUString, ::std::hash_map< Atom, Reference< XClipboard > >, ::rtl::OUStringHash > m_aInstances; -public: - X11ClipboardFactory(); - virtual ~X11ClipboardFactory(); - - /* - * XSingleServiceFactory - */ - virtual Reference< XInterface > createInstance() throw(); - virtual Reference< XInterface > createInstanceWithArguments( const Sequence< Any >& rArgs ) throw(); -}; - -// ------------------------------------------------------------------------ - -X11ClipboardFactory::X11ClipboardFactory() : - ::cppu::WeakComponentImplHelper1< - ::com::sun::star::lang::XSingleServiceFactory ->( m_aMutex ) -{ -} - -// ------------------------------------------------------------------------ - -X11ClipboardFactory::~X11ClipboardFactory() -{ -} - -// ------------------------------------------------------------------------ - -Reference< XInterface > X11ClipboardFactory::createInstance() throw() -{ - return createInstanceWithArguments( Sequence< Any >() ); -} - -// ------------------------------------------------------------------------ - -Reference< XInterface > X11ClipboardFactory::createInstanceWithArguments( const Sequence< Any >& arguments ) throw() -{ - OUString aDisplayName; - Atom nSelection; - - // extract display name from connection argument. An exception is thrown - // by SelectionManager.initialize() if no display connection is given. - if( arguments.getLength() > 0 ) - { - Reference< XDisplayConnection > xConn; - arguments.getConstArray()[0] >>= xConn; - - if( xConn.is() ) - { - Any aIdentifier = xConn->getIdentifier(); - aIdentifier >>= aDisplayName; - } - } - - SelectionManager& rManager = SelectionManager::get( aDisplayName ); - rManager.initialize( arguments ); - - // check if any other selection than clipboard selection is specified - if( arguments.getLength() > 1 ) - { - OUString aSelectionName; - - arguments.getConstArray()[1] >>= aSelectionName; - nSelection = rManager.getAtom( aSelectionName ); - } - else - { - // default atom is clipboard selection - nSelection = rManager.getAtom( OUString::createFromAscii( "CLIPBOARD" ) ); - } - - ::std::hash_map< Atom, Reference< XClipboard > >& rMap( m_aInstances[ aDisplayName ] ); - ::std::hash_map< Atom, Reference< XClipboard > >::iterator it = rMap.find( nSelection ); - if( it != rMap.end() ) - return it->second; - - X11Clipboard* pClipboard = new X11Clipboard( rManager, nSelection ); - rMap[ nSelection ] = pClipboard; - - return static_cast(pClipboard); -} - -// ------------------------------------------------------------------------ - -Sequence< OUString > SAL_CALL X11Clipboard_getSupportedServiceNames() -{ - Sequence< OUString > aRet(1); - aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.clipboard.SystemClipboard"); - return aRet; -} - -// ------------------------------------------------------------------------ - -Sequence< OUString > SAL_CALL Xdnd_getSupportedServiceNames() -{ - Sequence< OUString > aRet(1); - aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.dnd.X11DragSource"); - return aRet; -} - -// ------------------------------------------------------------------------ - -Reference< XInterface > SAL_CALL Xdnd_createInstance( - const Reference< XMultiServiceFactory > & ) -{ - return Reference < XInterface >( ( OWeakObject * ) new SelectionManagerHolder() ); -} - -// ------------------------------------------------------------------------ - -Sequence< OUString > SAL_CALL Xdnd_dropTarget_getSupportedServiceNames() -{ - Sequence< OUString > aRet(1); - aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.dnd.X11DropTarget"); - return aRet; -} - -// ------------------------------------------------------------------------ - -Reference< XInterface > SAL_CALL Xdnd_dropTarget_createInstance( - const Reference< XMultiServiceFactory > & ) -{ - return Reference < XInterface >( ( OWeakObject * ) new DropTarget() ); -} - -} - -static const OUString& getClipboardImplementationName() -{ - static OUString aImpl = OUString::createFromAscii(X11_CLIPBOARD_IMPLEMENTATION_NAME); - return aImpl; -} - -static const OUString& getClipboardServiceName() -{ - static OUString aImpl = OUString::createFromAscii("com.sun.star.datatransfer.clipboard.SystemClipboard" ); - return aImpl; -} - -static const OUString& getXdndImplementationName() -{ - static OUString aImpl = OUString::createFromAscii(XDND_IMPLEMENTATION_NAME ); - return aImpl; -} - -static const OUString& getXdndServiceName() -{ - static OUString aImpl = OUString::createFromAscii("com.sun.star.datatransfer.dnd.X11DragSource" ); - return aImpl; -} - -static const OUString& getXdndDropTargetImplementationName() -{ - static OUString aImpl = OUString::createFromAscii(XDND_DROPTARGET_IMPLEMENTATION_NAME); - return aImpl; -} - -static const OUString& getXdndDropTargetServiceName() -{ - static OUString aImpl = OUString::createFromAscii("com.sun.star.datatransfer.dnd.X11DropTarget" ); - return aImpl; -} - -extern "C" { - void SAL_CALL component_getImplementationEnvironment( - const sal_Char** ppEnvTypeName, - uno_Environment** ) - { - *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; - } - - sal_Bool SAL_CALL component_writeInfo( void*, void* pXUnoKey ) - { - if( pXUnoKey ) - { - try - { - Reference< ::com::sun::star::registry::XRegistryKey > xKey( reinterpret_cast< ::com::sun::star::registry::XRegistryKey* >( pXUnoKey ) ); - - OUString aImplName = OUString::createFromAscii( "/" ); - aImplName += getClipboardImplementationName(); - aImplName += ::rtl::OUString::createFromAscii( "/UNO/SERVICES/" ); - aImplName += getClipboardServiceName(); - xKey->createKey( aImplName ); - - aImplName = OUString::createFromAscii( "/" ); - aImplName += getXdndImplementationName(); - aImplName += ::rtl::OUString::createFromAscii( "/UNO/SERVICES/" ); - aImplName += getXdndServiceName(); - xKey->createKey( aImplName ); - - aImplName = OUString::createFromAscii( "/" ); - aImplName += getXdndDropTargetImplementationName(); - aImplName += ::rtl::OUString::createFromAscii( "/UNO/SERVICES/" ); - aImplName += getXdndDropTargetServiceName(); - xKey->createKey( aImplName ); - - return sal_True; - } - catch( ::com::sun::star::registry::InvalidRegistryException& ) - { - } - } - return sal_False; - } - - void* SAL_CALL component_getFactory( - const sal_Char* pImplementationName, - void* pXUnoSMgr, - void* - ) - { - void* pRet = 0; - - ::rtl::OUString aImplName( ::rtl::OUString::createFromAscii( pImplementationName ) ); - - if( pXUnoSMgr ) - { - Reference< ::com::sun::star::lang::XMultiServiceFactory > xMgr( - reinterpret_cast< ::com::sun::star::lang::XMultiServiceFactory* >( pXUnoSMgr ) - ); - Reference< ::com::sun::star::lang::XSingleServiceFactory > xFactory; - if( aImplName.equals( getClipboardImplementationName() ) ) - xFactory = new X11ClipboardFactory(); - else if( aImplName.equals( getXdndImplementationName() ) ) - { - xFactory = ::cppu::createSingleFactory( - xMgr, aImplName, Xdnd_createInstance, - Xdnd_getSupportedServiceNames() ); - } - else if( aImplName.equals( getXdndDropTargetImplementationName() ) ) - { - xFactory = ::cppu::createSingleFactory( - xMgr, aImplName, Xdnd_dropTarget_createInstance, - Xdnd_dropTarget_getSupportedServiceNames() ); - } - if( xFactory.is() ) - { - xFactory->acquire(); - pRet = xFactory.get(); - } - } - return pRet; - } - -} /* extern "C" */ diff --git a/dtrans/source/X11/dtransX11.xml b/dtrans/source/X11/dtransX11.xml deleted file mode 100644 index 77994d5287b5..000000000000 --- a/dtrans/source/X11/dtransX11.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - dtransX11 - - Tino Rachui - com.sun.star.comp.datatransfer.X11 - - The X11 implementation of the datatransfer service. - - com.sun.star.loader.SharedLibrary - c++ - - com.sun.star.datatransfer.clipboard.SystemClipboard - com.sun.star.datatransfer.dnd.X11DragSource - com.sun.star.datatransfer.dnd.X11DropTarget - ... - com.sun.star.datatransfer.clipboard.XClipboardEx - com.sun.star.datatransfer.XTransferable - com.sun.star.datatransfer.clipboard.RenderingCapabilities - com.sun.star.datatransfer.clipboard.XClipboardOwner - com.sun.star.datatransfer.clipboard.XClipboardListener - com.sun.star.datatransfer.clipboard.XClipboardNotifier - com.sun.star.datatransfer.dnd.XDropTargetDropContext - com.sun.star.datatransfer.dnd.XDropTargetDragContext - com.sun.star.datatransfer.dnd.XDropTarget - com.sun.star.datatransfer.dnd.DNDConstants - com.sun.star.datatransfer.dnd.XDragSource - com.sun.star.datatransfer.dnd.XDragSourceContext - com.sun.star.awt.XDisplayConnection - com.sun.star.lang.DisposedException - com.sun.star.lang.IllegalArgumentException - com.sun.star.lang.XComponent - com.sun.star.lang.XMultiServiceFactory - com.sun.star.lang.XSingleServiceFactory - com.sun.star.lang.XServiceInfo - com.sun.star.lang.XTypeProvider - com.sun.star.uno.TypeClass - com.sun.star.uno.XWeak - com.sun.star.uno.XAggregation - com.sun.star.registry.XRegistryKey - com.sun.star.container.XSet - - cppuhelper - cppu - sal - cppuhelper - cppu2 - sal2 - diff --git a/dtrans/source/X11/exports.map b/dtrans/source/X11/exports.map deleted file mode 100644 index 7c56baa9bd73..000000000000 --- a/dtrans/source/X11/exports.map +++ /dev/null @@ -1,10 +0,0 @@ -UDK_3_0_0 { - global: - GetVersionInfo; - component_getImplementationEnvironment; - component_getFactory; - component_writeInfo; - - local: - *; -}; diff --git a/dtrans/source/aqua/dtransaqua.xml b/dtrans/source/aqua/dtransaqua.xml deleted file mode 100644 index 2a901134bf19..000000000000 --- a/dtrans/source/aqua/dtransaqua.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - dtransaqua - - Tino Rachui - com.sun.star.comp.datatransfer.aqua - - The aqua implementation of the datatransfer service. - - com.sun.star.loader.SharedLibrary - c++ - - com.sun.star.datatransfer.clipboard.SystemClipboard - ... - com.sun.star.datatransfer.clipboard.XClipboardEx - com.sun.star.datatransfer.XTransferable - com.sun.star.datatransfer.clipboard.RenderingCapabilities - com.sun.star.datatransfer.clipboard.XClipboardOwner - com.sun.star.datatransfer.clipboard.XClipboardListener - com.sun.star.datatransfer.clipboard.XClipboardNotifier - com.sun.star.datatransfer.dnd.XDropTargetDropContext - com.sun.star.datatransfer.dnd.XDropTargetDragContext - com.sun.star.datatransfer.dnd.XDropTarget - com.sun.star.datatransfer.dnd.DNDConstants - com.sun.star.datatransfer.dnd.XDragSource - com.sun.star.datatransfer.dnd.XDragSourceContext - com.sun.star.lang.DisposedException - com.sun.star.lang.IllegalArgumentException - com.sun.star.lang.XComponent - com.sun.star.lang.XMultiServiceFactory - com.sun.star.lang.XSingleServiceFactory - com.sun.star.lang.XServiceInfo - com.sun.star.lang.XTypeProvider - com.sun.star.uno.TypeClass - com.sun.star.uno.XWeak - com.sun.star.uno.XAggregation - com.sun.star.registry.XRegistryKey - com.sun.star.container.XSet - - cppuhelper - cppu - sal - cppuhelper - cppu2 - sal2 - diff --git a/dtrans/source/aqua/service_entry.cxx b/dtrans/source/aqua/service_entry.cxx deleted file mode 100644 index 66f133e74dbe..000000000000 --- a/dtrans/source/aqua/service_entry.cxx +++ /dev/null @@ -1,210 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: service_entry.cxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" - -#include "DragSource.hxx" -#include "DropTarget.hxx" -#include "aqua_clipboard.hxx" -#include -#include -#include -#include - -#include "cppuhelper/implementationentry.hxx" - -using namespace ::osl; -using namespace ::rtl; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::registry; -using namespace ::cppu; -using namespace ::com::sun::star::lang; -using namespace ::com::sun::star::datatransfer::clipboard; - - -rtl_StandardModuleCount g_moduleCount = MODULE_COUNT_INIT; - - -extern rtl::OUString dragSource_getImplementationName(); -extern com::sun::star::uno::Sequence dragSource_getSupportedServiceNames(); -extern rtl::OUString dropTarget_getImplementationName(); -extern com::sun::star::uno::Sequence dropTarget_getSupportedServiceNames(); -extern rtl::OUString clipboard_getImplementationName(); -extern com::sun::star::uno::Sequence clipboard_getSupportedServiceNames(); - - -Reference SAL_CALL createDragSource(const Reference& rComponentContext); -Reference SAL_CALL createDropTarget(const Reference& rComponentContext); -Reference SAL_CALL createClipboard(const Reference& rComponentContext); - - -cppu::ImplementationEntry entries[] = { - { createDragSource, - dragSource_getImplementationName, - dragSource_getSupportedServiceNames, - cppu::createSingleComponentFactory, 0, 0 }, - { createDropTarget, - dropTarget_getImplementationName, - dropTarget_getSupportedServiceNames, - cppu::createSingleComponentFactory, 0, 0 }, - { createClipboard, - clipboard_getImplementationName, - clipboard_getSupportedServiceNames, - cppu::createSingleComponentFactory, 0, 0 }, - { 0, 0, 0, 0, 0, 0 } -}; - - -class AquaClipboardFactory : public WeakComponentImplHelper1 -{ -public: - AquaClipboardFactory(); - virtual ~AquaClipboardFactory(); - - /* - * XSingleComponentFactory - */ - virtual Reference createInstanceWithContext(const Reference& Context) - throw (Exception); - - virtual Reference createInstanceWithArgumentsAndContext(const Sequence& rArgs, - const Reference& Context) - throw(Exception); - - private: - static Mutex m_aMutex; - static Reference mSingleInstance; -}; - -Reference AquaClipboardFactory::mSingleInstance; -Mutex AquaClipboardFactory::m_aMutex; - -// ------------------------------------------------------------------------ - -AquaClipboardFactory::AquaClipboardFactory() : - WeakComponentImplHelper1(m_aMutex) -{ -} - -// ------------------------------------------------------------------------ - -AquaClipboardFactory::~AquaClipboardFactory() -{ -} - -// ------------------------------------------------------------------------ - -Reference AquaClipboardFactory::createInstanceWithContext(const Reference& Context) throw(Exception) -{ - return createInstanceWithArgumentsAndContext(Sequence(), Context); -} - -// ------------------------------------------------------------------------ - -Reference< XInterface > AquaClipboardFactory::createInstanceWithArgumentsAndContext(const Sequence& arguments, - const Reference& Context) throw(Exception) -{ - MutexGuard aGuard(m_aMutex); - - if (!mSingleInstance.is()) - { - AquaClipboardFactory::mSingleInstance = createClipboard(Context); - } - - return AquaClipboardFactory::mSingleInstance; -} - - -Reference SAL_CALL createDragSource( const Reference< XComponentContext >& rComponentContext) -{ - return Reference(static_cast< XInitialization* >(new DragSource(rComponentContext)), UNO_QUERY); -} - -Reference SAL_CALL createDropTarget( const Reference< XComponentContext >& rComponentContext) -{ - return Reference(static_cast< XInitialization* >(new DropTarget(rComponentContext)), UNO_QUERY); -} - -Reference< XInterface > SAL_CALL createClipboard( const Reference< XComponentContext >& rComponentContext) -{ - return Reference(static_cast< XClipboard* >(new AquaClipboard(rComponentContext)), UNO_QUERY); -} - - -extern "C" sal_Bool SAL_CALL component_writeInfo( - void * serviceManager, void * registryKey) -{ - return cppu::component_writeInfoHelper( - serviceManager, registryKey, entries); -} - - -extern "C" void * SAL_CALL component_getFactory( - char const * implName, void * serviceManager, void * registryKey) -{ - void* pRet = NULL; - OUString iName = OUString::createFromAscii(implName); - Reference xFac; - - if (iName.equalsIgnoreAsciiCase(clipboard_getImplementationName())) - { - xFac = new AquaClipboardFactory(); - } - else - { - return component_getFactoryHelper(implName, - serviceManager, - registryKey, - entries); - } - - if (xFac.is()) - { - xFac->acquire(); - pRet = xFac.get(); - } - - return pRet; -} - - -extern "C" void SAL_CALL component_getImplementationEnvironment( - char const ** envTypeName, uno_Environment **) -{ - *envTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -} - - -extern "C" sal_Bool SAL_CALL component_canUnload( TimeValue *pTime ) -{ - return g_moduleCount.canUnload( &g_moduleCount , pTime ); -} - diff --git a/dtrans/source/generic/makefile.mk b/dtrans/source/generic/makefile.mk index 21076595d208..aa856865a3a8 100644 --- a/dtrans/source/generic/makefile.mk +++ b/dtrans/source/generic/makefile.mk @@ -40,7 +40,7 @@ COMP1TYPELIST=dtrans # --- Settings ----------------------------------------------------- .INCLUDE : settings.mk - +.IF "$(L10N_framework)"=="" # ------------------------------------------------------------------ SLOFILES= \ @@ -66,5 +66,6 @@ DEF1NAME= $(SHL1TARGET) DEF1EXPORTFILE= exports.dxp # --- Targets ------------------------------------------------------ +.ENDIF # L10N_framework .INCLUDE : target.mk diff --git a/dtrans/util/makefile.mk b/dtrans/util/makefile.mk index 416ef7286aee..2e9666137619 100644 --- a/dtrans/util/makefile.mk +++ b/dtrans/util/makefile.mk @@ -41,7 +41,7 @@ TARGET4=dnd # --- Settings ----------------------------------------------------- .INCLUDE : settings.mk - +.IF "$(L10N_framework)"=="" # --- mcnttype dynlib ---------------------------------------------- @@ -180,6 +180,7 @@ DEF3NAME= $(SHL3TARGET) DEF3EXPORTFILE= exports.dxp .ENDIF # "$(GUI)"=="OS2" +.ENDIF # L10N_framework .INCLUDE : target.mk diff --git a/goodies/inc/chtuner.hxx b/goodies/inc/chtuner.hxx index 4c7e288d2ce3..7a54c1e05a41 100644 --- a/goodies/inc/chtuner.hxx +++ b/goodies/inc/chtuner.hxx @@ -38,7 +38,7 @@ #endif -#include +#include class ChannelItem; class ChannelList; diff --git a/goodies/inc/goodies.hrc b/goodies/inc/goodies.hrc index 18584985a603..139987c4f6ee 100644 --- a/goodies/inc/goodies.hrc +++ b/goodies/inc/goodies.hrc @@ -31,7 +31,7 @@ #define _GOODIES_HRC #ifndef _SOLAR_HRC -#include +#include #endif // Dialoge --------------------------------------------------------------- diff --git a/goodies/inc/pch/precompiled_goodies.hxx b/goodies/inc/pch/precompiled_goodies.hxx index b0d1ba09410b..fe6f2ec433e5 100644 --- a/goodies/inc/pch/precompiled_goodies.hxx +++ b/goodies/inc/pch/precompiled_goodies.hxx @@ -96,13 +96,13 @@ #include "rtl/uuid.h" #include "svtools/FilterConfigItem.hxx" -#include "svtools/cacheoptions.hxx" +#include "unotools/cacheoptions.hxx" #include "svtools/fltcall.hxx" -#include "svtools/itemprop.hxx" -#include "svtools/lstner.hxx" -#include "svtools/solar.hrc" +#include "svl/itemprop.hxx" +#include "svl/lstner.hxx" +#include "svl/solar.hrc" #include "svtools/stdctrl.hxx" -#include "svtools/svarray.hxx" +#include "svl/svarray.hxx" #include "toolkit/helper/vclunohelper.hxx" diff --git a/goodies/prj/build.lst b/goodies/prj/build.lst index fb1f7a0f1aca..f8edce86c4f8 100644 --- a/goodies/prj/build.lst +++ b/goodies/prj/build.lst @@ -1,4 +1,4 @@ -go goodies : svtools NULL +go goodies : l10n svtools NULL go goodies usr1 - all g_mkout NULL go goodies\inc nmake - all g_inc NULL go goodies\prj get - all g_prj NULL diff --git a/goodies/source/filter.vcl/egif/egif.cxx b/goodies/source/filter.vcl/egif/egif.cxx index e1547c7339d0..9f2aeaddd686 100644 --- a/goodies/source/filter.vcl/egif/egif.cxx +++ b/goodies/source/filter.vcl/egif/egif.cxx @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include #include "giflzwc.hxx" diff --git a/goodies/source/filter.vcl/egif/makefile.mk b/goodies/source/filter.vcl/egif/makefile.mk index 55165533580c..418af69c7bf8 100644 --- a/goodies/source/filter.vcl/egif/makefile.mk +++ b/goodies/source/filter.vcl/egif/makefile.mk @@ -49,17 +49,18 @@ CDEFS+= -DEDITDEBUG SRS1NAME=$(TARGET) SRC1FILES = dlgegif.src \ egifstr.src - +.IF "$(L10N_framework)"=="" SLOFILES= $(SLO)$/egif.obj \ $(SLO)$/dlgegif.obj \ $(SLO)$/giflzwc.obj - +.ENDIF # ========================================================================== RESLIB1NAME=$(TARGET2) RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs +.IF "$(L10N_framework)"=="" SHL1TARGET= egi$(DLLPOSTFIX) SHL1IMPLIB= egif SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(CPPULIB) $(SVTOOLLIB) $(SALLIB) @@ -75,7 +76,7 @@ SHL1OBJS= $(SLO)$/egif.obj SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/goodies/source/filter.vcl/eos2met/eos2met.cxx b/goodies/source/filter.vcl/eos2met/eos2met.cxx index b176d186a217..b818e9cd26ba 100644 --- a/goodies/source/filter.vcl/eos2met/eos2met.cxx +++ b/goodies/source/filter.vcl/eos2met/eos2met.cxx @@ -47,7 +47,7 @@ #include #include #include -#include +#include #include "strings.hrc" #include "dlgeos2.hxx" @@ -1753,7 +1753,7 @@ void METWriter::WriteOrders( const GDIMetaFile* pMTF ) Polygon aSimplePoly; const Polygon& rPoly = pA->GetPolygon(); if ( rPoly.HasFlags() ) - rPoly.GetSimple( aSimplePoly ); + rPoly.AdaptiveSubdivide( aSimplePoly ); else aSimplePoly = rPoly; METLine( aSimplePoly ); @@ -1772,7 +1772,7 @@ void METWriter::WriteOrders( const GDIMetaFile* pMTF ) Polygon aSimplePoly; const Polygon& rPoly = pA->GetPolygon(); if ( rPoly.HasFlags() ) - rPoly.GetSimple( aSimplePoly ); + rPoly.AdaptiveSubdivide( aSimplePoly ); else aSimplePoly = rPoly; if( aGDIFillColor != Color( COL_TRANSPARENT ) ) @@ -1809,7 +1809,7 @@ void METWriter::WriteOrders( const GDIMetaFile* pMTF ) if ( aSimplePolyPoly[ i ].HasFlags() ) { Polygon aSimplePoly; - aSimplePolyPoly[ i ].GetSimple( aSimplePoly ); + aSimplePolyPoly[ i ].AdaptiveSubdivide( aSimplePoly ); aSimplePolyPoly[ i ] = aSimplePoly; } } diff --git a/goodies/source/filter.vcl/eos2met/makefile.mk b/goodies/source/filter.vcl/eos2met/makefile.mk index 1d6725e5e902..05f2f032e342 100644 --- a/goodies/source/filter.vcl/eos2met/makefile.mk +++ b/goodies/source/filter.vcl/eos2met/makefile.mk @@ -49,15 +49,15 @@ CDEFS+= -DEDITDEBUG SRS1NAME=$(TARGET) SRC1FILES= dlgeos2.src \ eos2mstr.src - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/eos2met.obj \ $(SLO)$/dlgeos2.obj - +.ENDIF # ========================================================================== RESLIB1NAME=$(TARGET2) RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs - +.IF "$(L10N_framework)"=="" SHL1TARGET= eme$(DLLPOSTFIX) SHL1IMPLIB= eos2met SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(SVTOOLLIB) $(CPPULIB) $(SALLIB) @@ -72,7 +72,7 @@ SHL1OBJS= $(SLO)$/eos2met.obj SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/goodies/source/filter.vcl/epbm/epbm.cxx b/goodies/source/filter.vcl/epbm/epbm.cxx index 92aeb501e141..a624e7f45cfb 100644 --- a/goodies/source/filter.vcl/epbm/epbm.cxx +++ b/goodies/source/filter.vcl/epbm/epbm.cxx @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include #include "strings.hrc" diff --git a/goodies/source/filter.vcl/epbm/makefile.mk b/goodies/source/filter.vcl/epbm/makefile.mk index e70256c893e1..f4411d04e0fd 100644 --- a/goodies/source/filter.vcl/epbm/makefile.mk +++ b/goodies/source/filter.vcl/epbm/makefile.mk @@ -49,15 +49,15 @@ CDEFS+= -DEDITDEBUG SRS1NAME=$(TARGET) SRC1FILES= dlgepbm.src \ epbmstr.src - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/epbm.obj \ $(SLO)$/dlgepbm.obj - +.ENDIF # ========================================================================== RESLIB1NAME=$(TARGET2) RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs - +.IF "$(L10N_framework)"=="" SHL1TARGET= epb$(DLLPOSTFIX) SHL1IMPLIB= epbm SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(CPPULIB) $(SVTOOLLIB) $(SALLIB) @@ -73,7 +73,7 @@ SHL1OBJS= $(SLO)$/epbm.obj SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/goodies/source/filter.vcl/epgm/epgm.cxx b/goodies/source/filter.vcl/epgm/epgm.cxx index b6056339f11e..32d6e74a5cfe 100644 --- a/goodies/source/filter.vcl/epgm/epgm.cxx +++ b/goodies/source/filter.vcl/epgm/epgm.cxx @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include #include "strings.hrc" diff --git a/goodies/source/filter.vcl/epgm/makefile.mk b/goodies/source/filter.vcl/epgm/makefile.mk index b4ff18588263..579ee6858a78 100644 --- a/goodies/source/filter.vcl/epgm/makefile.mk +++ b/goodies/source/filter.vcl/epgm/makefile.mk @@ -50,15 +50,15 @@ CDEFS+= -DEDITDEBUG SRS1NAME=$(TARGET) SRC1FILES= dlgepgm.src \ epgmstr.src - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/epgm.obj \ $(SLO)$/dlgepgm.obj - +.ENDIF # ========================================================================== RESLIB1NAME=$(TARGET2) RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs - +.IF "$(L10N_framework)"=="" SHL1TARGET= epg$(DLLPOSTFIX) SHL1IMPLIB= epgm SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(CPPULIB) $(SVTOOLLIB) $(SALLIB) @@ -74,7 +74,7 @@ SHL1OBJS= $(SLO)$/epgm.obj SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/goodies/source/filter.vcl/epict/epict.cxx b/goodies/source/filter.vcl/epict/epict.cxx index 4df7abea01fc..3e4dca455d05 100644 --- a/goodies/source/filter.vcl/epict/epict.cxx +++ b/goodies/source/filter.vcl/epict/epict.cxx @@ -33,7 +33,7 @@ #include #include -#include +#include #include #include @@ -1573,7 +1573,7 @@ void PictWriter::WriteOpcodes( const GDIMetaFile & rMTF ) Polygon aSimplePoly; if ( rPoly.HasFlags() ) - rPoly.GetSimple( aSimplePoly ); + rPoly.AdaptiveSubdivide( aSimplePoly ); else aSimplePoly = rPoly; @@ -1603,7 +1603,7 @@ void PictWriter::WriteOpcodes( const GDIMetaFile & rMTF ) Polygon aSimplePoly; if ( rPoly.HasFlags() ) - rPoly.GetSimple( aSimplePoly ); + rPoly.AdaptiveSubdivide( aSimplePoly ); else aSimplePoly = rPoly; @@ -1632,7 +1632,7 @@ void PictWriter::WriteOpcodes( const GDIMetaFile & rMTF ) if ( aSimplePolyPoly[ i ].HasFlags() ) { Polygon aSimplePoly; - aSimplePolyPoly[ i ].GetSimple( aSimplePoly ); + aSimplePolyPoly[ i ].AdaptiveSubdivide( aSimplePoly ); aSimplePolyPoly[ i ] = aSimplePoly; } } diff --git a/goodies/source/filter.vcl/epict/makefile.mk b/goodies/source/filter.vcl/epict/makefile.mk index 33af96f1fb85..4aa4bab80ffc 100644 --- a/goodies/source/filter.vcl/epict/makefile.mk +++ b/goodies/source/filter.vcl/epict/makefile.mk @@ -50,15 +50,15 @@ CDEFS+= -DEDITDEBUG SRS1NAME=$(TARGET) SRC1FILES = dlgepct.src \ epictstr.src - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/epict.obj \ $(SLO)$/dlgepct.obj - +.ENDIF # ========================================================================== RESLIB1NAME=$(TARGET2) RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs - +.IF "$(L10N_framework)"=="" SHL1TARGET= ept$(DLLPOSTFIX) SHL1IMPLIB= epict SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(SVTOOLLIB) $(CPPULIB) $(SALLIB) @@ -74,7 +74,7 @@ SHL1OBJS= $(SLO)$/epict.obj SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/goodies/source/filter.vcl/eppm/eppm.cxx b/goodies/source/filter.vcl/eppm/eppm.cxx index 8cd71176e31b..d17b4f7777ae 100644 --- a/goodies/source/filter.vcl/eppm/eppm.cxx +++ b/goodies/source/filter.vcl/eppm/eppm.cxx @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include #include "strings.hrc" diff --git a/goodies/source/filter.vcl/eppm/makefile.mk b/goodies/source/filter.vcl/eppm/makefile.mk index 8ac83d7f1c8d..b40f9d897b8a 100644 --- a/goodies/source/filter.vcl/eppm/makefile.mk +++ b/goodies/source/filter.vcl/eppm/makefile.mk @@ -49,15 +49,15 @@ CDEFS+= -DEDITDEBUG SRS1NAME=$(TARGET) SRC1FILES= dlgeppm.src \ eppmstr.src - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/eppm.obj \ $(SLO)$/dlgeppm.obj - +.ENDIF # ========================================================================== RESLIB1NAME=$(TARGET2) RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs - +.IF "$(L10N_framework)"=="" SHL1TARGET= epp$(DLLPOSTFIX) SHL1IMPLIB= eppm SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(CPPULIB) $(SVTOOLLIB) $(SALLIB) @@ -73,6 +73,7 @@ SHL1OBJS= $(SLO)$/eppm.obj SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) +.ENDIF # ========================================================================== diff --git a/goodies/source/filter.vcl/eps/eps.cxx b/goodies/source/filter.vcl/eps/eps.cxx index 8a163659050a..dc8e407b178e 100644 --- a/goodies/source/filter.vcl/eps/eps.cxx +++ b/goodies/source/filter.vcl/eps/eps.cxx @@ -46,7 +46,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/goodies/source/filter.vcl/eps/makefile.mk b/goodies/source/filter.vcl/eps/makefile.mk index 59b63477531d..c5599344725a 100644 --- a/goodies/source/filter.vcl/eps/makefile.mk +++ b/goodies/source/filter.vcl/eps/makefile.mk @@ -50,16 +50,17 @@ CDEFS+= -DEDITDEBUG SRS1NAME=$(TARGET) SRC1FILES = dlgeps.src \ epsstr.src - +.IF "$(L10N_framework)"=="" EXCEPTIONSFILES=$(SLO)$/eps.obj SLOFILES = $(SLO)$/eps.obj \ $(SLO)$/dlgeps.obj +.ENDIF # ========================================================================== RESLIB1NAME=$(TARGET) RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs - +.IF "$(L10N_framework)"=="" SHL1TARGET= eps$(DLLPOSTFIX) SHL1IMPLIB= eps SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(VCLLIB) $(SVTOOLLIB) $(CPPULIB) $(SALLIB) @@ -75,6 +76,7 @@ SHL1OBJS= $(SLO)$/eps.obj SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) +.ENDIF # ========================================================================== diff --git a/goodies/source/filter.vcl/eras/makefile.mk b/goodies/source/filter.vcl/eras/makefile.mk index ae68c4a4ded6..e6aeaeefb223 100644 --- a/goodies/source/filter.vcl/eras/makefile.mk +++ b/goodies/source/filter.vcl/eras/makefile.mk @@ -40,7 +40,7 @@ DEPTARGET=veras .INCLUDE : settings.mk # --- Allgemein ---------------------------------------------------------- - +.IF "$(L10N_framework)"=="" .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF @@ -63,6 +63,7 @@ SHL1OBJS= $(SLO)$/eras.obj SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) +.ENDIF # ========================================================================== diff --git a/goodies/source/filter.vcl/etiff/etiff.cxx b/goodies/source/filter.vcl/etiff/etiff.cxx index 12289cb8f0a9..3cdec42d0978 100644 --- a/goodies/source/filter.vcl/etiff/etiff.cxx +++ b/goodies/source/filter.vcl/etiff/etiff.cxx @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include #include diff --git a/goodies/source/filter.vcl/etiff/makefile.mk b/goodies/source/filter.vcl/etiff/makefile.mk index 69b958fc3598..70902012ce23 100644 --- a/goodies/source/filter.vcl/etiff/makefile.mk +++ b/goodies/source/filter.vcl/etiff/makefile.mk @@ -44,7 +44,7 @@ DEPTARGET=vetiff .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/etiff.obj # ========================================================================== @@ -63,7 +63,7 @@ SHL1OBJS= $(SLO)$/etiff.obj SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/goodies/source/filter.vcl/expm/makefile.mk b/goodies/source/filter.vcl/expm/makefile.mk index a4093415be76..e123220feff8 100644 --- a/goodies/source/filter.vcl/expm/makefile.mk +++ b/goodies/source/filter.vcl/expm/makefile.mk @@ -45,7 +45,7 @@ DEPTARGET=vexpm .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/expm.obj # ========================================================================== @@ -64,7 +64,7 @@ SHL1OBJS= $(SLO)$/expm.obj SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/goodies/source/filter.vcl/icgm/makefile.mk b/goodies/source/filter.vcl/icgm/makefile.mk index 0d97b3a144ef..ee62bbfb051c 100644 --- a/goodies/source/filter.vcl/icgm/makefile.mk +++ b/goodies/source/filter.vcl/icgm/makefile.mk @@ -39,7 +39,7 @@ ENABLE_EXCEPTIONS=TRUE .INCLUDE : settings.mk # --- Files -------------------------------------------------------- - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/cgm.obj \ $(SLO)$/chart.obj \ $(SLO)$/class0.obj \ @@ -76,6 +76,7 @@ SHL1STDLIBS = \ $(TOOLSLIB) \ $(CPPULIB) \ $(SALLIB) +.ENDIF # --- Targets -------------------------------------------------------------- diff --git a/goodies/source/filter.vcl/idxf/dxf2mtf.cxx b/goodies/source/filter.vcl/idxf/dxf2mtf.cxx index a2547bcae232..654b66888f67 100644 --- a/goodies/source/filter.vcl/idxf/dxf2mtf.cxx +++ b/goodies/source/filter.vcl/idxf/dxf2mtf.cxx @@ -91,41 +91,93 @@ long DXF2GDIMetaFile::GetEntityColor(const DXFBasicEntity & rE) return nColor; } - -PenStyle DXF2GDIMetaFile::LTypeToPStyle(const char * sLineType) +DXFLineInfo DXF2GDIMetaFile::LTypeToDXFLineInfo(const char * sLineType) { const DXFLType * pLT; - PenStyle ePStyle; + DXFLineInfo aDXFLineInfo; + pLT=pDXF->aTables.SearchLType(sLineType); - if (pLT==NULL) ePStyle=PEN_SOLID; - else if (pLT->nDashCount<=1) ePStyle=PEN_SOLID; - else if (pLT->nDashCount==2) { - if (fabs(pLT->fDash[0])*4fPatternLength)) ePStyle=PEN_DOT; - else ePStyle=PEN_DASH; + if (pLT==NULL || pLT->nDashCount == 0) { + aDXFLineInfo.eStyle = LINE_SOLID; } - else ePStyle=PEN_DASHDOT; - return ePStyle; + else { + sal_Int32 i; + double x; + aDXFLineInfo.eStyle = LINE_DASH; + for (i=0; i < (pLT->nDashCount); i++) { + x = pLT->fDash[i] * pDXF->getGlobalLineTypeScale(); +// #### + // x = (sal_Int32) rTransform.TransLineWidth( pLT->fDash[i] * pDXF->getGlobalLineTypeScale() ); + if ( x >= 0.0 ) { + if ( aDXFLineInfo.nDotCount == 0 ) { + aDXFLineInfo.nDotCount ++; + aDXFLineInfo.fDotLen = x; + } + else if ( aDXFLineInfo.fDotLen == x ) { + aDXFLineInfo.nDotCount ++; + } + else if ( aDXFLineInfo.nDashCount == 0 ) { + aDXFLineInfo.nDashCount ++; + aDXFLineInfo.fDashLen = x; + } + else if ( aDXFLineInfo.fDashLen == x ) { + aDXFLineInfo.nDashCount ++; + } + else { + // It is impossible to be converted. + } + } + else { + if ( aDXFLineInfo.fDistance == 0 ) { + aDXFLineInfo.fDistance = -1 * x; + } + else { + // It is impossible to be converted. + } + } + + } + } + +#if 0 + if (aDXFLineInfo.DashCount > 0 && aDXFLineInfo.DashLen == 0.0) + aDXFLineInfo.DashLen ( 1 ); + if (aDXFLineInfo.DotCount > 0 && aDXFLineInfo.DotLen() == 0.0) + aDXFLineInfo.SetDotLen( 1 ); + if (aDXFLineInfo.GetDashCount > 0 || aDXFLineInfo.GetDotCount > 0) + if (aDXFLineInfo.GetDistance() == 0) + aDXFLineInfo.SetDistance( 1 ); +#endif + + return aDXFLineInfo; } - -PenStyle DXF2GDIMetaFile::GetEntityPStyle(const DXFBasicEntity & rE) +DXFLineInfo DXF2GDIMetaFile::GetEntityDXFLineInfo(const DXFBasicEntity & rE) { - PenStyle ePStyle; + DXFLineInfo aDXFLineInfo; const DXFLayer * pLayer; + aDXFLineInfo.eStyle = LINE_SOLID; + aDXFLineInfo.fWidth = 0; + aDXFLineInfo.nDashCount = 0; + aDXFLineInfo.fDashLen = 0; + aDXFLineInfo.nDotCount = 0; + aDXFLineInfo.fDotLen = 0; + aDXFLineInfo.fDistance = 0; + if (strcmp(rE.sLineType,"BYLAYER")==0) { - if (rE.sLayer[0]=='0' && rE.sLayer[1]==0) ePStyle=eParentLayerPStyle; + if (rE.sLayer[0]=='0' && rE.sLayer[1]==0) aDXFLineInfo=aParentLayerDXFLineInfo; else { pLayer=pDXF->aTables.SearchLayer(rE.sLayer); - if (pLayer!=NULL) ePStyle=LTypeToPStyle(pLayer->sLineType); - else ePStyle=eParentLayerPStyle; + if (pLayer!=NULL) aDXFLineInfo=LTypeToDXFLineInfo(pLayer->sLineType); + else aDXFLineInfo=aParentLayerDXFLineInfo; } } else if (strcmp(rE.sLineType,"BYBLOCK")==0) { - ePStyle=eBlockPStyle; + aDXFLineInfo=aBlockDXFLineInfo; } - else ePStyle=LTypeToPStyle(rE.sLineType); - return ePStyle; + else aDXFLineInfo=LTypeToDXFLineInfo(rE.sLineType); + return aDXFLineInfo; } @@ -133,12 +185,10 @@ BOOL DXF2GDIMetaFile::SetLineAttribute(const DXFBasicEntity & rE, ULONG /*nWidth { long nColor; Color aColor; - PenStyle ePStyle; nColor=GetEntityColor(rE); if (nColor<0) return FALSE; aColor=ConvertColor((BYTE)nColor); - ePStyle=GetEntityPStyle(rE); if (aActLineColor!=aColor) { pVirDev->SetLineColor( aActLineColor = aColor ); @@ -202,12 +252,30 @@ BOOL DXF2GDIMetaFile::SetFontAttribute(const DXFBasicEntity & rE, short nAngle, void DXF2GDIMetaFile::DrawLineEntity(const DXFLineEntity & rE, const DXFTransform & rTransform) { - if (SetLineAttribute(rE)) { Point aP0,aP1; rTransform.Transform(rE.aP0,aP0); rTransform.Transform(rE.aP1,aP1); - pVirDev->DrawLine(aP0,aP1); + + DXFLineInfo aDXFLineInfo; + aDXFLineInfo=GetEntityDXFLineInfo(rE); + LineInfo aLineInfo; + aLineInfo = rTransform.Transform(aDXFLineInfo); + +#if 0 + printf("%f\n", rTransform.TransLineWidth(1000.0)); + + // LINE_NONE = 0, LINE_SOLID = 1, LINE_DASH = 2, LineStyle_FORCE_EQUAL_SIZE = SAL_MAX_ENUM + aLineInfo.SetStyle( LINE_DASH ); + aLineInfo.SetWidth( 300 ); + aLineInfo.SetDashCount( 2 ); + aLineInfo.SetDashLen( 100 ); + aLineInfo.SetDotCount( 1 ); + aLineInfo.SetDotLen( 0 ); + aLineInfo.SetDistance( 500 ); +#endif + + pVirDev->DrawLine(aP0,aP1,aLineInfo); if (rE.fThickness!=0) { Point aP2,aP3; rTransform.Transform(rE.aP0+DXFVector(0,0,rE.fThickness),aP2); @@ -426,23 +494,23 @@ void DXF2GDIMetaFile::DrawInsertEntity(const DXFInsertEntity & rE, const DXFTran rTransform ); long nSavedBlockColor, nSavedParentLayerColor; - PenStyle eSavedBlockPStyle, eSavedParentLayerPStyle; + DXFLineInfo aSavedBlockDXFLineInfo, aSavedParentLayerDXFLineInfo; nSavedBlockColor=nBlockColor; nSavedParentLayerColor=nParentLayerColor; - eSavedBlockPStyle=eBlockPStyle; - eSavedParentLayerPStyle=eParentLayerPStyle; + aSavedBlockDXFLineInfo=aBlockDXFLineInfo; + aSavedParentLayerDXFLineInfo=aParentLayerDXFLineInfo; nBlockColor=GetEntityColor(rE); - eBlockPStyle=GetEntityPStyle(rE); + aBlockDXFLineInfo=GetEntityDXFLineInfo(rE); if (rE.sLayer[0]!='0' || rE.sLayer[1]!=0) { DXFLayer * pLayer=pDXF->aTables.SearchLayer(rE.sLayer); if (pLayer!=NULL) { nParentLayerColor=pLayer->nColor; - eParentLayerPStyle=LTypeToPStyle(pLayer->sLineType); + aParentLayerDXFLineInfo=LTypeToDXFLineInfo(pLayer->sLineType); } } DrawEntities(*pB,aT,FALSE); - eBlockPStyle=eSavedBlockPStyle; - eParentLayerPStyle=eSavedParentLayerPStyle; + aBlockDXFLineInfo=aSavedBlockDXFLineInfo; + aParentLayerDXFLineInfo=aSavedParentLayerDXFLineInfo; nBlockColor=nSavedBlockColor; nParentLayerColor=nSavedParentLayerColor; } @@ -540,6 +608,8 @@ void DXF2GDIMetaFile::DrawLWPolyLineEntity(const DXFLWPolyLineEntity & rE, const pVirDev->DrawPolygon( aPoly ); else pVirDev->DrawPolyLine( aPoly ); + // #### + //pVirDev->DrawPolyLine( aPoly, aDXFLineInfo ); } } } @@ -675,23 +745,23 @@ void DXF2GDIMetaFile::DrawDimensionEntity(const DXFDimensionEntity & rE, const D rTransform ); long nSavedBlockColor, nSavedParentLayerColor; - PenStyle eSavedBlockPStyle, eSavedParentLayerPStyle; + DXFLineInfo aSavedBlockDXFLineInfo, aSavedParentLayerDXFLineInfo; nSavedBlockColor=nBlockColor; nSavedParentLayerColor=nParentLayerColor; - eSavedBlockPStyle=eBlockPStyle; - eSavedParentLayerPStyle=eParentLayerPStyle; + aSavedBlockDXFLineInfo=aBlockDXFLineInfo; + aSavedParentLayerDXFLineInfo=aParentLayerDXFLineInfo; nBlockColor=GetEntityColor(rE); - eBlockPStyle=GetEntityPStyle(rE); + aBlockDXFLineInfo=GetEntityDXFLineInfo(rE); if (rE.sLayer[0]!='0' || rE.sLayer[1]!=0) { DXFLayer * pLayer=pDXF->aTables.SearchLayer(rE.sLayer); if (pLayer!=NULL) { nParentLayerColor=pLayer->nColor; - eParentLayerPStyle=LTypeToPStyle(pLayer->sLineType); + aParentLayerDXFLineInfo=LTypeToDXFLineInfo(pLayer->sLineType); } } DrawEntities(*pB,aT,FALSE); - eBlockPStyle=eSavedBlockPStyle; - eParentLayerPStyle=eSavedParentLayerPStyle; + aBlockDXFLineInfo=aSavedBlockDXFLineInfo; + aParentLayerDXFLineInfo=aSavedParentLayerDXFLineInfo; nBlockColor=nSavedBlockColor; nParentLayerColor=nSavedParentLayerColor; } @@ -801,16 +871,28 @@ BOOL DXF2GDIMetaFile::Convert(const DXFRepresentation & rDXF, GDIMetaFile & rMTF nMainEntitiesCount=CountEntities(pDXF->aEntities); nBlockColor=7; - eBlockPStyle=PEN_SOLID; + aBlockDXFLineInfo.eStyle = LINE_SOLID; + aBlockDXFLineInfo.fWidth = 0; + aBlockDXFLineInfo.nDashCount = 0; + aBlockDXFLineInfo.fDashLen = 0; + aBlockDXFLineInfo.nDotCount = 0; + aBlockDXFLineInfo.fDotLen = 0; + aBlockDXFLineInfo.fDistance = 0; pLayer=pDXF->aTables.SearchLayer("0"); if (pLayer!=NULL) { nParentLayerColor=pLayer->nColor & 0xff; - eParentLayerPStyle=LTypeToPStyle(pLayer->sLineType); + aParentLayerDXFLineInfo=LTypeToDXFLineInfo(pLayer->sLineType); } else { nParentLayerColor=7; - eParentLayerPStyle=PEN_SOLID; + aParentLayerDXFLineInfo.eStyle = LINE_SOLID; + aParentLayerDXFLineInfo.fWidth = 0; + aParentLayerDXFLineInfo.nDashCount = 0; + aParentLayerDXFLineInfo.fDashLen = 0; + aParentLayerDXFLineInfo.nDotCount = 0; + aParentLayerDXFLineInfo.fDotLen = 0; + aParentLayerDXFLineInfo.fDistance = 0; } pVirDev->EnableOutput(FALSE); @@ -837,14 +919,14 @@ BOOL DXF2GDIMetaFile::Convert(const DXFRepresentation & rDXF, GDIMetaFile & rMTF fScale = 0; // -Wall added this... } else { - if (fWidth<500.0 || fHeight<500.0 || fWidth>32767.0 || fHeight>32767.0) { +// if (fWidth<500.0 || fHeight<500.0 || fWidth>32767.0 || fHeight>32767.0) { if (fWidth>fHeight) fScale=10000.0/fWidth; else fScale=10000.0/fHeight; - } - else - fScale=1.0; +// } +// else +// fScale=1.0; aTransform=DXFTransform(fScale,-fScale,fScale, DXFVector(-pDXF->aBoundingBox.fMinX*fScale, pDXF->aBoundingBox.fMaxY*fScale, @@ -857,14 +939,14 @@ BOOL DXF2GDIMetaFile::Convert(const DXFRepresentation & rDXF, GDIMetaFile & rMTF else { fHeight=pVPort->fHeight; fWidth=fHeight*pVPort->fAspectRatio; - if (fWidth<500.0 || fHeight<500.0 || fWidth>32767.0 || fHeight>32767.0) { +// if (fWidth<500.0 || fHeight<500.0 || fWidth>32767.0 || fHeight>32767.0) { if (fWidth>fHeight) fScale=10000.0/fWidth; else fScale=10000.0/fHeight; - } - else - fScale=1.0; +// } +// else +// fScale=1.0; aTransform=DXFTransform( DXFTransform(pVPort->aDirection,pVPort->aTarget), DXFTransform( @@ -894,7 +976,6 @@ BOOL DXF2GDIMetaFile::Convert(const DXFRepresentation & rDXF, GDIMetaFile & rMTF } delete pVirDev; - return bStatus; } diff --git a/goodies/source/filter.vcl/idxf/dxf2mtf.hxx b/goodies/source/filter.vcl/idxf/dxf2mtf.hxx index bf32750cc0af..a1bf99639430 100644 --- a/goodies/source/filter.vcl/idxf/dxf2mtf.hxx +++ b/goodies/source/filter.vcl/idxf/dxf2mtf.hxx @@ -33,6 +33,7 @@ #include "dxfreprd.hxx" #include +#include // MT: NOOLDSV, someone should change the code... enum PenStyle { PEN_NULL, PEN_SOLID, PEN_DOT, PEN_DASH, PEN_DASHDOT }; @@ -41,6 +42,7 @@ enum BrushStyle { BRUSH_NULL, BRUSH_SOLID, BRUSH_HORZ, BRUSH_VERT, BRUSH_25, BRUSH_50, BRUSH_75, BRUSH_BITMAP }; + class DXF2GDIMetaFile { private: @@ -56,9 +58,9 @@ private: ULONG nMainEntitiesCount; long nBlockColor; - PenStyle eBlockPStyle; + DXFLineInfo aBlockDXFLineInfo; long nParentLayerColor; - PenStyle eParentLayerPStyle; + DXFLineInfo aParentLayerDXFLineInfo; Color aActLineColor; Color aActFillColor; Font aActFont; @@ -71,9 +73,9 @@ private: long GetEntityColor(const DXFBasicEntity & rE); - PenStyle LTypeToPStyle(const char * sLineType); + DXFLineInfo LTypeToDXFLineInfo(const char * sLineType); - PenStyle GetEntityPStyle(const DXFBasicEntity & rE); + DXFLineInfo GetEntityDXFLineInfo(const DXFBasicEntity & rE); BOOL SetLineAttribute(const DXFBasicEntity & rE, ULONG nWidth=0); diff --git a/goodies/source/filter.vcl/idxf/dxfreprd.cxx b/goodies/source/filter.vcl/idxf/dxfreprd.cxx index 7dc2f5d8d58d..80b4cb599b73 100644 --- a/goodies/source/filter.vcl/idxf/dxfreprd.cxx +++ b/goodies/source/filter.vcl/idxf/dxfreprd.cxx @@ -142,7 +142,8 @@ void DXFPalette::SetColor(BYTE nIndex, BYTE nRed, BYTE nGreen, BYTE nBlue) DXFRepresentation::DXFRepresentation() { - setTextEncoding(RTL_TEXTENCODING_IBM_437); + setTextEncoding(RTL_TEXTENCODING_IBM_437); + setGlobalLineTypeScale(1.0); } @@ -217,11 +218,18 @@ void DXFRepresentation::ReadHeader(DXFGroupReader & rDGR) // FIXME: we really need a whole table of // $DWGCODEPAGE to encodings mappings if ( (strcmp(rDGR.GetS(),"ANSI_932")==0) || - (strcmp(rDGR.GetS(),"DOS932")==0) ) + (strcmp(rDGR.GetS(),"ansi_932")==0) || + (strcmp(rDGR.GetS(),"DOS932")==0) || + (strcmp(rDGR.GetS(),"dos932")==0) ) { setTextEncoding(RTL_TEXTENCODING_MS_932); } } + else if (strcmp(rDGR.GetS(),"$LTSCALE")==0) + { + rDGR.Read(); + setGlobalLineTypeScale(getGlobalLineTypeScale() * rDGR.GetF()); + } else rDGR.Read(); } } diff --git a/goodies/source/filter.vcl/idxf/dxfreprd.hxx b/goodies/source/filter.vcl/idxf/dxfreprd.hxx index 490f7af57223..13ca7d022697 100644 --- a/goodies/source/filter.vcl/idxf/dxfreprd.hxx +++ b/goodies/source/filter.vcl/idxf/dxfreprd.hxx @@ -101,7 +101,9 @@ public: DXFEntities aEntities; // Die Entities (aus der Entities-Section) der DXF-Datei - rtl_TextEncoding mEnc; + rtl_TextEncoding mEnc; // $DWGCODEPAGE + + double mfGlobalLineTypeScale; // $LTSCALE DXFRepresentation(); ~DXFRepresentation(); @@ -109,6 +111,9 @@ public: rtl_TextEncoding getTextEncoding() const; void setTextEncoding(rtl_TextEncoding aEnc); + double getGlobalLineTypeScale() const; + void setGlobalLineTypeScale(double fGlobalLineTypeScale); + BOOL Read( SvStream & rIStream, USHORT nMinPercent, USHORT nMaxPercent); // Liesst die komplette DXF-Datei ein. @@ -128,7 +133,8 @@ inline BYTE DXFPalette::GetGreen(BYTE nIndex) const { return pGreen[nIndex]; } inline BYTE DXFPalette::GetBlue(BYTE nIndex) const { return pBlue[nIndex]; } inline rtl_TextEncoding DXFRepresentation::getTextEncoding() const { return mEnc; } inline void DXFRepresentation::setTextEncoding(rtl_TextEncoding aEnc) { mEnc = aEnc; } - +inline double DXFRepresentation::getGlobalLineTypeScale() const { return mfGlobalLineTypeScale; } +inline void DXFRepresentation::setGlobalLineTypeScale(double fGlobalLineTypeScale) { mfGlobalLineTypeScale = fGlobalLineTypeScale; } #endif diff --git a/goodies/source/filter.vcl/idxf/dxfvec.cxx b/goodies/source/filter.vcl/idxf/dxfvec.cxx index ee5a923a8684..48bc93ae3eb6 100644 --- a/goodies/source/filter.vcl/idxf/dxfvec.cxx +++ b/goodies/source/filter.vcl/idxf/dxfvec.cxx @@ -206,6 +206,32 @@ BOOL DXFTransform::TransCircleToEllipse(double fRadius, double & rEx, double & r else return FALSE; } +LineInfo DXFTransform::Transform(const DXFLineInfo& aDXFLineInfo) const +{ + double fex,fey,scale; + + fex=sqrt(aMX.fx*aMX.fx + aMX.fy*aMX.fy); + fey=sqrt(aMY.fx*aMY.fx + aMY.fy*aMY.fy); + scale = (fex+fey)/2.0; + + LineInfo aLineInfo; + + aLineInfo.SetStyle( aDXFLineInfo.eStyle ); + aLineInfo.SetWidth( (sal_Int32) (aDXFLineInfo.fWidth * scale + 0.5) ); + aLineInfo.SetDashCount( static_cast< USHORT >( aDXFLineInfo.nDashCount ) ); + aLineInfo.SetDashLen( (sal_Int32) (aDXFLineInfo.fDashLen * scale + 0.5) ); + aLineInfo.SetDotCount( static_cast< USHORT >( aDXFLineInfo.nDotCount ) ); + aLineInfo.SetDotLen( (sal_Int32) (aDXFLineInfo.fDotLen * scale + 0.5) ); + aLineInfo.SetDistance( (sal_Int32) (aDXFLineInfo.fDistance * scale + 0.5) ); + + if ( aLineInfo.GetDashCount() > 0 && aLineInfo.GetDashLen() == 0 ) + aLineInfo.SetDashLen(1); + + if ( aLineInfo.GetDotCount() > 0 && aLineInfo.GetDotLen() == 0 ) + aLineInfo.SetDotLen(1); + + return aLineInfo; +} ULONG DXFTransform::TransLineWidth(double fW) const { @@ -213,6 +239,8 @@ ULONG DXFTransform::TransLineWidth(double fW) const fex=sqrt(aMX.fx*aMX.fx + aMX.fy*aMX.fy); fey=sqrt(aMY.fx*aMY.fx + aMY.fy*aMY.fy); + // ### + // printf("fex=%f fey=%f\n", fex, fey); return (ULONG)(fabs(fW)*(fex+fey)/2.0+0.5); } @@ -227,4 +255,3 @@ BOOL DXFTransform::Mirror() const if (aMZ.SProd(aMX*aMY)<0) return TRUE; else return FALSE; } - diff --git a/goodies/source/filter.vcl/idxf/dxfvec.hxx b/goodies/source/filter.vcl/idxf/dxfvec.hxx index 5ccc0be25774..aca26df46676 100644 --- a/goodies/source/filter.vcl/idxf/dxfvec.hxx +++ b/goodies/source/filter.vcl/idxf/dxfvec.hxx @@ -32,6 +32,37 @@ #define _DXFVEC_HXX #include +#include + +class DXFLineInfo { +public: + LineStyle eStyle; + double fWidth; + sal_Int32 nDashCount; + double fDashLen; + sal_Int32 nDotCount; + double fDotLen; + double fDistance; + + DXFLineInfo() : + eStyle(LINE_SOLID), + fWidth(0), + nDashCount(0), + fDashLen(0), + nDotCount(0), + fDotLen(0), + fDistance(0) {} + + DXFLineInfo(const DXFLineInfo& x) : + eStyle(x.eStyle), + fWidth(x.fWidth), + nDashCount(x.nDashCount), + fDashLen(x.fDashLen), + nDotCount(x.nDotCount), + fDotLen(x.fDotLen), + fDistance(x.fDistance) {} + +}; //------------------------------------------------------------------------------ @@ -135,6 +166,9 @@ public: BOOL Mirror() const; // Liefert TRUE, wenn die Matrix ein Linkssystem bildet + LineInfo Transform(const DXFLineInfo& aDXFLineInfo) const; + // Transform to LineInfo + private: DXFVector aMX; DXFVector aMY; diff --git a/goodies/source/filter.vcl/idxf/makefile.mk b/goodies/source/filter.vcl/idxf/makefile.mk index dbbcc83cec45..081022cd4e5b 100644 --- a/goodies/source/filter.vcl/idxf/makefile.mk +++ b/goodies/source/filter.vcl/idxf/makefile.mk @@ -44,7 +44,7 @@ DEPTARGET=vidxf .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" EXCEPTIONSFILES=\ $(SLO)$/dxfentrd.obj \ $(SLO)$/dxf2mtf.obj @@ -76,6 +76,7 @@ SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) +.ENDIF # ========================================================================== diff --git a/goodies/source/filter.vcl/ieps/makefile.mk b/goodies/source/filter.vcl/ieps/makefile.mk index b1e38231a3ff..673cce72744c 100644 --- a/goodies/source/filter.vcl/ieps/makefile.mk +++ b/goodies/source/filter.vcl/ieps/makefile.mk @@ -44,7 +44,7 @@ DEPTARGET=vieps .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/ieps.obj # ========================================================================== @@ -64,7 +64,7 @@ SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/goodies/source/filter.vcl/ios2met/makefile.mk b/goodies/source/filter.vcl/ios2met/makefile.mk index 0cb3e762f06f..c987476316c6 100644 --- a/goodies/source/filter.vcl/ios2met/makefile.mk +++ b/goodies/source/filter.vcl/ios2met/makefile.mk @@ -44,7 +44,7 @@ DEPTARGET=vios2met .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/ios2met.obj # ========================================================================== @@ -65,7 +65,7 @@ SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) - +.ENDIF # ========================================================================== .INCLUDE : target.mk diff --git a/goodies/source/filter.vcl/ipbm/makefile.mk b/goodies/source/filter.vcl/ipbm/makefile.mk index 1ef6fe0fd33b..84a9815a4974 100644 --- a/goodies/source/filter.vcl/ipbm/makefile.mk +++ b/goodies/source/filter.vcl/ipbm/makefile.mk @@ -44,7 +44,7 @@ DEPTARGET=vipbm .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/ipbm.obj # ========================================================================== @@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) +.ENDIF # ========================================================================== diff --git a/goodies/source/filter.vcl/ipcd/ipcd.cxx b/goodies/source/filter.vcl/ipcd/ipcd.cxx index f70d1c8b84c5..f7a5f3652cbf 100644 --- a/goodies/source/filter.vcl/ipcd/ipcd.cxx +++ b/goodies/source/filter.vcl/ipcd/ipcd.cxx @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include //============================ PCDReader ================================== diff --git a/goodies/source/filter.vcl/ipcd/makefile.mk b/goodies/source/filter.vcl/ipcd/makefile.mk index c125d88e4bf9..7782b7b8e627 100644 --- a/goodies/source/filter.vcl/ipcd/makefile.mk +++ b/goodies/source/filter.vcl/ipcd/makefile.mk @@ -44,7 +44,7 @@ DEPTARGET=vipcd .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/ipcd.obj # ========================================================================== @@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) +.ENDIF # ========================================================================== diff --git a/goodies/source/filter.vcl/ipcx/makefile.mk b/goodies/source/filter.vcl/ipcx/makefile.mk index 796f16daaff8..7f0f309ae786 100644 --- a/goodies/source/filter.vcl/ipcx/makefile.mk +++ b/goodies/source/filter.vcl/ipcx/makefile.mk @@ -44,7 +44,7 @@ DEPTARGET=vipcx .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/ipcx.obj # ========================================================================== @@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) +.ENDIF # ========================================================================== diff --git a/goodies/source/filter.vcl/ipict/makefile.mk b/goodies/source/filter.vcl/ipict/makefile.mk index 56c158316ad7..2d84bffe3c36 100644 --- a/goodies/source/filter.vcl/ipict/makefile.mk +++ b/goodies/source/filter.vcl/ipict/makefile.mk @@ -44,7 +44,7 @@ DEPTARGET=vipict .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/ipict.obj # ========================================================================== @@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) +.ENDIF # ========================================================================== diff --git a/goodies/source/filter.vcl/ipsd/makefile.mk b/goodies/source/filter.vcl/ipsd/makefile.mk index 933827b88ef4..cd29c94f8074 100644 --- a/goodies/source/filter.vcl/ipsd/makefile.mk +++ b/goodies/source/filter.vcl/ipsd/makefile.mk @@ -44,7 +44,7 @@ DEPTARGET=vipsd .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/ipsd.obj # ========================================================================== @@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) +.ENDIF # ========================================================================== diff --git a/goodies/source/filter.vcl/iras/makefile.mk b/goodies/source/filter.vcl/iras/makefile.mk index 1a4190a6e180..28b84c8401ef 100644 --- a/goodies/source/filter.vcl/iras/makefile.mk +++ b/goodies/source/filter.vcl/iras/makefile.mk @@ -44,7 +44,7 @@ DEPTARGET=viras .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/iras.obj # ========================================================================== @@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) +.ENDIF # ========================================================================== diff --git a/goodies/source/filter.vcl/itga/makefile.mk b/goodies/source/filter.vcl/itga/makefile.mk index 980b155a5210..a9dfe2e77643 100644 --- a/goodies/source/filter.vcl/itga/makefile.mk +++ b/goodies/source/filter.vcl/itga/makefile.mk @@ -44,7 +44,7 @@ DEPTARGET=vitga .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/itga.obj # ========================================================================== @@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) +.ENDIF # ========================================================================== diff --git a/goodies/source/filter.vcl/itiff/makefile.mk b/goodies/source/filter.vcl/itiff/makefile.mk index 9b610d421f37..78405a563659 100644 --- a/goodies/source/filter.vcl/itiff/makefile.mk +++ b/goodies/source/filter.vcl/itiff/makefile.mk @@ -44,7 +44,7 @@ DEPTARGET=vitiff .IF "$(editdebug)"!="" || "$(EDITDEBUG)"!="" CDEFS+= -DEDITDEBUG .ENDIF - +.IF "$(L10N_framework)"=="" SLOFILES = $(SLO)$/itiff.obj \ $(SLO)$/lzwdecom.obj \ $(SLO)$/ccidecom.obj @@ -68,6 +68,7 @@ SHL1VERSIONMAP=exports.map SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME=$(SHL1TARGET) +.ENDIF # ========================================================================== diff --git a/goodies/source/graphic/grfcache.cxx b/goodies/source/graphic/grfcache.cxx index 1a2af16ed741..f0a41ceca53f 100644 --- a/goodies/source/graphic/grfcache.cxx +++ b/goodies/source/graphic/grfcache.cxx @@ -37,6 +37,8 @@ #include #include "grfcache.hxx" +#include + // ----------- // - Defines - // ----------- @@ -612,7 +614,12 @@ void GraphicCache::AddGraphicObject( const GraphicObject& rObj, Graphic& rSubsti if( !bInserted ) { GraphicCacheEntry* pEntry = static_cast< GraphicCacheEntry* >( maGraphicCache.First() ); - const GraphicID aID( rObj ); + ::std::auto_ptr< GraphicID > apID; + + if( !pID ) + { + apID.reset( new GraphicID( rObj ) ); + } while( !bInserted && pEntry ) { @@ -647,10 +654,13 @@ void GraphicCache::AddGraphicObject( const GraphicObject& rObj, Graphic& rSubsti } } } - else if( rEntryID == aID ) + else { - pEntry->AddGraphicObjectReference( rObj, rSubstitute ); - bInserted = TRUE; + if( rEntryID == *apID ) + { + pEntry->AddGraphicObjectReference( rObj, rSubstitute ); + bInserted = TRUE; + } } if( !bInserted ) diff --git a/goodies/source/graphic/grfmgr.cxx b/goodies/source/graphic/grfmgr.cxx index bece8389d270..39c1e53e7184 100644 --- a/goodies/source/graphic/grfmgr.cxx +++ b/goodies/source/graphic/grfmgr.cxx @@ -44,8 +44,7 @@ #include #include #include -#include -#include +#include #include "grfmgr.hxx" // ----------- @@ -674,31 +673,11 @@ BOOL GraphicObject::Draw( OutputDevice* pOut, const Point& rPt, const Size& rSz, const sal_uInt32 nOldDrawMode = pOut->GetDrawMode(); BOOL bCropped = aAttr.IsCropped(); BOOL bCached = FALSE; - BOOL bWritingPdfLinkedGraphic = FALSE; BOOL bRet; // #i29534# Provide output rects for PDF writer Rectangle aCropRect; - // #i29534# Notify PDF writer about linked graphic (if any) - vcl::ExtOutDevData* pExtOutDevData = pOut->GetExtOutDevData(); - if( pExtOutDevData && pExtOutDevData->ISA(vcl::PDFExtOutDevData) ) - { - // #i29534# Only delegate image handling to PDF, if no special - // treatment is necessary - if( GetGraphic().IsLink() && - aSz.Width() > 0L && - aSz.Height() > 0L && - !aAttr.IsSpecialDrawMode() && - !aAttr.IsMirrored() && - !aAttr.IsRotated() && - !aAttr.IsAdjusted() ) - { - bWritingPdfLinkedGraphic = TRUE; - static_cast< vcl::PDFExtOutDevData* >( pExtOutDevData )->BeginGroup(); - } - } - if( !( GRFMGR_DRAW_USE_DRAWMODE_SETTINGS & nFlags ) ) pOut->SetDrawMode( nOldDrawMode & ( ~( DRAWMODE_SETTINGSLINE | DRAWMODE_SETTINGSFILL | DRAWMODE_SETTINGSTEXT | DRAWMODE_SETTINGSGRADIENT ) ) ); @@ -749,16 +728,6 @@ BOOL GraphicObject::Draw( OutputDevice* pOut, const Point& rPt, const Size& rSz, pOut->SetDrawMode( nOldDrawMode ); - // #i29534# Notify PDF writer about linked graphic (if any) - if( bWritingPdfLinkedGraphic ) - { - static_cast< vcl::PDFExtOutDevData* >( pExtOutDevData )->EndGroup( - const_cast< Graphic& >(GetGraphic()), - aAttr.GetTransparency(), - Rectangle( aPt, aSz ), - aCropRect ); - } - // #i29534# Moved below OutDev restoration, to avoid multiple swap-ins // (code above needs to call GetGraphic twice) if( bCached ) diff --git a/goodies/source/inv/invader.cxx b/goodies/source/inv/invader.cxx index be15ff2e75d4..0aed6e76848f 100644 --- a/goodies/source/inv/invader.cxx +++ b/goodies/source/inv/invader.cxx @@ -37,7 +37,7 @@ #include "invader.hrc" #include "strings.hrc" #include "score.hxx" -#include +#include #include #include #include diff --git a/goodies/source/inv/makefile.mk b/goodies/source/inv/makefile.mk index 359aab167008..500ba17f6091 100644 --- a/goodies/source/inv/makefile.mk +++ b/goodies/source/inv/makefile.mk @@ -42,6 +42,7 @@ EXTERNAL_WARNINGS_NOT_ERRORS := TRUE .INCLUDE : settings.mk # --- Files -------------------------------------------------------- +.IF "$(L10N_framework)"=="" .IF "$(TEST)" != "" CDEFS+=-DTEST @@ -62,6 +63,7 @@ SLOFILES= \ $(SLO)$/score.obj \ $(SLO)$/monst.obj .ENDIF +.ENDIF SRS1NAME=$(TARGET) SRC1FILES=gegner.src strings.src @@ -70,6 +72,9 @@ RESLIB1IMAGES= $(PRJ)$/res RESLIB1NAME=tfu RESLIB1SRSFILES=$(SRS)$/invader.srs + +.IF "$(L10N_framework)"=="" + .IF "$(TEST)"!="" APP1TARGET= $(TARGET) APP1OBJS= $(OBJFILES) @@ -85,7 +90,7 @@ APP1STDLIBS= $(CPPULIB) \ .ELSE SHL1TARGET= tfu$(DLLPOSTFIX) -SHL1IMPLIB= itfu +SHL1IMPLIB= i SHL1STDLIBS=\ $(VCLLIB) \ $(TOOLSLIB) \ @@ -103,10 +108,11 @@ SHL1DEF=$(MISC)$/$(SHL1TARGET).def .ENDIF # --- Targets ------------------------------------------------------- - +.ENDIF .INCLUDE : target.mk +.IF "$(L10N_framework)"=="" ALLTAR: \ $(BIN)$/applicat.rdb @@ -147,3 +153,7 @@ $(MISC)$/$(SHL1TARGET).def: makefile.mk .ENDIF +.ELSE +pseudo: + +.ENDIF diff --git a/goodies/source/unographic/descriptor.cxx b/goodies/source/unographic/descriptor.cxx index e75b008cfb69..c19318d6e11e 100644 --- a/goodies/source/unographic/descriptor.cxx +++ b/goodies/source/unographic/descriptor.cxx @@ -37,7 +37,7 @@ #include #include #include -#include +#include #ifndef _COM_SUN_STAR_BEANS_PROPERTYSTATE_HDL_ #include diff --git a/goodies/source/unographic/provider.cxx b/goodies/source/unographic/provider.cxx index 2eb0aede9bdf..1f7de99d4473 100644 --- a/goodies/source/unographic/provider.cxx +++ b/goodies/source/unographic/provider.cxx @@ -46,7 +46,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/goodies/source/unographic/renderer.cxx b/goodies/source/unographic/renderer.cxx index 78f006cc69be..d280ed832999 100644 --- a/goodies/source/unographic/renderer.cxx +++ b/goodies/source/unographic/renderer.cxx @@ -48,7 +48,7 @@ #include #include -#include +#include #include "grfmgr.hxx" #include "graphic.hxx" #include "renderer.hxx" diff --git a/goodies/source/unographic/transformer.cxx b/goodies/source/unographic/transformer.cxx index 4422d161d7c4..7e18c10cdd41 100644 --- a/goodies/source/unographic/transformer.cxx +++ b/goodies/source/unographic/transformer.cxx @@ -43,7 +43,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/goodies/util/makefile.mk b/goodies/util/makefile.mk index 13bb94069804..dc5d9566ea8a 100644 --- a/goodies/util/makefile.mk +++ b/goodies/util/makefile.mk @@ -42,6 +42,7 @@ GEN_HID=TRUE .INCLUDE : settings.mk # --- Allgemein --------------------------------------------------- +.IF "$(L10N_framework)"=="" LIB1TARGET=$(SLB)$/go.lib LIB1FILES=\ @@ -78,6 +79,7 @@ DEF1EXPORTFILE =goodies.dxp # THB: exports list goodies checked for 6.0 Final 6.12.2001 # Note: explicit exports only necessary for VCL graphic filters (see there) +.ENDIF # --- Targets ----------------------------------------------------------- @@ -86,6 +88,7 @@ DEF1EXPORTFILE =goodies.dxp .IF "$(depend)"=="" # --- Goodies-Filter-Datei --- +.IF "$(L10N_framework)"=="" $(MISC)$/$(SHL1TARGET).flt: makefile.mk @echo ------------------------------ @@ -98,3 +101,5 @@ $(MISC)$/$(SHL1TARGET).flt: makefile.mk @echo CT>>$@ .ENDIF + +.ENDIF diff --git a/i18npool/inc/breakiterator_ctl.hxx b/i18npool/inc/breakiterator_ctl.hxx index 9e753e8ae16f..3e687b5e8e68 100644 --- a/i18npool/inc/breakiterator_ctl.hxx +++ b/i18npool/inc/breakiterator_ctl.hxx @@ -58,6 +58,7 @@ protected: sal_Int32* nextCellIndex; sal_Int32* previousCellIndex; sal_Int32 cellIndexSize; + virtual void SAL_CALL makeIndex(const rtl::OUString& text, sal_Int32 pos) throw(com::sun::star::uno::RuntimeException); }; diff --git a/i18npool/inc/breakiterator_unicode.hxx b/i18npool/inc/breakiterator_unicode.hxx index 3a0720f27545..654df424b237 100644 --- a/i18npool/inc/breakiterator_unicode.hxx +++ b/i18npool/inc/breakiterator_unicode.hxx @@ -86,12 +86,16 @@ protected: const sal_Char *cBreakIterator, *wordRule, *lineRule; Boundary result; // for word break iterator - struct { + struct BI_Data { UnicodeString aICUText; icu::BreakIterator *aBreakIterator; + + BI_Data() : aICUText(), aBreakIterator(NULL) {} } character, word, sentence, line, *icuBI; + com::sun::star::lang::Locale aLocale; sal_Int16 aBreakType, aWordType; + void SAL_CALL loadICUBreakIterator(const com::sun::star::lang::Locale& rLocale, sal_Int16 rBreakType, sal_Int16 rWordType, const sal_Char* name, const rtl::OUString& rText) throw(com::sun::star::uno::RuntimeException); }; diff --git a/i18npool/inc/defaultnumberingprovider.hxx b/i18npool/inc/defaultnumberingprovider.hxx index f3f8082eef55..2bfc9e707d69 100644 --- a/i18npool/inc/defaultnumberingprovider.hxx +++ b/i18npool/inc/defaultnumberingprovider.hxx @@ -53,6 +53,7 @@ class DefaultNumberingProvider : public cppu::WeakImplHelper4 void GetCharStrN( sal_Int32 nValue, sal_Int16 nType, rtl::OUString& rStr ) const; void GetCharStr( sal_Int32 nValue, sal_Int16 nType, rtl::OUString& rStr ) const; void GetRomanString( sal_Int32 nValue, sal_Int16 nType, rtl::OUString& rStr ) const; + void impl_loadTranslit(); public: DefaultNumberingProvider( const com::sun::star::uno::Reference < com::sun::star::lang::XMultiServiceFactory >& xMSF ); diff --git a/i18npool/inc/i18npool/lang.h b/i18npool/inc/i18npool/lang.h index 68ae24bc2c21..eaf7eb9c2ea8 100644 --- a/i18npool/inc/i18npool/lang.h +++ b/i18npool/inc/i18npool/lang.h @@ -501,5 +501,7 @@ typedef unsigned short LanguageType; #define LANGUAGE_USER_ARABIC_PALESTINE 0x9801 /* makeLangID( 0x26, getPrimaryLanguage( LANGUAGE_ARABIC_SAUDI_ARABIA)) */ #define LANGUAGE_USER_ARABIC_SOMALIA 0x9C01 /* makeLangID( 0x27, getPrimaryLanguage( LANGUAGE_ARABIC_SAUDI_ARABIA)) */ #define LANGUAGE_USER_ARABIC_SUDAN 0xA001 /* makeLangID( 0x28, getPrimaryLanguage( LANGUAGE_ARABIC_SAUDI_ARABIA)) */ +#define LANGUAGE_USER_ANCIENT_GREEK 0x0649 +#define LANGUAGE_USER_ASTURIAN 0x064A #endif /* INCLUDED_I18NPOOL_LANG_H */ diff --git a/i18npool/inc/i18npool/mslangid.hxx b/i18npool/inc/i18npool/mslangid.hxx index 7cc5e6bd8926..27688cd995dc 100644 --- a/i18npool/inc/i18npool/mslangid.hxx +++ b/i18npool/inc/i18npool/mslangid.hxx @@ -216,6 +216,9 @@ public: static LanguageType getRealLanguageWithoutConfig( LanguageType nLang ); + static LanguageType resolveSystemLanguageByScriptType( LanguageType nLang, sal_Int16 nType ); + + /** Whether locale has a Right-To-Left orientation. */ static bool isRightToLeft( LanguageType nLang ); @@ -246,6 +249,9 @@ public: configuration! */ static void setConfiguredSystemLanguage( LanguageType nLang ); static void setConfiguredSystemUILanguage( LanguageType nLang ); + static void setConfiguredWesternFallback( LanguageType nLang ); + static void setConfiguredComplexFallback( LanguageType nLang ); + static void setConfiguredAsianFallback( LanguageType nLang ); // --------------------------------------------------------------------------- @@ -274,6 +280,10 @@ private: static LanguageType nConfiguredSystemLanguage; static LanguageType nConfiguredSystemUILanguage; + static LanguageType nConfiguredWesternFallback; + static LanguageType nConfiguredAsianFallback; + static LanguageType nConfiguredComplexFallback; + static LanguageType getPlatformSystemLanguage(); static LanguageType getPlatformSystemUILanguage(); diff --git a/i18npool/inc/i18npool/paper.hxx b/i18npool/inc/i18npool/paper.hxx new file mode 100644 index 000000000000..5690a8fe7254 --- /dev/null +++ b/i18npool/inc/i18npool/paper.hxx @@ -0,0 +1,155 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * + * $Revision$ + * + * last change: $Author$ $Date$ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + ************************************************************************/ + +#ifndef INCLUDED_I18NPOOL_PAPER_HXX +#define INCLUDED_I18NPOOL_PAPER_HXX + +#include + +#include "i18npool/i18npooldllapi.h" +#include +#include + +enum Paper +{ + PAPER_A0, + PAPER_A1, + PAPER_A2, + PAPER_A3, + PAPER_A4, + PAPER_A5, + PAPER_B4_ISO, + PAPER_B5_ISO, + PAPER_LETTER, + PAPER_LEGAL, + PAPER_TABLOID, + PAPER_USER, + PAPER_B6_ISO, + PAPER_ENV_C4, + PAPER_ENV_C5, + PAPER_ENV_C6, + PAPER_ENV_C65, + PAPER_ENV_DL, + PAPER_SLIDE_DIA, + PAPER_SCREEN, + PAPER_C, + PAPER_D, + PAPER_E, + PAPER_EXECUTIVE, + PAPER_FANFOLD_LEGAL_DE, + PAPER_ENV_MONARCH, + PAPER_ENV_PERSONAL, + PAPER_ENV_9, + PAPER_ENV_10, + PAPER_ENV_11, + PAPER_ENV_12, + PAPER_KAI16, + PAPER_KAI32, + PAPER_KAI32BIG, + PAPER_B4_JIS, + PAPER_B5_JIS, + PAPER_B6_JIS, + PAPER_LEDGER, + PAPER_STATEMENT, + PAPER_QUARTO, + PAPER_10x14, + PAPER_ENV_14, + PAPER_ENV_C3, + PAPER_ENV_ITALY, + PAPER_FANFOLD_US, + PAPER_FANFOLD_DE, + PAPER_POSTCARD_JP, + PAPER_9x11, + PAPER_10x11, + PAPER_15x11, + PAPER_ENV_INVITE, + PAPER_A_PLUS, + PAPER_B_PLUS, + PAPER_LETTER_PLUS, + PAPER_A4_PLUS, + PAPER_DOUBLEPOSTCARD_JP, + PAPER_A6, + PAPER_12x11, + PAPER_A7, + PAPER_A8, + PAPER_A9, + PAPER_A10, + PAPER_B0_ISO, + PAPER_B1_ISO, + PAPER_B2_ISO, + PAPER_B3_ISO, + PAPER_B7_ISO, + PAPER_B8_ISO, + PAPER_B9_ISO, + PAPER_B10_ISO, + PAPER_ENV_C2, + PAPER_ENV_C7, + PAPER_ENV_C8, + PAPER_ARCHA, + PAPER_ARCHB, + PAPER_ARCHC, + PAPER_ARCHD, + PAPER_ARCHE +}; + +// --------- +// - Paper - +// --------- + +class I18NPOOL_DLLPUBLIC PaperInfo +{ + Paper m_eType; + long m_nPaperWidth; // width in 100thMM + long m_nPaperHeight; // height in 100thMM +public: + PaperInfo(Paper eType); + PaperInfo(long nPaperWidth, long nPaperHeight); + + Paper getPaper() const { return m_eType; } + long getWidth() const { return m_nPaperWidth; } + long getHeight() const { return m_nPaperHeight; } + bool sloppyEqual(const PaperInfo &rOther) const; + bool doSloppyFit(); + + static PaperInfo getSystemDefaultPaper(); + static PaperInfo getDefaultPaperForLocale(const ::com::sun::star::lang::Locale & rLocale); + + static Paper fromPSName(const rtl::OString &rName); + static rtl::OString toPSName(Paper eType); + + static long sloppyFitPageDimension(long nDimension); +}; + +#endif // INCLUDED_I18NPOOL_PAPER_HXX diff --git a/i18npool/inc/xdictionary.hxx b/i18npool/inc/xdictionary.hxx index 32ffdbbfe377..ac2005c9f397 100644 --- a/i18npool/inc/xdictionary.hxx +++ b/i18npool/inc/xdictionary.hxx @@ -45,11 +45,13 @@ namespace com { namespace sun { namespace star { namespace i18n { // cache structure. struct WordBreakCache { - sal_Bool equals(const sal_Unicode *str, Boundary& boundary); // checking cached string sal_Int32 length; // contents length saved here. sal_Unicode *contents; // seperated segment contents. sal_Int32* wordboundary; // word boundaries in segments. sal_Int32 size; // size of wordboundary + + WordBreakCache(); + sal_Bool equals(const sal_Unicode *str, Boundary& boundary); // checking cached string }; class xdictionary @@ -85,9 +87,9 @@ public: private: WordBreakCache cache[CACHE_MAX]; - sal_Bool seekSegment(const sal_Unicode *text, sal_Int32 pos, sal_Int32 len, Boundary& boundary); + sal_Bool seekSegment(const rtl::OUString& rText, sal_Int32 pos, Boundary& boundary); WordBreakCache& getCache(const sal_Unicode *text, Boundary& boundary); - sal_Bool exists(const sal_Unicode u); + sal_Bool exists(const sal_uInt32 u); sal_Int32 getLongestMatch(const sal_Unicode *text, sal_Int32 len); }; diff --git a/i18npool/prj/build.lst b/i18npool/prj/build.lst index 98fec96d0149..24e9607596ac 100644 --- a/i18npool/prj/build.lst +++ b/i18npool/prj/build.lst @@ -9,6 +9,7 @@ inp i18npool\source\transliteration nmake - all inp_translit inp inp i18npool\source\isolang nmake - all inp_isolang inp_inc NULL inp i18npool\source\localedata nmake - all inp_localedata inp_isolang inp_inc NULL inp i18npool\source\localedata\data nmake - all inp_locdata_data inp_localedata inp_inc NULL +inp i18npool\source\paper nmake - all inp_paper inp_isolang inp_inc NULL inp i18npool\source\calendar nmake - all inp_cal inp_inc NULL inp i18npool\source\numberformatcode nmake - all inp_numformat inp_inc NULL inp i18npool\source\defaultnumberingprovider nmake - all inp_dnum inp_inc NULL @@ -22,4 +23,4 @@ inp i18npool\source\textconversion nmake - all inp_textconversi inp i18npool\source\textconversion\data nmake - all inp_textconv_dict inp_textconversion inp_inc NULL inp i18npool\source\search nmake - all inp_search inp_inc NULL inp i18npool\source\ordinalsuffix nmake - all inp_ordinalsuffix NULL -inp i18npool\util nmake - all inp_util inp_brkit inp_dict inp_chclass inp_translit inp_cal inp_dnum inp_natnum inp_localedata inp_locdata_data inp_numformat inp_rserv inp_index inp_index_data inp_collator inp_collator_data inp_inputchecker inp_textconversion inp_textconv_dict inp_search inp_isolang inp_ordinalsuffix NULL +inp i18npool\util nmake - all inp_util inp_brkit inp_dict inp_chclass inp_translit inp_cal inp_dnum inp_natnum inp_localedata inp_locdata_data inp_numformat inp_rserv inp_index inp_index_data inp_collator inp_collator_data inp_inputchecker inp_textconversion inp_textconv_dict inp_search inp_isolang inp_paper inp_ordinalsuffix NULL diff --git a/i18npool/prj/d.lst b/i18npool/prj/d.lst index 052ad4d23273..54aefa732b89 100644 --- a/i18npool/prj/d.lst +++ b/i18npool/prj/d.lst @@ -40,3 +40,9 @@ mkdir: %_DEST%\inc%_EXT%\i18npool ..\%__SRC%\bin\i18nisol*.dll %_DEST%\bin%_EXT%\i18nisol*.dll ..\%__SRC%\lib\libi18nisolang*.so %_DEST%\lib%_EXT%\libi18nisolang*.so ..\%__SRC%\lib\libi18nisolang*.dylib %_DEST%\lib%_EXT%\libi18nisolang*.dylib + +..\%__SRC%\lib\ii18npaper*.lib %_DEST%\lib%_EXT%\ii18npaper*.lib +..\%__SRC%\bin\i18npaper*.dll %_DEST%\bin%_EXT%\i18npaper*.dll +..\%__SRC%\lib\libi18npaper*.so %_DEST%\lib%_EXT%\libi18npaper*.so +..\%__SRC%\lib\libi18npaper*.dylib %_DEST%\lib%_EXT%\libi18npaper*.dylib + diff --git a/i18npool/source/breakiterator/breakiteratorImpl.cxx b/i18npool/source/breakiterator/breakiteratorImpl.cxx index 0eb4c20ca250..0a75e642f240 100644 --- a/i18npool/source/breakiterator/breakiteratorImpl.cxx +++ b/i18npool/source/breakiterator/breakiteratorImpl.cxx @@ -261,13 +261,29 @@ sal_Int16 SAL_CALL BreakIteratorImpl::getScriptType( const OUString& Text, sal_I getScriptClass(Text.iterateCodePoints(&nPos, 0)); } + +/** Increments/decrements position first, then obtains character. + @return current position, may be -1 or text length if string was consumed. + */ static sal_Int32 SAL_CALL iterateCodePoints(const OUString& Text, sal_Int32 &nStartPos, sal_Int32 inc, sal_uInt32& ch) { - if (nStartPos + inc < 0 || nStartPos + inc >= Text.getLength()) { + sal_Int32 nLen = Text.getLength(); + if (nStartPos + inc < 0 || nStartPos + inc >= nLen) { ch = 0; - nStartPos = nStartPos + inc < 0 ? -1 : Text.getLength(); + nStartPos = nStartPos + inc < 0 ? -1 : nLen; } else { ch = Text.iterateCodePoints(&nStartPos, inc); - if (inc > 0) ch = Text.iterateCodePoints(&nStartPos, 0); + // Fix for #i80436#. + // erAck: 2009-06-30T21:52+0200 This logic looks somewhat + // suspicious as if it cures a symptom.. anyway, had to add + // nStartPos < Text.getLength() to silence the (correct) assertion + // in rtl_uString_iterateCodePoints() if Text was one character + // (codepoint) only, made up of a surrogate pair. + //if (inc > 0 && nStartPos < Text.getLength()) + // ch = Text.iterateCodePoints(&nStartPos, 0); + // With surrogates, nStartPos may actually point behind string + // now, even if inc is only +1 + if (inc > 0) + ch = (nStartPos < nLen ? Text.iterateCodePoints(&nStartPos, 0) : 0); } return nStartPos; } diff --git a/i18npool/source/breakiterator/breakiterator_cjk.cxx b/i18npool/source/breakiterator/breakiterator_cjk.cxx index 3d684b8788df..9d690469067a 100644 --- a/i18npool/source/breakiterator/breakiterator_cjk.cxx +++ b/i18npool/source/breakiterator/breakiterator_cjk.cxx @@ -46,7 +46,9 @@ namespace com { namespace sun { namespace star { namespace i18n { // class BreakIterator_CJK // ----------------------------------------------------; -BreakIterator_CJK::BreakIterator_CJK() : dict(NULL) +BreakIterator_CJK::BreakIterator_CJK() : + dict( NULL ), + hangingCharacters() { cBreakIterator = "com.sun.star.i18n.BreakIterator_CJK"; } @@ -110,13 +112,13 @@ LineBreakResults SAL_CALL BreakIterator_CJK::getLineBreak( if (bOptions.allowPunctuationOutsideMargin && hangingCharacters.indexOf(Text[nStartPos]) != -1 && - ++nStartPos == Text.getLength()) { + (Text.iterateCodePoints( &nStartPos, 1), nStartPos == Text.getLength())) { ; // do nothing } else if (bOptions.applyForbiddenRules && 0 < nStartPos && nStartPos < Text.getLength()) { while (nStartPos > 0 && (bOptions.forbiddenBeginCharacters.indexOf(Text[nStartPos]) != -1 || bOptions.forbiddenEndCharacters.indexOf(Text[nStartPos-1]) != -1)) - nStartPos--; + Text.iterateCodePoints( &nStartPos, -1); } lbr.breakIndex = nStartPos; diff --git a/i18npool/source/breakiterator/breakiterator_ctl.cxx b/i18npool/source/breakiterator/breakiterator_ctl.cxx index a42014615f1a..0e1bee869cac 100644 --- a/i18npool/source/breakiterator/breakiterator_ctl.cxx +++ b/i18npool/source/breakiterator/breakiterator_ctl.cxx @@ -45,11 +45,14 @@ namespace com { namespace sun { namespace star { namespace i18n { /** * Constructor. */ -BreakIterator_CTL::BreakIterator_CTL() +BreakIterator_CTL::BreakIterator_CTL() : + cachedText(), + nextCellIndex( NULL ), + previousCellIndex( NULL ), + cellIndexSize( 512 ) { cBreakIterator = "com.sun.star.i18n.BreakIterator_CTL"; // to improve performance, alloc big enough memory in construct. - cellIndexSize = 512; nextCellIndex = (sal_Int32*) calloc(cellIndexSize, sizeof(sal_Int32)); previousCellIndex = (sal_Int32*) calloc(cellIndexSize, sizeof(sal_Int32)); memset(nextCellIndex, 0, cellIndexSize * sizeof(sal_Int32)); diff --git a/i18npool/source/breakiterator/breakiterator_unicode.cxx b/i18npool/source/breakiterator/breakiterator_unicode.cxx index b832bb02e7e9..f0710c996858 100644 --- a/i18npool/source/breakiterator/breakiterator_unicode.cxx +++ b/i18npool/source/breakiterator/breakiterator_unicode.cxx @@ -51,20 +51,23 @@ namespace com { namespace sun { namespace star { namespace i18n { #define ERROR ::com::sun::star::uno::RuntimeException() -#define ImplementName "com.sun.star.i18n.BreakIterator_Unicode"; +//#define ImplementName "com.sun.star.i18n.BreakIterator_Unicode"; -BreakIterator_Unicode::BreakIterator_Unicode() +BreakIterator_Unicode::BreakIterator_Unicode() : + cBreakIterator( "com.sun.star.i18n.BreakIterator_Unicode" ), // implementation name + wordRule( "word" ), + lineRule( "line" ), + result(), + character(), + word(), + sentence(), + line(), + icuBI( NULL ), + aLocale(), + aBreakType(), + aWordType() { - wordRule="word"; - lineRule="line"; - character.aBreakIterator=word.aBreakIterator=sentence.aBreakIterator=line.aBreakIterator=NULL; - character.aICUText=UnicodeString(); - word.aICUText=UnicodeString(); - sentence.aICUText=UnicodeString(); - line.aICUText=UnicodeString(); - cBreakIterator = ImplementName; - icuBI=NULL; } diff --git a/i18npool/source/breakiterator/data/dict_word.txt b/i18npool/source/breakiterator/data/dict_word.txt index 4c5c80823041..367a82db9e6f 100644 --- a/i18npool/source/breakiterator/data/dict_word.txt +++ b/i18npool/source/breakiterator/data/dict_word.txt @@ -34,7 +34,8 @@ $ALetter = [\u0002 [:Alphabetic:] [:name= COMMERCIAL AT:] [:name= HEBREW PUNCT $MidLetter = [[:name = APOSTROPHE:] [:name = GRAVE ACCENT:] \u0084 [:name = SOFT HYPHEN:] [:name = MIDDLE DOT:] [:name = GREEK TONOS:] [:name= FULL STOP:] [:name = HEBREW PUNCTUATION GERSHAYIM:] [:name = DOUBLE VERTICAL LINE:] [:name = LEFT SINGLE QUOTATION MARK:] - [:name = RIGHT SINGLE QUOTATION MARK:] [:name = HYPHENATION POINT:] [:name = PRIME:] ]; + [:name = RIGHT SINGLE QUOTATION MARK:] [:name = HYPHENATION POINT:] [:name = PRIME:] + [:name = HYPHEN-MINUS:] [:name = EN DASH:] [:name = EM DASH:] ]; $SufixLetter = [:name= FULL STOP:]; diff --git a/i18npool/source/breakiterator/data/dict_word_dash.txt b/i18npool/source/breakiterator/data/dict_word_nodash.txt similarity index 98% rename from i18npool/source/breakiterator/data/dict_word_dash.txt rename to i18npool/source/breakiterator/data/dict_word_nodash.txt index 7f861c7911ca..4c5c80823041 100644 --- a/i18npool/source/breakiterator/data/dict_word_dash.txt +++ b/i18npool/source/breakiterator/data/dict_word_nodash.txt @@ -34,8 +34,7 @@ $ALetter = [\u0002 [:Alphabetic:] [:name= COMMERCIAL AT:] [:name= HEBREW PUNCT $MidLetter = [[:name = APOSTROPHE:] [:name = GRAVE ACCENT:] \u0084 [:name = SOFT HYPHEN:] [:name = MIDDLE DOT:] [:name = GREEK TONOS:] [:name= FULL STOP:] [:name = HEBREW PUNCTUATION GERSHAYIM:] [:name = DOUBLE VERTICAL LINE:] [:name = LEFT SINGLE QUOTATION MARK:] - [:name = RIGHT SINGLE QUOTATION MARK:] [:name = HYPHENATION POINT:] [:name = PRIME:] - [:name = HYPHEN-MINUS:] [:name = EN DASH:] ]; + [:name = RIGHT SINGLE QUOTATION MARK:] [:name = HYPHENATION POINT:] [:name = PRIME:] ]; $SufixLetter = [:name= FULL STOP:]; diff --git a/i18npool/source/breakiterator/data/dict_word_prepostdash.txt b/i18npool/source/breakiterator/data/dict_word_prepostdash.txt new file mode 100644 index 000000000000..1bf94451fae2 --- /dev/null +++ b/i18npool/source/breakiterator/data/dict_word_prepostdash.txt @@ -0,0 +1,157 @@ +# +# Copyright (C) 2002-2003, International Business Machines Corporation and others. +# All Rights Reserved. +# +# file: dict_word.txt +# +# ICU Word Break Rules +# See Unicode Standard Annex #29. +# These rules are based on Version 4.0.0, dated 2003-04-17 +# + + + +#################################################################################### +# +# Character class definitions from TR 29 +# +#################################################################################### +$Katakana = [[:Script = KATAKANA:] [:name = KATAKANA-HIRAGANA PROLONGED SOUND MARK:] + [:name = HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK:] + [:name = HALFWIDTH KATAKANA VOICED SOUND MARK:] + [:name = HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK:]]; + +$Ideographic = [:Ideographic:]; +$Hangul = [:Script = HANGUL:]; + +# list of dashes or hyphens that should be accepted as part of the word if a single one of these +# pre- or postfixes a word. E.g. in German: "Arbeits-" or "-nehmer" where that hyphen needs to +# be part of the word in order to have it properly spell checked etc. +$PrePostDashHyphen = [ [:name = HYPHEN-MINUS:] [:name = EN DASH:] [:name = EM DASH:] ]; + + +$ALetter = [\u0002 [:Alphabetic:] [:name= COMMERCIAL AT:] [:name= HEBREW PUNCTUATION GERESH:] + - $Ideographic + - $Katakana + - $Hangul + - [:Script = Thai:] + - [:Script = Lao:] + - [:Script = Hiragana:]]; + +$MidLetter = [[:name = APOSTROPHE:] [:name = GRAVE ACCENT:] \u0084 [:name = SOFT HYPHEN:] [:name = MIDDLE DOT:] [:name = GREEK TONOS:] [:name= FULL STOP:] + [:name = HEBREW PUNCTUATION GERSHAYIM:] [:name = DOUBLE VERTICAL LINE:] [:name = LEFT SINGLE QUOTATION MARK:] + [:name = RIGHT SINGLE QUOTATION MARK:] [:name = HYPHENATION POINT:] [:name = PRIME:] + [:name = HYPHEN-MINUS:] [:name = EN DASH:] [:name = EM DASH:] ]; + +$SufixLetter = [:name= FULL STOP:]; + + +$MidNum = [[:LineBreak = Infix_Numeric:] [:name= COMMERCIAL AT:] \u0084 [:name = GREEK TONOS:] [:name = ARABIC DECIMAL SEPARATOR:] + [:name = LEFT SINGLE QUOTATION MARK:] [:name = RIGHT SINGLE QUOTATION MARK:] [:name = SINGLE HIGH-REVERSED-9 QUOTATION MARK:] + [:name = PRIME:]]; +$Numeric = [:LineBreak = Numeric:]; + + +$TheZWSP = \u200b; + +# +# Character Class Definitions. +# The names are those from TR29. +# +$CR = \u000d; +$LF = \u000a; +$Control = [[[:Zl:] [:Zp:] [:Cc:] [:Cf:]] - $TheZWSP]; +$Extend = [[:Grapheme_Extend = TRUE:]]; + + + + +#################################################################################### +# +# Word Break Rules. Definitions and Rules specific to word break begin Here. +# +#################################################################################### + +$Format = [[:Cf:] - $TheZWSP]; + + + +# Rule 3: Treat a grapheme cluster as if it were a single character. +# Hangul Syllables are easier to deal with here than they are in Grapheme Clusters +# because we don't need to find the boundaries between adjacent syllables - +# they won't be word boundaries. +# + + +# +# "Extended" definitions. Grapheme Cluster + Format Chars, treated like the base char. +# +$ALetterEx = $ALetter $Extend*; +$NumericEx = $Numeric $Extend*; +$MidNumEx = $MidNum $Extend*; +$MidLetterEx = $MidLetter $Extend*; +$SufixLetterEx= $SufixLetter $Extend*; +$KatakanaEx = $Katakana $Extend*; +$IdeographicEx= $Ideographic $Extend*; +$HangulEx = $Hangul $Extend*; +$FormatEx = $Format $Extend*; + + +# +# Numbers. Rules 8, 11, 12 form the TR. +# +$NumberSequence = $NumericEx ($FormatEx* $MidNumEx? $FormatEx* $NumericEx)*; +$NumberSequence {100}; + +# +# Words. Alpha-numerics. Rule 5, 6, 7, 9, 10 +# - must include at least one letter. +# - may include both letters and numbers. +# - may include MideLetter, MidNumber punctuation. +# +# At most one leading or trailing dash/hyphen should be accepted as well. +# E.g. in German: "Arbeits-" or "-nehmer" where that hyphen needs to +# be part of the word in order to have it properly spell checked etc. +$LetterSequence = $PrePostDashHyphen? $ALetterEx ($FormatEx* $MidLetterEx? $FormatEx* $ALetterEx)* $PrePostDashHyphen?; # rules #6, #7 +($NumberSequence $FormatEx*)? $LetterSequence ($FormatEx* ($NumberSequence | $LetterSequence))* $SufixLetterEx? {200}; + +[[:P:][:S:]]*; + +# +# Do not break between Katakana. Rule #13. +# +$KatakanaEx ($FormatEx* $KatakanaEx)* {300}; +[:Hiragana:] $Extend* {300}; + +# +# Ideographic Characters. Stand by themselves as words. +# Separated from the "Everything Else" rule, below, only so that they +# can be tagged with a return value. TODO: is this what we want? +# +$IdeographicEx ($FormatEx* $IdeographicEx)* {400}; +$HangulEx ($FormatEx* $HangulEx)* {400}; + +# +# Everything Else, with no tag. +# Non-Control chars combine with $Extend (combining) chars. +# Controls are do not. +# +[^$Control [:Ideographic:]] $Extend*; +$CR $LF; + +# +# Reverse Rules. Back up over any of the chars that can group together. +# (Reverse rules do not need to be exact; they can back up too far, +# but must back up at least enough, and must stop on a boundary.) +# + +# NonStarters are the set of all characters that can appear at the 2nd - nth position of +# a word. (They may also be the first.) The reverse rule skips over these, until it +# reaches something that can only be the start (and probably only) char in a "word". +# A space or punctuation meets the test. +# +$NonStarters = [$Numeric $ALetter $Katakana $Ideographic $Hangul [:P:] [:S:] $MidLetter $MidNum $SufixLetter $Extend $Format]; + +#!.*; +! ($NonStarters* | \n \r) .; + diff --git a/i18npool/source/breakiterator/makefile.mk b/i18npool/source/breakiterator/makefile.mk index 7ba9cd3e753d..50e437e98b91 100644 --- a/i18npool/source/breakiterator/makefile.mk +++ b/i18npool/source/breakiterator/makefile.mk @@ -93,7 +93,7 @@ $(MISC)$/%_brk.c : $(MISC)$/%.brk # The output of gencmn generates warnings under Windows. We want to minimize the patches to external tools, # so the output (OpenOffice_icu_dat.c) is changed here to include a pragma to disable the warnings. # Output of gencmn is redirected to OpenOffice_icu_tmp.c with the -t switch. -$(MISC)$/OpenOffice_%.c : +$(MISC)$/OpenOffice_%.c : $(MY_BRK_BRKFILES:s/.brk/_brk.c/) $(WRAPCMD) $(GENCMN) -n OpenOffice -t tmp -S -d $(MISC) O $(mktmp $(subst,$(MISC)$/, $(MY_BRK_BRKFILES:t"\n"))) echo $(USQ)#ifdef _MSC_VER$(USQ) > $@ echo $(USQ)#pragma warning( disable : 4229 4668 )$(USQ) >> $@ diff --git a/i18npool/source/breakiterator/xdictionary.cxx b/i18npool/source/breakiterator/xdictionary.cxx index fb832f0b6468..add22f39d58e 100644 --- a/i18npool/source/breakiterator/xdictionary.cxx +++ b/i18npool/source/breakiterator/xdictionary.cxx @@ -54,7 +54,21 @@ namespace com { namespace sun { namespace star { namespace i18n { extern "C" { static void SAL_CALL thisModule() {} } -xdictionary::xdictionary(const sal_Char *lang) +xdictionary::xdictionary(const sal_Char *lang) : + existMark( NULL ), + index1( NULL ), + index2( NULL ), + lenArray( NULL ), + dataArea( NULL ), + hModule( NULL ), + boundary(), + japaneseWordBreak( sal_False ) +#if USE_CELL_BOUNDARY_CODE + // For CTL breakiterator, where the word boundary should not be inside cell. + , + useCellBoundary( sal_False ), + cellBoundary( NULL ) +#endif { index1 = 0; #ifdef SAL_DLLPREFIX @@ -92,6 +106,7 @@ xdictionary::xdictionary(const sal_Char *lang) #if USE_CELL_BOUNDARY_CODE useCellBoundary = sal_False; + cellBoundary = NULL; #endif japaneseWordBreak = sal_False; } @@ -111,8 +126,9 @@ void xdictionary::setJapaneseWordBreak() japaneseWordBreak = sal_True; } -sal_Bool xdictionary::exists(const sal_Unicode c) { - sal_Bool exist = existMark ? sal::static_int_cast((existMark[c>>3] & (1<<(c&0x07))) != 0) : sal_False; +sal_Bool xdictionary::exists(const sal_uInt32 c) { + // 0x1FFF is the hardcoded limit in gendict for existMarks + sal_Bool exist = (existMark && ((c>>3) < 0x1FFF)) ? sal::static_int_cast((existMark[c>>3] & (1<<(c&0x07))) != 0) : sal_False; if (!exist && japaneseWordBreak) return BreakIteratorImpl::getScriptClass(c) == ScriptType::ASIAN; else @@ -149,6 +165,19 @@ sal_Int32 xdictionary::getLongestMatch(const sal_Unicode* str, sal_Int32 sLen) { return 0; } + +/* + * c-tor + */ + +WordBreakCache::WordBreakCache() : + length( 0 ), + contents( NULL ), + wordboundary( NULL ), + size( 0 ) +{ +} + /* * Compare two unicode string, */ @@ -169,20 +198,35 @@ sal_Bool WordBreakCache::equals(const sal_Unicode* str, Boundary& boundary) { * @param pos : Position of the given character. * @return true if CJK. */ -sal_Bool xdictionary::seekSegment(const sal_Unicode *text, sal_Int32 pos, - sal_Int32 len, Boundary& segBoundary) { - for (segBoundary.startPos = pos - 1; - segBoundary.startPos >= 0 && - (u_isWhitespace((sal_uInt32)text[segBoundary.startPos]) || exists(text[segBoundary.startPos])); - segBoundary.startPos--) ; - segBoundary.startPos++; +sal_Bool xdictionary::seekSegment(const rtl::OUString &rText, sal_Int32 pos, + Boundary& segBoundary) +{ + sal_Int32 indexUtf16; + segBoundary.endPos = segBoundary.startPos = pos; - for (segBoundary.endPos = pos; - segBoundary.endPos < len && - (u_isWhitespace((sal_uInt32)text[segBoundary.endPos]) || exists(text[segBoundary.endPos])); - segBoundary.endPos++) ; + indexUtf16 = pos; + while (indexUtf16 > 0) + { + sal_uInt32 ch = rText.iterateCodePoints(&indexUtf16, -1); + if (u_isWhitespace(ch) || exists(ch)) + segBoundary.startPos = indexUtf16; + else + break; + } - return segBoundary.endPos > segBoundary.startPos + 1; + indexUtf16 = pos; + while (indexUtf16 < rText.getLength()) + { + sal_uInt32 ch = rText.iterateCodePoints(&indexUtf16, 1); + if (u_isWhitespace(ch) || exists(ch)) + segBoundary.endPos = indexUtf16; + else + break; + } + + indexUtf16 = segBoundary.startPos; + rText.iterateCodePoints(&indexUtf16, 1); + return segBoundary.endPos > indexUtf16; } #define KANJA 1 @@ -312,19 +356,24 @@ Boundary xdictionary::getWordBoundary(const OUString& rText, sal_Int32 anyPos, s sal_Int32 len=rText.getLength(); if (anyPos >= len || anyPos < 0) { boundary.startPos = boundary.endPos = anyPos < 0 ? 0 : len; - } else if (seekSegment(text, anyPos, len, boundary)) { // character in dict + } else if (seekSegment(rText, anyPos, boundary)) { // character in dict WordBreakCache& aCache = getCache(text, boundary); sal_Int32 i = 0; - while (aCache.wordboundary[i] <= (sal_Int32)anyPos - boundary.startPos) i++; + while (aCache.wordboundary[i] <= anyPos - boundary.startPos) i++; sal_Int32 startPos = aCache.wordboundary[i - 1]; // if bDirection is false - if (!bDirection && startPos > 0 && startPos == (anyPos - boundary.startPos) && - u_isWhitespace((sal_uInt32) text[anyPos - 1])) - i--; - boundary.endPos = aCache.wordboundary[i] + boundary.startPos; - boundary.startPos += aCache.wordboundary[i - 1]; + if (!bDirection && startPos > 0 && startPos == (anyPos - boundary.startPos)) + { + sal_Int32 indexUtf16 = anyPos-1; + sal_uInt32 ch = rText.iterateCodePoints(&indexUtf16, 1); + if (u_isWhitespace(ch)) + i--; + } + boundary.endPos = boundary.startPos; + rText.iterateCodePoints(&boundary.endPos, aCache.wordboundary[i]); + rText.iterateCodePoints(&boundary.startPos, aCache.wordboundary[i-1]); } else { boundary.startPos = anyPos; if (anyPos < len) rText.iterateCodePoints(&anyPos, 1); @@ -332,8 +381,14 @@ Boundary xdictionary::getWordBoundary(const OUString& rText, sal_Int32 anyPos, s } if (wordType == WordType::WORD_COUNT) { // skip punctuation for word count. - while (boundary.endPos < len && u_ispunct((sal_uInt32)text[boundary.endPos])) - boundary.endPos++; + while (boundary.endPos < len) + { + sal_Int32 indexUtf16 = boundary.endPos; + if (u_ispunct(rText.iterateCodePoints(&indexUtf16, 1))) + boundary.endPos = indexUtf16; + else + break; + } } return boundary; diff --git a/i18npool/source/calendar/calendar_gregorian.cxx b/i18npool/source/calendar/calendar_gregorian.cxx index 96eee0772bc1..e52cd4938f2a 100644 --- a/i18npool/source/calendar/calendar_gregorian.cxx +++ b/i18npool/source/calendar/calendar_gregorian.cxx @@ -148,10 +148,42 @@ void SAL_CALL Calendar_gregorian::init(Era *_eraArray) { cCalendar = "com.sun.star.i18n.Calendar_gregorian"; + + // #i102356# With icu::Calendar::createInstance(UErrorCode) in a Thai + // th_TH system locale we accidentally used a Buddhist calendar. Though + // the ICU documentation says that should be the case only for + // th_TH_TRADITIONAL (and ja_JP_TRADITIONAL Gengou), a plain th_TH + // already triggers that behavior, ja_JP does not. Strange enough, + // passing a th_TH locale to the calendar creation doesn't trigger + // this. + // See also http://userguide.icu-project.org/datetime/calendar + + // Whatever ICU offers as the default calendar for a locale, ensure we + // have a Gregorian calendar as requested. + + /* XXX: with the current implementation the aLocale member variable is + * not set prior to loading a calendar from locale data. This + * creates an empty (root) locale for ICU, but at least the correct + * calendar is used. The language part must not be NULL (respectively + * not all, language and country and variant), otherwise the current + * default locale would be used again and the calendar keyword ignored. + * */ + icu::Locale aIcuLocale( "", NULL, NULL, "calendar=gregorian"); + UErrorCode status; - body = icu::Calendar::createInstance(status = U_ZERO_ERROR); + body = icu::Calendar::createInstance( aIcuLocale, status = U_ZERO_ERROR); if (!body || !U_SUCCESS(status)) throw ERROR; +#if 0 + { + icu::Locale loc; + loc = body->getLocale( ULOC_ACTUAL_LOCALE, status = U_ZERO_ERROR); + fprintf( stderr, "\nICU calendar actual locale: %s\n", loc.getName()); + loc = body->getLocale( ULOC_VALID_LOCALE, status = U_ZERO_ERROR); + fprintf( stderr, "ICU calendar valid locale: %s\n", loc.getName()); + } +#endif + eraArray=_eraArray; } @@ -499,8 +531,8 @@ void Calendar_gregorian::setValue() throw(RuntimeException) bool bNeedZone = !(fieldSet & (1 << CalendarFieldIndex::ZONE_OFFSET)); bool bNeedDST = !(fieldSet & (1 << CalendarFieldIndex::DST_OFFSET)); - sal_Int32 nZone1, nDST1, nYear, nMonth, nDay, nHour, nMinute, nSecond, nMilliSecond, nZone, nDST; - nZone1 = nDST1 = nZone = nDST = 0; + sal_Int32 nZone1, nDST1, nYear, nMonth, nDay, nHour, nMinute, nSecond, nMilliSecond, nZone0, nDST0; + nZone1 = nDST1 = nZone0 = nDST0 = 0; nYear = nMonth = nDay = nHour = nMinute = nSecond = nMilliSecond = -1; if ( bNeedZone || bNeedDST ) { @@ -549,19 +581,19 @@ void Calendar_gregorian::setValue() throw(RuntimeException) } if ( !(fieldSet & (1 << CalendarFieldIndex::ZONE_OFFSET)) ) { - nZone = body->get( UCAL_ZONE_OFFSET, status = U_ZERO_ERROR); + nZone0 = body->get( UCAL_ZONE_OFFSET, status = U_ZERO_ERROR); if ( !U_SUCCESS(status) ) - nZone = 0; + nZone0 = 0; } if ( !(fieldSet & (1 << CalendarFieldIndex::DST_OFFSET)) ) { - nDST = body->get( UCAL_DST_OFFSET, status = U_ZERO_ERROR); + nDST0 = body->get( UCAL_DST_OFFSET, status = U_ZERO_ERROR); if ( !U_SUCCESS(status) ) - nDST = 0; + nDST0 = 0; } // Submit values to obtain a time zone and DST corresponding to the date/time. - submitValues( nYear, nMonth, nDay, nHour, nMinute, nSecond, nMilliSecond, nZone, nDST); + submitValues( nYear, nMonth, nDay, nHour, nMinute, nSecond, nMilliSecond, nZone0, nDST0); DUMP_ICU_CAL_MSG(("%s\n","setValue() in bNeedZone||bNeedDST after submitValues()")); DUMP_I18N_CAL_MSG(("%s\n","setValue() in bNeedZone||bNeedDST after submitValues()")); @@ -573,7 +605,8 @@ void Calendar_gregorian::setValue() throw(RuntimeException) nDST1 = 0; } - // The original submission, may lead to a different zone/DST. + // The original submission, may lead to a different zone/DST and + // different date. submitFields(); DUMP_ICU_CAL_MSG(("%s\n","setValue() after original submission")); DUMP_I18N_CAL_MSG(("%s\n","setValue() after original submission")); @@ -587,7 +620,7 @@ void Calendar_gregorian::setValue() throw(RuntimeException) sal_Int32 nDST2 = body->get( UCAL_DST_OFFSET, status = U_ZERO_ERROR); if ( !U_SUCCESS(status) ) nDST2 = nDST1; - if ( nZone2 != nZone1 || nDST2 != nDST1 ) + if ( nZone0 != nZone1 || nZone2 != nZone1 || nDST0 != nDST1 || nDST2 != nDST1 ) { // Due to different DSTs, resulting date values may differ if // DST is onset at 00:00 and the very onsetRule date was @@ -595,6 +628,12 @@ void Calendar_gregorian::setValue() throw(RuntimeException) // is not what we want. // Resubmit all values, this time including DST => date 01:00 // Similar for zone differences. + // If already the first full submission with nZone0 and nDST0 + // lead to date-1 23:00, the original submission was based on + // that date if it wasn't a full date (nDST0 set, nDST1 not + // set, nDST2==nDST1). If it was January 1st without year we're + // even off by one year now. Resubmit all values including new + // DST => date 00:00. // Set field values accordingly in case they were used. if (!bNeedZone) diff --git a/i18npool/source/characterclassification/cclass_unicode_parser.cxx b/i18npool/source/characterclassification/cclass_unicode_parser.cxx index 27d6443a27fc..39e925cb7eb9 100644 --- a/i18npool/source/characterclassification/cclass_unicode_parser.cxx +++ b/i18npool/source/characterclassification/cclass_unicode_parser.cxx @@ -1038,7 +1038,7 @@ void cclass_Unicode::parseText( ParseResult& r, const OUString& rText, sal_Int32 if ( !xNatNumSup.is() ) { throw RuntimeException( OUString( -#ifndef PRODUCT +#ifdef DBG_UTIL RTL_CONSTASCII_USTRINGPARAM( "cclass_Unicode::parseText: can't instanciate " NATIVENUMBERSUPPLIER_SERVICENAME ) diff --git a/i18npool/source/collator/makefile.mk b/i18npool/source/collator/makefile.mk index bca1c00aa419..b38386d53de0 100644 --- a/i18npool/source/collator/makefile.mk +++ b/i18npool/source/collator/makefile.mk @@ -42,7 +42,7 @@ ENABLE_EXCEPTIONS=TRUE # --- Files -------------------------------------------------------- -txtlist:=$(shell @cd data && ls *.txt) +txtlist:=$(shell @cd data >& $(NULLDEV) && ls *.txt) LOCAL_RULE_LANGS:=$(uniq $(foreach,i,$(txtlist) $(i:s/-/_/:s/_/ /:1))) rules_dependencies:=$(foreach,i,$(txtlist) data$/$i) $(INCCOM)$/lrl_include.hxx diff --git a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx index 8979a5ffc203..91d856b19e62 100644 --- a/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx +++ b/i18npool/source/defaultnumberingprovider/defaultnumberingprovider.cxx @@ -39,11 +39,6 @@ #include #include -#if OSL_DEBUG_LEVEL == 0 && !defined(NDEBUG) -#define NDEBUG -#endif -#include - // Cyrillic upper case #define C_CYR_A "\xD0\x90" #define C_CYR_B "\xD0\x91" @@ -195,9 +190,9 @@ static sal_Unicode lowerLetter[] = { 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A }; -DefaultNumberingProvider::DefaultNumberingProvider( const Reference < XMultiServiceFactory >& xMSF ) : xSMgr(xMSF) +DefaultNumberingProvider::DefaultNumberingProvider( const Reference < XMultiServiceFactory >& xMSF ) : xSMgr(xMSF),translit(NULL) { - translit = new TransliterationImpl(xMSF); + } DefaultNumberingProvider::~DefaultNumberingProvider() @@ -205,6 +200,12 @@ DefaultNumberingProvider::~DefaultNumberingProvider() delete translit; } +void DefaultNumberingProvider::impl_loadTranslit() +{ + if ( !translit ) + translit = new TransliterationImpl(xSMgr); +} + Sequence< Reference > DefaultNumberingProvider::getDefaultOutlineNumberings(const Locale& rLocale ) throw(RuntimeException) { @@ -271,7 +272,7 @@ const char* expected_name( int i, int last ) else if( i==1 ) return "NumberingType"; else if( i==2 ) return "Suffix"; else if( i==last ) return "Value"; - else { assert(0); return ""; } + else { OSL_ASSERT(0); return ""; } } static const char* expected_type( int i, int last ) @@ -281,7 +282,7 @@ const char* expected_type( int i, int last ) else if( i==1 ) return "sal_Int16"; else if( i==2 ) return "OUString"; else if( i==last ) return "sal_Int32"; - else { assert(0); return ""; } + else { OSL_ASSERT(0); return ""; } } static void failedToConvert( int i, int last ) @@ -455,7 +456,7 @@ DefaultNumberingProvider::makeNumberingString( const SequenceA, 2=>B, ..., 26=>Z, 27=>AA, 28=>BB, ... @@ -468,12 +469,13 @@ DefaultNumberingProvider::makeNumberingString( const Sequence>= transliteration; + impl_loadTranslit(); translit->loadModuleByImplName(transliteration, aLocale); result += translit->transliterateString2String(tmp, 0, tmp.getLength()); } catch (Exception& ) { // When translteration property is missing, return default number (bug #101141#) result += OUString::valueOf( number ); - // assert(0); + // OSL_ASSERT(0); // throw IllegalArgumentException(); } break; @@ -667,7 +669,7 @@ DefaultNumberingProvider::makeNumberingString( const Sequence= 0x0500) // needs _run_ time differentiation though, not at compile time. -#if 0 getPlatformSystemLanguageImpl( nImplSystemUILanguage, &GetUserDefaultUILanguage, &GetSystemDefaultUILanguage); -#endif - getPlatformSystemLanguageImpl( nImplSystemUILanguage, - &GetUserDefaultLangID, &GetSystemDefaultLangID); return nImplSystemUILanguage; } diff --git a/i18npool/source/isolang/isolang.cxx b/i18npool/source/isolang/isolang.cxx index 74416df665a0..c321f62c95f9 100644 --- a/i18npool/source/isolang/isolang.cxx +++ b/i18npool/source/isolang/isolang.cxx @@ -331,9 +331,9 @@ static MsLangId::IsoLangEntry const aImplIsoLangEntries[] = { LANGUAGE_VENDA, "ven", "ZA" }, // 639-2 may have been used temporarily since 2004-07-23 { LANGUAGE_XHOSA, "xh", "ZA" }, { LANGUAGE_ZULU, "zu", "ZA" }, - { LANGUAGE_QUECHUA_BOLIVIA, "qu", "BO" }, { LANGUAGE_QUECHUA_ECUADOR, "qu", "EC" }, { LANGUAGE_QUECHUA_PERU, "qu", "PE" }, + { LANGUAGE_QUECHUA_BOLIVIA, "qu", "BO" }, // macro: quh-BO, qul-BO { LANGUAGE_PASHTO, "ps", "AF" }, { LANGUAGE_OROMO, "om", "ET" }, { LANGUAGE_DHIVEHI, "dv", "MV" }, @@ -446,6 +446,8 @@ static MsLangId::IsoLangEntry const aImplIsoLangEntries[] = { LANGUAGE_USER_TETUN_TIMOR_LESTE, "tet", "TL" }, { LANGUAGE_USER_TOK_PISIN, "tpi", "PG" }, { LANGUAGE_USER_SHUSWAP, "shs", "CA" }, + { LANGUAGE_USER_ANCIENT_GREEK, "grc", "GR" }, + { LANGUAGE_USER_ASTURIAN, "ast", "ES" }, { LANGUAGE_NONE, "zxx", "" }, // added to ISO 639-2 on 2006-01-11: Used to declare the absence of linguistic information { LANGUAGE_DONTKNOW, "", "" } // marks end of table }; diff --git a/i18npool/source/isolang/langid.pl b/i18npool/source/isolang/langid.pl index 40313c5cc707..f4852cc7197d 100755 --- a/i18npool/source/isolang/langid.pl +++ b/i18npool/source/isolang/langid.pl @@ -43,7 +43,7 @@ sub Usage() "\n", "langid - a hackish utility to lookup lang.h language defines and LangIDs,\n", "isolang.cxx ISO639/ISO3166 mapping, locale data files, langtab.src language\n", - "listbox entries, Langpack.ulf installer language and file_ooo.scp registry name.\n\n", + "listbox entries, postset.mk and file_ooo.scp registry name.\n\n", "Usage: $0 [--single] {language string} | {LangID} | {primarylanguage sublanguage} | {language-country}\n\n", @@ -104,11 +104,12 @@ sub makeLangID($$) } -sub grepFile($$$$$) +sub grepFile($$$$@) { - my( $regex, $modifier, $path, $module, $name) = @_; + my( $regex, $path, $module, $name, @addregex) = @_; my @result; my $found = 0; + my $arefound = ''; my $file; # Try module under current working directory first to catch local # modifications. A Not yet delivered lang.h is a special case. @@ -125,43 +126,51 @@ sub grepFile($$$$$) print "No $file\n"; $file = "$path/$module.lnk/$name"; if (!($found = open( IN, $file))) { - print "No $file either.\n"; } + print "No $file.\n"; + $file = "$path/$module.link/$name"; + if (!($found = open( IN, $file))) { + print "No $file either.\n"; } + } } } if ($found) { $found = 0; - if ($modifier eq "i") + while (my $line = ) { - while (my $line = ) + if ($line =~ /$regex/) { - if ($line =~ /$regex/i) + if (!$found) { - if (!$found) - { - $found = 1; - print "$file:\n"; - } - chomp( $line); - print "$line\n"; - push( @result, $line); + $found = 1; + print "$file:\n"; } + chomp( $line); + print "$line\n"; + push( @result, $line); } - } - else - { - while (my $line = ) + else { - if ($line =~ /$regex/) + for my $re (@addregex) { - if (!$found) + if ($re ne $arefound && $line =~ /$re/) { - $found = 1; - print "$file:\n"; + if ($arefound eq '') + { + $arefound = $re; + } + else + { + if (!$found) + { + $found = 1; + print "$file:\n"; + } + chomp( $line); + print "$line\n"; + push( @result, $line); + } } - chomp( $line); - print "$line\n"; - push( @result, $line); } } } @@ -214,16 +223,16 @@ sub main() Usage(); return 1; } - my $modifier = "i"; - my (@resultlist, @greplist, @lcidlist, $result); + my $modifier = "(?i)"; + my (@resultlist, @greplist, $result); # If no string was given on the command line, but value(s) were, lookup the # LangID value to obtain the define identifier. if ($grepdef) { # #define LANGUAGE_AFRIKAANS 0x0436 @resultlist = grepFile( - '^\s*#\s*define\s+[A-Z_]*' . $grepdef, $modifier, - $SOLENVINC, "i18npool", "lang.h"); + $modifier . '^\s*#\s*define\s+[A-Z_]*' . $grepdef, + $SOLENVINC, "i18npool", "lang.h", ()); } else { @@ -231,8 +240,8 @@ sub main() $lcid, $parts[0], $parts[1]); my $buf = sprintf( "0x%04X", $lcid); @resultlist = grepFile( - '^\s*#\s*define\s+\w+\s+' . $buf, "", - $SOLENVINC, "i18npool", "lang.h"); + '^\s*#\s*define\s+\w+\s+' . $buf, + $SOLENVINC, "i18npool", "lang.h", ()); } for $result (@resultlist) { @@ -260,8 +269,8 @@ sub main() $coun = uc($coun); # { LANGUAGE_AFRIKAANS, "af", "ZA" }, @resultlist = grepFile( - '^\s*\{\s*\w+\s*,\s*\"' . $lang . '\"\s*,\s*\"' . $coun . '\"\s*\}\s*,', "", - "$SRC_ROOT", "i18npool", "source/isolang/isolang.cxx"); + '^\s*\{\s*\w+\s*,\s*\"' . $lang . '\"\s*,\s*\"' . $coun . '\"\s*\}\s*,', + "$SRC_ROOT", "i18npool", "source/isolang/isolang.cxx", ()); for $result (@resultlist) { if ($result =~ /^\s*\{\s*(\w+)\s*,\s*\"\w+\"\s*,\s*\"(\w+)?\"\s*\}\s*,/) @@ -279,10 +288,13 @@ sub main() for $grepdef (@greplist) { print "\nUsing: " . $grepdef . "\n"; + + # Decimal LCID, was needed for Langpack.ulf but isn't used anymore, + # keep just in case we'd need it again. # #define LANGUAGE_AFRIKAANS 0x0436 @resultlist = grepFile( - '^\s*#\s*define\s+[A-Z_]*' . $grepdef, $modifier, - $SOLENVINC, "i18npool", "lang.h"); + $modifier . '^\s*#\s*define\s+[A-Z_]*' . $grepdef, + $SOLENVINC, "i18npool", "lang.h", ()); my @lcidlist; for $result (@resultlist) { @@ -295,8 +307,8 @@ sub main() # { LANGUAGE_AFRIKAANS, "af", "ZA" }, @resultlist = grepFile( - '^\s*\{\s*.*' . $grepdef . '.*\s*,\s*\".*\"\s*,\s*\".*\"\s*\}\s*,', $modifier, - "$SRC_ROOT", "i18npool", "source/isolang/isolang.cxx"); + $modifier . '^\s*\{\s*.*' . $grepdef . '.*\s*,\s*\".*\"\s*,\s*\".*\"\s*\}\s*,', + "$SRC_ROOT", "i18npool", "source/isolang/isolang.cxx", ()); my @langcoungreplist; for $result (@resultlist) @@ -322,7 +334,11 @@ sub main() if (!($found = open( LD, $file))) { $file = "$SRC_ROOT/i18npool.lnk/source/localedata/data/$loca.xml"; - $found = open( LD, $file); + if (!($found = open( LD, $file))) + { + $file = "$SRC_ROOT/i18npool.link/source/localedata/data/$loca.xml"; + $found = open( LD, $file); + } } if ($found) { @@ -346,8 +362,8 @@ sub main() # case LANGUAGE_ARABIC: grepFile( - '^\s*case\s*.*' . $grepdef . '.*\s*:', $modifier, - "$SRC_ROOT", "i18npool", "source/isolang/mslangid.cxx"); + $modifier . '^\s*case\s*.*' . $grepdef . '.*\s*:', + "$SRC_ROOT", "i18npool", "source/isolang/mslangid.cxx", ()); # With CWS 'langstatusbar' the language listbox resource file gets a new location. my $module = "svx"; @@ -359,28 +375,26 @@ sub main() # < "Afrikaans" ; LANGUAGE_AFRIKAANS ; > ; # lookup define @resultlist = grepFile( - '^\s*<\s*\".*\"\s*;\s*.*' . $grepdef . '.*\s*;\s*>\s*;', $modifier, - "$SRC_ROOT", $module, $name); + $modifier . '^\s*<\s*\".*\"\s*;\s*.*' . $grepdef . '.*\s*;\s*>\s*;', + "$SRC_ROOT", $module, $name, ()); # lookup string if (!@resultlist) { grepFile( - '^\s*<\s*\".*' . $grepdef . '.*\"\s*;\s*.*\s*;\s*>\s*;', $modifier, - "$SRC_ROOT", $module, $name); } - - for $lcid (@lcidlist) - { - # [OOO_LANGPACK_NAME_1033] - grepFile( - '^\s*\[OOO_LANGPACK_NAME_' . $lcid . '\]', "", - "$SRC_ROOT", "instsetoo_native", "inc_openoffice/windows/msi_languages/Langpack.ulf"); - } + $modifier . '^\s*<\s*\".*' . $grepdef . '.*\"\s*;\s*.*\s*;\s*>\s*;', + "$SRC_ROOT", $module, $name, ()); } for my $langcoun (@langcoungreplist) { # Name (xxx) = "/registry/spool/org/openoffice/Office/Common-ctl.xcu"; grepFile( - '^\s*Name\s*\(' . $langcoun . '\)\s*=', "", - "$SRC_ROOT", "scp2", "source/ooo/file_ooo.scp"); + '^\s*Name\s*\(' . $langcoun . '\)\s*=', + "$SRC_ROOT", "scp2", "source/ooo/file_ooo.scp", ()); + # completelangiso=af ar as-IN ... zu + grepFile( + '^\s*completelangiso\s*[= ](.{2,3}(-..)?)*' . $langcoun . '', + "$SRC_ROOT", "solenv", "inc/postset.mk", + # needs a duplicated pair of backslashes to produce a literal \\ + ('^\s*completelangiso\s*=', '^\s+' . $langcoun . '\s*\\\\*$')); } } return 0; diff --git a/i18npool/source/isolang/mslangid.cxx b/i18npool/source/isolang/mslangid.cxx index 070ddb9dc562..aab92d717429 100644 --- a/i18npool/source/isolang/mslangid.cxx +++ b/i18npool/source/isolang/mslangid.cxx @@ -41,6 +41,9 @@ LanguageType MsLangId::nConfiguredSystemLanguage = LANGUAGE_SYSTEM; LanguageType MsLangId::nConfiguredSystemUILanguage = LANGUAGE_SYSTEM; +LanguageType MsLangId::nConfiguredWesternFallback = LANGUAGE_SYSTEM; +LanguageType MsLangId::nConfiguredAsianFallback = LANGUAGE_SYSTEM; +LanguageType MsLangId::nConfiguredComplexFallback = LANGUAGE_SYSTEM; // static void MsLangId::setConfiguredSystemLanguage( LanguageType nLang ) @@ -55,6 +58,23 @@ void MsLangId::setConfiguredSystemUILanguage( LanguageType nLang ) nConfiguredSystemUILanguage = nLang; } +// static +void MsLangId::setConfiguredWesternFallback( LanguageType nLang ) +{ + nConfiguredWesternFallback = nLang; +} + +// static +void MsLangId::setConfiguredAsianFallback( LanguageType nLang ) +{ + nConfiguredAsianFallback = nLang; +} + +// static +void MsLangId::setConfiguredComplexFallback( LanguageType nLang ) +{ + nConfiguredComplexFallback = nLang; +} // static inline LanguageType MsLangId::simplifySystemLanguages( LanguageType nLang ) @@ -119,6 +139,40 @@ LanguageType MsLangId::getRealLanguage( LanguageType nLang ) } +// static +LanguageType MsLangId::resolveSystemLanguageByScriptType( LanguageType nLang, sal_Int16 nType ) +{ + if (nLang == LANGUAGE_NONE) + return nLang; + + nLang = getRealLanguage(nLang); + if (nType != ::com::sun::star::i18n::ScriptType::WEAK && getScriptType(nLang) != nType) + { + switch(nType) + { + case ::com::sun::star::i18n::ScriptType::ASIAN: + if (nConfiguredAsianFallback == LANGUAGE_SYSTEM) + nLang = LANGUAGE_CHINESE_SIMPLIFIED; + else + nLang = nConfiguredAsianFallback; + break; + case ::com::sun::star::i18n::ScriptType::COMPLEX: + if (nConfiguredComplexFallback == LANGUAGE_SYSTEM) + nLang = LANGUAGE_HINDI; + else + nLang = nConfiguredComplexFallback; + break; + default: + if (nConfiguredWesternFallback == LANGUAGE_SYSTEM) + nLang = LANGUAGE_ENGLISH_US; + else + nLang = nConfiguredWesternFallback; + break; + } + } + return nLang; +} + // static void MsLangId::convertLanguageToLocale( LanguageType nLang, ::com::sun::star::lang::Locale & rLocale ) @@ -211,10 +265,12 @@ bool MsLangId::isRightToLeft( LanguageType nLang ) { case LANGUAGE_ARABIC_SAUDI_ARABIA & LANGUAGE_MASK_PRIMARY : case LANGUAGE_HEBREW & LANGUAGE_MASK_PRIMARY : + case LANGUAGE_YIDDISH & LANGUAGE_MASK_PRIMARY : case LANGUAGE_URDU & LANGUAGE_MASK_PRIMARY : case LANGUAGE_FARSI & LANGUAGE_MASK_PRIMARY : case LANGUAGE_KASHMIRI & LANGUAGE_MASK_PRIMARY : case LANGUAGE_SINDHI & LANGUAGE_MASK_PRIMARY : + case LANGUAGE_UIGHUR_CHINA & LANGUAGE_MASK_PRIMARY : return true; default: @@ -281,6 +337,7 @@ sal_Int16 MsLangId::getScriptType( LanguageType nLang ) case LANGUAGE_BURMESE: case LANGUAGE_FARSI: case LANGUAGE_HEBREW: + case LANGUAGE_YIDDISH: case LANGUAGE_MARATHI: case LANGUAGE_PUNJABI: case LANGUAGE_GUJARATI: diff --git a/i18npool/source/localedata/LocaleNode.cxx b/i18npool/source/localedata/LocaleNode.cxx index 7596efc1087c..3f09e394a833 100644 --- a/i18npool/source/localedata/LocaleNode.cxx +++ b/i18npool/source/localedata/LocaleNode.cxx @@ -448,6 +448,11 @@ void LCCTYPENode::generateCode (const OFileWriter &of) const if (aListSep == aThoSep) fprintf( stderr, "Warning: %s\n", "ListSeparator equals ThousandSeparator."); + if (aListSep.getLength() != 1 || aListSep.getStr()[0] != ';') + { + incError( "ListSeparator not ';' semicolon. Strongly recommended. Currently required."); + ++nSavErr; // format codes not affected + } if (aTimeSep == aTime100Sep) ++nWarn, fprintf( stderr, "Warning: %s\n", "Time100SecSeparator equals TimeSeparator, this is probably an error."); @@ -1299,6 +1304,16 @@ void LCCalendarNode::generateCode (const OFileWriter &of) const delete []nbOfEras; } +bool isIso4217( const OUString& rStr ) +{ + const sal_Unicode* p = rStr.getStr(); + return rStr.getLength() == 3 + && 'A' <= p[0] && p[0] <= 'Z' + && 'A' <= p[1] && p[1] <= 'Z' + && 'A' <= p[2] && p[2] <= 'Z' + ; +} + void LCCurrencyNode :: generateCode (const OFileWriter &of) const { ::rtl::OUString useLocale = getAttr() -> getValueByName("ref"); @@ -1336,10 +1351,17 @@ void LCCurrencyNode :: generateCode (const OFileWriter &of) const } str = calNode -> findNode ("CurrencyID") -> getValue(); of.writeParameter("currencyID", str, nbOfCurrencies); + // CurrencyID MUST be ISO 4217. + if (!bLegacy && !isIso4217(str)) + incError( "CurrencyID is not ISO 4217"); str = calNode -> findNode ("CurrencySymbol") -> getValue(); of.writeParameter("currencySymbol", str, nbOfCurrencies); str = calNode -> findNode ("BankSymbol") -> getValue(); of.writeParameter("bankSymbol", str, nbOfCurrencies); + // BankSymbol currently must be ISO 4217. May change later if + // application always uses CurrencyID instead of BankSymbol. + if (!bLegacy && !isIso4217(str)) + incError( "BankSymbol is not ISO 4217"); str = calNode -> findNode ("CurrencyName") -> getValue(); of.writeParameter("currencyName", str, nbOfCurrencies); str = calNode -> findNode ("DecimalPlaces") -> getValue(); diff --git a/i18npool/source/localedata/data/ar_OM.xml b/i18npool/source/localedata/data/ar_OM.xml new file mode 100644 index 000000000000..935e736f7c29 --- /dev/null +++ b/i18npool/source/localedata/data/ar_OM.xml @@ -0,0 +1,357 @@ + + + + + + ar + Arabic, Omani Spoken + + + OM + Oman + + + + + / + , + . + : + . + ; + ، + ، + + + + + ' + ' + " + " + + ص + م + metric + + + + General + + + 0 + + + 0.00 + + + #,##0 + + + #,##0.00 + + + #,###.00 + + + 0.00E+00 + + + 0.00E+000 + + + 0% + + + 0.00% + + + [CURRENCY]#,##0;-#,##0 [CURRENCY] + + + [CURRENCY]#,##0.00;-#,##0.00 [CURRENCY] + + + [CURRENCY]#,##0;[RED]-#,##0 [CURRENCY] + + + [CURRENCY]#,##0.00;[RED]-#,##0.00 [CURRENCY] + + + CCC#,##0.00 + + + [CURRENCY]#,##0.--;[RED]-#,##0.-- [CURRENCY] + + + D/MM/YY + + + NNNNDD، MMMM YYYY + + + DD/MM/YY + + + DD/MM/YYYY + + + D، MMM YY + + + D، MMM YYYY + + + D، MMM YYYY + + + D، MMMM YYYY + + + D، MMMM YY + + + NN، DD/MMM/YY + + + NN، D، MMM YY + + + NN، D، MMMM YYYY + + + NNNND، MMMM YYYY + + + MM/DD + + + YY-MM-DD + ISO 8601 + + + YYYY-MM-DD + ISO 8601 + + + MM/YY + + + MMM/DD + + + MMMM + + + QQ YY + + + WW + + + HH:MM + + + HH:MM:SS + + + HH:MM AM/PM + + + HH:MM:SS AM/PM + + + [HH]:MM:SS + + + MM:SS.00 + + + [HH]:MM:SS.00 + + + DD/MM/YY HH:MM + + + DD/MM/YYYY HH:MM:SS AM/PM + + + + + + IGNORE_CASE + + + + + IGNORE_CASE + + + + أ-ي + 11 + يتبع + يتبع + + + + + + sun + الأحد + الأحد + + + mon + الإثنين + الإثنين + + + tue + الثلاثاء + الثلاثاء + + + wed + الأربعاء + الأربعاء + + + thu + الخميس + الخميس + + + fri + الجمعة + الجمعة + + + sat + السبت + السبت + + + + + jan + يانير + يانير + + + feb + فبراير + فبراير + + + mar + مارس + مارس + + + apr + أبريل + أبريل + + + may + مايو + مايو + + + jun + يونيو + يونيو + + + jul + يوليو + يوليو + + + aug + أغسطس + أغسطس + + + sep + سبتمبر + سبتمبر + + + oct + أكتوبر + أكتوبر + + + nov + نوفمبر + نوفمبر + + + dec + ديسمبر + ديسمبر + + + + + bc + ق.م + قبل الميلاد + + + ad + م + ميلادي + + + + sat + + 1 + + + + + OMR + ر.ع + OMR + ريال عماني + 2 + + + + + + + + + + صحيح + خاطئ + الربع الأول + الربع الثاني + الربع الثالث + الربع الرابع + فوق + تحت + الربع 1 + الربع 2 + الربع 3 + الربع 4 + + + + + + + + + + + + + + + diff --git a/i18npool/source/localedata/data/ast_ES.xml b/i18npool/source/localedata/data/ast_ES.xml new file mode 100644 index 000000000000..05c63601828a --- /dev/null +++ b/i18npool/source/localedata/data/ast_ES.xml @@ -0,0 +1,359 @@ + + + + + + ast + Asturian + + + ES + Spain + + + + + / + . + , + : + , + ; + , + , + + + + + + + + + + AM + PM + metric + + + + General + + + 0 + + + 0,00 + + + #.##0 + + + #.##0,00 + + + #.###,00 + + + 0,00E+00 + + + 0,00E+000 + + + 0% + + + 0,00% + + + [CURRENCY]#.##0;-[CURRENCY]#.##0 + + + [CURRENCY]#.##0,00;-[CURRENCY]#.##0,00 + + + [CURRENCY]#.##0;[RED]-[CURRENCY]#.##0 + + + [CURRENCY]#.##0,00;[RED]-[CURRENCY]#.##0,00 + + + CCC#.##0,00 + + + [CURRENCY]#.##0,--;[RED]-[CURRENCY]#.##0,-- + + + D/MM/YY + + + NNNNDD, MMMM YYYY + + + DD/MM/YY + + + DD/MM/YYYY + + + D, MMM YY + + + D, MMM YYYY + + + D, MMM YYYY + + + D, MMMM YYYY + + + D, MMMM YY + + + NN, DD/MMM/YY + + + NN, D, MMM YY + + + NN, D, MMMM YYYY + + + NNNND, MMMM YYYY + + + MM/DD + + + YY-MM-DD + ISO 8601 + + + YYYY-MM-DD + ISO 8601 + + + MM/YY + + + MMM/DD + + + MMMM + + + QQ YY + + + WW + + + HH:MM + + + HH:MM:SS + + + HH:MM AM/PM + + + HH:MM:SS AM/PM + + + [HH]:MM:SS + + + MM:SS,00 + + + [HH]:MM:SS,00 + + + DD/MM/YY HH:MM + + + DD/MM/YYYY HH:MM:SS AM/PM + + + + + + IGNORE_CASE + + + + + IGNORE_CASE + + + + A Á B-C {CH} D-E É F-H Ḥ I Í J-K L {ḶḶ} M-N Ñ O Ó P-U Ú Ü V-Z + 0 + 1 + 37 + s/páx + s/pxs + + + + + + sun + Dom + Domingu + + + mon + Llu + Llunes + + + tue + Mar + Martes + + + wed + Mié + Miércoles + + + thu + Xue + Xueves + + + fri + Vie + Vienres + + + sat + Sáb + Sábadu + + + + + jan + Xin + Xineru + + + feb + Feb + Febreru + + + mar + Mar + Marzu + + + apr + Abr + Abril + + + may + May + Mayu + + + jun + Xun + Xunu + + + jul + Xnt + Xunetu + + + aug + Ago + Agostu + + + sep + Set + Setiembre + + + oct + Och + Ochobre + + + nov + Pay + Payares + + + dec + Avi + Avientu + + + + + bc + edC + edC + + + ad + dC + dC + + + + mon + + 1 + + + + + EUR + + EUR + Euro + 2 + + + + + + + + + + Braero + Falso + 1er Trimestre + 2u Trimestre + 3er Trimestre + 4u Trimestre + arriba + abaxo + T1 + T2 + T3 + T4 + + + + + + + + + + + + + + + diff --git a/i18npool/source/localedata/data/az_AZ.xml b/i18npool/source/localedata/data/az_AZ.xml index ad96a38099e5..268aca4cd927 100644 --- a/i18npool/source/localedata/data/az_AZ.xml +++ b/i18npool/source/localedata/data/az_AZ.xml @@ -299,14 +299,17 @@ - + AZN man. AZN Manat 2 - + + AZM man. AZM diff --git a/i18npool/source/localedata/data/de_DE.xml b/i18npool/source/localedata/data/de_DE.xml index 295b826a5e9f..a83b3dbb791d 100644 --- a/i18npool/source/localedata/data/de_DE.xml +++ b/i18npool/source/localedata/data/de_DE.xml @@ -328,7 +328,14 @@ - + + + dict_word_prepostdash + + + + + wahr falsch 1. Quartal diff --git a/i18npool/source/localedata/data/gl_ES.xml b/i18npool/source/localedata/data/gl_ES.xml index d9e6344f0cb0..26d21e913da7 100644 --- a/i18npool/source/localedata/data/gl_ES.xml +++ b/i18npool/source/localedata/data/gl_ES.xml @@ -1,6 +1,6 @@ - + gl @@ -30,8 +30,8 @@ - AM - PM + a. m. + p. m. metric @@ -184,37 +184,37 @@ sun - do. + dom. domingo mon - lu. + lun. luns tue - ma. + mar. martes wed - me. + mér. mércores thu - xo. + xov. xoves fri - ve. + ven. venres sat - sa. + sáb. sábado @@ -231,7 +231,7 @@ mar - mar + mar. marzo @@ -241,13 +241,13 @@ may - mai + mai. maio jun - xun - xunio + xuñ. + xuño jul @@ -283,13 +283,13 @@ bc - A.C. - A.C. + a. C. + antes de Cristo ad - D.C. - D.C. + d. C. + despois de Cristo @@ -326,16 +326,16 @@ verdadeiro falso - 1er trimestre - 2on trimestre - 3er trimestre - 4rt trimestre + 1.º trimestre + 2.º trimestre + 3.º trimestre + 4.º trimestre enriba debaixo - T1 - T2 - T3 - T4 + 1T + 2T + 3T + 4T diff --git a/i18npool/source/localedata/data/locale.dtd b/i18npool/source/localedata/data/locale.dtd index 7d58023a064a..b9ee78f69e79 100644 --- a/i18npool/source/localedata/data/locale.dtd +++ b/i18npool/source/localedata/data/locale.dtd @@ -20,13 +20,13 @@ A second possiblity is: - temporarily change the DOCTYPE of your file to read (all on one line) - + - upload it to the form available at http://www.validome.org/ This will validate the file against the HEAD revision of locale.dtd, for - other revisions you'll have to specify the revision as in - http://l10n.openoffice.org/unbranded-source/browse/*checkout*/l10n/i18npool/source/localedata/data/locale.dtd?rev=1.14.4.3 + other revisions you'll have to specify the corresponding tags or cws branch + instead of trunk. Please test locale data files either in a non-product (!) build, which diff --git a/i18npool/source/localedata/data/localedata_euro.map b/i18npool/source/localedata/data/localedata_euro.map index 9b46fd2adfa5..1a28eb537bd5 100644 --- a/i18npool/source/localedata/data/localedata_euro.map +++ b/i18npool/source/localedata/data/localedata_euro.map @@ -1,6 +1,7 @@ OOO_1.1 { global: GetVersionInfo; +getAllCalendars_ast_ES; getAllCalendars_be_BY; getAllCalendars_bg_BG; getAllCalendars_br_FR; @@ -53,6 +54,7 @@ getAllCalendars_pt_BR; getAllCalendars_pt_PT; getAllCalendars_ro_RO; getAllCalendars_ru_RU; +getAllCalendars_sc_IT; getAllCalendars_sh_ME; getAllCalendars_sh_RS; getAllCalendars_sh_YU; @@ -66,6 +68,7 @@ getAllCalendars_sv_SE; getAllCalendars_tr_TR; getAllCalendars_uk_UA; getAllCalendars_wa_BE; +getAllCurrencies_ast_ES; getAllCurrencies_be_BY; getAllCurrencies_bg_BG; getAllCurrencies_br_FR; @@ -118,6 +121,7 @@ getAllCurrencies_pt_BR; getAllCurrencies_pt_PT; getAllCurrencies_ro_RO; getAllCurrencies_ru_RU; +getAllCurrencies_sc_IT; getAllCurrencies_sh_ME; getAllCurrencies_sh_RS; getAllCurrencies_sh_YU; @@ -131,6 +135,7 @@ getAllCurrencies_sv_SE; getAllCurrencies_tr_TR; getAllCurrencies_uk_UA; getAllCurrencies_wa_BE; +getAllFormats0_ast_ES; getAllFormats0_be_BY; getAllFormats0_bg_BG; getAllFormats0_br_FR; @@ -183,6 +188,7 @@ getAllFormats0_pt_BR; getAllFormats0_pt_PT; getAllFormats0_ro_RO; getAllFormats0_ru_RU; +getAllFormats0_sc_IT; getAllFormats0_sh_ME; getAllFormats0_sh_RS; getAllFormats0_sh_YU; @@ -196,6 +202,7 @@ getAllFormats0_sv_SE; getAllFormats0_tr_TR; getAllFormats0_uk_UA; getAllFormats0_wa_BE; +getBreakIteratorRules_ast_ES; getBreakIteratorRules_be_BY; getBreakIteratorRules_bg_BG; getBreakIteratorRules_br_FR; @@ -248,6 +255,7 @@ getBreakIteratorRules_pt_BR; getBreakIteratorRules_pt_PT; getBreakIteratorRules_ro_RO; getBreakIteratorRules_ru_RU; +getBreakIteratorRules_sc_IT; getBreakIteratorRules_sh_ME; getBreakIteratorRules_sh_RS; getBreakIteratorRules_sh_YU; @@ -261,6 +269,7 @@ getBreakIteratorRules_sv_SE; getBreakIteratorRules_tr_TR; getBreakIteratorRules_uk_UA; getBreakIteratorRules_wa_BE; +getCollationOptions_ast_ES; getCollationOptions_be_BY; getCollationOptions_bg_BG; getCollationOptions_br_FR; @@ -313,6 +322,7 @@ getCollationOptions_pt_BR; getCollationOptions_pt_PT; getCollationOptions_ro_RO; getCollationOptions_ru_RU; +getCollationOptions_sc_IT; getCollationOptions_sh_ME; getCollationOptions_sh_RS; getCollationOptions_sh_YU; @@ -326,6 +336,7 @@ getCollationOptions_sv_SE; getCollationOptions_tr_TR; getCollationOptions_uk_UA; getCollationOptions_wa_BE; +getCollatorImplementation_ast_ES; getCollatorImplementation_be_BY; getCollatorImplementation_bg_BG; getCollatorImplementation_br_FR; @@ -378,6 +389,7 @@ getCollatorImplementation_pt_BR; getCollatorImplementation_pt_PT; getCollatorImplementation_ro_RO; getCollatorImplementation_ru_RU; +getCollatorImplementation_sc_IT; getCollatorImplementation_sh_ME; getCollatorImplementation_sh_RS; getCollatorImplementation_sh_YU; @@ -391,6 +403,7 @@ getCollatorImplementation_sv_SE; getCollatorImplementation_tr_TR; getCollatorImplementation_uk_UA; getCollatorImplementation_wa_BE; +getContinuousNumberingLevels_ast_ES; getContinuousNumberingLevels_be_BY; getContinuousNumberingLevels_bg_BG; getContinuousNumberingLevels_br_FR; @@ -443,6 +456,7 @@ getContinuousNumberingLevels_pt_BR; getContinuousNumberingLevels_pt_PT; getContinuousNumberingLevels_ro_RO; getContinuousNumberingLevels_ru_RU; +getContinuousNumberingLevels_sc_IT; getContinuousNumberingLevels_sh_ME; getContinuousNumberingLevels_sh_RS; getContinuousNumberingLevels_sh_YU; @@ -456,6 +470,7 @@ getContinuousNumberingLevels_sv_SE; getContinuousNumberingLevels_tr_TR; getContinuousNumberingLevels_uk_UA; getContinuousNumberingLevels_wa_BE; +getFollowPageWords_ast_ES; getFollowPageWords_be_BY; getFollowPageWords_bg_BG; getFollowPageWords_br_FR; @@ -508,6 +523,7 @@ getFollowPageWords_pt_BR; getFollowPageWords_pt_PT; getFollowPageWords_ro_RO; getFollowPageWords_ru_RU; +getFollowPageWords_sc_IT; getFollowPageWords_sh_ME; getFollowPageWords_sh_RS; getFollowPageWords_sh_YU; @@ -521,6 +537,7 @@ getFollowPageWords_sv_SE; getFollowPageWords_tr_TR; getFollowPageWords_uk_UA; getFollowPageWords_wa_BE; +getForbiddenCharacters_ast_ES; getForbiddenCharacters_be_BY; getForbiddenCharacters_bg_BG; getForbiddenCharacters_br_FR; @@ -573,6 +590,7 @@ getForbiddenCharacters_pt_BR; getForbiddenCharacters_pt_PT; getForbiddenCharacters_ro_RO; getForbiddenCharacters_ru_RU; +getForbiddenCharacters_sc_IT; getForbiddenCharacters_sh_ME; getForbiddenCharacters_sh_RS; getForbiddenCharacters_sh_YU; @@ -586,6 +604,7 @@ getForbiddenCharacters_sv_SE; getForbiddenCharacters_tr_TR; getForbiddenCharacters_uk_UA; getForbiddenCharacters_wa_BE; +getIndexAlgorithm_ast_ES; getIndexAlgorithm_be_BY; getIndexAlgorithm_bg_BG; getIndexAlgorithm_br_FR; @@ -638,6 +657,7 @@ getIndexAlgorithm_pt_BR; getIndexAlgorithm_pt_PT; getIndexAlgorithm_ro_RO; getIndexAlgorithm_ru_RU; +getIndexAlgorithm_sc_IT; getIndexAlgorithm_sh_ME; getIndexAlgorithm_sh_RS; getIndexAlgorithm_sh_YU; @@ -651,6 +671,7 @@ getIndexAlgorithm_sv_SE; getIndexAlgorithm_tr_TR; getIndexAlgorithm_uk_UA; getIndexAlgorithm_wa_BE; +getLCInfo_ast_ES; getLCInfo_be_BY; getLCInfo_bg_BG; getLCInfo_br_FR; @@ -703,6 +724,7 @@ getLCInfo_pt_BR; getLCInfo_pt_PT; getLCInfo_ro_RO; getLCInfo_ru_RU; +getLCInfo_sc_IT; getLCInfo_sh_ME; getLCInfo_sh_RS; getLCInfo_sh_YU; @@ -716,6 +738,7 @@ getLCInfo_sv_SE; getLCInfo_tr_TR; getLCInfo_uk_UA; getLCInfo_wa_BE; +getLocaleItem_ast_ES; getLocaleItem_be_BY; getLocaleItem_bg_BG; getLocaleItem_br_FR; @@ -768,6 +791,7 @@ getLocaleItem_pt_BR; getLocaleItem_pt_PT; getLocaleItem_ro_RO; getLocaleItem_ru_RU; +getLocaleItem_sc_IT; getLocaleItem_sh_ME; getLocaleItem_sh_RS; getLocaleItem_sh_YU; @@ -781,6 +805,7 @@ getLocaleItem_sv_SE; getLocaleItem_tr_TR; getLocaleItem_uk_UA; getLocaleItem_wa_BE; +getOutlineNumberingLevels_ast_ES; getOutlineNumberingLevels_be_BY; getOutlineNumberingLevels_bg_BG; getOutlineNumberingLevels_br_FR; @@ -833,6 +858,7 @@ getOutlineNumberingLevels_pt_BR; getOutlineNumberingLevels_pt_PT; getOutlineNumberingLevels_ro_RO; getOutlineNumberingLevels_ru_RU; +getOutlineNumberingLevels_sc_IT; getOutlineNumberingLevels_sh_ME; getOutlineNumberingLevels_sh_RS; getOutlineNumberingLevels_sh_YU; @@ -846,6 +872,7 @@ getOutlineNumberingLevels_sv_SE; getOutlineNumberingLevels_tr_TR; getOutlineNumberingLevels_uk_UA; getOutlineNumberingLevels_wa_BE; +getReservedWords_ast_ES; getReservedWords_be_BY; getReservedWords_bg_BG; getReservedWords_br_FR; @@ -898,6 +925,7 @@ getReservedWords_pt_BR; getReservedWords_pt_PT; getReservedWords_ro_RO; getReservedWords_ru_RU; +getReservedWords_sc_IT; getReservedWords_sh_ME; getReservedWords_sh_RS; getReservedWords_sh_YU; @@ -911,6 +939,7 @@ getReservedWords_sv_SE; getReservedWords_tr_TR; getReservedWords_uk_UA; getReservedWords_wa_BE; +getSearchOptions_ast_ES; getSearchOptions_be_BY; getSearchOptions_bg_BG; getSearchOptions_br_FR; @@ -963,6 +992,7 @@ getSearchOptions_pt_BR; getSearchOptions_pt_PT; getSearchOptions_ro_RO; getSearchOptions_ru_RU; +getSearchOptions_sc_IT; getSearchOptions_sh_ME; getSearchOptions_sh_RS; getSearchOptions_sh_YU; @@ -976,6 +1006,7 @@ getSearchOptions_sv_SE; getSearchOptions_tr_TR; getSearchOptions_uk_UA; getSearchOptions_wa_BE; +getTransliterations_ast_ES; getTransliterations_be_BY; getTransliterations_bg_BG; getTransliterations_br_FR; @@ -1028,6 +1059,7 @@ getTransliterations_pt_BR; getTransliterations_pt_PT; getTransliterations_ro_RO; getTransliterations_ru_RU; +getTransliterations_sc_IT; getTransliterations_sh_ME; getTransliterations_sh_RS; getTransliterations_sh_YU; @@ -1041,6 +1073,7 @@ getTransliterations_sv_SE; getTransliterations_tr_TR; getTransliterations_uk_UA; getTransliterations_wa_BE; +getUnicodeScripts_ast_ES; getUnicodeScripts_be_BY; getUnicodeScripts_bg_BG; getUnicodeScripts_br_FR; @@ -1093,6 +1126,7 @@ getUnicodeScripts_pt_BR; getUnicodeScripts_pt_PT; getUnicodeScripts_ro_RO; getUnicodeScripts_ru_RU; +getUnicodeScripts_sc_IT; getUnicodeScripts_sh_ME; getUnicodeScripts_sh_RS; getUnicodeScripts_sh_YU; diff --git a/i18npool/source/localedata/data/localedata_others.map b/i18npool/source/localedata/data/localedata_others.map index 5e32d8bb4a1b..a8212624e8e8 100644 --- a/i18npool/source/localedata/data/localedata_others.map +++ b/i18npool/source/localedata/data/localedata_others.map @@ -6,6 +6,7 @@ getAllCalendars_ak_GH; getAllCalendars_am_ET; getAllCalendars_ar_EG; getAllCalendars_ar_LB; +getAllCalendars_ar_OM; getAllCalendars_ar_SA; getAllCalendars_ar_TN; getAllCalendars_az_AZ; @@ -44,6 +45,7 @@ getAllCalendars_my_MM; getAllCalendars_ne_NP; getAllCalendars_nr_ZA; getAllCalendars_nso_ZA; +getAllCalendars_om_ET; getAllCalendars_or_IN; getAllCalendars_pa_IN; getAllCalendars_rw_RW; @@ -62,6 +64,7 @@ getAllCalendars_tk_TM; getAllCalendars_tn_ZA; getAllCalendars_tpi_PG; getAllCalendars_ts_ZA; +getAllCalendars_ug_CN; getAllCalendars_uz_UZ; getAllCalendars_ve_ZA; getAllCalendars_vi_VN; @@ -78,6 +81,7 @@ getAllCurrencies_ak_GH; getAllCurrencies_am_ET; getAllCurrencies_ar_EG; getAllCurrencies_ar_LB; +getAllCurrencies_ar_OM; getAllCurrencies_ar_SA; getAllCurrencies_ar_TN; getAllCurrencies_az_AZ; @@ -116,6 +120,7 @@ getAllCurrencies_my_MM; getAllCurrencies_ne_NP; getAllCurrencies_nr_ZA; getAllCurrencies_nso_ZA; +getAllCurrencies_om_ET; getAllCurrencies_or_IN; getAllCurrencies_pa_IN; getAllCurrencies_rw_RW; @@ -134,6 +139,7 @@ getAllCurrencies_tk_TM; getAllCurrencies_tn_ZA; getAllCurrencies_tpi_PG; getAllCurrencies_ts_ZA; +getAllCurrencies_ug_CN; getAllCurrencies_uz_UZ; getAllCurrencies_ve_ZA; getAllCurrencies_vi_VN; @@ -150,6 +156,7 @@ getAllFormats0_ak_GH; getAllFormats0_am_ET; getAllFormats0_ar_EG; getAllFormats0_ar_LB; +getAllFormats0_ar_OM; getAllFormats0_ar_SA; getAllFormats0_ar_TN; getAllFormats0_az_AZ; @@ -188,6 +195,7 @@ getAllFormats0_my_MM; getAllFormats0_ne_NP; getAllFormats0_nr_ZA; getAllFormats0_nso_ZA; +getAllFormats0_om_ET; getAllFormats0_or_IN; getAllFormats0_pa_IN; getAllFormats0_rw_RW; @@ -206,6 +214,7 @@ getAllFormats0_tk_TM; getAllFormats0_tn_ZA; getAllFormats0_tpi_PG; getAllFormats0_ts_ZA; +getAllFormats0_ug_CN; getAllFormats0_uz_UZ; getAllFormats0_ve_ZA; getAllFormats0_vi_VN; @@ -222,6 +231,7 @@ getBreakIteratorRules_ak_GH; getBreakIteratorRules_am_ET; getBreakIteratorRules_ar_EG; getBreakIteratorRules_ar_LB; +getBreakIteratorRules_ar_OM; getBreakIteratorRules_ar_SA; getBreakIteratorRules_ar_TN; getBreakIteratorRules_az_AZ; @@ -260,6 +270,7 @@ getBreakIteratorRules_my_MM; getBreakIteratorRules_ne_NP; getBreakIteratorRules_nr_ZA; getBreakIteratorRules_nso_ZA; +getBreakIteratorRules_om_ET; getBreakIteratorRules_or_IN; getBreakIteratorRules_pa_IN; getBreakIteratorRules_rw_RW; @@ -278,6 +289,7 @@ getBreakIteratorRules_tk_TM; getBreakIteratorRules_tn_ZA; getBreakIteratorRules_tpi_PG; getBreakIteratorRules_ts_ZA; +getBreakIteratorRules_ug_CN; getBreakIteratorRules_uz_UZ; getBreakIteratorRules_ve_ZA; getBreakIteratorRules_vi_VN; @@ -294,6 +306,7 @@ getCollationOptions_ak_GH; getCollationOptions_am_ET; getCollationOptions_ar_EG; getCollationOptions_ar_LB; +getCollationOptions_ar_OM; getCollationOptions_ar_SA; getCollationOptions_ar_TN; getCollationOptions_az_AZ; @@ -332,6 +345,7 @@ getCollationOptions_my_MM; getCollationOptions_ne_NP; getCollationOptions_nr_ZA; getCollationOptions_nso_ZA; +getCollationOptions_om_ET; getCollationOptions_or_IN; getCollationOptions_pa_IN; getCollationOptions_rw_RW; @@ -350,6 +364,7 @@ getCollationOptions_tk_TM; getCollationOptions_tn_ZA; getCollationOptions_tpi_PG; getCollationOptions_ts_ZA; +getCollationOptions_ug_CN; getCollationOptions_uz_UZ; getCollationOptions_ve_ZA; getCollationOptions_vi_VN; @@ -366,6 +381,7 @@ getCollatorImplementation_ak_GH; getCollatorImplementation_am_ET; getCollatorImplementation_ar_EG; getCollatorImplementation_ar_LB; +getCollatorImplementation_ar_OM; getCollatorImplementation_ar_SA; getCollatorImplementation_ar_TN; getCollatorImplementation_az_AZ; @@ -404,6 +420,7 @@ getCollatorImplementation_my_MM; getCollatorImplementation_ne_NP; getCollatorImplementation_nr_ZA; getCollatorImplementation_nso_ZA; +getCollatorImplementation_om_ET; getCollatorImplementation_or_IN; getCollatorImplementation_pa_IN; getCollatorImplementation_rw_RW; @@ -422,6 +439,7 @@ getCollatorImplementation_tk_TM; getCollatorImplementation_tn_ZA; getCollatorImplementation_tpi_PG; getCollatorImplementation_ts_ZA; +getCollatorImplementation_ug_CN; getCollatorImplementation_uz_UZ; getCollatorImplementation_ve_ZA; getCollatorImplementation_vi_VN; @@ -438,6 +456,7 @@ getContinuousNumberingLevels_ak_GH; getContinuousNumberingLevels_am_ET; getContinuousNumberingLevels_ar_EG; getContinuousNumberingLevels_ar_LB; +getContinuousNumberingLevels_ar_OM; getContinuousNumberingLevels_ar_SA; getContinuousNumberingLevels_ar_TN; getContinuousNumberingLevels_az_AZ; @@ -476,6 +495,7 @@ getContinuousNumberingLevels_my_MM; getContinuousNumberingLevels_ne_NP; getContinuousNumberingLevels_nr_ZA; getContinuousNumberingLevels_nso_ZA; +getContinuousNumberingLevels_om_ET; getContinuousNumberingLevels_or_IN; getContinuousNumberingLevels_pa_IN; getContinuousNumberingLevels_rw_RW; @@ -494,6 +514,7 @@ getContinuousNumberingLevels_tk_TM; getContinuousNumberingLevels_tn_ZA; getContinuousNumberingLevels_tpi_PG; getContinuousNumberingLevels_ts_ZA; +getContinuousNumberingLevels_ug_CN; getContinuousNumberingLevels_uz_UZ; getContinuousNumberingLevels_ve_ZA; getContinuousNumberingLevels_vi_VN; @@ -510,6 +531,7 @@ getFollowPageWords_ak_GH; getFollowPageWords_am_ET; getFollowPageWords_ar_EG; getFollowPageWords_ar_LB; +getFollowPageWords_ar_OM; getFollowPageWords_ar_SA; getFollowPageWords_ar_TN; getFollowPageWords_az_AZ; @@ -548,6 +570,7 @@ getFollowPageWords_my_MM; getFollowPageWords_ne_NP; getFollowPageWords_nr_ZA; getFollowPageWords_nso_ZA; +getFollowPageWords_om_ET; getFollowPageWords_or_IN; getFollowPageWords_pa_IN; getFollowPageWords_rw_RW; @@ -566,6 +589,7 @@ getFollowPageWords_tk_TM; getFollowPageWords_tn_ZA; getFollowPageWords_tpi_PG; getFollowPageWords_ts_ZA; +getFollowPageWords_ug_CN; getFollowPageWords_uz_UZ; getFollowPageWords_ve_ZA; getFollowPageWords_vi_VN; @@ -582,6 +606,7 @@ getForbiddenCharacters_ak_GH; getForbiddenCharacters_am_ET; getForbiddenCharacters_ar_EG; getForbiddenCharacters_ar_LB; +getForbiddenCharacters_ar_OM; getForbiddenCharacters_ar_SA; getForbiddenCharacters_ar_TN; getForbiddenCharacters_az_AZ; @@ -620,6 +645,7 @@ getForbiddenCharacters_my_MM; getForbiddenCharacters_ne_NP; getForbiddenCharacters_nr_ZA; getForbiddenCharacters_nso_ZA; +getForbiddenCharacters_om_ET; getForbiddenCharacters_or_IN; getForbiddenCharacters_pa_IN; getForbiddenCharacters_rw_RW; @@ -638,6 +664,7 @@ getForbiddenCharacters_tk_TM; getForbiddenCharacters_tn_ZA; getForbiddenCharacters_tpi_PG; getForbiddenCharacters_ts_ZA; +getForbiddenCharacters_ug_CN; getForbiddenCharacters_uz_UZ; getForbiddenCharacters_ve_ZA; getForbiddenCharacters_vi_VN; @@ -654,6 +681,7 @@ getIndexAlgorithm_ak_GH; getIndexAlgorithm_am_ET; getIndexAlgorithm_ar_EG; getIndexAlgorithm_ar_LB; +getIndexAlgorithm_ar_OM; getIndexAlgorithm_ar_SA; getIndexAlgorithm_ar_TN; getIndexAlgorithm_az_AZ; @@ -692,6 +720,7 @@ getIndexAlgorithm_my_MM; getIndexAlgorithm_ne_NP; getIndexAlgorithm_nr_ZA; getIndexAlgorithm_nso_ZA; +getIndexAlgorithm_om_ET; getIndexAlgorithm_or_IN; getIndexAlgorithm_pa_IN; getIndexAlgorithm_rw_RW; @@ -710,6 +739,7 @@ getIndexAlgorithm_tk_TM; getIndexAlgorithm_tn_ZA; getIndexAlgorithm_tpi_PG; getIndexAlgorithm_ts_ZA; +getIndexAlgorithm_ug_CN; getIndexAlgorithm_uz_UZ; getIndexAlgorithm_ve_ZA; getIndexAlgorithm_vi_VN; @@ -726,6 +756,7 @@ getLCInfo_ak_GH; getLCInfo_am_ET; getLCInfo_ar_EG; getLCInfo_ar_LB; +getLCInfo_ar_OM; getLCInfo_ar_SA; getLCInfo_ar_TN; getLCInfo_az_AZ; @@ -764,6 +795,7 @@ getLCInfo_my_MM; getLCInfo_ne_NP; getLCInfo_nr_ZA; getLCInfo_nso_ZA; +getLCInfo_om_ET; getLCInfo_or_IN; getLCInfo_pa_IN; getLCInfo_rw_RW; @@ -782,6 +814,7 @@ getLCInfo_tk_TM; getLCInfo_tn_ZA; getLCInfo_tpi_PG; getLCInfo_ts_ZA; +getLCInfo_ug_CN; getLCInfo_uz_UZ; getLCInfo_ve_ZA; getLCInfo_vi_VN; @@ -798,6 +831,7 @@ getLocaleItem_ak_GH; getLocaleItem_am_ET; getLocaleItem_ar_EG; getLocaleItem_ar_LB; +getLocaleItem_ar_OM; getLocaleItem_ar_SA; getLocaleItem_ar_TN; getLocaleItem_az_AZ; @@ -836,6 +870,7 @@ getLocaleItem_my_MM; getLocaleItem_ne_NP; getLocaleItem_nr_ZA; getLocaleItem_nso_ZA; +getLocaleItem_om_ET; getLocaleItem_or_IN; getLocaleItem_pa_IN; getLocaleItem_rw_RW; @@ -854,6 +889,7 @@ getLocaleItem_tk_TM; getLocaleItem_tn_ZA; getLocaleItem_tpi_PG; getLocaleItem_ts_ZA; +getLocaleItem_ug_CN; getLocaleItem_uz_UZ; getLocaleItem_ve_ZA; getLocaleItem_vi_VN; @@ -870,6 +906,7 @@ getOutlineNumberingLevels_ak_GH; getOutlineNumberingLevels_am_ET; getOutlineNumberingLevels_ar_EG; getOutlineNumberingLevels_ar_LB; +getOutlineNumberingLevels_ar_OM; getOutlineNumberingLevels_ar_SA; getOutlineNumberingLevels_ar_TN; getOutlineNumberingLevels_az_AZ; @@ -908,6 +945,7 @@ getOutlineNumberingLevels_my_MM; getOutlineNumberingLevels_ne_NP; getOutlineNumberingLevels_nr_ZA; getOutlineNumberingLevels_nso_ZA; +getOutlineNumberingLevels_om_ET; getOutlineNumberingLevels_or_IN; getOutlineNumberingLevels_pa_IN; getOutlineNumberingLevels_rw_RW; @@ -926,6 +964,7 @@ getOutlineNumberingLevels_tk_TM; getOutlineNumberingLevels_tn_ZA; getOutlineNumberingLevels_tpi_PG; getOutlineNumberingLevels_ts_ZA; +getOutlineNumberingLevels_ug_CN; getOutlineNumberingLevels_uz_UZ; getOutlineNumberingLevels_ve_ZA; getOutlineNumberingLevels_vi_VN; @@ -942,6 +981,7 @@ getReservedWords_ak_GH; getReservedWords_am_ET; getReservedWords_ar_EG; getReservedWords_ar_LB; +getReservedWords_ar_OM; getReservedWords_ar_SA; getReservedWords_ar_TN; getReservedWords_az_AZ; @@ -980,6 +1020,7 @@ getReservedWords_my_MM; getReservedWords_ne_NP; getReservedWords_nr_ZA; getReservedWords_nso_ZA; +getReservedWords_om_ET; getReservedWords_or_IN; getReservedWords_pa_IN; getReservedWords_rw_RW; @@ -998,6 +1039,7 @@ getReservedWords_tk_TM; getReservedWords_tn_ZA; getReservedWords_tpi_PG; getReservedWords_ts_ZA; +getReservedWords_ug_CN; getReservedWords_uz_UZ; getReservedWords_ve_ZA; getReservedWords_vi_VN; @@ -1014,6 +1056,7 @@ getSearchOptions_ak_GH; getSearchOptions_am_ET; getSearchOptions_ar_EG; getSearchOptions_ar_LB; +getSearchOptions_ar_OM; getSearchOptions_ar_SA; getSearchOptions_ar_TN; getSearchOptions_az_AZ; @@ -1052,6 +1095,7 @@ getSearchOptions_my_MM; getSearchOptions_ne_NP; getSearchOptions_nr_ZA; getSearchOptions_nso_ZA; +getSearchOptions_om_ET; getSearchOptions_or_IN; getSearchOptions_pa_IN; getSearchOptions_rw_RW; @@ -1070,6 +1114,7 @@ getSearchOptions_tk_TM; getSearchOptions_tn_ZA; getSearchOptions_tpi_PG; getSearchOptions_ts_ZA; +getSearchOptions_ug_CN; getSearchOptions_uz_UZ; getSearchOptions_ve_ZA; getSearchOptions_vi_VN; @@ -1086,6 +1131,7 @@ getTransliterations_ak_GH; getTransliterations_am_ET; getTransliterations_ar_EG; getTransliterations_ar_LB; +getTransliterations_ar_OM; getTransliterations_ar_SA; getTransliterations_ar_TN; getTransliterations_az_AZ; @@ -1124,6 +1170,7 @@ getTransliterations_my_MM; getTransliterations_ne_NP; getTransliterations_nr_ZA; getTransliterations_nso_ZA; +getTransliterations_om_ET; getTransliterations_or_IN; getTransliterations_pa_IN; getTransliterations_rw_RW; @@ -1142,6 +1189,7 @@ getTransliterations_tk_TM; getTransliterations_tn_ZA; getTransliterations_tpi_PG; getTransliterations_ts_ZA; +getTransliterations_ug_CN; getTransliterations_uz_UZ; getTransliterations_ve_ZA; getTransliterations_vi_VN; @@ -1158,6 +1206,7 @@ getUnicodeScripts_ak_GH; getUnicodeScripts_am_ET; getUnicodeScripts_ar_EG; getUnicodeScripts_ar_LB; +getUnicodeScripts_ar_OM; getUnicodeScripts_ar_SA; getUnicodeScripts_ar_TN; getUnicodeScripts_az_AZ; @@ -1196,6 +1245,7 @@ getUnicodeScripts_my_MM; getUnicodeScripts_ne_NP; getUnicodeScripts_nr_ZA; getUnicodeScripts_nso_ZA; +getUnicodeScripts_om_ET; getUnicodeScripts_or_IN; getUnicodeScripts_pa_IN; getUnicodeScripts_rw_RW; @@ -1214,6 +1264,7 @@ getUnicodeScripts_tk_TM; getUnicodeScripts_tn_ZA; getUnicodeScripts_tpi_PG; getUnicodeScripts_ts_ZA; +getUnicodeScripts_ug_CN; getUnicodeScripts_uz_UZ; getUnicodeScripts_ve_ZA; getUnicodeScripts_vi_VN; diff --git a/i18npool/source/localedata/data/makefile.mk b/i18npool/source/localedata/data/makefile.mk index 3eca889e7ccc..9fc29c722fb2 100644 --- a/i18npool/source/localedata/data/makefile.mk +++ b/i18npool/source/localedata/data/makefile.mk @@ -76,6 +76,7 @@ MY_MISC_CXXFILES = \ $(MISC)$/localedata_ar_LB.cxx \ $(MISC)$/localedata_ar_SA.cxx \ $(MISC)$/localedata_ar_TN.cxx \ + $(MISC)$/localedata_ast_ES.cxx \ $(MISC)$/localedata_az_AZ.cxx \ $(MISC)$/localedata_be_BY.cxx \ $(MISC)$/localedata_bg_BG.cxx \ @@ -193,6 +194,7 @@ MY_MISC_CXXFILES = \ $(MISC)$/localedata_nr_ZA.cxx \ $(MISC)$/localedata_nso_ZA.cxx \ $(MISC)$/localedata_oc_FR.cxx \ + $(MISC)$/localedata_om_ET.cxx \ $(MISC)$/localedata_or_IN.cxx \ $(MISC)$/localedata_pa_IN.cxx \ $(MISC)$/localedata_pl_PL.cxx \ @@ -227,6 +229,7 @@ MY_MISC_CXXFILES = \ $(MISC)$/localedata_tpi_PG.cxx \ $(MISC)$/localedata_tr_TR.cxx \ $(MISC)$/localedata_ts_ZA.cxx \ + $(MISC)$/localedata_ug_CN.cxx \ $(MISC)$/localedata_uk_UA.cxx \ $(MISC)$/localedata_uz_UZ.cxx \ $(MISC)$/localedata_ve_ZA.cxx \ @@ -323,6 +326,7 @@ DEF3NAME=$(SHL3TARGET) SHL3STDLIBS= $(LINK_LOCALEDATA_EN_LIB) SHL3DEPN=$(SHL1TARGETN) $(SHL2TARGETN) SHL3OBJS= \ + $(SLO)$/localedata_ast_ES.obj \ $(SLO)$/localedata_be_BY.obj \ $(SLO)$/localedata_bg_BG.obj \ $(SLO)$/localedata_br_FR.obj \ @@ -375,6 +379,7 @@ SHL3OBJS= \ $(SLO)$/localedata_pt_PT.obj \ $(SLO)$/localedata_ru_RU.obj \ $(SLO)$/localedata_ro_RO.obj \ + $(SLO)$/localedata_sc_IT.obj \ $(SLO)$/localedata_sh_ME.obj \ $(SLO)$/localedata_sh_RS.obj \ $(SLO)$/localedata_sh_YU.obj \ @@ -412,6 +417,7 @@ SHL4OBJS= \ $(SLO)$/localedata_am_ET.obj \ $(SLO)$/localedata_ar_EG.obj \ $(SLO)$/localedata_ar_LB.obj \ + $(SLO)$/localedata_ar_OM.obj \ $(SLO)$/localedata_ar_SA.obj \ $(SLO)$/localedata_ar_TN.obj \ $(SLO)$/localedata_az_AZ.obj \ @@ -450,6 +456,7 @@ SHL4OBJS= \ $(SLO)$/localedata_ne_NP.obj \ $(SLO)$/localedata_nr_ZA.obj \ $(SLO)$/localedata_nso_ZA.obj \ + $(SLO)$/localedata_om_ET.obj \ $(SLO)$/localedata_or_IN.obj \ $(SLO)$/localedata_pa_IN.obj \ $(SLO)$/localedata_rw_RW.obj \ @@ -468,6 +475,7 @@ SHL4OBJS= \ $(SLO)$/localedata_tn_ZA.obj \ $(SLO)$/localedata_tpi_PG.obj \ $(SLO)$/localedata_ts_ZA.obj \ + $(SLO)$/localedata_ug_CN.obj \ $(SLO)$/localedata_uz_UZ.obj \ $(SLO)$/localedata_ve_ZA.obj \ $(SLO)$/localedata_vi_VN.obj \ diff --git a/i18npool/source/localedata/data/nl_NL.xml b/i18npool/source/localedata/data/nl_NL.xml index eedfdc146b5e..5a91c9c3e42e 100644 --- a/i18npool/source/localedata/data/nl_NL.xml +++ b/i18npool/source/localedata/data/nl_NL.xml @@ -360,20 +360,27 @@ - -waar -onwaar -1ste kwartaal -2de kwartaal -3de kwartaal -4de kwartaal -boven -onder -K1 -K2 -K3 -K4 - + + + dict_word_prepostdash + + + + + + waar + onwaar + 1ste kwartaal + 2de kwartaal + 3de kwartaal + 4de kwartaal + boven + onder + K1 + K2 + K3 + K4 + diff --git a/i18npool/source/localedata/data/oc_FR.xml b/i18npool/source/localedata/data/oc_FR.xml index 236f1c8dbb09..ef3dd47c0dc6 100644 --- a/i18npool/source/localedata/data/oc_FR.xml +++ b/i18npool/source/localedata/data/oc_FR.xml @@ -18,7 +18,7 @@ , : , - : + ; , de diff --git a/i18npool/source/localedata/data/om_ET.xml b/i18npool/source/localedata/data/om_ET.xml new file mode 100644 index 000000000000..88418fbb7ebb --- /dev/null +++ b/i18npool/source/localedata/data/om_ET.xml @@ -0,0 +1,358 @@ + + + + + + om + Oromo, West Central + + + ET + Ethiopia + + + + + / + , + . + : + . + ; + , + , + + + + + + + + + + AM + PM + metric + + + + General + + + 0 + + + 0.00 + + + #,##0 + + + #,##0.00 + + + #,###.00 + + + 0.00E+00 + + + 0.00E+000 + + + 0% + + + 0.00% + + + [CURRENCY]#,##0;([CURRENCY]#,##0) + + + [CURRENCY]#,##0.00;([CURRENCY]#,##0.00) + + + [CURRENCY]#,##0;[RED]([CURRENCY]#,##0) + + + [CURRENCY]#,##0.00;[RED]([CURRENCY]#,##0.00) + + + CCC#,##0.00 + + + [CURRENCY]#,##0.--;[RED]([CURRENCY]#,##0.--) + + + D/MM/YY + + + NNNNDD, MMMM YYYY + + + DD/MM/YY + + + DD/MM/YYYY + + + D, MMM YY + + + D, MMM YYYY + + + D, MMM YYYY + + + D, MMMM YYYY + + + D, MMMM YY + + + NN, DD/MMM/YY + + + NN, D, MMM YY + + + NN, D, MMMM YYYY + + + NNNND, MMMM YYYY + + + MM/DD + + + YY-MM-DD + ISO 8601 + + + YYYY-MM-DD + ISO 8601 + + + MM/YY + + + MMM/DD + + + MMMM + + + QQ YY + + + WW + + + HH:MM + + + HH:MM:SS + + + HH:MM AM/PM + + + HH:MM:SS AM/PM + + + [HH]:MM:SS + + + MM:SS.00 + + + [HH]:MM:SS.00 + + + DD/MM/YY HH:MM + + + DD/MM/YYYY HH:MM:SS AM/PM + + + + + + IGNORE_CASE + + + + + IGNORE_CASE + + + + A-Z + 0 + 1 + Fl + Flt + + + + + + sun + Dil + Dilbata + + + mon + Wix + Wiixata + + + tue + Kib + Kibxata + + + wed + Rob + Roobii + + + thu + Kam + Kamisa + + + fri + Jim + Jimaata + + + sat + San + Sanbat-Xiqqaa + + + + + jan + Amj + Amajjii + + + feb + Gur + Gurraandhala + + + mar + Bit + Bitootessa + + + apr + Cam + Caamsaa + + + may + Ebl + Ebla + + + jun + Wax + Waxabajjii + + + jul + Ado + Adoolessa + + + aug + Hag + Hagayya + + + sep + Ful + Fulbaana + + + oct + Onk + Onkoloolessa + + + nov + Sad + Sadaasa + + + dec + Mud + Muddee + + + + + bc + DKD + Dhaloota Kiristoosiin Dura + + + ad + DKB + Dhaloota Kiristoosiin Booda + + + + mon + + 1 + + + + + ETB + Qar + ETB + Qarshii + 2 + + + + + + + + + + Dhugaa + Soba + Bona + Arfaasaa + Ganna + Birraa + Gubbaa + Jala + Bn + Ar + Gn + Br + + + + + + + + + + + + + + + diff --git a/i18npool/source/localedata/data/pl_PL.xml b/i18npool/source/localedata/data/pl_PL.xml index 4119060ea7df..195689666247 100644 --- a/i18npool/source/localedata/data/pl_PL.xml +++ b/i18npool/source/localedata/data/pl_PL.xml @@ -326,13 +326,6 @@ - - - dict_word_dash - - - - prawda fałsz diff --git a/i18npool/source/localedata/data/ro_RO.xml b/i18npool/source/localedata/data/ro_RO.xml index b5033ce9bb27..ed92d9243cb6 100644 --- a/i18npool/source/localedata/data/ro_RO.xml +++ b/i18npool/source/localedata/data/ro_RO.xml @@ -1,380 +1,390 @@ - - - -ro -Romanian - - -RO -Romania - - - - -. -. -, -: -, -; - - - - - - - - - - - -AM -PM -Metric - - - -DD.MM.YYYY - - - -NN DD.MMM YYYY - - - -MM.YY - - - -DD MMM - - - -MMMM - - - -QQ/YY - - - -DD.MM.YYYY - - - -DD.MM.YY - - - -NNNND MMMM YYYY - - - -D MMM YY - - - -D MMM YYYY - - - -D MMMM YYYY - - - -NN D MMM YY - - - -NN D MMMM YYYY - - - -NNNND MMMM YYYY - - - -D. MMM. YYYY - - - -D. MMMM YYYY - - - -MM-DD - - - -YY-MM-DD -ISO 8601 - - -YYYY-MM-DD -ISO 8601 - - -WW - - - -HH:MM - - - -HH:MM:SS - - - -HH:MM AM/PM - - - -HH:MM:SS AM/PM - - - -[HH]:MM:SS - - - -MM:SS,00 - - - -[HH]:MM:SS,00 - - - -DD.MM.YY HH:MM - - - -DD.MM.YYYY HH:MM:SS - - - -Standard - - - -0 - - - -0,00 - - - -#.##0 - - - -#.##0,00 - - - -#.###,00 - - - -#.##0 [$lei-418];-#.##0 [$lei-418] - - - -#.##0,00 [$lei-418];-#.##0,00 [$lei-418] - - - -#.##0 [$lei-418];[RED]-#.##0 [$lei-418] - - - -#.##0,00 [$lei-418];[RED]-#.##0,00 [$lei-418] - - - -#.##0,00 CCC - - - -#.##0,-- [$lei-418];[RED]-#.##0,-- [$lei-418] - - - -0% - - - -0,00% - - - -0,00E+000 - - - -0,00E+00 - - - - - - -A Ă Â B-I Î J-S Ş T Ţ U-Z -0 -1 -2 -p. -pp. - - - - - -sun -D -duminică - - -mon -L -luni - - -tue -Ma -marţi - - -wed -Mi -miercuri - - -thu -J -joi - - -fri -V -vineri - - -sat -S -sâmbătă - - - - -jan -ian -ianuarie - - -feb -febr -februarie - - -mar -mar -martie - - -apr -apr -aprilie - - -may -mai -mai - - -jun -iun -iunie - - -jul -iul -iulie - - -aug -aug -august - - -sep -sept -septembrie - - -oct -oct -octombrie - - -nov -nov -noiembrie - - -dec -dec -decembrie - - - - -bc -î.Hr. -î.Hr. - - -ad -d.Hr. -d.Hr. - - - -mon - -1 - - - - -ROL -lei -ROL -Leu -2 - - - - - -adevărat -fals -trimestrul 1 -trimestrul 2 -trimestrul 3 -trimestrul 4 -deasupra -sub -T1 -T2 -T3 -T4 - - - - + + + + ro + Romanian + + + RO + Romania + + + + + . + . + , + : + , + ; + + + + + + + + + + + + AM + PM + Metric + + + + DD.MM.YYYY + + + + NN DD.MMM YYYY + + + + MM.YY + + + + DD MMM + + + + MMMM + + + + QQ/YY + + + + DD.MM.YYYY + + + + DD.MM.YY + + + + NNNND MMMM YYYY + + + + D MMM YY + + + + D MMM YYYY + + + + D MMMM YYYY + + + + NN D MMM YY + + + + NN D MMMM YYYY + + + + NNNND MMMM YYYY + + + + D. MMM. YYYY + + + + D. MMMM YYYY + + + + MM-DD + + + + YY-MM-DD + ISO 8601 + + + YYYY-MM-DD + ISO 8601 + + + WW + + + + HH:MM + + + + HH:MM:SS + + + + HH:MM AM/PM + + + + HH:MM:SS AM/PM + + + + [HH]:MM:SS + + + + MM:SS,00 + + + + [HH]:MM:SS,00 + + + + DD.MM.YY HH:MM + + + + DD.MM.YYYY HH:MM:SS + + + + Standard + + + + 0 + + + + 0,00 + + + + #.##0 + + + + #.##0,00 + + + + #.###,00 + + + + #.##0 [$lei-418];-#.##0 [$lei-418] + + + + #.##0,00 [$lei-418];-#.##0,00 [$lei-418] + + + + #.##0 [$lei-418];[RED]-#.##0 [$lei-418] + + + + #.##0,00 [$lei-418];[RED]-#.##0,00 [$lei-418] + + + + #.##0,00 CCC + + + + #.##0,-- [$lei-418];[RED]-#.##0,-- [$lei-418] + + + + 0% + + + + 0,00% + + + + 0,00E+000 + + + + 0,00E+00 + + + + + + + A Ă Â B-I Î J-S Ş T Ţ U-Z + 0 + 1 + 2 + p. + pp. + + + + + + sun + D + duminică + + + mon + L + luni + + + tue + Ma + marţi + + + wed + Mi + miercuri + + + thu + J + joi + + + fri + V + vineri + + + sat + S + sâmbătă + + + + + jan + ian + ianuarie + + + feb + febr + februarie + + + mar + mar + martie + + + apr + apr + aprilie + + + may + mai + mai + + + jun + iun + iunie + + + jul + iul + iulie + + + aug + aug + august + + + sep + sept + septembrie + + + oct + oct + octombrie + + + nov + nov + noiembrie + + + dec + dec + decembrie + + + + + bc + î.Hr. + î.Hr. + + + ad + d.Hr. + d.Hr. + + + + mon + + 1 + + + + + RON + lei + RON + Leu + 2 + + + + ROL + lei + ROL + Leu + 2 + + + + + + adevărat + fals + trimestrul 1 + trimestrul 2 + trimestrul 3 + trimestrul 4 + deasupra + sub + T1 + T2 + T3 + T4 + + + + diff --git a/i18npool/source/localedata/data/sc_IT.xml b/i18npool/source/localedata/data/sc_IT.xml new file mode 100644 index 000000000000..81b446995891 --- /dev/null +++ b/i18npool/source/localedata/data/sc_IT.xml @@ -0,0 +1,358 @@ + + + + + +sc +Sardinian + + +IT +Italy + + + + +/ +, +. +: +. +; +, +, + + + + + + + + + +a.m. +p.m. +metric + + + +General + + +0 + + +0.00 + + +#,##0 + + +#,##0.00 + + +#,###.00 + + +0.00E+00 + + +0.00E+000 + + +0% + + +0.00% + + +[CURRENCY] #,##0;-[CURRENCY] #,##0 + + +[CURRENCY] #,##0.00;-[CURRENCY] #,##0.00 + + +[CURRENCY] #,##0;[RED]-[CURRENCY] #,##0 + + +[CURRENCY] #,##0.00;[RED]-[CURRENCY] #,##0.00 + + +CCC #,##0.00 + + +[CURRENCY] #,##0.--;[RED]-[CURRENCY] #,##0.-- + + +D/MM/YY + + +NNNNDD, MMMM YYYY + + +DD/MM/YY + + +DD/MM/YYYY + + +D, MMM YY + + +D, MMM YYYY + + +D, MMM YYYY + + +D, MMMM YYYY + + +D, MMMM YY + + +NN, DD/MMM/YY + + +NN, D, MMM YY + + +NN, D, MMMM YYYY + + +NNNND, MMMM YYYY + + +MM/DD + + +YY-MM-DD +ISO 8601 + + +YYYY-MM-DD +ISO 8601 + + +MM/YY + + +MMM/DD + + +MMMM + + +QQ YY + + +WW + + +HH:MM + + +HH:MM:SS + + +HH:MM AM/PM + + +HH:MM:SS AM/PM + + +[HH]:MM:SS + + +MM:SS.00 + + +[HH]:MM:SS.00 + + +DD/MM/YY HH:MM + + +DD/MM/YYYY HH:MM:SS AM/PM + + + + + +IGNORE_CASE + + + + +IGNORE_CASE + + + +A-Z +0 +1 +s. +ss. + + + + + +sun +Dom +Domìniga + + +mon +Lun +Lunis + + +tue +Mar +Martis + + +wed +Mer +Mèrcuris + + +thu +Gio +Giòvia + + +fri +Che +Chenàbura + + +sat +Sab +Sàbadu + + + + +jan +Ghe +Ghennàrgiu + + +feb +Fre +Freàrgiu + + +mar +Mar +Martzu + + +apr +Abr +Abrile + + +may +Maj +Maju + + +jun +Làm +Làmpadas + + +jul +Trì +Trìulas + + +aug +Aus +Austu + + +sep +Cab +Cabudanni + + +oct +Sga +Santugaine + + +nov +San +Santandria + + +dec +Nad +Nadale + + + + +bc +a.C. +in antis de Cristos + + +ad +p.C. +a pustis de Cristos + + + +mon + +1 + + + + +EUR + +EUR +èuro +2 + + + + + + + + + +Beru +Farsu +Cuartu 1 +Cuartu 2 +Cuartu 3 +Cuartu 4 +Subra +Suta +C.tu 1 +C.tu 2 +C.tu 3 +C.tu 4 + + + + + + + + + + + + + + + diff --git a/i18npool/source/localedata/data/so_SO.xml b/i18npool/source/localedata/data/so_SO.xml index f5d666ec7e5a..981cb54aff3e 100644 --- a/i18npool/source/localedata/data/so_SO.xml +++ b/i18npool/source/localedata/data/so_SO.xml @@ -1,6 +1,6 @@  - + so @@ -13,12 +13,12 @@ - . -   + / + , . : . - , + ; , , @@ -30,11 +30,11 @@ - AM - PM + XH + XD metric - + General @@ -45,13 +45,13 @@ 0.00 - # ##0 + #,##0 - # ##0.00 + #,##0.00 - # ###.00 + #,###.00 0.00E+00 @@ -66,34 +66,34 @@ 0.00% - # ##0 [CURRENCY];-# ##0 [CURRENCY] + [CURRENCY]#,##0;-[CURRENCY]#,##0 - # ##0.00 [CURRENCY];-# ##0.00 [CURRENCY] + [CURRENCY]#,##0.00;-[CURRENCY]#,##0.00 - # ##0 [CURRENCY];[RED]-# ##0 [CURRENCY] + [CURRENCY]#,##0;[RED]-[CURRENCY]#,##0 - # ##0.00 [CURRENCY];[RED]-# ##0.00 [CURRENCY] + [CURRENCY]#,##0.00;[RED]-[CURRENCY]#,##0.00 - # ##0.00CCC + CCC#,##0.00 - # ##0.-- [CURRENCY];[RED]-# ##0.-- [CURRENCY] + [CURRENCY]#,##0.--;[RED]-[CURRENCY]#,##0.-- - D.MM.YY + D/MM/YY NNNNDD, MMMM YYYY - DD.MM.YY + DD/MM/YY - DD.MM.YYYY + DD/MM/YYYY D, MMM YY @@ -111,7 +111,7 @@ D, MMMM YY - NN, DD.MMM.YY + NN, DD/MMM/YY NN, D, MMM YY @@ -123,7 +123,7 @@ NNNND, MMMM YYYY - MM.DD + MM/DD YY-MM-DD @@ -134,10 +134,10 @@ ISO 8601 - MM.YY + MM/YY - MMM.DD + MMM/DD MMMM @@ -170,10 +170,10 @@ [HH]:MM:SS.00 - DD.MM.YY HH:MM + DD/MM/YY HH:MM - DD.MM.YYYY HH:MM:SS AM/PM + DD/MM/YYYY HH:MM:SS AM/PM @@ -191,15 +191,15 @@ A-Z 0 1 - bg. - bgg. + bg.s + bgg.s sun - Axd + Axa Axad @@ -215,7 +215,7 @@ wed Arb - Arbaco + Arboco thu @@ -247,7 +247,7 @@ mar Mar - Maarso + Marso apr @@ -256,18 +256,18 @@ may - Ma - Maajo + Maj + Majo jun Jun - Juun + Junyo jul - Lul - Luulyo + Jul + Julaayo aug @@ -277,7 +277,7 @@ sep Seb - Sebteembar + Sebtembar oct @@ -292,19 +292,19 @@ dec Dis - Diseembar + Disembar bc - CD - N. Ciise ka hor (CS) + CH + Ciise Hortiis ad - AD - N. Ciise Ka dib (CS) + CD + Ciise Dabadiis @@ -315,6 +315,13 @@ + SOS + Ssh + SOS + Shilin Soomaali + 2 + + SOS So. Sh. SOS @@ -331,27 +338,27 @@ Run Been - Rubaca kowaad - Rubaca labaad - Rubaca sadaxaad - Rubaca afaraad - ka kor - ka hoos - Q1 - Q2 - Q3 - Q4 + Afarmeeloodka 1aad + Afarmeeloodka 2aad + Afarmeeloodka 3aad + Afarmeeloodka 4aad + Kor + Hoos + AM1 + AM2 + AM3 + AM4 - - - - - - - - + + + + + + + + diff --git a/i18npool/source/localedata/data/sv_SE.xml b/i18npool/source/localedata/data/sv_SE.xml index 333690a0ef09..211f95c3e894 100644 --- a/i18npool/source/localedata/data/sv_SE.xml +++ b/i18npool/source/localedata/data/sv_SE.xml @@ -315,6 +315,13 @@ + + + dict_word_prepostdash + + + + sant falskt diff --git a/i18npool/source/localedata/data/ug_CN.xml b/i18npool/source/localedata/data/ug_CN.xml new file mode 100644 index 000000000000..b99f1f89a7ee --- /dev/null +++ b/i18npool/source/localedata/data/ug_CN.xml @@ -0,0 +1,364 @@ + + + + + + ug + Uyghur + + + CN + China + + + + + - + , + . + : + . + ; + , + , + + + + + » + « + + + + چ ب + چ ك + metric + + + + General + + + 0 + + + 0.00 + + + #,##0 + + + #,##0.00 + + + #,###.00 + + + 0.00E+00 + + + 0.00E+000 + + + 0% + + + 0.00% + + + [CURRENCY]#,##0;[CURRENCY]-#,##0 + + + [CURRENCY]#,##0.00;[CURRENCY]-#,##0.00 + + + [CURRENCY]#,##0;[RED][CURRENCY]-#,##0 + + + [CURRENCY]#,##0.00;[RED][CURRENCY]-#,##0.00 + + + CCC#,##0.00 + + + [CURRENCY]#,##0.--;[RED][CURRENCY]-#,##0.-- + + + YY-MM-DD + + + NNNNDD, MMMM YYYY + + + YY-MM-DD + + + YYYY-MM-DD + + + D, MMM YY + + + D, MMM YYYY + + + D, MMM YYYY + + + D, MMMM YYYY + + + D, MMMM YYYY + + + NN, DD-MMM-YY + + + NN, D, MMM YY + + + NN, D, MMMM YYYY + + + NNNND, MMMM YYYY + + + MM-DD + + + YY-MM-DD + ISO 8601 + + + YYYY-MM-DD + ISO 8601 + + + YY-MM + + + MMM-DD + + + MMMM + + + QQ YY + + + WW + + + HH:MM + + + HH:MM:SS + + + HH:MM AM/PM + + + HH:MM:SS AM/PM + + + [HH]:MM:SS + + + MM:SS.00 + + + [HH]:MM:SS.00 + + + YY-MM-DD HH:MM + + + YYYY-MM-DD HH:MM:SS AM/PM + + + + + + IGNORE_CASE + + + + + IGNORE_CASE + + + + ا-ە-ب-پ-ت-ج-چ-خ-د-ر-زژس-ش-غ-ف-ق-ك-گ-ڭ-ل-م-ن-ھ-و-ۇ-ۆ-ۈ-ۋ-ې-ى-ئ + 0 + 1 + 2 + 3 + 8 + 11 + 80 + 84 + ئەگەش + ئەگەش + + + + + + sun + ي + يەكشەنبە + + + mon + د + دۈشەنبە + + + tue + س + سەيشەنبە + + + wed + چ + چارشەنبە + + + thu + پ + پەيشەنبە + + + fri + ج + جۈمە + + + sat + ش + شەنبە + + + + + jan + قەھرىتان + قەھرىتان + + + feb + ھۇت + ھۇت + + + mar + نەۋرۇز + نەۋرۇز + + + apr + ئۇمۇت + ئۇمۇت + + + may + باھار + باھار + + + jun + سەپەر + سەپەر + + + jul + چىللە + چىللە + + + aug + تومۇز + تومۇز + + + sep + مىزان + مىزان + + + oct + ئوغۇز + ئوغۇز + + + nov + ئوغلاق + ئوغلاق + + + dec + كۆنەك + كۆنەك + + + + + bc + م ئى + مىلادىيەدىن ئىلگىرى + + + ad + م + مىلادىيە + + + + sun + + 1 + + + + + CNY + + CNY + يۈەن + 2 + + + + + + + + + + راست + يالغان + بىرىنچى چارەك + ئىككىنچى چارەك + ئۈچىنچى چارەك + تۆتىنچى چارەك + ئۈستى + ئاستى + 1 چارەك + 2 چارەك + 3 چارەك + 4 چارەك + + + + + + + + + + + + + + + diff --git a/i18npool/source/localedata/localedata.cxx b/i18npool/source/localedata/localedata.cxx index 456bb1761b41..e119e71ec14c 100644 --- a/i18npool/source/localedata/localedata.cxx +++ b/i18npool/source/localedata/localedata.cxx @@ -38,13 +38,6 @@ #include #include "rtl/instance.hxx" -#if OSL_DEBUG_LEVEL == 0 -# ifndef NDEBUG -# define NDEBUG -# endif -#endif -#include - using namespace com::sun::star::i18n; using namespace com::sun::star::uno; using namespace com::sun::star::lang; @@ -175,6 +168,8 @@ static const struct { { "fy_NL", lcl_DATA_EURO }, { "oc_FR", lcl_DATA_EURO }, { "mt_MT", lcl_DATA_EURO }, + { "sc_IT", lcl_DATA_EURO }, + { "ast_ES", lcl_DATA_EURO }, { "ja_JP", lcl_DATA_OTHERS }, { "ko_KR", lcl_DATA_OTHERS }, @@ -250,6 +245,9 @@ static const struct { { "my_MM", lcl_DATA_OTHERS }, { "shs_CA", lcl_DATA_OTHERS }, { "tpi_PG", lcl_DATA_OTHERS }, + { "ar_OM", lcl_DATA_OTHERS }, + { "ug_CN", lcl_DATA_OTHERS }, + { "om_ET", lcl_DATA_OTHERS }, }; static const sal_Unicode under = sal_Unicode('_'); @@ -1131,7 +1129,7 @@ LocaleData::getContinuousNumberingLevels( const lang::Locale& rLocale ) throw(Ru rVal.Value <<= (sal_Int16) sVal.toInt32(); break; default: - assert(0); + OSL_ASSERT(0); } } } @@ -1255,7 +1253,7 @@ LocaleData::getOutlineNumberingLevels( const lang::Locale& rLocale ) throw(Runti case 10: level[j].sTransliteration = tmp; break; case 11: level[j].nNatNum = tmp.toInt32(); break; default: - assert(0); + OSL_ASSERT(0); } } } @@ -1393,6 +1391,7 @@ OutlineNumbering::OutlineNumbering(const OutlineNumberingLevel_Impl* pOutlnLevel OutlineNumbering::~OutlineNumbering() { + delete [] m_pOutlineLevels; } sal_Int32 OutlineNumbering::getCount( ) throw(RuntimeException) diff --git a/i18npool/source/nativenumber/nativenumbersupplier.cxx b/i18npool/source/nativenumber/nativenumbersupplier.cxx index 543cdc1d4fee..6922290bd10c 100644 --- a/i18npool/source/nativenumber/nativenumbersupplier.cxx +++ b/i18npool/source/nativenumber/nativenumbersupplier.cxx @@ -737,9 +737,8 @@ NativeNumberXmlAttributes SAL_CALL NativeNumberSupplier::convertToXmlAttributes( break; } } - NativeNumberXmlAttributes att(rLocale, OUString(&NumberChar[number][1], 1), + return NativeNumberXmlAttributes(rLocale, OUString(&NumberChar[number][1], 1), OUString::createFromAscii(attType[type])); - return att; } static sal_Bool natNumIn(sal_Int16 num, sal_Int16 natnum[], sal_Int16 len) diff --git a/svtools/source/items/makefile.mk b/i18npool/source/paper/makefile.mk similarity index 65% rename from svtools/source/items/makefile.mk rename to i18npool/source/paper/makefile.mk index 651e54bb7e23..2aef382a32fa 100644 --- a/svtools/source/items/makefile.mk +++ b/i18npool/source/paper/makefile.mk @@ -1,5 +1,5 @@ #************************************************************************* -# +#* # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # Copyright 2008 by Sun Microsystems, Inc. @@ -8,7 +8,7 @@ # # $RCSfile: makefile.mk,v $ # -# $Revision: 1.13 $ +# $Revision: 1.9 $ # # This file is part of OpenOffice.org. # @@ -27,39 +27,49 @@ # # for a copy of the LGPLv3 License. # -#************************************************************************* +#************************************************************************/ PRJ=..$/.. -PRJNAME=svtools -TARGET=items + +PRJNAME=i18npool +TARGET=i18npaper + ENABLE_EXCEPTIONS=TRUE # --- Settings ----------------------------------------------------- -.INCLUDE : settings.mk -.INCLUDE : $(PRJ)$/util$/svt.pmk +.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/version.mk +.INCLUDE : $(PRJ)$/util$/makefile.pmk # --- Files -------------------------------------------------------- +# +SLOFILES=$(SLO)$/paper.obj +SHL1OBJS=$(SLOFILES) -SLOFILES=\ - $(SLO)$/aeitem.obj \ - $(SLO)$/eitem.obj \ - $(SLO)$/flagitem.obj \ - $(SLO)$/globalnameitem.obj \ - $(SLO)$/imageitm.obj \ - $(SLO)$/intitem.obj \ - $(SLO)$/itemdel.obj \ - $(SLO)$/macitem.obj \ - $(SLO)$/poolcach.obj \ - $(SLO)$/ptitem.obj \ - $(SLO)$/rectitem.obj \ - $(SLO)$/rngitem.obj \ - $(SLO)$/stritem.obj \ - $(SLO)$/style.obj \ - $(SLO)$/szitem.obj \ - $(SLO)$/wallitem.obj +SHL1TARGET=$(TARGET)$(DLLPOSTFIX) +SHL1IMPLIB=i$(TARGET) -# --- Targets ------------------------------------------------------- +DEF1DEPN=$(MISC)$/$(SHL1TARGET).flt +SHL1DEF=$(MISC)$/$(SHL1TARGET).def +DEF1NAME=$(SHL1TARGET) +DEFLIB1NAME=$(SHL1TARGET) -.INCLUDE : target.mk +LIB1TARGET= $(SLB)$/$(SHL1TARGET).lib +LIB1OBJFILES=$(SHL1OBJS) +SHL1STDLIBS= \ + $(I18NISOLANGLIB) \ + $(COMPHELPERLIB) \ + $(CPPULIB) \ + $(SALLIB) + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + +$(MISC)$/$(SHL1TARGET).flt: makefile.mk + @echo ------------------------------ + @echo Making: $@ + @echo CLEAR_THE_FILE > $@ + @echo __CT >> $@ diff --git a/i18npool/source/paper/paper.cxx b/i18npool/source/paper/paper.cxx new file mode 100644 index 000000000000..726a4c3bd898 --- /dev/null +++ b/i18npool/source/paper/paper.cxx @@ -0,0 +1,478 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile$ + * $Revision$ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_i18npool.hxx" +#include +#include +#include +#include +#include +#include +#include + +#include "i18npool/mslangid.hxx" +#include "i18npool/paper.hxx" + +#include +#include + +#ifdef UNX +#include +#include +#include +#include +#endif + +struct PageDesc +{ + long m_nWidth; + long m_nHeight; + const char *m_pPSName; + const char *m_pAltPSName; +}; + +#define PT2MM100( v ) \ + (long)(((v) * 35.27777778) + 0.5) + +#define IN2MM100( v ) \ + ((long)(((v) * 2540) + 0.5)) + +#define MM2MM100( v ) \ + ((long)((v) * 100)) + +//PostScript Printer Description File Format Specification +//http://partners.adobe.com/public/developer/en/ps/5003.PPD_Spec_v4.3.pdf +//http://www.y-adagio.com/public/committees/docsii/doc_00-49/symp_ulaan/china_ppr.pdf (Kai) +//http://www.sls.psi.ch/controls/help/howto/Howto_Print_a_A0_Poster_at_WSLA_012_2.pdf (Dia) +static PageDesc aDinTab[] = +{ + { MM2MM100( 841 ), MM2MM100( 1189 ), "A0", NULL }, + { MM2MM100( 594 ), MM2MM100( 841 ), "A1", NULL }, + { MM2MM100( 420 ), MM2MM100( 594 ), "A2", NULL }, + { MM2MM100( 297 ), MM2MM100( 420 ), "A3", NULL }, + { MM2MM100( 210 ), MM2MM100( 297 ), "A4", NULL }, + { MM2MM100( 148 ), MM2MM100( 210 ), "A5", NULL }, + { MM2MM100( 250 ), MM2MM100( 353 ), "ISOB4", NULL }, + { MM2MM100( 176 ), MM2MM100( 250 ), "ISOB5", NULL }, + { IN2MM100( 8.5 ), IN2MM100( 11 ), "Letter", "Note" }, + { IN2MM100( 8.5 ), IN2MM100( 14 ), "Legal", NULL }, + { IN2MM100( 11 ), IN2MM100( 17 ), "Tabloid", "11x17" }, + { 0, 0, NULL, NULL }, //User + { MM2MM100( 125 ), MM2MM100( 176 ), "ISOB6", NULL }, + { MM2MM100( 229 ), MM2MM100( 324 ), "EnvC4", "C4" }, + { MM2MM100( 162 ), MM2MM100( 229 ), "EnvC5", "C5" }, + { MM2MM100( 114 ), MM2MM100( 162 ), "EnvC6", "C6" }, + { MM2MM100( 114 ), MM2MM100( 229 ), "EnvC65", NULL }, + { MM2MM100( 110 ), MM2MM100( 220 ), "EnvDL", "DL" }, + { MM2MM100( 180), MM2MM100( 270 ), NULL, NULL }, //Dia + { MM2MM100( 210), MM2MM100( 280 ), NULL, NULL }, //Screen + { IN2MM100( 17 ), IN2MM100( 22 ), "AnsiC", "CSheet" }, + { IN2MM100( 22 ), IN2MM100( 34 ), "AnsiD", "DSheet" }, + { IN2MM100( 34 ), IN2MM100( 44 ), "AnsiE", "ESheet" }, + { IN2MM100( 7.25 ), IN2MM100( 10.5 ), "Executive", NULL }, + //"Folio" is a different size in the PPD documentation than 8.5x11 + //This "FanFoldGermanLegal" is known in the Philippines as + //"Legal" paper or "Long Bond Paper". The "Legal" name causing untold + //misery, given the differently sized US "Legal" paper + { IN2MM100( 8.5 ), IN2MM100( 13 ), "FanFoldGermanLegal", NULL }, + { IN2MM100( 3.875 ), IN2MM100( 7.5 ), "EnvMonarch", "Monarch" }, + { IN2MM100( 3.625 ), IN2MM100( 6.5 ), "EnvPersonal", "Personal" }, + { IN2MM100( 3.875 ), IN2MM100( 8.875 ), "Env9", NULL }, + { IN2MM100( 4.125 ), IN2MM100( 9.5 ), "Env10", "Comm10" }, + { IN2MM100( 4.5 ), IN2MM100( 10.375 ), "Env11", NULL }, + { IN2MM100( 4.75 ), IN2MM100( 11 ), "Env12", NULL }, + { MM2MM100( 184 ), MM2MM100( 260 ), NULL, NULL }, //Kai16 + { MM2MM100( 130 ), MM2MM100( 184 ), NULL, NULL }, //Kai32 + { MM2MM100( 140 ), MM2MM100( 203 ), NULL, NULL }, //BigKai32 + { MM2MM100( 257 ), MM2MM100( 364 ), "B4", NULL }, //JIS + { MM2MM100( 182 ), MM2MM100( 257 ), "B5", NULL }, //JIS + { MM2MM100( 128 ), MM2MM100( 182 ), "B6", NULL }, //JIS + { IN2MM100( 17 ), IN2MM100( 11 ), "Ledger", NULL }, + { IN2MM100( 5.5 ), IN2MM100( 8.5 ), "Statement", NULL }, + { PT2MM100( 610 ), PT2MM100( 780 ), "Quarto", NULL }, + { IN2MM100( 10 ), IN2MM100( 14 ), "10x14", NULL }, + { IN2MM100( 5.5 ), IN2MM100( 11.5 ), "Env14", NULL }, + { MM2MM100( 324 ), MM2MM100( 458 ), "EnvC3", "C3" }, + { MM2MM100( 110 ), MM2MM100( 230 ), "EnvItalian", NULL }, + { IN2MM100( 14.875 ),IN2MM100( 11 ), "FanFoldUS", NULL }, + { IN2MM100( 8.5 ), IN2MM100( 13 ), "FanFoldGerman", NULL }, + { MM2MM100( 100 ), MM2MM100( 148 ), "Postcard", NULL }, + { IN2MM100( 9 ), IN2MM100( 11 ), "9x11", NULL }, + { IN2MM100( 10 ), IN2MM100( 11 ), "10x11", NULL }, + { IN2MM100( 15 ), IN2MM100( 11 ), "15x11", NULL }, + { MM2MM100( 220 ), MM2MM100( 220 ), "EnvInvite", NULL }, + { MM2MM100( 227 ), MM2MM100( 356 ), "SuperA", NULL }, + { MM2MM100( 305 ), MM2MM100( 487 ), "SuperB", NULL }, + { IN2MM100( 8.5 ), IN2MM100( 12.69 ), "LetterPlus", NULL }, + { IN2MM100( 8.5 ), IN2MM100( 12.69 ), "LetterPlus", NULL }, + { MM2MM100( 210 ), MM2MM100( 330 ), "A4Plus", NULL }, + { MM2MM100( 200 ), MM2MM100( 148 ), "DoublePostcard", NULL }, + { MM2MM100( 105 ), MM2MM100( 148 ), "A6", NULL }, + { IN2MM100( 12 ), IN2MM100( 11 ), "12x11", NULL }, + { MM2MM100( 74 ), MM2MM100( 105 ), "A7", NULL }, + { MM2MM100( 52 ), MM2MM100( 74 ), "A8", NULL }, + { MM2MM100( 37 ), MM2MM100( 52 ), "A9", NULL }, + { MM2MM100( 26 ), MM2MM100( 37 ), "A10", NULL }, + { MM2MM100( 1000 ), MM2MM100( 1414 ), "ISOB0", NULL }, + { MM2MM100( 707 ), MM2MM100( 1000 ), "ISOB1", NULL }, + { MM2MM100( 500 ), MM2MM100( 707 ), "ISOB2", NULL }, + { MM2MM100( 353 ), MM2MM100( 500 ), "ISOB3", NULL }, + { MM2MM100( 88 ), MM2MM100( 125 ), "ISOB7", NULL }, + { MM2MM100( 62 ), MM2MM100( 88 ), "ISOB8", NULL }, + { MM2MM100( 44 ), MM2MM100( 62 ), "ISOB9", NULL }, + { MM2MM100( 31 ), MM2MM100( 44 ), "ISOB10", NULL }, + { MM2MM100( 458 ), MM2MM100( 648 ), "EnvC2", "C2" }, + { MM2MM100( 81 ), MM2MM100( 114 ), "EnvC7", "C7" }, + { MM2MM100( 57 ), MM2MM100( 81 ), "EnvC8", "C8" }, + { IN2MM100( 9 ), IN2MM100( 12 ), "ARCHA", NULL }, + { IN2MM100( 12 ), IN2MM100( 18 ), "ARCHB", NULL }, + { IN2MM100( 18 ), IN2MM100( 24 ), "ARCHC", NULL }, + { IN2MM100( 24 ), IN2MM100( 36 ), "ARCHD", NULL }, + { IN2MM100( 36 ), IN2MM100( 48 ), "ARCHE", NULL } +}; + +static const size_t nTabSize = sizeof(aDinTab) / sizeof(aDinTab[0]); + +#define MAXSLOPPY 11 + +bool PaperInfo::doSloppyFit() +{ + if (m_eType != PAPER_USER) + return true; + + for ( size_t i = 0; i < nTabSize; ++i ) + { + if (i == PAPER_USER) continue; + + long lDiffW = labs(aDinTab[i].m_nWidth - m_nPaperWidth); + long lDiffH = labs(aDinTab[i].m_nHeight - m_nPaperHeight); + + if ( lDiffW < MAXSLOPPY && lDiffH < MAXSLOPPY ) + { + m_nPaperWidth = aDinTab[i].m_nWidth; + m_nPaperHeight = aDinTab[i].m_nHeight; + m_eType = (Paper)i; + return true; + } + } + + return false; +} + +bool PaperInfo::sloppyEqual(const PaperInfo &rOther) const +{ + return + ( + (labs(m_nPaperWidth - rOther.m_nPaperWidth) < MAXSLOPPY) && + (labs(m_nPaperHeight - rOther.m_nPaperHeight) < MAXSLOPPY) + ); +} + +long PaperInfo::sloppyFitPageDimension(long nDimension) +{ + for ( size_t i = 0; i < nTabSize; ++i ) + { + if (i == PAPER_USER) continue; + long lDiff; + + lDiff = labs(aDinTab[i].m_nWidth - nDimension); + if ( lDiff < MAXSLOPPY ) + return aDinTab[i].m_nWidth; + + lDiff = labs(aDinTab[i].m_nHeight - nDimension); + if ( lDiff < MAXSLOPPY ) + return aDinTab[i].m_nHeight; + } + return nDimension; +} + +PaperInfo PaperInfo::getSystemDefaultPaper() +{ + using ::com::sun::star::uno::Reference; + using ::com::sun::star::lang::XMultiServiceFactory; + using ::com::sun::star::uno::UNO_QUERY_THROW; + using ::com::sun::star::uno::Sequence; + using ::com::sun::star::uno::Any; + using ::com::sun::star::container::XNameAccess; + using ::com::sun::star::uno::Exception; +# define CREATE_OUSTRING( ascii ) \ + rtl::OUString::intern( RTL_CONSTASCII_USTRINGPARAM( ascii ) ) + + rtl::OUString aLocaleStr; + + Reference< XMultiServiceFactory > xFactory = ::comphelper::getProcessServiceFactory(); + Reference< XMultiServiceFactory > xConfigProv( + xFactory->createInstance( CREATE_OUSTRING( "com.sun.star.configuration.ConfigurationProvider" ) ), + UNO_QUERY_THROW ); + + Sequence< Any > aArgs( 1 ); + aArgs[ 0 ] <<= CREATE_OUSTRING( "org.openoffice.Setup/L10N/" ); + Reference< XNameAccess > xConfigNA( xConfigProv->createInstanceWithArguments( + CREATE_OUSTRING( "com.sun.star.configuration.ConfigurationAccess" ), aArgs ), UNO_QUERY_THROW ); + try + { + // try user-defined locale setting + xConfigNA->getByName( CREATE_OUSTRING( "ooSetupSystemLocale" ) ) >>= aLocaleStr; + } + catch( Exception& ) {} + +#ifdef UNX + // if set to "use system", get papersize from system + if (aLocaleStr.getLength() == 0) + { + static bool bInitialized = false; + static PaperInfo aInstance(PAPER_A4); + + if (bInitialized) + return aInstance; + + // try libpaper + // #i78617# workaround missing paperconf command + FILE* pPipe = popen( "sh -c paperconf 2>/dev/null", "r" ); + if( pPipe ) + { + Paper ePaper = PAPER_USER; + + char aBuffer[ 1024 ]; + aBuffer[0] = 0; + char *pBuffer = fgets( aBuffer, sizeof(aBuffer), pPipe ); + pclose( pPipe ); + + if (pBuffer && *pBuffer != 0) + { + rtl::OString aPaper(pBuffer); + aPaper = aPaper.trim(); + static struct { const char *pName; Paper ePaper; } aCustoms [] = + { + { "B0", PAPER_B0_ISO }, + { "B1", PAPER_B1_ISO }, + { "B2", PAPER_B2_ISO }, + { "B3", PAPER_B3_ISO }, + { "B4", PAPER_B4_ISO }, + { "B5", PAPER_B5_ISO }, + { "B6", PAPER_B6_ISO }, + { "B7", PAPER_B7_ISO }, + { "B8", PAPER_B8_ISO }, + { "B9", PAPER_B9_ISO }, + { "B10", PAPER_B10_ISO }, + { "folio", PAPER_FANFOLD_LEGAL_DE }, + { "flsa", PAPER_FANFOLD_LEGAL_DE }, + { "flse", PAPER_FANFOLD_LEGAL_DE } + }; + + bool bHalve = false; + + size_t nExtraTabSize = sizeof(aCustoms) / sizeof(aCustoms[0]); + for (size_t i = 0; i < nExtraTabSize; ++i) + { + if (rtl_str_compareIgnoreAsciiCase(aCustoms[i].pName, aPaper.getStr()) == 0) + { + ePaper = aCustoms[i].ePaper; + break; + } + } + + if (ePaper == PAPER_USER) + { + bHalve = !rtl_str_shortenedCompareIgnoreAsciiCase_WithLength( + aPaper.getStr(), aPaper.getLength(), "half", 4, 4); + if (bHalve) + aPaper = aPaper.copy(4); + ePaper = PaperInfo::fromPSName(aPaper); + } + + if (ePaper != PAPER_USER) + { + aInstance = PaperInfo(ePaper); + if (bHalve) + aInstance = PaperInfo(aInstance.getHeight()/2, aInstance.getWidth()); + bInitialized = true; + return aInstance; + } + } + } + +#if defined(LC_PAPER) && defined(_GNU_SOURCE) + + union paperword { char *string; int word; }; + + // try LC_PAPER + paperword w, h; + w.string = nl_langinfo(_NL_PAPER_WIDTH); + h.string = nl_langinfo(_NL_PAPER_HEIGHT); + + //glibc stores sizes as integer mm units + w.word *= 100; + h.word *= 100; + + for ( size_t i = 0; i < nTabSize; ++i ) + { + if (i == PAPER_USER) continue; + + //glibc stores sizes as integer mm units, and so is inaccurate. To + //find a standard paper size we calculate the standard paper sizes + //into equally inaccurate mm and compare + long width = (aDinTab[i].m_nWidth + 50) / 100; + long height = (aDinTab[i].m_nHeight + 50) / 100; + + if (width == w.word/100 && height == h.word/100) + { + w.word = aDinTab[i].m_nWidth; + h.word = aDinTab[i].m_nHeight; + break; + } + } + + aInstance = PaperInfo(w.word, h.word); + bInitialized = true; + return aInstance; +#endif + } +#endif + + try + { + // if set to "use system", try to get locale from system + if( aLocaleStr.getLength() == 0 ) + { + aArgs[ 0 ] <<= CREATE_OUSTRING( "org.openoffice.System/L10N/" ); + xConfigNA.set( xConfigProv->createInstanceWithArguments( + CREATE_OUSTRING( "com.sun.star.configuration.ConfigurationAccess" ), aArgs ), + UNO_QUERY_THROW ); + xConfigNA->getByName( CREATE_OUSTRING( "Locale" ) ) >>= aLocaleStr; + } + } + catch( Exception& ) {} + + if (aLocaleStr.getLength() == 0) + aLocaleStr = CREATE_OUSTRING("en-US"); + + // convert locale string to locale struct + ::com::sun::star::lang::Locale aSysLocale; + sal_Int32 nDashPos = aLocaleStr.indexOf( '-' ); + if( nDashPos < 0 ) nDashPos = aLocaleStr.getLength(); + aSysLocale.Language = aLocaleStr.copy( 0, nDashPos ); + if( nDashPos + 1 < aLocaleStr.getLength() ) + aSysLocale.Country = aLocaleStr.copy( nDashPos + 1 ); + + return PaperInfo::getDefaultPaperForLocale(aSysLocale); +} + +PaperInfo::PaperInfo(Paper eType) : m_eType(eType) +{ + m_nPaperWidth = aDinTab[m_eType].m_nWidth; + m_nPaperHeight = aDinTab[m_eType].m_nHeight; +} + +PaperInfo::PaperInfo(long nPaperWidth, long nPaperHeight) + : m_eType(PAPER_USER), + m_nPaperWidth(nPaperWidth), + m_nPaperHeight(nPaperHeight) +{ + for ( size_t i = 0; i < nTabSize; ++i ) + { + if ( + (nPaperWidth == aDinTab[i].m_nWidth) && + (nPaperHeight == aDinTab[i].m_nHeight) + ) + { + m_eType = static_cast(i); + break; + } + } +} + +rtl::OString PaperInfo::toPSName(Paper ePaper) +{ + return static_cast(ePaper) < nTabSize ? + rtl::OString(aDinTab[ePaper].m_pPSName) : rtl::OString(); +} + +Paper PaperInfo::fromPSName(const rtl::OString &rName) +{ + if (!rName.getLength()) + return PAPER_USER; + + for ( size_t i = 0; i < nTabSize; ++i ) + { + if (aDinTab[i].m_pPSName && + !rtl_str_compareIgnoreAsciiCase(aDinTab[i].m_pPSName, rName.getStr())) + { + return static_cast(i); + } + else if (aDinTab[i].m_pAltPSName && + !rtl_str_compareIgnoreAsciiCase(aDinTab[i].m_pAltPSName, rName.getStr())) + { + return static_cast(i); + } + } + + return PAPER_USER; +} + +//http://wiki.services.openoffice.org/wiki/DefaultPaperSize +//http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/localedata/locales/?cvsroot=glibc +//http://www.unicode.org/cldr/data/charts/supplemental/territory_language_information.html +//http://en.wikipedia.org/wiki/Paper_size +//http://msdn.microsoft.com/en-us/library/cc195164.aspx +PaperInfo PaperInfo::getDefaultPaperForLocale( + const ::com::sun::star::lang::Locale & rLocale) +{ + Paper eType = PAPER_A4; + + if ( + //United States, Letter + !rLocale.Country.compareToAscii("US") || + //Puerto Rico, http://sources.redhat.com/ml/libc-hacker/2001-07/msg00046.html + !rLocale.Country.compareToAscii("PR") || + //Canada, http://sources.redhat.com/ml/libc-hacker/2001-07/msg00053.html + !rLocale.Country.compareToAscii("CA") || + //Venuzuela, https://www.redhat.com/archives/fedora-devel-list/2008-August/msg00019.html + !rLocale.Country.compareToAscii("VE") || + //Chile, https://www.redhat.com/archives/fedora-devel-list/2008-August/msg00240.html + !rLocale.Country.compareToAscii("CL") || + //Mexico, http://qa.openoffice.org/issues/show_bug.cgi?id=49739 + !rLocale.Country.compareToAscii("MX") || + //Colombia, http://qa.openoffice.org/issues/show_bug.cgi?id=69703 + !rLocale.Country.compareToAscii("CO") || + //Philippines, + // http://ubuntuliving.blogspot.com/2008/07/default-paper-size-in-evince.html + // http://www.gov.ph/faqs/driverslicense.asp + !rLocale.Country.compareToAscii("PH") + ) + { + eType = PAPER_LETTER; + } + + return eType; +} + +/* vi:set tabstop=4 shiftwidth=4 expandtab: */ diff --git a/i18npool/source/registerservices/registerservices.cxx b/i18npool/source/registerservices/registerservices.cxx index 870c49939648..3cb29cd6838f 100644 --- a/i18npool/source/registerservices/registerservices.cxx +++ b/i18npool/source/registerservices/registerservices.cxx @@ -207,6 +207,7 @@ IMPL_CREATEINSTANCE( NumToCharLower_zh_CN ) IMPL_CREATEINSTANCE( NumToCharUpper_zh_CN ) IMPL_CREATEINSTANCE( NumToCharLower_zh_TW ) IMPL_CREATEINSTANCE( NumToCharUpper_zh_TW ) +IMPL_CREATEINSTANCE( NumToCharHalfwidth ) IMPL_CREATEINSTANCE( NumToCharFullwidth ) IMPL_CREATEINSTANCE( NumToCharKanjiShort_ja_JP ) IMPL_CREATEINSTANCE( NumToCharKanjiTraditional_ja_JP ) @@ -469,6 +470,7 @@ static const struct InstancesArray { IMPL_TRANSLITERATION_ITEM (NumToCharLower_zh_CN), IMPL_TRANSLITERATION_ITEM (NumToCharUpper_zh_TW), IMPL_TRANSLITERATION_ITEM (NumToCharLower_zh_TW), + IMPL_TRANSLITERATION_ITEM (NumToCharHalfwidth), IMPL_TRANSLITERATION_ITEM (NumToCharFullwidth), IMPL_TRANSLITERATION_ITEM (NumToCharKanjiShort_ja_JP), IMPL_TRANSLITERATION_ITEM (NumToCharKanjiTraditional_ja_JP), diff --git a/i18npool/source/search/makefile.mk b/i18npool/source/search/makefile.mk index 1b48919624f6..2e81ec3f1d53 100644 --- a/i18npool/source/search/makefile.mk +++ b/i18npool/source/search/makefile.mk @@ -50,6 +50,12 @@ SLOFILES= \ $(EXCEPTIONSFILES) \ $(SLO)$/levdis.obj +# on unxsoli, no optimization for textsearch because of i105945 +.IF "$(OS)$(COM)$(CPUNAME)"=="SOLARISC52INTEL" +EXCEPTIONSNOOPTFILES= \ + $(SLO)$/textsearch.obj +.ENDIF + SHL1TARGET= $(TARGET) SHL1OBJS= $(SLOFILES) diff --git a/i18npool/source/search/textsearch.cxx b/i18npool/source/search/textsearch.cxx index 96f033f4e4e3..2518a6cb0481 100644 --- a/i18npool/source/search/textsearch.cxx +++ b/i18npool/source/search/textsearch.cxx @@ -562,6 +562,7 @@ sal_Int32 TextSearch::GetDiff( const sal_Unicode cChr ) const } +// TextSearch::NSrchFrwrd is mis-optimized on unxsoli (#i105945#) SearchResult TextSearch::NSrchFrwrd( const OUString& searchStr, sal_Int32 startPos, sal_Int32 endPos ) throw(RuntimeException) { diff --git a/i18npool/source/textconversion/genconv_dict.cxx b/i18npool/source/textconversion/genconv_dict.cxx index 23a264603df9..a49bf3031bbc 100644 --- a/i18npool/source/textconversion/genconv_dict.cxx +++ b/i18npool/source/textconversion/genconv_dict.cxx @@ -39,6 +39,8 @@ #include #include +#include + using namespace ::rtl; void make_hhc_char(FILE *sfp, FILE *cfp); @@ -357,8 +359,8 @@ void make_stc_word(FILE *sfp, FILE *cfp) { sal_Int32 count, i, length; sal_Unicode STC_WordData[0x10000]; - Index *STC_WordEntry_S2T = (Index*) malloc(0x10000 * sizeof(Index)); - Index *STC_WordEntry_T2S = (Index*) malloc(0x10000 * sizeof(Index)); + std::vector STC_WordEntry_S2T(0x10000); + std::vector STC_WordEntry_T2S(0x10000); sal_Int32 count_S2T = 0, count_T2S = 0; sal_Int32 line = 0, char_total = 0; sal_Char Cstr[1024]; @@ -416,7 +418,7 @@ void make_stc_word(FILE *sfp, FILE *cfp) sal_uInt16 STC_WordIndex[0x100]; if (count_S2T > 0) { - qsort(STC_WordEntry_S2T, count_S2T, sizeof(Index), Index_comp); + qsort(&STC_WordEntry_S2T[0], count_S2T, sizeof(Index), Index_comp); fprintf(cfp, "\nstatic const sal_uInt16 STC_WordEntry_S2T[] = {"); count = 0; @@ -449,7 +451,7 @@ void make_stc_word(FILE *sfp, FILE *cfp) } if (count_T2S > 0) { - qsort(STC_WordEntry_T2S, count_T2S, sizeof(Index), Index_comp); + qsort(&STC_WordEntry_T2S[0], count_T2S, sizeof(Index), Index_comp); fprintf(cfp, "\nstatic const sal_uInt16 STC_WordEntry_T2S[] = {"); count = 0; @@ -480,7 +482,5 @@ void make_stc_word(FILE *sfp, FILE *cfp) fprintf (cfp, "\tconst sal_uInt16* getSTC_WordEntry_T2S() { return NULL; }\n"); fprintf (cfp, "\tconst sal_uInt16* getSTC_WordIndex_T2S(sal_Int32& count) { count = 0; return NULL; }\n"); } - free(STC_WordEntry_S2T); - free(STC_WordEntry_T2S); } diff --git a/o3tl/qa/makefile.mk b/o3tl/qa/makefile.mk index 563f4e2d3bf2..b592790516da 100644 --- a/o3tl/qa/makefile.mk +++ b/o3tl/qa/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -39,7 +39,7 @@ ENABLE_EXCEPTIONS=TRUE # --- Settings ----------------------------------------------------- .INCLUDE : settings.mk - +.IF "$(L10N_framework)"=="" # --- Common ---------------------------------------------------------- # BEGIN ---------------------------------------------------------------- @@ -51,6 +51,7 @@ SHL1OBJS= \ SHL1TARGET= tests SHL1STDLIBS= $(SALLIB) \ + $(TESTSHL2LIB)\ $(CPPUNITLIB) SHL1IMPLIB= i$(SHL1TARGET) @@ -65,16 +66,19 @@ SHL1VERSIONMAP = export.map SLOFILES=$(SHL1OBJS) # --- Targets ------------------------------------------------------ +.ENDIF # L10N_framework .INCLUDE : target.mk .INCLUDE : _cppunit.mk # --- Enable test execution in normal build ------------------------ - +.IF "$(L10N_framework)"=="" unittest : $(SHL1TARGETN) @echo ---------------------------------------------------------- @echo - start unit test on library $(SHL1TARGETN) @echo ---------------------------------------------------------- - $(AUGMENT_LIBRARY_PATH) testshl2 -sf $(mktmp ) $(SHL1TARGETN) + $(TESTSHL2) -sf $(mktmp ) $(SHL1TARGETN) ALLTAR : unittest +.ENDIF # L10N_framework + diff --git a/o3tl/qa/test-cow_wrapper.cxx b/o3tl/qa/test-cow_wrapper.cxx index 6bb169e951a4..eebbb633f82b 100644 --- a/o3tl/qa/test-cow_wrapper.cxx +++ b/o3tl/qa/test-cow_wrapper.cxx @@ -1,6 +1,6 @@ // autogenerated file with codegen.pl -#include +#include #include "cow_wrapper_clients.hxx" diff --git a/o3tl/qa/test-heap_ptr.cxx b/o3tl/qa/test-heap_ptr.cxx index 5e247a8b9abc..25f2209c94f5 100644 --- a/o3tl/qa/test-heap_ptr.cxx +++ b/o3tl/qa/test-heap_ptr.cxx @@ -28,7 +28,7 @@ * ************************************************************************/ -#include +#include #include diff --git a/o3tl/qa/test-range.cxx b/o3tl/qa/test-range.cxx index 626d9b6e3a90..fa956db96005 100644 --- a/o3tl/qa/test-range.cxx +++ b/o3tl/qa/test-range.cxx @@ -29,7 +29,7 @@ ************************************************************************/ -#include +#include #include #include diff --git a/padmin/source/adddlg.cxx b/padmin/source/adddlg.cxx index c10be2d83fcd..58c37dcffa83 100644 --- a/padmin/source/adddlg.cxx +++ b/padmin/source/adddlg.cxx @@ -147,27 +147,31 @@ void APChooseDriverPage::fill( PrinterInfo& rInfo ) } } -void APChooseDriverPage::updateDrivers() +void APChooseDriverPage::updateDrivers( bool bRefresh, const rtl::OUString& rSelectDriver ) { for( int k = 0; k < m_aDriverBox.GetEntryCount(); k++ ) delete (String*)m_aDriverBox.GetEntryData( k ); m_aDriverBox.Clear(); std::list< rtl::OUString > aDrivers; - psp::PPDParser::getKnownPPDDrivers( aDrivers ); + psp::PPDParser::getKnownPPDDrivers( aDrivers, bRefresh ); + rtl::OUString aSelectDriver( psp::PPDParser::getPPDPrinterName( rSelectDriver ) ); + + rtl::OUString aSelectedEntry; for( std::list< rtl::OUString >::const_iterator it = aDrivers.begin(); it != aDrivers.end(); ++it ) { - String aDriver( ::psp::PPDParser::getPPDPrinterName( *it ) ); - if( aDriver.Len() ) + rtl::OUString aDriver( psp::PPDParser::getPPDPrinterName( *it ) ); + if( aDriver.getLength() ) { int nPos = m_aDriverBox.InsertEntry( aDriver ); m_aDriverBox.SetEntryData( nPos, new String( *it ) ); - if( it->equalsAscii( "SGENPRT" ) ) - m_aDriverBox.SelectEntryPos( nPos ); + if( aDriver == aSelectDriver ) + aSelectedEntry = aDriver; } } + m_aDriverBox.SelectEntry( aSelectedEntry ); m_aRemBtn.Enable( m_aDriverBox.GetEntryCount() > 0 ); } @@ -185,7 +189,13 @@ IMPL_LINK( APChooseDriverPage, ClickBtnHdl, PushButton*, pButton ) { PPDImportDialog aDlg( this ); if( aDlg.Execute() ) - updateDrivers(); + { + const std::list< rtl::OUString >& rImported( aDlg.getImportedFiles() ); + if( rImported.empty() ) + updateDrivers( true ); + else + updateDrivers( true, rImported.front() ); + } } else if( pButton == &m_aRemBtn ) { @@ -259,11 +269,10 @@ IMPL_LINK( APChooseDriverPage, ClickBtnHdl, PushButton*, pButton ) rPIManager.removePrinter( *it ); } - ::std::list< rtl::OUString > aDirs; + std::list< rtl::OUString > aDirs; // get only psprint's directories, not eventual system dirs psp::getPrinterPathList( aDirs, NULL ); - ::std::list< rtl::OUString >::iterator dir; - + std::list< rtl::OUString >::iterator dir; for( dir = aDirs.begin(); dir != aDirs.end(); ++dir ) { ::std::list< String > aFiles; @@ -271,10 +280,11 @@ IMPL_LINK( APChooseDriverPage, ClickBtnHdl, PushButton*, pButton ) OUStringBuffer aDir( *dir ); aDir.append( sal_Unicode( '/' ) ); aDir.appendAscii( PRINTER_PPDDIR ); - FindFiles( aDir.makeStringAndClear(), aFiles, String( RTL_CONSTASCII_USTRINGPARAM( "PS;PPD;PS.GZ;PPD.GZ" ) ), true ); + rtl::OUString aPPDDir( aDir.makeStringAndClear() ); + FindFiles( aPPDDir, aFiles, String( RTL_CONSTASCII_USTRINGPARAM( "PS;PPD;PS.GZ;PPD.GZ" ) ), true ); for( file = aFiles.begin(); file != aFiles.end(); ++file ) { - String aFile( *dir ); + String aFile( aPPDDir ); if( aFile.GetChar( aFile.Len() ) != '/' ) aFile.AppendAscii( "/" ); aFile.Append( *file ); @@ -797,7 +807,7 @@ AddPrinterDialog::~AddPrinterDialog() void AddPrinterDialog::updateSettings() { - if( ! GetDisplayBackground().GetColor().IsDark() ) + if( ! GetSettings().GetStyleSettings().GetHighContrastMode() ) m_aTitleImage.SetImage( Image( BitmapEx( PaResId( RID_BMP_PRINTER ) ) ) ); else m_aTitleImage.SetImage( Image( BitmapEx( PaResId( RID_BMP_PRINTER_HC ) ) ) ); diff --git a/padmin/source/adddlg.hxx b/padmin/source/adddlg.hxx index e6fe17f30188..bb17044e800a 100644 --- a/padmin/source/adddlg.hxx +++ b/padmin/source/adddlg.hxx @@ -96,7 +96,7 @@ class APChooseDriverPage : public APTabPage DECL_LINK( ClickBtnHdl, PushButton* ); DECL_LINK( DelPressedHdl, ListBox* ); - void updateDrivers(); + void updateDrivers( bool bRefresh = false, const rtl::OUString& rSelectDriver = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "SGENPRT" ) ) ); public: APChooseDriverPage( AddPrinterDialog* pParent ); ~APChooseDriverPage(); diff --git a/padmin/source/cmddlg.cxx b/padmin/source/cmddlg.cxx index 9aa65c8ce204..c6daf547369c 100644 --- a/padmin/source/cmddlg.cxx +++ b/padmin/source/cmddlg.cxx @@ -79,20 +79,22 @@ void CommandStore::getSystemPdfCommands( ::std::list< String >& rCommands ) pPipe = popen( "which gs 2>/dev/null", "r" ); if( pPipe ) { - fgets( pBuffer, sizeof( pBuffer ), pPipe ); - int nLen = strlen( pBuffer ); - if( pBuffer[nLen-1] == '\n' ) // strip newline - pBuffer[--nLen] = 0; - aCommand = String( ByteString( pBuffer ), aEncoding ); - if( ( ( aCommand.GetChar( 0 ) == '/' ) - || ( aCommand.GetChar( 0 ) == '.' && aCommand.GetChar( 1 ) == '/' ) - || ( aCommand.GetChar( 0 ) == '.' && aCommand.GetChar( 1 ) == '.' && aCommand.GetChar( 2 ) == '/' ) ) - && nLen > 2 - && aCommand.GetChar( nLen-2 ) == 'g' - && aCommand.GetChar( nLen-1 ) == 's' ) + if (fgets( pBuffer, sizeof( pBuffer ), pPipe ) != NULL) { - aCommand.AppendAscii( " -q -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=\"(OUTFILE)\" -" ); - aSysCommands.push_back( aCommand ); + int nLen = strlen( pBuffer ); + if( pBuffer[nLen-1] == '\n' ) // strip newline + pBuffer[--nLen] = 0; + aCommand = String( ByteString( pBuffer ), aEncoding ); + if( ( ( aCommand.GetChar( 0 ) == '/' ) + || ( aCommand.GetChar( 0 ) == '.' && aCommand.GetChar( 1 ) == '/' ) + || ( aCommand.GetChar( 0 ) == '.' && aCommand.GetChar( 1 ) == '.' && aCommand.GetChar( 2 ) == '/' ) ) + && nLen > 2 + && aCommand.GetChar( nLen-2 ) == 'g' + && aCommand.GetChar( nLen-1 ) == 's' ) + { + aCommand.AppendAscii( " -q -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=\"(OUTFILE)\" -" ); + aSysCommands.push_back( aCommand ); + } } pclose( pPipe ); } @@ -100,19 +102,21 @@ void CommandStore::getSystemPdfCommands( ::std::list< String >& rCommands ) pPipe = popen( "which distill 2>/dev/null", "r" ); if( pPipe ) { - fgets( pBuffer, sizeof( pBuffer ), pPipe ); - int nLen = strlen( pBuffer ); - if( pBuffer[nLen-1] == '\n' ) // strip newline - pBuffer[--nLen] = 0; - aCommand = String( ByteString( pBuffer ), aEncoding ); - if( ( ( aCommand.GetChar( 0 ) == '/' ) - || ( aCommand.GetChar( 0 ) == '.' && aCommand.GetChar( 1 ) == '/' ) - || ( aCommand.GetChar( 0 ) == '.' && aCommand.GetChar( 1 ) == '.' && aCommand.GetChar( 2 ) == '/' ) ) - && nLen > 7 - && aCommand.Copy( nLen - 8 ).EqualsAscii( "/distill" ) ) + if (fgets( pBuffer, sizeof( pBuffer ), pPipe ) != NULL) { - aCommand.AppendAscii( " (TMP) ; mv `echo (TMP) | sed s/\\.ps\\$/.pdf/` \"(OUTFILE)\"" ); - aSysCommands.push_back( aCommand ); + int nLen = strlen( pBuffer ); + if( pBuffer[nLen-1] == '\n' ) // strip newline + pBuffer[--nLen] = 0; + aCommand = String( ByteString( pBuffer ), aEncoding ); + if( ( ( aCommand.GetChar( 0 ) == '/' ) + || ( aCommand.GetChar( 0 ) == '.' && aCommand.GetChar( 1 ) == '/' ) + || ( aCommand.GetChar( 0 ) == '.' && aCommand.GetChar( 1 ) == '.' && aCommand.GetChar( 2 ) == '/' ) ) + && nLen > 7 + && aCommand.Copy( nLen - 8 ).EqualsAscii( "/distill" ) ) + { + aCommand.AppendAscii( " (TMP) ; mv `echo (TMP) | sed s/\\.ps\\$/.pdf/` \"(OUTFILE)\"" ); + aSysCommands.push_back( aCommand ); + } } pclose( pPipe ); } diff --git a/padmin/source/makefile.mk b/padmin/source/makefile.mk index 336631f1ceaa..91e4ca2a25f4 100644 --- a/padmin/source/makefile.mk +++ b/padmin/source/makefile.mk @@ -105,8 +105,7 @@ APP1STDLIBS= \ $(COMPHELPERLIB) \ $(CPPUHELPERLIB) \ $(CPPULIB) \ - $(SALLIB) \ - -lXext -lX11 + $(SALLIB) UNIXTEXT = $(MISC)$/spadmin.sh diff --git a/padmin/source/newppdlg.cxx b/padmin/source/newppdlg.cxx index 8d5414a2ceef..0fd6aa32c984 100644 --- a/padmin/source/newppdlg.cxx +++ b/padmin/source/newppdlg.cxx @@ -172,6 +172,7 @@ IMPL_LINK( PPDImportDialog, ClickBtnHdl, PushButton*, pButton ) ::std::list< rtl::OUString > aToDirs; psp::getPrinterPathList( aToDirs, PRINTER_PPDDIR ); ::std::list< rtl::OUString >::iterator writeDir = aToDirs.begin(); + m_aImportedFiles.clear(); for( int i = 0; i < m_aDriverLB.GetSelectEntryCount(); i++ ) { @@ -186,7 +187,10 @@ IMPL_LINK( PPDImportDialog, ClickBtnHdl, PushButton*, pButton ) aToFile.Append( aFile.GetName() ); OUString aToUni( aToFile.GetMainURL(INetURLObject::DECODE_TO_IURI) ); if( ! File::copy( aFromUni, aToUni ) ) + { + m_aImportedFiles.push_back( aToUni ); break; + } ++writeDir; } while( writeDir != aToDirs.end() ); } diff --git a/padmin/source/newppdlg.hxx b/padmin/source/newppdlg.hxx index 4d6d637efcc9..bd73b5ffed3e 100644 --- a/padmin/source/newppdlg.hxx +++ b/padmin/source/newppdlg.hxx @@ -64,9 +64,14 @@ namespace padmin { DECL_LINK( ModifyHdl, ComboBox* ); void Import(); + + std::list< rtl::OUString > m_aImportedFiles; public: PPDImportDialog( Window* pParent ); ~PPDImportDialog(); + + const std::list< rtl::OUString >& getImportedFiles() const + { return m_aImportedFiles; } }; } // namespace diff --git a/padmin/source/padialog.cxx b/padmin/source/padialog.cxx index 5b49409a1c8a..f73427526be6 100644 --- a/padmin/source/padialog.cxx +++ b/padmin/source/padialog.cxx @@ -106,7 +106,7 @@ PADialog::PADialog( Window* pParent, BOOL /*bAdmin*/ ) : void PADialog::updateSettings() { - if( ! GetDisplayBackground().GetColor().IsDark() ) + if( ! GetSettings().GetStyleSettings().GetHighContrastMode() ) { m_aPrinterImg = Image( BitmapEx( PaResId( RID_BMP_SMALL_PRINTER ) ) ); m_aFaxImg = Image( BitmapEx( PaResId( RID_BMP_SMALL_FAX ) ) ); diff --git a/rsc/inc/rscerror.h b/rsc/inc/rscerror.h index 0e81066cbca8..a957e2c7b202 100644 --- a/rsc/inc/rscerror.h +++ b/rsc/inc/rscerror.h @@ -120,9 +120,17 @@ public: class RscId; class RscTop; +enum RscVerbosity +{ + RscVerbositySilent = 0, + RscVerbosityNormal = 1, + RscVerbosityVerbose = 2 +}; + class RscError { FILE * fListing; + RscVerbosity m_verbosity; void WriteError( const ERRTYPE& rError, const char * pMessage ); void StdLstOut( const char * pStr ); @@ -131,9 +139,10 @@ class RscError const RscId & aId ); public: sal_uInt32 nErrors;// Anzahl der Fehler - RscError(){ + RscError( RscVerbosity _verbosity ) { fListing = NULL; nErrors = 0; + m_verbosity = _verbosity; }; void SetListFile( FILE * fList ){ fListing = fList; @@ -141,7 +150,8 @@ public: FILE * GetListFile(){ return fListing; }; - virtual void StdOut( const char * ); + RscVerbosity GetVerbosity() const { return m_verbosity; } + virtual void StdOut( const char *, const RscVerbosity _verbosityLevel = RscVerbosityNormal ); virtual void StdErr( const char * ); virtual void LstOut( const char * ); virtual void Error( const ERRTYPE& rError, RscTop* pClass, const RscId &aId, diff --git a/rsc/inc/rsctools.hxx b/rsc/inc/rsctools.hxx index eb9f8937b939..fd8e49135eb0 100644 --- a/rsc/inc/rsctools.hxx +++ b/rsc/inc/rsctools.hxx @@ -138,28 +138,41 @@ public: sal_uInt32 Size(){ return( nLen ); }; void Put( sal_uInt64 lVal ) { + union + { + sal_uInt64 lVal64; + sal_uInt32 aVal32[2]; + }; + lVal64 = lVal; if( bSwap ) { - Put( *(((sal_uInt32*)&lVal)+1) ); - Put( *(sal_uInt32*)&lVal ); + Put( aVal32[1] ); + Put( aVal32[0] ); } else { - Put( *(sal_uInt32*)&lVal ); - Put( *(((sal_uInt32*)&lVal)+1) ); + Put( aVal32[0] ); + Put( aVal32[1] ); } } void Put( sal_Int32 lVal ) { + union + { + sal_uInt32 lVal32; + sal_uInt16 aVal16[2]; + }; + lVal32 = lVal; + if( bSwap ) { - Put( *(((sal_uInt16*)&lVal) +1) ); - Put( *(sal_uInt16*)&lVal ); + Put( aVal16[1] ); + Put( aVal16[0] ); } else { - Put( *(sal_uInt16*)&lVal ); - Put( *(((sal_uInt16*)&lVal) +1) ); + Put( aVal16[0] ); + Put( aVal16[1] ); } } void Put( sal_uInt32 nValue ) @@ -171,15 +184,22 @@ public: void PutAt( sal_uInt32 nPos, INT32 lVal ) { + union + { + sal_uInt32 lVal32; + sal_uInt16 aVal16[2]; + }; + lVal32 = lVal; + if( bSwap ) { - PutAt( nPos, *(((sal_uInt16*)&lVal) +1) ); - PutAt( nPos + 2, *(sal_uInt16*)&lVal ); + PutAt( nPos, aVal16[1] ); + PutAt( nPos + 2, aVal16[0] ); } else { - PutAt( nPos, *(sal_uInt16*)&lVal ); - PutAt( nPos + 2, *(((sal_uInt16*)&lVal) +1) ); + PutAt( nPos, aVal16[0] ); + PutAt( nPos + 2, aVal16[1] ); } } void PutAt( sal_uInt32 nPos, sal_uInt32 lVal ) diff --git a/rsc/source/parser/erscerr.cxx b/rsc/source/parser/erscerr.cxx index c889001735fe..818e2066c221 100644 --- a/rsc/source/parser/erscerr.cxx +++ b/rsc/source/parser/erscerr.cxx @@ -69,14 +69,15 @@ ERRTYPE& ERRTYPE::operator = ( const ERRTYPE & rError ) |* Letzte Aenderung MM 06.05.91 |* *************************************************************************/ -void RscError::StdOut( const char * pStr ) +void RscError::StdOut( const char * pStr, const RscVerbosity _verbosityLevel ) { -#ifndef WIN - if( pStr ){ - printf( "%s", pStr ); - fflush( stdout ); + if ( m_verbosity >= _verbosityLevel ) + { + if( pStr ){ + printf( "%s", pStr ); + fflush( stdout ); + } } -#endif } /************************************************************************* diff --git a/rsc/source/parser/rscibas.cxx b/rsc/source/parser/rscibas.cxx index c95f1adc7b52..75f558398bb5 100644 --- a/rsc/source/parser/rscibas.cxx +++ b/rsc/source/parser/rscibas.cxx @@ -67,7 +67,7 @@ void RscTypCont::SETCONST( RscConst * pClass, const char * szString, UINT32 nVal void RscTypCont::SETCONST( RscConst * pClass, Atom nName, UINT32 nVal ) { #if OSL_DEBUG_LEVEL > 2 - fprintf( stderr, "setconst hash: %d\n", nName ); + fprintf( stderr, "setconst hash: %u\n", (unsigned int)nName ); #endif pClass->SetConstant( aNmTb.Put( nName, CONSTNAME, nVal ), nVal ); @@ -106,9 +106,9 @@ void RscLangEnum::Init( RscNameTable& rNames ) { #if OSL_DEBUG_LEVEL > 2 fprintf( stderr, "ISO Language in : %d %d %s\n", - nIndex, - pLangEntry->meLang, - MsLangId::convertLanguageToIsoByteString( pLangEntry->meLang ).GetBuffer() ); + (int)nIndex, + pLangEntry->mnLang, + MsLangId::convertLanguageToIsoByteString( pLangEntry->mnLang ).getStr() ); #endif aLang = pLangEntry->maLangStr; aCountry = pLangEntry->maCountry; @@ -118,7 +118,7 @@ void RscLangEnum::Init( RscNameTable& rNames ) if ( ! GetLangId( aLang )) ULong_Iso_map[ aLang ] = mnLangId; #if OSL_DEBUG_LEVEL > 2 - fprintf( stderr, "ISO Language out: %s 0x%hx\n", aLang.GetBuffer(), mnLangId ); + fprintf( stderr, "ISO Language out: %s 0x%lx\n", aLang.GetBuffer(), mnLangId ); #endif mnLangId++; } @@ -128,7 +128,7 @@ void RscLangEnum::Init( RscNameTable& rNames ) if ( ! GetLangId( aLang )) ULong_Iso_map[ aLang ] = mnLangId; #if OSL_DEBUG_LEVEL > 2 - fprintf( stderr, "ISO Language out: %s 0x%hx", aLang.GetBuffer(), mnLangId ); + fprintf( stderr, "ISO Language out: %s 0x%lx", aLang.GetBuffer(), mnLangId ); #endif mnLangId++; aLang += csep; @@ -137,7 +137,7 @@ void RscLangEnum::Init( RscNameTable& rNames ) if ( ! GetLangId( aLang )) ULong_Iso_map[ aLang ] = mnLangId; #if OSL_DEBUG_LEVEL > 2 - fprintf( stderr, " %s 0x%hx\n", aLang.GetBuffer(), mnLangId ); + fprintf( stderr, " %s 0x%lx\n", aLang.GetBuffer(), mnLangId ); #endif mnLangId++; // hack - survive "x-no-translate" @@ -167,7 +167,7 @@ void RscLangEnum::Init( RscNameTable& rNames ) if ( ! GetLangId( aIsoToken )) ULong_Iso_map[ aIsoToken ] = mnLangId; #if OSL_DEBUG_LEVEL > 2 - fprintf( stderr, "Env ISO Language out: %s 0x%hx\n", aIsoToken.GetBuffer(), mnLangId ); + fprintf( stderr, "Env ISO Language out: %s 0x%lx\n", aIsoToken.GetBuffer(), mnLangId ); #endif mnLangId++; } diff --git a/rsc/source/parser/rscicpx.cxx b/rsc/source/parser/rscicpx.cxx index e69094064754..9ae58087a335 100644 --- a/rsc/source/parser/rscicpx.cxx +++ b/rsc/source/parser/rscicpx.cxx @@ -1449,6 +1449,9 @@ RscTop * RscTypCont::InitClassNumericFormatter( RscTop * pSuper ) nId = aNmTb.Put( "Value", VARNAME ); pClassNumeric->SetVariable( nId, &aIdLong, NULL, 0, NUMERICFORMATTER_VALUE ); + nId = aNmTb.Put( "NoThousandSep", VARNAME ); + pClassNumeric->SetVariable( nId, &aBool, NULL, + 0, NUMERICFORMATTER_NOTHOUSANDSEP ); return pClassNumeric; } @@ -1633,7 +1636,6 @@ RscTop * RscTypCont::InitClassNumericField( RscTop * pSuper ) nId = aNmTb.Put( "SpinSize", VARNAME ); pClassNumericField->SetVariable( nId, &aIdLong, NULL, 0, NUMERICFIELD_SPINSIZE ); - return pClassNumericField; } diff --git a/rsc/source/parser/rscyacc.cxx b/rsc/source/parser/rscyacc.cxx index 93628f381bec..8da3de9bf2b3 100644 --- a/rsc/source/parser/rscyacc.cxx +++ b/rsc/source/parser/rscyacc.cxx @@ -190,7 +190,7 @@ BOOL DoClassHeader( RSCHEADER * pHeader, BOOL bMember ) ObjNode * pNode = new ObjNode( aName1, S.Top().pData, pFI->GetFileIndex() ); - pTC->pEH->StdOut( "." ); + pTC->pEH->StdOut( ".", RscVerbosityVerbose ); if( !aName1.IsId() ) pTC->pEH->Error( ERR_IDEXPECTED, pHeader->pClass, aName1 ); diff --git a/rsc/source/prj/gui.cxx b/rsc/source/prj/gui.cxx index 036494c3bb9d..6bf466348d1b 100644 --- a/rsc/source/prj/gui.cxx +++ b/rsc/source/prj/gui.cxx @@ -57,6 +57,20 @@ static RscCompiler * pRscCompiler = NULL; delete pRscCompiler; } +RscVerbosity lcl_determineVerbosity( int argc, char ** argv ) +{ + for ( int i = 0; i < argc; ++i ) + { + if ( argv[i] == NULL ) + continue; + if ( rsc_stricmp( argv[i], "-verbose" ) == 0 ) + return RscVerbosityVerbose; + if ( rsc_stricmp( argv[i], "-quiet" ) == 0 ) + return RscVerbositySilent; + } + return RscVerbosityNormal; +} + #if defined( UNX ) || ( defined( OS2 ) && ( defined( CSET ) || defined ( GCC ))) || defined (WTC) || defined(ICC) || defined(__MINGW32__) int main ( int argc, char ** argv) { #else @@ -80,7 +94,7 @@ int cdecl main ( int argc, char ** argv) { ERRTYPE aError; InitRscCompiler(); - RscError* pErrHdl = new RscError(); + RscError* pErrHdl = new RscError( lcl_determineVerbosity( argc, argv ) ); #ifdef MTW RscCmdLine* pCmdLine = new RscCmdLine( argc, (char **)argv, pErrHdl ); #else diff --git a/rsc/source/prj/start.cxx b/rsc/source/prj/start.cxx index 5a623efeee51..df4ce12200c5 100644 --- a/rsc/source/prj/start.cxx +++ b/rsc/source/prj/start.cxx @@ -56,6 +56,7 @@ #endif // UNX #include +#include #include /*************** C O D E ************************************************/ @@ -111,25 +112,38 @@ static BOOL CallPrePro( const ByteString& rPrePro, if( !fRspFile ) aNewCmdL.Append( rsc_strdup( rPrePro.GetBuffer() ) ); - for( i = 1; i < int(pCmdLine->GetCount() -1); i++ ){ - if( !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-u", 2 ) - || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-i", 2 ) - || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-d", 2 ) ) + + bool bVerbose = false; + for( i = 1; i < int(pCmdLine->GetCount() -1); i++ ) + { + if ( 0 == rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-verbose" ) ) + { + bVerbose = true; + continue; + } + if ( !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-u", 2 ) + || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-i", 2 ) + || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-d", 2 ) + ) { aNewCmdL.Append( rsc_strdup( (char *)pCmdLine->GetEntry( i ) ) ); } - }; + } + aNewCmdL.Append( rsc_strdup( rInput.GetBuffer() ) ); aNewCmdL.Append( rsc_strdup( rOutput.GetBuffer() ) ); aNewCmdL.Append( (void *)0 ); - printf( "Preprocessor commandline: " ); - for( i = 0; i < (int)(pCmdL->GetCount() -1); i++ ) + if ( bVerbose ) { - printf( " " ); - printf( "%s", (const char *)pCmdL->GetEntry( i ) ); + printf( "Preprocessor commandline: " ); + for( i = 0; i < (int)(pCmdL->GetCount() -1); i++ ) + { + printf( " " ); + printf( "%s", (const char *)pCmdL->GetEntry( i ) ); + } + printf( "\n" ); } - printf( "\n" ); if( fRspFile ) { @@ -150,13 +164,16 @@ static BOOL CallPrePro( const ByteString& rPrePro, } fclose( fRspFile ); - printf( "Preprocessor startline: " ); - for( i = 0; i < (int)(pCmdL->GetCount() -1); i++ ) + if ( bVerbose ) { - printf( " " ); - printf( "%s", (const char *)pCmdL->GetEntry( i ) ); + printf( "Preprocessor startline: " ); + for( i = 0; i < (int)(pCmdL->GetCount() -1); i++ ) + { + printf( " " ); + printf( "%s", (const char *)pCmdL->GetEntry( i ) ); + } + printf( "\n" ); } - printf( "\n" ); } #if ((defined OS2 || defined WNT) && (defined TCPP || defined tcpp)) || defined UNX || defined OS2 @@ -194,7 +211,6 @@ static BOOL CallRsc2( ByteString aRsc2Name, ByteString aSrsName, RscPtrPtr * pCmdLine ) { - RscPtrPtr aNewCmdL; // Kommandozeile int i, nExit; ByteString* pString; ByteString aRspFileName; // Response-Datei @@ -203,21 +219,21 @@ static BOOL CallRsc2( ByteString aRsc2Name, aRspFileName = ::GetTmpFileName(); fRspFile = fopen( aRspFileName.GetBuffer(), "w" ); - printf( "Rsc2 commandline: " ); - aNewCmdL.Append( rsc_strdup( aRsc2Name.GetBuffer() ) ); - printf( "%s", (const char *)aNewCmdL.GetEntry( aNewCmdL.GetCount() -1 ) ); - printf( " " ); - ByteString aTmpStr( '@' ); - aTmpStr += aRspFileName; - aNewCmdL.Append( rsc_strdup( aTmpStr.GetBuffer() ) ); - printf( "%s", (const char *)aNewCmdL.GetEntry( aNewCmdL.GetCount() -1 ) ); - aNewCmdL.Append( (void *)0 ); - printf( "\n" ); - + RscVerbosity eVerbosity = RscVerbosityNormal; if( fRspFile ) { for( i = 1; i < (int)(pCmdLine->GetCount() -1); i++ ) { + if ( !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-verbose" ) ) + { + eVerbosity = RscVerbosityVerbose; + continue; + } + if ( !rsc_stricmp( (char *)pCmdLine->GetEntry( i ), "-quiet" ) ) + { + eVerbosity = RscVerbositySilent; + continue; + } if( !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-fp=", 4 ) || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-fo=", 4 ) || !rsc_strnicmp( (char *)pCmdLine->GetEntry( i ), "-pp=", 4 ) @@ -261,6 +277,22 @@ static BOOL CallRsc2( ByteString aRsc2Name, fclose( fRspFile ); }; + RscPtrPtr aNewCmdL; // Kommandozeile + aNewCmdL.Append( rsc_strdup( aRsc2Name.GetBuffer() ) ); + ByteString aTmpStr( '@' ); + aTmpStr += aRspFileName; + aNewCmdL.Append( rsc_strdup( aTmpStr.GetBuffer() ) ); + aNewCmdL.Append( (void *)0 ); + + if ( eVerbosity >= RscVerbosityVerbose ) + { + printf( "Rsc2 commandline: " ); + printf( "%s", (const char *)aNewCmdL.GetEntry( 0 ) ); + printf( " " ); + printf( "%s", (const char *)aNewCmdL.GetEntry( 1 ) ); + printf( "\n" ); + } + #if ((defined OS2 || defined WNT) && (defined TCPP || defined tcpp)) || defined UNX || defined OS2 nExit = spawnvp( P_WAIT, aRsc2Name.GetBuffer(), (char* const*)aNewCmdL.GetBlock() ); #elif defined CSET @@ -306,8 +338,10 @@ int cdecl main ( int argc, char ** argv) BOOL bHelp = FALSE; BOOL bError = FALSE; BOOL bResponse = FALSE; - ByteString aPrePro( "rscpp" ); - ByteString aRsc2Name( "rsc2" ); + ByteString aSolarbin(getenv("SOLARBINDIR")); + ByteString aDelim("/"); + ByteString aPrePro; //( aSolarbin + aDelim + ByteString("rscpp")); + ByteString aRsc2Name; //( aSolarbin + aDelim + ByteString("rsc2")); ByteString aSrsName; ByteString aResName; RscStrList aInputList; @@ -318,7 +352,13 @@ int cdecl main ( int argc, char ** argv) sal_uInt32 i; ByteString* pString; - printf( "VCL Resource Compiler 3.0\n" ); + aPrePro = aSolarbin; + aPrePro += aDelim; + aPrePro += ByteString("rscpp"); + + aRsc2Name = aSolarbin; + aRsc2Name += aDelim; + aRsc2Name += ByteString("rsc2"); pStr = ::ResponseFile( &aCmdLine, argv, argc ); if( pStr ) diff --git a/rsc/source/rsc/rsc.cxx b/rsc/source/rsc/rsc.cxx index 953b837055de..934c41d5e9a9 100644 --- a/rsc/source/rsc/rsc.cxx +++ b/rsc/source/rsc/rsc.cxx @@ -520,15 +520,18 @@ printf( "khg\n" ); } }; - pTC->pEH->StdOut( "Files: " ); - pFName = pTC->aFileTab.First(); - while( pFName ) + if ( pTC->pEH->GetVerbosity() >= RscVerbosityVerbose ) { - pTC->pEH->StdOut( pFName->aFileName.GetBuffer() ); - pTC->pEH->StdOut( " " ); - pFName = pTC->aFileTab.Next(); - }; - pTC->pEH->StdOut( "\n" ); + pTC->pEH->StdOut( "Files: " ); + pFName = pTC->aFileTab.First(); + while( pFName ) + { + pTC->pEH->StdOut( pFName->aFileName.GetBuffer() ); + pTC->pEH->StdOut( " " ); + pFName = pTC->aFileTab.Next(); + }; + pTC->pEH->StdOut( "\n" ); + } if( aError.IsOk() ) aError = Link(); @@ -554,9 +557,9 @@ void RscCompiler::EndCompile() { if( pCL->aOutputSrs.Len() && (pCL->nCommands & NOLINK_FLAG) ) { - pTC->pEH->StdOut( "Writing file " ); - pTC->pEH->StdOut( pCL->aOutputSrs.GetBuffer() ); - pTC->pEH->StdOut( ".\n" ); + pTC->pEH->StdOut( "Writing file ", RscVerbosityVerbose ); + pTC->pEH->StdOut( pCL->aOutputSrs.GetBuffer(), RscVerbosityVerbose ); + pTC->pEH->StdOut( ".\n", RscVerbosityVerbose ); // kopiere von TMP auf richtigen Namen unlink( pCL->aOutputSrs.GetBuffer() ); // Zieldatei loeschen @@ -588,9 +591,9 @@ void RscCompiler::EndCompile() if ( aTmpOutputHxx.Len() ) { - pTC->pEH->StdOut( "Writing file " ); - pTC->pEH->StdOut( pCL->aOutputHxx.GetBuffer() ); - pTC->pEH->StdOut( ".\n" ); + pTC->pEH->StdOut( "Writing file ", RscVerbosityVerbose ); + pTC->pEH->StdOut( pCL->aOutputHxx.GetBuffer(), RscVerbosityVerbose ); + pTC->pEH->StdOut( ".\n", RscVerbosityVerbose ); // kopiere von TMP auf richtigen Namen unlink( pCL->aOutputHxx.GetBuffer() ); // Zieldatei loeschen @@ -601,9 +604,9 @@ void RscCompiler::EndCompile() if( aTmpOutputCxx.Len() ) { - pTC->pEH->StdOut( "Writing file " ); - pTC->pEH->StdOut( pCL->aOutputCxx.GetBuffer() ); - pTC->pEH->StdOut( ".\n" ); + pTC->pEH->StdOut( "Writing file ", RscVerbosityVerbose ); + pTC->pEH->StdOut( pCL->aOutputCxx.GetBuffer(), RscVerbosityVerbose ); + pTC->pEH->StdOut( ".\n", RscVerbosityVerbose ); // kopiere von TMP auf richtigen Namen unlink( pCL->aOutputCxx.GetBuffer() ); // Zieldatei loeschen @@ -614,9 +617,9 @@ void RscCompiler::EndCompile() if( aTmpOutputRcCtor.Len() ) { - pTC->pEH->StdOut( "Writing file " ); - pTC->pEH->StdOut( pCL->aOutputRcCtor.GetBuffer() ); - pTC->pEH->StdOut( ".\n" ); + pTC->pEH->StdOut( "Writing file ", RscVerbosityVerbose ); + pTC->pEH->StdOut( pCL->aOutputRcCtor.GetBuffer(), RscVerbosityVerbose ); + pTC->pEH->StdOut( ".\n", RscVerbosityVerbose ); // kopiere von TMP auf richtigen Namen unlink( pCL->aOutputRcCtor.GetBuffer() ); // Zieldatei loeschen @@ -776,14 +779,14 @@ ERRTYPE RscCompiler :: ParseOneFile( ULONG lFileKey, { RscFileInst aFileInst( pTC, lFileKey, lFileKey, finput ); - pTC->pEH->StdOut( "reading file " ); - pTC->pEH->StdOut( aParseFile.GetBuffer() ); - pTC->pEH->StdOut( " " ); + pTC->pEH->StdOut( "reading file ", RscVerbosityVerbose ); + pTC->pEH->StdOut( aParseFile.GetBuffer(), RscVerbosityVerbose ); + pTC->pEH->StdOut( " ", RscVerbosityVerbose ); aError = ::parser( &aFileInst ); if( aError.IsError() ) pTC->Delete( lFileKey );//Resourceobjekte loeschen - pTC->pEH->StdOut( "\n" ); + pTC->pEH->StdOut( "\n", RscVerbosityVerbose ); fclose( finput ); }; diff --git a/sax/inc/sax/fshelper.hxx b/sax/inc/sax/fshelper.hxx index b1ce4ba39d1b..5223c253af91 100644 --- a/sax/inc/sax/fshelper.hxx +++ b/sax/inc/sax/fshelper.hxx @@ -39,11 +39,13 @@ #include #include "sax/dllapi.h" -#define FSNS(namespace, element) ((namespace << 16) | element) -#define FSEND -1 // same as XML_TOKEN_INVALID +#define FSNS(namespc, element) ((namespc << 16) | element) +const sal_Int32 FSEND = -1; // same as XML_TOKEN_INVALID namespace sax_fastparser { +enum MergeMarksEnum { MERGE_MARKS_APPEND = 0, MERGE_MARKS_PREPEND = 1, MERGE_MARKS_POSTPONE = 2 }; + typedef ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList > XFastAttributeListRef; class FastSaxSerializer; @@ -82,6 +84,10 @@ public: inline void singleElementNS(sal_Int32 namespaceTokenId, sal_Int32 elementTokenId, XFastAttributeListRef xAttrList) { singleElementV(FSNS( namespaceTokenId, elementTokenId), xAttrList); } + void startElementV(sal_Int32 elementTokenId, XFastAttributeListRef xAttrList); + inline void startElementNS(sal_Int32 namespaceTokenId, sal_Int32 elementTokenId, XFastAttributeListRef xAttrList) + { startElementV( FSNS( namespaceTokenId, elementTokenId ), xAttrList ); } + FastSerializerHelper* write(const char* value); FastSerializerHelper* write(const rtl::OUString& value); FastSerializerHelper* write(sal_Int32 value); @@ -99,7 +105,7 @@ public: FastAttributeList *createAttrList(); void mark(); - void mergeTopMarks( bool bPrepend = false ); + void mergeTopMarks( MergeMarksEnum eMergeType = MERGE_MARKS_APPEND ); private: diff --git a/sax/inc/sax/tools/converter.hxx b/sax/inc/sax/tools/converter.hxx index 18212dfb9b8b..f8c988d2fceb 100644 --- a/sax/inc/sax/tools/converter.hxx +++ b/sax/inc/sax/tools/converter.hxx @@ -31,11 +31,13 @@ #ifndef _SAX_CONVERTER_HXX #define _SAX_CONVERTER_HXX -#include #include "sax/dllapi.h" -#include + +#include + #include + namespace rtl { class OUString; @@ -43,8 +45,12 @@ class OUStringBuffer; } namespace com { namespace sun { namespace star { - namespace util { struct DateTime; } -}}} + namespace util { + struct Date; + struct DateTime; + struct Duration; + } +} } } namespace sax { @@ -138,31 +144,43 @@ public: /** convert string to double number (using ::rtl::math) with unit conversion */ static bool convertDouble(double& rValue, const ::rtl::OUString& rString, sal_Int16 nTargetUnit ); - /** convert double to ISO Time String */ - static void convertTime( ::rtl::OUStringBuffer& rBuffer, - const double& fTime); + /** convert double to ISO "duration" string; negative durations allowed */ + static void convertDuration(::rtl::OUStringBuffer& rBuffer, + const double fTime); - /** convert util::DateTime to ISO Time String */ - static void convertTime( ::rtl::OUStringBuffer& rBuffer, - const ::com::sun::star::util::DateTime& rDateTime ); + /** convert util::Duration to ISO "duration" string */ + static void convertDuration(::rtl::OUStringBuffer& rBuffer, + const ::com::sun::star::util::Duration& rDuration); - /** convert ISO Time String to double */ - static bool convertTime( double& fTime, + /** convert ISO "duration" string to double; negative durations allowed */ + static bool convertDuration(double & rfTime, const ::rtl::OUString& rString); - /** convert ISO Time String to util::DateTime */ - static bool convertTime( ::com::sun::star::util::DateTime& rDateTime, - const ::rtl::OUString& rString ); + /** convert ISO "duration" string to util::Duration */ + static bool convertDuration(::com::sun::star::util::Duration& rDuration, + const ::rtl::OUString& rString); - /** convert util::DateTime to ISO Date String */ + /** convert util::Date to ISO "date" string */ + static void convertDate( ::rtl::OUStringBuffer& rBuffer, + const com::sun::star::util::Date& rDate ); + + /** convert util::DateTime to ISO "date" or "dateTime" string */ static void convertDateTime( ::rtl::OUStringBuffer& rBuffer, const com::sun::star::util::DateTime& rDateTime, bool bAddTimeIf0AM = false ); - /** convert ISO Date String to util::DateTime */ + /** convert ISO "date" or "dateTime" string to util::DateTime */ static bool convertDateTime( com::sun::star::util::DateTime& rDateTime, const ::rtl::OUString& rString ); + /** convert ISO "date" or "dateTime" string to util::DateTime or + util::Date */ + static bool convertDateOrDateTime( + com::sun::star::util::Date & rDate, + com::sun::star::util::DateTime & rDateTime, + bool & rbDateTime, + const ::rtl::OUString & rString ); + /** gets the position of the first comma after npos in the string rStr. Commas inside '"' pairs are not matched */ static sal_Int32 indexOfComma( const ::rtl::OUString& rStr, diff --git a/sax/source/expatwrap/attrlistimpl.cxx b/sax/source/expatwrap/attrlistimpl.cxx index 1ec1128516fd..4eb07be50311 100644 --- a/sax/source/expatwrap/attrlistimpl.cxx +++ b/sax/source/expatwrap/attrlistimpl.cxx @@ -32,13 +32,6 @@ #include -#if OSL_DEBUG_LEVEL == 0 -# ifndef NDEBUG -# define NDEBUG -# endif -#endif -#include - #include using namespace ::std; diff --git a/sax/source/expatwrap/sax_expat.cxx b/sax/source/expatwrap/sax_expat.cxx index d9553113c759..b1726f750127 100644 --- a/sax/source/expatwrap/sax_expat.cxx +++ b/sax/source/expatwrap/sax_expat.cxx @@ -39,17 +39,14 @@ #include #include #include +#include #include #include #include #include -#ifdef SYSTEM_EXPAT #include -#else -#include "expat/xmlparse.h" -#endif using namespace ::rtl; using namespace ::std; @@ -135,6 +132,11 @@ OUString XmlChar2OUString( const XML_Char *p ) pThis->rDocumentLocator->getColumnNumber()\ ) );\ }\ + catch( com::sun::star::uno::RuntimeException &e ) {\ + pThis->bExceptionWasThrown = sal_True; \ + pThis->bRTExceptionWasThrown = sal_True; \ + pImpl->rtexception = e; \ + }\ }\ ((void)0) @@ -255,7 +257,9 @@ public: // module scope // Exception cannot be thrown through the C-XmlParser (possible resource leaks), // therefor the exception must be saved somewhere. SAXParseException exception; - sal_Bool bExceptionWasThrown; + RuntimeException rtexception; + sal_Bool bExceptionWasThrown; + sal_Bool bRTExceptionWasThrown; Locale locale; @@ -374,7 +378,8 @@ extern "C" // LocatorImpl //--------------------------------------------- class LocatorImpl : - public WeakImplHelper1< XLocator > + public WeakImplHelper2< XLocator, com::sun::star::io::XSeekable > + // should use a different interface for stream positions! { public: LocatorImpl( SaxExpatParser_Impl *p ) @@ -400,6 +405,20 @@ public: //XLocator return m_pParser->getEntity().structSource.sSystemId; } + // XSeekable (only for getPosition) + + virtual void SAL_CALL seek( sal_Int64 ) throw() + { + } + virtual sal_Int64 SAL_CALL getPosition() throw() + { + return XML_GetCurrentByteIndex( m_pParser->getEntity().pParser ); + } + virtual ::sal_Int64 SAL_CALL getLength() throw() + { + return 0; + } + private: SaxExpatParser_Impl *m_pParser; @@ -421,6 +440,7 @@ SaxExpatParser::SaxExpatParser( ) m_pImpl->rAttrList = Reference< XAttributeList > ( m_pImpl->pAttrList ); m_pImpl->bExceptionWasThrown = sal_False; + m_pImpl->bRTExceptionWasThrown = sal_False; } SaxExpatParser::~SaxExpatParser() @@ -721,6 +741,9 @@ void SaxExpatParser_Impl::parse( ) if( ! bContinue || this->bExceptionWasThrown ) { + if ( this->bRTExceptionWasThrown ) + throw rtexception; + // Error during parsing ! XML_Error xmlE = XML_GetErrorCode( getEntity().pParser ); OUString sSystemId = rDocumentLocator->getSystemId(); diff --git a/sax/source/expatwrap/saxwriter.cxx b/sax/source/expatwrap/saxwriter.cxx index 9be52cdd24c3..717767d86e11 100644 --- a/sax/source/expatwrap/saxwriter.cxx +++ b/sax/source/expatwrap/saxwriter.cxx @@ -208,6 +208,8 @@ public: // If there are invalid characters in the string it returns sal_False. // Than the calling method has to throw the needed Exception. inline sal_Bool comment(const rtl::OUString& rComment) throw( SAXException ); + + inline void clearBuffer() throw( SAXException ); }; const sal_Bool g_bValidCharsBelow32[32] = @@ -434,7 +436,7 @@ inline sal_Bool SaxWriterHelper::convertToXML( const sal_Unicode * pStr, OSL_ENSURE( nSurrogate != 0, "lone 2nd Unicode surrogate" ); nSurrogate = ( nSurrogate << 10 ) | ( c & 0x03ff ); - if( nSurrogate > 0x00010000 && nSurrogate <= 0x001FFFFF ) + if( nSurrogate >= 0x00010000 && nSurrogate <= 0x0010FFFF ) { sal_Int8 aBytes[] = { sal_Int8(0xF0 | ((nSurrogate >> 18) & 0x0F)), sal_Int8(0x80 | ((nSurrogate >> 12) & 0x3F)), @@ -693,6 +695,17 @@ inline void SaxWriterHelper::endDocument() throw( SAXException ) } } +inline void SaxWriterHelper::clearBuffer() throw( SAXException ) +{ + FinishStartElement(); + if (nCurrentPos > 0) + { + m_Sequence.realloc(nCurrentPos); + nCurrentPos = writeSequence(); + m_Sequence.realloc(SEQUENCESIZE); + } +} + inline sal_Bool SaxWriterHelper::processingInstruction(const rtl::OUString& rTarget, const rtl::OUString& rData) throw( SAXException ) { FinishStartElement(); @@ -851,7 +864,7 @@ inline sal_Int32 calcXMLByteLength( const sal_Unicode *pStr, sal_Int32 nStrLen, { // 2. surrogate: write as UTF-8 (if range is OK nSurrogate = ( nSurrogate << 10 ) | ( c & 0x03ff ); - if( nSurrogate > 0x00010000 && nSurrogate <= 0x001FFFFF ) + if( nSurrogate >= 0x00010000 && nSurrogate <= 0x0010FFFF ) nOutputLength += 4; nSurrogate = 0; } @@ -927,12 +940,20 @@ public: // XActiveDataSource virtual void SAL_CALL setOutputStream(const Reference< XOutputStream > & aStream) throw (RuntimeException) { + // temporary: set same stream again to clear buffer + if ( m_out == aStream && mp_SaxWriterHelper && m_bDocStarted ) + mp_SaxWriterHelper->clearBuffer(); + else + { + m_out = aStream; delete mp_SaxWriterHelper; mp_SaxWriterHelper = new SaxWriterHelper(m_out); m_bDocStarted = sal_False; m_nLevel = 0; m_bIsCDATA = sal_False; + + } } virtual Reference< XOutputStream > SAL_CALL getOutputStream(void) throw(RuntimeException) diff --git a/sax/source/fastparser/fastparser.hxx b/sax/source/fastparser/fastparser.hxx index 07cb6afac77d..3e6220a0c782 100644 --- a/sax/source/fastparser/fastparser.hxx +++ b/sax/source/fastparser/fastparser.hxx @@ -42,11 +42,7 @@ #include #include -#ifdef SYSTEM_EXPAT #include -#else -#include "expat/xmlparse.h" -#endif #include "xml2utf.hxx" #include diff --git a/sax/source/tools/converter.cxx b/sax/source/tools/converter.cxx index 354ee1936094..e13df493628a 100644 --- a/sax/source/tools/converter.cxx +++ b/sax/source/tools/converter.cxx @@ -32,8 +32,9 @@ #include #include #include -#include +#include #include + #include #include #include "sax/tools/converter.hxx" @@ -683,11 +684,10 @@ bool Converter::convertDouble(double& rValue, const ::rtl::OUString& rString) return ( eStatus == rtl_math_ConversionStatus_Ok ); } -/** convert double to ISO Time String; negative durations allowed */ -void Converter::convertTime( ::rtl::OUStringBuffer& rBuffer, - const double& fTime) +/** convert double to ISO "duration" string; negative durations allowed */ +void Converter::convertDuration(::rtl::OUStringBuffer& rBuffer, + const double fTime) { - double fValue = fTime; // take care of negative durations as specified in: @@ -755,9 +755,9 @@ void Converter::convertTime( ::rtl::OUStringBuffer& rBuffer, rBuffer.append( sal_Unicode('S')); } -/** convert ISO Time String to double; negative durations allowed */ -bool Converter::convertTime( double& fTime, - const ::rtl::OUString& rString) +/** convert ISO "duration" string to double; negative durations allowed */ +bool Converter::convertDuration(double& rfTime, + const ::rtl::OUString& rString) { rtl::OUString aTrimmed = rString.trim().toAsciiUpperCase(); const sal_Unicode* pStr = aTrimmed.getStr(); @@ -880,64 +880,403 @@ bool Converter::convertTime( double& fTime, fTempTime = -fTempTime; } - fTime = fTempTime; + rfTime = fTempTime; } return bSuccess; } -/** convert util::DateTime to ISO Time String */ -void Converter::convertTime( ::rtl::OUStringBuffer& rBuffer, - const ::com::sun::star::util::DateTime& rDateTime ) +/** convert util::Duration to ISO "duration" string */ +void Converter::convertDuration(::rtl::OUStringBuffer& rBuffer, + const ::util::Duration& rDuration) { - double fHour = rDateTime.Hours; - double fMin = rDateTime.Minutes; - double fSec = rDateTime.Seconds; - double fSec100 = rDateTime.HundredthSeconds; - double fTempTime = fHour / 24; - fTempTime += fMin / (24 * 60); - fTempTime += fSec / (24 * 60 * 60); - fTempTime += fSec100 / (24 * 60 * 60 * 100); - convertTime( rBuffer, fTempTime ); + if (rDuration.Negative) + { + rBuffer.append(sal_Unicode('-')); + } + rBuffer.append(sal_Unicode('P')); + const bool bHaveDate(static_cast(rDuration.Years) + +static_cast(rDuration.Months) + +static_cast(rDuration.Days)); + if (rDuration.Years) + { + rBuffer.append(static_cast(rDuration.Years)); + rBuffer.append(sal_Unicode('Y')); + } + if (rDuration.Months) + { + rBuffer.append(static_cast(rDuration.Months)); + rBuffer.append(sal_Unicode('M')); + } + if (rDuration.Days) + { + rBuffer.append(static_cast(rDuration.Days)); + rBuffer.append(sal_Unicode('D')); + } + const sal_Int32 nHSecs(static_cast(rDuration.Seconds) + + static_cast(rDuration.HundredthSeconds)); + if (static_cast(rDuration.Hours) + + static_cast(rDuration.Minutes) + nHSecs) + { + rBuffer.append(sal_Unicode('T')); // time separator + if (rDuration.Hours) + { + rBuffer.append(static_cast(rDuration.Hours)); + rBuffer.append(sal_Unicode('H')); + } + if (rDuration.Minutes) + { + rBuffer.append(static_cast(rDuration.Minutes)); + rBuffer.append(sal_Unicode('M')); + } + if (nHSecs) + { + // seconds must not be omitted (i.e. ".42S" is not valid) + rBuffer.append(static_cast(rDuration.Seconds)); + if (rDuration.HundredthSeconds) + { + rBuffer.append(sal_Unicode('.')); + const sal_Int32 nHundredthSeconds( + rDuration.HundredthSeconds % 100); + if (nHundredthSeconds < 10) + { + rBuffer.append(sal_Unicode('0')); + } + rBuffer.append(nHundredthSeconds); + } + rBuffer.append(sal_Unicode('S')); + } + } + else if (!bHaveDate) + { + // zero duration: XMLSchema-2 says there must be at least one component + rBuffer.append(sal_Unicode('0')); + rBuffer.append(sal_Unicode('D')); + } } -/** convert ISO Time String to util::DateTime */ -bool Converter::convertTime( ::com::sun::star::util::DateTime& rDateTime, - const ::rtl::OUString& rString ) +enum Result { R_NOTHING, R_OVERFLOW, R_SUCCESS }; + +static Result +readUnsignedNumber(const ::rtl::OUString & rString, + sal_Int32 & io_rnPos, sal_Int32 & o_rNumber) { - double fCalculatedTime = 0.0; - if( convertTime( fCalculatedTime, rString ) ) + bool bOverflow(false); + sal_Int32 nTemp(0); + + for (sal_Int32 nPos = io_rnPos; (nPos < rString.getLength()); ++nPos) { - // #101357# declare as volatile to prevent optimization - // (gcc 3.0.1 Linux) - volatile double fTempTime = fCalculatedTime; - fTempTime *= 24; - double fHoursValue = ::rtl::math::approxFloor (fTempTime); - fTempTime -= fHoursValue; - fTempTime *= 60; - double fMinsValue = ::rtl::math::approxFloor (fTempTime); - fTempTime -= fMinsValue; - fTempTime *= 60; - double fSecsValue = ::rtl::math::approxFloor (fTempTime); - fTempTime -= fSecsValue; - double f100SecsValue = 0.0; + const sal_Unicode c = rString[nPos]; + if ((sal_Unicode('0') <= c) && (c <= sal_Unicode('9'))) + { + nTemp *= 10; + nTemp += (c - sal_Unicode('0')); + if (nTemp >= SAL_MAX_INT16) + { + bOverflow = true; + } + } + else + { + if (io_rnPos != nPos) // read something? + { + io_rnPos = nPos; + if (bOverflow) + { + return R_OVERFLOW; + } + else + { + o_rNumber = nTemp; + return R_SUCCESS; + } + } + else break; + } + } - if( fTempTime > 0.00001 ) - f100SecsValue = fTempTime; - - rDateTime.Year = 0; - rDateTime.Month = 0; - rDateTime.Day = 0; - rDateTime.Hours = static_cast < sal_uInt16 > ( fHoursValue ); - rDateTime.Minutes = static_cast < sal_uInt16 > ( fMinsValue ); - rDateTime.Seconds = static_cast < sal_uInt16 > ( fSecsValue ); - rDateTime.HundredthSeconds = static_cast < sal_uInt16 > ( f100SecsValue * 100.0 ); + o_rNumber = -1; + return R_NOTHING; +} +static bool +readDurationT(const ::rtl::OUString & rString, sal_Int32 & io_rnPos) +{ + if ((io_rnPos < rString.getLength()) && + (rString[io_rnPos] == sal_Unicode('T'))) + { + ++io_rnPos; return true; } return false; } -/** convert util::DateTime to ISO Date String */ +static bool +readDurationComponent(const ::rtl::OUString & rString, + sal_Int32 & io_rnPos, sal_Int32 & io_rnTemp, bool & io_rbTimePart, + sal_Int32 & o_rnTarget, const sal_Unicode c) +{ + if ((io_rnPos < rString.getLength())) + { + if (c == rString[io_rnPos]) + { + ++io_rnPos; + if (-1 != io_rnTemp) + { + o_rnTarget = io_rnTemp; + io_rnTemp = -1; + if (!io_rbTimePart) + { + io_rbTimePart = readDurationT(rString, io_rnPos); + } + return (R_OVERFLOW != + readUnsignedNumber(rString, io_rnPos, io_rnTemp)); + } + else + { + return false; + } + } + } + return true; +} + +/** convert ISO "duration" string to util::Duration */ +bool Converter::convertDuration(util::Duration& rDuration, + const ::rtl::OUString& rString) +{ + const ::rtl::OUString string = rString.trim().toAsciiUpperCase(); + sal_Int32 nPos(0); + + bool bIsNegativeDuration(false); + if (string.getLength() && (sal_Unicode('-') == string[0])) + { + bIsNegativeDuration = true; + ++nPos; + } + + if ((nPos < string.getLength()) + && (string[nPos] != sal_Unicode('P'))) // duration must start with "P" + { + return false; + } + + ++nPos; + + /// last read number; -1 == no valid number! always reset after using! + sal_Int32 nTemp(-1); + bool bTimePart(false); // have we read 'T'? + bool bSuccess(false); + sal_Int32 nYears(0); + sal_Int32 nMonths(0); + sal_Int32 nDays(0); + sal_Int32 nHours(0); + sal_Int32 nMinutes(0); + sal_Int32 nSeconds(0); + sal_Int32 nHundredthSeconds(0); + + bTimePart = readDurationT(string, nPos); + bSuccess = (R_SUCCESS == readUnsignedNumber(string, nPos, nTemp)); + + if (!bTimePart && bSuccess) + { + bSuccess = readDurationComponent(string, nPos, nTemp, bTimePart, + nYears, sal_Unicode('Y')); + } + + if (!bTimePart && bSuccess) + { + bSuccess = readDurationComponent(string, nPos, nTemp, bTimePart, + nMonths, sal_Unicode('M')); + } + + if (!bTimePart && bSuccess) + { + bSuccess = readDurationComponent(string, nPos, nTemp, bTimePart, + nDays, sal_Unicode('D')); + } + + if (bTimePart) + { + if (-1 == nTemp) // a 'T' must be followed by a component + { + bSuccess = false; + } + + if (bSuccess) + { + bSuccess = readDurationComponent(string, nPos, nTemp, bTimePart, + nHours, sal_Unicode('H')); + } + + if (bSuccess) + { + bSuccess = readDurationComponent(string, nPos, nTemp, bTimePart, + nMinutes, sal_Unicode('M')); + } + + // eeek! seconds are icky. + if ((nPos < string.getLength()) && bSuccess) + { + if (sal_Unicode('.') == string[nPos]) + { + ++nPos; + if (-1 != nTemp) + { + nSeconds = nTemp; + nTemp = -1; + const sal_Int32 nStart(nPos); + bSuccess = + (R_SUCCESS == readUnsignedNumber(string, nPos, nTemp)); + if ((nPos < string.getLength()) && bSuccess) + { + if (sal_Unicode('S') == string[nPos]) + { + ++nPos; + if (-1 != nTemp) + { + nTemp = -1; + const sal_Int32 nDigits = nPos - nStart; + OSL_ENSURE(nDigits > 0, "bad code monkey"); + nHundredthSeconds = 10 * + (string[nStart] - sal_Unicode('0')); + if (nDigits >= 2) + { + nHundredthSeconds += + (string[nStart+1] - sal_Unicode('0')); + } + } + else + { + bSuccess = false; + } + } + } + } + else + { + bSuccess = false; + } + } + else if (sal_Unicode('S') == string[nPos]) + { + ++nPos; + if (-1 != nTemp) + { + nSeconds = nTemp; + nTemp = -1; + } + else + { + bSuccess = false; + } + } + } + } + + if (nPos != string.getLength()) // string not processed completely? + { + bSuccess = false; + } + + if (nTemp != -1) // unprocessed number? + { + bSuccess = false; + } + + if (bSuccess) + { + rDuration.Negative = bIsNegativeDuration; + rDuration.Years = static_cast(nYears); + rDuration.Months = static_cast(nMonths); + rDuration.Days = static_cast(nDays); + rDuration.Hours = static_cast(nHours); + rDuration.Minutes = static_cast(nMinutes); + rDuration.Seconds = static_cast(nSeconds); + rDuration.HundredthSeconds = static_cast(nHundredthSeconds); + } + + return bSuccess; +} + +#if 0 +//FIXME +struct Test { + static bool eqDuration(util::Duration a, util::Duration b) { + return a.Years == b.Years && a.Months == b.Months && a.Days == b.Days + && a.Hours == b.Hours && a.Minutes == b.Minutes + && a.Seconds == b.Seconds + && a.HundredthSeconds == b.HundredthSeconds + && a.Negative == b.Negative; + } + static void doTest(util::Duration const & rid, const char * pis) + { + bool bSuccess(false); + ::rtl::OUStringBuffer buf; + Converter::convertDuration(buf, rid); + ::rtl::OUString os(buf.makeStringAndClear()); + OSL_TRACE(::rtl::OUStringToOString(os.getStr(), RTL_TEXTENCODING_UTF8)); + OSL_ASSERT(os.equalsAscii(pis)); + util::Duration od; + bSuccess = Converter::convertDuration(od, os); + OSL_TRACE("%d %dY %dM %dD %dH %dM %dS %dH", + od.Negative, od.Years, od.Months, od.Days, + od.Hours, od.Minutes, od.Seconds, od.HundredthSeconds); + OSL_ASSERT(bSuccess); + OSL_ASSERT(eqDuration(rid, od)); + } + static void doTestF(const char * pis) + { + util::Duration od; + bool bSuccess = Converter::convertDuration(od, + ::rtl::OUString::createFromAscii(pis)); + OSL_TRACE("%d %dY %dM %dD %dH %dM %dS %dH", + od.Negative, od.Years, od.Months, od.Days, + od.Hours, od.Minutes, od.Seconds, od.HundredthSeconds); + OSL_ASSERT(!bSuccess); + } + Test() { + OSL_TRACE("\nSAX CONVERTER TEST BEGIN\n"); + doTest( util::Duration(false, 1, 0, 0, 0, 0, 0, 0), "P1Y" ); + doTest( util::Duration(false, 0, 42, 0, 0, 0, 0, 0), "P42M" ); + doTest( util::Duration(false, 0, 0, 111, 0, 0, 0, 0), "P111D" ); + doTest( util::Duration(false, 0, 0, 0, 52, 0, 0, 0), "PT52H" ); + doTest( util::Duration(false, 0, 0, 0, 0, 717, 0, 0), "PT717M" ); + doTest( util::Duration(false, 0, 0, 0, 0, 0, 121, 0), "PT121S" ); + doTest( util::Duration(false, 0, 0, 0, 0, 0, 0, 19), "PT0.19S" ); + doTest( util::Duration(false, 0, 0, 0, 0, 0, 0, 9), "PT0.09S" ); + doTest( util::Duration(true , 0, 0, 9999, 0, 0, 0, 0), "-P9999D" ); + doTest( util::Duration(true , 7, 6, 5, 4, 3, 2, 1), + "-P7Y6M5DT4H3M2.01S" ); + doTest( util::Duration(false, 0, 6, 0, 0, 3, 0, 0), "P6MT3M" ); + doTest( util::Duration(false, 0, 0, 0, 0, 0, 0, 0), "P0D" ); + doTestF("1Y1M"); + doTestF("P-1Y1M"); + doTestF("P1M1Y"); + doTestF("PT1Y"); + doTestF("P1Y1M1M"); + doTestF("P1YT1MT1M"); + doTestF("P1YT"); + doTestF("P99999999999Y"); + doTestF("PT.1S"); + doTestF("PT5M.134S"); + doTestF("PT1.S"); + OSL_TRACE("\nSAX CONVERTER TEST END\n"); + } +}; +static Test test; +#endif + +/** convert util::Date to ISO "date" string */ +void Converter::convertDate( + ::rtl::OUStringBuffer& i_rBuffer, + const util::Date& i_rDate) +{ + const util::DateTime dt( + 0, 0, 0, 0, i_rDate.Day, i_rDate.Month, i_rDate.Year); + convertDateTime(i_rBuffer, dt, false); +} + +/** convert util::DateTime to ISO "date" or "dateTime" string */ void Converter::convertDateTime( ::rtl::OUStringBuffer& i_rBuffer, const com::sun::star::util::DateTime& i_rDateTime, @@ -990,9 +1329,36 @@ void Converter::convertDateTime( } } -/** convert ISO Date String to util::DateTime */ -bool Converter::convertDateTime( com::sun::star::util::DateTime& rDateTime, - const ::rtl::OUString& rString ) +/** convert ISO "date" or "dateTime" string to util::DateTime */ +bool Converter::convertDateTime( util::DateTime& rDateTime, + const ::rtl::OUString& rString ) +{ + bool isDateTime; + util::Date date; + if (convertDateOrDateTime(date, rDateTime, isDateTime, rString)) + { + if (!isDateTime) + { + rDateTime.Year = date.Year; + rDateTime.Month = date.Month; + rDateTime.Day = date.Day; + rDateTime.Hours = 0; + rDateTime.Minutes = 0; + rDateTime.Seconds = 0; + rDateTime.HundredthSeconds = 0; + } + return true; + } + else + { + return false; + } +} + +/** convert ISO "date" or "dateTime" string to util::DateTime or util::Date */ +bool Converter::convertDateOrDateTime( + util::Date & rDate, util::DateTime & rDateTime, + bool & rbDateTime, const ::rtl::OUString & rString ) { bool bSuccess = true; @@ -1077,13 +1443,25 @@ bool Converter::convertDateTime( com::sun::star::util::DateTime& rDateTime, if (bSuccess) { - rDateTime.Year = (sal_uInt16)nYear; - rDateTime.Month = (sal_uInt16)nMonth; - rDateTime.Day = (sal_uInt16)nDay; - rDateTime.Hours = (sal_uInt16)nHour; - rDateTime.Minutes = (sal_uInt16)nMin; - rDateTime.Seconds = (sal_uInt16)nSec; - rDateTime.HundredthSeconds = (sal_uInt16)(sDoubleStr.toDouble() * 100); + if ( aTimeStr.getLength() > 0 ) // time is optional + { + rDateTime.Year = static_cast(nYear); + rDateTime.Month = static_cast(nMonth); + rDateTime.Day = static_cast(nDay); + rDateTime.Hours = static_cast(nHour); + rDateTime.Minutes = static_cast(nMin); + rDateTime.Seconds = static_cast(nSec); + rDateTime.HundredthSeconds = + static_cast((sDoubleStr).toDouble() * 100); + rbDateTime = true; + } + else + { + rDate.Year = static_cast(nYear); + rDate.Month = static_cast(nMonth); + rDate.Day = static_cast(nDay); + rbDateTime = false; + } } return bSuccess; } diff --git a/sax/source/tools/fastserializer.cxx b/sax/source/tools/fastserializer.cxx index 4603ceed3343..da4fdfb261db 100644 --- a/sax/source/tools/fastserializer.cxx +++ b/sax/source/tools/fastserializer.cxx @@ -326,43 +326,29 @@ namespace sax_fastparser { void FastSaxSerializer::mark() { - maMarkStack.push( Int8Sequence() ); + maMarkStack.push( ForMerge() ); } - void FastSaxSerializer::mergeTopMarks( bool bPrepend ) + void FastSaxSerializer::mergeTopMarks( sax_fastparser::MergeMarksEnum eMergeType ) { if ( maMarkStack.empty() ) return; if ( maMarkStack.size() == 1 ) { - mxOutputStream->writeBytes( maMarkStack.top() ); + mxOutputStream->writeBytes( maMarkStack.top().getData() ); maMarkStack.pop(); + return; } - else + + const Int8Sequence aMerge( maMarkStack.top().getData() ); + maMarkStack.pop(); + + switch ( eMergeType ) { - const Int8Sequence aMerge( maMarkStack.top() ); - maMarkStack.pop(); - - sal_Int32 nMergeLen = aMerge.getLength(); - if ( nMergeLen > 0 ) - { - Int8Sequence &rTop = maMarkStack.top(); - sal_Int32 nTopLen = rTop.getLength(); - - rTop.realloc( nTopLen + nMergeLen ); - if ( bPrepend ) - { - // prepend the aMerge to the rTop - memmove( rTop.getArray() + nMergeLen, rTop.getConstArray(), nTopLen ); - memcpy( rTop.getArray(), aMerge.getConstArray(), nMergeLen ); - } - else - { - // append the aMerge to the rTop - memcpy( rTop.getArray() + nTopLen, aMerge.getConstArray(), nMergeLen ); - } - } + case MERGE_MARKS_APPEND: maMarkStack.top().append( aMerge ); break; + case MERGE_MARKS_PREPEND: maMarkStack.top().prepend( aMerge ); break; + case MERGE_MARKS_POSTPONE: maMarkStack.top().postpone( aMerge ); break; } } @@ -371,15 +357,50 @@ namespace sax_fastparser { if ( maMarkStack.empty() ) mxOutputStream->writeBytes( aData ); else - { - sal_Int32 nDataLen = aData.getLength(); - if ( nDataLen > 0 ) - { - Int8Sequence &rTop = maMarkStack.top(); - sal_Int32 nTopLen = rTop.getLength(); + maMarkStack.top().append( aData ); + } - rTop.realloc( nTopLen + nDataLen ); - memcpy( rTop.getArray() + nTopLen, aData.getConstArray(), nDataLen ); + FastSaxSerializer::Int8Sequence& FastSaxSerializer::ForMerge::getData() + { + merge( maData, maPostponed, true ); + maPostponed.realloc( 0 ); + + return maData; + } + + void FastSaxSerializer::ForMerge::prepend( const Int8Sequence &rWhat ) + { + merge( maData, rWhat, false ); + } + + void FastSaxSerializer::ForMerge::append( const Int8Sequence &rWhat ) + { + merge( maData, rWhat, true ); + } + + void FastSaxSerializer::ForMerge::postpone( const Int8Sequence &rWhat ) + { + merge( maPostponed, rWhat, true ); + } + + void FastSaxSerializer::ForMerge::merge( Int8Sequence &rTop, const Int8Sequence &rMerge, bool bAppend ) + { + sal_Int32 nMergeLen = rMerge.getLength(); + if ( nMergeLen > 0 ) + { + sal_Int32 nTopLen = rTop.getLength(); + + rTop.realloc( nTopLen + nMergeLen ); + if ( bAppend ) + { + // append the rMerge to the rTop + memcpy( rTop.getArray() + nTopLen, rMerge.getConstArray(), nMergeLen ); + } + else + { + // prepend the rMerge to the rTop + memmove( rTop.getArray() + nMergeLen, rTop.getConstArray(), nTopLen ); + memcpy( rTop.getArray(), rMerge.getConstArray(), nMergeLen ); } } } diff --git a/sax/source/tools/fastserializer.hxx b/sax/source/tools/fastserializer.hxx index 132b495c0a8b..b0baf8af5df8 100644 --- a/sax/source/tools/fastserializer.hxx +++ b/sax/source/tools/fastserializer.hxx @@ -45,6 +45,7 @@ #include #include "sax/dllapi.h" +#include "sax/fshelper.hxx" #define SERIALIZER_IMPLEMENTATION_NAME "com.sun.star.comp.extensions.xml.sax.FastSerializer" #define SERIALIZER_SERVICE_NAME "com.sun.star.xml.sax.FastSerializer" @@ -112,23 +113,45 @@ public: /** Merge 2 topmost marks. - There are 2 possibilities - prepend the top before the second top-most - mark, or append it; prepending brings the possibility to switch parts - of the output. + There are 3 possibilities - prepend the top before the second top-most + mark, append it, or append it later; prepending brings the possibility + to switch parts of the output, appending later allows to write some + output in advance. Writes the result to the output stream if the mark stack becomes empty by the operation. + When the MERGE_MARKS_POSTPONE is specified, the merge happens just + before the next merge. + @see mark() */ - void mergeTopMarks( bool bPrepend = false ); + void mergeTopMarks( sax_fastparser::MergeMarksEnum eMergeType = sax_fastparser::MERGE_MARKS_APPEND ); private: ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > mxOutputStream; ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastTokenHandler > mxFastTokenHandler; typedef ::com::sun::star::uno::Sequence< ::sal_Int8 > Int8Sequence; - ::std::stack< Int8Sequence > maMarkStack; + class ForMerge + { + Int8Sequence maData; + Int8Sequence maPostponed; + + public: + ForMerge() : maData(), maPostponed() {} + + Int8Sequence& getData(); + + void prepend( const Int8Sequence &rWhat ); + void append( const Int8Sequence &rWhat ); + void postpone( const Int8Sequence &rWhat ); + + private: + static void merge( Int8Sequence &rTop, const Int8Sequence &rMerge, bool bAppend ); + }; + + ::std::stack< ForMerge > maMarkStack; void writeFastAttributeList( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastAttributeList >& Attribs ); void write( const ::rtl::OUString& s ); @@ -144,4 +167,3 @@ protected: } // namespace sax_fastparser #endif - diff --git a/sax/source/tools/fshelper.cxx b/sax/source/tools/fshelper.cxx index 594a60ba1d76..743f499fb4f0 100644 --- a/sax/source/tools/fshelper.cxx +++ b/sax/source/tools/fshelper.cxx @@ -114,6 +114,12 @@ void FastSerializerHelper::endElement(sal_Int32 elementTokenId) mpSerializer->endFastElement(elementTokenId); } +void FastSerializerHelper::startElementV(sal_Int32 elementTokenId, XFastAttributeListRef xAttrList) +{ + mpSerializer->startFastElement(elementTokenId, xAttrList); +} + + void FastSerializerHelper::singleElement(const char* elementName, XFastAttributeListRef xAttrList) { mpSerializer->singleUnknownElement(::rtl::OUString(), ::rtl::OUString::createFromAscii(elementName), xAttrList); @@ -181,9 +187,9 @@ void FastSerializerHelper::mark() mpSerializer->mark(); } -void FastSerializerHelper::mergeTopMarks( bool bPrepend ) +void FastSerializerHelper::mergeTopMarks( MergeMarksEnum eMergeType ) { - mpSerializer->mergeTopMarks( bPrepend ); + mpSerializer->mergeTopMarks( eMergeType ); } FastAttributeList * FastSerializerHelper::createAttrList() diff --git a/sax/test/sax/testsax.cxx b/sax/test/sax/testsax.cxx index 07491bae33ec..8fe989676993 100644 --- a/sax/test/sax/testsax.cxx +++ b/sax/test/sax/testsax.cxx @@ -31,11 +31,6 @@ #include #include -#if OSL_DEBUG_LEVEL == 0 -#define NDEBUG -#endif -#include - #include #include @@ -245,12 +240,12 @@ Reference < XInputStream > createStreamFromSequence( { Reference < XInterface > xOutStreamService = xSMgr->createInstance( OUString::createFromAscii("com.sun.star.io.Pipe") ); - assert( xOutStreamService.is() ); + OSL_ASSERT( xOutStreamService.is() ); Reference< XOutputStream > rOutStream( xOutStreamService , UNO_QUERY ); - assert( rOutStream.is() ); + OSL_ASSERT( rOutStream.is() ); Reference< XInputStream > rInStream( xOutStreamService , UNO_QUERY ); - assert( rInStream.is() ); + OSL_ASSERT( rInStream.is() ); rOutStream->writeBytes( seqBytes ); rOutStream->flush(); @@ -379,7 +374,7 @@ public: // ExtendedDocumentHandler virtual void SAL_CALL endElement(const OUString& aName) throw (SAXException,RuntimeException) { - assert( m_iLevel ); + OSL_ASSERT( m_iLevel ); m_iLevel --; if( m_bPrint ) { int i; diff --git a/sot/inc/sot/exchange.hxx b/sot/inc/sot/exchange.hxx index 68862367e4f0..0c235fffcdbb 100644 --- a/sot/inc/sot/exchange.hxx +++ b/sot/inc/sot/exchange.hxx @@ -196,10 +196,7 @@ public: static ULONG RegisterFormatMimeType( const String& rMimeType ); static ULONG GetFormat( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); - static ULONG GetStaticNameFormat( const String& rName ); - static String GetFormatName( ULONG nFormat ); - static String GetFormatStaticName( ULONG nFormat ); static sal_Bool GetFormatDataFlavor( ULONG nFormat, ::com::sun::star::datatransfer::DataFlavor& rFlavor ); static String GetFormatMimeType( ULONG nFormat ); static BOOL IsInternal( const SvGlobalName& ); @@ -216,14 +213,6 @@ public: static ULONG RegisterSotFormatName( SotFormatStringId nId ) { return nId; } - // Anzahl der bereits registrierten Formate bzw. der hoechsten - // registrierten ID abfragen (fuer System-Registrierung) - // ACHTUNG: Die Algorithmen zur Registrierung beim System - // verlassen sich darauf, dass die hier gelieferte maximale - // Format-ID 'klein' ist, so dass eine Schleife ueber alle - // Formate laufen kann. - static ULONG GetMaxFormat( void ); - // same for XTransferable interface static USHORT GetExchangeAction( // XTransferable diff --git a/sot/source/base/exchange.cxx b/sot/source/base/exchange.cxx index 05de84bdfd46..6dedd84cdaeb 100644 --- a/sot/source/base/exchange.cxx +++ b/sot/source/base/exchange.cxx @@ -479,18 +479,6 @@ ULONG SotExchange::GetFormat( const DataFlavor& rFlavor ) return 0; } -/************************************************************************* -|* -|* SotExchange::GetStaticNameFormat() -|* -|* Beschreibung CLIP.SDW -*************************************************************************/ -ULONG SotExchange::GetStaticNameFormat( const String& rName ) -{ - // has to be changed to return the format for the static name (KA 27.09.2001) - return SotExchange::RegisterFormatName( rName ); -} - /************************************************************************* |* |* SotExchange::GetFormatName() @@ -508,28 +496,6 @@ String SotExchange::GetFormatName( ULONG nFormat ) return aRet; } -/************************************************************************* -|* -|* SotExchange::GetFormatStaticName() -|* -|* Beschreibung CLIP.SDW -*************************************************************************/ -String SotExchange::GetFormatStaticName( ULONG nFormat ) -{ - // has to be changed to return the static format name (KA 27.09.2001) - return SotExchange::GetFormatName( nFormat ); -} - -/************************************************************************* -|* -|* SotExchange::GetMaxFormat() -|* -*************************************************************************/ -ULONG SotExchange::GetMaxFormat( void ) -{ - return( SOT_FORMATSTR_ID_USER_END + InitFormats_Impl().Count() ); -} - BOOL SotExchange::IsInternal( const SvGlobalName& rName ) { if ( rName == SvGlobalName(SO3_SW_CLASSID_60) || diff --git a/svtools/inc/PasswordHelper.hxx b/svl/inc/PasswordHelper.hxx similarity index 98% rename from svtools/inc/PasswordHelper.hxx rename to svl/inc/PasswordHelper.hxx index 7139a3ebe361..c915ebe3854a 100644 --- a/svtools/inc/PasswordHelper.hxx +++ b/svl/inc/PasswordHelper.hxx @@ -31,7 +31,7 @@ #ifndef _SVTOOLS_PASSWORDHELPER_HXX #define _SVTOOLS_PASSWORDHELPER_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include "sal/types.h" #include "com/sun/star/uno/Sequence.hxx" diff --git a/svtools/inc/adrparse.hxx b/svl/inc/adrparse.hxx similarity index 99% rename from svtools/inc/adrparse.hxx rename to svl/inc/adrparse.hxx index 439168441057..a317e27b2779 100644 --- a/svtools/inc/adrparse.hxx +++ b/svl/inc/adrparse.hxx @@ -31,7 +31,7 @@ #ifndef _ADRPARSE_HXX #define _ADRPARSE_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #include diff --git a/svtools/inc/broadcast.hxx b/svl/inc/broadcast.hxx similarity index 98% rename from svtools/inc/broadcast.hxx rename to svl/inc/broadcast.hxx index e3e409c46e96..e80a2e446ebf 100644 --- a/svtools/inc/broadcast.hxx +++ b/svl/inc/broadcast.hxx @@ -30,7 +30,7 @@ #ifndef _SVT_BROADCAST_HXX #define _SVT_BROADCAST_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include class SvtListener; diff --git a/svtools/inc/cntnrsrt.hxx b/svl/inc/cntnrsrt.hxx similarity index 100% rename from svtools/inc/cntnrsrt.hxx rename to svl/inc/cntnrsrt.hxx diff --git a/svtools/inc/cntwids.hrc b/svl/inc/cntwids.hrc similarity index 100% rename from svtools/inc/cntwids.hrc rename to svl/inc/cntwids.hrc diff --git a/svtools/source/svsql/converter.hxx b/svl/inc/converter.hxx similarity index 97% rename from svtools/source/svsql/converter.hxx rename to svl/inc/converter.hxx index f6a5d67ca966..d012a56e7416 100644 --- a/svtools/source/svsql/converter.hxx +++ b/svl/inc/converter.hxx @@ -30,7 +30,7 @@ #ifndef _SV_CONVERTER_HXX_ #define _SV_CONVERTER_HXX_ -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include class SvDbaseConverter diff --git a/svtools/inc/filenotation.hxx b/svl/inc/filenotation.hxx similarity index 98% rename from svtools/inc/filenotation.hxx rename to svl/inc/filenotation.hxx index 460d425d471a..c74c6c39c803 100644 --- a/svtools/inc/filenotation.hxx +++ b/svl/inc/filenotation.hxx @@ -31,7 +31,7 @@ #ifndef SVTOOLS_FILENOTATION_HXX #define SVTOOLS_FILENOTATION_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include //......................................................................... diff --git a/svtools/inc/folderrestriction.hxx b/svl/inc/folderrestriction.hxx similarity index 98% rename from svtools/inc/folderrestriction.hxx rename to svl/inc/folderrestriction.hxx index f7e683b31ad6..82fb4e1efef5 100644 --- a/svtools/inc/folderrestriction.hxx +++ b/svl/inc/folderrestriction.hxx @@ -31,7 +31,7 @@ #ifndef SVTOOLS_FOLDER_RESTRICTION_HXX #define SVTOOLS_FOLDER_RESTRICTION_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #ifndef INCLUDED_VECTOR diff --git a/svtools/inc/fstathelper.hxx b/svl/inc/fstathelper.hxx similarity index 98% rename from svtools/inc/fstathelper.hxx rename to svl/inc/fstathelper.hxx index b9761d7131a0..1e613782b4e6 100644 --- a/svtools/inc/fstathelper.hxx +++ b/svl/inc/fstathelper.hxx @@ -31,7 +31,7 @@ #ifndef _SVTOOLS_FSTATHELPER_HXX #define _SVTOOLS_FSTATHELPER_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include class UniString; diff --git a/svtools/inc/inetdef.hxx b/svl/inc/inetdef.hxx similarity index 100% rename from svtools/inc/inetdef.hxx rename to svl/inc/inetdef.hxx diff --git a/svtools/inc/inetmsg.hxx b/svl/inc/inetmsg.hxx similarity index 100% rename from svtools/inc/inetmsg.hxx rename to svl/inc/inetmsg.hxx diff --git a/svtools/inc/inetstrm.hxx b/svl/inc/inetstrm.hxx similarity index 100% rename from svtools/inc/inetstrm.hxx rename to svl/inc/inetstrm.hxx diff --git a/svtools/inc/instrm.hxx b/svl/inc/instrm.hxx similarity index 98% rename from svtools/inc/instrm.hxx rename to svl/inc/instrm.hxx index 58a70fcc6917..add43d4cc380 100644 --- a/svtools/inc/instrm.hxx +++ b/svl/inc/instrm.hxx @@ -31,7 +31,7 @@ #ifndef SVTOOLS_INSTRM_HXX #define SVTOOLS_INSTRM_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #include diff --git a/svtools/inc/listener.hxx b/svl/inc/listener.hxx similarity index 98% rename from svtools/inc/listener.hxx rename to svl/inc/listener.hxx index 6d70f135eb92..a121197b1dd0 100644 --- a/svtools/inc/listener.hxx +++ b/svl/inc/listener.hxx @@ -30,7 +30,7 @@ #ifndef _SVT_LISTENER_HXX #define _SVT_LISTENER_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include class SvtBroadcaster; diff --git a/svtools/inc/listeneriter.hxx b/svl/inc/listeneriter.hxx similarity index 98% rename from svtools/inc/listeneriter.hxx rename to svl/inc/listeneriter.hxx index e531ead6bf5d..a2ac5693f741 100644 --- a/svtools/inc/listeneriter.hxx +++ b/svl/inc/listeneriter.hxx @@ -30,7 +30,7 @@ #ifndef _SVT_LISTENERITER_HXX #define _SVT_LISTENERITER_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include class SvtListener; diff --git a/svtools/inc/lngmisc.hxx b/svl/inc/lngmisc.hxx similarity index 98% rename from svtools/inc/lngmisc.hxx rename to svl/inc/lngmisc.hxx index 6bfe7b1c737c..55322246f773 100644 --- a/svtools/inc/lngmisc.hxx +++ b/svl/inc/lngmisc.hxx @@ -31,7 +31,7 @@ #ifndef _SVTOOLS_LNGMISC_HXX_ #define _SVTOOLS_LNGMISC_HXX_ -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #include #include diff --git a/svtools/source/syslocale/makefile.mk b/svl/inc/makefile.mk similarity index 86% rename from svtools/source/syslocale/makefile.mk rename to svl/inc/makefile.mk index a393c174856f..9368bce7cde1 100644 --- a/svtools/source/syslocale/makefile.mk +++ b/svl/inc/makefile.mk @@ -8,7 +8,7 @@ # # $RCSfile: makefile.mk,v $ # -# $Revision: 1.5 $ +# $Revision: 1.4 $ # # This file is part of OpenOffice.org. # @@ -28,21 +28,25 @@ # for a copy of the LGPLv3 License. # #************************************************************************* -PRJ=..$/.. +PRJ=.. -PRJNAME=svtools -TARGET=syslocale +PRJNAME=svl +TARGET=inc # --- Settings ----------------------------------------------------- .INCLUDE : settings.mk -.INCLUDE : $(PRJ)$/util$/svt.pmk +.INCLUDE : $(PRJ)$/util$/svl.pmk # --- Files -------------------------------------------------------- - -SLOFILES = \ - $(SLO)$/syslocale.obj - -# --- Targets ------------------------------------------------------ +# --- Targets ------------------------------------------------------- .INCLUDE : target.mk + +.IF "$(ENABLE_PCH)"!="" +ALLTAR : \ + $(SLO)$/precompiled.pch \ + $(SLO)$/precompiled_ex.pch + +.ENDIF # "$(ENABLE_PCH)"!="" + diff --git a/svtools/inc/memberid.hrc b/svl/inc/memberid.hrc similarity index 100% rename from svtools/inc/memberid.hrc rename to svl/inc/memberid.hrc diff --git a/svtools/inc/nfsymbol.hxx b/svl/inc/nfsymbol.hxx similarity index 100% rename from svtools/inc/nfsymbol.hxx rename to svl/inc/nfsymbol.hxx diff --git a/svtools/inc/numuno.hxx b/svl/inc/numuno.hxx similarity index 97% rename from svtools/inc/numuno.hxx rename to svl/inc/numuno.hxx index c31829dec020..d243c49a3113 100644 --- a/svtools/inc/numuno.hxx +++ b/svl/inc/numuno.hxx @@ -30,7 +30,7 @@ #ifndef _NUMUNO_HXX #define _NUMUNO_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include #include #include @@ -57,7 +57,7 @@ com::sun::star::uno::Reference SAL_CALL // SvNumberFormatsSupplierObj: aggregate to document, // construct with SvNumberFormatter -class SVT_DLLPUBLIC SvNumberFormatsSupplierObj : public cppu::WeakAggImplHelper2< +class SVL_DLLPUBLIC SvNumberFormatsSupplierObj : public cppu::WeakAggImplHelper2< com::sun::star::util::XNumberFormatsSupplier, com::sun::star::lang::XUnoTunnel> { diff --git a/svtools/inc/outstrm.hxx b/svl/inc/outstrm.hxx similarity index 98% rename from svtools/inc/outstrm.hxx rename to svl/inc/outstrm.hxx index e11c7ed1c1a9..c01d8f460c58 100644 --- a/svtools/inc/outstrm.hxx +++ b/svl/inc/outstrm.hxx @@ -31,7 +31,7 @@ #ifndef SVTOOLS_OUTSTRM_HXX #define SVTOOLS_OUTSTRM_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #include diff --git a/svtools/inc/svtool.h b/svl/inc/pch/precompiled_svl.cxx similarity index 86% rename from svtools/inc/svtool.h rename to svl/inc/pch/precompiled_svl.cxx index d088daa44249..27b37170856c 100644 --- a/svtools/inc/svtool.h +++ b/svl/inc/pch/precompiled_svl.cxx @@ -6,7 +6,7 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: svtool.h,v $ + * $RCSfile: precompiled_svl.cxx,v $ * $Revision: 1.3 $ * * This file is part of OpenOffice.org. @@ -28,13 +28,5 @@ * ************************************************************************/ -#ifndef _SVTOOL_H -#define _SVTOOL_H +#include "precompiled_svl.hxx" -#if defined( W30 ) && defined( _MSC_VER ) -#define SVEXPORT _export -#else -#define SVEXPORT -#endif - -#endif // _SVTOOL_H diff --git a/svl/inc/pch/precompiled_svl.hxx b/svl/inc/pch/precompiled_svl.hxx new file mode 100644 index 000000000000..3a813a2db2dd --- /dev/null +++ b/svl/inc/pch/precompiled_svl.hxx @@ -0,0 +1,435 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: precompiled_svl.hxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): Generated on 2006-09-01 17:50:05.076676 + +#ifdef PRECOMPILED_HEADERS + +//---MARKER--- +#include "sal/config.h" +#include "sal/types.h" + +#include "com/sun/star/accessibility/AccessibleEventId.hpp" +#include "com/sun/star/accessibility/AccessibleRelationType.hpp" +#include "com/sun/star/accessibility/AccessibleRole.hpp" +#include "com/sun/star/accessibility/AccessibleStateType.hpp" +#include "com/sun/star/accessibility/AccessibleTextType.hpp" +#include "com/sun/star/accessibility/XAccessible.hpp" +#include "com/sun/star/accessibility/XAccessibleContext.hpp" +#include "com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "com/sun/star/awt/FontWeight.hpp" +#include "com/sun/star/beans/XPropertySet.hpp" +#include "com/sun/star/beans/XPropertySetInfo.hpp" +#include "com/sun/star/io/XAsyncOutputMonitor.hpp" +#include "com/sun/star/lang/EventObject.hpp" +#include "com/sun/star/lang/Locale.hpp" +#include "com/sun/star/lang/WrappedTargetRuntimeException.hpp" +#include "com/sun/star/lang/XComponent.hpp" +#include "com/sun/star/lang/XMultiComponentFactory.hpp" +#include "com/sun/star/lang/XMultiServiceFactory.hpp" +#include "com/sun/star/ucb/Command.hpp" +#include "com/sun/star/ucb/CommandAbortedException.hpp" +#include "com/sun/star/ucb/IllegalIdentifierException.hpp" +#include "com/sun/star/ucb/UnsupportedCommandException.hpp" +#include "com/sun/star/ucb/XCommandEnvironment.hpp" +#include "com/sun/star/ucb/XCommandProcessor.hpp" +#include "com/sun/star/ucb/XContent.hpp" +#include "com/sun/star/ucb/XContentIdentifier.hpp" +#include "com/sun/star/ucb/XContentIdentifierFactory.hpp" +#include "com/sun/star/ucb/XContentProvider.hpp" +#include "com/sun/star/ucb/XContentProviderManager.hpp" +#include "com/sun/star/ui/dialogs/XFilePicker.hpp" +#include "com/sun/star/ui/dialogs/XFolderPicker.hpp" +#include "com/sun/star/uno/Exception.hpp" +#include "com/sun/star/uno/RuntimeException.hpp" +#include "com/sun/star/uno/XComponentContext.hpp" +#include "com/sun/star/uno/XInterface.hpp" +#include "com/sun/star/uri/XUriReference.hpp" +#include "com/sun/star/uri/XUriReferenceFactory.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include + +#include "comphelper/processfactory.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cppuhelper/bootstrap.hxx" +#include "cppuhelper/exc_hlp.hxx" +#include "cppuhelper/factory.hxx" +#include "cppuhelper/interfacecontainer.hxx" +#include "cppuhelper/weakref.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "rtl/crc.h" +#include "rtl/memory.h" +#include "rtl/strbuf.hxx" +#include "rtl/string.h" +#include "rtl/string.hxx" +#include "rtl/textenc.h" +#include "rtl/ustrbuf.hxx" +#include "rtl/ustring.h" +#include "rtl/ustring.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "unotools/configitem.hxx" +#include "unotools/configmgr.hxx" + +#include + +#include + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +//---MARKER--- + +#endif + diff --git a/svtools/inc/pickerhelper.hxx b/svl/inc/pickerhelper.hxx similarity index 98% rename from svtools/inc/pickerhelper.hxx rename to svl/inc/pickerhelper.hxx index 4be84296c678..e8ef23e145d4 100644 --- a/svtools/inc/pickerhelper.hxx +++ b/svl/inc/pickerhelper.hxx @@ -31,7 +31,7 @@ #ifndef _PICKERHELPER_HXX #define _PICKERHELPER_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include "sal/types.h" #include "com/sun/star/uno/Reference.hxx" diff --git a/svtools/inc/pickerhistory.hxx b/svl/inc/pickerhistory.hxx similarity index 98% rename from svtools/inc/pickerhistory.hxx rename to svl/inc/pickerhistory.hxx index f99ad5dcc0f1..e67729a1bbd8 100644 --- a/svtools/inc/pickerhistory.hxx +++ b/svl/inc/pickerhistory.hxx @@ -31,7 +31,7 @@ #ifndef SVTOOLS_PICKERHISTORY_HXX #define SVTOOLS_PICKERHISTORY_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include //......................................................................... diff --git a/svtools/inc/pickerhistoryaccess.hxx b/svl/inc/pickerhistoryaccess.hxx similarity index 98% rename from svtools/inc/pickerhistoryaccess.hxx rename to svl/inc/pickerhistoryaccess.hxx index 983b0c416ef3..210fd9b92139 100644 --- a/svtools/inc/pickerhistoryaccess.hxx +++ b/svl/inc/pickerhistoryaccess.hxx @@ -31,7 +31,7 @@ #ifndef SVTOOLS_PICKERHISTORYACCESS_HXX #define SVTOOLS_PICKERHISTORYACCESS_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #ifndef _COM_SUN_STAR_UNO_REFERENX_HXX_ #include diff --git a/svtools/inc/poolcach.hxx b/svl/inc/poolcach.hxx similarity index 96% rename from svtools/inc/poolcach.hxx rename to svl/inc/poolcach.hxx index 20d9e4d19c43..21cfec4662a0 100644 --- a/svtools/inc/poolcach.hxx +++ b/svl/inc/poolcach.hxx @@ -30,7 +30,7 @@ #ifndef _SFXPOOLCACH_HXX #define _SFXPOOLCACH_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include class SfxItemModifyArr_Impl; @@ -39,7 +39,7 @@ class SfxItemSet; class SfxPoolItem; class SfxSetItem; -class SVT_DLLPUBLIC SfxItemPoolCache +class SVL_DLLPUBLIC SfxItemPoolCache { SfxItemPool *pPool; SfxItemModifyArr_Impl *pCache; diff --git a/svtools/inc/strmadpt.hxx b/svl/inc/strmadpt.hxx similarity index 99% rename from svtools/inc/strmadpt.hxx rename to svl/inc/strmadpt.hxx index 7a080c1c7bcc..2fd190f9adef 100644 --- a/svtools/inc/strmadpt.hxx +++ b/svl/inc/strmadpt.hxx @@ -31,7 +31,7 @@ #ifndef SVTOOLS_STRMADPT_HXX #define SVTOOLS_STRMADPT_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #include #include diff --git a/svtools/inc/stylepool.hxx b/svl/inc/stylepool.hxx similarity index 99% rename from svtools/inc/stylepool.hxx rename to svl/inc/stylepool.hxx index 1b1f129d7f4c..d69bb928e432 100644 --- a/svtools/inc/stylepool.hxx +++ b/svl/inc/stylepool.hxx @@ -32,7 +32,7 @@ #include #include -#include +#include class StylePoolImpl; class StylePoolIterImpl; diff --git a/svtools/inc/svtools/aeitem.hxx b/svl/inc/svl/aeitem.hxx similarity index 94% rename from svtools/inc/svtools/aeitem.hxx rename to svl/inc/svl/aeitem.hxx index 5cfd3d0fc15e..446d9b8aeeb7 100644 --- a/svtools/inc/svtools/aeitem.hxx +++ b/svl/inc/svl/aeitem.hxx @@ -30,14 +30,14 @@ #ifndef _AEITEM_HXX #define _AEITEM_HXX -#include "svtools/svtdllapi.h" -#include -#include +#include "svl/svldllapi.h" +#include +#include class SfxAllEnumValueArr; class SvUShorts; -class SVT_DLLPUBLIC SfxAllEnumItem: public SfxEnumItem +class SVL_DLLPUBLIC SfxAllEnumItem: public SfxEnumItem { SfxAllEnumValueArr* pValues; SvUShorts* pDisabledValues; diff --git a/svtools/inc/svtools/brdcst.hxx b/svl/inc/svl/brdcst.hxx similarity index 97% rename from svtools/inc/svtools/brdcst.hxx rename to svl/inc/svl/brdcst.hxx index 2f9270f3cd4b..cfa45d5aa89a 100644 --- a/svtools/inc/svtools/brdcst.hxx +++ b/svl/inc/svl/brdcst.hxx @@ -30,9 +30,9 @@ #ifndef _SFXBRDCST_HXX #define _SFXBRDCST_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include -#include +#include class SfxListener; class SfxHint; diff --git a/svtools/inc/svtools/cancel.hxx b/svl/inc/svl/cancel.hxx similarity index 97% rename from svtools/inc/svtools/cancel.hxx rename to svl/inc/svl/cancel.hxx index 5929fc4db47a..2808b77d3139 100644 --- a/svtools/inc/svtools/cancel.hxx +++ b/svl/inc/svl/cancel.hxx @@ -30,16 +30,16 @@ #ifndef _SFXCANCEL_HXX #define _SFXCANCEL_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #include -#include -#include +#include +#include class SfxCancellable; #ifdef _SFX_CANCEL_CXX -#include +#include SV_DECL_PTRARR( SfxCancellables_Impl, SfxCancellable*, 0, 4 ) diff --git a/svtools/inc/svtools/cenumitm.hxx b/svl/inc/svl/cenumitm.hxx similarity index 98% rename from svtools/inc/svtools/cenumitm.hxx rename to svl/inc/svl/cenumitm.hxx index d65825849869..3d354899cd9d 100644 --- a/svtools/inc/svtools/cenumitm.hxx +++ b/svl/inc/svl/cenumitm.hxx @@ -31,9 +31,9 @@ #ifndef _SVTOOLS_CENUMITM_HXX #define _SVTOOLS_CENUMITM_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include -#include +#include //============================================================================ DBG_NAMEEX(SfxEnumItemInterface) diff --git a/svtools/inc/svtools/cintitem.hxx b/svl/inc/svl/cintitem.hxx similarity index 99% rename from svtools/inc/svtools/cintitem.hxx rename to svl/inc/svl/cintitem.hxx index a944e2139818..72421f93e0cb 100644 --- a/svtools/inc/svtools/cintitem.hxx +++ b/svl/inc/svl/cintitem.hxx @@ -31,9 +31,9 @@ #ifndef _SVTOOLS_CINTITEM_HXX #define _SVTOOLS_CINTITEM_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include -#include +#include //============================================================================ DBG_NAMEEX_VISIBILITY(CntByteItem, SVL_DLLPUBLIC) diff --git a/svtools/inc/svtools/cjkoptions.hxx b/svl/inc/svl/cjkoptions.hxx similarity index 95% rename from svtools/inc/svtools/cjkoptions.hxx rename to svl/inc/svl/cjkoptions.hxx index e4298b4d162c..720ead5422f0 100644 --- a/svtools/inc/svtools/cjkoptions.hxx +++ b/svl/inc/svl/cjkoptions.hxx @@ -30,15 +30,15 @@ #ifndef _SVTOOLS_CJKOPTIONS_HXX #define _SVTOOLS_CJKOPTIONS_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include -#include +#include class SvtCJKOptions_Impl; // class SvtCJKOptions -------------------------------------------------- -class SVT_DLLPUBLIC SvtCJKOptions: public svt::detail::Options +class SVL_DLLPUBLIC SvtCJKOptions: public utl::detail::Options { private: SvtCJKOptions_Impl* pImp; diff --git a/svtools/inc/svtools/cnclhint.hxx b/svl/inc/svl/cnclhint.hxx similarity index 96% rename from svtools/inc/svtools/cnclhint.hxx rename to svl/inc/svl/cnclhint.hxx index 38781a6c2143..a2ce75ac1a4b 100644 --- a/svtools/inc/svtools/cnclhint.hxx +++ b/svl/inc/svl/cnclhint.hxx @@ -30,8 +30,8 @@ #ifndef _SFXCNCLHINT_HXX #define _SFXCNCLHINT_HXX -#include -#include +#include +#include #include #define SFXCANCELHINT_REMOVED 1 diff --git a/svtools/inc/svtools/cntwall.hxx b/svl/inc/svl/cntwall.hxx similarity index 97% rename from svtools/inc/svtools/cntwall.hxx rename to svl/inc/svl/cntwall.hxx index 51b2982fe1dd..dca27f2284e6 100644 --- a/svtools/inc/svtools/cntwall.hxx +++ b/svl/inc/svl/cntwall.hxx @@ -30,14 +30,14 @@ #ifndef _CNTWALL_HXX #define _CNTWALL_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #ifndef SHL_HXX #include #endif #include #include -#include +#include class SvStream; diff --git a/svtools/inc/svtools/ctloptions.hxx b/svl/inc/svl/ctloptions.hxx similarity index 90% rename from svtools/inc/svtools/ctloptions.hxx rename to svl/inc/svl/ctloptions.hxx index 6c09ad98a45e..28b2191cad94 100644 --- a/svtools/inc/svtools/ctloptions.hxx +++ b/svl/inc/svl/ctloptions.hxx @@ -30,18 +30,17 @@ #ifndef _SVTOOLS_CTLOPTIONS_HXX #define _SVTOOLS_CTLOPTIONS_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include -#include -#include -#include +#include +#include +#include class SvtCTLOptions_Impl; // class SvtCTLOptions -------------------------------------------------------- -class SVT_DLLPUBLIC SvtCTLOptions: - public svt::detail::Options, public SfxBroadcaster, public SfxListener +class SVL_DLLPUBLIC SvtCTLOptions : public utl::detail::Options { private: SvtCTLOptions_Impl* m_pImp; @@ -52,8 +51,6 @@ public: SvtCTLOptions( sal_Bool bDontLoad = sal_False ); virtual ~SvtCTLOptions(); - virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); - void SetCTLFontEnabled( sal_Bool _bEnabled ); sal_Bool IsCTLFontEnabled() const; diff --git a/svtools/inc/svtools/ctypeitm.hxx b/svl/inc/svl/ctypeitm.hxx similarity index 97% rename from svtools/inc/svtools/ctypeitm.hxx rename to svl/inc/svl/ctypeitm.hxx index 2592c6e0f388..808596397aa0 100644 --- a/svtools/inc/svtools/ctypeitm.hxx +++ b/svl/inc/svl/ctypeitm.hxx @@ -30,8 +30,8 @@ #ifndef _SVTOOLS_CTYPEITM_HXX #define _SVTOOLS_CTYPEITM_HXX -#include -#include +#include +#include //========================================================================= diff --git a/svtools/inc/svtools/custritm.hxx b/svl/inc/svl/custritm.hxx similarity index 98% rename from svtools/inc/svtools/custritm.hxx rename to svl/inc/svl/custritm.hxx index 83a88b1f240f..8a3344f6dc0b 100644 --- a/svtools/inc/svtools/custritm.hxx +++ b/svl/inc/svl/custritm.hxx @@ -31,9 +31,9 @@ #ifndef _SVTOOLS_CUSTRITM_HXX #define _SVTOOLS_CUSTRITM_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include -#include +#include //============================================================================ DBG_NAMEEX_VISIBILITY(CntUnencodedStringItem, SVL_DLLPUBLIC) diff --git a/svtools/inc/svtools/dateitem.hxx b/svl/inc/svl/dateitem.hxx similarity index 99% rename from svtools/inc/svtools/dateitem.hxx rename to svl/inc/svl/dateitem.hxx index 073c1a6ef825..c66c9a84285d 100644 --- a/svtools/inc/svtools/dateitem.hxx +++ b/svl/inc/svl/dateitem.hxx @@ -33,7 +33,7 @@ #include #include -#include +#include class SvStream; diff --git a/svtools/inc/svtools/documentlockfile.hxx b/svl/inc/svl/documentlockfile.hxx similarity index 95% rename from svtools/inc/svtools/documentlockfile.hxx rename to svl/inc/svl/documentlockfile.hxx index f2625f7955bb..c62f81bc77ef 100644 --- a/svtools/inc/svtools/documentlockfile.hxx +++ b/svl/inc/svl/documentlockfile.hxx @@ -32,7 +32,7 @@ #ifndef _SVT_DOCUMENTLOCKFILE_HXX #define _SVT_DOCUMENTLOCKFILE_HXX -#include +#include #include #include @@ -41,11 +41,11 @@ #include #include -#include +#include namespace svt { -class SVT_DLLPUBLIC DocumentLockFile : public LockFileCommon +class SVL_DLLPUBLIC DocumentLockFile : public LockFileCommon { // the workaround for automated testing! static sal_Bool m_bAllowInteraction; diff --git a/svtools/inc/svtools/eitem.hxx b/svl/inc/svl/eitem.hxx similarity index 92% rename from svtools/inc/svtools/eitem.hxx rename to svl/inc/svl/eitem.hxx index f9e1927a881d..55ed3c47ee33 100644 --- a/svtools/inc/svtools/eitem.hxx +++ b/svl/inc/svl/eitem.hxx @@ -31,11 +31,11 @@ #ifndef _SFXENUMITEM_HXX #define _SFXENUMITEM_HXX -#include "svtools/svtdllapi.h" -#include +#include "svl/svldllapi.h" +#include //============================================================================ -class SVT_DLLPUBLIC SfxEnumItem: public CntEnumItem +class SVL_DLLPUBLIC SfxEnumItem: public CntEnumItem { protected: SfxEnumItem(USHORT which = 0, USHORT nValue = 0): @@ -50,7 +50,7 @@ public: }; //============================================================================ -class SVT_DLLPUBLIC SfxBoolItem: public CntBoolItem +class SVL_DLLPUBLIC SfxBoolItem: public CntBoolItem { public: TYPEINFO(); diff --git a/svtools/inc/svtools/filerec.hxx b/svl/inc/svl/filerec.hxx similarity index 99% rename from svtools/inc/svtools/filerec.hxx rename to svl/inc/svl/filerec.hxx index 77ba6c1b5c52..d28bb3033b56 100644 --- a/svtools/inc/svtools/filerec.hxx +++ b/svl/inc/svl/filerec.hxx @@ -33,10 +33,10 @@ //========================================================================= -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #include -#include +#include SV_DECL_VARARR( SfxUINT32s, UINT32, 8, 8 ) diff --git a/svtools/inc/svtools/flagitem.hxx b/svl/inc/svl/flagitem.hxx similarity index 94% rename from svtools/inc/svtools/flagitem.hxx rename to svl/inc/svl/flagitem.hxx index 5298bbd1678b..fa056bb00488 100644 --- a/svtools/inc/svtools/flagitem.hxx +++ b/svl/inc/svl/flagitem.hxx @@ -30,10 +30,10 @@ #ifndef _SFXFLAGITEM_HXX #define _SFXFLAGITEM_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include #include -#include +#include class SvStream; @@ -41,9 +41,9 @@ extern USHORT nSfxFlagVal[16]; // ----------------------------------------------------------------------- -DBG_NAMEEX_VISIBILITY(SfxFlagItem, SVT_DLLPUBLIC) +DBG_NAMEEX_VISIBILITY(SfxFlagItem, SVL_DLLPUBLIC) -class SVT_DLLPUBLIC SfxFlagItem: public SfxPoolItem +class SVL_DLLPUBLIC SfxFlagItem: public SfxPoolItem { USHORT nVal; diff --git a/svtools/inc/svtools/globalnameitem.hxx b/svl/inc/svl/globalnameitem.hxx similarity index 94% rename from svtools/inc/svtools/globalnameitem.hxx rename to svl/inc/svl/globalnameitem.hxx index f19ea1dd8457..4422220fe640 100644 --- a/svtools/inc/svtools/globalnameitem.hxx +++ b/svl/inc/svl/globalnameitem.hxx @@ -30,15 +30,15 @@ #ifndef _GLOBALNAMEITEM_HXX #define _GLOBALNAMEITEM_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include #include #include -#include +#include // ----------------------------------------------------------------------- -class SVT_DLLPUBLIC SfxGlobalNameItem: public SfxPoolItem +class SVL_DLLPUBLIC SfxGlobalNameItem: public SfxPoolItem { SvGlobalName m_aName; diff --git a/svtools/inc/svtools/hint.hxx b/svl/inc/svl/hint.hxx similarity index 98% rename from svtools/inc/svtools/hint.hxx rename to svl/inc/svl/hint.hxx index 9417b2bc1702..e2d43ea602ca 100644 --- a/svtools/inc/svtools/hint.hxx +++ b/svl/inc/svl/hint.hxx @@ -30,7 +30,7 @@ #ifndef _SFXHINT_HXX #define _SFXHINT_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include class SVL_DLLPUBLIC SfxHint diff --git a/svtools/inc/svtools/httpcook.hxx b/svl/inc/svl/httpcook.hxx similarity index 99% rename from svtools/inc/svtools/httpcook.hxx rename to svl/inc/svl/httpcook.hxx index 354680a86f30..09769396eb11 100644 --- a/svtools/inc/svtools/httpcook.hxx +++ b/svl/inc/svl/httpcook.hxx @@ -34,7 +34,7 @@ #include #include #include -#include +#include /*======================================================================= * diff --git a/svtools/inc/svtools/ilstitem.hxx b/svl/inc/svl/ilstitem.hxx similarity index 97% rename from svtools/inc/svtools/ilstitem.hxx rename to svl/inc/svl/ilstitem.hxx index 0bc76f1d0627..c581f938197f 100644 --- a/svtools/inc/svtools/ilstitem.hxx +++ b/svl/inc/svl/ilstitem.hxx @@ -31,8 +31,8 @@ #ifndef _SFXILSTITEM_HXX #define _SFXILSTITEM_HXX -#include "svtools/svldllapi.h" -#include +#include "svl/svldllapi.h" +#include #include class SvULongs; diff --git a/svtools/inc/svtools/imageitm.hxx b/svl/inc/svl/imageitm.hxx similarity index 95% rename from svtools/inc/svtools/imageitm.hxx rename to svl/inc/svl/imageitm.hxx index e0151729c2e0..bfd888bdd944 100644 --- a/svtools/inc/svtools/imageitm.hxx +++ b/svl/inc/svl/imageitm.hxx @@ -31,13 +31,13 @@ #ifndef _SVT_IMAGEITM_HXX #define _SVT_IMAGEITM_HXX -#include "svtools/svtdllapi.h" -#include +#include "svl/svldllapi.h" +#include class String; struct SfxImageItem_Impl; -class SVT_DLLPUBLIC SfxImageItem : public SfxInt16Item +class SVL_DLLPUBLIC SfxImageItem : public SfxInt16Item { SfxImageItem_Impl* pImp; public: diff --git a/svtools/inc/svtools/inethist.hxx b/svl/inc/svl/inethist.hxx similarity index 97% rename from svtools/inc/svtools/inethist.hxx rename to svl/inc/svl/inethist.hxx index ad64e1131bf3..7d4577897faf 100644 --- a/svtools/inc/svtools/inethist.hxx +++ b/svl/inc/svl/inethist.hxx @@ -30,12 +30,12 @@ #ifndef _INETHIST_HXX #define _INETHIST_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #include #include -#include -#include +#include +#include /*======================================================================== * diff --git a/svtools/inc/svtools/inettype.hxx b/svl/inc/svl/inettype.hxx similarity index 99% rename from svtools/inc/svtools/inettype.hxx rename to svl/inc/svl/inettype.hxx index 2d9f0ba8694c..5f3bfbaab225 100644 --- a/svtools/inc/svtools/inettype.hxx +++ b/svl/inc/svl/inettype.hxx @@ -31,7 +31,7 @@ #ifndef _INETTYPE_HXX #define _INETTYPE_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #include diff --git a/svtools/inc/svtools/intitem.hxx b/svl/inc/svl/intitem.hxx similarity index 92% rename from svtools/inc/svtools/intitem.hxx rename to svl/inc/svl/intitem.hxx index fe2a3543e630..7bfa3433c6b6 100644 --- a/svtools/inc/svtools/intitem.hxx +++ b/svl/inc/svl/intitem.hxx @@ -31,11 +31,11 @@ #ifndef _SFXINTITEM_HXX #define _SFXINTITEM_HXX -#include "svtools/svtdllapi.h" -#include +#include "svl/svldllapi.h" +#include //============================================================================ -class SVT_DLLPUBLIC SfxByteItem: public CntByteItem +class SVL_DLLPUBLIC SfxByteItem: public CntByteItem { public: TYPEINFO(); @@ -53,9 +53,9 @@ public: }; //============================================================================ -DBG_NAMEEX_VISIBILITY(SfxInt16Item, SVT_DLLPUBLIC) +DBG_NAMEEX_VISIBILITY(SfxInt16Item, SVL_DLLPUBLIC) -class SVT_DLLPUBLIC SfxInt16Item: public SfxPoolItem +class SVL_DLLPUBLIC SfxInt16Item: public SfxPoolItem { INT16 m_nValue; @@ -115,7 +115,7 @@ inline void SfxInt16Item::SetValue(INT16 nTheValue) } //============================================================================ -class SVT_DLLPUBLIC SfxUInt16Item: public CntUInt16Item +class SVL_DLLPUBLIC SfxUInt16Item: public CntUInt16Item { public: TYPEINFO(); @@ -134,7 +134,7 @@ public: }; //============================================================================ -class SVT_DLLPUBLIC SfxInt32Item: public CntInt32Item +class SVL_DLLPUBLIC SfxInt32Item: public CntInt32Item { public: TYPEINFO(); @@ -154,7 +154,7 @@ public: }; //============================================================================ -class SVT_DLLPUBLIC SfxUInt32Item: public CntUInt32Item +class SVL_DLLPUBLIC SfxUInt32Item: public CntUInt32Item { public: TYPEINFO(); diff --git a/svtools/inc/svtools/isethint.hxx b/svl/inc/svl/isethint.hxx similarity index 96% rename from svtools/inc/svtools/isethint.hxx rename to svl/inc/svl/isethint.hxx index d30fc4a65b27..d08819723f43 100644 --- a/svtools/inc/svtools/isethint.hxx +++ b/svl/inc/svl/isethint.hxx @@ -30,10 +30,10 @@ #ifndef _SFXISETHINT_HXX #define _SFXISETHINT_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #ifndef _HINT_HXX -#include +#include #endif class SfxItemSet; diff --git a/svtools/inc/svtools/itemiter.hxx b/svl/inc/svl/itemiter.hxx similarity index 97% rename from svtools/inc/svtools/itemiter.hxx rename to svl/inc/svl/itemiter.hxx index 6a9b5e212720..50bbe7902e83 100644 --- a/svtools/inc/svtools/itemiter.hxx +++ b/svl/inc/svl/itemiter.hxx @@ -30,9 +30,9 @@ #ifndef _SFXITEMITER_HXX #define _SFXITEMITER_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include -#include +#include class SfxPoolItem; class SfxItemSet; diff --git a/svtools/inc/svtools/itempool.hxx b/svl/inc/svl/itempool.hxx similarity index 99% rename from svtools/inc/svtools/itempool.hxx rename to svl/inc/svl/itempool.hxx index 81407cee2d0c..d99f29626d38 100644 --- a/svtools/inc/svtools/itempool.hxx +++ b/svl/inc/svl/itempool.hxx @@ -31,7 +31,7 @@ #ifndef _SFXITEMPOOL_HXX #define _SFXITEMPOOL_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #ifndef INCLUDED_LIMITS_H #include @@ -39,8 +39,8 @@ #endif #include #include -#include -#include +#include +#include #include class SvStream; diff --git a/svtools/inc/svtools/itemprop.hxx b/svl/inc/svl/itemprop.hxx similarity index 99% rename from svtools/inc/svtools/itemprop.hxx rename to svl/inc/svl/itemprop.hxx index feab0eab004b..873c34785d5f 100644 --- a/svtools/inc/svtools/itemprop.hxx +++ b/svl/inc/svl/itemprop.hxx @@ -30,10 +30,10 @@ #ifndef _SFX_ITEMPROP_HXX #define _SFX_ITEMPROP_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #include -#include +#include #include #include #include diff --git a/svtools/inc/svtools/itemset.hxx b/svl/inc/svl/itemset.hxx similarity index 99% rename from svtools/inc/svtools/itemset.hxx rename to svl/inc/svl/itemset.hxx index 4cc3edcf65c7..a09cfbc2bbb2 100644 --- a/svtools/inc/svtools/itemset.hxx +++ b/svl/inc/svl/itemset.hxx @@ -30,14 +30,14 @@ #ifndef _SFXITEMSET_HXX #define _SFXITEMSET_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #if STLPORT_VERSION<321 #include #else #include // std::va_list and friends #endif -#include +#include #include #include diff --git a/svtools/inc/svtools/languageoptions.hxx b/svl/inc/svl/languageoptions.hxx similarity index 91% rename from svtools/inc/svtools/languageoptions.hxx rename to svl/inc/svl/languageoptions.hxx index ed247ac01fa3..0cba5235674a 100644 --- a/svtools/inc/svtools/languageoptions.hxx +++ b/svl/inc/svl/languageoptions.hxx @@ -30,11 +30,12 @@ #ifndef _SVTOOLS_LANGUAGEOPTIONS_HXX #define _SVTOOLS_LANGUAGEOPTIONS_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include -#include -#include +#include +#include #include +#include #include // class SvtLanguageOptions ---------------------------------------------------- @@ -47,7 +48,7 @@ class SvtCJKOptions; class SvtCTLOptions; -class SVT_DLLPUBLIC SvtLanguageOptions : public SfxBroadcaster, public SfxListener +class SVL_DLLPUBLIC SvtLanguageOptions : public ::utl::detail::Options { private: SvtCJKOptions* m_pCJKOptions; @@ -78,8 +79,6 @@ public: SvtLanguageOptions( sal_Bool _bDontLoad = sal_False ); ~SvtLanguageOptions(); - virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); - // CJK options sal_Bool IsCJKFontEnabled() const; sal_Bool IsVerticalTextEnabled() const; @@ -113,7 +112,7 @@ public: }; /** #i42730# Gives access to the Windows 16bit system locale */ -class SVT_DLLPUBLIC SvtSystemLanguageOptions : public utl::ConfigItem +class SVL_DLLPUBLIC SvtSystemLanguageOptions : public utl::ConfigItem { private: ::rtl::OUString m_sWin16SystemLocale; @@ -123,6 +122,7 @@ public: ~SvtSystemLanguageOptions(); virtual void Commit(); + virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& rPropertyNames ); LanguageType GetWin16SystemLanguage(); }; diff --git a/svtools/inc/svtools/lckbitem.hxx b/svl/inc/svl/lckbitem.hxx similarity index 97% rename from svtools/inc/svtools/lckbitem.hxx rename to svl/inc/svl/lckbitem.hxx index b21e91a3fd46..77cb63414f4e 100644 --- a/svtools/inc/svtools/lckbitem.hxx +++ b/svl/inc/svl/lckbitem.hxx @@ -30,11 +30,11 @@ #ifndef _LCKBITEM_HXX #define _LCKBITEM_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #include #include -#include +#include // ----------------------------------------------------------------------- diff --git a/svtools/inc/svtools/lockfilecommon.hxx b/svl/inc/svl/lockfilecommon.hxx similarity index 97% rename from svtools/inc/svtools/lockfilecommon.hxx rename to svl/inc/svl/lockfilecommon.hxx index c8bd6251f9cb..c1e18aac7e14 100644 --- a/svtools/inc/svtools/lockfilecommon.hxx +++ b/svl/inc/svl/lockfilecommon.hxx @@ -32,7 +32,7 @@ #ifndef _SVT_LOCKFILECOMMON_HXX #define _SVT_LOCKFILECOMMON_HXX -#include +#include #include #include @@ -54,7 +54,7 @@ namespace svt { // This is a general implementation that is used in document lock file implementation and in sharing control file implementation -class SVT_DLLPUBLIC LockFileCommon +class SVL_DLLPUBLIC LockFileCommon { protected: ::osl::Mutex m_aMutex; diff --git a/svtools/inc/svtools/lstner.hxx b/svl/inc/svl/lstner.hxx similarity index 97% rename from svtools/inc/svtools/lstner.hxx rename to svl/inc/svl/lstner.hxx index 99a6e10701f5..c9993834b42a 100644 --- a/svtools/inc/svtools/lstner.hxx +++ b/svl/inc/svl/lstner.hxx @@ -30,9 +30,9 @@ #ifndef _SFXLSTNER_HXX #define _SFXLSTNER_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include -#include +#include class SfxBroadcaster; class SfxHint; diff --git a/svtools/inc/svtools/macitem.hxx b/svl/inc/svl/macitem.hxx similarity index 96% rename from svtools/inc/svtools/macitem.hxx rename to svl/inc/svl/macitem.hxx index 2e43120f653d..747b9ec0bf17 100644 --- a/svtools/inc/svtools/macitem.hxx +++ b/svl/inc/svl/macitem.hxx @@ -32,8 +32,8 @@ // class SvxMacroItem ---------------------------------------------------- -#include "svtools/svtdllapi.h" -#include +#include "svl/svldllapi.h" +#include #include #include #include @@ -72,7 +72,7 @@ public: class SjJSbxObject; -class SVT_DLLPUBLIC SvxMacro +class SVL_DLLPUBLIC SvxMacro { String aMacName; String aLibName; @@ -125,7 +125,7 @@ DECLARE_TABLE( _SvxMacroTableDtor, SvxMacro* ) #define SVX_MACROTBL_AKTVERSION SVX_MACROTBL_VERSION40 -class SVT_DLLPUBLIC SvxMacroTableDtor : public _SvxMacroTableDtor +class SVL_DLLPUBLIC SvxMacroTableDtor : public _SvxMacroTableDtor { public: inline SvxMacroTableDtor( const USHORT nInitSz = 0, const USHORT nReSz = 1 ); @@ -152,7 +152,7 @@ inline SvxMacroTableDtor::SvxMacroTableDtor( const USHORT nInitSz, Dieses Item beschreibt eine Makro-Tabelle. */ -class SVT_DLLPUBLIC SvxMacroItem: public SfxPoolItem +class SVL_DLLPUBLIC SvxMacroItem: public SfxPoolItem { public: TYPEINFO(); diff --git a/svtools/inc/svtools/metitem.hxx b/svl/inc/svl/metitem.hxx similarity index 91% rename from svtools/inc/svtools/metitem.hxx rename to svl/inc/svl/metitem.hxx index a37d119d57c1..5a1e6627542f 100644 --- a/svtools/inc/svtools/metitem.hxx +++ b/svl/inc/svl/metitem.hxx @@ -30,14 +30,14 @@ #ifndef _SFXMETRICITEM_HXX #define _SFXMETRICITEM_HXX -#include "svtools/svtdllapi.h" -#include +#include "svl/svldllapi.h" +#include -DBG_NAMEEX_VISIBILITY(SfxMetricItem, SVT_DLLPUBLIC) +DBG_NAMEEX_VISIBILITY(SfxMetricItem, SVL_DLLPUBLIC) // ----------------------------------------------------------------------- -class SVT_DLLPUBLIC SfxMetricItem: public SfxInt32Item +class SVL_DLLPUBLIC SfxMetricItem: public SfxInt32Item { public: TYPEINFO(); diff --git a/svtools/inc/svtools/nfkeytab.hxx b/svl/inc/svl/nfkeytab.hxx similarity index 100% rename from svtools/inc/svtools/nfkeytab.hxx rename to svl/inc/svl/nfkeytab.hxx diff --git a/svtools/inc/svtools/nfversi.hxx b/svl/inc/svl/nfversi.hxx similarity index 100% rename from svtools/inc/svtools/nfversi.hxx rename to svl/inc/svl/nfversi.hxx diff --git a/svtools/inc/svtools/nranges.hxx b/svl/inc/svl/nranges.hxx similarity index 98% rename from svtools/inc/svtools/nranges.hxx rename to svl/inc/svl/nranges.hxx index 6996669cdeb1..e527a456a014 100644 --- a/svtools/inc/svtools/nranges.hxx +++ b/svl/inc/svl/nranges.hxx @@ -40,12 +40,12 @@ #define NUMTYPE USHORT #define SfxNumRanges SfxUShortRanges -#include +#include #undef NUMTYPE #define NUMTYPE ULONG #define SfxNumRanges SfxULongRanges -#include +#include #define _SFXNRANGES_HXX diff --git a/svtools/inc/svtools/ondemand.hxx b/svl/inc/svl/ondemand.hxx similarity index 99% rename from svtools/inc/svtools/ondemand.hxx rename to svl/inc/svl/ondemand.hxx index e8361307eb9e..3369f286b2cd 100644 --- a/svtools/inc/svtools/ondemand.hxx +++ b/svl/inc/svl/ondemand.hxx @@ -31,7 +31,7 @@ #ifndef INCLUDED_SVTOOLS_ONDEMAND_HXX #define INCLUDED_SVTOOLS_ONDEMAND_HXX -#include +#include #include #include #include diff --git a/svtools/inc/svtools/ownlist.hxx b/svl/inc/svl/ownlist.hxx similarity index 95% rename from svtools/inc/svtools/ownlist.hxx rename to svl/inc/svl/ownlist.hxx index 472f50e6ef60..21e9ffa74210 100644 --- a/svtools/inc/svtools/ownlist.hxx +++ b/svl/inc/svl/ownlist.hxx @@ -31,7 +31,7 @@ #ifndef _OWNLIST_HXX #define _OWNLIST_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include #include #include @@ -79,7 +79,7 @@ public: }; //========================================================================= -class SVT_DLLPUBLIC SvCommandList +class SVL_DLLPUBLIC SvCommandList /* [Beschreibung] Die Liste enth"alt Objekte vom Typ SvCommand. Wird ein Objekt @@ -95,8 +95,8 @@ class SVT_DLLPUBLIC SvCommandList BOOL FillFromSequence( const com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >& ); void FillSequence( com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >& ); - SVT_DLLPUBLIC friend SvStream& operator >> ( SvStream& rStm, SvCommandList & ); - SVT_DLLPUBLIC friend SvStream& operator << ( SvStream&, const SvCommandList & ); + SVL_DLLPUBLIC friend SvStream& operator >> ( SvStream& rStm, SvCommandList & ); + SVL_DLLPUBLIC friend SvStream& operator << ( SvStream&, const SvCommandList & ); }; #endif // _OWNLIST_HXX diff --git a/svtools/inc/svtools/poolitem.hxx b/svl/inc/svl/poolitem.hxx similarity index 99% rename from svtools/inc/svtools/poolitem.hxx rename to svl/inc/svl/poolitem.hxx index 7e0fea44b87a..1d0a2e982fae 100644 --- a/svtools/inc/svtools/poolitem.hxx +++ b/svl/inc/svl/poolitem.hxx @@ -30,7 +30,7 @@ #ifndef _SFXPOOLITEM_HXX #define _SFXPOOLITEM_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #define TF_POOLABLE @@ -40,8 +40,8 @@ #include #include #include -#include -#include +#include +#include typedef long SfxArgumentError; diff --git a/svtools/inc/svtools/ptitem.hxx b/svl/inc/svl/ptitem.hxx similarity index 94% rename from svtools/inc/svtools/ptitem.hxx rename to svl/inc/svl/ptitem.hxx index 923ab73da1d5..b0deff81e884 100644 --- a/svtools/inc/svtools/ptitem.hxx +++ b/svl/inc/svl/ptitem.hxx @@ -30,17 +30,17 @@ #ifndef _SFXPTITEM_HXX #define _SFXPTITEM_HXX -#include "svtools/svtdllapi.h" -#include +#include "svl/svldllapi.h" +#include #include class SvStream; -DBG_NAMEEX_VISIBILITY(SfxPointItem, SVT_DLLPUBLIC) +DBG_NAMEEX_VISIBILITY(SfxPointItem, SVL_DLLPUBLIC) // ----------------------------------------------------------------------- -class SVT_DLLPUBLIC SfxPointItem: public SfxPoolItem +class SVL_DLLPUBLIC SfxPointItem: public SfxPoolItem { Point aVal; diff --git a/svtools/inc/svtools/rectitem.hxx b/svl/inc/svl/rectitem.hxx similarity index 94% rename from svtools/inc/svtools/rectitem.hxx rename to svl/inc/svl/rectitem.hxx index 39c85d9ab228..1f944bab4102 100644 --- a/svtools/inc/svtools/rectitem.hxx +++ b/svl/inc/svl/rectitem.hxx @@ -30,18 +30,18 @@ #ifndef _SFXRECTITEM_HXX #define _SFXRECTITEM_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include #include -#include +#include class SvStream; -DBG_NAMEEX_VISIBILITY(SfxRectangleItem, SVT_DLLPUBLIC) +DBG_NAMEEX_VISIBILITY(SfxRectangleItem, SVL_DLLPUBLIC) // ----------------------------------------------------------------------- -class SVT_DLLPUBLIC SfxRectangleItem: public SfxPoolItem +class SVL_DLLPUBLIC SfxRectangleItem: public SfxPoolItem { Rectangle aVal; diff --git a/svtools/inc/svtools/restrictedpaths.hxx b/svl/inc/svl/restrictedpaths.hxx similarity index 96% rename from svtools/inc/svtools/restrictedpaths.hxx rename to svl/inc/svl/restrictedpaths.hxx index 218e34cd4556..a3ced1b93019 100644 --- a/svtools/inc/svtools/restrictedpaths.hxx +++ b/svl/inc/svl/restrictedpaths.hxx @@ -31,15 +31,15 @@ #ifndef SVTOOLS_RESTRICTEDPATHS_HXX #define SVTOOLS_RESTRICTEDPATHS_HXX -#include -#include +#include +#include #include #include namespace svt { - class SVT_DLLPUBLIC RestrictedPaths : public IUrlFilter + class SVL_DLLPUBLIC RestrictedPaths : public IUrlFilter { private: ::std::vector< String > m_aUnrestrictedURLs; diff --git a/svtools/inc/svtools/rngitem.hxx b/svl/inc/svl/rngitem.hxx similarity index 94% rename from svtools/inc/svtools/rngitem.hxx rename to svl/inc/svl/rngitem.hxx index 52831f93f71f..d55ba25a06c2 100644 --- a/svtools/inc/svtools/rngitem.hxx +++ b/svl/inc/svl/rngitem.hxx @@ -35,7 +35,7 @@ #define NUMTYPE USHORT #define SfxXRangeItem SfxRangeItem #define SfxXRangesItem SfxUShortRangesItem -#include +#include #undef NUMTYPE #undef SfxXRangeItem #undef SfxXRangesItem @@ -44,7 +44,7 @@ #define NUMTYPE ULONG #define SfxXRangeItem SfxULongRangeItem #define SfxXRangesItem SfxULongRangesItem -#include +#include #undef NUMTYPE #undef SfxXRangeItem #undef SfxXRangesItem @@ -53,14 +53,14 @@ #define _SFXRNGITEM_HXX #else -#include "svtools/svtdllapi.h" -#include +#include "svl/svldllapi.h" +#include class SvStream; // ----------------------------------------------------------------------- -class SVT_DLLPUBLIC SfxXRangeItem : public SfxPoolItem +class SVL_DLLPUBLIC SfxXRangeItem : public SfxPoolItem { private: NUMTYPE nFrom; @@ -89,7 +89,7 @@ public: // ----------------------------------------------------------------------- -class SVT_DLLPUBLIC SfxXRangesItem : public SfxPoolItem +class SVL_DLLPUBLIC SfxXRangesItem : public SfxPoolItem { private: NUMTYPE* _pRanges; diff --git a/svtools/inc/svtools/sfontitm.hxx b/svl/inc/svl/sfontitm.hxx similarity index 99% rename from svtools/inc/svtools/sfontitm.hxx rename to svl/inc/svl/sfontitm.hxx index e1394dec91b3..a12466519d1b 100644 --- a/svtools/inc/svtools/sfontitm.hxx +++ b/svl/inc/svl/sfontitm.hxx @@ -34,7 +34,7 @@ #include #include #include -#include +#include //============================================================================ class SfxFontItem: public SfxPoolItem diff --git a/svtools/inc/svtools/sharecontrolfile.hxx b/svl/inc/svl/sharecontrolfile.hxx similarity index 96% rename from svtools/inc/svtools/sharecontrolfile.hxx rename to svl/inc/svl/sharecontrolfile.hxx index 8735f8c5ccf7..1febb4e77583 100644 --- a/svtools/inc/svtools/sharecontrolfile.hxx +++ b/svl/inc/svl/sharecontrolfile.hxx @@ -31,7 +31,7 @@ #ifndef _SVT_SHARECONTROLFILE_HXX #define _SVT_SHARECONTROLFILE_HXX -#include +#include #include #include @@ -40,7 +40,7 @@ #include #include -#include +#include #define SHARED_OOOUSERNAME_ID LOCKFILE_OOOUSERNAME_ID #define SHARED_SYSUSERNAME_ID LOCKFILE_SYSUSERNAME_ID @@ -51,7 +51,7 @@ namespace svt { -class SVT_DLLPUBLIC ShareControlFile : public LockFileCommon +class SVL_DLLPUBLIC ShareControlFile : public LockFileCommon { ::com::sun::star::uno::Reference< ::com::sun::star::io::XStream > m_xStream; ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > m_xInputStream; diff --git a/svtools/inc/svtools/slstitm.hxx b/svl/inc/svl/slstitm.hxx similarity index 98% rename from svtools/inc/svtools/slstitm.hxx rename to svl/inc/svl/slstitm.hxx index 742d437fb842..9b1c0050cf6b 100644 --- a/svtools/inc/svtools/slstitm.hxx +++ b/svl/inc/svl/slstitm.hxx @@ -30,10 +30,10 @@ #ifndef _SFXSLSTITM_HXX #define _SFXSLSTITM_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include #include -#include +#include #include class SfxImpStringList; diff --git a/svtools/inc/svtools/smplhint.hxx b/svl/inc/svl/smplhint.hxx similarity index 98% rename from svtools/inc/svtools/smplhint.hxx rename to svl/inc/svl/smplhint.hxx index 9858fefd86f0..089a86dae3f2 100644 --- a/svtools/inc/svtools/smplhint.hxx +++ b/svl/inc/svl/smplhint.hxx @@ -30,8 +30,8 @@ #ifndef _SFXSMPLHINT_HXX #define _SFXSMPLHINT_HXX -#include "svtools/svldllapi.h" -#include +#include "svl/svldllapi.h" +#include #include #define SFX_HINT_DYING 0x00000001 diff --git a/svtools/inc/svtools/solar.hrc b/svl/inc/svl/solar.hrc similarity index 92% rename from svtools/inc/svtools/solar.hrc rename to svl/inc/svl/solar.hrc index 348422ef6477..96149b89131c 100644 --- a/svtools/inc/svtools/solar.hrc +++ b/svl/inc/svl/solar.hrc @@ -132,6 +132,8 @@ #define RID_FILTER_START (RID_LIB_START+10200) #define RID_FILTER_END (RID_LIB_START+10299) +// do *NOT* add more ranges here, RID_LIB_END is (RID_LIB_START + 10000) + #define RID_APP_START 20000 #define RID_APP_END 31999 @@ -144,12 +146,6 @@ #define RID_SD_START (27000) #define RID_SD_END (27999) -#define RID_Sa_START (28000) -#define RID_Sa_END (28999) - -#define RID_Sb_START (29000) -#define RID_Sb_END (29999) - #define RID_OBJ_START (30000) #define RID_OBJ_END (32767) @@ -191,20 +187,13 @@ #define HID_WIZARD_END (HID_LIB_START+999) //please note: There is also HID_WIZARD2 below -#define HID_EXTENSIONS_START (HID_LIB_START+1000) -#define HID_EXTENSIONS_END (HID_LIB_START+1099) +// FREE -#define HID_SO2_START (HID_LIB_START+1100) -#define HID_SO2_END (HID_LIB_START+1149) +#define HID_CUI_START (HID_LIB_START+1100) +#define HID_CUI_END (HID_LIB_START+1699) -#define HID_MAIL_START (HID_LIB_START+1150) -#define HID_MAIL_END (HID_LIB_START+1199) - -#define HID_INET_START (HID_LIB_START+1200) -#define HID_INET_END (HID_LIB_START+1259) - -#define HID_OFA_START (HID_LIB_START+1260) -#define HID_OFA_END (HID_LIB_START+1399) +#define HID_OFA_START (HID_LIB_START+1760) +#define HID_OFA_END (HID_LIB_START+1999) #define HID_HELP_START (HID_LIB_START+2000) #define HID_HELP_END (HID_LIB_START+2050) @@ -278,8 +267,8 @@ #define HID_OBJ_START (HID_START+30000) #define HID_OBJ_END (HID_START+32767) -#define HID_SIM_START (HID_OBJ_START+ 0) -#define HID_SIM_END (HID_OBJ_START+ 239) +#define HID_CUI3_START (HID_OBJ_START+ 0) +#define HID_CUI3_END (HID_OBJ_START+ 239) #define HID_AVMEDIA_START (HID_OBJ_START+ 240) #define HID_AVMEDIA_END (HID_OBJ_START+ 255) @@ -308,5 +297,9 @@ #define HID_FORMULA_START (HID_OBJ_START+2081) #define HID_FORMULA_END (HID_OBJ_START+2280) +#define HID_EXTENSIONS_START (HID_OBJ_START+2281) +#define HID_EXTENSIONS_END (HID_OBJ_START+2800) + + #endif diff --git a/svtools/inc/svtools/stritem.hxx b/svl/inc/svl/stritem.hxx similarity index 93% rename from svtools/inc/svtools/stritem.hxx rename to svl/inc/svl/stritem.hxx index a2430b142c1d..21ee9fadd1ec 100644 --- a/svtools/inc/svtools/stritem.hxx +++ b/svl/inc/svl/stritem.hxx @@ -31,11 +31,11 @@ #ifndef _SFXSTRITEM_HXX #define _SFXSTRITEM_HXX -#include "svtools/svtdllapi.h" -#include +#include "svl/svldllapi.h" +#include //============================================================================ -class SVT_DLLPUBLIC SfxStringItem: public CntUnencodedStringItem +class SVL_DLLPUBLIC SfxStringItem: public CntUnencodedStringItem { public: TYPEINFO(); diff --git a/svtools/inc/svtools/style.hrc b/svl/inc/svl/style.hrc similarity index 100% rename from svtools/inc/svtools/style.hrc rename to svl/inc/svl/style.hrc diff --git a/svtools/inc/svtools/style.hxx b/svl/inc/svl/style.hxx similarity index 93% rename from svtools/inc/svtools/style.hxx rename to svl/inc/svl/style.hxx index 17e4bf7b9c06..66c130d346dd 100644 --- a/svtools/inc/svtools/style.hxx +++ b/svl/inc/svl/style.hxx @@ -38,16 +38,16 @@ #include #include #include -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include #include -#include -#include -#include -#include +#include +#include +#include +#include #ifndef _SFX_STYLE_HRC -#include +#include #endif class SfxItemSet; @@ -91,7 +91,7 @@ SfxStyleSheetHint( SFX_STYLESHEET_ERASED, *p ) from: #define VIRTUAL510 virtual -class SVT_DLLPUBLIC SfxStyleSheetBase : public comphelper::OWeakTypeObject +class SVL_DLLPUBLIC SfxStyleSheetBase : public comphelper::OWeakTypeObject { friend class SfxStyleSheetBasePool; @@ -165,7 +165,7 @@ typedef std::vector< rtl::Reference< SfxStyleSheetBase > > SfxStyles; //========================================================================= -class SVT_DLLPUBLIC SfxStyleSheetIterator +class SVL_DLLPUBLIC SfxStyleSheetIterator /* [Beschreibung] @@ -195,8 +195,8 @@ protected: private: USHORT GetPos(){return nAktPosition;} - SVT_DLLPRIVATE BOOL IsTrivialSearch(); - SVT_DLLPRIVATE BOOL DoesStyleMatch(SfxStyleSheetBase *pStyle); + SVL_DLLPRIVATE BOOL IsTrivialSearch(); + SVL_DLLPRIVATE BOOL DoesStyleMatch(SfxStyleSheetBase *pStyle); void* pImp; SfxStyleSheetBase* pAktStyle; @@ -210,7 +210,7 @@ friend class SfxStyleSheetBasePool; class SfxStyleSheetBasePool_Impl; -class SVT_DLLPUBLIC SfxStyleSheetBasePool: public SfxBroadcaster, public comphelper::OWeakTypeObject +class SVL_DLLPUBLIC SfxStyleSheetBasePool: public SfxBroadcaster, public comphelper::OWeakTypeObject { friend class SfxStyleSheetIterator; friend class SfxStyleSheetBase; @@ -218,8 +218,8 @@ friend class SfxStyleSheetBase; SfxStyleSheetBasePool_Impl *pImp; private: - SVT_DLLPRIVATE BOOL Load1_Impl( SvStream& ); - SVT_DLLPRIVATE SfxStyleSheetIterator& GetIterator_Impl(); + SVL_DLLPRIVATE BOOL Load1_Impl( SvStream& ); + SVL_DLLPRIVATE SfxStyleSheetIterator& GetIterator_Impl(); protected: String aAppName; SfxItemPool& rPool; @@ -287,7 +287,7 @@ public: //========================================================================= -class SVT_DLLPUBLIC SfxStyleSheet: public SfxStyleSheetBase, +class SVL_DLLPUBLIC SfxStyleSheet: public SfxStyleSheetBase, public SfxListener, public SfxBroadcaster { public: @@ -306,7 +306,7 @@ protected: //========================================================================= -class SVT_DLLPUBLIC SfxStyleSheetPool: public SfxStyleSheetBasePool +class SVL_DLLPUBLIC SfxStyleSheetPool: public SfxStyleSheetBasePool { protected: using SfxStyleSheetBasePool::Create; @@ -334,7 +334,7 @@ public: //======================================================================== -class SVT_DLLPUBLIC SfxStyleSheetPoolHint : public SfxHint +class SVL_DLLPUBLIC SfxStyleSheetPoolHint : public SfxHint { USHORT nHint; @@ -348,7 +348,7 @@ public: //========================================================================= -class SVT_DLLPUBLIC SfxStyleSheetHint: public SfxHint +class SVL_DLLPUBLIC SfxStyleSheetHint: public SfxHint { SfxStyleSheetBase* pStyleSh; USHORT nHint; @@ -364,7 +364,7 @@ public: { return nHint; } }; -class SVT_DLLPUBLIC SfxStyleSheetHintExtended: public SfxStyleSheetHint +class SVL_DLLPUBLIC SfxStyleSheetHintExtended: public SfxStyleSheetHint { String aName; @@ -379,7 +379,7 @@ public: const String& GetOldName() { return aName; } }; -class SVT_DLLPUBLIC SfxUnoStyleSheet : public ::cppu::ImplInheritanceHelper2< SfxStyleSheet, ::com::sun::star::style::XStyle, ::com::sun::star::lang::XUnoTunnel > +class SVL_DLLPUBLIC SfxUnoStyleSheet : public ::cppu::ImplInheritanceHelper2< SfxStyleSheet, ::com::sun::star::style::XStyle, ::com::sun::star::lang::XUnoTunnel > { public: SfxUnoStyleSheet( const UniString& _rName, const SfxStyleSheetBasePool& _rPool, SfxStyleFamily _eFamily, USHORT _nMaske ); diff --git a/svtools/inc/svtools/svarray.hxx b/svl/inc/svl/svarray.hxx similarity index 99% rename from svtools/inc/svtools/svarray.hxx rename to svl/inc/svl/svarray.hxx index 3ab3676fa5e0..d2479cd5364f 100644 --- a/svtools/inc/svtools/svarray.hxx +++ b/svl/inc/svl/svarray.hxx @@ -101,7 +101,7 @@ *********************************************************************** #endif -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #ifndef INCLUDED_STRING_H #include // memmove() diff --git a/svtools/inc/svtools/svdde.hxx b/svl/inc/svl/svdde.hxx similarity index 94% rename from svtools/inc/svtools/svdde.hxx rename to svl/inc/svl/svdde.hxx index 82681ed9d240..96a1ffa6bf22 100644 --- a/svtools/inc/svtools/svdde.hxx +++ b/svl/inc/svl/svdde.hxx @@ -31,7 +31,7 @@ #ifndef _SVDDE_HXX #define _SVDDE_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include #include #include @@ -84,7 +84,7 @@ DECLARE_LIST( StringList, String * ) // - DdeData - // ----------- -class SVT_DLLPUBLIC DdeData +class SVL_DLLPUBLIC DdeData { friend class DdeInternal; friend class DdeService; @@ -93,7 +93,7 @@ class SVT_DLLPUBLIC DdeData DdeDataImp* pImp; //#if 0 // _SOLAR__PRIVATE - SVT_DLLPRIVATE void Lock(); + SVL_DLLPRIVATE void Lock(); //#endif void SetFormat( ULONG nFmt ); @@ -155,7 +155,7 @@ public: // - DdeTransaction - // ------------------ -class SVT_DLLPUBLIC DdeTransaction +class SVL_DLLPUBLIC DdeTransaction { public: virtual void Data( const DdeData* ); @@ -205,7 +205,7 @@ private: // - DdeLink - // ----------- -class SVT_DLLPUBLIC DdeLink : public DdeTransaction +class SVL_DLLPUBLIC DdeLink : public DdeTransaction { Link aNotify; @@ -222,7 +222,7 @@ public: // - DdeWarmLink - // --------------- -class SVT_DLLPUBLIC DdeWarmLink : public DdeLink +class SVL_DLLPUBLIC DdeWarmLink : public DdeLink { public: DdeWarmLink( DdeConnection&, const String&, long = 0 ); @@ -232,7 +232,7 @@ public: // - DdeHotLink - // -------------- -class SVT_DLLPUBLIC DdeHotLink : public DdeLink +class SVL_DLLPUBLIC DdeHotLink : public DdeLink { public: DdeHotLink( DdeConnection&, const String&, long = 0 ); @@ -242,7 +242,7 @@ public: // - DdeRequest - // -------------- -class SVT_DLLPUBLIC DdeRequest : public DdeTransaction +class SVL_DLLPUBLIC DdeRequest : public DdeTransaction { public: DdeRequest( DdeConnection&, const String&, long = 0 ); @@ -252,7 +252,7 @@ public: // - DdePoke - // ----------- -class SVT_DLLPUBLIC DdePoke : public DdeTransaction +class SVL_DLLPUBLIC DdePoke : public DdeTransaction { public: DdePoke( DdeConnection&, const String&, const char*, long, @@ -265,7 +265,7 @@ public: // - DdeExecute - // -------------- -class SVT_DLLPUBLIC DdeExecute : public DdeTransaction +class SVL_DLLPUBLIC DdeExecute : public DdeTransaction { public: DdeExecute( DdeConnection&, const String&, long = 0 ); @@ -275,7 +275,7 @@ public: // - DdeConnection - // ----------------- -class SVT_DLLPUBLIC DdeConnection +class SVL_DLLPUBLIC DdeConnection { friend class DdeInternal; friend class DdeTransaction; @@ -307,7 +307,7 @@ private: // - DdeItem - // ----------- -class SVT_DLLPUBLIC DdeItem +class SVL_DLLPUBLIC DdeItem { friend class DdeInternal; friend class DdeTopic; @@ -336,7 +336,7 @@ public: // - DdeItem - // ----------- -class SVT_DLLPUBLIC DdeGetPutItem : public DdeItem +class SVL_DLLPUBLIC DdeGetPutItem : public DdeItem { public: DdeGetPutItem( const sal_Unicode* p ); @@ -352,9 +352,9 @@ public: // - DdeTopic - // ------------ -class SVT_DLLPUBLIC DdeTopic +class SVL_DLLPUBLIC DdeTopic { - SVT_DLLPRIVATE void _Disconnect( long ); + SVL_DLLPRIVATE void _Disconnect( long ); public: virtual void Connect( long ); @@ -421,7 +421,7 @@ private: // - DdeService - // -------------- -class SVT_DLLPUBLIC DdeService +class SVL_DLLPUBLIC DdeService { friend class DdeInternal; @@ -448,7 +448,7 @@ private: ConvList* pConv; short nStatus; - SVT_DLLPRIVATE BOOL HasCbFormat( USHORT ); + SVL_DLLPRIVATE BOOL HasCbFormat( USHORT ); public: DdeService( const String& ); diff --git a/svtools/inc/iniadrtk.hxx b/svl/inc/svl/svldata.hxx similarity index 54% rename from svtools/inc/iniadrtk.hxx rename to svl/inc/svl/svldata.hxx index 1e42abcc6261..468e6025cb5a 100644 --- a/svtools/inc/iniadrtk.hxx +++ b/svl/inc/svl/svldata.hxx @@ -6,8 +6,8 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: iniadrtk.hxx,v $ - * $Revision: 1.3 $ + * $RCSfile: svldata.hxx,v $ + * $Revision: 1.4 $ * * This file is part of OpenOffice.org. * @@ -28,36 +28,48 @@ * ************************************************************************/ -#ifndef SVTOOLS_INIADRTK_HXX -#define SVTOOLS_INIADRTK_HXX +#ifndef _SVL_SVLDATA_HXX +#define _SVL_SVLDATA_HXX -class String; +#include + +class SfxItemPool; //============================================================================ -enum AddressToken -{ - ADDRESS_COMPANY, - ADDRESS_STREET, - ADDRESS_COUNTRY, - ADDRESS_PLZ, - ADDRESS_CITY, - ADDRESS_TITLE, - ADDRESS_POSITION, - ADDRESS_TEL_PRIVATE, - ADDRESS_TEL_COMPANY, - ADDRESS_FAX, - ADDRESS_EMAIL, - ADDRESS_STATE, - ADDRESS_FATHERSNAME, - ADDRESS_APARTMENT -}; - -//============================================================================ -class SfxIniManagerAddressEntry +class ImpSvlData { public: - static String get(const String & rAddress, AddressToken eToken); + const SfxItemPool * pStoringPool; + void* m_pThreadsafeRMs; + // one SimpleResMgr for each language for which a resource was requested + // (When using the 'non-simple' resmgr, the first request for any language wins, any + // further request for any other language supply the resmgr of the first call. + // For the simple resmgr we have a mgr for each language ever requested). + +private: + ImpSvlData(): + pStoringPool(0), m_pThreadsafeRMs(NULL) + {} + + ~ImpSvlData(); + +public: + SimpleResMgr * GetSimpleRM(const ::com::sun::star::lang::Locale& rLocale); + static ImpSvlData & GetSvlData(); }; -#endif // SVTOOLS_INIADRTK_HXX +//============================================================================ +class SvtSimpleResId +{ + String m_sValue; + +public: + SvtSimpleResId(USHORT nId, const ::com::sun::star::lang::Locale aLocale) : m_sValue(ImpSvlData::GetSvlData().GetSimpleRM(aLocale)->ReadString(nId)) { }; + + operator String () const { return m_sValue; } +}; + + + +#endif // _SVL_SVLDATA_HXX diff --git a/svtools/inc/svtools/svldllapi.h b/svl/inc/svl/svldllapi.h similarity index 100% rename from svtools/inc/svtools/svldllapi.h rename to svl/inc/svl/svldllapi.h diff --git a/svtools/inc/svtools/svstdarr.hxx b/svl/inc/svl/svstdarr.hxx similarity index 99% rename from svtools/inc/svtools/svstdarr.hxx rename to svl/inc/svl/svstdarr.hxx index 050b228be4ab..869c70e1cac6 100644 --- a/svtools/inc/svtools/svstdarr.hxx +++ b/svl/inc/svl/svstdarr.hxx @@ -43,8 +43,8 @@ *********************************************************************** #endif -#include "svtools/svldllapi.h" -#include +#include "svl/svldllapi.h" +#include //#ifdef _SVSTDARR_BOOLS #ifndef _SVSTDARR_BOOLS_DECL diff --git a/svtools/inc/svtools/svtools.hrc b/svl/inc/svl/svtools.hrc similarity index 97% rename from svtools/inc/svtools/svtools.hrc rename to svl/inc/svl/svtools.hrc index 245d31a2dd21..e4cc91cfcb49 100644 --- a/svtools/inc/svtools/svtools.hrc +++ b/svl/inc/svl/svtools.hrc @@ -30,7 +30,7 @@ #ifndef _SVTOOLS_HRC #define _SVTOOLS_HRC "$Revision: 1.0" -#include +#include #define RID_SVTOOLS_BITMAP_START (RID_SVTOOLS_START + 0) #define RID_SVTOOLS_IMAGELIST_START (RID_SVTOOLS_START + 0) @@ -90,17 +90,7 @@ #define STR_SVT_SAMPLES_HELP (RID_SVTOOLS_START+66) #define STR_WARNING_ITEM (RID_SVTOOLS_START+90) -#define STR_CSTAT_NEVER_UPD (RID_SVTOOLS_START+91) -#define STR_CSTAT_IN_UPD (RID_SVTOOLS_START+92) -#define STR_CSTAT_UPD_NEWER (RID_SVTOOLS_START+93) -#define STR_CSTAT_UPD_NOT_NEWER (RID_SVTOOLS_START+94) -#define STR_CSTAT_UPD_CANCEL (RID_SVTOOLS_START+95) -#define STR_CSTAT_ERR_GENERAL (RID_SVTOOLS_START+96) -#define STR_CSTAT_ERR_NOTEXISTS (RID_SVTOOLS_START+97) -#define STR_CSTAT_ERR_NOTREACHED (RID_SVTOOLS_START+98) #define STR_COLUM_DT_AUTO (RID_SVTOOLS_START+99) -#define STR_CSTAT_UPD_IMMEDIATELY (RID_SVTOOLS_START+100) -#define STR_CSTAT_ERR_OFFLINE (RID_SVTOOLS_START+101) #define CONFIG_BASIC_FORMAT_START (RID_SVTOOLS_START+102) #define STR_BASICKEY_FORMAT_ON (RID_SVTOOLS_START+103) diff --git a/svtools/inc/svtools/szitem.hxx b/svl/inc/svl/szitem.hxx similarity index 98% rename from svtools/inc/svtools/szitem.hxx rename to svl/inc/svl/szitem.hxx index d3fb920aa012..c4b52d4939c0 100644 --- a/svtools/inc/svtools/szitem.hxx +++ b/svl/inc/svl/szitem.hxx @@ -32,7 +32,7 @@ #include -#include +#include class SfxArguments; class SvStream; diff --git a/svtools/inc/svtools/undo.hxx b/svl/inc/svl/undo.hxx similarity index 96% rename from svtools/inc/svtools/undo.hxx rename to svl/inc/svl/undo.hxx index 38cbfb227f1b..354de8b451c7 100644 --- a/svtools/inc/svtools/undo.hxx +++ b/svl/inc/svl/undo.hxx @@ -30,14 +30,14 @@ #ifndef _UNDO_HXX #define _UNDO_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include #include -#include +#include //==================================================================== -class SVT_DLLPUBLIC SfxRepeatTarget +class SVL_DLLPUBLIC SfxRepeatTarget { public: TYPEINFO(); @@ -46,7 +46,7 @@ public: //==================================================================== -class SVT_DLLPUBLIC SfxUndoAction +class SVL_DLLPUBLIC SfxUndoAction { BOOL bLinked; public: @@ -79,7 +79,7 @@ SV_DECL_PTRARR( SfxUndoActions, SfxUndoAction*, 20, 8 ) /** do not make use of this implementation details, unless you really really have to! */ -struct SVT_DLLPUBLIC SfxUndoArray +struct SVL_DLLPUBLIC SfxUndoArray { SfxUndoActions aUndoActions; USHORT nMaxUndoActions; @@ -95,7 +95,7 @@ struct SVT_DLLPUBLIC SfxUndoArray /** do not make use of this implementation details, unless you really really have to! */ -class SVT_DLLPUBLIC SfxListUndoAction : public SfxUndoAction, public SfxUndoArray +class SVL_DLLPUBLIC SfxListUndoAction : public SfxUndoAction, public SfxUndoArray /* [Beschreibung] @@ -135,7 +135,7 @@ class SVT_DLLPUBLIC SfxListUndoAction : public SfxUndoAction, public SfxUndoArra //========================================================================= -class SVT_DLLPUBLIC SfxUndoManager +class SVL_DLLPUBLIC SfxUndoManager { friend class SfxLinkUndoAction; @@ -197,7 +197,7 @@ public: //========================================================================= -class SVT_DLLPUBLIC SfxLinkUndoAction : public SfxUndoAction +class SVL_DLLPUBLIC SfxLinkUndoAction : public SfxUndoAction /* [Beschreibung] diff --git a/svtools/inc/svtools/urlfilter.hxx b/svl/inc/svl/urlfilter.hxx similarity index 100% rename from svtools/inc/svtools/urlfilter.hxx rename to svl/inc/svl/urlfilter.hxx diff --git a/svtools/inc/svtools/visitem.hxx b/svl/inc/svl/visitem.hxx similarity index 98% rename from svtools/inc/svtools/visitem.hxx rename to svl/inc/svl/visitem.hxx index 9ace1212d967..1a3918526def 100644 --- a/svtools/inc/svtools/visitem.hxx +++ b/svl/inc/svl/visitem.hxx @@ -31,9 +31,9 @@ #ifndef _SFXVISIBILITYITEM_HXX #define _SFXVISIBILITYITEM_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #include -#include +#include #include //============================================================================ diff --git a/svtools/inc/svtools/zforlist.hxx b/svl/inc/svl/zforlist.hxx similarity index 96% rename from svtools/inc/svtools/zforlist.hxx rename to svl/inc/svl/zforlist.hxx index 814ca385d61a..4e653caf0238 100644 --- a/svtools/inc/svtools/zforlist.hxx +++ b/svl/inc/svl/zforlist.hxx @@ -30,20 +30,20 @@ #ifndef _ZFORLIST_HXX #define _ZFORLIST_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include #ifndef _TABLE_HXX //autogen #include #endif #include -#include +#include #include #include #include #include -#include +#include #include -#include +#include #include @@ -231,7 +231,7 @@ typedef ::std::map< sal_uInt32, sal_uInt32 > SvNumberFormatterMergeMap; /** Language/country dependent currency entries */ -class SVT_DLLPUBLIC NfCurrencyEntry +class SVL_DLLPUBLIC NfCurrencyEntry { String aSymbol; /// currency symbol String aBankSymbol; /// currency abbreviation @@ -251,7 +251,7 @@ private: //#if 0 // _SOLAR__PRIVATE // nDecimalFormat := 0, 1, 2 // #,##0 or #,##0.00 or #,##0.-- are assigned - SVT_DLLPRIVATE void Impl_BuildFormatStringNumChars( String&, + SVL_DLLPRIVATE void Impl_BuildFormatStringNumChars( String&, const LocaleDataWrapper&, USHORT nDecimalFormat ) const; //#endif // __PRIVATE @@ -328,12 +328,12 @@ public: typedef NfCurrencyEntry* NfCurrencyEntryPtr; SV_DECL_PTRARR_DEL( NfCurrencyTable, NfCurrencyEntryPtr, 128, 1 ) typedef String* WSStringPtr; -SV_DECL_PTRARR_DEL_VISIBILITY( NfWSStringsDtor, WSStringPtr, 8, 1, SVT_DLLPUBLIC ) +SV_DECL_PTRARR_DEL_VISIBILITY( NfWSStringsDtor, WSStringPtr, 8, 1, SVL_DLLPUBLIC ) class SvNumberFormatterRegistry_Impl; -class SVT_DLLPUBLIC SvNumberFormatter +class SVL_DLLPUBLIC SvNumberFormatter { public: @@ -813,37 +813,37 @@ private: #ifdef _ZFORLIST_CXX // ----- private Methoden ----- - SVT_DLLPRIVATE static BOOL bCurrencyTableInitialized; - SVT_DLLPRIVATE static USHORT nSystemCurrencyPosition; - SVT_DLLPRIVATE static SvNumberFormatterRegistry_Impl* pFormatterRegistry; + SVL_DLLPRIVATE static BOOL bCurrencyTableInitialized; + SVL_DLLPRIVATE static USHORT nSystemCurrencyPosition; + SVL_DLLPRIVATE static SvNumberFormatterRegistry_Impl* pFormatterRegistry; // get the registry, create one if none exists - SVT_DLLPRIVATE static SvNumberFormatterRegistry_Impl& GetFormatterRegistry(); + SVL_DLLPRIVATE static SvNumberFormatterRegistry_Impl& GetFormatterRegistry(); // called by ctors - SVT_DLLPRIVATE void ImpConstruct( LanguageType eLang ); + SVL_DLLPRIVATE void ImpConstruct( LanguageType eLang ); // Changes initialized language/country, clears the entries and generates // new ones, may ONLY be called by the binary file format load - SVT_DLLPRIVATE void ImpChangeSysCL( LanguageType eLnge, BOOL bLoadingSO5 ); + SVL_DLLPRIVATE void ImpChangeSysCL( LanguageType eLnge, BOOL bLoadingSO5 ); // Generate builtin formats provided by i18n behind CLOffset, // if bLoadingSO5==FALSE also generate additional i18n formats. - SVT_DLLPRIVATE void ImpGenerateFormats( sal_uInt32 CLOffset, BOOL bLoadingSO5 ); + SVL_DLLPRIVATE void ImpGenerateFormats( sal_uInt32 CLOffset, BOOL bLoadingSO5 ); // Generate additional formats provided by i18n - SVT_DLLPRIVATE void ImpGenerateAdditionalFormats( + SVL_DLLPRIVATE void ImpGenerateAdditionalFormats( sal_uInt32 CLOffset, NumberFormatCodeWrapper& rNumberFormatCode, BOOL bAfterLoadingSO5 ); - SVT_DLLPRIVATE SvNumberformat* ImpInsertFormat( + SVL_DLLPRIVATE SvNumberformat* ImpInsertFormat( const ::com::sun::star::i18n::NumberFormatCode& rCode, sal_uInt32 nPos, BOOL bAfterLoadingSO5 = FALSE, sal_Int16 nOrgIndex = 0 ); // ImpInsertNewStandardFormat for new (since version ...) builtin formats - SVT_DLLPRIVATE SvNumberformat* ImpInsertNewStandardFormat( + SVL_DLLPRIVATE SvNumberformat* ImpInsertNewStandardFormat( const ::com::sun::star::i18n::NumberFormatCode& rCode, sal_uInt32 nPos, USHORT nVersion, @@ -851,41 +851,41 @@ private: sal_Int16 nOrgIndex = 0 ); // Return CLOffset or (MaxCLOffset + SV_COUNTRY_LANGUAGE_OFFSET) if new language/country - SVT_DLLPRIVATE sal_uInt32 ImpGetCLOffset(LanguageType eLnge) const; + SVL_DLLPRIVATE sal_uInt32 ImpGetCLOffset(LanguageType eLnge) const; // Test whether format code already exists, then return index key, // otherwise NUMBERFORMAT_ENTRY_NOT_FOUND - SVT_DLLPRIVATE sal_uInt32 ImpIsEntry( const String& rString, + SVL_DLLPRIVATE sal_uInt32 ImpIsEntry( const String& rString, sal_uInt32 CLOffset, LanguageType eLnge ); // Create builtin formats for language/country if necessary, return CLOffset - SVT_DLLPRIVATE sal_uInt32 ImpGenerateCL( LanguageType eLnge, BOOL bLoadingSO5 = FALSE ); + SVL_DLLPRIVATE sal_uInt32 ImpGenerateCL( LanguageType eLnge, BOOL bLoadingSO5 = FALSE ); // Build negative currency format, old compatibility style - SVT_DLLPRIVATE void ImpGetNegCurrFormat( String& sNegStr, const String& rCurrSymbol ); + SVL_DLLPRIVATE void ImpGetNegCurrFormat( String& sNegStr, const String& rCurrSymbol ); // Build positive currency format, old compatibility style - SVT_DLLPRIVATE void ImpGetPosCurrFormat( String& sPosStr, const String& rCurrSymbol ); + SVL_DLLPRIVATE void ImpGetPosCurrFormat( String& sPosStr, const String& rCurrSymbol ); // Create theCurrencyTable with all NfCurrencyEntry - SVT_DLLPRIVATE static void ImpInitCurrencyTable(); + SVL_DLLPRIVATE static void ImpInitCurrencyTable(); // Return the format index of the currency format of the system locale. // Format is created if not already present. - SVT_DLLPRIVATE sal_uInt32 ImpGetDefaultSystemCurrencyFormat(); + SVL_DLLPRIVATE sal_uInt32 ImpGetDefaultSystemCurrencyFormat(); // Return the format index of the currency format of the current locale. // Format is created if not already present. - SVT_DLLPRIVATE sal_uInt32 ImpGetDefaultCurrencyFormat(); + SVL_DLLPRIVATE sal_uInt32 ImpGetDefaultCurrencyFormat(); // Return the default format for a given type and current locale. // May ONLY be called from within GetStandardFormat(). - SVT_DLLPRIVATE sal_uInt32 ImpGetDefaultFormat( short nType ); + SVL_DLLPRIVATE sal_uInt32 ImpGetDefaultFormat( short nType ); // Return the index in a sequence of format codes matching an enum of // NfIndexTableOffset. If not found 0 is returned. If the sequence doesn't // contain any format code elements a default element is created and inserted. - SVT_DLLPRIVATE sal_Int32 ImpGetFormatCodeIndex( + SVL_DLLPRIVATE sal_Int32 ImpGetFormatCodeIndex( ::com::sun::star::uno::Sequence< ::com::sun::star::i18n::NumberFormatCode >& rSeq, const NfIndexTableOffset nTabOff ); @@ -895,13 +895,13 @@ private: // Return the default index in the sequence. // Non-PRODUCT version may check locale data for matching defaults in one // FormatElement group. - SVT_DLLPRIVATE sal_Int32 ImpAdjustFormatCodeDefault( + SVL_DLLPRIVATE sal_Int32 ImpAdjustFormatCodeDefault( ::com::sun::star::i18n::NumberFormatCode * pFormatArr, sal_Int32 nCount, BOOL bCheckCorrectness = TRUE ); // used as a loop body inside of GetNewCurrencySymbolString() and GetCurrencyEntry() -#ifdef PRODUCT +#ifndef DBG_UTIL inline #endif static BOOL ImpLookupCurrencyEntryLoopBody( diff --git a/svtools/inc/svtools/zformat.hxx b/svl/inc/svl/zformat.hxx similarity index 93% rename from svtools/inc/svtools/zformat.hxx rename to svl/inc/svl/zformat.hxx index ae7d961c0bc6..991460015e6d 100644 --- a/svtools/inc/svtools/zformat.hxx +++ b/svl/inc/svl/zformat.hxx @@ -30,12 +30,12 @@ #ifndef _ZFORMAT_HXX #define _ZFORMAT_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include #include -#include -#include -#include +#include +#include +#include // We need ImpSvNumberformatScan for the private SvNumberformat definitions. #ifdef _ZFORMAT_CXX @@ -175,7 +175,7 @@ private: }; -class SVT_DLLPUBLIC SvNumberformat +class SVL_DLLPUBLIC SvNumberformat { public: // Ctor for Load @@ -461,11 +461,11 @@ private: BOOL bStandard; // If this is a default standard format BOOL bIsUsed; // Flag as used for storing - SVT_DLLPRIVATE USHORT ImpGetNumForStringElementCount( USHORT nNumFor ) const; + SVL_DLLPRIVATE USHORT ImpGetNumForStringElementCount( USHORT nNumFor ) const; - SVT_DLLPRIVATE BOOL ImpIsOtherCalendar( const ImpSvNumFor& rNumFor ) const; + SVL_DLLPRIVATE BOOL ImpIsOtherCalendar( const ImpSvNumFor& rNumFor ) const; - SVT_DLLPRIVATE BOOL ImpSwitchToSpecifiedCalendar( String& rOrgCalendar, + SVL_DLLPRIVATE BOOL ImpSwitchToSpecifiedCalendar( String& rOrgCalendar, double& fOrgDateTime, const ImpSvNumFor& rNumFor ) const; #ifdef _ZFORMAT_CXX // ----- private implementation methods ----- @@ -476,36 +476,36 @@ private: const SvNumberFormatter& GetFormatter() const { return *rScan.GetNumberformatter(); } // divide in substrings and color conditions - SVT_DLLPRIVATE short ImpNextSymbol( String& rString, + SVL_DLLPRIVATE short ImpNextSymbol( String& rString, xub_StrLen& nPos, String& sSymbol ); // read string until ']' and strip blanks (after condition) - SVT_DLLPRIVATE static xub_StrLen ImpGetNumber( String& rString, + SVL_DLLPRIVATE static xub_StrLen ImpGetNumber( String& rString, xub_StrLen& nPos, String& sSymbol ); // get xxx of "[$-xxx]" as LanguageType, starting at and advancing position nPos - SVT_DLLPRIVATE static LanguageType ImpGetLanguageType( const String& rString, xub_StrLen& nPos ); + SVL_DLLPRIVATE static LanguageType ImpGetLanguageType( const String& rString, xub_StrLen& nPos ); // standard number output - SVT_DLLPRIVATE void ImpGetOutputStandard( double& fNumber, String& OutString ); + SVL_DLLPRIVATE void ImpGetOutputStandard( double& fNumber, String& OutString ); // numbers in input line - SVT_DLLPRIVATE void ImpGetOutputInputLine( double fNumber, String& OutString ); + SVL_DLLPRIVATE void ImpGetOutputInputLine( double fNumber, String& OutString ); // check subcondition // OP undefined => -1 // else 0 or 1 - SVT_DLLPRIVATE short ImpCheckCondition(double& fNumber, + SVL_DLLPRIVATE short ImpCheckCondition(double& fNumber, double& fLimit, SvNumberformatLimitOps eOp); - SVT_DLLPRIVATE ULONG ImpGGT(ULONG x, ULONG y); - SVT_DLLPRIVATE ULONG ImpGGTRound(ULONG x, ULONG y); + SVL_DLLPRIVATE ULONG ImpGGT(ULONG x, ULONG y); + SVL_DLLPRIVATE ULONG ImpGGTRound(ULONG x, ULONG y); // Helper function for number strings // append string symbols, insert leading 0 or ' ', or ... - SVT_DLLPRIVATE BOOL ImpNumberFill( String& sStr, + SVL_DLLPRIVATE BOOL ImpNumberFill( String& sStr, double& rNumber, xub_StrLen& k, USHORT& j, @@ -513,7 +513,7 @@ private: short eSymbolType ); // Helper function to fill in the integer part and the group (AKA thousand) separators - SVT_DLLPRIVATE BOOL ImpNumberFillWithThousands( String& sStr, + SVL_DLLPRIVATE BOOL ImpNumberFillWithThousands( String& sStr, double& rNumber, xub_StrLen k, USHORT j, @@ -524,20 +524,20 @@ private: // Helper function to fill in the group (AKA thousand) separators // or to skip additional digits - SVT_DLLPRIVATE void ImpDigitFill( String& sStr, + SVL_DLLPRIVATE void ImpDigitFill( String& sStr, xub_StrLen nStart, xub_StrLen& k, USHORT nIx, xub_StrLen & nDigitCount, utl::DigitGroupingIterator & ); - SVT_DLLPRIVATE BOOL ImpGetDateOutput( double fNumber, + SVL_DLLPRIVATE BOOL ImpGetDateOutput( double fNumber, USHORT nIx, String& OutString ); - SVT_DLLPRIVATE BOOL ImpGetTimeOutput( double fNumber, + SVL_DLLPRIVATE BOOL ImpGetTimeOutput( double fNumber, USHORT nIx, String& OutString ); - SVT_DLLPRIVATE BOOL ImpGetDateTimeOutput( double fNumber, + SVL_DLLPRIVATE BOOL ImpGetDateTimeOutput( double fNumber, USHORT nIx, String& OutString ); @@ -546,23 +546,23 @@ private: // know a "before" era (like zh_TW ROC or ja_JP Gengou). If switched and // rOrgCalendar was "gregorian" the string is emptied. If rOrgCalendar was // empty the previous calendar name and date/time are returned. - SVT_DLLPRIVATE BOOL ImpFallBackToGregorianCalendar( String& rOrgCalendar, double& fOrgDateTime ); + SVL_DLLPRIVATE BOOL ImpFallBackToGregorianCalendar( String& rOrgCalendar, double& fOrgDateTime ); // Append a "G" short era string of the given calendar. In the case of a // Gengou calendar this is a one character abbreviation, for other // calendars the XExtendedCalendar::getDisplayString() method is called. - SVT_DLLPRIVATE static void ImpAppendEraG( String& OutString, const CalendarWrapper& rCal, + SVL_DLLPRIVATE static void ImpAppendEraG( String& OutString, const CalendarWrapper& rCal, sal_Int16 nNatNum ); - SVT_DLLPRIVATE BOOL ImpGetNumberOutput( double fNumber, + SVL_DLLPRIVATE BOOL ImpGetNumberOutput( double fNumber, USHORT nIx, String& OutString ); - SVT_DLLPRIVATE void ImpCopyNumberformat( const SvNumberformat& rFormat ); + SVL_DLLPRIVATE void ImpCopyNumberformat( const SvNumberformat& rFormat ); // normal digits or other digits, depending on ImpSvNumFor.aNatNum, // [NatNum1], [NatNum2], ... - SVT_DLLPRIVATE String ImpGetNatNumString( const SvNumberNatNum& rNum, sal_Int32 nVal, + SVL_DLLPRIVATE String ImpGetNatNumString( const SvNumberNatNum& rNum, sal_Int32 nVal, USHORT nMinDigits = 0 ) const; String ImpIntToString( USHORT nIx, sal_Int32 nVal, USHORT nMinDigits = 0 ) const @@ -574,7 +574,7 @@ private: } // transliterate according to NativeNumber - SVT_DLLPRIVATE void ImpTransliterateImpl( String& rStr, const SvNumberNatNum& rNum ) const; + SVL_DLLPRIVATE void ImpTransliterateImpl( String& rStr, const SvNumberNatNum& rNum ) const; void ImpTransliterate( String& rStr, const SvNumberNatNum& rNum ) const { diff --git a/svtools/inc/urihelper.hxx b/svl/inc/urihelper.hxx similarity index 96% rename from svtools/inc/urihelper.hxx rename to svl/inc/urihelper.hxx index 209f3f04e28a..8be500e438ce 100644 --- a/svtools/inc/urihelper.hxx +++ b/svl/inc/urihelper.hxx @@ -31,7 +31,7 @@ #ifndef SVTOOLS_URIHELPER_HXX #define SVTOOLS_URIHELPER_HXX -#include "svtools/svtdllapi.h" +#include "svl/svldllapi.h" #include "com/sun/star/uno/Reference.hxx" #include #include @@ -64,7 +64,7 @@ namespace URIHelper { existence (see URIHelper::GetMaybeFileHdl), or use bCheckFileExists = false if you want to generate file URLs without checking for their existence. */ -SVT_DLLPUBLIC UniString +SVL_DLLPUBLIC UniString SmartRel2Abs(INetURLObject const & rTheBaseURIRef, ByteString const & rTheRelURIRef, Link const & rMaybeFileHdl = Link(), @@ -91,7 +91,7 @@ SmartRel2Abs(INetURLObject const & rTheBaseURIRef, existence (see URIHelper::GetMaybeFileHdl), or use bCheckFileExists = false if you want to generate file URLs without checking for their existence. */ -SVT_DLLPUBLIC UniString +SVL_DLLPUBLIC UniString SmartRel2Abs(INetURLObject const & rTheBaseURIRef, UniString const & rTheRelURIRef, Link const & rMaybeFileHdl = Link(), @@ -106,10 +106,10 @@ SmartRel2Abs(INetURLObject const & rTheBaseURIRef, INetURLObject::FSysStyle eStyle = INetURLObject::FSYS_DETECT); //============================================================================ -SVT_DLLPUBLIC void SetMaybeFileHdl(Link const & rTheMaybeFileHdl); +SVL_DLLPUBLIC void SetMaybeFileHdl(Link const & rTheMaybeFileHdl); //============================================================================ -SVT_DLLPUBLIC Link GetMaybeFileHdl(); +SVL_DLLPUBLIC Link GetMaybeFileHdl(); /** Converts a URI reference to a relative one, ignoring certain differences (for @@ -131,7 +131,7 @@ SVT_DLLPUBLIC Link GetMaybeFileHdl(); @exception com::sun::star::uno::RuntimeException if any error occurs */ -SVT_DLLPUBLIC com::sun::star::uno::Reference< com::sun::star::uri::XUriReference > +SVL_DLLPUBLIC com::sun::star::uno::Reference< com::sun::star::uri::XUriReference > normalizedMakeRelative( com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > const & context, @@ -159,11 +159,11 @@ normalizedMakeRelative( @deprecated No code should rely on the default component context. */ -SVT_DLLPUBLIC rtl::OUString simpleNormalizedMakeRelative( +SVL_DLLPUBLIC rtl::OUString simpleNormalizedMakeRelative( rtl::OUString const & baseUriReference, rtl::OUString const & uriReference); //============================================================================ -SVT_DLLPUBLIC UniString +SVL_DLLPUBLIC UniString FindFirstURLInText(UniString const & rText, xub_StrLen & rBegin, xub_StrLen & rEnd, @@ -200,7 +200,7 @@ FindFirstURLInText(UniString const & rText, @return The input URI with any password component removed. */ -SVT_DLLPUBLIC UniString +SVL_DLLPUBLIC UniString removePassword(UniString const & rURI, INetURLObject::EncodeMechanism eEncodeMechanism = INetURLObject::WAS_ENCODED, @@ -229,7 +229,7 @@ removePassword(UniString const & rURI, @return The style bit corresponding to the queried content provider's conventions, or FSysStyle(0) if these cannot be determined. */ -SVT_DLLPUBLIC INetURLObject::FSysStyle queryFSysStyle(UniString const & rFileUrl, +SVL_DLLPUBLIC INetURLObject::FSysStyle queryFSysStyle(UniString const & rFileUrl, bool bAddConvenienceStyles = true) throw (com::sun::star::uno::RuntimeException); diff --git a/svtools/inc/urlbmk.hxx b/svl/inc/urlbmk.hxx similarity index 100% rename from svtools/inc/urlbmk.hxx rename to svl/inc/urlbmk.hxx diff --git a/svtools/inc/whiter.hxx b/svl/inc/whiter.hxx similarity index 98% rename from svtools/inc/whiter.hxx rename to svl/inc/whiter.hxx index 87ed2cbc76f0..d2bd7c88d521 100644 --- a/svtools/inc/whiter.hxx +++ b/svl/inc/whiter.hxx @@ -30,7 +30,7 @@ #ifndef _SFX_WHITER_HXX #define _SFX_WHITER_HXX -#include "svtools/svldllapi.h" +#include "svl/svldllapi.h" #ifndef INCLUDED_LIMITS_H #include diff --git a/svtools/inc/xmlement.hxx b/svl/inc/xmlement.hxx similarity index 100% rename from svtools/inc/xmlement.hxx rename to svl/inc/xmlement.hxx diff --git a/svl/prj/build.lst b/svl/prj/build.lst new file mode 100644 index 000000000000..f2d4bf324d01 --- /dev/null +++ b/svl/prj/build.lst @@ -0,0 +1,22 @@ +sl svl : l10n rsc offuh ucbhelper unotools cppu cppuhelper comphelper sal sot NULL +sl svl usr1 - all svl_mkout NULL +sl svl\inc nmake - all svl_inc NULL +sl svl\unx\source\svdde nmake - u svl_usdde svl_inc NULL +sl svl\unx\source\svdde nmake - p svl_psdde svl_inc NULL +sl svl\source\config nmake - all svl_conf svl_inc NULL +sl svl\source\filepicker nmake - all svl_filepick svl_inc NULL +sl svl\source\filerec nmake - all svl_file svl_inc NULL +sl svl\source\items nmake - all svl__item svl_inc NULL +sl svl\source\memtools nmake - all svl_mem svl_inc NULL +sl svl\source\misc nmake - all svl__misc svl_inc NULL +sl svl\source\notify nmake - all svl_not svl_inc NULL +sl svl\source\numbers nmake - all svl_num svl_inc NULL +sl svl\source\svdde nmake - all svl__dde svl_inc NULL +sl svl\source\svsql nmake - all svl_sql svl_inc NULL +sl svl\source\undo nmake - all svl_undo svl_inc NULL +sl svl\source\uno nmake - all svl_uno svl_inc NULL +sl svl\util nmake - all svl_util svl_usdde.u svl_psdde.p svl_conf svl_filepick svl_file svl__item svl_mem svl__misc svl_not svl_num svl__dde svl_sql svl_undo svl_uno NULL +sl svl\source\fsstor nmake - all svl_fsstor svl_inc NULL +sl svl\source\passwordcontainer nmake - all svl_passcont svl_inc NULL + + diff --git a/svl/prj/d.lst b/svl/prj/d.lst new file mode 100644 index 000000000000..a5c2564e81cd --- /dev/null +++ b/svl/prj/d.lst @@ -0,0 +1,22 @@ +mkdir: %COMMON_DEST%\bin%_EXT%\hid +mkdir: %COMMON_DEST%\res%_EXT% +mkdir: %_DEST%\inc%_EXT%\svl + +..\%COMMON_OUTDIR%\misc\*.hid %COMMON_DEST%\bin%_EXT%\hid\*.hid +..\%__SRC%\lib\isvl.lib %_DEST%\lib%_EXT%\isvl.lib +..\%__SRC%\bin\*.dll %_DEST%\bin%_EXT%\* +..\%__SRC%\bin\*.res %_DEST%\bin%_EXT%\* +..\%__SRC%\lib\*.so %_DEST%\lib%_EXT%\* +..\%__SRC%\lib\*.dylib %_DEST%\lib%_EXT%\* + +..\inc\svl\*.hrc %_DEST%\inc%_EXT%\svl\*.hrc +..\inc\svl\*.hxx %_DEST%\inc%_EXT%\svl\*.hxx +..\inc\svl\*.h %_DEST%\inc%_EXT%\svl\*.h +..\inc\*.hrc %_DEST%\inc%_EXT%\svl\*.hrc +..\inc\*.hxx %_DEST%\inc%_EXT%\svl\*.hxx +..\inc\*.h %_DEST%\inc%_EXT%\svl\*.h + +dos: sh -c "if test %OS% = MACOSX; then macosx-create-bundle %_DEST%\bin%_EXT%\bmp=%__PRJROOT%\%__SRC%\bin%_EXT%; fi" + +*.xml %_DEST%\xml%_EXT%\*.xml + diff --git a/svtools/qa/complex/ConfigItems/CheckConfigItems.java b/svl/qa/complex/ConfigItems/CheckConfigItems.java similarity index 99% rename from svtools/qa/complex/ConfigItems/CheckConfigItems.java rename to svl/qa/complex/ConfigItems/CheckConfigItems.java index 97cc21fdec9f..6f4d0ba3d945 100644 --- a/svtools/qa/complex/ConfigItems/CheckConfigItems.java +++ b/svl/qa/complex/ConfigItems/CheckConfigItems.java @@ -102,7 +102,7 @@ public class CheckConfigItems extends ComplexTestCase // create module manager m_xTest = (XJob)UnoRuntime.queryInterface( XJob.class, - m_xSmgr.createInstance("com.sun.star.comp.svtools.ConfigItemTest")); + m_xSmgr.createInstance("com.sun.star.comp.svl.ConfigItemTest")); } //------------------------------------------- diff --git a/svtools/qa/complex/ConfigItems/helper/AccessibilityOptTest.cxx b/svl/qa/complex/ConfigItems/helper/AccessibilityOptTest.cxx similarity index 100% rename from svtools/qa/complex/ConfigItems/helper/AccessibilityOptTest.cxx rename to svl/qa/complex/ConfigItems/helper/AccessibilityOptTest.cxx diff --git a/svtools/qa/complex/ConfigItems/helper/AccessibilityOptTest.hxx b/svl/qa/complex/ConfigItems/helper/AccessibilityOptTest.hxx similarity index 98% rename from svtools/qa/complex/ConfigItems/helper/AccessibilityOptTest.hxx rename to svl/qa/complex/ConfigItems/helper/AccessibilityOptTest.hxx index fc2f4681e4fe..58bb58f8c215 100644 --- a/svtools/qa/complex/ConfigItems/helper/AccessibilityOptTest.hxx +++ b/svl/qa/complex/ConfigItems/helper/AccessibilityOptTest.hxx @@ -37,7 +37,7 @@ #define SVTOOLS_ACCESSIBILITYOPTTEST_HXX #include -#include +#include namespace css = ::com::sun::star; diff --git a/svtools/qa/complex/ConfigItems/helper/ConfigItemTest.cxx b/svl/qa/complex/ConfigItems/helper/ConfigItemTest.cxx similarity index 97% rename from svtools/qa/complex/ConfigItems/helper/ConfigItemTest.cxx rename to svl/qa/complex/ConfigItems/helper/ConfigItemTest.cxx index b21d9d76755e..ad9dda313a5c 100644 --- a/svtools/qa/complex/ConfigItems/helper/ConfigItemTest.cxx +++ b/svl/qa/complex/ConfigItems/helper/ConfigItemTest.cxx @@ -51,7 +51,7 @@ //============================================================================= namespace css = ::com::sun::star; -namespace svtools{ +namespace svl{ //============================================================================= static const ::rtl::OUString PROP_TEST = ::rtl::OUString::createFromAscii("Test"); @@ -196,7 +196,7 @@ css::uno::Sequence< ::rtl::OUString > SAL_CALL ConfigItemTest::getSupportedServi //============================================================================= ::rtl::OUString SAL_CALL ConfigItemTest::st_getImplementationName() { - return ::rtl::OUString::createFromAscii("com.sun.star.comp.svtools.ConfigItemTest"); + return ::rtl::OUString::createFromAscii("com.sun.star.comp.svl.ConfigItemTest"); } //============================================================================= @@ -215,15 +215,15 @@ css::uno::Reference< css::uno::XInterface > SAL_CALL ConfigItemTest::st_create(c return xObject; } -} // namespace svtools +} // namespace svl //============================================================================= static ::cppu::ImplementationEntry const lRegEntries[] = { { - &::svtools::ConfigItemTest::st_create, - &::svtools::ConfigItemTest::st_getImplementationName, - &::svtools::ConfigItemTest::st_getSupportedServiceNames, + &::svl::ConfigItemTest::st_create, + &::svl::ConfigItemTest::st_getImplementationName, + &::svl::ConfigItemTest::st_getSupportedServiceNames, &::cppu::createSingleComponentFactory, 0, 0 }, diff --git a/svtools/qa/complex/ConfigItems/helper/HistoryOptTest.cxx b/svl/qa/complex/ConfigItems/helper/HistoryOptTest.cxx similarity index 99% rename from svtools/qa/complex/ConfigItems/helper/HistoryOptTest.cxx rename to svl/qa/complex/ConfigItems/helper/HistoryOptTest.cxx index 723b3e44f3e5..082328835fca 100644 --- a/svtools/qa/complex/ConfigItems/helper/HistoryOptTest.cxx +++ b/svl/qa/complex/ConfigItems/helper/HistoryOptTest.cxx @@ -34,7 +34,7 @@ ************************************************************************/ #include "HistoryOptTest.hxx" -#include "configitems/historyoptions_const.hxx" +#include #include #include diff --git a/svtools/qa/complex/ConfigItems/helper/HistoryOptTest.hxx b/svl/qa/complex/ConfigItems/helper/HistoryOptTest.hxx similarity index 99% rename from svtools/qa/complex/ConfigItems/helper/HistoryOptTest.hxx rename to svl/qa/complex/ConfigItems/helper/HistoryOptTest.hxx index fca9802d2781..8415d9f989b9 100644 --- a/svtools/qa/complex/ConfigItems/helper/HistoryOptTest.hxx +++ b/svl/qa/complex/ConfigItems/helper/HistoryOptTest.hxx @@ -37,7 +37,7 @@ #define SVTOOLS_HISTORYOPTTEST_HXX #include -#include +#include namespace css = ::com::sun::star; diff --git a/svtools/qa/complex/ConfigItems/helper/PrintOptTest.cxx b/svl/qa/complex/ConfigItems/helper/PrintOptTest.cxx similarity index 100% rename from svtools/qa/complex/ConfigItems/helper/PrintOptTest.cxx rename to svl/qa/complex/ConfigItems/helper/PrintOptTest.cxx diff --git a/svtools/qa/complex/ConfigItems/helper/PrintOptTest.hxx b/svl/qa/complex/ConfigItems/helper/PrintOptTest.hxx similarity index 98% rename from svtools/qa/complex/ConfigItems/helper/PrintOptTest.hxx rename to svl/qa/complex/ConfigItems/helper/PrintOptTest.hxx index 14d4267b8878..79505a4e6faf 100644 --- a/svtools/qa/complex/ConfigItems/helper/PrintOptTest.hxx +++ b/svl/qa/complex/ConfigItems/helper/PrintOptTest.hxx @@ -37,7 +37,7 @@ #define SVTOOLS_PRINTOPTTEST_HXX #include -#include +#include namespace css = ::com::sun::star; diff --git a/svtools/qa/complex/ConfigItems/helper/UserOptTest.cxx b/svl/qa/complex/ConfigItems/helper/UserOptTest.cxx similarity index 100% rename from svtools/qa/complex/ConfigItems/helper/UserOptTest.cxx rename to svl/qa/complex/ConfigItems/helper/UserOptTest.cxx diff --git a/svtools/qa/complex/ConfigItems/helper/UserOptTest.hxx b/svl/qa/complex/ConfigItems/helper/UserOptTest.hxx similarity index 98% rename from svtools/qa/complex/ConfigItems/helper/UserOptTest.hxx rename to svl/qa/complex/ConfigItems/helper/UserOptTest.hxx index 8234b0b7edf4..72ff71cafe2d 100644 --- a/svtools/qa/complex/ConfigItems/helper/UserOptTest.hxx +++ b/svl/qa/complex/ConfigItems/helper/UserOptTest.hxx @@ -37,7 +37,7 @@ #define SVTOOLS_USEROPTTEST_HXX #include -#include +#include namespace css = ::com::sun::star; diff --git a/svtools/qa/complex/ConfigItems/helper/exports.map b/svl/qa/complex/ConfigItems/helper/exports.map similarity index 100% rename from svtools/qa/complex/ConfigItems/helper/exports.map rename to svl/qa/complex/ConfigItems/helper/exports.map diff --git a/svtools/qa/complex/ConfigItems/helper/makefile.mk b/svl/qa/complex/ConfigItems/helper/makefile.mk similarity index 97% rename from svtools/qa/complex/ConfigItems/helper/makefile.mk rename to svl/qa/complex/ConfigItems/helper/makefile.mk index 6070d25b7bd4..d41fe6c129c6 100644 --- a/svtools/qa/complex/ConfigItems/helper/makefile.mk +++ b/svl/qa/complex/ConfigItems/helper/makefile.mk @@ -34,7 +34,7 @@ #************************************************************************* PRJ=..$/..$/..$/.. -PRJNAME= svtools +PRJNAME= svl TARGET= ConfigItemTest USE_DEFFILE= TRUE ENABLE_EXCEPTIONS= TRUE @@ -60,7 +60,7 @@ SHL1OBJS= \ $(SLO)$/ConfigItemTest.obj SHL1STDLIBS= \ - $(SVTOOLLIB) \ + $(SVLIB) \ $(SVLLIB) \ $(UNOTOOLSLIB) \ $(COMPHELPERLIB) \ diff --git a/svtools/qa/complex/ConfigItems/makefile.mk b/svl/qa/complex/ConfigItems/makefile.mk similarity index 99% rename from svtools/qa/complex/ConfigItems/makefile.mk rename to svl/qa/complex/ConfigItems/makefile.mk index f85c5b0a8e65..1291184346bc 100644 --- a/svtools/qa/complex/ConfigItems/makefile.mk +++ b/svl/qa/complex/ConfigItems/makefile.mk @@ -34,7 +34,7 @@ #************************************************************************* PRJ = ..$/..$/.. TARGET = CheckConfigItems -PRJNAME = svtools +PRJNAME = svl PACKAGE = complex$/ConfigItems # --- Settings ----------------------------------------------------- diff --git a/svtools/qa/complex/passwordcontainer/MasterPasswdHandler.java b/svl/qa/complex/passwordcontainer/MasterPasswdHandler.java similarity index 100% rename from svtools/qa/complex/passwordcontainer/MasterPasswdHandler.java rename to svl/qa/complex/passwordcontainer/MasterPasswdHandler.java diff --git a/svtools/qa/complex/passwordcontainer/PasswordContainerTest.java b/svl/qa/complex/passwordcontainer/PasswordContainerTest.java similarity index 100% rename from svtools/qa/complex/passwordcontainer/PasswordContainerTest.java rename to svl/qa/complex/passwordcontainer/PasswordContainerTest.java diff --git a/svtools/qa/complex/passwordcontainer/PasswordContainerUnitTest.java b/svl/qa/complex/passwordcontainer/PasswordContainerUnitTest.java similarity index 100% rename from svtools/qa/complex/passwordcontainer/PasswordContainerUnitTest.java rename to svl/qa/complex/passwordcontainer/PasswordContainerUnitTest.java diff --git a/svtools/qa/complex/passwordcontainer/Test01.java b/svl/qa/complex/passwordcontainer/Test01.java similarity index 100% rename from svtools/qa/complex/passwordcontainer/Test01.java rename to svl/qa/complex/passwordcontainer/Test01.java diff --git a/svtools/qa/complex/passwordcontainer/Test02.java b/svl/qa/complex/passwordcontainer/Test02.java similarity index 100% rename from svtools/qa/complex/passwordcontainer/Test02.java rename to svl/qa/complex/passwordcontainer/Test02.java diff --git a/svtools/qa/complex/passwordcontainer/Test03.java b/svl/qa/complex/passwordcontainer/Test03.java similarity index 100% rename from svtools/qa/complex/passwordcontainer/Test03.java rename to svl/qa/complex/passwordcontainer/Test03.java diff --git a/svtools/qa/complex/passwordcontainer/TestHelper.java b/svl/qa/complex/passwordcontainer/TestHelper.java similarity index 100% rename from svtools/qa/complex/passwordcontainer/TestHelper.java rename to svl/qa/complex/passwordcontainer/TestHelper.java diff --git a/svtools/qa/complex/passwordcontainer/makefile.mk b/svl/qa/complex/passwordcontainer/makefile.mk similarity index 99% rename from svtools/qa/complex/passwordcontainer/makefile.mk rename to svl/qa/complex/passwordcontainer/makefile.mk index 4ce811bd3616..c3ff7538af0f 100644 --- a/svtools/qa/complex/passwordcontainer/makefile.mk +++ b/svl/qa/complex/passwordcontainer/makefile.mk @@ -31,7 +31,7 @@ PRJ = ..$/..$/.. TARGET = PasswordContainerUnitTest -PRJNAME = svtools +PRJNAME=svl PACKAGE = complex$/passwordcontainer # --- Settings ----------------------------------------------------- diff --git a/svtools/qa/export.map b/svl/qa/export.map similarity index 100% rename from svtools/qa/export.map rename to svl/qa/export.map diff --git a/svtools/qa/makefile.mk b/svl/qa/makefile.mk similarity index 95% rename from svtools/qa/makefile.mk rename to svl/qa/makefile.mk index cbb59a0d10ac..439277ea62b0 100644 --- a/svtools/qa/makefile.mk +++ b/svl/qa/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -30,7 +30,7 @@ #************************************************************************* PRJ = .. -PRJNAME = svtools +PRJNAME=svl TARGET = qa ENABLE_EXCEPTIONS = true @@ -40,7 +40,7 @@ ENABLE_EXCEPTIONS = true .INCLUDE : settings.mk # BEGIN ---------------------------------------------------------------- -# auto generated Target:job by codegen.pl +# auto generated Target:job by codegen.pl SHL1OBJS= \ $(SLO)$/test_URIHelper.obj @@ -49,10 +49,11 @@ SHL1STDLIBS=\ $(CPPULIB) \ $(CPPUHELPERLIB) \ $(SALLIB) \ - $(SVTOOLLIB) \ + $(SVLLIB) \ $(TOOLSLIB) \ $(UNOTOOLSLIB) \ - $(CPPUNITLIB) + $(TESTSHL2LIB) \ + $(CPPUNITLIB) SHL1IMPLIB= i$(SHL1TARGET) DEF1NAME =$(SHL1TARGET) @@ -71,15 +72,15 @@ SHL1VERSIONMAP= export.map # LLA: old stuff # USE_DEFFILE = true -# +# # .INCLUDE: settings.mk -# +# # .IF "$(OS)" == "WNT" # REGEXP = "s/^[\#].*$$//" # .ELSE # OS, WNT # REGEXP = 's/^[\#].*$$//' # .ENDIF # OS, WNT -# +# # SHL1TARGET = URIHelper # SHL1OBJS = \ # $(SLO)$/test_URIHelper.obj @@ -90,12 +91,12 @@ SHL1VERSIONMAP= export.map # $(SVTOOLLIB) \ # $(TOOLSLIB) \ # $(UNOTOOLSLIB) -# +# # DEF1NAME = $(SHL1TARGET) # DEF1EXPORTFILE = $(MISC)$/$(SHL1TARGET).dxp -# +# # .INCLUDE: target.mk -# +# # $(MISC)$/$(SHL1TARGET).dxp: sce$/$(SHL1TARGET).sce # + $(TYPE) $< | sed $(REGEXP) > $@ # + $(TYPE) $@ | sed "s/^/test_/" > $(MISC)$/$(SHL1TARGET).tst diff --git a/svtools/qa/test_URIHelper.cxx b/svl/qa/test_URIHelper.cxx similarity index 99% rename from svtools/qa/test_URIHelper.cxx rename to svl/qa/test_URIHelper.cxx index d60780132903..3cf6d30d1813 100644 --- a/svtools/qa/test_URIHelper.cxx +++ b/svl/qa/test_URIHelper.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "sal/config.h" @@ -57,7 +57,7 @@ #include "cppuhelper/bootstrap.hxx" #include "cppuhelper/implbase1.hxx" #include "cppuhelper/implbase2.hxx" -#include "cppunit/simpleheader.hxx" +#include "testshl/simpleheader.hxx" #include "osl/diagnose.h" #include "rtl/strbuf.hxx" #include "rtl/string.h" diff --git a/svtools/source/config/cjkoptions.cxx b/svl/source/config/cjkoptions.cxx similarity index 98% rename from svtools/source/config/cjkoptions.cxx rename to svl/source/config/cjkoptions.cxx index 66d70cd1e2a3..c149c91c86f5 100644 --- a/svtools/source/config/cjkoptions.cxx +++ b/svl/source/config/cjkoptions.cxx @@ -29,16 +29,11 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION +#include -#include - -#include +#include #include #include #include @@ -173,6 +168,7 @@ void SvtCJKOptions_Impl::SetAll(sal_Bool bSet) SetModified(); Commit(); + NotifyListeners(0); } } /*-- 10.04.01 12:41:56--------------------------------------------------- @@ -245,6 +241,7 @@ void SvtCJKOptions_Impl::Load() void SvtCJKOptions_Impl::Notify( const Sequence< OUString >& ) { Load(); + NotifyListeners(0); } /*-- 10.04.01 12:41:57--------------------------------------------------- diff --git a/svtools/source/config/ctloptions.cxx b/svl/source/config/ctloptions.cxx similarity index 95% rename from svtools/source/config/ctloptions.cxx rename to svl/source/config/ctloptions.cxx index 5d2bf131add1..a776bc4b807c 100644 --- a/svtools/source/config/ctloptions.cxx +++ b/svl/source/config/ctloptions.cxx @@ -29,16 +29,11 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION +#include -#include - -#include +#include #include #include #include @@ -46,10 +41,9 @@ #include #include #include -#include -#include +#include #include - +#include #include using namespace ::com::sun::star; @@ -60,7 +54,7 @@ using namespace ::com::sun::star::uno; // SvtCJKOptions_Impl ---------------------------------------------------------- -class SvtCTLOptions_Impl : public utl::ConfigItem, public SfxBroadcaster +class SvtCTLOptions_Impl : public utl::ConfigItem { private: sal_Bool m_bIsLoaded; @@ -160,7 +154,7 @@ SvtCTLOptions_Impl::~SvtCTLOptions_Impl() void SvtCTLOptions_Impl::Notify( const Sequence< rtl::OUString >& ) { Load(); - Broadcast(SfxSimpleHint(SFX_HINT_CTL_SETTINGS_CHANGED)); + NotifyListeners(SFX_HINT_CTL_SETTINGS_CHANGED); } // ----------------------------------------------------------------------------- void SvtCTLOptions_Impl::Commit() @@ -252,7 +246,7 @@ void SvtCTLOptions_Impl::Commit() aValues.realloc(nRealCount); PutProperties( aNames, aValues ); //broadcast changes - Broadcast(SfxSimpleHint(SFX_HINT_CTL_SETTINGS_CHANGED)); + NotifyListeners(SFX_HINT_CTL_SETTINGS_CHANGED); } // ----------------------------------------------------------------------------- void SvtCTLOptions_Impl::Load() @@ -314,7 +308,7 @@ void SvtCTLOptions_Impl::Load() ((eSystemLanguage != LANGUAGE_SYSTEM) && ( nWinScript & SCRIPTTYPE_COMPLEX ))) ) { m_bCTLFontEnabled = sal_True; - sal_uInt16 nLanguage = Application::GetSettings().GetLanguage(); + sal_uInt16 nLanguage = SvtSysLocale().GetLanguage(); //enable sequence checking for the appropriate languages m_bCTLSequenceChecking = m_bCTLRestricted = m_bCTLTypeAndReplace = (MsLangId::needsSequenceChecking( nLanguage) || @@ -330,6 +324,7 @@ void SvtCTLOptions_Impl::SetCTLFontEnabled( sal_Bool _bEnabled ) { m_bCTLFontEnabled = _bEnabled; SetModified(); + NotifyListeners(0); } } //------------------------------------------------------------------------------ @@ -339,6 +334,7 @@ void SvtCTLOptions_Impl::SetCTLSequenceChecking( sal_Bool _bEnabled ) { SetModified(); m_bCTLSequenceChecking = _bEnabled; + NotifyListeners(0); } } //------------------------------------------------------------------------------ @@ -348,6 +344,7 @@ void SvtCTLOptions_Impl::SetCTLSequenceCheckingRestricted( sal_Bool _bEnabled ) { SetModified(); m_bCTLRestricted = _bEnabled; + NotifyListeners(0); } } //------------------------------------------------------------------------------ @@ -357,6 +354,7 @@ void SvtCTLOptions_Impl::SetCTLSequenceCheckingTypeAndReplace( sal_Bool _bEnabl { SetModified(); m_bCTLTypeAndReplace = _bEnabled; + NotifyListeners(0); } } //------------------------------------------------------------------------------ @@ -366,6 +364,7 @@ void SvtCTLOptions_Impl::SetCTLCursorMovement( SvtCTLOptions::CursorMovement _eM { SetModified(); m_eCTLCursorMovement = _eMovement; + NotifyListeners(0); } } //------------------------------------------------------------------------------ @@ -375,6 +374,7 @@ void SvtCTLOptions_Impl::SetCTLTextNumerals( SvtCTLOptions::TextNumerals _eNumer { SetModified(); m_eCTLTextNumerals = _eNumerals; + NotifyListeners(0); } } // global ---------------------------------------------------------------- @@ -399,7 +399,7 @@ SvtCTLOptions::SvtCTLOptions( sal_Bool bDontLoad ) ++nCTLRefCount; m_pImp = pCTLOptions; - StartListening( *m_pImp); + m_pImp->AddListener(this); } // ----------------------------------------------------------------------- @@ -409,6 +409,7 @@ SvtCTLOptions::~SvtCTLOptions() // Global access, must be guarded (multithreading) ::osl::MutexGuard aGuard( CTLMutex::get() ); + m_pImp->RemoveListener(this); if ( !--nCTLRefCount ) DELETEZ( pCTLOptions ); } @@ -490,14 +491,5 @@ sal_Bool SvtCTLOptions::IsReadOnly(EOption eOption) const DBG_ASSERT( pCTLOptions->IsLoaded(), "CTL options not loaded" ); return pCTLOptions->IsReadOnly(eOption); } -/* -----------------30.04.2003 10:40----------------- - - --------------------------------------------------*/ -void SvtCTLOptions::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - vos::OGuard aVclGuard( Application::GetSolarMutex() ); - Broadcast( rHint ); -} - // ----------------------------------------------------------------------------- diff --git a/svl/source/config/itemholder2.cxx b/svl/source/config/itemholder2.cxx new file mode 100644 index 000000000000..695c6598140c --- /dev/null +++ b/svl/source/config/itemholder2.cxx @@ -0,0 +1,182 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: itemholder2.cxx,v $ + * $Revision: 1.13 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svl.hxx" + +#include "itemholder2.hxx" + +//----------------------------------------------- +// includes +#include +#include + +#include +#include +#include +#include + +#include + +//----------------------------------------------- +// namespaces + +namespace css = ::com::sun::star; + +//----------------------------------------------- +// declarations + +//----------------------------------------------- +ItemHolder2::ItemHolder2() + : ItemHolderMutexBase() +{ + try + { + css::uno::Reference< css::lang::XMultiServiceFactory > xSMGR = ::comphelper::getProcessServiceFactory(); + css::uno::Reference< css::lang::XComponent > xCfg( + xSMGR->createInstance(::rtl::OUString::createFromAscii("com.sun.star.configuration.ConfigurationProvider")), + css::uno::UNO_QUERY); + if (xCfg.is()) + xCfg->addEventListener(static_cast< css::lang::XEventListener* >(this)); + } +// #i37892 got errorhandling from ConfigManager::GetConfigurationProvider() + catch(css::uno::RuntimeException& rREx) + { + throw rREx; + } +#ifdef DBG_UTIL + catch(css::uno::Exception& rEx) + { + static sal_Bool bMessage = sal_True; + if(bMessage) + { + bMessage = sal_False; + ::rtl::OString sMsg("CreateInstance with arguments exception: "); + sMsg += ::rtl::OString(rEx.Message.getStr(), + rEx.Message.getLength(), + RTL_TEXTENCODING_ASCII_US); + DBG_ERROR(sMsg.getStr()); + } + } +#else + catch(css::uno::Exception&){} +#endif +} + +//----------------------------------------------- +ItemHolder2::~ItemHolder2() +{ + impl_releaseAllItems(); +} + +//----------------------------------------------- +void ItemHolder2::holdConfigItem(EItem eItem) +{ + static ItemHolder2* pHolder = new ItemHolder2(); + pHolder->impl_addItem(eItem); +} + +//----------------------------------------------- +void SAL_CALL ItemHolder2::disposing(const css::lang::EventObject&) + throw(css::uno::RuntimeException) +{ + impl_releaseAllItems(); +} + +//----------------------------------------------- +void ItemHolder2::impl_addItem(EItem eItem) +{ + ::osl::ResettableMutexGuard aLock(m_aLock); + + TItems::const_iterator pIt; + for ( pIt = m_lItems.begin(); + pIt != m_lItems.end() ; + ++pIt ) + { + const TItemInfo& rInfo = *pIt; + if (rInfo.eItem == eItem) + return; + } + + TItemInfo aNewItem; + aNewItem.eItem = eItem; + impl_newItem(aNewItem); + if (aNewItem.pItem) + m_lItems.push_back(aNewItem); +} + +//----------------------------------------------- +void ItemHolder2::impl_releaseAllItems() +{ + ::osl::ResettableMutexGuard aLock(m_aLock); + + TItems::iterator pIt; + for ( pIt = m_lItems.begin(); + pIt != m_lItems.end() ; + ++pIt ) + { + TItemInfo& rInfo = *pIt; + impl_deleteItem(rInfo); + } + m_lItems.clear(); +} + +//----------------------------------------------- +void ItemHolder2::impl_newItem(TItemInfo& rItem) +{ + switch(rItem.eItem) + { + case E_CJKOPTIONS : + rItem.pItem = new SvtCJKOptions(); + break; + + case E_CTLOPTIONS : + rItem.pItem = new SvtCTLOptions(); + break; + + case E_LANGUAGEOPTIONS : +// capsulate CTL and CJL options ! rItem.pItem = new SvtLanguageOptions(); + break; + + default: + OSL_ASSERT(false); + break; + } +} + +//----------------------------------------------- +void ItemHolder2::impl_deleteItem(TItemInfo& rItem) +{ + if (rItem.pItem) + { + delete rItem.pItem; + rItem.pItem = 0; + } +} diff --git a/svl/source/config/itemholder2.hxx b/svl/source/config/itemholder2.hxx new file mode 100644 index 000000000000..192df8f746c9 --- /dev/null +++ b/svl/source/config/itemholder2.hxx @@ -0,0 +1,92 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: itemholder2.hxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef INCLUDED_SVTOOLS_ITEMHOLDER2_HXX_ +#define INCLUDED_SVTOOLS_ITEMHOLDER2_HXX_ + +//----------------------------------------------- +// includes + +#include +#include +#include + +//----------------------------------------------- +// namespaces + +#ifdef css +#error "Cant use css as namespace alias." +#else +#define css ::com::sun::star +#endif + +//----------------------------------------------- +// definitions + +class ItemHolder2 : private ItemHolderMutexBase + , public ::cppu::WeakImplHelper1< css::lang::XEventListener > +{ + //........................................... + // member + private: + + TItems m_lItems; + + //........................................... + // c++ interface + public: + + ItemHolder2(); + virtual ~ItemHolder2(); + static void holdConfigItem(EItem eItem); + + //........................................... + // uno interface + public: + + virtual void SAL_CALL disposing(const css::lang::EventObject& aEvent) + throw(css::uno::RuntimeException); + + //........................................... + // helper + private: + + void impl_addItem(EItem eItem); + void impl_releaseAllItems(); + void impl_newItem(TItemInfo& rItem); + void impl_deleteItem(TItemInfo& rItem); +}; + +//----------------------------------------------- +// namespaces + +#undef css + +#endif // INCLUDED_SVTOOLS_ITEMHOLDER2_HXX_ diff --git a/svtools/source/config/languageoptions.cxx b/svl/source/config/languageoptions.cxx similarity index 93% rename from svtools/source/config/languageoptions.cxx rename to svl/source/config/languageoptions.cxx index 0dffafee86d2..f16c0b6add49 100644 --- a/svtools/source/config/languageoptions.cxx +++ b/svl/source/config/languageoptions.cxx @@ -29,23 +29,17 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION - -#include -#include -#include -#include +#include +#include +#include #include #include -#include #include #include #include +#include using namespace ::com::sun::star; // global ---------------------------------------------------------------------- @@ -61,7 +55,8 @@ SvtLanguageOptions::SvtLanguageOptions( sal_Bool _bDontLoad ) m_pCJKOptions = new SvtCJKOptions( _bDontLoad ); m_pCTLOptions = new SvtCTLOptions( _bDontLoad ); - StartListening(*m_pCTLOptions); + m_pCTLOptions->AddListener(this); + m_pCJKOptions->AddListener(this); } //------------------------------------------------------------------------------ SvtLanguageOptions::~SvtLanguageOptions() @@ -69,6 +64,9 @@ SvtLanguageOptions::~SvtLanguageOptions() // Global access, must be guarded (multithreading) ::osl::MutexGuard aGuard( ALMutex::get() ); + m_pCTLOptions->RemoveListener(this); + m_pCJKOptions->RemoveListener(this); + delete m_pCJKOptions; delete m_pCTLOptions; } @@ -205,23 +203,15 @@ sal_Bool SvtLanguageOptions::IsReadOnly(SvtLanguageOptions::EOption eOption) con } return bReadOnly; } -/* -----------------30.04.2003 11:03----------------- +/* -----------------30.04.2003 11:03-----------------*/ - --------------------------------------------------*/ -void SvtLanguageOptions::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - vos::OGuard aVclGuard( Application::GetSolarMutex() ); - Broadcast( rHint ); -} - -// ----------------------------------------------------------------------------- // returns for a language the scripttype sal_uInt16 SvtLanguageOptions::GetScriptTypeOfLanguage( sal_uInt16 nLang ) { if( LANGUAGE_DONTKNOW == nLang ) nLang = LANGUAGE_ENGLISH_US; else if( LANGUAGE_SYSTEM == nLang ) - nLang = Application::GetSettings().GetLanguage(); + nLang = SvtSysLocale().GetLanguage(); sal_Int16 nScriptType = MsLangId::getScriptType( nLang ); USHORT nScript; @@ -270,6 +260,12 @@ void SvtSystemLanguageOptions::Commit() { //does nothing } + +void SvtSystemLanguageOptions::Notify( const com::sun::star::uno::Sequence< rtl::OUString >& ) +{ + // no listeners supported yet +} + /*-- 27.10.2005 08:36:14--------------------------------------------------- -----------------------------------------------------------------------*/ diff --git a/svl/source/config/makefile.mk b/svl/source/config/makefile.mk new file mode 100644 index 000000000000..82c4ae12828f --- /dev/null +++ b/svl/source/config/makefile.mk @@ -0,0 +1,54 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.61 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* +PRJ=..$/.. + +PRJNAME=svl +TARGET=config + +ENABLE_EXCEPTIONS := TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/util$/svl.pmk + +# --- Files -------------------------------------------------------- + +SLOFILES= \ + $(SLO)$/cjkoptions.obj \ + $(SLO)$/ctloptions.obj \ + $(SLO)$/itemholder2.obj \ + $(SLO)$/languageoptions.obj + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + diff --git a/svtools/source/filepicker/makefile.mk b/svl/source/filepicker/makefile.mk similarity index 99% rename from svtools/source/filepicker/makefile.mk rename to svl/source/filepicker/makefile.mk index d00ac5170e1a..644c70af0b1a 100644 --- a/svtools/source/filepicker/makefile.mk +++ b/svl/source/filepicker/makefile.mk @@ -30,7 +30,7 @@ #************************************************************************* PRJ=..$/.. -PRJNAME=svtools +PRJNAME=svl TARGET=filepicker ENABLE_EXCEPTIONS=TRUE diff --git a/svtools/source/filepicker/pickerhelper.cxx b/svl/source/filepicker/pickerhelper.cxx similarity index 99% rename from svtools/source/filepicker/pickerhelper.cxx rename to svl/source/filepicker/pickerhelper.cxx index 0d8b2db9d8a0..cda263338d5d 100644 --- a/svtools/source/filepicker/pickerhelper.cxx +++ b/svl/source/filepicker/pickerhelper.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "pickerhelper.hxx" #include "rtl/ustring.hxx" diff --git a/svtools/source/filepicker/pickerhistory.cxx b/svl/source/filepicker/pickerhistory.cxx similarity index 99% rename from svtools/source/filepicker/pickerhistory.cxx rename to svl/source/filepicker/pickerhistory.cxx index 5bd584618f09..5cc12779f0b5 100644 --- a/svtools/source/filepicker/pickerhistory.cxx +++ b/svl/source/filepicker/pickerhistory.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "pickerhistory.hxx" #include "pickerhistoryaccess.hxx" #include diff --git a/svtools/source/filerec/filerec.cxx b/svl/source/filerec/filerec.cxx similarity index 99% rename from svtools/source/filerec/filerec.cxx rename to svl/source/filerec/filerec.cxx index 262e5135572a..ac35a748eef7 100644 --- a/svtools/source/filerec/filerec.cxx +++ b/svl/source/filerec/filerec.cxx @@ -29,8 +29,8 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include +#include "precompiled_svl.hxx" +#include #include //======================================================================== diff --git a/svtools/source/filerec/makefile.mk b/svl/source/filerec/makefile.mk similarity index 98% rename from svtools/source/filerec/makefile.mk rename to svl/source/filerec/makefile.mk index 33e4b4923183..c590e38a7ea1 100644 --- a/svtools/source/filerec/makefile.mk +++ b/svl/source/filerec/makefile.mk @@ -31,7 +31,7 @@ PRJ=..$/.. -PRJNAME=svtools +PRJNAME=svl TARGET=filerec # --- Settings ----------------------------------------------------- diff --git a/svtools/source/fsstor/exports.map b/svl/source/fsstor/exports.map similarity index 100% rename from svtools/source/fsstor/exports.map rename to svl/source/fsstor/exports.map diff --git a/svtools/source/fsstor/fsfactory.cxx b/svl/source/fsstor/fsfactory.cxx similarity index 99% rename from svtools/source/fsstor/fsfactory.cxx rename to svl/source/fsstor/fsfactory.cxx index 33df962be846..e47593ba8f8b 100644 --- a/svtools/source/fsstor/fsfactory.cxx +++ b/svl/source/fsstor/fsfactory.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "fsfactory.hxx" #include "cppuhelper/factory.hxx" diff --git a/svtools/source/fsstor/fsstorage.cxx b/svl/source/fsstor/fsstorage.cxx similarity index 99% rename from svtools/source/fsstor/fsstorage.cxx rename to svl/source/fsstor/fsstorage.cxx index cec018533a9a..bae02feae1dd 100644 --- a/svtools/source/fsstor/fsstorage.cxx +++ b/svl/source/fsstor/fsstorage.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #include diff --git a/svtools/source/fsstor/fsstorage.hxx b/svl/source/fsstor/fsstorage.hxx similarity index 100% rename from svtools/source/fsstor/fsstorage.hxx rename to svl/source/fsstor/fsstorage.hxx diff --git a/svtools/source/fsstor/makefile.mk b/svl/source/fsstor/makefile.mk similarity index 99% rename from svtools/source/fsstor/makefile.mk rename to svl/source/fsstor/makefile.mk index f55f6747f9e1..7f46009750fd 100644 --- a/svtools/source/fsstor/makefile.mk +++ b/svl/source/fsstor/makefile.mk @@ -30,7 +30,7 @@ #************************************************************************* PRJ=..$/.. -PRJNAME=svtools +PRJNAME=svl TARGET=fsstorage.uno LIBTARGET=NO ENABLE_EXCEPTIONS=TRUE diff --git a/svtools/source/fsstor/oinputstreamcontainer.cxx b/svl/source/fsstor/oinputstreamcontainer.cxx similarity index 99% rename from svtools/source/fsstor/oinputstreamcontainer.cxx rename to svl/source/fsstor/oinputstreamcontainer.cxx index dc08a7a34602..53be03699ba0 100644 --- a/svtools/source/fsstor/oinputstreamcontainer.cxx +++ b/svl/source/fsstor/oinputstreamcontainer.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "oinputstreamcontainer.hxx" #include diff --git a/svtools/source/fsstor/oinputstreamcontainer.hxx b/svl/source/fsstor/oinputstreamcontainer.hxx similarity index 100% rename from svtools/source/fsstor/oinputstreamcontainer.hxx rename to svl/source/fsstor/oinputstreamcontainer.hxx diff --git a/svtools/source/fsstor/ostreamcontainer.cxx b/svl/source/fsstor/ostreamcontainer.cxx similarity index 99% rename from svtools/source/fsstor/ostreamcontainer.cxx rename to svl/source/fsstor/ostreamcontainer.cxx index d801f49532b2..dac7c9c31375 100644 --- a/svtools/source/fsstor/ostreamcontainer.cxx +++ b/svl/source/fsstor/ostreamcontainer.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "ostreamcontainer.hxx" diff --git a/svtools/source/fsstor/ostreamcontainer.hxx b/svl/source/fsstor/ostreamcontainer.hxx similarity index 100% rename from svtools/source/fsstor/ostreamcontainer.hxx rename to svl/source/fsstor/ostreamcontainer.hxx diff --git a/svtools/source/inc/fsfactory.hxx b/svl/source/inc/fsfactory.hxx similarity index 100% rename from svtools/source/inc/fsfactory.hxx rename to svl/source/inc/fsfactory.hxx diff --git a/svtools/source/inc/passwordcontainer.hxx b/svl/source/inc/passwordcontainer.hxx similarity index 92% rename from svtools/source/inc/passwordcontainer.hxx rename to svl/source/inc/passwordcontainer.hxx index a6edea49f699..a067672f3cf6 100644 --- a/svtools/source/inc/passwordcontainer.hxx +++ b/svl/source/inc/passwordcontainer.hxx @@ -34,13 +34,14 @@ #include #include #include +#include #include #include #include #include #include #include -#include +#include #include #include #include @@ -52,6 +53,8 @@ #include #include +#include "syscreds.hxx" + #define MEMORY_RECORD 0 #define PERSISTENT_RECORD 1 @@ -241,9 +244,10 @@ enum PasswordState { cancelled }; -class PasswordContainer : public ::cppu::WeakImplHelper4< +class PasswordContainer : public ::cppu::WeakImplHelper5< ::com::sun::star::task::XPasswordContainer, ::com::sun::star::task::XMasterPasswordHandling2, + ::com::sun::star::task::XUrlContainer, ::com::sun::star::lang::XServiceInfo, ::com::sun::star::lang::XEventListener > { @@ -253,6 +257,7 @@ private: ::osl::Mutex mMutex; ::rtl::OUString m_aMasterPasswd; // master password is set when the string is not empty ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > mComponent; + SysCredentialsConfig mUrlContainer; ::com::sun::star::uno::Sequence< ::com::sun::star::task::UserRecord > CopyToUserRecordSequence( const ::std::list< NamePassRecord >& original, @@ -269,6 +274,19 @@ private: const ::rtl::OUString& name, const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& Handler ) throw(::com::sun::star::uno::RuntimeException); +bool createUrlRecord( + const PassMap::iterator & rIter, + bool bName, + const ::rtl::OUString & aName, + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& aHandler, + ::com::sun::star::task::UrlRecord & rRec ) + throw( ::com::sun::star::uno::RuntimeException ); + +::com::sun::star::task::UrlRecord find( + const ::rtl::OUString& aURL, + const ::rtl::OUString& aName, + bool bName, // only needed to support empty user names + const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& aHandler ) throw(::com::sun::star::uno::RuntimeException); ::rtl::OUString GetDefaultMasterPassword(); @@ -369,6 +387,12 @@ public: virtual ::sal_Bool SAL_CALL useDefaultMasterPassword( const ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionHandler >& xHandler ) throw (::com::sun::star::uno::RuntimeException); virtual ::sal_Bool SAL_CALL isDefaultMasterPasswordUsed( ) throw (::com::sun::star::uno::RuntimeException); + // XUrlContainer + virtual void SAL_CALL addUrl( const ::rtl::OUString& Url, ::sal_Bool MakePersistent ) throw (::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL findUrl( const ::rtl::OUString& Url ) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeUrl( const ::rtl::OUString& Url ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getUrls( ::sal_Bool OnlyPersistent ) throw (::com::sun::star::uno::RuntimeException); + void Notify(); }; diff --git a/svtools/source/inc/poolio.hxx b/svl/source/inc/poolio.hxx similarity index 99% rename from svtools/source/inc/poolio.hxx rename to svl/source/inc/poolio.hxx index fb30fc04832d..0018b403796f 100644 --- a/svtools/source/inc/poolio.hxx +++ b/svl/source/inc/poolio.hxx @@ -27,7 +27,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#include +#include #ifndef DELETEZ diff --git a/svtools/source/items/aeitem.cxx b/svl/source/items/aeitem.cxx similarity index 98% rename from svtools/source/items/aeitem.cxx rename to svl/source/items/aeitem.cxx index 63fbd1db6227..55dc818d0160 100644 --- a/svtools/source/items/aeitem.cxx +++ b/svl/source/items/aeitem.cxx @@ -29,16 +29,16 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif #include #define _SVSTDARR_USHORTS -#include -#include -#include +#include +#include +#include // STATIC DATA ----------------------------------------------------------- diff --git a/svtools/source/items1/cenumitm.cxx b/svl/source/items/cenumitm.cxx similarity index 99% rename from svtools/source/items1/cenumitm.cxx rename to svl/source/items/cenumitm.cxx index 1906e62a8cf8..3c2f7764a351 100644 --- a/svtools/source/items1/cenumitm.cxx +++ b/svl/source/items/cenumitm.cxx @@ -29,10 +29,10 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include -#include +#include #include #ifndef _CPPUHELPER_EXTRACT_HXX_ diff --git a/svtools/source/items1/cintitem.cxx b/svl/source/items/cintitem.cxx similarity index 99% rename from svtools/source/items1/cintitem.cxx rename to svl/source/items/cintitem.cxx index 97cce9b75591..9d9d58421fc4 100644 --- a/svtools/source/items1/cintitem.cxx +++ b/svl/source/items/cintitem.cxx @@ -29,10 +29,10 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include -#include +#include //============================================================================ // diff --git a/svtools/source/items1/cntwall.cxx b/svl/source/items/cntwall.cxx similarity index 98% rename from svtools/source/items1/cntwall.cxx rename to svl/source/items/cntwall.cxx index 67e9387fbe26..824ad6b2b5b0 100644 --- a/svtools/source/items1/cntwall.cxx +++ b/svl/source/items/cntwall.cxx @@ -29,14 +29,14 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #include #include -#include +#include #define CNTWALLPAPERITEM_STREAM_MAGIC ( (UINT32)0xfefefefe ) #define CNTWALLPAPERITEM_STREAM_SEEKREL (-( (long)( sizeof( UINT32 ) ) ) ) diff --git a/svtools/source/misc/config.src b/svl/source/items/cstitem.src similarity index 88% rename from svtools/source/misc/config.src rename to svl/source/items/cstitem.src index e11aeb86f402..54951dd3761e 100644 --- a/svtools/source/misc/config.src +++ b/svl/source/items/cstitem.src @@ -6,8 +6,8 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: config.src,v $ - * $Revision: 1.29 $ + * $RCSfile: cstitem.src,v $ + * $Revision: 1.7 $ * * This file is part of OpenOffice.org. * @@ -28,11 +28,10 @@ * ************************************************************************/ -#include - -String STR_WARNING_ITEM +#include +String STR_COLUM_DT_AUTO { - Text [ en-US ] = "Incorrect Version!" ; + Text [ en-US ] = "automatic" ; }; @@ -56,6 +55,13 @@ String STR_WARNING_ITEM + + + + + + + diff --git a/svtools/source/items1/ctypeitm.cxx b/svl/source/items/ctypeitm.cxx similarity index 99% rename from svtools/source/items1/ctypeitm.cxx rename to svl/source/items/ctypeitm.cxx index 552d4a6a9041..69302ebdb868 100644 --- a/svtools/source/items1/ctypeitm.cxx +++ b/svl/source/items/ctypeitm.cxx @@ -29,12 +29,12 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #include -#include +#include //============================================================================ // The following defines are copied from chaos/source/items/cstritem.cxx: diff --git a/svtools/source/items1/custritm.cxx b/svl/source/items/custritm.cxx similarity index 98% rename from svtools/source/items1/custritm.cxx rename to svl/source/items/custritm.cxx index 9f573beb56fd..8687aafbae49 100644 --- a/svtools/source/items1/custritm.cxx +++ b/svl/source/items/custritm.cxx @@ -29,12 +29,12 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #include -#include +#include //============================================================================ // diff --git a/svtools/source/items1/dateitem.cxx b/svl/source/items/dateitem.cxx similarity index 97% rename from svtools/source/items1/dateitem.cxx rename to svl/source/items/dateitem.cxx index 4ba6e1d460f9..d6ef8fdc7c9e 100644 --- a/svtools/source/items1/dateitem.cxx +++ b/svl/source/items/dateitem.cxx @@ -29,17 +29,18 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" // include --------------------------------------------------------------- #define _DATETIMEITEM_CXX -#include +#include +#include +#include #include #include - #include #include #include @@ -48,11 +49,6 @@ #include -#include - -#include -#include - // STATIC DATA ----------------------------------------------------------- DBG_NAME(SfxDateTimeItem) @@ -259,10 +255,12 @@ SfxItemPresentation SfxColumnDateTimeItem::GetPresentation ::com::sun::star::lang::Locale aLocale; if (GetDateTime() == DateTime(Date(1, 2, 3), Time(3, 2, 1))) - rText = String(SvtResId(STR_COLUM_DT_AUTO, + { + rText = String(SvtSimpleResId(STR_COLUM_DT_AUTO, pIntlWrapper ? pIntlWrapper->getLocale() : aLocale)); + } else if (pIntlWrapper) { rText = pIntlWrapper->getLocaleData()->getDate(GetDateTime()); diff --git a/svtools/source/items/eitem.cxx b/svl/source/items/eitem.cxx similarity index 96% rename from svtools/source/items/eitem.cxx rename to svl/source/items/eitem.cxx index f7b95665391d..16d5aae5a16f 100644 --- a/svtools/source/items/eitem.cxx +++ b/svl/source/items/eitem.cxx @@ -29,8 +29,8 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include +#include "precompiled_svl.hxx" +#include //============================================================================ // // class SfxEnumItem diff --git a/svtools/source/items/flagitem.cxx b/svl/source/items/flagitem.cxx similarity index 97% rename from svtools/source/items/flagitem.cxx rename to svl/source/items/flagitem.cxx index e59f981c5afa..537632db04ff 100644 --- a/svtools/source/items/flagitem.cxx +++ b/svl/source/items/flagitem.cxx @@ -29,10 +29,10 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#include -#include +#include +#include #include // STATIC DATA ----------------------------------------------------------- diff --git a/svtools/source/items/globalnameitem.cxx b/svl/source/items/globalnameitem.cxx similarity index 98% rename from svtools/source/items/globalnameitem.cxx rename to svl/source/items/globalnameitem.cxx index 6a8359fb39b8..1b676a95bf71 100644 --- a/svtools/source/items/globalnameitem.cxx +++ b/svl/source/items/globalnameitem.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #include @@ -38,7 +38,7 @@ #include -#include +#include // STATIC DATA ----------------------------------------------------------- diff --git a/svtools/source/items1/ilstitem.cxx b/svl/source/items/ilstitem.cxx similarity index 97% rename from svtools/source/items1/ilstitem.cxx rename to svl/source/items/ilstitem.cxx index a26c054eeadb..4d2cb0a3b5b9 100644 --- a/svtools/source/items1/ilstitem.cxx +++ b/svl/source/items/ilstitem.cxx @@ -29,16 +29,16 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #include -#include +#include #define _SVSTDARR_ULONGS -#include +#include TYPEINIT1_AUTOFACTORY(SfxIntegerListItem, SfxPoolItem); diff --git a/svtools/source/items/imageitm.cxx b/svl/source/items/imageitm.cxx similarity index 98% rename from svtools/source/items/imageitm.cxx rename to svl/source/items/imageitm.cxx index cc4a2ebd4f3b..dec2626472cc 100644 --- a/svtools/source/items/imageitm.cxx +++ b/svl/source/items/imageitm.cxx @@ -29,9 +29,9 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#include +#include #include TYPEINIT1( SfxImageItem, SfxInt16Item ); diff --git a/svtools/source/items/intitem.cxx b/svl/source/items/intitem.cxx similarity index 98% rename from svtools/source/items/intitem.cxx rename to svl/source/items/intitem.cxx index b20f245f964b..1133cdf553d1 100644 --- a/svtools/source/items/intitem.cxx +++ b/svl/source/items/intitem.cxx @@ -29,13 +29,13 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#include +#include #include #include #include -#include +#include //============================================================================ // diff --git a/svtools/source/items1/itemiter.cxx b/svl/source/items/itemiter.cxx similarity index 95% rename from svtools/source/items1/itemiter.cxx rename to svl/source/items/itemiter.cxx index 9a7fa4d72c88..c8c6eea67c82 100644 --- a/svtools/source/items1/itemiter.cxx +++ b/svl/source/items/itemiter.cxx @@ -29,14 +29,14 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif -#include -#include -#include +#include +#include +#include // STATIC DATA ----------------------------------------------------------- diff --git a/svtools/source/items1/itempool.cxx b/svl/source/items/itempool.cxx similarity index 99% rename from svtools/source/items1/itempool.cxx rename to svl/source/items/itempool.cxx index e54bca8d3c19..5f34560e8471 100644 --- a/svtools/source/items1/itempool.cxx +++ b/svl/source/items/itempool.cxx @@ -29,17 +29,17 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #ifndef GCC #endif -#include +#include #include "whassert.hxx" -#include -#include +#include +#include #include "poolio.hxx" #include @@ -589,7 +589,7 @@ void SfxItemPool::Delete() for ( USHORT n = (*ppItemArr)->Count(); n; --n, ++ppHtArr ) if (*ppHtArr) { -#ifndef PRODUCT +#ifdef DBG_UTIL ReleaseRef( **ppHtArr, (*ppHtArr)->GetRefCount() ); #endif delete *ppHtArr; @@ -598,7 +598,7 @@ void SfxItemPool::Delete() } if ( *ppDefaultItem ) { -#ifndef PRODUCT +#ifdef DBG_UTIL SetRefCount( **ppDefaultItem, 0 ); #endif DELETEZ( *ppDefaultItem ); @@ -621,7 +621,7 @@ void SfxItemPool::Delete() for ( USHORT n = (*ppItemArr)->Count(); n; --n, ++ppHtArr ) if (*ppHtArr) { -#ifndef PRODUCT +#ifdef DBG_UTIL ReleaseRef( **ppHtArr, (*ppHtArr)->GetRefCount() ); #endif delete *ppHtArr; @@ -630,7 +630,7 @@ void SfxItemPool::Delete() } if ( *ppDefaultItem ) { -#ifndef PRODUCT +#ifdef DBG_UTIL SetRefCount( **ppDefaultItem, 0 ); #endif delete *ppDefaultItem; diff --git a/svtools/source/items1/itemprop.cxx b/svl/source/items/itemprop.cxx similarity index 96% rename from svtools/source/items1/itemprop.cxx rename to svl/source/items/itemprop.cxx index 354e0a1441ba..3add3f466495 100644 --- a/svtools/source/items1/itemprop.cxx +++ b/svl/source/items/itemprop.cxx @@ -29,11 +29,11 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#include -#include -#include +#include +#include +#include #include #include /************************************************************************* @@ -43,7 +43,7 @@ using namespace com::sun::star; using namespace com::sun::star::beans; using namespace com::sun::star::lang; using namespace com::sun::star::uno; -using namespace ::rtl; + /*-- 16.02.2009 10:03:55--------------------------------------------------- -----------------------------------------------------------------------*/ @@ -262,7 +262,7 @@ void SfxItemPropertySet::getPropertyValue( const SfxItemPropertySimpleEntry& rEn /* -----------------------------06.06.01 12:32-------------------------------- ---------------------------------------------------------------------------*/ -void SfxItemPropertySet::getPropertyValue( const OUString &rName, +void SfxItemPropertySet::getPropertyValue( const rtl::OUString &rName, const SfxItemSet& rSet, Any& rAny ) const throw(RuntimeException, UnknownPropertyException) { @@ -275,7 +275,7 @@ void SfxItemPropertySet::getPropertyValue( const OUString &rName, /* -----------------------------21.02.00 11:26-------------------------------- ---------------------------------------------------------------------------*/ -Any SfxItemPropertySet::getPropertyValue( const OUString &rName, +Any SfxItemPropertySet::getPropertyValue( const rtl::OUString &rName, const SfxItemSet& rSet ) const throw(RuntimeException, UnknownPropertyException) { @@ -327,7 +327,7 @@ void SfxItemPropertySet::setPropertyValue( const SfxItemPropertySimpleEntry& rEn /* -----------------------------21.02.00 11:26-------------------------------- ---------------------------------------------------------------------------*/ -void SfxItemPropertySet::setPropertyValue( const OUString &rName, +void SfxItemPropertySet::setPropertyValue( const rtl::OUString &rName, const Any& aVal, SfxItemSet& rSet ) const throw(RuntimeException, @@ -360,7 +360,7 @@ PropertyState SfxItemPropertySet::getPropertyState(const SfxItemPropertySimpleEn return eRet; } PropertyState SfxItemPropertySet::getPropertyState( - const OUString& rName, const SfxItemSet& rSet) const + const rtl::OUString& rName, const SfxItemSet& rSet) const throw(UnknownPropertyException) { PropertyState eRet = PropertyState_DIRECT_VALUE; @@ -489,7 +489,7 @@ Sequence< Property > SAL_CALL ---------------------------------------------------------------------------*/ Property SAL_CALL - SfxExtItemPropertySetInfo::getPropertyByName( const OUString& rPropertyName ) +SfxExtItemPropertySetInfo::getPropertyByName( const rtl::OUString& rPropertyName ) throw(UnknownPropertyException, RuntimeException) { return aExtMap.getPropertyByName( rPropertyName ); @@ -498,7 +498,7 @@ Property SAL_CALL ---------------------------------------------------------------------------*/ sal_Bool SAL_CALL - SfxExtItemPropertySetInfo::hasPropertyByName( const OUString& rPropertyName ) +SfxExtItemPropertySetInfo::hasPropertyByName( const rtl::OUString& rPropertyName ) throw(RuntimeException) { return aExtMap.hasPropertyByName( rPropertyName ); diff --git a/svtools/source/items1/itemset.cxx b/svl/source/items/itemset.cxx similarity index 99% rename from svtools/source/items1/itemset.cxx rename to svl/source/items/itemset.cxx index 48fe2877b892..45516660ee21 100644 --- a/svtools/source/items1/itemset.cxx +++ b/svl/source/items/itemset.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include @@ -43,12 +43,12 @@ #define _SVSTDARR_USHORTS #define _SVSTDARR_ULONGS -#include -#include -#include -#include +#include +#include +#include +#include #include "whiter.hxx" -#include +#include #include "whassert.hxx" #include @@ -541,7 +541,7 @@ SfxItemState SfxItemSet::GetItemState( USHORT nWhich, // Unterschiedlich vorhanden return SFX_ITEM_DONTCARE; - if ( (*ppFnd)->IsA(TYPE(SfxVoidItem)) ) + if ( (*ppFnd)->Type() == TYPE(SfxVoidItem) ) return SFX_ITEM_DISABLED; if (ppItem) diff --git a/svtools/source/items1/lckbitem.cxx b/svl/source/items/lckbitem.cxx similarity index 98% rename from svtools/source/items1/lckbitem.cxx rename to svl/source/items/lckbitem.cxx index c848e377b257..04e2edb70026 100644 --- a/svtools/source/items1/lckbitem.cxx +++ b/svl/source/items/lckbitem.cxx @@ -29,11 +29,11 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #define _LCKBITEM_CXX -#include -#include +#include +#include #include #include #include diff --git a/svtools/source/items/macitem.cxx b/svl/source/items/macitem.cxx similarity index 99% rename from svtools/source/items/macitem.cxx rename to svl/source/items/macitem.cxx index 480fb844ccc7..511ca2bba57c 100644 --- a/svtools/source/items/macitem.cxx +++ b/svl/source/items/macitem.cxx @@ -29,13 +29,13 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #ifndef GCC #endif -#include +#include // STATIC DATA ----------------------------------------------------------- diff --git a/svtools/source/items1/makefile.mk b/svl/source/items/makefile.mk similarity index 80% rename from svtools/source/items1/makefile.mk rename to svl/source/items/makefile.mk index 9a7d13ff7d0f..d779e16e24d1 100644 --- a/svtools/source/items1/makefile.mk +++ b/svl/source/items/makefile.mk @@ -8,7 +8,7 @@ # # $RCSfile: makefile.mk,v $ # -# $Revision: 1.5 $ +# $Revision: 1.13 $ # # This file is part of OpenOffice.org. # @@ -30,8 +30,8 @@ #************************************************************************* PRJ=..$/.. -PRJNAME=svtools -TARGET=items1 +PRJNAME=svl +TARGET=items ENABLE_EXCEPTIONS=TRUE # --- Settings ----------------------------------------------------- @@ -42,32 +42,40 @@ ENABLE_EXCEPTIONS=TRUE # --- Files -------------------------------------------------------- SLOFILES=\ - $(SLO)$/bintitem.obj \ + $(SLO)$/aeitem.obj \ $(SLO)$/cenumitm.obj \ $(SLO)$/cintitem.obj \ $(SLO)$/cntwall.obj \ - $(SLO)$/cstitem.obj \ $(SLO)$/ctypeitm.obj \ $(SLO)$/custritm.obj \ - $(SLO)$/dateitem.obj \ - $(SLO)$/dtritem.obj \ - $(SLO)$/frqitem.obj \ + $(SLO)$/dateitem.obj \ + $(SLO)$/eitem.obj \ + $(SLO)$/flagitem.obj \ + $(SLO)$/globalnameitem.obj \ $(SLO)$/ilstitem.obj \ + $(SLO)$/imageitm.obj \ + $(SLO)$/intitem.obj \ $(SLO)$/itemiter.obj \ $(SLO)$/itempool.obj \ $(SLO)$/itemprop.obj \ $(SLO)$/itemset.obj \ $(SLO)$/lckbitem.obj \ + $(SLO)$/macitem.obj \ + $(SLO)$/poolcach.obj \ $(SLO)$/poolio.obj \ - $(SLO)$/stylepool.obj \ $(SLO)$/poolitem.obj \ + $(SLO)$/ptitem.obj \ + $(SLO)$/rectitem.obj \ + $(SLO)$/rngitem.obj \ $(SLO)$/sfontitm.obj \ $(SLO)$/sitem.obj \ $(SLO)$/slstitm.obj \ - $(SLO)$/tfrmitem.obj \ - $(SLO)$/tresitem.obj \ - $(SLO)$/whiter.obj \ - $(SLO)$/visitem.obj + $(SLO)$/stritem.obj \ + $(SLO)$/style.obj \ + $(SLO)$/stylepool.obj \ + $(SLO)$/szitem.obj \ + $(SLO)$/visitem.obj \ + $(SLO)$/whiter.obj SRS1NAME=$(TARGET) SRC1FILES=\ diff --git a/svtools/source/items1/nranges.cxx b/svl/source/items/nranges.cxx similarity index 99% rename from svtools/source/items1/nranges.cxx rename to svl/source/items/nranges.cxx index e12c7428d513..789da8dc5ff9 100644 --- a/svtools/source/items1/nranges.cxx +++ b/svl/source/items/nranges.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" // compiled via include from itemset.cxx only! diff --git a/svtools/source/items/poolcach.cxx b/svl/source/items/poolcach.cxx similarity index 98% rename from svtools/source/items/poolcach.cxx rename to svl/source/items/poolcach.cxx index 2c758a7e25fa..e64325213ff4 100644 --- a/svtools/source/items/poolcach.cxx +++ b/svl/source/items/poolcach.cxx @@ -29,15 +29,15 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #ifndef GCC #endif -#include -#include +#include +#include #include "poolcach.hxx" // STATIC DATA ----------------------------------------------------------- diff --git a/svtools/source/items1/poolio.cxx b/svl/source/items/poolio.cxx similarity index 99% rename from svtools/source/items1/poolio.cxx rename to svl/source/items/poolio.cxx index f2eb94ef7f67..4383ac99d2ed 100644 --- a/svtools/source/items1/poolio.cxx +++ b/svl/source/items/poolio.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include @@ -38,11 +38,11 @@ #endif #include -#include +#include #include "whassert.hxx" -#include -#include -#include +#include +#include +#include #include "poolio.hxx" // STATIC DATA ----------------------------------------------------------- @@ -67,7 +67,7 @@ void SfxItemPool::SetStoringPool( const SfxItemPool *pStoringPool ) */ { - ImpSvtData::GetSvtData().pStoringPool = pStoringPool; + ImpSvlData::GetSvlData().pStoringPool = pStoringPool; } //------------------------------------------------------------------------- @@ -84,7 +84,7 @@ const SfxItemPool* SfxItemPool::GetStoringPool() */ { - return ImpSvtData::GetSvtData().pStoringPool; + return ImpSvlData::GetSvlData().pStoringPool; } //------------------------------------------------------------------------- @@ -169,7 +169,7 @@ SvStream &SfxItemPool::Store(SvStream &rStream) const // jeder Pool ist als ganzes ein Record SfxMiniRecordWriter aPoolRec( &rStream, SFX_ITEMPOOL_REC ); - ImpSvtData::GetSvtData().pStoringPool = this; + ImpSvlData::GetSvlData().pStoringPool = this; // Einzel-Header (Version des Inhalts und Name) { @@ -309,7 +309,7 @@ SvStream &SfxItemPool::Store(SvStream &rStream) const } // weitere Pools rausschreiben - ImpSvtData::GetSvtData().pStoringPool = 0; + ImpSvlData::GetSvlData().pStoringPool = 0; aPoolRec.Close(); if ( !rStream.GetError() && pSecondary ) pSecondary->Store( rStream ); diff --git a/svtools/source/items1/poolitem.cxx b/svl/source/items/poolitem.cxx similarity index 99% rename from svtools/source/items1/poolitem.cxx rename to svl/source/items/poolitem.cxx index ef160b4a8b4c..4957c5c16945 100644 --- a/svtools/source/items1/poolitem.cxx +++ b/svl/source/items/poolitem.cxx @@ -29,9 +29,9 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#include +#include #include // STATIC DATA ----------------------------------------------------------- diff --git a/svtools/source/items/ptitem.cxx b/svl/source/items/ptitem.cxx similarity index 98% rename from svtools/source/items/ptitem.cxx rename to svl/source/items/ptitem.cxx index ac1e94fd1727..30fef0227397 100644 --- a/svtools/source/items/ptitem.cxx +++ b/svl/source/items/ptitem.cxx @@ -29,14 +29,14 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#include +#include #include #include #include -#include +#include #include "memberid.hrc" using namespace ::com::sun::star; diff --git a/svtools/source/items/rectitem.cxx b/svl/source/items/rectitem.cxx similarity index 98% rename from svtools/source/items/rectitem.cxx rename to svl/source/items/rectitem.cxx index f9faeeeaa824..26c4876d8c2c 100644 --- a/svtools/source/items/rectitem.cxx +++ b/svl/source/items/rectitem.cxx @@ -29,14 +29,14 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#include +#include #include #include #include -#include +#include #include "memberid.hrc" // STATIC DATA ----------------------------------------------------------- diff --git a/svtools/source/items/rngitem.cxx b/svl/source/items/rngitem.cxx similarity index 94% rename from svtools/source/items/rngitem.cxx rename to svl/source/items/rngitem.cxx index 0c62de7229f4..b6340d662112 100644 --- a/svtools/source/items/rngitem.cxx +++ b/svl/source/items/rngitem.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #ifndef NUMTYPE @@ -37,13 +37,13 @@ #define NUMTYPE USHORT #define SfxXRangeItem SfxRangeItem #define SfxXRangesItem SfxUShortRangesItem -#include +#include #include "rngitem_inc.cxx" #define NUMTYPE sal_uInt32 #define SfxXRangeItem SfxULongRangeItem #define SfxXRangesItem SfxULongRangesItem -#include +#include #include "rngitem_inc.cxx" #else diff --git a/svtools/source/items/rngitem_inc.cxx b/svl/source/items/rngitem_inc.cxx similarity index 100% rename from svtools/source/items/rngitem_inc.cxx rename to svl/source/items/rngitem_inc.cxx diff --git a/svtools/source/items1/sfontitm.cxx b/svl/source/items/sfontitm.cxx similarity index 98% rename from svtools/source/items1/sfontitm.cxx rename to svl/source/items/sfontitm.cxx index ee7119c95e1c..9ec06bc5a105 100644 --- a/svtools/source/items1/sfontitm.cxx +++ b/svl/source/items/sfontitm.cxx @@ -29,10 +29,10 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include -#include +#include //============================================================================ // diff --git a/svtools/source/items1/sitem.cxx b/svl/source/items/sitem.cxx similarity index 97% rename from svtools/source/items1/sitem.cxx rename to svl/source/items/sitem.cxx index 2a917e93bb79..52f0931c9eae 100644 --- a/svtools/source/items1/sitem.cxx +++ b/svl/source/items/sitem.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" // INCLUDE --------------------------------------------------------------- #ifndef GCC @@ -38,8 +38,8 @@ #include #include -#include -#include +#include +#include // STATIC DATA ----------------------------------------------------------- diff --git a/svtools/source/items1/slstitm.cxx b/svl/source/items/slstitm.cxx similarity index 99% rename from svtools/source/items1/slstitm.cxx rename to svl/source/items/slstitm.cxx index 87163d41e033..d0dd801bb6f9 100644 --- a/svtools/source/items1/slstitm.cxx +++ b/svl/source/items/slstitm.cxx @@ -29,10 +29,10 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#include -#include +#include +#include #include #include #include diff --git a/svtools/source/items/stritem.cxx b/svl/source/items/stritem.cxx similarity index 97% rename from svtools/source/items/stritem.cxx rename to svl/source/items/stritem.cxx index 37968dc3ee1d..5f6b692106a3 100644 --- a/svtools/source/items/stritem.cxx +++ b/svl/source/items/stritem.cxx @@ -29,8 +29,8 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include +#include "precompiled_svl.hxx" +#include //============================================================================ // diff --git a/svtools/source/items/style.cxx b/svl/source/items/style.cxx similarity index 97% rename from svtools/source/items/style.cxx rename to svl/source/items/style.cxx index ad11f1527ce7..756a2f7edc21 100644 --- a/svtools/source/items/style.cxx +++ b/svl/source/items/style.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif @@ -43,17 +43,16 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include -#include -#include -#include -#include -#include - +#include +#include +#include +#include +#include #include #define STYLESTREAM "SfxStyleSheets" @@ -393,7 +392,7 @@ XubString SfxStyleSheetBase::GetDescription( SfxMapUnit eMetric ) const SfxPoolItem* pItem = aIter.FirstItem(); IntlWrapper aIntlWrapper(comphelper::getProcessServiceFactory(), - Application::GetSettings().GetLanguage()); + SvtSysLocale().GetLanguage()); while ( pItem ) { XubString aItemPresentation; @@ -702,11 +701,11 @@ SfxStyleSheetBase* SfxStyleSheetBasePool::Create( const SfxStyleSheetBase& r ) SfxStyleSheetBase& SfxStyleSheetBasePool::Make( const XubString& rName, SfxStyleFamily eFam, USHORT mask, USHORT nPos) { - DBG_ASSERT( eFam != SFX_STYLE_FAMILY_ALL, "svtools::SfxStyleSheetBasePool::Make(), FamilyAll is not a allowed Familie" ); + DBG_ASSERT( eFam != SFX_STYLE_FAMILY_ALL, "svl::SfxStyleSheetBasePool::Make(), FamilyAll is not a allowed Familie" ); SfxStyleSheetIterator aIter(this, eFam, mask); rtl::Reference< SfxStyleSheetBase > xStyle( aIter.Find( rName ) ); - DBG_ASSERT( !xStyle.is(), "svtools::SfxStyleSheetBasePool::Make(), StyleSheet already exists" ); + DBG_ASSERT( !xStyle.is(), "svl::SfxStyleSheetBasePool::Make(), StyleSheet already exists" ); SfxStyleSheetIterator& rIter = GetIterator_Impl(); if( !xStyle.is() ) @@ -820,15 +819,15 @@ void SfxStyleSheetBasePool::Remove( SfxStyleSheetBase* p ) void SfxStyleSheetBasePool::Insert( SfxStyleSheetBase* p ) { - DBG_ASSERT( p, "svtools::SfxStyleSheetBasePool::Insert(), no stylesheet?" ); + DBG_ASSERT( p, "svl::SfxStyleSheetBasePool::Insert(), no stylesheet?" ); SfxStyleSheetIterator aIter(this, p->GetFamily(), p->GetMask()); SfxStyleSheetBase* pOld = aIter.Find( p->GetName() ); - DBG_ASSERT( !pOld, "svtools::SfxStyleSheetBasePool::Insert(), StyleSheet already inserted" ); + DBG_ASSERT( !pOld, "svl::SfxStyleSheetBasePool::Insert(), StyleSheet already inserted" ); if( p->GetParent().Len() ) { pOld = aIter.Find( p->GetParent() ); - DBG_ASSERT( pOld, "svtools::SfxStyleSheetBasePool::Insert(), Parent not found!" ); + DBG_ASSERT( pOld, "svl::SfxStyleSheetBasePool::Insert(), Parent not found!" ); } aStyles.push_back( rtl::Reference< SfxStyleSheetBase >( p ) ); Broadcast( SfxStyleSheetHint( SFX_STYLESHEET_CREATED, *p ) ); diff --git a/svtools/source/items1/stylepool.cxx b/svl/source/items/stylepool.cxx similarity index 99% rename from svtools/source/items1/stylepool.cxx rename to svl/source/items/stylepool.cxx index 5f31500be73c..6d214b6b94dd 100644 --- a/svtools/source/items1/stylepool.cxx +++ b/svl/source/items/stylepool.cxx @@ -27,6 +27,8 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svl.hxx" #ifdef _MSC_VER #pragma hdrstop @@ -36,8 +38,8 @@ #include #include "stylepool.hxx" -#include -#include +#include +#include using namespace boost; diff --git a/svtools/source/items/szitem.cxx b/svl/source/items/szitem.cxx similarity index 98% rename from svtools/source/items/szitem.cxx rename to svl/source/items/szitem.cxx index ec3ff83dd2ec..a7667a25a97c 100644 --- a/svtools/source/items/szitem.cxx +++ b/svl/source/items/szitem.cxx @@ -29,15 +29,15 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#include +#include #include #include #include #include -#include +#include #include "memberid.hrc" // STATIC DATA ----------------------------------------------------------- diff --git a/svtools/source/items1/visitem.cxx b/svl/source/items/visitem.cxx similarity index 98% rename from svtools/source/items1/visitem.cxx rename to svl/source/items/visitem.cxx index 112b223a8be0..e4ff302541fe 100644 --- a/svtools/source/items1/visitem.cxx +++ b/svl/source/items/visitem.cxx @@ -29,8 +29,8 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include +#include "precompiled_svl.hxx" +#include #include #include diff --git a/svtools/source/items1/whassert.hxx b/svl/source/items/whassert.hxx similarity index 100% rename from svtools/source/items1/whassert.hxx rename to svl/source/items/whassert.hxx diff --git a/svtools/source/items1/whiter.cxx b/svl/source/items/whiter.cxx similarity index 98% rename from svtools/source/items1/whiter.cxx rename to svl/source/items/whiter.cxx index 461daf7ac012..b5e53e0bc278 100644 --- a/svtools/source/items1/whiter.cxx +++ b/svl/source/items/whiter.cxx @@ -29,13 +29,13 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" // INCLUDE --------------------------------------------------------------- #ifndef GCC #endif #include "whiter.hxx" -#include +#include DBG_NAME(SfxWhichIter) diff --git a/svtools/source/memtools/makefile.mk b/svl/source/memtools/makefile.mk similarity index 98% rename from svtools/source/memtools/makefile.mk rename to svl/source/memtools/makefile.mk index 4592bceff8cc..8f59391a25ee 100644 --- a/svtools/source/memtools/makefile.mk +++ b/svl/source/memtools/makefile.mk @@ -31,7 +31,7 @@ PRJ=..$/.. -PRJNAME=svtools +PRJNAME=svl TARGET=svarray # --- Settings ----------------------------------------------------- diff --git a/svtools/source/memtools/svarray.cxx b/svl/source/memtools/svarray.cxx similarity index 99% rename from svtools/source/memtools/svarray.cxx rename to svl/source/memtools/svarray.cxx index fe682e5f535d..e2fa809c1b52 100644 --- a/svtools/source/memtools/svarray.cxx +++ b/svl/source/memtools/svarray.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #define _SVARRAY_CXX @@ -59,7 +59,7 @@ #define _SVSTDARR_XUB_STRLEN #define _SVSTDARR_XUB_STRLENSORT -#include +#include #include #include diff --git a/svtools/source/misc1/PasswordHelper.cxx b/svl/source/misc/PasswordHelper.cxx similarity index 99% rename from svtools/source/misc1/PasswordHelper.cxx rename to svl/source/misc/PasswordHelper.cxx index 53c447bde830..a1125306eb7b 100644 --- a/svtools/source/misc1/PasswordHelper.cxx +++ b/svl/source/misc/PasswordHelper.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC diff --git a/svtools/source/misc1/adrparse.cxx b/svl/source/misc/adrparse.cxx similarity index 98% rename from svtools/source/misc1/adrparse.cxx rename to svl/source/misc/adrparse.cxx index d9b389513f80..b45650846df5 100644 --- a/svtools/source/misc1/adrparse.cxx +++ b/svl/source/misc/adrparse.cxx @@ -29,16 +29,16 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include -namespace unnamed_svtools_adrparse {} -using namespace unnamed_svtools_adrparse; +namespace unnamed_svl_adrparse {} +using namespace unnamed_svl_adrparse; // unnamed namespaces don't work well yet //============================================================================ -namespace unnamed_svtools_adrparse { +namespace unnamed_svl_adrparse { enum ElementType { ELEMENT_START, ELEMENT_DELIM, ELEMENT_ITEM, ELEMENT_END }; @@ -172,8 +172,8 @@ inline void SvAddressParser_Impl::addTokenToRealName() if (!m_pRealNameBegin) m_pRealNameBegin = m_pRealNameContentBegin = m_pCurTokenBegin; else if (m_pRealNameEnd < m_pCurTokenBegin - 1 - || m_pRealNameEnd == m_pCurTokenBegin - 1 - && *m_pRealNameEnd != ' ') + || (m_pRealNameEnd == m_pCurTokenBegin - 1 + && *m_pRealNameEnd != ' ')) m_bRealNameReparse = true; m_pRealNameEnd = m_pRealNameContentEnd = m_pCurTokenEnd; } @@ -634,8 +634,8 @@ SvAddressParser_Impl::SvAddressParser_Impl(SvAddressParser * pParser, else { m_pAddrSpec = m_aInnerAddrSpec.isValid() - || !m_aOuterAddrSpec.isValid() - && m_aInnerAddrSpec.isPoorlyValid() ? + || (!m_aOuterAddrSpec.isValid() + && m_aInnerAddrSpec.isPoorlyValid()) ? &m_aInnerAddrSpec : m_aOuterAddrSpec.isPoorlyValid() ? &m_aOuterAddrSpec : 0; @@ -663,11 +663,11 @@ SvAddressParser_Impl::SvAddressParser_Impl(SvAddressParser * pParser, } UniString aTheRealName; if (!m_pRealNameBegin - || m_pAddrSpec == &m_aOuterAddrSpec + || (m_pAddrSpec == &m_aOuterAddrSpec && m_pRealNameBegin == m_aOuterAddrSpec.m_pBegin && m_pRealNameEnd == m_aOuterAddrSpec.m_pEnd - && m_pFirstCommentBegin) + && m_pFirstCommentBegin)) if (!m_pFirstCommentBegin) aTheRealName = aTheAddrSpec; else if (m_bFirstCommentReparse) @@ -820,7 +820,7 @@ bool SvAddressParser::createRFC822Mailbox(String const & rPhrase, return false; if (*p == '"') break; - if (*p == '\x0D' || *p == '\\' && ++p == pEnd + if (*p == '\x0D' || (*p == '\\' && ++p == pEnd) || !INetMIME::isUSASCII(*p)) return false; if (INetMIME::needsQuotedStringEscape(*p)) @@ -868,7 +868,7 @@ bool SvAddressParser::createRFC822Mailbox(String const & rPhrase, return false; if (*p == ']') break; - if (*p == '\x0D' || *p == '[' || *p == '\\' && ++p == pEnd + if (*p == '\x0D' || *p == '[' || (*p == '\\' && ++p == pEnd) || !INetMIME::isUSASCII(*p)) return false; if (*p >= '[' && *p <= ']') diff --git a/svtools/source/misc/documentlockfile.cxx b/svl/source/misc/documentlockfile.cxx similarity index 98% rename from svtools/source/misc/documentlockfile.cxx rename to svl/source/misc/documentlockfile.cxx index 71b541cfe894..b0c4148749e7 100644 --- a/svtools/source/misc/documentlockfile.cxx +++ b/svl/source/misc/documentlockfile.cxx @@ -30,7 +30,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include @@ -56,9 +56,9 @@ #include -#include +#include -#include +#include using namespace ::com::sun::star; @@ -202,7 +202,7 @@ sal_Bool DocumentLockFile::OverwriteOwnLockFile() WriteEntryToStream( aNewEntry, xOutput ); xOutput->closeOutput(); } - catch( ucb::NameClashException& ) + catch( uno::Exception& ) { return sal_False; } diff --git a/svtools/source/misc1/filenotation.cxx b/svl/source/misc/filenotation.cxx similarity index 99% rename from svtools/source/misc1/filenotation.cxx rename to svl/source/misc/filenotation.cxx index f5e5ae934e3d..d50645c97439 100644 --- a/svtools/source/misc1/filenotation.cxx +++ b/svl/source/misc/filenotation.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "filenotation.hxx" #include #include diff --git a/svtools/source/misc1/folderrestriction.cxx b/svl/source/misc/folderrestriction.cxx similarity index 99% rename from svtools/source/misc1/folderrestriction.cxx rename to svl/source/misc/folderrestriction.cxx index 7f95bdaaa0bc..9ec7ead0a4be 100644 --- a/svtools/source/misc1/folderrestriction.cxx +++ b/svl/source/misc/folderrestriction.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "folderrestriction.hxx" #include "osl/process.h" diff --git a/svtools/source/misc1/fstathelper.cxx b/svl/source/misc/fstathelper.cxx similarity index 98% rename from svtools/source/misc1/fstathelper.cxx rename to svl/source/misc/fstathelper.cxx index 82480fc83473..43619e879a91 100644 --- a/svtools/source/misc1/fstathelper.cxx +++ b/svl/source/misc/fstathelper.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #include diff --git a/svtools/source/misc1/inethist.cxx b/svl/source/misc/inethist.cxx similarity index 99% rename from svtools/source/misc1/inethist.cxx rename to svl/source/misc/inethist.cxx index 5a1a3719d7ca..290312c0efd8 100644 --- a/svtools/source/misc1/inethist.cxx +++ b/svl/source/misc/inethist.cxx @@ -29,8 +29,8 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include +#include "precompiled_svl.hxx" +#include #ifndef INCLUDED_ALGORITHM #include diff --git a/svtools/source/misc1/inettype.cxx b/svl/source/misc/inettype.cxx similarity index 99% rename from svtools/source/misc1/inettype.cxx rename to svl/source/misc/inettype.cxx index ce62d7f3b2fc..47183be1d7b2 100644 --- a/svtools/source/misc1/inettype.cxx +++ b/svl/source/misc/inettype.cxx @@ -29,27 +29,27 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include -#include -#include +#include +#include #ifndef _SVTOOLS_HRC -#include +#include #endif #ifndef _SVSTDARR_STRINGSSORT_DECL #define _SVSTDARR_STRINGSSORT -#include +#include #undef _SVSTDARR_STRINGSSORT #endif -namespace unnamed_svtools_inettype {} -using namespace unnamed_svtools_inettype; +namespace unnamed_svl_inettype {} +using namespace unnamed_svl_inettype; // unnamed namespaces don't work well yet //============================================================================ -namespace unnamed_svtools_inettype { +namespace unnamed_svl_inettype { //============================================================================ struct MediaTypeEntry @@ -804,7 +804,7 @@ INetContentType Registration::GetContentType4Extension(UniString const & // //============================================================================ -namespace unnamed_svtools_inettype { +namespace unnamed_svl_inettype { MediaTypeEntry const * seekEntry(UniString const & rTypeName, MediaTypeEntry const * pMap, sal_Size nSize) diff --git a/svtools/source/misc1/lngmisc.cxx b/svl/source/misc/lngmisc.cxx similarity index 99% rename from svtools/source/misc1/lngmisc.cxx rename to svl/source/misc/lngmisc.cxx index e00540af1ab1..df7c28d22b1d 100644 --- a/svtools/source/misc1/lngmisc.cxx +++ b/svl/source/misc/lngmisc.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #include diff --git a/svtools/source/misc/lockfilecommon.cxx b/svl/source/misc/lockfilecommon.cxx similarity index 98% rename from svtools/source/misc/lockfilecommon.cxx rename to svl/source/misc/lockfilecommon.cxx index ef2cf89d8572..f13ed574a87f 100644 --- a/svtools/source/misc/lockfilecommon.cxx +++ b/svl/source/misc/lockfilecommon.cxx @@ -30,7 +30,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include @@ -57,9 +57,9 @@ #include -#include +#include -#include +#include using namespace ::com::sun::star; diff --git a/svtools/source/misc1/makefile.mk b/svl/source/misc/makefile.mk similarity index 88% rename from svtools/source/misc1/makefile.mk rename to svl/source/misc/makefile.mk index 0d1e67fd9021..adc659a7b60b 100644 --- a/svtools/source/misc1/makefile.mk +++ b/svl/source/misc/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -30,8 +30,8 @@ #************************************************************************* PRJ=..$/.. -PRJNAME=svtools -TARGET=misc1 +PRJNAME=svl +TARGET=misc # --- Settings ----------------------------------------------------- @@ -41,21 +41,24 @@ TARGET=misc1 # --- Files -------------------------------------------------------- EXCEPTIONSFILES=\ - $(SLO)$/fstathelper.obj \ + $(SLO)$/documentlockfile.obj \ $(SLO)$/folderrestriction.obj \ + $(SLO)$/fstathelper.obj \ + $(SLO)$/lockfilecommon.obj \ + $(SLO)$/ownlist.obj \ + $(SLO)$/restrictedpaths.obj \ + $(SLO)$/sharecontrolfile.obj \ $(SLO)$/strmadpt.obj \ - $(SLO)$/svtdata.obj + $(SLO)$/svldata.obj \ + $(SLO)$/urihelper.obj SLOFILES=\ $(EXCEPTIONSFILES) \ $(SLO)$/adrparse.obj \ - $(SLO)$/docpasswdrequest.obj \ $(SLO)$/filenotation.obj \ $(SLO)$/inethist.obj \ $(SLO)$/inettype.obj \ - $(SLO)$/iniadrtk.obj \ $(SLO)$/lngmisc.obj \ - $(SLO)$/loginerr.obj \ $(SLO)$/PasswordHelper.obj SRS1NAME=$(TARGET) diff --git a/svtools/source/misc1/mediatyp.src b/svl/source/misc/mediatyp.src similarity index 99% rename from svtools/source/misc1/mediatyp.src rename to svl/source/misc/mediatyp.src index c7acdf8efc45..63033af29d03 100644 --- a/svtools/source/misc1/mediatyp.src +++ b/svl/source/misc/mediatyp.src @@ -35,7 +35,7 @@ //============================================================================ #ifndef _SVTOOLS_HRC -#include +#include #endif String STR_SVT_MIMETYPE_APP_OCTSTREAM diff --git a/svtools/source/misc/ownlist.cxx b/svl/source/misc/ownlist.cxx similarity index 99% rename from svtools/source/misc/ownlist.cxx rename to svl/source/misc/ownlist.cxx index 346b4ff7251e..def341d57b7c 100644 --- a/svtools/source/misc/ownlist.cxx +++ b/svl/source/misc/ownlist.cxx @@ -29,12 +29,12 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #include -#include +#include using namespace com::sun::star; diff --git a/svtools/source/misc/restrictedpaths.cxx b/svl/source/misc/restrictedpaths.cxx similarity index 98% rename from svtools/source/misc/restrictedpaths.cxx rename to svl/source/misc/restrictedpaths.cxx index 354e32126680..9eda454604b1 100644 --- a/svtools/source/misc/restrictedpaths.cxx +++ b/svl/source/misc/restrictedpaths.cxx @@ -29,14 +29,14 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include +#include "precompiled_svl.hxx" +#include #include #include #include #include -#include +#include namespace svt { diff --git a/svtools/source/misc/sharecontrolfile.cxx b/svl/source/misc/sharecontrolfile.cxx similarity index 99% rename from svtools/source/misc/sharecontrolfile.cxx rename to svl/source/misc/sharecontrolfile.cxx index dbea89f54bcc..9249fa3f33de 100644 --- a/svtools/source/misc/sharecontrolfile.cxx +++ b/svl/source/misc/sharecontrolfile.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include @@ -57,9 +57,9 @@ #include #include -#include +#include -#include +#include using namespace ::com::sun::star; diff --git a/svtools/source/misc1/strmadpt.cxx b/svl/source/misc/strmadpt.cxx similarity index 99% rename from svtools/source/misc1/strmadpt.cxx rename to svl/source/misc/strmadpt.cxx index 4c4835609b7b..9803f2bcc32f 100644 --- a/svtools/source/misc1/strmadpt.cxx +++ b/svl/source/misc/strmadpt.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include // needed under Solaris when including ... diff --git a/svtools/source/misc1/svtdata.cxx b/svl/source/misc/svldata.cxx similarity index 71% rename from svtools/source/misc1/svtdata.cxx rename to svl/source/misc/svldata.cxx index 51247a628c0e..0ba8075069cd 100644 --- a/svtools/source/misc1/svtdata.cxx +++ b/svl/source/misc/svldata.cxx @@ -6,7 +6,7 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: svtdata.cxx,v $ + * $RCSfile: svldata.cxx,v $ * $Revision: 1.7 $ * * This file is part of OpenOffice.org. @@ -29,20 +29,20 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #include #include -#include +#include -namespace unnamed_svtools_svtdata {} -using namespace unnamed_svtools_svtdata; +namespace unnamed_svl_svldata {} +using namespace unnamed_svl_svldata; // unnamed namespaces don't work well yet //============================================================================ -namespace unnamed_svtools_svtdata { +namespace unnamed_svl_svldata { typedef std::map< rtl::OUString, SimpleResMgr * > SimpleResMgrMap; @@ -50,13 +50,14 @@ typedef std::map< rtl::OUString, SimpleResMgr * > SimpleResMgrMap; //============================================================================ // -// ImpSvtData +// ImpSvlData // //============================================================================ -ImpSvtData::~ImpSvtData() +static ImpSvlData* pSvlData = 0; + +ImpSvlData::~ImpSvlData() { - delete pResMgr; for (SimpleResMgrMap::iterator t = static_cast< SimpleResMgrMap * >(m_pThreadsafeRMs)->begin(); t != static_cast< SimpleResMgrMap * >(m_pThreadsafeRMs)->end(); ++t) @@ -65,17 +66,7 @@ ImpSvtData::~ImpSvtData() } //============================================================================ -ResMgr * ImpSvtData::GetResMgr(const ::com::sun::star::lang::Locale aLocale) -{ - if (!pResMgr) - { - pResMgr = ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(svt), aLocale ); - } - return pResMgr; -} - -//============================================================================ -SimpleResMgr* ImpSvtData::GetSimpleRM(const ::com::sun::star::lang::Locale& rLocale) +SimpleResMgr* ImpSvlData::GetSimpleRM(const ::com::sun::star::lang::Locale& rLocale) { if (!m_pThreadsafeRMs) m_pThreadsafeRMs = new SimpleResMgrMap; @@ -92,22 +83,12 @@ SimpleResMgr* ImpSvtData::GetSimpleRM(const ::com::sun::star::lang::Locale& rLoc return rResMgr; } -ResMgr * ImpSvtData::GetPatchResMgr(const ::com::sun::star::lang::Locale& aLocale) -{ - if (!pPatchResMgr) - { - pPatchResMgr = ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(svp), aLocale); - } - return pPatchResMgr; -} - //============================================================================ // static -ImpSvtData & ImpSvtData::GetSvtData() +ImpSvlData & ImpSvlData::GetSvlData() { - void ** pAppData = GetAppData(SHL_SVT); - if (!*pAppData) - *pAppData= new ImpSvtData; - return *static_cast(*pAppData); + if (!pSvlData) + pSvlData= new ImpSvlData; + return *pSvlData; } diff --git a/svtools/source/misc/urihelper.cxx b/svl/source/misc/urihelper.cxx similarity index 99% rename from svtools/source/misc/urihelper.cxx rename to svl/source/misc/urihelper.cxx index 1ddb4c6dd6f9..5473bf1c995d 100644 --- a/svtools/source/misc/urihelper.cxx +++ b/svl/source/misc/urihelper.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #include "com/sun/star/lang/WrappedTargetRuntimeException.hpp" @@ -67,8 +67,8 @@ #include #include "rtl/instance.hxx" -namespace unnamed_svtools_urihelper {} -using namespace unnamed_svtools_urihelper; +namespace unnamed_svl_urihelper {} +using namespace unnamed_svl_urihelper; // unnamed namespaces don't work well yet... namespace css = com::sun::star; @@ -80,7 +80,7 @@ using namespace com::sun::star; // //============================================================================ -namespace unnamed_svtools_urihelper { +namespace unnamed_svl_urihelper { inline UniString toUniString(ByteString const & rString) { @@ -425,7 +425,7 @@ rtl::OUString URIHelper::simpleNormalizedMakeRelative( // //============================================================================ -namespace unnamed_svtools_urihelper { +namespace unnamed_svl_urihelper { inline xub_StrLen nextChar(UniString const & rStr, xub_StrLen nPos) { diff --git a/svtools/source/notify/brdcst.cxx b/svl/source/notify/brdcst.cxx similarity index 97% rename from svtools/source/notify/brdcst.cxx rename to svl/source/notify/brdcst.cxx index 3a698c725c5c..08562fe9fece 100644 --- a/svtools/source/notify/brdcst.cxx +++ b/svl/source/notify/brdcst.cxx @@ -29,20 +29,20 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif #include -#include -#include -#include +#include +#include +#include SV_DECL_PTRARR( SfxListenerArr_Impl, SfxListener*, 0, 2 ) #define _SFX_BRDCST_CXX -#include +#include //==================================================================== DBG_NAME(SfxBroadcaster) diff --git a/svtools/source/notify/broadcast.cxx b/svl/source/notify/broadcast.cxx similarity index 98% rename from svtools/source/notify/broadcast.cxx rename to svl/source/notify/broadcast.cxx index e363f545c719..ede14e4171b2 100644 --- a/svtools/source/notify/broadcast.cxx +++ b/svl/source/notify/broadcast.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif @@ -38,7 +38,7 @@ #include "listener.hxx" #include "listeneriter.hxx" #include "broadcast.hxx" -#include +#include //==================================================================== diff --git a/svtools/source/notify/cancel.cxx b/svl/source/notify/cancel.cxx similarity index 97% rename from svtools/source/notify/cancel.cxx rename to svl/source/notify/cancel.cxx index 32a76a7df9c1..1df3abb22776 100644 --- a/svtools/source/notify/cancel.cxx +++ b/svl/source/notify/cancel.cxx @@ -29,15 +29,15 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #define _SFX_CANCEL_CXX -#include +#include #include #include -#include -#include +#include +#include #include namespace { struct lclMutex : public rtl::Static< ::vos::OMutex, lclMutex >{}; } diff --git a/svtools/source/notify/hint.cxx b/svl/source/notify/hint.cxx similarity index 96% rename from svtools/source/notify/hint.cxx rename to svl/source/notify/hint.cxx index 9ae3bf8f8b21..36bcfb9990d9 100644 --- a/svtools/source/notify/hint.cxx +++ b/svl/source/notify/hint.cxx @@ -29,11 +29,11 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif -#include +#include //==================================================================== diff --git a/svtools/source/notify/isethint.cxx b/svl/source/notify/isethint.cxx similarity index 95% rename from svtools/source/notify/isethint.cxx rename to svl/source/notify/isethint.cxx index 67d484219ac6..5138fb2a9ad9 100644 --- a/svtools/source/notify/isethint.cxx +++ b/svl/source/notify/isethint.cxx @@ -29,13 +29,13 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif -#include -#include +#include +#include //==================================================================== diff --git a/svtools/source/notify/listener.cxx b/svl/source/notify/listener.cxx similarity index 99% rename from svtools/source/notify/listener.cxx rename to svl/source/notify/listener.cxx index 0ce072b44dfb..7d9a223e1a73 100644 --- a/svtools/source/notify/listener.cxx +++ b/svl/source/notify/listener.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif diff --git a/svtools/source/notify/listenerbase.cxx b/svl/source/notify/listenerbase.cxx similarity index 98% rename from svtools/source/notify/listenerbase.cxx rename to svl/source/notify/listenerbase.cxx index 25f1f1da1901..bb1569c128c5 100644 --- a/svtools/source/notify/listenerbase.cxx +++ b/svl/source/notify/listenerbase.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif diff --git a/svtools/source/notify/listenerbase.hxx b/svl/source/notify/listenerbase.hxx similarity index 100% rename from svtools/source/notify/listenerbase.hxx rename to svl/source/notify/listenerbase.hxx diff --git a/svtools/source/notify/listeneriter.cxx b/svl/source/notify/listeneriter.cxx similarity index 99% rename from svtools/source/notify/listeneriter.cxx rename to svl/source/notify/listeneriter.cxx index 08fcb5b7e9ac..1f92eadfedbc 100644 --- a/svtools/source/notify/listeneriter.cxx +++ b/svl/source/notify/listeneriter.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif #include diff --git a/svtools/source/notify/lstner.cxx b/svl/source/notify/lstner.cxx similarity index 97% rename from svtools/source/notify/lstner.cxx rename to svl/source/notify/lstner.cxx index d7345d7ed3db..4be2020967b5 100644 --- a/svtools/source/notify/lstner.cxx +++ b/svl/source/notify/lstner.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif @@ -37,13 +37,13 @@ #include #endif -#include -#include +#include +#include SV_DECL_PTRARR( SfxBroadcasterArr_Impl, SfxBroadcaster*, 0, 2 ) #define _SFX_LSTNER_CXX -#include +#include //==================================================================== DBG_NAME(SfxListener) diff --git a/svtools/source/notify/makefile.mk b/svl/source/notify/makefile.mk similarity index 99% rename from svtools/source/notify/makefile.mk rename to svl/source/notify/makefile.mk index 8e4c4b211258..0d26860d02b5 100644 --- a/svtools/source/notify/makefile.mk +++ b/svl/source/notify/makefile.mk @@ -31,7 +31,7 @@ PRJ=..$/.. -PRJNAME=svtools +PRJNAME=svl TARGET=notify # --- Settings ----------------------------------------------------- diff --git a/svtools/source/notify/smplhint.cxx b/svl/source/notify/smplhint.cxx similarity index 95% rename from svtools/source/notify/smplhint.cxx rename to svl/source/notify/smplhint.cxx index 6fddffc23e56..454710a1b79f 100644 --- a/svtools/source/notify/smplhint.cxx +++ b/svl/source/notify/smplhint.cxx @@ -29,11 +29,11 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif -#include +#include //==================================================================== diff --git a/svtools/source/numbers/makefile.mk b/svl/source/numbers/makefile.mk similarity index 97% rename from svtools/source/numbers/makefile.mk rename to svl/source/numbers/makefile.mk index 46cd3985df1a..db4b30070ce8 100644 --- a/svtools/source/numbers/makefile.mk +++ b/svl/source/numbers/makefile.mk @@ -31,7 +31,7 @@ PRJ=..$/.. -PRJNAME=svtools +PRJNAME=svl TARGET=numbers LIBTARGET=NO @@ -41,7 +41,7 @@ PROJECTPCHSOURCE= # --- Settings ----------------------------------------------------- .INCLUDE : settings.mk -.INCLUDE : $(PRJ)$/util$/svt.pmk +.INCLUDE : $(PRJ)$/util$/svl.pmk # --- Files -------------------------------------------------------- diff --git a/svtools/source/numbers/nbdll.cxx b/svl/source/numbers/nbdll.cxx similarity index 98% rename from svtools/source/numbers/nbdll.cxx rename to svl/source/numbers/nbdll.cxx index d7cf20f6059f..2bc5121e18fd 100644 --- a/svtools/source/numbers/nbdll.cxx +++ b/svl/source/numbers/nbdll.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifdef WIN #include diff --git a/svtools/source/numbers/numfmuno.cxx b/svl/source/numbers/numfmuno.cxx similarity index 99% rename from svtools/source/numbers/numfmuno.cxx rename to svl/source/numbers/numfmuno.cxx index 7417367ec124..23f627834955 100644 --- a/svtools/source/numbers/numfmuno.cxx +++ b/svl/source/numbers/numfmuno.cxx @@ -29,11 +29,10 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif -#include #include #include #include @@ -45,9 +44,9 @@ #include "numfmuno.hxx" #include "numuno.hxx" -#include -#include -#include +#include +#include +#include using namespace com::sun::star; @@ -774,7 +773,7 @@ uno::Any SAL_CALL SvNumberFormatObj::getPropertyValue( const rtl::OUString& aPro else if (aString.EqualsAscii( PROPERTYNAME_LOCALE )) { lang::Locale aLocale( MsLangId::convertLanguageToLocale( - pFormat->GetLanguage())); + pFormat->GetLanguage())); aRet <<= aLocale; } else if (aString.EqualsAscii( PROPERTYNAME_TYPE )) diff --git a/svtools/source/numbers/numfmuno.hxx b/svl/source/numbers/numfmuno.hxx similarity index 100% rename from svtools/source/numbers/numfmuno.hxx rename to svl/source/numbers/numfmuno.hxx diff --git a/svtools/source/numbers/numhead.cxx b/svl/source/numbers/numhead.cxx similarity index 99% rename from svtools/source/numbers/numhead.cxx rename to svl/source/numbers/numhead.cxx index 7e79aad624f3..99ff33433de3 100644 --- a/svtools/source/numbers/numhead.cxx +++ b/svl/source/numbers/numhead.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif #include diff --git a/svtools/source/numbers/numhead.hxx b/svl/source/numbers/numhead.hxx similarity index 100% rename from svtools/source/numbers/numhead.hxx rename to svl/source/numbers/numhead.hxx diff --git a/svtools/source/numbers/numuno.cxx b/svl/source/numbers/numuno.cxx similarity index 98% rename from svtools/source/numbers/numuno.cxx rename to svl/source/numbers/numuno.cxx index f91bf82b4e60..3cc90998e2dc 100644 --- a/svtools/source/numbers/numuno.cxx +++ b/svl/source/numbers/numuno.cxx @@ -29,13 +29,12 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif #define _ZFORLIST_DECLARE_TABLE -#include #include #include #include @@ -44,7 +43,7 @@ #include "numuno.hxx" #include "numfmuno.hxx" -#include +#include using namespace com::sun::star; diff --git a/svtools/source/numbers/supservs.cxx b/svl/source/numbers/supservs.cxx similarity index 99% rename from svtools/source/numbers/supservs.cxx rename to svl/source/numbers/supservs.cxx index 1035cd056406..7e4d8560dae7 100644 --- a/svtools/source/numbers/supservs.cxx +++ b/svl/source/numbers/supservs.cxx @@ -29,14 +29,13 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "supservs.hxx" #include #include #include #include #include -#include #include #include #include "instrm.hxx" diff --git a/svtools/source/numbers/supservs.hxx b/svl/source/numbers/supservs.hxx similarity index 99% rename from svtools/source/numbers/supservs.hxx rename to svl/source/numbers/supservs.hxx index df48d6567ecc..7dbbfe27177d 100644 --- a/svtools/source/numbers/supservs.hxx +++ b/svl/source/numbers/supservs.hxx @@ -32,7 +32,7 @@ #define _SVTOOLS_NUMBERS_SUPPLIERSERVICE_HXX_ #include "numuno.hxx" -#include +#include #include #include #include diff --git a/svtools/source/numbers/zforfind.cxx b/svl/source/numbers/zforfind.cxx similarity index 99% rename from svtools/source/numbers/zforfind.cxx rename to svl/source/numbers/zforfind.cxx index 7aac440e8b58..372ae2b15abf 100644 --- a/svtools/source/numbers/zforfind.cxx +++ b/svl/source/numbers/zforfind.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include @@ -44,16 +44,16 @@ #include #include -#include // NUMBERFORMAT_XXX +#include // NUMBERFORMAT_XXX #include "zforscan.hxx" -#include +#include #define _ZFORFIND_CXX #include "zforfind.hxx" #undef _ZFORFIND_CXX -#ifdef PRODUCT +#ifndef DBG_UTIL #define NF_TEST_CALENDAR 0 #else #define NF_TEST_CALENDAR 0 diff --git a/svtools/inc/zforfind.hxx b/svl/source/numbers/zforfind.hxx similarity index 100% rename from svtools/inc/zforfind.hxx rename to svl/source/numbers/zforfind.hxx diff --git a/svtools/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx similarity index 98% rename from svtools/source/numbers/zforlist.cxx rename to svl/source/numbers/zforlist.cxx index b76bf3226b50..f03ef3f31140 100644 --- a/svtools/source/numbers/zforlist.cxx +++ b/svl/source/numbers/zforlist.cxx @@ -29,17 +29,12 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif // #include #include -#ifndef _SOUND_HXX //autogen -#include -#endif -#include -#include #include #include #include @@ -48,23 +43,22 @@ #include #include #include +#include #define _SVSTDARR_USHORTS -#include +#include #define _ZFORLIST_CXX #include -#include +#include #undef _ZFORLIST_CXX #include "zforscan.hxx" #include "zforfind.hxx" -#include +#include #include "numhead.hxx" -#include -#include "listener.hxx" -#include +#include #include #include #include @@ -107,7 +101,7 @@ static sal_uInt32 __FAR_DATA theIndexTable[NF_INDEX_TABLE_ENTRIES]; also handles one instance of the SysLocale options */ -class SvNumberFormatterRegistry_Impl : public SvtListener +class SvNumberFormatterRegistry_Impl : public utl::ConfigurationListener { List aFormatters; SvtSysLocaleOptions aSysLocaleOptions; @@ -124,30 +118,26 @@ public: sal_uInt32 Count() { return aFormatters.Count(); } - virtual void Notify( SvtBroadcaster& rBC, const SfxHint& rHint ); - + virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ); }; SvNumberFormatterRegistry_Impl::SvNumberFormatterRegistry_Impl() { eSysLanguage = MsLangId::getRealLanguage( LANGUAGE_SYSTEM ); - aSysLocaleOptions.AddListener( *this ); + aSysLocaleOptions.AddListener( this ); } SvNumberFormatterRegistry_Impl::~SvNumberFormatterRegistry_Impl() { - aSysLocaleOptions.RemoveListener( *this ); + aSysLocaleOptions.RemoveListener( this ); } -void SvNumberFormatterRegistry_Impl::Notify( SvtBroadcaster&, const SfxHint& rHint ) +void SvNumberFormatterRegistry_Impl::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 nHint ) { - const SfxSimpleHint* pHint = PTR_CAST( SfxSimpleHint, &rHint ); - if( pHint ) - { - if ( pHint->GetId() & SYSLOCALEOPTIONS_HINT_LOCALE ) + if ( nHint & SYSLOCALEOPTIONS_HINT_LOCALE ) { ::osl::MutexGuard aGuard( SvNumberFormatter::GetMutex() ); for ( SvNumberFormatter* p = (SvNumberFormatter*)aFormatters.First(); @@ -157,7 +147,7 @@ void SvNumberFormatterRegistry_Impl::Notify( SvtBroadcaster&, const SfxHint& rHi } eSysLanguage = MsLangId::getRealLanguage( LANGUAGE_SYSTEM ); } - if ( pHint->GetId() & SYSLOCALEOPTIONS_HINT_CURRENCY ) + if ( nHint & SYSLOCALEOPTIONS_HINT_CURRENCY ) { ::osl::MutexGuard aGuard( SvNumberFormatter::GetMutex() ); for ( SvNumberFormatter* p = (SvNumberFormatter*)aFormatters.First(); @@ -166,7 +156,6 @@ void SvNumberFormatterRegistry_Impl::Notify( SvtBroadcaster&, const SfxHint& rHi p->ResetDefaultSystemCurrency(); } } - } } @@ -237,7 +226,7 @@ SvNumberFormatter::~SvNumberFormatter() void SvNumberFormatter::ImpConstruct( LanguageType eLang ) { - RTL_LOGFILE_CONTEXT_AUTHOR( aTimeLog, "svtools", "er93726", "SvNumberFormatter::ImpConstruct" ); + RTL_LOGFILE_CONTEXT_AUTHOR( aTimeLog, "svl", "er93726", "SvNumberFormatter::ImpConstruct" ); if ( eLang == LANGUAGE_DONTKNOW ) eLang = UNKNOWN_SUBSTITUTE; @@ -307,7 +296,7 @@ void SvNumberFormatter::ChangeIntl(LanguageType eLnge) if( !pMutex ) { // #i77768# Due to a static reference in the toolkit lib - // we need a mutex that lives longer than the svtools library. + // we need a mutex that lives longer than the svl library. // Otherwise the dtor would use a destructed mutex!! pMutex = new ::osl::Mutex; } @@ -535,7 +524,6 @@ BOOL SvNumberFormatter::PutEntry(String& rString, sal_uInt32 nPos = CLOffset + pStdFormat->GetLastInsertKey(); if (nPos - CLOffset >= SV_COUNTRY_LANGUAGE_OFFSET) { - Sound::Beep(); DBG_ERROR("SvNumberFormatter:: Zu viele Formate pro CL"); delete p_Entry; } @@ -601,15 +589,14 @@ sal_uInt32 SvNumberFormatter::GetIndexPuttingAndConverting( String & rString, // #62389# empty format string (of Writer) => General standard format if (!rString.Len()) ; // nothing - else if (eLnge == LANGUAGE_SYSTEM && eSysLnge != - Application::GetSettings().GetLanguage()) + else if (eLnge == LANGUAGE_SYSTEM && eSysLnge != SvtSysLocale().GetLanguage()) { sal_uInt32 nOrig = GetEntryKey( rString, eSysLnge ); if (nOrig == NUMBERFORMAT_ENTRY_NOT_FOUND) nKey = nOrig; // none avaliable, maybe user-defined else - nKey = GetFormatForLanguageIfBuiltIn( nOrig, - Application::GetSettings().GetLanguage()); + nKey = GetFormatForLanguageIfBuiltIn( nOrig, SvtSysLocale().GetLanguage() ); + if (nKey == nOrig) { // Not a builtin format, convert. @@ -617,7 +604,7 @@ sal_uInt32 SvNumberFormatter::GetIndexPuttingAndConverting( String & rString, // language and wouldn't match eSysLnge anymore, do that on a copy. String aTmp( rString); rNewInserted = PutandConvertEntrySystem( aTmp, rCheckPos, rType, - nKey, eLnge, Application::GetSettings().GetLanguage()); + nKey, eLnge, SvtSysLocale().GetLanguage()); if (rCheckPos > 0) { DBG_ERRORFILE("SvNumberFormatter::GetIndexPuttingAndConverting: bad format code string for current locale"); @@ -685,7 +672,7 @@ void SvNumberFormatter::SetFormatUsed(sal_uInt32 nFIndex) BOOL SvNumberFormatter::Load( SvStream& rStream ) { - LanguageType eSysLang = Application::GetSettings().GetLanguage(); + LanguageType eSysLang = SvtSysLocale().GetLanguage(); SvNumberFormatter* pConverter = NULL; ImpSvNumMultipleReadHeader aHdr( rStream ); @@ -894,7 +881,7 @@ BOOL SvNumberFormatter::Save( SvStream& rStream ) const ImpSvNumMultipleWriteHeader aHdr( rStream ); // ab 364i wird gespeichert was SYSTEM wirklich war, vorher hart LANGUAGE_SYSTEM rStream << (USHORT) SV_NUMBERFORMATTER_VERSION; - rStream << (USHORT) Application::GetSettings().GetLanguage() << (USHORT) IniLnge; + rStream << (USHORT) SvtSysLocale().GetLanguage() << (USHORT) IniLnge; SvNumberFormatTable* pTable = (SvNumberFormatTable*) &aFTable; SvNumberformat* pEntry = (SvNumberformat*) pTable->First(); while (pEntry) @@ -2900,7 +2887,6 @@ SvNumberFormatterIndexTable* SvNumberFormatter::MergeFormatter(SvNumberFormatter nNewKey = nPos+1; if (nPos - nCLOffset >= SV_COUNTRY_LANGUAGE_OFFSET) { - Sound::Beep(); DBG_ERROR( "SvNumberFormatter:: Zu viele Formate pro CL"); delete pNewEntry; @@ -3005,7 +2991,7 @@ USHORT SvNumberFormatter::ExpandTwoDigitYear( USHORT nYear ) const // static USHORT SvNumberFormatter::GetYear2000Default() { - return Application::GetSettings().GetMiscSettings().GetTwoDigitYearStart(); + return (USHORT) ::utl::MiscCfg().GetYear2000(); } @@ -3106,7 +3092,7 @@ void SvNumberFormatter::SetDefaultSystemCurrency( const String& rAbbrev, Languag { ::osl::MutexGuard aGuard( GetMutex() ); if ( eLang == LANGUAGE_SYSTEM ) - eLang = Application::GetSettings().GetLanguage(); + eLang = SvtSysLocale().GetLanguage(); const NfCurrencyTable& rTable = GetTheCurrencyTable(); USHORT nCount = rTable.Count(); const NfCurrencyEntryPtr* ppData = rTable.GetData(); @@ -3227,7 +3213,7 @@ sal_uInt32 SvNumberFormatter::ImpGetDefaultCurrencyFormat() // static // try to make it inline if possible since this a loop body // TRUE: continue; FALSE: break loop, if pFoundEntry==NULL dupe found -#ifdef PRODUCT +#ifndef DBG_UTIL inline #endif BOOL SvNumberFormatter::ImpLookupCurrencyEntryLoopBody( @@ -3547,9 +3533,9 @@ void SvNumberFormatter::ImpInitCurrencyTable() return ; bInitializing = TRUE; - RTL_LOGFILE_CONTEXT_AUTHOR( aTimeLog, "svtools", "er93726", "SvNumberFormatter::ImpInitCurrencyTable" ); + RTL_LOGFILE_CONTEXT_AUTHOR( aTimeLog, "svl", "er93726", "SvNumberFormatter::ImpInitCurrencyTable" ); - LanguageType eSysLang = Application::GetSettings().GetLanguage(); + LanguageType eSysLang = SvtSysLocale().GetLanguage(); LocaleDataWrapper* pLocaleData = new LocaleDataWrapper( ::comphelper::getProcessServiceFactory(), MsLangId::convertLanguageToLocale( eSysLang ) ); diff --git a/svtools/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx similarity index 99% rename from svtools/source/numbers/zformat.cxx rename to svl/source/numbers/zformat.cxx index 0afbf3b4a3f5..52d37b9cd26f 100644 --- a/svtools/source/numbers/zformat.cxx +++ b/svl/source/numbers/zformat.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include #include @@ -49,11 +49,11 @@ #include #define _ZFORMAT_CXX -#include +#include #include "zforscan.hxx" #include "zforfind.hxx" -#include +#include #include "numhead.hxx" #include #include "nfsymbol.hxx" diff --git a/svtools/source/numbers/zforscan.cxx b/svl/source/numbers/zforscan.cxx similarity index 99% rename from svtools/source/numbers/zforscan.cxx rename to svl/source/numbers/zforscan.cxx index d6ce04c4da2a..5c0d45a53ed2 100644 --- a/svtools/source/numbers/zforscan.cxx +++ b/svl/source/numbers/zforscan.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifndef GCC #endif @@ -41,8 +41,8 @@ #include #include -#include -#include +#include +#include #include #define _ZFORSCAN_CXX @@ -491,6 +491,8 @@ Color* ImpSvNumberformatScan::GetColor(String& sStr) if ( j < NF_MAX_DEFAULT_COLORS ) i = j; } + + Color* pResult = NULL; if (i >= NF_MAX_DEFAULT_COLORS) { const String& rColorWord = pKeyword[NF_KEY_COLOR]; @@ -516,15 +518,9 @@ Color* ImpSvNumberformatScan::GetColor(String& sStr) { long nIndex = sString.ToInt32(); if (nIndex > 0 && nIndex <= 64) - return pFormatter->GetUserDefColor((USHORT)nIndex-1); - else - return NULL; + pResult = pFormatter->GetUserDefColor((USHORT)nIndex-1); } - else - return NULL; } - else - return NULL; } else { @@ -538,8 +534,9 @@ Color* ImpSvNumberformatScan::GetColor(String& sStr) else sStr = pKeyword[NF_KEY_FIRSTCOLOR+i]; - return &(StandardColor[i]); + pResult = &(StandardColor[i]); } + return pResult; } diff --git a/svtools/source/numbers/zforscan.hxx b/svl/source/numbers/zforscan.hxx similarity index 99% rename from svtools/source/numbers/zforscan.hxx rename to svl/source/numbers/zforscan.hxx index bc19ac5b633f..300715dfeaa5 100644 --- a/svtools/source/numbers/zforscan.hxx +++ b/svl/source/numbers/zforscan.hxx @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include "nfsymbol.hxx" class SvNumberFormatter; diff --git a/svtools/source/passwordcontainer/exports.map b/svl/source/passwordcontainer/exports.map similarity index 100% rename from svtools/source/passwordcontainer/exports.map rename to svl/source/passwordcontainer/exports.map diff --git a/svtools/source/passwordcontainer/makefile.mk b/svl/source/passwordcontainer/makefile.mk similarity index 95% rename from svtools/source/passwordcontainer/makefile.mk rename to svl/source/passwordcontainer/makefile.mk index 70692ecbf06b..3c74246ee3ed 100644 --- a/svtools/source/passwordcontainer/makefile.mk +++ b/svl/source/passwordcontainer/makefile.mk @@ -30,7 +30,7 @@ #************************************************************************* PRJ=..$/.. -PRJNAME=svtools +PRJNAME=svl TARGET=passwordcontainer.uno LIBTARGET=NO ENABLE_EXCEPTIONS=TRUE @@ -43,7 +43,8 @@ DLLPRE= # --- Files ------------------------------------- SLOFILES= \ - $(SLO)$/passwordcontainer.obj + $(SLO)$/passwordcontainer.obj\ + $(SLO)$/syscreds.obj SHL1TARGET= $(TARGET) SHL1IMPLIB= i$(TARGET) diff --git a/svtools/source/passwordcontainer/passwordcontainer.cxx b/svl/source/passwordcontainer/passwordcontainer.cxx similarity index 94% rename from svtools/source/passwordcontainer/passwordcontainer.cxx rename to svl/source/passwordcontainer/passwordcontainer.cxx index 9855e7e3c487..4d629958e5bf 100644 --- a/svtools/source/passwordcontainer/passwordcontainer.cxx +++ b/svl/source/passwordcontainer/passwordcontainer.cxx @@ -29,11 +29,11 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "passwordcontainer.hxx" -#include +#include #include "cppuhelper/factory.hxx" #include #include @@ -753,37 +753,14 @@ void PasswordContainer::PrivateAdd( const ::rtl::OUString& Url, const ::rtl::OUS UrlRecord SAL_CALL PasswordContainer::find( const ::rtl::OUString& aURL, const Reference< XInteractionHandler >& aHandler ) throw(RuntimeException) { - ::osl::MutexGuard aGuard( mMutex ); + return find( aURL, rtl::OUString(), false, aHandler ); +} - if( !m_aContainer.empty() ) - { - ::rtl::OUString aUrl( aURL ); - PassMap::iterator aIter = m_aContainer.find( aUrl ); +//------------------------------------------------------------------------- - if( aIter != m_aContainer.end() ) - return UrlRecord( aIter->first, CopyToUserRecordSequence( aIter->second, aHandler ) ); - - // each iteration remove last '/...' section from the aUrl - // while it's possible, up to the most left '://' - while( shorterUrl( aUrl ) ) - { - // first look for /somename and then look for /somename/... - aIter = m_aContainer.find( aUrl ); - if( aIter != m_aContainer.end() ) - return UrlRecord( aIter->first, CopyToUserRecordSequence( aIter->second, aHandler ) ); - else - { - ::rtl::OUString tmpUrl( aUrl ); - tmpUrl += ::rtl::OUString::createFromAscii( "/" ); - - aIter = m_aContainer.lower_bound( aUrl ); - if( aIter != m_aContainer.end() ) - return UrlRecord( aIter->first, CopyToUserRecordSequence( aIter->second, aHandler ) ); - } - } - } - - return UrlRecord(); +UrlRecord SAL_CALL PasswordContainer::findForName( const ::rtl::OUString& aURL, const ::rtl::OUString& aName, const Reference< XInteractionHandler >& aHandler ) throw(RuntimeException) +{ + return find( aURL, aName, true, aHandler ); } //------------------------------------------------------------------------- @@ -810,48 +787,76 @@ Sequence< UserRecord > PasswordContainer::FindUsr( const list< NamePassRecord >& //------------------------------------------------------------------------- -UrlRecord SAL_CALL PasswordContainer::findForName( const ::rtl::OUString& aURL, const ::rtl::OUString& aName, const Reference< XInteractionHandler >& aHandler ) throw(RuntimeException) +bool PasswordContainer::createUrlRecord( + const PassMap::iterator & rIter, + bool bName, + const ::rtl::OUString & aName, + const Reference< XInteractionHandler >& aHandler, + UrlRecord & rRec ) + throw( RuntimeException ) { + if ( bName ) + { + Sequence< UserRecord > aUsrRec + = FindUsr( rIter->second, aName, aHandler ); + if( aUsrRec.getLength() ) + { + rRec = UrlRecord( rIter->first, aUsrRec ); + return true; + } + } + else + { + rRec = UrlRecord( + rIter->first, + CopyToUserRecordSequence( rIter->second, aHandler ) ); + return true; + } + return false; +} +//------------------------------------------------------------------------- + +UrlRecord PasswordContainer::find( + const ::rtl::OUString& aURL, + const ::rtl::OUString& aName, + bool bName, // only needed to support empty user names + const Reference< XInteractionHandler >& aHandler ) throw(RuntimeException) +{ ::osl::MutexGuard aGuard( mMutex ); - if( !m_aContainer.empty() ) + + if( !m_aContainer.empty() && aURL.getLength() ) { ::rtl::OUString aUrl( aURL ); - PassMap::iterator aIter = m_aContainer.find( aUrl ); - - if( aIter != m_aContainer.end() ) - { - Sequence< UserRecord > aUsrRec = FindUsr( aIter->second, aName, aHandler ); - if( aUsrRec.getLength() ) - return UrlRecord( aIter->first, aUsrRec ); - } // each iteration remove last '/...' section from the aUrl // while it's possible, up to the most left '://' - while( shorterUrl( aUrl ) ) + do { // first look for /somename and then look for /somename/... - aIter = m_aContainer.find( aUrl ); + PassMap::iterator aIter = m_aContainer.find( aUrl ); if( aIter != m_aContainer.end() ) { - Sequence< UserRecord > aUsrRec = FindUsr( aIter->second, aName, aHandler ); - if( aUsrRec.getLength() ) - return UrlRecord( aIter->first, aUsrRec ); + UrlRecord aRec; + if ( createUrlRecord( aIter, bName, aName, aHandler, aRec ) ) + return aRec; } else { ::rtl::OUString tmpUrl( aUrl ); - tmpUrl += ::rtl::OUString::createFromAscii( "/" ); + if ( tmpUrl.getStr()[tmpUrl.getLength() - 1] != (sal_Unicode)'/' ) + tmpUrl += ::rtl::OUString::createFromAscii( "/" ); - aIter = m_aContainer.lower_bound( aUrl ); - if( aIter != m_aContainer.end() ) + aIter = m_aContainer.lower_bound( tmpUrl ); + if( aIter != m_aContainer.end() && aIter->first.match( tmpUrl ) ) { - Sequence< UserRecord > aUsrRec = FindUsr( aIter->second, aName, aHandler ); - if( aUsrRec.getLength() ) - return UrlRecord( aIter->first, aUsrRec ); + UrlRecord aRec; + if ( createUrlRecord( aIter, bName, aName, aHandler, aRec ) ) + return aRec; } } } + while( shorterUrl( aUrl ) && aUrl.getLength() ); } return UrlRecord(); @@ -1355,6 +1360,35 @@ void SAL_CALL PasswordContainer::removeMasterPassword() return ( m_pStorageFile->useStorage() && m_pStorageFile->getEncodedMP( aEncodedMP ) && !aEncodedMP.getLength() ); } + +//------------------------------------------------------------------------- +void SAL_CALL PasswordContainer::addUrl( const ::rtl::OUString& Url, ::sal_Bool MakePersistent ) + throw (uno::RuntimeException) +{ + mUrlContainer.add( Url, MakePersistent ); +} + +//------------------------------------------------------------------------- +::rtl::OUString SAL_CALL PasswordContainer::findUrl( const ::rtl::OUString& Url ) + throw (uno::RuntimeException) +{ + return mUrlContainer.find( Url ); +} + +//------------------------------------------------------------------------- +void SAL_CALL PasswordContainer::removeUrl( const ::rtl::OUString& Url ) + throw (uno::RuntimeException) +{ + mUrlContainer.remove( Url ); +} + +//------------------------------------------------------------------------- +uno::Sequence< ::rtl::OUString > SAL_CALL PasswordContainer::getUrls( ::sal_Bool OnlyPersistent ) + throw (uno::RuntimeException) +{ + return mUrlContainer.list( OnlyPersistent ); +} + //------------------------------------------------------------------------- void PasswordContainer::Notify() @@ -1439,7 +1473,7 @@ Sequence< ::rtl::OUString > SAL_CALL PasswordContainer::impl_getStaticSupportedS ::rtl::OUString SAL_CALL PasswordContainer::impl_getStaticImplementationName() throw(uno::RuntimeException) { - return ::rtl::OUString::createFromAscii("stardiv.svtools.PasswordContainer"); + return ::rtl::OUString::createFromAscii("stardiv.svl.PasswordContainer"); } //------------------------------------------------------------------------- @@ -1487,7 +1521,9 @@ MasterPasswordRequest_Impl::MasterPasswordRequest_Impl( PasswordRequestMode Mode aRememberModes, // rRememberPasswordModes RememberAuthentication_NO, // eDefaultRememberPasswordMode aRememberModes, // rRememberAccountModes - RememberAuthentication_NO // eDefaultRememberAccountMode + RememberAuthentication_NO, // eDefaultRememberAccountMode + sal_False, // bCanUseSystemCredentials + sal_False // bDefaultUseSystemCredentials ); Sequence< @@ -1520,7 +1556,7 @@ SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo ( Reference< XRegistryKey > xNewKey; xNewKey = xRegistryKey->createKey( - ::rtl::OUString::createFromAscii( "/stardiv.svtools.PasswordContainer/UNO/SERVICES" )); + ::rtl::OUString::createFromAscii( "/stardiv.svl.PasswordContainer/UNO/SERVICES" )); xNewKey->createKey( ::rtl::OUString::createFromAscii("com.sun.star.task.PasswordContainer")); return sal_True; diff --git a/svl/source/passwordcontainer/syscreds.cxx b/svl/source/passwordcontainer/syscreds.cxx new file mode 100644 index 000000000000..faf086e369bd --- /dev/null +++ b/svl/source/passwordcontainer/syscreds.cxx @@ -0,0 +1,303 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "syscreds.hxx" +#include "com/sun/star/beans/PropertyValue.hpp" + +using namespace com::sun::star; + +SysCredentialsConfigItem::SysCredentialsConfigItem( + SysCredentialsConfig * pOwner ) +: utl::ConfigItem( rtl::OUString::createFromAscii( "Office.Common/Passwords" ), + CONFIG_MODE_IMMEDIATE_UPDATE ), + m_bInited( false ), + m_pOwner( pOwner ) +{ + uno::Sequence< ::rtl::OUString > aNode( 1 ); + aNode[ 0 ] = rtl::OUString::createFromAscii( + "Office.Common/Passwords/AuthenticateUsingSystemCredentials" ); + EnableNotification( aNode ); +} + +//virtual +void SysCredentialsConfigItem::Notify( + const uno::Sequence< rtl::OUString > & /*seqPropertyNames*/ ) +{ + { + ::osl::MutexGuard aGuard( m_aMutex ); + m_bInited = false; + // rebuild m_seqURLs + getSystemCredentialsURLs(); + } + m_pOwner->persistentConfigChanged(); +} + +void SysCredentialsConfigItem::Commit() +{ + // does nothing +} + +uno::Sequence< rtl::OUString > +SysCredentialsConfigItem::getSystemCredentialsURLs() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + if ( !m_bInited ) + { + // read config item + uno::Sequence< ::rtl::OUString > aPropNames( 1 ); + aPropNames[ 0 ] = rtl::OUString::createFromAscii( + "AuthenticateUsingSystemCredentials" ); + uno::Sequence< uno::Any > aAnyValues( + utl::ConfigItem::GetProperties( aPropNames ) ); + + OSL_ENSURE( + aAnyValues.getLength() == 1, + "SysCredentialsConfigItem::getSystemCredentialsURLs: " + "Error reading config item!" ); + + uno::Sequence< rtl::OUString > aValues; + if ( ( aAnyValues[ 0 ] >>= aValues ) || + ( !aAnyValues[ 0 ].hasValue() ) ) + { + m_seqURLs = aValues; + m_bInited = true; + } + } + return m_seqURLs; +} + +void SysCredentialsConfigItem::setSystemCredentialsURLs( + const uno::Sequence< rtl::OUString > & seqURLList ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + // write config item. + uno::Sequence< rtl::OUString > aPropNames( 1 ); + uno::Sequence< uno::Any > aPropValues( 1 ); + aPropNames[ 0 ] + = ::rtl::OUString::createFromAscii( + "AuthenticateUsingSystemCredentials" ); + aPropValues[ 0 ] <<= seqURLList; + + utl::ConfigItem::SetModified(); + utl::ConfigItem::PutProperties( aPropNames, aPropValues ); + + m_seqURLs = seqURLList; + m_bInited = true; +} + +//============================================================================ + +namespace +{ + // TODO: This code is actually copied from svl/source/passwordcontainer.cxx + bool removeLastSegment( ::rtl::OUString & aURL ) + { + sal_Int32 aInd = aURL.lastIndexOf( sal_Unicode( '/' ) ); + + if( aInd > 0 ) + { + sal_Int32 aPrevInd = aURL.lastIndexOf( sal_Unicode( '/' ), aInd ); + if ( aURL.indexOf( ::rtl::OUString::createFromAscii( "://" ) ) + != aPrevInd - 2 || + aInd != aURL.getLength() - 1 ) + { + aURL = aURL.copy( 0, aInd ); + return true; + } + } + + return false; + } + + bool findURL( StringSet const & rContainer, rtl::OUString const & aURL, rtl::OUString & aResult ) + { + // TODO: This code is actually copied from svl/source/passwordcontainer.cxx + if( !rContainer.empty() && aURL.getLength() ) + { + ::rtl::OUString aUrl( aURL ); + + // each iteration remove last '/...' section from the aUrl + // while it's possible, up to the most left '://' + do + { + // first look for /somename and then look for /somename/... + StringSet::const_iterator aIter = rContainer.find( aUrl ); + if( aIter != rContainer.end() ) + { + aResult = *aIter; + return true; + } + else + { + ::rtl::OUString tmpUrl( aUrl ); + if ( tmpUrl.getStr()[tmpUrl.getLength() - 1] != (sal_Unicode)'/' ) + tmpUrl += ::rtl::OUString::createFromAscii( "/" ); + + aIter = rContainer.lower_bound( tmpUrl ); + if( aIter != rContainer.end() && aIter->match( tmpUrl ) ) + { + aResult = *aIter; + return true; + } + } + } + while( removeLastSegment( aUrl ) && aUrl.getLength() ); + } + aResult = rtl::OUString(); + return false; + } + +} // namespace + +SysCredentialsConfig::SysCredentialsConfig() +: m_aConfigItem( this ), + m_bCfgInited( false ) +{ +} + +void SysCredentialsConfig::initCfg() +{ + osl::MutexGuard aGuard( m_aMutex ); + if ( !m_bCfgInited ) + { + uno::Sequence< rtl::OUString > aURLs( + m_aConfigItem.getSystemCredentialsURLs() ); + for ( sal_Int32 n = 0; n < aURLs.getLength(); ++n ) + m_aCfgContainer.insert( aURLs[ n ] ); + + m_bCfgInited = true; + } +} + +void SysCredentialsConfig::writeCfg() +{ + osl::MutexGuard aGuard( m_aMutex ); + + OSL_ENSURE( m_bCfgInited, "SysCredentialsConfig::writeCfg : not initialized!" ); + + uno::Sequence< rtl::OUString > aURLs( m_aCfgContainer.size() ); + StringSet::const_iterator it = m_aCfgContainer.begin(); + const StringSet::const_iterator end = m_aCfgContainer.end(); + sal_Int32 n = 0; + + while ( it != end ) + { + aURLs[ n ] = *it; + ++it; + ++n; + } + + m_aConfigItem.setSystemCredentialsURLs( aURLs ); +} + +rtl::OUString SysCredentialsConfig::find( rtl::OUString const & aURL ) +{ + osl::MutexGuard aGuard( m_aMutex ); + rtl::OUString aResult; + if ( findURL( m_aMemContainer, aURL, aResult ) ) + return aResult; + + initCfg(); + if ( findURL( m_aCfgContainer, aURL, aResult ) ) + return aResult; + + return rtl::OUString(); +} + +void SysCredentialsConfig::add( rtl::OUString const & rURL, bool bPersistent ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + if ( bPersistent ) + { + m_aMemContainer.erase( rURL ); + + initCfg(); + m_aCfgContainer.insert( rURL ); + writeCfg(); + } + else + { + initCfg(); + if ( m_aCfgContainer.erase( rURL ) > 0 ) + writeCfg(); + + m_aMemContainer.insert( rURL ); + } +} + +void SysCredentialsConfig::remove( rtl::OUString const & rURL ) +{ + m_aMemContainer.erase( rURL ); + + initCfg(); + if ( m_aCfgContainer.erase( rURL ) > 0 ) + writeCfg(); +} + +uno::Sequence< rtl::OUString > SysCredentialsConfig::list( bool bOnlyPersistent ) +{ + initCfg(); + sal_Int32 nCount = m_aCfgContainer.size() + + ( bOnlyPersistent ? 0 : m_aMemContainer.size() ); + uno::Sequence< rtl::OUString > aResult( nCount ); + + StringSet::const_iterator it = m_aCfgContainer.begin(); + StringSet::const_iterator end = m_aCfgContainer.end(); + sal_Int32 n = 0; + + while ( it != end ) + { + aResult[ n ] = *it; + ++it; + ++n; + } + + if ( !bOnlyPersistent ) + { + it = m_aMemContainer.begin(); + end = m_aMemContainer.end(); + + while ( it != end ) + { + aResult[ n ] = *it; + ++it; + ++n; + } + } + return aResult; +} + +void SysCredentialsConfig::persistentConfigChanged() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + m_bCfgInited = false; // re-init on demand. +} diff --git a/svl/source/passwordcontainer/syscreds.hxx b/svl/source/passwordcontainer/syscreds.hxx new file mode 100644 index 000000000000..68de21049fdc --- /dev/null +++ b/svl/source/passwordcontainer/syscreds.hxx @@ -0,0 +1,95 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef INCLUDED_SVTOOLS_SYSCREDS_HXX +#define INCLUDED_SVTOOLS_SYSCREDS_HXX + +#include +#include +#include "osl/mutex.hxx" +#include "rtl/ustring.hxx" +#include "com/sun/star/uno/Sequence.hxx" +#include "unotools/configitem.hxx" + +class SysCredentialsConfig; + +class SysCredentialsConfigItem : public utl::ConfigItem +{ + public: + SysCredentialsConfigItem( SysCredentialsConfig * pOwner ); + //virtual ~SysCredentialsConfigItem(); + + virtual void Notify( + const com::sun::star::uno::Sequence< rtl::OUString > & + seqPropertyNames ); + virtual void Commit(); + + com::sun::star::uno::Sequence< rtl::OUString > + getSystemCredentialsURLs(); + + void setSystemCredentialsURLs( + const com::sun::star::uno::Sequence< rtl::OUString > & + seqURLList ); + + //bool isSystemCredentialsURL( const rtl::OUString & rURL ) const; + +private: + ::osl::Mutex m_aMutex; + bool m_bInited; + com::sun::star::uno::Sequence< rtl::OUString > m_seqURLs; + SysCredentialsConfig * m_pOwner; +}; + +typedef std::set< rtl::OUString > StringSet; + +class SysCredentialsConfig +{ + public: + SysCredentialsConfig(); + + rtl::OUString find( rtl::OUString const & rURL ); + void add( rtl::OUString const & rURL, bool bPersistent ); + void remove( rtl::OUString const & rURL ); + com::sun::star::uno::Sequence< rtl::OUString > list( bool bOnlyPersistent ); + + void persistentConfigChanged(); + + private: + void initCfg(); + void writeCfg(); + + ::osl::Mutex m_aMutex; + StringSet m_aMemContainer; + StringSet m_aCfgContainer; + SysCredentialsConfigItem m_aConfigItem; + bool m_bCfgInited; +}; + +#endif // INCLUDED_SVTOOLS_SYSCREDS_HXX diff --git a/svtools/source/svdde/ddecli.cxx b/svl/source/svdde/ddecli.cxx similarity index 98% rename from svtools/source/svdde/ddecli.cxx rename to svl/source/svdde/ddecli.cxx index e31e53d07522..dd3c9c237f9a 100644 --- a/svtools/source/svdde/ddecli.cxx +++ b/svl/source/svdde/ddecli.cxx @@ -29,16 +29,16 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #define UNICODE #include // memset #include "ddeimp.hxx" -#include +#include #include #include -#include +#include #include // static DWORD hDdeInst = NULL; @@ -367,9 +367,11 @@ const String& DdeTransaction::GetName() const void __EXPORT DdeTransaction::Data( const DdeData* p ) { - Application::GetSolarMutex().acquire(); - aData.Call( (void*)p ); - Application::GetSolarMutex().release(); + if ( ::tools::SolarMutex::Acquire() ) + { + aData.Call( (void*)p ); + ::tools::SolarMutex::Release(); + } } // --- DdeTransaction::Done() -------------------------------------- diff --git a/svtools/source/svdde/ddedata.cxx b/svl/source/svdde/ddedata.cxx similarity index 98% rename from svtools/source/svdde/ddedata.cxx rename to svl/source/svdde/ddedata.cxx index 9167c8585b08..8ae22a8cfb20 100644 --- a/svtools/source/svdde/ddedata.cxx +++ b/svl/source/svdde/ddedata.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" // ACHTUNG: es wird angenommen, dass StarView-Clipboard-Foamatnummern // und Windows-Formatnummern identisch sind! Ist dies einmal nicht der @@ -40,7 +40,7 @@ #include #include "ddeimp.hxx" -#include +#include #include diff --git a/svtools/source/svdde/ddedll.cxx b/svl/source/svdde/ddedll.cxx similarity index 98% rename from svtools/source/svdde/ddedll.cxx rename to svl/source/svdde/ddedll.cxx index 696d7b2851d2..b27272a2a910 100644 --- a/svtools/source/svdde/ddedll.cxx +++ b/svl/source/svdde/ddedll.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #ifdef WIN diff --git a/svtools/source/svdde/ddeimp.hxx b/svl/source/svdde/ddeimp.hxx similarity index 100% rename from svtools/source/svdde/ddeimp.hxx rename to svl/source/svdde/ddeimp.hxx diff --git a/svtools/source/svdde/ddeinf.cxx b/svl/source/svdde/ddeinf.cxx similarity index 98% rename from svtools/source/svdde/ddeinf.cxx rename to svl/source/svdde/ddeinf.cxx index 7c2fb82789e6..b5154e1f7530 100644 --- a/svtools/source/svdde/ddeinf.cxx +++ b/svl/source/svdde/ddeinf.cxx @@ -29,13 +29,13 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #define UNICODE #include #include "ddeimp.hxx" -#include +#include // --- DdeInternal::InfCallback() ---------------------------------- diff --git a/svtools/source/svdde/ddeml1.cxx b/svl/source/svdde/ddeml1.cxx similarity index 99% rename from svtools/source/svdde/ddeml1.cxx rename to svl/source/svdde/ddeml1.cxx index 6cc09b612ecf..9d1351b17f16 100644 --- a/svtools/source/svdde/ddeml1.cxx +++ b/svl/source/svdde/ddeml1.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" /* ToDo / Bugs: @@ -1089,7 +1089,7 @@ ImpService* ImpDdeMgr::PutService( HSZ hszService ) String aStr( (ULONG)hWndServer ); aStr += pBuf; HSZ hszInstServ = DdeCreateStringHandle( (PSZ)(const char*)pBuf, 850 ); - delete pBuf; + delete [] pBuf; pPtr->hBaseServName = hszService; pPtr->hInstServName = hszInstServ; diff --git a/svtools/source/svdde/ddeml2.cxx b/svl/source/svdde/ddeml2.cxx similarity index 99% rename from svtools/source/svdde/ddeml2.cxx rename to svl/source/svdde/ddeml2.cxx index 979897136a46..e0cdee2d52d1 100644 --- a/svtools/source/svdde/ddeml2.cxx +++ b/svl/source/svdde/ddeml2.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #define INCL_DOS #include diff --git a/svtools/source/svdde/ddemldeb.cxx b/svl/source/svdde/ddemldeb.cxx similarity index 99% rename from svtools/source/svdde/ddemldeb.cxx rename to svl/source/svdde/ddemldeb.cxx index bb53743a2915..18da7c07fd3c 100644 --- a/svtools/source/svdde/ddemldeb.cxx +++ b/svl/source/svdde/ddemldeb.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "ddemlimp.hxx" diff --git a/svtools/source/svdde/ddemldeb.hxx b/svl/source/svdde/ddemldeb.hxx similarity index 100% rename from svtools/source/svdde/ddemldeb.hxx rename to svl/source/svdde/ddemldeb.hxx diff --git a/svtools/source/svdde/ddemlimp.hxx b/svl/source/svdde/ddemlimp.hxx similarity index 100% rename from svtools/source/svdde/ddemlimp.hxx rename to svl/source/svdde/ddemlimp.hxx diff --git a/svtools/source/svdde/ddemlos2.h b/svl/source/svdde/ddemlos2.h similarity index 100% rename from svtools/source/svdde/ddemlos2.h rename to svl/source/svdde/ddemlos2.h diff --git a/svtools/source/svdde/ddestrg.cxx b/svl/source/svdde/ddestrg.cxx similarity index 97% rename from svtools/source/svdde/ddestrg.cxx rename to svl/source/svdde/ddestrg.cxx index 40af3b1cbc27..9cd594a7920d 100644 --- a/svtools/source/svdde/ddestrg.cxx +++ b/svl/source/svdde/ddestrg.cxx @@ -29,12 +29,12 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #define UNICODE #include "ddeimp.hxx" -#include +#include #if defined( WIN ) && defined( MSC ) #pragma code_seg( "SVDDE_MISC_CODE" ) diff --git a/svtools/source/svdde/ddesvr.cxx b/svl/source/svdde/ddesvr.cxx similarity index 99% rename from svtools/source/svdde/ddesvr.cxx rename to svl/source/svdde/ddesvr.cxx index a2124548b4c8..ec718d4e56ee 100644 --- a/svtools/source/svdde/ddesvr.cxx +++ b/svl/source/svdde/ddesvr.cxx @@ -29,12 +29,12 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #define UNICODE #include "ddeimp.hxx" -#include -#include +#include +#include #include #include @@ -190,7 +190,7 @@ HDDEDATA CALLBACK _export DdeInternal::SvrCallback( pInst->hDdeInstSvr, (LPBYTE) pPairs, sizeof(HSZPAIR) * (nTopics+1), 0, NULL, nCbType, 0); - delete pPairs; + delete [] pPairs; return h; } diff --git a/svtools/source/svdde/ddewrap.cxx b/svl/source/svdde/ddewrap.cxx similarity index 98% rename from svtools/source/svdde/ddewrap.cxx rename to svl/source/svdde/ddewrap.cxx index b0b023ad3a75..650ec5b1b31f 100644 --- a/svtools/source/svdde/ddewrap.cxx +++ b/svl/source/svdde/ddewrap.cxx @@ -30,7 +30,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #define _SVTOOLS_SVDDE_DDEWRAP_CXX_ #if defined _MSC_VER diff --git a/svtools/source/svdde/ddewrap.hxx b/svl/source/svdde/ddewrap.hxx similarity index 100% rename from svtools/source/svdde/ddewrap.hxx rename to svl/source/svdde/ddewrap.hxx diff --git a/svtools/source/svdde/makefile.mk b/svl/source/svdde/makefile.mk similarity index 97% rename from svtools/source/svdde/makefile.mk rename to svl/source/svdde/makefile.mk index f4c72aff2094..321a4b5ced03 100644 --- a/svtools/source/svdde/makefile.mk +++ b/svl/source/svdde/makefile.mk @@ -34,13 +34,13 @@ PRJ=..$/.. -PRJNAME=svtools +PRJNAME=svl TARGET=svdde # --- Settings ----------------------------------------------------- .INCLUDE : settings.mk -.INCLUDE : $(PRJ)$/util$/svt.pmk +.INCLUDE : $(PRJ)$/util$/svl.pmk # --- Files -------------------------------------------------------- diff --git a/svtools/source/svsql/converter.cxx b/svl/source/svsql/converter.cxx similarity index 97% rename from svtools/source/svsql/converter.cxx rename to svl/source/svsql/converter.cxx index c87290265e90..826b64adc48d 100644 --- a/svtools/source/svsql/converter.cxx +++ b/svl/source/svsql/converter.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "converter.hxx" INT32 SvDbaseConverter::ConvertPrecisionToDbase(INT32 _nLen, INT32 _nScale) diff --git a/svtools/source/svsql/makefile.mk b/svl/source/svsql/makefile.mk similarity index 98% rename from svtools/source/svsql/makefile.mk rename to svl/source/svsql/makefile.mk index 55c400b83ef3..ae3abf24db24 100644 --- a/svtools/source/svsql/makefile.mk +++ b/svl/source/svsql/makefile.mk @@ -31,7 +31,7 @@ PRJ=..$/.. -PRJNAME=svtools +PRJNAME=svl TARGET=svsql # --- Settings ----------------------------------------------------- diff --git a/svtools/source/undo/makefile.mk b/svl/source/undo/makefile.mk similarity index 96% rename from svtools/source/undo/makefile.mk rename to svl/source/undo/makefile.mk index b277fa3c906f..7c51df3f17fc 100644 --- a/svtools/source/undo/makefile.mk +++ b/svl/source/undo/makefile.mk @@ -31,14 +31,14 @@ PRJ=..$/.. -PRJNAME=svtools +PRJNAME=svl TARGET=undo ENABLE_EXCEPTIONS=TRUE # --- Settings ----------------------------------------------------- .INCLUDE : settings.mk -.INCLUDE : $(PRJ)$/util$/svt.pmk +.INCLUDE : $(PRJ)$/util$/svl.pmk # --- Files -------------------------------------------------------- diff --git a/svtools/source/undo/undo.cxx b/svl/source/undo/undo.cxx similarity index 96% rename from svtools/source/undo/undo.cxx rename to svl/source/undo/undo.cxx index 2f733d4f03b3..a8442098237e 100644 --- a/svtools/source/undo/undo.cxx +++ b/svl/source/undo/undo.cxx @@ -29,13 +29,13 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include #include -#include +#include using ::com::sun::star::uno::Exception; @@ -313,7 +313,7 @@ USHORT SfxUndoManager::GetUndoActionCount() const XubString SfxUndoManager::GetUndoActionComment( USHORT nNo ) const { - DBG_ASSERT( nNo < pActUndoArray->nCurUndoAction, "svtools::SfxUndoManager::GetUndoActionComment(), illegal id!" ); + DBG_ASSERT( nNo < pActUndoArray->nCurUndoAction, "svl::SfxUndoManager::GetUndoActionComment(), illegal id!" ); if( nNo < pActUndoArray->nCurUndoAction ) { return pActUndoArray->aUndoActions[pActUndoArray->nCurUndoAction-1-nNo]->GetComment(); //! @@ -329,7 +329,7 @@ XubString SfxUndoManager::GetUndoActionComment( USHORT nNo ) const USHORT SfxUndoManager::GetUndoActionId( USHORT nNo ) const { - DBG_ASSERT( nNo < pActUndoArray->nCurUndoAction, "svtools::SfxUndoManager::GetUndoActionId(), illegal id!" ); + DBG_ASSERT( nNo < pActUndoArray->nCurUndoAction, "svl::SfxUndoManager::GetUndoActionId(), illegal id!" ); if( nNo < pActUndoArray->nCurUndoAction ) { return pActUndoArray->aUndoActions[pActUndoArray->nCurUndoAction-1-nNo]->GetId(); //! @@ -344,7 +344,7 @@ USHORT SfxUndoManager::GetUndoActionId( USHORT nNo ) const SfxUndoAction* SfxUndoManager::GetUndoAction( USHORT nNo ) const { - DBG_ASSERT( nNo < pActUndoArray->nCurUndoAction, "svtools::SfxUndoManager::GetUndoAction(), illegal id!" ); + DBG_ASSERT( nNo < pActUndoArray->nCurUndoAction, "svl::SfxUndoManager::GetUndoAction(), illegal id!" ); if( nNo < pActUndoArray->nCurUndoAction ) { return pActUndoArray->aUndoActions[pActUndoArray->nCurUndoAction-1-nNo]; //! @@ -360,7 +360,7 @@ SfxUndoAction* SfxUndoManager::GetUndoAction( USHORT nNo ) const /** clears the redo stack and removes the top undo action */ void SfxUndoManager::RemoveLastUndoAction() { - DBG_ASSERT( pActUndoArray->nCurUndoAction, "svtools::SfxUndoManager::RemoveLastUndoAction(), no action to remove?!" ); + DBG_ASSERT( pActUndoArray->nCurUndoAction, "svl::SfxUndoManager::RemoveLastUndoAction(), no action to remove?!" ); if( pActUndoArray->nCurUndoAction ) { pActUndoArray->nCurUndoAction--; @@ -387,7 +387,7 @@ BOOL SfxUndoManager::Undo( USHORT ) try { - DBG_ASSERT( pActUndoArray == pUndoArray, "svtools::SfxUndoManager::Undo(), LeaveListAction() not yet called!" ); + DBG_ASSERT( pActUndoArray == pUndoArray, "svl::SfxUndoManager::Undo(), LeaveListAction() not yet called!" ); if ( pActUndoArray->nCurUndoAction ) { Undo( *pActUndoArray->aUndoActions[ --pActUndoArray->nCurUndoAction ] ); @@ -587,11 +587,11 @@ void SfxUndoManager::LeaveListAction() if( pActUndoArray == pUndoArray ) { - DBG_ERROR( "svtools::SfxUndoManager::LeaveListAction(), called without calling EnterListAction()!" ); + DBG_ERROR( "svl::SfxUndoManager::LeaveListAction(), called without calling EnterListAction()!" ); return; } - DBG_ASSERT(pActUndoArray->pFatherUndoArray,"svtools::SfxUndoManager::LeaveListAction(), no father undo array!?"); + DBG_ASSERT(pActUndoArray->pFatherUndoArray,"svl::SfxUndoManager::LeaveListAction(), no father undo array!?"); SfxUndoArray* pTmp=pActUndoArray; pActUndoArray=pActUndoArray->pFatherUndoArray; diff --git a/svl/source/uno/makefile.mk b/svl/source/uno/makefile.mk new file mode 100644 index 000000000000..af26b20cd8df --- /dev/null +++ b/svl/source/uno/makefile.mk @@ -0,0 +1,51 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.21 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/.. + +PRJNAME=svl +TARGET=unoiface +ENABLE_EXCEPTIONS=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/util$/svl.pmk + +# --- Files -------------------------------------------------------- + +SLOFILES= \ + $(SLO)$/registerservices.obj\ + $(SLO)$/pathservice.obj + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/svtools/uno/pathservice.cxx b/svl/source/uno/pathservice.cxx similarity index 97% rename from svtools/uno/pathservice.cxx rename to svl/source/uno/pathservice.cxx index 65d08609483a..78c339773aec 100644 --- a/svtools/uno/pathservice.cxx +++ b/svl/source/uno/pathservice.cxx @@ -29,9 +29,9 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" -#include +#include #include "sal/types.h" #include "rtl/ustring.hxx" #include @@ -54,7 +54,7 @@ public: virtual OUString SAL_CALL getImplementationName() throw(css::uno::RuntimeException) { - return OUString::createFromAscii("com.sun.star.comp.svtools.PathService"); + return OUString::createFromAscii("com.sun.star.comp.svl.PathService"); } virtual sal_Bool SAL_CALL supportsService ( diff --git a/svtools/source/uno/registerservices.cxx b/svl/source/uno/registerservices.cxx similarity index 81% rename from svtools/source/uno/registerservices.cxx rename to svl/source/uno/registerservices.cxx index a3e9f39c2dba..39be9e177fea 100644 --- a/svtools/source/uno/registerservices.cxx +++ b/svl/source/uno/registerservices.cxx @@ -29,13 +29,14 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_svl.hxx" #include "sal/types.h" #include "rtl/ustring.hxx" #include #include #include #include +#include namespace css = com::sun::star; using css::uno::Reference; @@ -49,19 +50,20 @@ using rtl::OUString; DECLARE_CREATEINSTANCE( SvNumberFormatterServiceObj ) DECLARE_CREATEINSTANCE( SvNumberFormatsSupplierServiceObject ) +DECLARE_CREATEINSTANCE( PathService ) // ------------------------------------------------------------------------------------- extern "C" { -SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment ( +SVL_DLLPUBLIC void SAL_CALL component_getImplementationEnvironment ( const sal_Char ** ppEnvTypeName, uno_Environment ** /* ppEnv */) { *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; } -SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo ( +SVL_DLLPUBLIC sal_Bool SAL_CALL component_writeInfo ( void * /* _pServiceManager */, void * _pRegistryKey) { if (_pRegistryKey) @@ -82,12 +84,17 @@ SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo ( xNewKey->createKey ( OUString::createFromAscii( "com.sun.star.util.NumberFormatter" ) ); + xNewKey = xRegistryKey->createKey( + OUString::createFromAscii( "/com.sun.star.comp.svl.PathService/UNO/SERVICES" ) ); + xNewKey->createKey ( + OUString::createFromAscii( "com.sun.star.config.SpecialConfigManager" ) ); + return sal_True; } return sal_False; } -SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory ( +SVL_DLLPUBLIC void* SAL_CALL component_getFactory ( const sal_Char * pImplementationName, void * _pServiceManager, void * /* _pRegistryKey*/) { void * pResult = 0; @@ -122,6 +129,18 @@ SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory ( SvNumberFormatterServiceObj_CreateInstance, aServiceNames); } + else if (rtl_str_compare ( + pImplementationName, "com.sun.star.comp.svl.PathService") == 0) + { + Sequence< OUString > aServiceNames(1); + aServiceNames.getArray()[0] = + OUString::createFromAscii( "com.sun.star.config.SpecialConfigManager" ); + xFactory = ::cppu::createSingleFactory ( + reinterpret_cast< css::lang::XMultiServiceFactory* >( _pServiceManager ), + OUString::createFromAscii( pImplementationName ), + PathService_CreateInstance, + aServiceNames); + } if ( xFactory.is() ) { xFactory->acquire(); diff --git a/svtools/unx/inc/convert.hxx b/svl/unx/inc/convert.hxx similarity index 100% rename from svtools/unx/inc/convert.hxx rename to svl/unx/inc/convert.hxx diff --git a/svtools/unx/source/svdde/ddedummy.cxx b/svl/unx/source/svdde/ddedummy.cxx similarity index 98% rename from svtools/unx/source/svdde/ddedummy.cxx rename to svl/unx/source/svdde/ddedummy.cxx index 6f627807bfd3..2aec705bc7ef 100644 --- a/svtools/unx/source/svdde/ddedummy.cxx +++ b/svl/unx/source/svdde/ddedummy.cxx @@ -29,8 +29,8 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include +#include "precompiled_svl.hxx" +#include #include DdeData::DdeData() diff --git a/svtools/unx/source/svdde/makefile.mk b/svl/unx/source/svdde/makefile.mk similarity index 96% rename from svtools/unx/source/svdde/makefile.mk rename to svl/unx/source/svdde/makefile.mk index d0203fd6378b..c6e89eaf2630 100644 --- a/svtools/unx/source/svdde/makefile.mk +++ b/svl/unx/source/svdde/makefile.mk @@ -31,13 +31,13 @@ PRJ=..$/..$/.. -PRJNAME=svtools +PRJNAME=svl TARGET=svdde # --- Settings ----------------------------------------------------- .INCLUDE : settings.mk -.INCLUDE : $(PRJ)$/util$/svt.pmk +.INCLUDE : $(PRJ)$/util$/svl.pmk # --- Files -------------------------------------------------------- diff --git a/svl/util/makefile.mk b/svl/util/makefile.mk new file mode 100644 index 000000000000..47a37a6e9173 --- /dev/null +++ b/svl/util/makefile.mk @@ -0,0 +1,126 @@ +#************************************************************************* +#* +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.67 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=.. + +PRJNAME=svl +TARGET=svl +RESTARGETSIMPLE=svs +GEN_HID=TRUE +# GEN_HID_OTHER=TRUE +ENABLE_EXCEPTIONS=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk + +# --- general section ---------------------------------------------------- + +.IF "$(GUI)"!="UNX" +LIB2TARGET= $(LB)$/isvl.lib +LIB2FILES= $(LB)$/_isvl.lib +.ENDIF + +LIB1TARGET= $(SLB)$/svl.lib +LIB1FILES= \ + $(SLB)$/config.lib \ + $(SLB)$/svdde.lib \ + $(SLB)$/undo.lib \ + $(SLB)$/numbers.lib \ + $(SLB)$/numbers.uno.lib \ + $(SLB)$/filerec.lib \ + $(SLB)$/filepicker.lib \ + $(SLB)$/items.lib \ + $(SLB)$/misc.lib \ + $(SLB)$/notify.lib \ + $(SLB)$/unoiface.lib \ + $(SLB)$/svarray.lib \ + $(SLB)$/svsql.lib + +# generation of resourcen-lib ---------------------------------------- + +RESLIB1NAME= $(RESTARGETSIMPLE) +RESLIB1SRSFILES=\ + $(SRS)$/items.srs \ + $(SRS)$/misc.srs + +# build the shared library -------------------------------------------------- + +SHL1TARGET= svl$(DLLPOSTFIX) +SHL1IMPLIB= _isvl +SHL1USE_EXPORTS=name +#Do not link with VCL or any other library that links with VCL +SHL1STDLIBS= \ + $(UNOTOOLSLIB) \ + $(TOOLSLIB) \ + $(I18NISOLANGLIB) \ + $(UCBHELPERLIB) \ + $(COMPHELPERLIB) \ + $(CPPUHELPERLIB) \ + $(CPPULIB) \ + $(VOSLIB) \ + $(SOTLIB) \ + $(SALLIB) + +.IF "$(GUI)"=="WNT" +SHL1STDLIBS+= \ + $(UWINAPILIB) \ + $(ADVAPI32LIB) \ + $(GDI32LIB) +.ENDIF # WNT + +SHL1LIBS= $(SLB)$/svl.lib + +SHL1DEF= $(MISC)$/$(SHL1TARGET).def + +DEF1NAME= $(SHL1TARGET) +DEF1DEPN= $(SLB)$/svl.lib +DEFLIB1NAME=svl +DEF1DES =SvTools lite + +# --- Targets ------------------------------------------------------ + +.IF "$(GUI)"=="UNX" +SVTTARGETS= $(LB)$/lib$(SHL1TARGET)$(DLLPOST) +.ELSE +SVTTARGETS= $(LB)$/isvl.lib +.ENDIF + +# just a quick fix - has to be cleaned up some day... +.IF "$(L10N-framework)"=="" +ALL: $(SLB)$/svl.lib \ + $(MISC)$/$(SHL1TARGET).def \ + $(SVTTARGETS) \ + ALLTAR +.ENDIF # "$(L10N-framework)"=="" + +.INCLUDE : target.mk + diff --git a/svtools/util/svl.pmk b/svl/util/svl.pmk similarity index 100% rename from svtools/util/svl.pmk rename to svl/util/svl.pmk diff --git a/svtools/bmpmaker/bmp.cxx b/svtools/bmpmaker/bmp.cxx index df20c7e05376..b91dae79bbad 100644 --- a/svtools/bmpmaker/bmp.cxx +++ b/svtools/bmpmaker/bmp.cxx @@ -43,7 +43,7 @@ using namespace std; #include -#include "svtools/solar.hrc" +#include "svl/solar.hrc" #include "filedlg.hxx" #include "bmpcore.hxx" #include "bmp.hrc" diff --git a/svtools/bmpmaker/bmpsum.cxx b/svtools/bmpmaker/bmpsum.cxx index 0633eb4c6a09..3eee49ef695d 100644 --- a/svtools/bmpmaker/bmpsum.cxx +++ b/svtools/bmpmaker/bmpsum.cxx @@ -45,7 +45,7 @@ #include #include -#include "svtools/solar.hrc" +#include "svl/solar.hrc" #define EXIT_NOERROR 0x00000000 #define EXIT_INVALIDFILE 0x00000001 diff --git a/svtools/inc/apearcfg.hxx b/svtools/inc/apearcfg.hxx index 1123eb839eff..412faab3107b 100644 --- a/svtools/inc/apearcfg.hxx +++ b/svtools/inc/apearcfg.hxx @@ -87,6 +87,7 @@ public: ~SvtTabAppearanceCfg( ); virtual void Commit(); + virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& _rPropertyNames); USHORT GetLookNFeel () const { return nLookNFeel; } void SetLookNFeel ( USHORT nSet ); diff --git a/svtools/inc/calendar.hxx b/svtools/inc/calendar.hxx index 6f20a7f8c6c3..1c81945a669c 100644 --- a/svtools/inc/calendar.hxx +++ b/svtools/inc/calendar.hxx @@ -251,6 +251,7 @@ private: USHORT mnDragScrollHitTest; #ifdef _SV_CALENDAR_CXX + using Control::ImplInitSettings; using Window::ImplInit; SVT_DLLPRIVATE void ImplInit( WinBits nWinStyle ); SVT_DLLPRIVATE void ImplInitSettings(); diff --git a/svtools/inc/dialogcontrolling.hxx b/svtools/inc/dialogcontrolling.hxx index 9efb098ee013..edb425f78b00 100644 --- a/svtools/inc/dialogcontrolling.hxx +++ b/svtools/inc/dialogcontrolling.hxx @@ -52,7 +52,15 @@ namespace svt class SVT_DLLPUBLIC SAL_NO_VTABLE IWindowOperator { public: - virtual void operateOn( Window& _rOperateOn ) const = 0; + /** called when an event happened which should be reacted to + + @param _rTrigger + the event which triggered the call. If the Id of the event is 0, then this is the initial + call which is made when ->_rOperateOn is added to the responsibility of the DialogController. + @param _rOperateOn + the window on which to operate + */ + virtual void operateOn( const VclWindowEvent& _rTrigger, Window& _rOperateOn ) const = 0; virtual ~IWindowOperator(); }; @@ -61,13 +69,13 @@ namespace svt //===================================================================== //= IWindowEventFilter //===================================================================== - /** an abstract interface for deciding whether a ->VclSimpleEvent + /** an abstract interface for deciding whether a ->VclWindowEvent is worth paying attention to */ class SVT_DLLPUBLIC SAL_NO_VTABLE IWindowEventFilter { public: - virtual bool payAttentionTo( const VclSimpleEvent& _rEvent ) const = 0; + virtual bool payAttentionTo( const VclWindowEvent& _rEvent ) const = 0; virtual ~IWindowEventFilter(); }; @@ -96,7 +104,7 @@ namespace svt ::std::auto_ptr< DialogController_Data > m_pImpl; public: - DialogController( Window& _rInstigator, const PWindowEventFilter _pEventFilter, const PWindowOperator _pOperator ); + DialogController( Window& _rInstigator, const PWindowEventFilter& _pEventFilter, const PWindowOperator& _pOperator ); virtual ~DialogController(); /** adds a window to the list of dependent windows @@ -117,10 +125,10 @@ namespace svt private: void impl_Init(); - void impl_updateAll(); - void impl_update( Window& _rWindow ); + void impl_updateAll( const VclWindowEvent& _rTriggerEvent ); + void impl_update( const VclWindowEvent& _rTriggerEvent, Window& _rWindow ); - DECL_LINK( OnWindowEvent, const VclSimpleEvent* ); + DECL_LINK( OnWindowEvent, const VclWindowEvent* ); private: DialogController( const DialogController& ); // never implemented @@ -184,10 +192,9 @@ namespace svt /** adds a non-standard controller whose functionality is not covered by the other methods @param _pController - the controller to add to the manager. Must not be . The manager takes ownership - of the controller. + the controller to add to the manager. Must not be . */ - void addController( DialogController* _pController ); + void addController( const PDialogController& _pController ); private: ControlDependencyManager( const ControlDependencyManager& ); // never implemented @@ -224,7 +231,7 @@ namespace svt { } - virtual void operateOn( Window& _rOperateOn ) const + virtual void operateOn( const VclWindowEvent& /*_rTrigger*/, Window& _rOperateOn ) const { _rOperateOn.Enable( m_rCheckable.IsChecked() ); } @@ -248,12 +255,11 @@ namespace svt { } - bool payAttentionTo( const VclSimpleEvent& _rEvent ) const + bool payAttentionTo( const VclWindowEvent& _rEvent ) const { - const VclWindowEvent& rWindowEvent = dynamic_cast< const VclWindowEvent& >( _rEvent ); - if ( ( rWindowEvent.GetWindow() == &m_rWindow ) - && ( ( rWindowEvent.GetId() == VCLEVENT_RADIOBUTTON_TOGGLE ) - || ( rWindowEvent.GetId() == VCLEVENT_CHECKBOX_TOGGLE ) + if ( ( _rEvent.GetWindow() == &m_rWindow ) + && ( ( _rEvent.GetId() == VCLEVENT_RADIOBUTTON_TOGGLE ) + || ( _rEvent.GetId() == VCLEVENT_CHECKBOX_TOGGLE ) ) ) return true; diff --git a/svtools/inc/docpasswdrequest.hxx b/svtools/inc/docpasswdrequest.hxx deleted file mode 100644 index 69095fbe5a5c..000000000000 --- a/svtools/inc/docpasswdrequest.hxx +++ /dev/null @@ -1,71 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: docpasswdrequest.hxx,v $ - * $Revision: 1.4 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef INCLUDED_SVTOOLS_DOCPASSWDREQUEST_HXX -#define INCLUDED_SVTOOLS_DOCPASSWDREQUEST_HXX - -#include "svtools/svldllapi.h" -#include -#include -#include -#include - -class AbortContinuation; -class PasswordContinuation; - -class SVL_DLLPUBLIC RequestDocumentPassword : public ::cppu::WeakImplHelper1< ::com::sun::star::task::XInteractionRequest > -{ - ::com::sun::star::uno::Any m_aRequest; - - ::com::sun::star::uno::Sequence< - ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation > - > m_lContinuations; - - AbortContinuation* m_pAbort; - PasswordContinuation* m_pPassword; - -public: - RequestDocumentPassword( ::com::sun::star::task::PasswordRequestMode nMode, ::rtl::OUString aName ); - - sal_Bool isAbort(); - sal_Bool isPassword(); - - ::rtl::OUString getPassword(); - - virtual ::com::sun::star::uno::Any SAL_CALL getRequest() - throw( ::com::sun::star::uno::RuntimeException ); - - virtual ::com::sun::star::uno::Sequence< - ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation > - > SAL_CALL getContinuations() - throw( ::com::sun::star::uno::RuntimeException ); -}; - -#endif /* INCLUDED_SVTOOLS_DOCPASSWDREQUEST_HXX */ diff --git a/svtools/inc/extcolorcfg.hxx b/svtools/inc/extcolorcfg.hxx index f8154c86f88f..228ef9823fd2 100644 --- a/svtools/inc/extcolorcfg.hxx +++ b/svtools/inc/extcolorcfg.hxx @@ -34,8 +34,8 @@ #include #include #include -#include -#include +#include +#include //----------------------------------------------------------------------------- namespace svtools{ diff --git a/svtools/source/dialogs/filedlg2.hrc b/svtools/inc/filedlg2.hrc similarity index 100% rename from svtools/source/dialogs/filedlg2.hrc rename to svtools/inc/filedlg2.hrc diff --git a/svtools/inc/flbytes.hxx b/svtools/inc/flbytes.hxx deleted file mode 100644 index 86c19191de2a..000000000000 --- a/svtools/inc/flbytes.hxx +++ /dev/null @@ -1,174 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: flbytes.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _FLBYTES_HXX -#define _FLBYTES_HXX - -#include -#include - -//============================================================================ -class SvFillLockBytes : public SvLockBytes -{ - SvLockBytesRef xLockBytes; - ULONG nFilledSize; - BOOL bTerminated; - BOOL bSync; -public: - TYPEINFO(); - - SvFillLockBytes( SvLockBytes* pLockBytes ); - virtual ErrCode ReadAt( - ULONG nPos, void* pBuffer, ULONG nCount, ULONG* pRead ) const; - virtual ErrCode WriteAt( - ULONG nPos, const void* pBuffer, ULONG nCount, ULONG* pWritten ); - virtual ErrCode Flush() const; - virtual ErrCode SetSize( ULONG nSize ); - virtual ErrCode LockRegion( ULONG nPos, ULONG nCount, LockType ); - virtual ErrCode UnlockRegion( ULONG nPos, ULONG nCount, LockType ); - virtual ErrCode Stat( SvLockBytesStat*, SvLockBytesStatFlag ) const; - ErrCode FillAppend( const void* pBuffer, ULONG nCount, ULONG *pWritten ); - ULONG Tell() const { return nFilledSize; } - void Seek( ULONG nPos ) { nFilledSize = nPos; } - - void Terminate(); -}; - -SV_DECL_IMPL_REF( SvFillLockBytes ) - -//============================================================================ -class SvSyncLockBytes: public SvOpenLockBytes -{ - SvAsyncLockBytesRef m_xAsyncLockBytes; - -public: - TYPEINFO(); - - /// Create a synchronous wrapper around existing asynchronous lock bytes. - /// - /// @param pTheAsyncLockBytes Must not be null. - inline SvSyncLockBytes(SvAsyncLockBytes * pTheAsyncLockBytes); - - /// Create a synchronous wrapper around an existing stream. - /// - /// @descr This is like first creating asynchronous lock bytes around the - /// stream and than creating a synchronous wrapper around the asynchronous - /// lock bytes. - /// - /// @param pStream Must not be null. - /// - /// @param bOwner True if these lock bytes own the stream (delete it on - /// destruction). - SvSyncLockBytes(SvStream * pStream, BOOL bOwner): - m_xAsyncLockBytes(new SvAsyncLockBytes(pStream, bOwner)) {} - - virtual const SvStream * GetStream() const - { return m_xAsyncLockBytes->GetStream(); } - - virtual void SetSynchronMode(BOOL bSync = TRUE) - { m_xAsyncLockBytes->SetSynchronMode(bSync); } - - virtual BOOL IsSynchronMode() const - { return m_xAsyncLockBytes->IsSynchronMode(); } - - virtual ErrCode ReadAt(ULONG nPos, void * pBuffer, ULONG nCount, - ULONG * pRead) const; - - virtual ErrCode WriteAt(ULONG nPos, const void * pBuffer, ULONG nCount, - ULONG * pWritten); - - virtual ErrCode Flush() const { return m_xAsyncLockBytes->Flush(); } - - virtual ErrCode SetSize(ULONG nSize) - { return m_xAsyncLockBytes->SetSize(nSize); } - - virtual ErrCode LockRegion(ULONG nPos, ULONG nCount, LockType eType) - { return m_xAsyncLockBytes->LockRegion(nPos, nCount, eType); } - - virtual ErrCode UnlockRegion(ULONG nPos, ULONG nCount, LockType eType) - { return m_xAsyncLockBytes->UnlockRegion(nPos, nCount, eType); } - - virtual ErrCode Stat(SvLockBytesStat * pStat, SvLockBytesStatFlag eFlag) - const - { return m_xAsyncLockBytes->Stat(pStat, eFlag); } - - virtual ErrCode FillAppend(const void * pBuffer, ULONG nCount, - ULONG * pWritten) - { return m_xAsyncLockBytes->FillAppend(pBuffer, nCount, pWritten); } - - virtual ULONG Tell() const { return m_xAsyncLockBytes->Tell(); } - - virtual ULONG Seek(ULONG nPos) - { return m_xAsyncLockBytes->Seek(nPos); } - - virtual void Terminate() { m_xAsyncLockBytes->Terminate(); } -}; - -inline SvSyncLockBytes::SvSyncLockBytes(SvAsyncLockBytes * - pTheAsyncLockBytes): - m_xAsyncLockBytes(pTheAsyncLockBytes) -{ - DBG_ASSERT(m_xAsyncLockBytes.Is(), - "SvSyncLockBytes::SvSyncLockBytes(): Null"); -} - -SV_DECL_IMPL_REF(SvSyncLockBytes); - -//============================================================================ -struct SvCompositeLockBytes_Impl; -class SvCompositeLockBytes : public SvLockBytes -{ - SvCompositeLockBytes_Impl* pImpl; -public: - TYPEINFO(); - - SvCompositeLockBytes( ); - ~SvCompositeLockBytes(); - - void Append( SvLockBytes* pLockBytes, ULONG nPos, ULONG nOffset ); - ULONG RelativeOffset( ULONG nPos ) const; - void SetIsPending( BOOL bSet ); - SvLockBytes* GetLastLockBytes() const; - - virtual ErrCode ReadAt( - ULONG nPos, void* pBuffer, ULONG nCount, ULONG* pRead ) const; - virtual ErrCode WriteAt( - ULONG nPos, const void* pBuffer, ULONG nCount, ULONG* pWritten ); - virtual ErrCode Flush() const; - virtual ErrCode SetSize( ULONG nSize ); - virtual ErrCode LockRegion( ULONG nPos, ULONG nCount, LockType ); - virtual ErrCode UnlockRegion( ULONG nPos, ULONG nCount, LockType ); - virtual ErrCode Stat( SvLockBytesStat*, SvLockBytesStatFlag ) const; -}; - -SV_DECL_IMPL_REF( SvCompositeLockBytes ) - - -#endif diff --git a/svtools/inc/fontsubstconfig.hxx b/svtools/inc/fontsubstconfig.hxx index 7bcb20e509fe..7ce7e64362b5 100644 --- a/svtools/inc/fontsubstconfig.hxx +++ b/svtools/inc/fontsubstconfig.hxx @@ -53,6 +53,7 @@ public: virtual ~SvtFontSubstConfig(); virtual void Commit(); + virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& _rPropertyNames); sal_Bool IsEnabled() const {return bIsEnabled;} void Enable(sal_Bool bSet) {bIsEnabled = bSet; SetModified();} diff --git a/svtools/inc/imgdef.hxx b/svtools/inc/imgdef.hxx index e5b682d91bfe..2881fe5150bc 100644 --- a/svtools/inc/imgdef.hxx +++ b/svtools/inc/imgdef.hxx @@ -38,17 +38,6 @@ enum SfxSymbolsSize SFX_SYMBOLS_SIZE_AUTO }; -enum SfxSymbolsStyle -{ - SFX_SYMBOLS_STYLE_AUTO, - SFX_SYMBOLS_STYLE_DEFAULT, - SFX_SYMBOLS_STYLE_HICONTRAST, - SFX_SYMBOLS_STYLE_INDUSTRIAL, - SFX_SYMBOLS_STYLE_CRYSTAL, - SFX_SYMBOLS_STYLE_TANGO, - SFX_SYMBOLS_STYLE_CLASSIC -}; - #define SFX_TOOLBOX_CHANGESYMBOLSET 0x0001 #define SFX_TOOLBOX_CHANGEOUTSTYLE 0x0002 #define SFX_TOOLBOX_CHANGEBUTTONTYPE 0x0004 diff --git a/svtools/inc/inidef.hxx b/svtools/inc/inidef.hxx deleted file mode 100644 index c7744d8be2d0..000000000000 --- a/svtools/inc/inidef.hxx +++ /dev/null @@ -1,146 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: inidef.hxx,v $ - * $Revision: 1.5 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _SFXINIDEF_HXX -#define _SFXINIDEF_HXX - -#ifndef _INIMGR_HXX -#include -#endif - -class SfxIniEntry; -class SfxIniDefaulterList; -class SfxIniDefaultManager; - -#if _SOLAR__PRIVATE -#include - -class SfxIniDefaulter; -SV_DECL_PTRARR( SfxIniDefaulterList, SfxIniDefaulter*, 0, 2 ); -#endif - -//======================================================================== - -class SfxIniDefaulter - -/* [Beschreibung] - - Instanzen dieser Klasse k"onnen (f"ur die Laufzeit eines Moduls, z.B. - einer DLL-Nutzung oder einer Applikation) angelegt werden, um Defaults - f"ur eine Anzahl von ini-Eintr"agen zu liefern. Diese Defaults werden - erfragt, wenn ein einen Eintrag nicht in den ini-Files - finden kann. - - Defaults verschiedener -Instanzen d"urfen sich nicht - unterscheiden, da die Reihenfolge der Abarbeitung nicht definiert ist. - - Die Instanzen brauchen nicht zerst"ort zu werden, au\ser wenn der - dazugeh"orige Code entladen wird (load-on-demand DLLs). Sonst geschieht - dies automatisch beim Zerst"oren des . -*/ - -{ - SfxIniDefaultManager* _pManager; - -public: - SfxIniDefaulter( SfxIniDefaultManager *pManager ); - ~SfxIniDefaulter(); - - virtual BOOL QueryDefault( String &aValue, - const SfxIniEntry &rEntry ) = 0; -}; - -//======================================================================== - -class SfxIniDefaultManager - -/* [Beschreibung] - - Genau eine Instanz dieser Klasse mu\s in jeder Application-Subklasse, - die diesen Mechanismus nutzen m"ochte, in deren Ctor angelegt werden - und sollte in deren Dtor zerst"ort werden. -*/ - -{ - SfxIniDefaulterList* _pList; - -public: - SfxIniDefaultManager(); - ~SfxIniDefaultManager(); - -#if _SOLAR__PRIVATE - void Insert( SfxIniDefaulter *pDefaulter ) - { _pList->C40_INSERT( SfxIniDefaulter, pDefaulter, _pList->Count() ); } - void Remove( SfxIniDefaulter *pDefaulter ) - { _pList->Remove( _pList->C40_GETPOS( SfxIniDefaulter, pDefaulter ) ); } - BOOL QueryDefault( String &aValue, - const SfxIniEntry &rEntry ); -#endif -}; - -//======================================================================== - -class SfxIniEntry - -/* [Beschreibung] - - Instanzen dieser Klasse beschreiben einen Eintrag eines Ini-Files, - um mit der Klasse erfragt werden zu k"onnen, falls - der einen Eintrag nicht in den Ini-Files auffindet. -*/ - -{ -friend class SfxIniManager; - - const String& _aGroup; - const String& _aKey; - SfxIniGroup _eGroup; - SfxIniKey _eKey; - USHORT _nIndex; - -private: - SfxIniEntry( const String& aGroup, - const String& aKey, - SfxIniGroup eGroup, - SfxIniKey eKey, - USHORT nIndex ); - SfxIniEntry( const SfxIniEntry & ); // n.i. - SfxIniEntry& operator=( const SfxIniEntry & ); // n.i. - -public: - const String& GetGroupName() const { return _aGroup; } - SfxIniGroup GetGroup() const { return _eGroup; } - const String& GetKeyName() const { return _aKey; } - SfxIniKey GetKey() const { return _eKey; } - USHORT GetIndex() const { return _nIndex; } -}; - -#endif - diff --git a/svtools/inc/iniprop.hxx b/svtools/inc/iniprop.hxx deleted file mode 100644 index 8ba56baa287b..000000000000 --- a/svtools/inc/iniprop.hxx +++ /dev/null @@ -1,64 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: iniprop.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#ifndef _SFXINIPROP_HXX -#define _SFXINIPROP_HXX - -#include -#include -#ifndef _APP_HXX -#include -#endif - -class SfxIniManager; - -//------------------------------------------------------------------------ - -class SfxAppIniManagerProperty: public ApplicationProperty - -// fuer Application::Property(), um von ueberall an den AppIniManger zu kommen - -{ - SfxIniManager* _pIniManager; - -public: - TYPEINFO(); - SfxAppIniManagerProperty() - : _pIniManager(0) - {} - ~SfxAppIniManagerProperty(); - - SfxIniManager* GetIniManager() const { return _pIniManager; } - void SetIniManager( SfxIniManager *pIniManager ) - { _pIniManager = pIniManager; } -}; - - -#endif - diff --git a/svtools/inc/pch/precompiled_svtools.hxx b/svtools/inc/pch/precompiled_svtools.hxx index 440bd04dce36..cab81cac04ec 100644 --- a/svtools/inc/pch/precompiled_svtools.hxx +++ b/svtools/inc/pch/precompiled_svtools.hxx @@ -227,6 +227,7 @@ #include #include #include +#include #include #include #include diff --git a/svtools/inc/privsplt.hxx b/svtools/inc/privsplt.hxx deleted file mode 100644 index 50a500de8848..000000000000 --- a/svtools/inc/privsplt.hxx +++ /dev/null @@ -1,86 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: privsplt.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _SV_PRIVSPLT_HXX -#define _SV_PRIVSPLT_HXX - -#include - -enum PRIVSPLIT_DIRECTION {PRIVSPLIT_HORZ,PRIVSPLIT_VERT }; - -class SvPrivatSplit : public FixedLine -{ - private: - - Link aCtrModifiedLink; - BOOL aMovingFlag; - Pointer aWinPointer; - PRIVSPLIT_DIRECTION eAdrSplit; - short nOldX; - short nOldY; - short nNewX; - short nNewY; - short nMinPos; - short nMaxPos; - Range aXMovingRange; - Range aYMovingRange; - short nDeltaX; - short nDeltaY; - void ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ); - - protected: - virtual void MouseButtonDown( const MouseEvent& rMEvt ); - virtual void Tracking( const TrackingEvent& rTEvt ); - - public: - - SvPrivatSplit( Window* pWindow, const ResId& rResId,PRIVSPLIT_DIRECTION eAdrSplit); - - SvPrivatSplit( Window* pParent,PRIVSPLIT_DIRECTION eAdrSplit, WinBits nStyle = 0); - - virtual short GetDeltaX(); - virtual short GetDeltaY(); - - virtual void CtrModified(); - - void SetXRange(Range cRgeX); - void SetYRange(Range cRgeY); - - void MoveSplitTo(Point aPos); - - virtual void StateChanged( StateChangedType nType ); - virtual void DataChanged( const DataChangedEvent& rDCEvt ); - - void SetCtrModifiedHdl( const Link& rLink ) { aCtrModifiedLink = rLink; } - const Link& GetCtrModifiedHdl() const { return aCtrModifiedLink; } -}; - - -#endif diff --git a/svtools/inc/reginfo.hxx b/svtools/inc/reginfo.hxx deleted file mode 100644 index bb3596797c6e..000000000000 --- a/svtools/inc/reginfo.hxx +++ /dev/null @@ -1,65 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: reginfo.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#ifndef _REGINFO_HXX -#define _REGINFO_HXX - -struct RegInfo_Impl; - -#include - -class RegInfo -{ - - public: - - RegInfo(); - ~RegInfo(); - - const String& GetGroup() const { return aCurrentGroup; } - void SetAppGroup( const String& rGroup ); - void DeleteAppGroup( const String& rGroup ); - - String ReadKey( const String& rKey ) const; - String ReadKey( const String& rKey, const String& rDefault ) const; - void WriteKey( const String& rKey, const String& rValue ); - void DeleteKey( const String& rKey ); - String GetKeyName( USHORT nKey ) const; - String ReadKey( USHORT nKey ) const; - USHORT GetKeyCount() const; - - private: - - String aCurrentGroup; - RegInfo_Impl* pImp; - -}; - - -#endif diff --git a/svtools/inc/reqitem.hxx b/svtools/inc/reqitem.hxx deleted file mode 100644 index 32fdf4f066dc..000000000000 --- a/svtools/inc/reqitem.hxx +++ /dev/null @@ -1,68 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: reqitem.hxx,v $ - * $Revision: 1.5 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#ifndef _REQITEM_HXX -#define _REQITEM_HXX - -#include -#include - -#if _SOLAR__PRIVATE -#include -#else -#include -#endif - -// ----------------------------------------------------------------------- - -class SfxRequestItem: public SfxSetItem - -/** [Description] - - Represents a function call with optional arguments. -*/ - -{ -public: - TYPEINFO(); - SfxRequestItem(); - SfxRequestItem( USHORT nWhich, SvStream & ); - SfxRequestItem( const SfxRequestItem& ); - ~SfxRequestItem(); - - virtual int operator==( const SfxPoolItem& ) const; - virtual - virtual SfxPoolItem* Clone( SfxItemPool *pPool = 0 ) const; - virtual SfxPoolItem* Create(SvStream &, USHORT nItemVersion) const; - virtual SvStream& Store(SvStream &, USHORT nItemVersion ) const; -}; - - -#endif - diff --git a/svtools/inc/roadmap.hxx b/svtools/inc/roadmap.hxx index 8a6f75eb1428..14ed6abceed6 100644 --- a/svtools/inc/roadmap.hxx +++ b/svtools/inc/roadmap.hxx @@ -54,64 +54,8 @@ namespace svt typedef sal_Int32 ItemIndex; }; - class RoadmapImpl; - - - class ORoadmapIDHyperLabel : public FixedText - { - public: - ORoadmapIDHyperLabel( Window* _pParent, const ResId& _rId ); - ORoadmapIDHyperLabel( Window* _pParent, WinBits _nWinStyle = 0 ); - ~ORoadmapIDHyperLabel( ); - virtual void DataChanged( const DataChangedEvent& rDCEvt ); - }; - - class ORoadmapHyperLabel : public RoadmapTypes - { - private: - ORoadmapIDHyperLabel* mpIDLabel; - HyperLabel* mpDescHyperLabel; - - - public: - - ORoadmapHyperLabel( Window* _pParent, const ResId& _rId ); - ORoadmapHyperLabel( Window* _pParent, WinBits _nWinStyle = 0 ); - ~ORoadmapHyperLabel( ); - - void SetID( sal_Int16 _ID ); - sal_Int16 GetID() const; - - void SetIndex( sal_Int32 _Index ); - sal_Int32 GetIndex() const; - - void SetLabel( ::rtl::OUString _rText ); - ::rtl::OUString GetLabel( ); - - void SetLabelAndSize( ItemIndex _RMIndex, ::rtl::OUString _rText, const Size& rNewSize); - - void SetPosition( ORoadmapHyperLabel* OldHyperLabel ); - Point GetLogicalPosition(); - - void ToggleBackgroundColor( const Color& _rGBColor ); - void SetInteractive( sal_Bool _bInteractive ); - - void SetClickHdl( const Link& rLink ); - const Link& GetClickHdl() const; - void SetZOrder( ORoadmapHyperLabel* pRefRoadmapHyperLabel, USHORT nFlags ); - void Enable( BOOL bEnable = TRUE); - BOOL IsEnabled() const; - void GrabFocus(); - - void SetIDLabel(ORoadmapIDHyperLabel* _pIDLabel){mpIDLabel = _pIDLabel;}; - ORoadmapIDHyperLabel* GetIDLabel() const { return mpIDLabel;}; - - HyperLabel* GetDescriptionHyperLabel() const { return mpDescHyperLabel;}; - void SetDescriptionHyperLabel(HyperLabel* _pDescriptionHyperLabel){mpDescHyperLabel = _pDescriptionHyperLabel;}; - }; - - + class RoadmapItem; //===================================================================== //= Roadmap @@ -135,7 +79,7 @@ namespace svt void EnableRoadmapItem( ItemId _nItemId, sal_Bool _bEnable, ItemIndex _nStartIndex = 0 ); sal_Bool IsRoadmapItemEnabled( ItemId _nItemId, ItemIndex _nStartIndex = 0 ) const; - void ChangeRoadmapItemLabel( ItemId _nID, ::rtl::OUString sLabel, ItemIndex _nStartIndex = 0 ); + void ChangeRoadmapItemLabel( ItemId _nID, const ::rtl::OUString& sLabel, ItemIndex _nStartIndex = 0 ); ::rtl::OUString GetRoadmapItemLabel( ItemId _nID, ItemIndex _nStartIndex = 0 ); void ChangeRoadmapItemID( ItemId _nID, ItemId _NewID, ItemIndex _nStartIndex = 0 ); @@ -149,8 +93,8 @@ namespace svt ItemId GetItemID( ItemIndex _nIndex ) const; ItemIndex GetItemIndex( ItemId _nID ) const; - void InsertRoadmapItem( ItemIndex _Index, ::rtl::OUString _RoadmapItem, ItemId _nUniqueId, sal_Bool _bEnabled = sal_True ); - void ReplaceRoadmapItem( ItemIndex _Index, ::rtl::OUString _RoadmapItem, ItemId _nUniqueId, sal_Bool _bEnabled ); + void InsertRoadmapItem( ItemIndex _Index, const ::rtl::OUString& _RoadmapItem, ItemId _nUniqueId, sal_Bool _bEnabled = sal_True ); + void ReplaceRoadmapItem( ItemIndex _Index, const ::rtl::OUString& _RoadmapItem, ItemId _nUniqueId, sal_Bool _bEnabled ); void DeleteRoadmapItem( ItemIndex _nIndex ); ItemId GetCurrentRoadmapItemID() const; @@ -172,22 +116,20 @@ namespace svt private: DECL_LINK(ImplClickHdl, HyperLabel*); - ORoadmapHyperLabel* GetByIndex( ItemIndex _nItemIndex ); - const ORoadmapHyperLabel* GetByIndex( ItemIndex _nItemIndex ) const; + RoadmapItem* GetByIndex( ItemIndex _nItemIndex ); + const RoadmapItem* GetByIndex( ItemIndex _nItemIndex ) const; - ORoadmapHyperLabel* GetByID( ItemId _nID, ItemIndex _nStartIndex = 0 ); - const ORoadmapHyperLabel* GetByID( ItemId _nID, ItemIndex _nStartIndex = 0 ) const; - ORoadmapHyperLabel* GetPreviousHyperLabel( ItemIndex _Index); + RoadmapItem* GetByID( ItemId _nID, ItemIndex _nStartIndex = 0 ); + const RoadmapItem* GetByID( ItemId _nID, ItemIndex _nStartIndex = 0 ) const; + RoadmapItem* GetPreviousHyperLabel( ItemIndex _Index); void DrawHeadline(); void DeselectOldRoadmapItems(); ItemId GetNextAvailableItemId( ItemIndex _NewIndex ); ItemId GetPreviousAvailableItemId( ItemIndex _NewIndex ); - ORoadmapHyperLabel* GetByPointer(Window* pWindow); - void InitializeHyperLabelSize(); - ORoadmapHyperLabel* InsertHyperLabel( ItemIndex _Index, ::rtl::OUString _aStr, ItemId _RMID, sal_Bool _bEnabled = sal_True ); - void UpdatefollowingHyperLabels( ItemIndex _Index, sal_Int16 _nadd = 1); - void SetRoadmapLabel(ORoadmapHyperLabel* CurHyperLabel, sal_Int32 _nPrefix, String _sDescription); + RoadmapItem* GetByPointer(Window* pWindow); + RoadmapItem* InsertHyperLabel( ItemIndex _Index, const ::rtl::OUString& _aStr, ItemId _RMID, sal_Bool _bEnabled = sal_True ); + void UpdatefollowingHyperLabels( ItemIndex _Index ); }; //......................................................................... diff --git a/svtools/source/svrtf/rtfkeywd.hxx b/svtools/inc/rtfkeywd.hxx similarity index 100% rename from svtools/source/svrtf/rtfkeywd.hxx rename to svtools/inc/rtfkeywd.hxx diff --git a/svtools/source/svrtf/rtfout.hxx b/svtools/inc/rtfout.hxx similarity index 100% rename from svtools/source/svrtf/rtfout.hxx rename to svtools/inc/rtfout.hxx diff --git a/svtools/source/svrtf/rtftoken.h b/svtools/inc/rtftoken.h similarity index 100% rename from svtools/source/svrtf/rtftoken.h rename to svtools/inc/rtftoken.h diff --git a/svtools/inc/sectctr.hxx b/svtools/inc/sectctr.hxx deleted file mode 100644 index da73e7aed4a7..000000000000 --- a/svtools/inc/sectctr.hxx +++ /dev/null @@ -1,154 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: sectctr.hxx,v $ - * $Revision: 1.4 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _SV_SECTCTR_HXX -#define _SV_SECTCTR_HXX - -#include -#include - -class ImplSplitWindow; -class ScrollBar; -class ScrollBarBox; -class SvSection; - -#define SECTION_APPEND ((USHORT)0xFFFF) -#define SECTION_NOTFOUND ((USHORT)0xFFFF) - -#define WB_SECTION_STYLE WB_VSCROLL | WB_HSCROLL | WB_TABSTOP - -class SvSectionControl : public Control -{ -private: - - Window aSplitWinContainer; - ImplSplitWindow* pSplitWin; - ScrollBar* pVScrollBar; - ScrollBar* pHScrollBar; - ScrollBarBox* pScrollBarBox; - DockingWindow* pDummy; - long nRealHeight; - long nMaxHeight; - long nMinWidth; - Wallpaper aWallpaper; - - DECL_LINK( ScrollHdl, ScrollBar* ); - DECL_LINK( EndScrollHdl, ScrollBar* ); - - -protected: - - virtual void Resize(); - virtual void Paint( const Rectangle& rRect ); - virtual void StateChanged( StateChangedType nStateChange ); - virtual void DataChanged( const DataChangedEvent& rDCEvt ); - virtual void Command( const CommandEvent& rCEvt ); - virtual long PreNotify( NotifyEvent& rNEvt ); - virtual long Notify( NotifyEvent& rNEvt ); - virtual long KeyEventNotify( const KeyEvent& rKEvt ); - using Control::SetPosSizePixel; - virtual void SetPosSizePixel( long nX, long nY,long nWidth, long nHeight,USHORT nFlags); - - - - long CalcMaxHeight(); - long CalcRealHeight(); - long CalcSectionWidth(); - - void SetScrollBars(BOOL bVert,BOOL bHorz); - void ShowScrollBarBox(); - void UpdateScrollBars(); - - BOOL VScrollResize(Size &aSize); - BOOL HScrollResize(Size &aSize); - void SetChildPos(long nPos, BOOL bScrolling = TRUE); - -public: - SvSectionControl( Window* pParent,WinBits nStyle = WB_SECTION_STYLE); - SvSectionControl( Window* pParent, const ResId& rResId ); - ~SvSectionControl(); - - - void InsertSection( USHORT nSectionId,SvSection* pSection,long nSize,USHORT nPos); - void InsertSection( USHORT nSectionId,SvSection* pSection,USHORT nPos); - void RemoveSection( USHORT nSectionId ); - void Clear(); - - USHORT GetSectionCount() const; - USHORT GetSectionId( USHORT nPos ) const; - USHORT GetSectionPos( USHORT nSectionId ) const; - USHORT GetSectionId( const Point& rPos ) const; - - void SetSectionSize( USHORT nId, long nNewSize ); - long GetSectionSize( USHORT nId ) const; - - /* - void SetCurSectionId( USHORT nSectionId ); - USHORT GetCurSectionId() const; - - void SetFirstSectionId( USHORT nSectionId ); - USHORT GetFirstSectionId() const { return GetSectionId( mnFirstSectionPos ); } - - void MakeVisible( USHORT nSectionId ); - */ - - void SetSectionWidth( USHORT nSectionId, long nWidth); - long GetSectionWidth( USHORT nSectionId ) const; - - void SetSection( USHORT nSectionId, SvSection* pPage ); - SvSection* GetSection( USHORT nSectionId ) const; - - void SetSectionText( USHORT nSectionId, const XubString& rText ); - XubString GetSectionText( USHORT nSectionId ) const; - - void SetHelpText( USHORT nSectionId, const XubString& rText ); - const XubString& GetHelpText( USHORT nSectionId ) const; - - void SetHelpId( USHORT nSectionId, ULONG nHelpId ); - ULONG GetHelpId( USHORT nSectionId ) const; - - void SetHelpText( const XubString& rText ) - { Control::SetHelpText( rText ); } - const XubString& GetHelpText() const - { return Control::GetHelpText(); } - - void SetHelpId( ULONG nId ) - { Control::SetHelpId( nId ); } - ULONG GetHelpId() const - { return Control::GetHelpId(); } - - using Control::SetBackground; - void SetBackground( const Wallpaper& rBackground ){aWallpaper=rBackground; } - const Wallpaper& GetBackground() const { return aWallpaper; } - -}; - - -#endif diff --git a/svtools/inc/sfxecode.hxx b/svtools/inc/sfxecode.hxx index 100336796ea4..d87fff819748 100644 --- a/svtools/inc/sfxecode.hxx +++ b/svtools/inc/sfxecode.hxx @@ -84,6 +84,8 @@ #define ERRCODE_SFX_MACROS_SUPPORT_DISABLED (ERRCODE_WARNING_MASK | ERRCODE_AREA_SFX | ERRCODE_CLASS_NONE | 51) #define ERRCODE_SFX_DOCUMENT_MACRO_DISABLED (ERRCODE_WARNING_MASK | ERRCODE_AREA_SFX | ERRCODE_CLASS_NONE | 52) #define ERRCODE_SFX_BROKENSIGNATURE (ERRCODE_WARNING_MASK | ERRCODE_AREA_SFX | ERRCODE_CLASS_NONE | 53) +#define ERRCODE_SFX_SHARED_NOPASSWORDCHANGE (ERRCODE_WARNING_MASK | ERRCODE_AREA_SFX | ERRCODE_CLASS_NONE | 54) +#define ERRCODE_SFX_INCOMPLETE_ENCRYPTION (ERRCODE_WARNING_MASK | ERRCODE_AREA_SFX | ERRCODE_CLASS_NONE | 55) diff --git a/svtools/inc/svipcdef.h b/svtools/inc/svipcdef.h deleted file mode 100644 index ec944f92d0f0..000000000000 --- a/svtools/inc/svipcdef.h +++ /dev/null @@ -1,71 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: svipcdef.h,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _SVIPCDEF_H -#define _SVIPCDEF_H - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (WNT) || defined (WIN) -#define CDECL __cdecl -#elif defined CSET -#define CDECL _System -#else -#define CDECL -#endif - -#if defined WIN -#define _EXTLIBCALL_ _pascal -#else -#define _EXTLIBCALL_ CDECL -#endif - -typedef void (CDECL *IPCCallbackFunc)(void*); - -extern void _EXTLIBCALL_ IPCFreeMemory(void*); -extern short _EXTLIBCALL_ IPCGetStatus(void*); -extern short _EXTLIBCALL_ IPCInit(void); -extern void _EXTLIBCALL_ IPCDeInit(void); -extern void* _EXTLIBCALL_ IPCConnectServer(const char*, IPCCallbackFunc); -extern void _EXTLIBCALL_ IPCDisconnectServer(void *); -#ifdef WIN -extern long CDECL IPCCALLFUNCTION(void *,unsigned long,void *, - short,const char *, char, ...); -#else -extern long CDECL IPCCallFunction(void *,unsigned long,void *, - short,const char *, char, ...); -#endif -#ifdef __cplusplus -} -#endif - -#endif diff --git a/svtools/inc/svtools/accessibilityoptions.hxx b/svtools/inc/svtools/accessibilityoptions.hxx index 85b914354a3a..bde908fb1851 100644 --- a/svtools/inc/svtools/accessibilityoptions.hxx +++ b/svtools/inc/svtools/accessibilityoptions.hxx @@ -33,14 +33,14 @@ #include "svtools/svtdllapi.h" #include #include -#include -#include -#include +#include +#include +#include class SvtAccessibilityOptions_Impl; class SVT_DLLPUBLIC SvtAccessibilityOptions: - public svt::detail::Options, public SfxBroadcaster, private SfxListener + public utl::detail::Options, private SfxListener { private: static SvtAccessibilityOptions_Impl* volatile sm_pSingleImplConfig; diff --git a/svtools/inc/svtools/accessiblefactory.hxx b/svtools/inc/svtools/accessiblefactory.hxx index f7cad847edda..f4d8a03ef872 100644 --- a/svtools/inc/svtools/accessiblefactory.hxx +++ b/svtools/inc/svtools/accessiblefactory.hxx @@ -40,6 +40,7 @@ #endif #include "AccessibleBrowseBoxObjType.hxx" #include "accessibletableprovider.hxx" +#include "accessibletable.hxx" namespace com { namespace sun { namespace star { namespace accessibility { @@ -89,6 +90,11 @@ namespace svt const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxParent, IAccessibleTableProvider& _rBrowseBox ) const = 0; + virtual table::IAccessibleTableControl* + createAccessibleTableControl( + const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxParent, + table::IAccessibleTable& _rTable + ) const = 0; virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > createAccessibleIconChoiceCtrl( diff --git a/svtools/inc/svtools/accessibletable.hxx b/svtools/inc/svtools/accessibletable.hxx new file mode 100755 index 000000000000..0e3f08bfc568 --- /dev/null +++ b/svtools/inc/svtools/accessibletable.hxx @@ -0,0 +1,185 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: accessibletable.hxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _SVTOOLS_ACCESSIBLETABLE_HXX +#define _SVTOOLS_ACCESSIBLETABLE_HXX + +#include +#include +#include + +// ============================================================================ + +namespace svt{ namespace table +{ + +typedef sal_Int32 RowPos; + +// ============================================================================ + +enum AccessibleTableType +{ + /** Child index of the column header bar (first row). */ + TCINDEX_COLUMNHEADERBAR = 0, + /** Child index of the row header bar ("handle column"). */ + TCINDEX_ROWHEADERBAR = 1, + /** Child index of the data table. */ + TCINDEX_TABLE = 2 +}; + +enum AccessibleTableControlObjType +{ + TCTYPE_GRIDCONTROL, /// The GridControl itself. + TCTYPE_TABLE, /// The data table. + TCTYPE_ROWHEADERBAR, /// The row header bar. + TCTYPE_COLUMNHEADERBAR, /// The horizontal column header bar. + TCTYPE_TABLECELL, /// A cell of the data table. + TCTYPE_ROWHEADERCELL, /// A cell of the row header bar. + TCTYPE_COLUMNHEADERCELL, /// A cell of the column header bar. +}; + +// ============================================================================ + +#define XACC ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > + +/** This abstract class provides methods to implement an accessible table object. +*/ +class IAccessibleTable +{ +public: + /** @return The position of the current row. */ + virtual sal_Int32 GetCurrentRow() const = 0; + /** @return The position of the current column. */ + virtual sal_Int32 GetCurrentColumn() const = 0; + /** Creates and returns the accessible object of the whole GridControl. */ + virtual XACC CreateAccessible()= 0; + virtual XACC CreateAccessibleControl( sal_Int32 _nIndex )= 0; + virtual ::rtl::OUString GetAccessibleObjectName(AccessibleTableControlObjType eObjType, sal_Int32 _nRow, sal_Int32 _nCol) const= 0; + virtual sal_Bool GoToCell( sal_Int32 _nColumnPos, sal_Int32 _nRow )= 0; + virtual sal_Bool HasColHeader() = 0; + virtual sal_Bool HasRowHeader() = 0; + + /** return the description of the specified object. + @param eObjType + The type to ask for + @param _nPosition + The position of a tablecell (index position), header bar colum/row cell + @return + The description of the specified object. + */ + virtual ::rtl::OUString GetAccessibleObjectDescription(AccessibleTableControlObjType eObjType, sal_Int32 _nPosition = -1) const= 0; + + /** Fills the StateSet with all states (except DEFUNC and SHOWING, done by + the accessible object), depending on the specified object type. */ + virtual void FillAccessibleStateSet( + ::utl::AccessibleStateSetHelper& rStateSet, + AccessibleTableControlObjType eObjType ) const= 0; + + // Window + virtual Rectangle GetWindowExtentsRelative( Window *pRelativeWindow ) = 0; + virtual void GrabFocus()= 0; + virtual XACC GetAccessible( BOOL bCreate = TRUE )= 0; + virtual Window* GetAccessibleParentWindow() const= 0; + virtual Window* GetWindowInstance()= 0; + virtual sal_Int32 GetAccessibleControlCount() const = 0; + virtual sal_Bool ConvertPointToControlIndex( sal_Int32& _rnIndex, const Point& _rPoint )= 0; + virtual long GetRowCount() const= 0; + virtual long GetColumnCount() const= 0; + virtual sal_Bool HasRowHeader() const= 0; + virtual sal_Int32 GetSelectedRowCount() const= 0; + virtual bool IsRowSelected( long _nRow ) const= 0; + virtual sal_Bool ConvertPointToCellAddress( sal_Int32& _rnRow, sal_Int32& _rnColPos, const Point& _rPoint )= 0; + virtual Rectangle calcHeaderRect( sal_Bool _bIsColumnBar, BOOL _bOnScreen = TRUE ) = 0; + virtual Rectangle calcTableRect( BOOL _bOnScreen = TRUE ) = 0; + virtual Rectangle GetFieldCharacterBounds(sal_Int32 _nRow,sal_Int32 _nColumnPos,sal_Int32 nIndex)= 0; + virtual sal_Int32 GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint)= 0; + virtual void FillAccessibleStateSetForCell( ::utl::AccessibleStateSetHelper& _rStateSet, sal_Int32 _nRow, sal_uInt16 _nColumnPos ) const= 0; + virtual ::rtl::OUString GetRowDescription( sal_Int32 _nRow ) const = 0; + virtual ::rtl::OUString GetRowName(sal_Int32 _nIndex) const = 0; + virtual ::rtl::OUString GetColumnDescription( sal_uInt16 _nColumnPos ) const = 0; + virtual ::rtl::OUString GetColumnName( sal_Int32 _nIndex ) const = 0; + virtual ::rtl::OUString GetCellContent( sal_Int32 _nRowPos, sal_Int32 _nColPos) const = 0; + virtual std::vector& GetSelectedRows() = 0; +}; + +// ---------------------------------------------------------------------------- + +/** interface for an implementation of a table control's Accesible component +*/ +class IAccessibleTableControl +{ +public: + /** returns the XAccessible object itself + + The reference returned here can be used to control the life time of the + IAccessibleTableImplementation object. + + The returned reference is guaranteed to not be . + */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > + getMyself() = 0; + + /** disposes the accessible implementation, so that it becomes defunc + */ + virtual void dispose() = 0; + + /** checks whether the accessible implementation, and its context, are still alive + @return , if the object is not disposed or disposing. + */ + virtual sal_Bool isAlive() const = 0; + + /** returns the accessible object for the row or the column header bar + */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > + getTableHeader( ::svt::table::AccessibleTableControlObjType _eObjType ) = 0; + + /** returns the accessible object for the table representation + */ + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > + getTable() = 0; + + ///** Commits an event to all listeners. */ + virtual void commitEvent( + sal_Int16 nEventId, + const ::com::sun::star::uno::Any& rNewValue, + const ::com::sun::star::uno::Any& rOldValue + ) = 0; +}; + +// ---------------------------------------------------------------------------- + +// ============================================================================ +} // namespace table +} // namespace svt + +// ============================================================================ + +#endif // _SVTOOLS_ACCESSIBLETABLE_HXX + diff --git a/svtools/inc/svtools/addxmltostorageoptions.hxx b/svtools/inc/svtools/addxmltostorageoptions.hxx deleted file mode 100644 index 1704de8b1700..000000000000 --- a/svtools/inc/svtools/addxmltostorageoptions.hxx +++ /dev/null @@ -1,162 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: addxmltostorageoptions.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_ADDXMLTOSTORAGEOPTIONS_HXX -#define INCLUDED_SVTOOLS_ADDXMLTOSTORAGEOPTIONS_HXX - -//_________________________________________________________________________________________________________________ -// includes -//_________________________________________________________________________________________________________________ - -#include "svtools/svldllapi.h" -#include -#include -#include -#include - -//_________________________________________________________________________________________________________________ -// forward declarations -//_________________________________________________________________________________________________________________ - -/*-************************************************************************************************************//** - @short forward declaration to our private date container implementation - @descr We use these class as internal member to support small memory requirements. - You can create the container if it is neccessary. The class which use these mechanism - is faster and smaller then a complete implementation! -*//*-*************************************************************************************************************/ - -class SvtAddXMLToStorageOptions_Impl; - -//_________________________________________________________________________________________________________________ -// declarations -//_________________________________________________________________________________________________________________ - -/*-************************************************************************************************************//** - @short collect informations about security features - @descr - - - @implements - - @base - - - @devstatus ready to use -*//*-*************************************************************************************************************/ - -class SVL_DLLPUBLIC SvtAddXMLToStorageOptions: public svt::detail::Options -{ - //------------------------------------------------------------------------------------------------------------- - // public methods - //------------------------------------------------------------------------------------------------------------- - - public: - - //--------------------------------------------------------------------------------------------------------- - // constructor / destructor - //--------------------------------------------------------------------------------------------------------- - - /*-****************************************************************************************************//** - @short standard constructor and destructor - @descr This will initialize an instance with default values. - We implement these class with a refcount mechanism! Every instance of this class increase it - at create and decrease it at delete time - but all instances use the same data container! - He is implemented as a static member ... - - @seealso member m_nRefCount - @seealso member m_pDataContainer - - @param - - @return - - - @onerror - - *//*-*****************************************************************************************************/ - - SvtAddXMLToStorageOptions(); - virtual ~SvtAddXMLToStorageOptions(); - - //--------------------------------------------------------------------------------------------------------- - // interface - //--------------------------------------------------------------------------------------------------------- - - /*-****************************************************************************************************//** - @short interface methods to get value of config key - @descr - - @seealso - - - @param - @return The values which represent current state of internal variable. - - @onerror No error should occurre! - *//*-*****************************************************************************************************/ - - sal_Bool IsWriter_Add_XML_to_Storage() const; - sal_Bool IsCalc_Add_XML_to_Storage() const; - sal_Bool IsImpress_Add_XML_to_Storage() const; - sal_Bool IsDraw_Add_XML_to_Storage() const; - - //------------------------------------------------------------------------------------------------------------- - // private methods - //------------------------------------------------------------------------------------------------------------- - - private: - - /*-****************************************************************************************************//** - @short return a reference to a static mutex - @descr These class use his own static mutex to be threadsafe. - We create a static mutex only for one ime and use at different times. - - @seealso - - - @param - - @return A reference to a static mutex member. - - @onerror - - *//*-*****************************************************************************************************/ - - SVL_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); - - //------------------------------------------------------------------------------------------------------------- - // private member - //------------------------------------------------------------------------------------------------------------- - - private: - - /*Attention - - Don't initialize these static member in these header! - a) Double dfined symbols will be detected ... - b) and unresolved externals exist at linking time. - Do it in your source only. - */ - - static SvtAddXMLToStorageOptions_Impl* m_pDataContainer; /// impl. data container as dynamic pointer for smaller memory requirements! - static sal_Int32 m_nRefCount; /// internal ref count mechanism - -}; // class SvtAddXMLToStorageOptions - -#endif diff --git a/svtools/inc/svtools/bintitem.hxx b/svtools/inc/svtools/bintitem.hxx deleted file mode 100644 index 83119d9f3b18..000000000000 --- a/svtools/inc/svtools/bintitem.hxx +++ /dev/null @@ -1,88 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: bintitem.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _BINTITEM_HXX -#define _BINTITEM_HXX - -#include -#include -#include -#include - -#include - -class SfxArguments; -class SvStream; - -DBG_NAMEEX(SfxBigIntItem) - -class SfxBigIntItem: public SfxPoolItem -{ - BigInt aVal; - -public: - TYPEINFO(); - SfxBigIntItem(); - SfxBigIntItem(USHORT nWhich, const BigInt& rValue); - SfxBigIntItem(USHORT nWhich, SvStream &); - SfxBigIntItem(const SfxBigIntItem&); - ~SfxBigIntItem() { DBG_DTOR(SfxBigIntItem, 0); } - - virtual SfxItemPresentation GetPresentation( - SfxItemPresentation ePres, - SfxMapUnit eCoreMetric, - SfxMapUnit ePresMetric, - XubString &rText, - const IntlWrapper * = 0 ) const; - - virtual int operator==(const SfxPoolItem&) const; - using SfxPoolItem::Compare; - virtual int Compare(const SfxPoolItem &rWith) const; - virtual SfxPoolItem* Clone(SfxItemPool *pPool = 0) const; - virtual SfxPoolItem* Create(SvStream &, USHORT nVersion) const; - virtual SvStream& Store(SvStream &, USHORT nItemVersion) const; - - virtual BOOL PutValue ( const com::sun::star::uno::Any& rVal, - BYTE nMemberId = 0 ); - virtual BOOL QueryValue( com::sun::star::uno::Any& rVal, - BYTE nMemberId = 0 ) const; - - virtual SfxFieldUnit GetUnit() const; // FUNIT_NONE - - const BigInt& GetValue() const { return aVal; } - void SetValue(const BigInt& rNewVal) - { - DBG_ASSERT(GetRefCount() == 0, "SetValue() with pooled item"); - aVal = rNewVal; - } -}; - -#endif /* _BINTITEM_HXX */ - diff --git a/svtools/inc/svtools/colorcfg.hxx b/svtools/inc/svtools/colorcfg.hxx index 9a0d570e7cc0..dd3ba4018280 100644 --- a/svtools/inc/svtools/colorcfg.hxx +++ b/svtools/inc/svtools/colorcfg.hxx @@ -34,9 +34,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include //----------------------------------------------------------------------------- namespace svtools{ @@ -108,7 +108,7 @@ struct ColorConfigValue ---------------------------------------------------------------------------*/ class SVT_DLLPUBLIC ColorConfig: - public svt::detail::Options, public SfxBroadcaster, public SfxListener + public utl::detail::Options { friend class ColorConfig_Impl; private: @@ -117,12 +117,9 @@ public: ColorConfig(); virtual ~ColorConfig(); - virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); - // get the configured value - if bSmart is set the default color setting is provided // instead of the automatic color ColorConfigValue GetColorValue(ColorConfigEntry eEntry, sal_Bool bSmart = sal_True)const; - static Color GetDefaultColor(ColorConfigEntry eEntry); }; /* -----------------------------22.03.2002 15:31------------------------------ diff --git a/svtools/inc/svtools/cstitem.hxx b/svtools/inc/svtools/cstitem.hxx deleted file mode 100644 index 654ee9c15a75..000000000000 --- a/svtools/inc/svtools/cstitem.hxx +++ /dev/null @@ -1,94 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: cstitem.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _CSTITEM_HXX -#define _CSTITEM_HXX - -#include - -#include - -class SvStream; - -enum CrawlStatus -{ - CSTAT_NEVER_UPD = 0, /* noch nie ueberprueft */ - CSTAT_IN_UPD = 1, /* Ueberpruefung laeuft */ - CSTAT_UPD_NEWER = 2, /* wurde ueberprueft und ist neuer */ - CSTAT_UPD_NOT_NEWER = 3, /* wurde ueberprueft und ist nicht neuer */ - CSTAT_UPD_CANCEL = 4, /* Ueberpruefung vom Benutzer abgebrochen */ - CSTAT_ERR_GENERAL = 5, /* allgemeiner Fehler */ - CSTAT_ERR_NOTEXISTS = 6, /* Server existiert nicht */ - CSTAT_ERR_NOTREACHED = 7, /* Server nicht ereicht */ - CSTAT_UPD_IMMEDIATELY = 8, /* es wird gleich ueberprueftt */ - CSTAT_ERR_OFFLINE = 9 /* Ueberpruefung nicht m�glich, da Offline */ -}; - -DBG_NAMEEX(SfxCrawlStatusItem) - -// class SfxDateTimeRangeItem ------------------------------------------------- - -class SfxCrawlStatusItem : public SfxPoolItem -{ -private: - CrawlStatus eStatus; -public: - TYPEINFO(); - - SfxCrawlStatusItem( const SfxCrawlStatusItem& rCpy ); - SfxCrawlStatusItem( USHORT nWhich ); - SfxCrawlStatusItem( USHORT nWhich, CrawlStatus eStat ); - ~SfxCrawlStatusItem() { DBG_DTOR(SfxCrawlStatusItem, 0); } - - virtual int operator==( const SfxPoolItem& ) const; - using SfxPoolItem::Compare; - virtual int Compare( const SfxPoolItem &rWith ) const; - virtual SfxPoolItem* Create( SvStream&, USHORT nItemVersion ) const; - virtual SvStream& Store( SvStream&, USHORT nItemVersion ) const; - virtual SfxPoolItem* Clone( SfxItemPool* pPool = 0 ) const; - - virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres, - SfxMapUnit eCoreMetric, - SfxMapUnit ePresMetric, - XubString &rText, - const IntlWrapper * pIntlWrapper = 0 ) - const; - - CrawlStatus GetStatus() const { return eStatus; } - void SetStatus(CrawlStatus eNew) { eStatus = eNew; } - - virtual BOOL PutValue ( const com::sun::star::uno::Any& rVal, - BYTE nMemberId = 0 ); - virtual BOOL QueryValue( com::sun::star::uno::Any& rVal, - BYTE nMemberId = 0 ) const; -}; - -#endif - diff --git a/svtools/inc/svtools/dtritem.hxx b/svtools/inc/svtools/dtritem.hxx deleted file mode 100644 index 87666a306a43..000000000000 --- a/svtools/inc/svtools/dtritem.hxx +++ /dev/null @@ -1,93 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: dtritem.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _DTRITEM_HXX -#define _DTRITEM_HXX - -#include -#include - -#include - -class SvStream; - -DBG_NAMEEX(SfxDateTimeRangeItem) - -// class SfxDateTimeRangeItem ------------------------------------------------- - -class SfxDateTimeRangeItem : public SfxPoolItem -{ -private: - DateTime aStartDateTime; - DateTime aEndDateTime; - -public: - TYPEINFO(); - - SfxDateTimeRangeItem( const SfxDateTimeRangeItem& rCpy ); - SfxDateTimeRangeItem( USHORT nWhich ); - SfxDateTimeRangeItem( USHORT nWhich, const DateTime& rStartDT, - const DateTime& rEndDT ); - - ~SfxDateTimeRangeItem() - { DBG_DTOR(SfxDateTimeRangeItem, 0); } - - virtual int operator==( const SfxPoolItem& ) const; - using SfxPoolItem::Compare; - virtual int Compare( const SfxPoolItem &rWith ) const; - virtual SfxPoolItem* Create( SvStream&, USHORT nItemVersion ) const; - virtual SvStream& Store( SvStream&, USHORT nItemVersion ) const; - virtual SfxPoolItem* Clone( SfxItemPool* pPool = 0 ) const; - virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres, - SfxMapUnit eCoreMetric, - SfxMapUnit ePresMetric, - XubString &rText, - const IntlWrapper * pIntlWrapper = 0 ) - const; - - virtual BOOL PutValue ( const com::sun::star::uno::Any& rVal, - BYTE nMemberId = 0 ); - virtual BOOL QueryValue( com::sun::star::uno::Any& rVal, - BYTE nMemberId = 0 ) const; - - const DateTime& GetStartDateTime() const { return aStartDateTime; } - const DateTime& GetEndDateTime() const { return aEndDateTime; } - - void SetStartDateTime( const DateTime& rDT ) - { DBG_ASSERT( GetRefCount() == 0, "SetDateTime() with pooled item" ); - aStartDateTime = rDT; } - - void SetEndDateTime( const DateTime& rDT ) - { DBG_ASSERT( GetRefCount() == 0, "SetDateTime() with pooled item" ); - aEndDateTime = rDT; } -}; - -#endif - diff --git a/svtools/inc/svtools/editbrowsebox.hxx b/svtools/inc/svtools/editbrowsebox.hxx index c72c7c54f877..60fcbc9efb1a 100644 --- a/svtools/inc/svtools/editbrowsebox.hxx +++ b/svtools/inc/svtools/editbrowsebox.hxx @@ -675,6 +675,7 @@ namespace svt private: virtual void PaintField(OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId ) const; + using Control::ImplInitSettings; SVT_DLLPRIVATE void ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground ); SVT_DLLPRIVATE void DetermineFocus( const sal_uInt16 _nGetFocusFlags = 0); inline void HideAndDisable(CellControllerRef& rController); diff --git a/svtools/inc/svtools/embedhlp.hxx b/svtools/inc/svtools/embedhlp.hxx index 08fe3c7d162a..68763a3fd487 100644 --- a/svtools/inc/svtools/embedhlp.hxx +++ b/svtools/inc/svtools/embedhlp.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: embedhlp.hxx,v $ - * $Revision: 1.2 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -131,6 +128,14 @@ namespace svt BOOL is() const { return mxObj.is(); } BOOL IsChart() const; + + // #i104867# + // Provides a graphic version number for the fetchable Graphic during this object's lifetime. Internally, + // that number is incremented at each change of the Graphic. This mechanism is needed to identify if a + // remembered Graphic (e.g. primitives) has changed compared to the current one, but without actively + // fetching the Graphic what would be too expensive e.g. for charts + sal_uInt32 getGraphicVersion() const; + void SetDefaultSizeForChart( const Size& rSizeIn_100TH_MM );//#i103460# charts do not necessaryly have an own size within ODF files, in this case they need to use the size settings from the surrounding frame, which is made available with this method }; } diff --git a/svtools/inc/svtools/fmtfield.hxx b/svtools/inc/svtools/fmtfield.hxx index e2fe243f8399..27e9376ea1c7 100644 --- a/svtools/inc/svtools/fmtfield.hxx +++ b/svtools/inc/svtools/fmtfield.hxx @@ -33,7 +33,7 @@ #include "svtools/svtdllapi.h" #include -#include +#include //#define REGEXP_SUPPORT diff --git a/svtools/inc/svtools/frqitem.hxx b/svtools/inc/svtools/frqitem.hxx deleted file mode 100644 index 11b2d31a1123..000000000000 --- a/svtools/inc/svtools/frqitem.hxx +++ /dev/null @@ -1,178 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: frqitem.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _FRQITEM_HXX -#define _FRQITEM_HXX - -#include -#include -#include -#include - -#include - -class SvStream; - -DBG_NAMEEX(SfxFrequencyItem) - -// class SfxFrequencyItem ------------------------------------------------- - -/////////////////////////////////////////////////////////////////////////////// -/* -FRQ_DAILY - * jeden X'ten Tag - nInterval1 = 1 .. 999 - - * jeden Wochentag - nInterval1 = USHRT_MAX - -FRQ_WEEKLY - + wiederhole jede X'te Woche - nInterval1 = 1 .. 99 - - + an SU, MO, TU, WE, TH, FR, SA - nInterval2 = WD_SUNDAY | WD_MONDAY | WD_TUESDAY | WD_WEDNESDAY | - WD_THURSDAY | WD_FRIDAY | WD_SATURDAY - -FRQ_MONTHLY_DAILY - * jeden X'ten Tag von jedem X'ten Monat - nInterval1 = 1 .. 31 - nInterval2 = 1 .. 6 - -FRQ_MONTHLY_LOGIC - * jeden ersten, zweiten, dritten, vierten oder letzten Wochentag jeden X'ten Monats - nInterval1 = 0 .. 4 - nInterval2 = WD_SUNDAY | WD_MONDAY | WD_TUESDAY | WD_WEDNESDAY | - WD_THURSDAY | WD_FRIDAY | WD_SATURDAY - nInterval3 = 1 .. 6 - -=============================================================================== - -FRQ_TIME_AT - * Update um Uhrzeit - nTime1 = 00:00:00 - 24:00:00 - -FRQ_TIME_REPEAT - * Wiederhole alle X Stunden - nTInterval1 = 1 .. 8 - + zwischen Uhrzeit 1 und 2 - nTime1 = 00:00:00 - 24:00:00 - nTime2 = 00:00:00 - 24:00:00 - -*/ -/////////////////////////////////////////////////////////////////////////////// - -enum FrequencyMode -{ - FRQ_DAILY = 1, - FRQ_WEEKLY = 2, - FRQ_MONTHLY_DAILY = 3, - FRQ_MONTHLY_LOGIC = 4 -}; - -enum FrequencyTimeMode -{ - FRQ_TIME_AT = 1, - FRQ_TIME_REPEAT = 2, - FRQ_TIME_REPEAT_RANGE = 3 -}; - -#define WD_SUNDAY 0x0001 -#define WD_MONDAY 0x0002 -#define WD_TUESDAY 0x0004 -#define WD_WEDNESDAY 0x0008 -#define WD_THURSDAY 0x0010 -#define WD_FRIDAY 0x0020 -#define WD_SATURDAY 0x0040 - -class SfxFrequencyItem : public SfxPoolItem -{ -private: - FrequencyMode eFrqMode; - FrequencyTimeMode eFrqTimeMode; - - USHORT nDInterval1; - USHORT nDInterval2; - USHORT nDInterval3; - - USHORT nTInterval1; - Time aTime1; - Time aTime2; - - BOOL bMissingDate; - DateTime aMissingDate; - - Time _CalcTime( BOOL bForToday ) const; -public: - TYPEINFO(); - - SfxFrequencyItem( const SfxFrequencyItem& rCpy ); - SfxFrequencyItem( USHORT nWhich ); - SfxFrequencyItem( USHORT nWhich, FrequencyMode eMode, FrequencyTimeMode eTMode, - USHORT nDI1, USHORT nDI2, USHORT nDI3, USHORT nTI1, - const Time& rT1, const Time& rT2 ); - ~SfxFrequencyItem() { DBG_DTOR(SfxFrequencyItem, 0); } - - virtual int operator==( const SfxPoolItem& ) const; - using SfxPoolItem::Compare; - virtual int Compare( const SfxPoolItem &rWith ) const; - virtual SfxPoolItem* Create( SvStream&, USHORT nItemVersion ) const; - virtual SvStream& Store( SvStream&, USHORT nItemVersion ) const; - virtual SfxPoolItem* Clone( SfxItemPool* pPool = 0 ) const; - virtual SfxItemPresentation GetPresentation( SfxItemPresentation ePres, - SfxMapUnit eCoreMetric, SfxMapUnit ePresMetric, XubString &rText, - const IntlWrapper * = 0 ) const; - - DateTime CalcNextTick( const DateTime& rNow, BOOL bFirst = FALSE ); - - BOOL HasMissingDate() const { return bMissingDate; } - DateTime GetMissingDate() const { return aMissingDate; } - - FrequencyMode GetFrequencyMode() const { return eFrqMode; } - FrequencyTimeMode GetFrequencyTimeMode() const { return eFrqTimeMode; } - USHORT GetDInterval_1() const { return nDInterval1; } - USHORT GetDInterval_2() const { return nDInterval2; } - USHORT GetDInterval_3() const { return nDInterval3; } - USHORT GetTInterval_1() const { return nTInterval1; } - const Time& GetTime_1() const { return aTime1; } - const Time& GetTime_2() const { return aTime2; } - - void SetFrequencyMode(FrequencyMode eNew) { eFrqMode = eNew; } - void SetFrequencyTimeMode(FrequencyTimeMode eNew){ eFrqTimeMode = eNew; } - void SetDInterval_1(USHORT nNew) { nDInterval1 = nNew; } - void SetDInterval_2(USHORT nNew) { nDInterval2 = nNew; } - void SetDInterval_3(USHORT nNew) { nDInterval3 = nNew; } - void SetTInterval_1(USHORT nNew) { nTInterval1 = nNew; } - void SetTime_1(const Time& rNew) { aTime1 = rNew; } - void SetTime_2(const Time& rNew) { aTime2 = rNew; } -}; - -#endif - diff --git a/svtools/inc/svtools/helpid.hrc b/svtools/inc/svtools/helpid.hrc index efbb0d2628d9..937898f37af1 100644 --- a/svtools/inc/svtools/helpid.hrc +++ b/svtools/inc/svtools/helpid.hrc @@ -33,7 +33,7 @@ // include --------------------------------------------------------------- -#include +#include // Help-Ids -------------------------------------------------------------- diff --git a/svtools/inc/svtools/helpopt.hxx b/svtools/inc/svtools/helpopt.hxx index 7c8c322ec916..7a9a06b8bc5f 100644 --- a/svtools/inc/svtools/helpopt.hxx +++ b/svtools/inc/svtools/helpopt.hxx @@ -37,13 +37,13 @@ #define INCLUDED_LIST #endif #include -#include +#include typedef std::list< sal_Int32 > IdList; class SvtHelpOptions_Impl; -class SVT_DLLPUBLIC SvtHelpOptions: public svt::detail::Options +class SVT_DLLPUBLIC SvtHelpOptions: public utl::detail::Options { SvtHelpOptions_Impl* pImp; diff --git a/svtools/inc/svtools/htmlout.hxx b/svtools/inc/svtools/htmlout.hxx index 1f0b91c3c353..13df12b64ea9 100644 --- a/svtools/inc/svtools/htmlout.hxx +++ b/svtools/inc/svtools/htmlout.hxx @@ -34,7 +34,7 @@ #include "svtools/svtdllapi.h" #include #include -#include +#include class Color; class ImageMap; diff --git a/svtools/inc/svtools/hyperlabel.hxx b/svtools/inc/svtools/hyperlabel.hxx index c11568816158..939b1799c0de 100644 --- a/svtools/inc/svtools/hyperlabel.hxx +++ b/svtools/inc/svtools/hyperlabel.hxx @@ -75,26 +75,25 @@ namespace svt void SetIndex( sal_Int32 _Index ); sal_Int32 GetIndex() const; - void SetLabelAndSize( ::rtl::OUString _rText, const Size& rNewSize); - void SetLabel( ::rtl::OUString _rText ); + void SetLabel( const ::rtl::OUString& _rText ); sal_Int32 GetLogicWidth(); ::rtl::OUString GetLabel( ); - void SetHyperLabelPosition(sal_uInt16 XPos, sal_uInt16 YPos); - Point GetLogicalPosition(); - void ToggleBackgroundColor( const Color& _rGBColor ); void SetInteractive( sal_Bool _bInteractive ); void SetClickHdl( const Link& rLink ) { maClickHdl = rLink; } const Link& GetClickHdl() const { return maClickHdl; } + Size CalcMinimumSize( long nMaxWidth = 0 ) const; + private: DECL_LINK(ImplClickHdl, HyperLabel*); - sal_Bool ImplCalcMinimumSize(const Size& _rCompSize ); + private: + using FixedText::CalcMinimumSize; }; } diff --git a/svtools/inc/svtools/imapobj.hxx b/svtools/inc/svtools/imapobj.hxx index 3671bf50878c..b8da0e5c3ee8 100644 --- a/svtools/inc/svtools/imapobj.hxx +++ b/svtools/inc/svtools/imapobj.hxx @@ -33,7 +33,7 @@ #include "svtools/svtdllapi.h" #include -#include +#include class Point; class Rectangle; diff --git a/svtools/inc/svtools/insdlg.hxx b/svtools/inc/svtools/insdlg.hxx index 191c3db68397..9721d55761f0 100644 --- a/svtools/inc/svtools/insdlg.hxx +++ b/svtools/inc/svtools/insdlg.hxx @@ -38,7 +38,7 @@ #include #ifndef _OWNCONT_HXX -#include +#include #endif #include diff --git a/svtools/inc/svtools/loginerr.hxx b/svtools/inc/svtools/loginerr.hxx deleted file mode 100644 index f04e569b41e0..000000000000 --- a/svtools/inc/svtools/loginerr.hxx +++ /dev/null @@ -1,156 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: loginerr.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _LOGINERR_HXX -#define _LOGINERR_HXX - -#include -#include -#include - -//========================================================================= - -#define LOGINERROR_FLAG_SET_SAVE_PASSWORD 1 -#define LOGINERROR_FLAG_MODIFY_ACCOUNT 2 -#define LOGINERROR_FLAG_MODIFY_USER_NAME 4 -#define LOGINERROR_FLAG_PERSISTENT_PASSWORD 8 - -class LoginErrorInfo -{ -private: - String _aTitle; - String _aServer; - String _aAccount; - String _aUserName; - String _aPassword; - String _aPath; - String _aErrorText; - BYTE _nFlags; - USHORT _nRet; - -public: - LoginErrorInfo() - : _nFlags( LOGINERROR_FLAG_MODIFY_USER_NAME ), - _nRet( ERRCODE_BUTTON_CANCEL ) - { - } - - const String& GetTitle() const { return _aTitle; } - const String& GetServer() const { return _aServer; } - const String& GetAccount() const { return _aAccount; } - const String& GetUserName() const { return _aUserName; } - const String& GetPassword() const { return _aPassword; } - const String& GetPath() const { return _aPath; } - const String& GetErrorText() const { return _aErrorText; } - BOOL GetIsPersistentPassword() const - { return ( _nFlags & LOGINERROR_FLAG_PERSISTENT_PASSWORD ); } - BOOL GetIsSavePassword() const - { return ( _nFlags & LOGINERROR_FLAG_SET_SAVE_PASSWORD ); } - BYTE GetFlags() const { return _nFlags; } - USHORT GetResult() const { return _nRet; } - - void SetTitle( const String& aTitle ) - { _aTitle = aTitle; } - void SetServer( const String& aServer ) - { _aServer = aServer; } - void SetAccount( const String& aAccount ) - { _aAccount = aAccount; } - void SetUserName( const String& aUserName ) - { _aUserName = aUserName; } - void SetPassword( const String& aPassword ) - { _aPassword = aPassword; } - void SetPath( const String& aPath ) - { _aPath = aPath; } - void SetErrorText( const String& aErrorText ) - { _aErrorText = aErrorText; } - void SetFlags( BYTE nFlags ) - { _nFlags = nFlags; } - inline void SetSavePassword( BOOL bSet ); - inline void SetPersistentPassword( BOOL bSet ); - inline void SetModifyAccount( BOOL bSet ); - inline void SetModifyUserName( BOOL bSet ); - void SetResult( USHORT nRet ) - { _nRet = nRet; } -}; - -inline void LoginErrorInfo::SetSavePassword( BOOL bSet ) -{ - if ( bSet ) - _nFlags |= LOGINERROR_FLAG_SET_SAVE_PASSWORD; - else - _nFlags &= ~LOGINERROR_FLAG_SET_SAVE_PASSWORD; -} - -inline void LoginErrorInfo::SetPersistentPassword( BOOL bSet ) -{ - if ( bSet ) - _nFlags |= LOGINERROR_FLAG_PERSISTENT_PASSWORD; - else - _nFlags &= ~LOGINERROR_FLAG_PERSISTENT_PASSWORD; -} - -inline void LoginErrorInfo::SetModifyAccount( BOOL bSet ) -{ - if ( bSet ) - _nFlags |= LOGINERROR_FLAG_MODIFY_ACCOUNT; - else - _nFlags &= ~LOGINERROR_FLAG_MODIFY_ACCOUNT; -} - -inline void LoginErrorInfo::SetModifyUserName( BOOL bSet ) -{ - if ( bSet ) - _nFlags |= LOGINERROR_FLAG_MODIFY_USER_NAME; - else - _nFlags &= ~LOGINERROR_FLAG_MODIFY_USER_NAME; -} - -//========================================================================= - -class CntLoginErrorHint : public SfxHint -{ -private: - LoginErrorInfo* _pInfo; - - CntLoginErrorHint( const CntLoginErrorHint& ); // n.i. - CntLoginErrorHint& operator=( const CntLoginErrorHint& ); // n.i. - -public: - TYPEINFO(); - - CntLoginErrorHint( LoginErrorInfo* pInfo ) - : _pInfo( pInfo ) - { - } - - LoginErrorInfo& GetErrorInfo() const { return *_pInfo; } -}; - -#endif diff --git a/svtools/inc/svtools/menuoptions.hxx b/svtools/inc/svtools/menuoptions.hxx index 1d93d9068e1c..2bc5588519c2 100644 --- a/svtools/inc/svtools/menuoptions.hxx +++ b/svtools/inc/svtools/menuoptions.hxx @@ -34,10 +34,10 @@ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "svtools/svtdllapi.h" #include #include -#include +#include //_________________________________________________________________________________________________________________ // forward declarations @@ -67,7 +67,7 @@ class SvtMenuOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtMenuOptions: public svt::detail::Options +class SVT_DLLPUBLIC SvtMenuOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public methods @@ -98,8 +98,8 @@ class SVL_DLLPUBLIC SvtMenuOptions: public svt::detail::Options SvtMenuOptions(); virtual ~SvtMenuOptions(); - void AddListener( const Link& rLink ); - void RemoveListener( const Link& rLink ); + void AddListenerLink( const Link& rLink ); + void RemoveListenerLink( const Link& rLink ); //--------------------------------------------------------------------------------------------------------- // interface //--------------------------------------------------------------------------------------------------------- @@ -148,7 +148,7 @@ class SVL_DLLPUBLIC SvtMenuOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); + SVT_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member diff --git a/svtools/inc/svtools/miscopt.hxx b/svtools/inc/svtools/miscopt.hxx index 1b81bb8a5fc9..556dd7f0cc7e 100644 --- a/svtools/inc/svtools/miscopt.hxx +++ b/svtools/inc/svtools/miscopt.hxx @@ -39,7 +39,7 @@ #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // forward declarations @@ -71,7 +71,7 @@ class Link; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVT_DLLPUBLIC SvtMiscOptions: public svt::detail::Options +class SVT_DLLPUBLIC SvtMiscOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public methods @@ -102,8 +102,8 @@ class SVT_DLLPUBLIC SvtMiscOptions: public svt::detail::Options SvtMiscOptions(); virtual ~SvtMiscOptions(); - void AddListener( const Link& rLink ); - void RemoveListener( const Link& rLink ); + void AddListenerLink( const Link& rLink ); + void RemoveListenerLink( const Link& rLink ); //--------------------------------------------------------------------------------------------------------- // interface diff --git a/svtools/inc/svtools/optionsdrawinglayer.hxx b/svtools/inc/svtools/optionsdrawinglayer.hxx index e0b287002f34..18ce9c65e897 100644 --- a/svtools/inc/svtools/optionsdrawinglayer.hxx +++ b/svtools/inc/svtools/optionsdrawinglayer.hxx @@ -35,7 +35,7 @@ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "svtools/svtdllapi.h" #include #include #include @@ -68,7 +68,7 @@ class SvtOptionsDrawinglayer_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtOptionsDrawinglayer +class SVT_DLLPUBLIC SvtOptionsDrawinglayer { //------------------------------------------------------------------------------------------------------------- // public methods @@ -190,6 +190,15 @@ class SVL_DLLPUBLIC SvtOptionsDrawinglayer void SetQuadratic3DRenderLimit(sal_uInt32 nNew); void SetQuadraticFormControlRenderLimit(sal_uInt32 nNew); + // #i97672# selection settings + sal_Bool IsTransparentSelection() const; + sal_uInt16 GetTransparentSelectionPercent() const; + sal_uInt16 GetSelectionMaximumLuminancePercent() const; + + void SetTransparentSelection( sal_Bool bState ); + void SetTransparentSelectionPercent( sal_uInt16 nPercent ); + void SetSelectionMaximumLuminancePercent( sal_uInt16 nPercent ); + //------------------------------------------------------------------------------------------------------------- // private methods //------------------------------------------------------------------------------------------------------------- @@ -208,7 +217,7 @@ class SVL_DLLPUBLIC SvtOptionsDrawinglayer @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); + SVT_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member diff --git a/svtools/inc/svtools/parhtml.hxx b/svtools/inc/svtools/parhtml.hxx index d129a8c14595..e1eb53c6e052 100644 --- a/svtools/inc/svtools/parhtml.hxx +++ b/svtools/inc/svtools/parhtml.hxx @@ -34,12 +34,20 @@ #include "svtools/svtdllapi.h" #include #include -#include +#include #include + +namespace com { namespace sun { namespace star { + namespace document { + class XDocumentProperties; + } +} } } + class Color; class SvNumberFormatter; class SvULongs; +class SvKeyValueIterator; #define HTMLFONTSZ1_DFLT 7 #define HTMLFONTSZ2_DFLT 10 @@ -224,6 +232,28 @@ public: // virtual void RestoreState(); virtual void Continue( int nToken ); + +protected: + + static rtl_TextEncoding GetEncodingByMIME( const String& rMime ); + + /// template method: called when ParseMetaOptions adds a user-defined meta + virtual void AddMetaUserDefined( ::rtl::OUString const & i_rMetaName ); + +private: + /// parse meta options into XDocumentProperties and encoding + bool ParseMetaOptionsImpl( const ::com::sun::star::uno::Reference< + ::com::sun::star::document::XDocumentProperties>&, + SvKeyValueIterator*, + const HTMLOptions*, + rtl_TextEncoding& rEnc ); + +public: + /// overriding method must call this implementation! + virtual bool ParseMetaOptions( const ::com::sun::star::uno::Reference< + ::com::sun::star::document::XDocumentProperties>&, + SvKeyValueIterator* ); + // Ist der uebergebene 0-terminierte String (vermutlich) der Anfang // eines HTML-Files? Er sollte mind. 80 Zeichen lang sein. // Mit Ausnahme des Falls, dass SwitchToUCS2==FALSE und diff --git a/svtools/inc/svtools/parrtf.hxx b/svtools/inc/svtools/parrtf.hxx index 94e81e798bdf..1882b127ae90 100644 --- a/svtools/inc/svtools/parrtf.hxx +++ b/svtools/inc/svtools/parrtf.hxx @@ -33,7 +33,7 @@ #include "svtools/svtdllapi.h" #include -#include +#include struct RtfParserState_Impl { diff --git a/svtools/inc/svtools/printoptions.hxx b/svtools/inc/svtools/printoptions.hxx index b00c27f94130..15147b21b62e 100644 --- a/svtools/inc/svtools/printoptions.hxx +++ b/svtools/inc/svtools/printoptions.hxx @@ -35,7 +35,7 @@ #include #include #include -#include +#include class SvtPrintOptions_Impl; @@ -45,7 +45,7 @@ class SvtPrintOptions_Impl; class PrinterOptions; -class SVT_DLLPUBLIC SvtBasePrintOptions: public svt::detail::Options +class SVT_DLLPUBLIC SvtBasePrintOptions: public utl::detail::Options { protected: diff --git a/svtools/inc/svtools/section.hxx b/svtools/inc/svtools/section.hxx deleted file mode 100644 index 48941d06b7ca..000000000000 --- a/svtools/inc/svtools/section.hxx +++ /dev/null @@ -1,104 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: section.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _SV_SECTION_HXX -#define _SV_SECTION_HXX - -#include -#include -#include -#include -#include -#include - -class SvSectionControl; - -class SvSection : public DockingWindow -{ -private: - SvSectionControl* pSectionControl; - USHORT nSectionID; - Window* pChildWin; - XubString aName; - long nHeight; - long nMinHeight; - long nMinWidth; - long nOldHeight; - - DECL_LINK( ToggleHdl, SvExpander* ); - DECL_LINK( SplitHdl, SvPrivatSplit* ); - - void ImplExpandSection(); - void ImplShrinkSection(); - -protected: - SvExpander aExpander; - Window aChildWinContainer; - SvPrivatSplit aPrivatSplit; - - virtual void Resize(); - virtual void Paint( const Rectangle& rRect ); - virtual long Notify( NotifyEvent& rNEvt ); - -public: - SvSection(const XubString& rName,SvSectionControl* pParent, - WinBits nStyle = 0); - SvSection(const XubString& rName,SvSectionControl* pParent, - Window* pChildWin, WinBits nStyle = 0); - - virtual void SetScrollPos(long nPos); - void SetChildPos(long nPos); - - void SetSectionControl(SvSectionControl* pParent); - const SvSectionControl* GetSectionControl()const ; - void SetSectionText( const XubString& ); - const XubString& GetSectionText() const {return aName;} - - void SetChildWin(Window* pChildWin); - Window* GetChildWin() const {return pChildWin;} - - void SetSectionID(USHORT nId) {nSectionID=nId;} - USHORT GetSectionID() const {return nSectionID;} - - void SetMaxHeight(long nHeight); - long GetMaxHeight(); - - void SetMinHeight(long nHeight); - long GetMinHeight(); - - void SetMinWidth(long nWidth); - long GetMinWidth(); - - void ExpandSection(); - void ShrinkSection(); - BOOL IsExpanded(); -}; - -#endif diff --git a/svtools/inc/svtools/svlbox.hxx b/svtools/inc/svtools/svlbox.hxx index ba119263eff8..a7f385941fc6 100644 --- a/svtools/inc/svtools/svlbox.hxx +++ b/svtools/inc/svtools/svlbox.hxx @@ -52,7 +52,7 @@ #include #include #include -#include +#include #include class Application; @@ -328,6 +328,9 @@ protected: // wird an der Target-View aufgerufen (im Drop-Handler) virtual void ReadDragServerInfo( const Point&,SvLBoxDDInfo* ); + // invalidate children on enable/disable + virtual void StateChanged( StateChangedType ); + virtual ULONG Insert( SvLBoxEntry* pEnt,SvLBoxEntry* pPar,ULONG nPos=LIST_APPEND); virtual ULONG Insert( SvLBoxEntry* pEntry,ULONG nRootPos = LIST_APPEND ); void InsertTree( SvLBoxEntry* pTree, SvLBoxEntry* pTarget) {pModel->InsertTree( pTree, pTarget ); } diff --git a/svtools/inc/svtools/svmedit.hxx b/svtools/inc/svtools/svmedit.hxx index b1e0d368c9ba..ccf77299965c 100644 --- a/svtools/inc/svtools/svmedit.hxx +++ b/svtools/inc/svtools/svmedit.hxx @@ -61,6 +61,7 @@ protected: void DataChanged( const DataChangedEvent& rDCEvt ); virtual long PreNotify( NotifyEvent& rNEvt ); long Notify( NotifyEvent& rNEvt ); + using Control::ImplInitSettings; void ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ); WinBits ImplInitStyle( WinBits nStyle ); diff --git a/svtools/inc/svtools/svparser.hxx b/svtools/inc/svtools/svparser.hxx index d63777d05b1b..96c1aadc6319 100644 --- a/svtools/inc/svtools/svparser.hxx +++ b/svtools/inc/svtools/svparser.hxx @@ -37,6 +37,7 @@ #include #include #include +#include struct SvParser_Impl; @@ -204,6 +205,84 @@ inline USHORT SvParser::GetCharSize() const { return (RTL_TEXTENCODING_UCS2 == eSrcEnc) ? 2 : 1; } + + +/*======================================================================== + * + * SvKeyValue. + * + *======================================================================*/ + +SV_DECL_REF(SvKeyValueIterator) + +class SvKeyValue +{ + /** Representation. + */ + String m_aKey; + String m_aValue; + +public: + /** Construction. + */ + SvKeyValue (void) + {} + + SvKeyValue (const String &rKey, const String &rValue) + : m_aKey (rKey), m_aValue (rValue) + {} + + SvKeyValue (const SvKeyValue &rOther) + : m_aKey (rOther.m_aKey), m_aValue (rOther.m_aValue) + {} + + /** Assignment. + */ + SvKeyValue& operator= (SvKeyValue &rOther) + { + m_aKey = rOther.m_aKey; + m_aValue = rOther.m_aValue; + return *this; + } + + /** Operation. + */ + const String& GetKey (void) const { return m_aKey; } + const String& GetValue (void) const { return m_aValue; } + + void SetKey (const String &rKey ) { m_aKey = rKey; } + void SetValue (const String &rValue) { m_aValue = rValue; } +}; + +/*======================================================================== + * + * SvKeyValueIterator. + * + *======================================================================*/ +class SvKeyValueList_Impl; +class SVT_DLLPUBLIC SvKeyValueIterator : public SvRefBase, + private boost::noncopyable +{ + /** Representation. + */ + SvKeyValueList_Impl* m_pList; + USHORT m_nPos; + +public: + /** Construction/Destruction. + */ + SvKeyValueIterator (void); + virtual ~SvKeyValueIterator (void); + + /** Operation. + */ + virtual BOOL GetFirst (SvKeyValue &rKeyVal); + virtual BOOL GetNext (SvKeyValue &rKeyVal); + virtual void Append (const SvKeyValue &rKeyVal); +}; + +SV_IMPL_REF(SvKeyValueIterator); + #endif //_SVPARSER_HXX /* vi:set tabstop=4 shiftwidth=4 expandtab: */ diff --git a/svtools/inc/svtools/svtdata.hxx b/svtools/inc/svtools/svtdata.hxx index c929faad3d13..b1cc8136ef68 100644 --- a/svtools/inc/svtools/svtdata.hxx +++ b/svtools/inc/svtools/svtdata.hxx @@ -32,34 +32,22 @@ #define _SVTOOLS_SVTDATA_HXX #include -#include +#include class ResMgr; class SfxItemDesruptorList_Impl; -class SfxItemPool; -class Twain; //============================================================================ class ImpSvtData { public: - Twain * pTwain; - const SfxItemPool * pStoringPool; SfxItemDesruptorList_Impl * pItemDesruptList; - ResMgr * pResMgr; ResMgr * pPatchResMgr; - void* m_pThreadsafeRMs; - // one SimpleResMgr for each language for which a resource was requested - // (When using the 'non-simple' resmgr, the first request for any language wins, any - // further request for any other language supply the resmgr of the first call. - // For the simple resmgr we have a mgr for each language ever requested). - private: ImpSvtData(): - pTwain(0), pStoringPool(0), pItemDesruptList(0), pResMgr(0), - pPatchResMgr(NULL), m_pThreadsafeRMs(NULL) + pItemDesruptList(0), pResMgr(0), pPatchResMgr(0) {} ~ImpSvtData(); @@ -67,13 +55,9 @@ private: public: ResMgr * GetResMgr(const ::com::sun::star::lang::Locale aLocale); ResMgr * GetResMgr(); // VCL dependant, only available in SVT, not in SVL! - ResMgr * GetPatchResMgr(); ResMgr * GetPatchResMgr(const ::com::sun::star::lang::Locale& aLocale); - - SimpleResMgr * GetSimpleRM(const ::com::sun::star::lang::Locale& rLocale); - static ImpSvtData & GetSvtData(); }; @@ -100,18 +84,5 @@ public: // VCL dependant, only available in SVT, not in SVL! }; -//============================================================================ -class SvtSimpleResId -{ - String m_sValue; - -public: - SvtSimpleResId(USHORT nId, const ::com::sun::star::lang::Locale aLocale) : m_sValue(ImpSvtData::GetSvtData().GetSimpleRM(aLocale)->ReadString(nId)) { }; - - operator String () const { return m_sValue; } -}; - - - #endif // _SVTOOLS_SVTDATA_HXX diff --git a/svtools/inc/svtools/syntaxhighlight.hxx b/svtools/inc/svtools/syntaxhighlight.hxx index e2b575c7e085..c9680821affc 100644 --- a/svtools/inc/svtools/syntaxhighlight.hxx +++ b/svtools/inc/svtools/syntaxhighlight.hxx @@ -40,7 +40,7 @@ #include #include -#include +#include #include @@ -60,7 +60,7 @@ #include #include -#include +#include // Token-Typen TT_... @@ -137,7 +137,7 @@ class SimpleTokenizer_Impl String getTokStr( /*out*/const sal_Unicode* pStartPos, /*out*/const sal_Unicode* pEndPos ); -#ifndef PRODUCT +#ifdef DBG_UTIL // TEST: Token ausgeben String getFullTokenStr( /*out*/TokenTypes eType, /*out*/const sal_Unicode* pStartPos, /*out*/const sal_Unicode* pEndPos ); diff --git a/svtools/inc/svtools/table/abstracttablecontrol.hxx b/svtools/inc/svtools/table/abstracttablecontrol.hxx new file mode 100644 index 000000000000..03bc0a999f7a --- /dev/null +++ b/svtools/inc/svtools/table/abstracttablecontrol.hxx @@ -0,0 +1,130 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef SVTOOLS_INC_TABLE_ABSTRACTTABLECONTROL_HXX +#define SVTOOLS_INC_TABLE_ABSTRACTTABLECONTROL_HXX + +#include +#include +#include +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + + enum TableControlAction + { + /// moves the cursor in the table control one row up, if possible, by keeping the current column + cursorUp, + /// moves the cursor in the table control one row down, if possible, by keeping the current column + cursorDown, + /// moves the cursor in the table control one column to the left, if possible, by keeping the current row + cursorLeft, + /// moves the cursor in the table control one column to the right, if possible, by keeping the current row + cursorRight, + /// moves the cursor to the beginning of the current line + cursorToLineStart, + /// moves the cursor to the end of the current line + cursorToLineEnd, + /// moves the cursor to the first row, keeping the current column + cursorToFirstLine, + /// moves the cursor to the last row, keeping the current column + cursorToLastLine, + /// moves the cursor one page up, keeping the current column + cursorPageUp, + /// moves the cursor one page down, keeping the current column + cursorPageDown, + /// moves the cursor to the top-most, left-most cell + cursorTopLeft, + /// moves the cursor to the bottom-most, right-most cell + cursorBottomRight, + /// selects the row, where the actual cursor is + cursorSelectRow, + /// selects the rows, above the actual cursor is + cursorSelectRowUp, + /// selects the row, beneath the actual cursor is + cursorSelectRowDown, + /// selects the row, from the actual cursor till top + cursorSelectRowAreaTop, + /// selects the row, from the actual cursor till bottom + cursorSelectRowAreaBottom, + + + /// invalid and final enumeration value, not to be actually used + invalidTableControlAction + }; + + //==================================================================== + //= IAbstractTableControl + //==================================================================== + /** defines a callback interface to be implemented by a concrete table control + */ + class SAL_NO_VTABLE IAbstractTableControl + { + public: + /** hides the cell cursor + + The method cares for successive calls, that is, for every call to + ->hideCursor(), you need one call to ->showCursor. Only if the number + of both calls matches, the cursor is really shown. + + @see showCursor + */ + virtual void hideCursor() = 0; + + /** shows the cell cursor + + @see hideCursor + */ + virtual void showCursor() = 0; + + /** dispatches an action to the table control + + @return + if the action could be dispatched successfully, otherwise. Usual + failure conditions include some other instance vetoing the action, or impossibility + to execute the action at all (for instance moving up one row when already positioned + on the very first row). + + @see TableControlAction + */ + virtual bool dispatchAction( TableControlAction _eAction ) = 0; + /** to be called on mouse button up/down + @return + if the click was in the visible area of the table control, + otherwise.*/ + virtual bool isClickInVisibleArea( const Point& _rPoint ) = 0; + /** returns selection engine*/ + virtual SelectionEngine* getSelEngine() = 0; + virtual void setCursorAtCurrentCell(const Point& rPoint) = 0; + + virtual ~IAbstractTableControl() {}; + }; + +//........................................................................ +} } // namespace svt::table +//........................................................................ + +#endif // SVTOOLS_INC_TABLE_ABSTRACTTABLECONTROL_HXX diff --git a/svtools/inc/svtools/table/defaultinputhandler.hxx b/svtools/inc/svtools/table/defaultinputhandler.hxx new file mode 100644 index 000000000000..eb1c14b43a85 --- /dev/null +++ b/svtools/inc/svtools/table/defaultinputhandler.hxx @@ -0,0 +1,67 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef SVTOOLS_INC_TABLE_DEFAULTINPUTHANDLER_HXX +#define SVTOOLS_INC_TABLE_DEFAULTINPUTHANDLER_HXX + +#include + +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + + struct DefaultInputHandler_Impl; + + //==================================================================== + //= DefaultInputHandler + //==================================================================== + class DefaultInputHandler : public ITableInputHandler + { + friend class TableDataWindow; + private: + DefaultInputHandler_Impl* m_pImpl; + + public: + DefaultInputHandler(); + ~DefaultInputHandler(); + + virtual bool MouseMove ( IAbstractTableControl& _rControl, const MouseEvent& rMEvt ); + virtual bool MouseButtonDown ( IAbstractTableControl& _rControl, const MouseEvent& rMEvt ); + virtual bool MouseButtonUp ( IAbstractTableControl& _rControl, const MouseEvent& rMEvt ); + virtual bool KeyInput ( IAbstractTableControl& _rControl, const KeyEvent& rKEvt ); + virtual bool GetFocus ( IAbstractTableControl& _rControl ); + virtual bool LoseFocus ( IAbstractTableControl& _rControl ); + virtual bool RequestHelp ( IAbstractTableControl& _rControl, const HelpEvent& rHEvt ); + virtual bool Command ( IAbstractTableControl& _rControl, const CommandEvent& rCEvt ); + virtual bool PreNotify ( IAbstractTableControl& _rControl, NotifyEvent& rNEvt ); + virtual bool Notify ( IAbstractTableControl& _rControl, NotifyEvent& rNEvt ); + }; + +//........................................................................ +} } // namespace svt::table +//........................................................................ + +#endif // SVTOOLS_INC_TABLE_DEFAULTINPUTHANDLER_HXX diff --git a/svtools/inc/svtools/table/gridtablerenderer.hxx b/svtools/inc/svtools/table/gridtablerenderer.hxx new file mode 100644 index 000000000000..a935f6b7386e --- /dev/null +++ b/svtools/inc/svtools/table/gridtablerenderer.hxx @@ -0,0 +1,103 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef SVTOOLS_INC_TABLE_GRIDTABLERENDERER_HXX +#define SVTOOLS_INC_TABLE_GRIDTABLERENDERER_HXX + +#include + +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + + struct GridTableRenderer_Impl; + + //==================================================================== + //= GridTableRenderer + //==================================================================== + /** a default implementation for the ->ITableRenderer interface + + This class is able to paint a table grid, table headers, and cell + backgrounds according to the selected/active state of cells. + + TODO update the documentation when it's decided whether this renderer + also does value handling + */ + class GridTableRenderer : public ITableRenderer + { + private: + GridTableRenderer_Impl* m_pImpl; + + public: + /** creates a table renderer associated with the given model + + @param _rModel + the model which should be rendered. The caller is responsible + for lifetime control, that is, the model instance must live + at least as long as the renderer instance lives + */ + GridTableRenderer( ITableModel& _rModel ); + ~GridTableRenderer(); + + /** returns the index of the row currently being painted + + According to the ->ITableRenderer interface, one call is made + to the renderer with a row to prepare (->PrepareRow()), and subsequent + calls do not carry the row index anymore, but are relative to the + row which has previously been prepared. + + This method returns the index of the last row which has been prepared + */ + RowPos getCurrentRow(); + + protected: + // ITableRenderer overridables + virtual void PaintHeaderArea( + OutputDevice& _rDevice, const Rectangle& _rArea, + bool _bIsColHeaderArea, bool _bIsRowHeaderArea, + const StyleSettings& _rStyle ); + virtual void PaintColumnHeader( ColPos _nCol, bool _bActive, bool _bSelected, + OutputDevice& _rDevice, const Rectangle& _rArea, + const StyleSettings& _rStyle ); + virtual void PrepareRow( RowPos _nRow, bool _bActive, bool _bSelected, + OutputDevice& _rDevice, const Rectangle& _rRowArea, + const StyleSettings& _rStyle ); + virtual void PaintRowHeader( + bool _bActive, bool _bSelected, + OutputDevice& _rDevice, const Rectangle& _rArea, + const StyleSettings& _rStyle, rtl::OUString& _rText ); + virtual void PaintCell( ColPos _nColumn, + bool _bActive, bool _bSelected, + OutputDevice& _rDevice, const Rectangle& _rArea, + const StyleSettings& _rStyle, rtl::OUString& _rText ); + virtual void ShowCellCursor( Window& _rView, const Rectangle& _rCursorRect); + virtual void HideCellCursor( Window& _rView, const Rectangle& _rCursorRect); + }; +//........................................................................ +} } // namespace svt::table +//........................................................................ + +#endif // SVTOOLS_INC_TABLE_GRIDTABLERENDERER_HXX diff --git a/svtools/inc/svtools/table/tablecontrol.hxx b/svtools/inc/svtools/table/tablecontrol.hxx new file mode 100644 index 000000000000..e3edd0b681ae --- /dev/null +++ b/svtools/inc/svtools/table/tablecontrol.hxx @@ -0,0 +1,246 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef SVTOOLS_INC_TABLE_TABLECONTROL_HXX +#define SVTOOLS_INC_TABLE_TABLECONTROL_HXX + +#include +#include +#include +#include +#include +#include "svtaccessiblefactory.hxx" +//........................................................................ + +namespace svt { namespace table +{ +//........................................................................ + + class TableControl_Impl; + class TableDataWindow; + class AccessibleTableControl_Impl; + + //==================================================================== + //= TableControl + //==================================================================== + /** a basic control which manages table-like data, i.e. a number of cells + organized in m rows and n columns. + + The control itself does not do any assumptions about the concrete data + it displays, this is encapsulated in an instance supporting the + ->ITableModel interface. + + Also, the control does not do any assumptions about how the model's + content is rendered. This is the responsibility of a component + supporting the ->ITableRenderer interface (the renderer is obtained from + the model). + + The control supports the concept of a current (or active + cell). + The control supports accessibility, this is encapsulated in IAccessibleTable + + // TODO: scrolling? + */ + class TableControl : public Control, public IAccessibleTable + { + private: + DECL_LINK( ImplMouseButtonDownHdl, MouseEvent* ); + DECL_LINK( ImplMouseButtonUpHdl, MouseEvent* ); + + TableControl_Impl* m_pImpl; + public: + ::std::auto_ptr< AccessibleTableControl_Impl > m_pAccessTable; + + TableControl( Window* _pParent, WinBits _nStyle ); + ~TableControl(); + + /// sets a new table model + void SetModel( PTableModel _pModel ); + /// retrieves the current table model + PTableModel GetModel() const; + + /// returns the top row, i.e. the first visible row + RowPos GetTopRow() const; + /// sets a new top row. The top row is the first visible row in the control + void SetTopRow( RowPos _nRow ); + + /** retrieves the current row + + The current row is the one which contains the active cell. + + @return + the row index of the active cell, or ->ROW_INVALID + if there is no active cell, e.g. because the table does + not contain any rows or columns. + */ + sal_Int32 GetCurrentRow() const; + + /** returns the row, which contains the input point*/ + + ColPos GetCurrentRow (const Point& rPoint); + + /** retrieves the current column + + The current col is the one which contains the active cell. + + @return + the column index of the active cell, or ->COL_INVALID + if there is no active cell, e.g. because the table does + not contain any rows or columns. + */ + sal_Int32 GetCurrentColumn() const; + + /** activates the cell at the given position + + @return + if the move was successful, otherwise. Usual + failure conditions include some other instance vetoing the move, + or impossibility to execute the move at all (for instance because + of invalid coordinates). + */ + bool GoTo( ColPos _nColumnPos, RowPos _nRow); + + /** moves the active cell to the given column, by keeping the active row + + @return + if the move was successful, otherwise. Usual + failure conditions include some other instance vetoing the move, + or impossibility to execute the move at all (for instance because + of invalid coordinates). + */ + inline bool GoToColumn( ColPos _nColumn ) + { + return GoTo( _nColumn, GetCurrentRow() ); + } + + /** moves the active cell to the given row, by keeping the active column + + @return + if the move was successful, otherwise. Usual + failure conditions include some other instance vetoing the move, + or impossibility to execute the move at all (for instance because + of invalid coordinates). + */ + bool GoToRow( RowPos _nRow ) + { + return GoTo( GetCurrentColumn(), _nRow ); + } + virtual void Resize(); + + /**invalidates the table if table has been changed e.g. new row added + */ + void InvalidateDataWindow(RowPos _nRowStart, bool _bRemoved); + /**gets the vector, which contains the selected rows + */ + std::vector& GetSelectedRows(); + /**after removing a row, updates the vector which contains the selected rows + if the row, which should be removed, is selected, it will be erased from the vector + */ + void removeSelectedRow(RowPos _nRowPos); + SelectionEngine* getSelEngine(); + TableDataWindow* getDataWindow(); + + // Window overridables + virtual void GetFocus(); + virtual void LoseFocus(); + virtual void KeyInput( const KeyEvent& rKEvt ); + //virtual long Notify(NotifyEvent& rNEvt); + + /** Creates and returns the accessible object of the whole BrowseBox. */ + virtual XACC CreateAccessible(); + virtual XACC CreateAccessibleControl( sal_Int32 _nIndex ); + virtual ::rtl::OUString GetAccessibleObjectName(AccessibleTableControlObjType eObjType, sal_Int32 _nRow, sal_Int32 _nCol) const; + virtual sal_Bool GoToCell( sal_Int32 _nColumnPos, sal_Int32 _nRow ); + virtual ::rtl::OUString GetAccessibleObjectDescription(AccessibleTableControlObjType eObjType, sal_Int32 _nPosition = -1) const; + virtual void FillAccessibleStateSet( + ::utl::AccessibleStateSetHelper& rStateSet, + AccessibleTableControlObjType eObjType ) const; + + //// Window + virtual Rectangle GetWindowExtentsRelative( Window *pRelativeWindow ); + virtual void GrabFocus(); + virtual XACC GetAccessible( BOOL bCreate = TRUE ); + virtual Window* GetAccessibleParentWindow() const; + virtual Window* GetWindowInstance(); + virtual sal_Int32 GetAccessibleControlCount() const; + virtual sal_Bool ConvertPointToControlIndex( sal_Int32& _rnIndex, const Point& _rPoint ); + virtual long GetRowCount() const; + virtual long GetColumnCount() const; + virtual sal_Bool HasRowHeader() const; + virtual sal_Int32 GetSelectedRowCount() const; + virtual bool IsRowSelected( long _nRow ) const; + virtual sal_Bool ConvertPointToCellAddress( sal_Int32& _rnRow, sal_Int32& _rnColPos, const Point& _rPoint ); + virtual Rectangle calcHeaderRect( sal_Bool _bIsColumnBar, BOOL _bOnScreen = TRUE ); + virtual Rectangle calcTableRect( BOOL _bOnScreen = TRUE ); + virtual Rectangle GetFieldCharacterBounds(sal_Int32 _nRow,sal_Int32 _nColumnPos,sal_Int32 nIndex); + virtual sal_Int32 GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint); + virtual void FillAccessibleStateSetForCell( ::utl::AccessibleStateSetHelper& _rStateSet, sal_Int32 _nRow, sal_uInt16 _nColumnPos ) const; + virtual ::rtl::OUString GetRowDescription( sal_Int32 _nRow ) const; + virtual ::rtl::OUString GetRowName(sal_Int32 _nIndex) const; + virtual ::rtl::OUString GetColumnDescription( sal_uInt16 _nColumnPos ) const; + virtual ::rtl::OUString GetColumnName( sal_Int32 _nIndex ) const; + virtual ::rtl::OUString GetCellContent( sal_Int32 _nRowPos, sal_Int32 _nColPos) const; + virtual sal_Bool HasRowHeader(); + virtual sal_Bool HasColHeader(); + virtual sal_Bool isAccessibleAlive( ) const; + virtual void commitGridControlEvent( sal_Int16 _nEventId, const com::sun::star::uno::Any& _rNewValue, const com::sun::star::uno::Any& _rOldValue ); + + + protected: + /// retrieves the XAccessible implementation associated with the GridControl instance + ::svt::IAccessibleFactory& getAccessibleFactory(); + + private: + TableControl(); // never implemented + TableControl( const TableControl& ); // never implemented + TableControl& operator=( const TableControl& ); // never implemented + }; + + class AccessibleTableControl_Impl + { + public: + AccessibleFactoryAccess m_aFactoryAccess; + IAccessibleTableControl* m_pAccessible; + + public: + AccessibleTableControl_Impl() : m_pAccessible(NULL) + { + } + + + /// @see AccessibleTableControl::getTableRowHeader + ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > + getAccessibleTableHeader( AccessibleTableControlObjType _eObjType ); + /// @see AccessibleTableControl::getTable + ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > + getAccessibleTable( ); + + }; + +//........................................................................ +} } // namespace svt::table +//........................................................................ + +#endif // SVTOOLS_INC_TABLE_TABLECONTROL_HXX diff --git a/svtools/inc/svtools/table/tabledatawindow.hxx b/svtools/inc/svtools/table/tabledatawindow.hxx new file mode 100644 index 000000000000..fddbfdcd4a3c --- /dev/null +++ b/svtools/inc/svtools/table/tabledatawindow.hxx @@ -0,0 +1,75 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef SVTOOLS_SOURCE_TABLE_TABLEDATAWINDOW_HXX +#define SVTOOLS_SOURCE_TABLE_TABLEDATAWINDOW_HXX + +#ifndef _SV_WINDOW_HXX +#include +#endif +#include + +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + + class TableControl_Impl; + class TableFunctionSet; + + + //==================================================================== + //= TableDataWindow + //==================================================================== + /** the window containing the content area (including headers) of + a table control + */ + class TableDataWindow : public Window + { + friend class TableFunctionSet; + private: + TableControl_Impl& m_rTableControl; + Link m_aMouseButtonDownHdl; + Link m_aMouseButtonUpHdl; + + public: + TableDataWindow( TableControl_Impl& _rTableControl ); + inline void SetMouseButtonDownHdl( const Link& rLink ) { m_aMouseButtonDownHdl = rLink; } + inline const Link& GetMouseButtonDownHdl() const { return m_aMouseButtonDownHdl; } + inline void SetMouseButtonUpHdl( const Link& rLink ) { m_aMouseButtonUpHdl = rLink; } + inline const Link& GetMouseButtonUpHdl() const { return m_aMouseButtonUpHdl; } + + // Window overridables + virtual void Paint( const Rectangle& rRect ); + virtual void MouseMove( const MouseEvent& rMEvt); + virtual void MouseButtonDown( const MouseEvent& rMEvt); + virtual void MouseButtonUp( const MouseEvent& rMEvt); + + }; +//........................................................................ +} } // namespace svt::table +//........................................................................ + +#endif // SVTOOLS_SOURCE_TABLE_TABLEDATAWINDOW_HXX diff --git a/svtools/inc/svtools/table/tableinputhandler.hxx b/svtools/inc/svtools/table/tableinputhandler.hxx new file mode 100644 index 000000000000..c0d3a2b5c18a --- /dev/null +++ b/svtools/inc/svtools/table/tableinputhandler.hxx @@ -0,0 +1,77 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef SVTOOLS_INC_TABLE_TABLEINPUTHANDLER_HXX +#define SVTOOLS_INC_TABLE_TABLEINPUTHANDLER_HXX + +#include + +class MouseEvent; +class KeyEvent; +class HelpEvent; +class CommandEvent; +class NotifyEvent; + +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + + class IAbstractTableControl; + + //==================================================================== + //= ITableInputHandler + //==================================================================== + /** interface for components handling input in a ->TableControl + */ + class ITableInputHandler + { + public: + // all those methods have the same semantics as the equal-named methods of ->Window, + // with the additional option to return a boolean value indicating whether + // the event should be further processed by the ->Window implementations (), + // or whether it has been sufficiently handled by the ->ITableInputHandler instance + // (). + + virtual bool MouseMove ( IAbstractTableControl& _rControl, const MouseEvent& rMEvt ) = 0; + virtual bool MouseButtonDown ( IAbstractTableControl& _rControl, const MouseEvent& rMEvt ) = 0; + virtual bool MouseButtonUp ( IAbstractTableControl& _rControl, const MouseEvent& rMEvt ) = 0; + virtual bool KeyInput ( IAbstractTableControl& _rControl, const KeyEvent& rKEvt ) = 0; + virtual bool GetFocus ( IAbstractTableControl& _rControl ) = 0; + virtual bool LoseFocus ( IAbstractTableControl& _rControl ) = 0; + virtual bool RequestHelp ( IAbstractTableControl& _rControl, const HelpEvent& rHEvt ) = 0; + virtual bool Command ( IAbstractTableControl& _rControl, const CommandEvent& rCEvt ) = 0; + virtual bool PreNotify ( IAbstractTableControl& _rControl, NotifyEvent& rNEvt ) = 0; + virtual bool Notify ( IAbstractTableControl& _rControl, NotifyEvent& rNEvt ) = 0; + + virtual ~ITableInputHandler() { } + }; + typedef ::boost::shared_ptr< ITableInputHandler > PTableInputHandler; + +//........................................................................ +} } // namespace svt::table +//........................................................................ + +#endif // SVTOOLS_INC_TABLE_TABLEINPUTHANDLER_HXX diff --git a/svtools/inc/svtools/table/tablemodel.hxx b/svtools/inc/svtools/table/tablemodel.hxx new file mode 100644 index 000000000000..6e74d35b8586 --- /dev/null +++ b/svtools/inc/svtools/table/tablemodel.hxx @@ -0,0 +1,454 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef SVTOOLS_INC_TABLE_TABLEMODEL_HXX +#define SVTOOLS_INC_TABLE_TABLEMODEL_HXX + +#include +#include +#include + +#include + +#include + +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + + + //==================================================================== + //= cell data + //==================================================================== + struct CellEntryType + { + String m_aStr; + //Image m_aImage; + //Control m_aControl; + CellEntryType( const String& _rStr ) : + m_aStr( _rStr ) + {} + }; + + //typedef ::std::vector CellColumnContent; + //vector, which contains text data for each cell + typedef ::std::vector CellColumnContent; + //vector, which contains data for rows + typedef ::std::vector CellContent; + //==================================================================== + //= ScrollbarVisibility + //==================================================================== + enum ScrollbarVisibility + { + /** enumeration value denoting that a scrollbar should never be visible, even + if needed normally + */ + ScrollbarShowNever, + /** enumeration value denoting that a scrollbar should be visible when needed only + */ + ScrollbarShowSmart, + /** enumeration value denoting that a scrollbar should always be visible, even + if not needed normally + */ + ScrollbarShowAlways + }; + + //==================================================================== + //= ITableModelListener + //==================================================================== + /** declares an interface to be implemented by components interested in + changes in an ->ITableModel + */ + class SAL_NO_VTABLE ITableModelListener + { + public: + //virtual void onTableModelChanged(PTableModel pTableModel) = 0; + /** notifies the listener that one or more rows have been inserted into + the table + + @param first + the index of the first newly inserted row + @param last + the index of the last newly inserted row. Must not be smaller + than ->first + */ + virtual void rowsInserted( RowPos first, RowPos last ) = 0; + + /** notifies the listener that one or more rows have been removed from + the table + + @param first + the old index of the first removed row + @param last + the old index of the last removed row. Must not be smaller + than ->first + */ + virtual void rowsRemoved( RowPos first, RowPos last ) = 0; + + /** notifies the listener that one or more columns have been inserted into + the table + + @param first + the index of the first newly inserted row + @param last + the index of the last newly inserted row. Must not be smaller + than ->first + */ + virtual void columnsInserted( ColPos first, ColPos last ) = 0; + + /** notifies the listener that one or more columns have been removed from + the table + + @param first + the old index of the first removed row + @param last + the old index of the last removed row. Must not be smaller + than ->first + */ + virtual void columnsRemoved( ColPos first, ColPos last ) = 0; + + /** notifies the listener that a column in the table has moved + + @param oldIndex + the old index of the column within the model + @param newIndex + the new index of the column within the model + */ + virtual void columnMoved( ColPos oldIndex, ColPos newIndex ) = 0; + + /** notifies the listener that a rectangular cell range in the table + has been updated + + Listeners are required to discard any possibly cached information + they have about the cells in question, in particular any possibly + cached cell values. + */ + virtual void cellsUpdated( ColPos firstCol, ColPos lastCol, RowPos firstRow, RowPos lastRow ) = 0; + + /// deletes the listener instance + virtual ~ITableModelListener(){}; + }; + typedef ::boost::shared_ptr< ITableModelListener > PTableModelListener; + + //==================================================================== + //= IColumnModel + //==================================================================== + /** interface to be implemented by table column models + */ + class SAL_NO_VTABLE IColumnModel + { + public: + /** retrieves the ID of the column + + The semantics of a column id is not defined. It's up to the + implementor of the ->IColumnModel, respectively the ->ITableModel + which provides the column models, to define such a semantics. + + @return + the ID of the column. May be 0 if the table which the column + belongs to does not need and support column ids. + + @see setID + */ + virtual ColumnID getID() const = 0; + + /** sets a new column ID + + @return + if setting the new ID was successfull. A possible error + conditions is if you try to set an ID which is already used + by another column within the same table. + + @see getID + */ + virtual bool setID( const ColumnID _nID ) = 0; + + /** returns the name of the column + + Column names should be human-readable, but not necessarily unique + within a given table. + + @see setName + */ + virtual String getName() const = 0; + + /** sets a new name for the column + + @see getName + */ + virtual void setName( const String& _rName ) = 0; + + /** determines whether the column can be resized + + @see getMinWidth + @see getMaxWidth + @see getWidth + */ + virtual bool isResizable() const = 0; + + /** declares the column as resizable or fixed in width + + @see getMinWidth + @see getMaxWidth + @see getWidth + */ + virtual void setResizable( bool _bResizable ) = 0; + + /** returns the width of the column, in 1/100 millimeters + + The returned value must be a positive ->TableMetrics value. + + It can also be COLWIDTH_FIT_TO_VIEW, to indicate that the width of the column + should automatically be adjusted to completely fit the view. For instance, a + model's last column could return this value, to indicate that it is to occupy + all horizontal space remaining in the view, after all other columns have been + layouted. + + If there is more than one column with width COLWIDTH_FIT_TO_VIEW in a model, + they're all layouted equal-width. + + If the columns with a read width (i.e. other than COLWIDTH_FIT_TO_VIEW) are, + in sum, wider than the view, then the view is free to choose a real width for any + columns which return COLWIDTH_FIT_TO_VIEW here. + + @see setWidth + @see getMinWidth + @see getMaxWidth + @see COLWIDTH_FIT_TO_VIEW + */ + virtual TableMetrics getWidth() const = 0; + + /** sets a new width for the column + + @param _nWidth + the new width, in 1/100 millimeters + + @see getWidth + */ + virtual void setWidth( TableMetrics _nWidth ) = 0; + + /** returns the minimum width of the column, in 1/100 millimeters, or 0 if the column + does not have a minimal width + + @see setMinWidth + @see getMaxWidth + @see getWidth + */ + virtual TableMetrics getMinWidth() const = 0; + + /** sets the minimum width of the column, in 1/100 millimeters + + @see getMinWidth + @see setMaxWidth + @see setWidth + */ + virtual void setMinWidth( TableMetrics _nMinWidth ) = 0; + + /** returns the maximum width of the column, in 1/100 millimeters, or 0 if the column + does not have a minimal width + + @see setMaxWidth + @see getMinWidth + @see getWidth + */ + virtual TableMetrics getMaxWidth() const = 0; + + /** sets the maximum width of the column, in 1/100 millimeters + + @see getMaxWidth + @see setMinWidth + @see setWidth + */ + virtual void setMaxWidth( TableMetrics _nMaxWidth ) = 0; + + + /// deletes the column model instance + virtual ~IColumnModel() { } + }; + typedef ::boost::shared_ptr< IColumnModel > PColumnModel; + + //==================================================================== + //= ITableModel + //==================================================================== + /** declares the interface to implement by an abtract table model + */ + class SAL_NO_VTABLE ITableModel + { + public: + /** returns the number of columns in the table + */ + virtual TableSize getColumnCount() const = 0; + + /** returns the number of rows in the table + */ + virtual TableSize getRowCount() const = 0; + + virtual void setColumnCount(TableSize _nColCount) = 0; + virtual void setRowCount(TableSize _nRowCount) = 0; + + /** determines whether the table has column headers + + If this method returns , the renderer returned by + ->getRenderer must be able to render column headers. + + @see IColumnRenderer + */ + virtual bool hasColumnHeaders() const = 0; + /** sets whether the table should have row headers + @see IColumnRenderer + */ + virtual void setRowHeaders( bool rowHeaders) = 0; + + /** sets whether the table should have column headers + @see IColumnRenderer + */ + virtual void setColumnHeaders( bool columnHeaders) = 0; + + /** determines whether the table has row headers + + If this method returns , the renderer returned by + ->getRenderer must be able to render row headers. + + @see IColumnRenderer + */ + virtual bool hasRowHeaders() const = 0; + + /** determines whether the given cell is editable + + @see ICellEditor + @todo + */ + virtual bool isCellEditable( ColPos col, RowPos row ) const = 0; + + /** adds the given listener to the list of ->ITableModelListener's + */ + virtual void addTableModelListener( const PTableModelListener& listener ) = 0; + + /** revokes the given listener from the list of ->ITableModelListener's + */ + virtual void removeTableModelListener( const PTableModelListener& listener ) = 0; + + /** returns a model for a certain column + + @param column + the index of the column in question. Must be greater than or + equal 0, and smaller than the return value of ->getColumnCount() + + @return + the model of the column in question. Must not be + + @see getColumnModelByID + */ + virtual PColumnModel getColumnModel( ColPos column ) = 0; + + /** finds a column model by ID + + @param id + the id of the column which is to be looked up + @return + the column model with the given ID, or if there is + no such column + */ + virtual PColumnModel getColumnModelByID( ColumnID id ) = 0; + + /** returns a renderer which is able to paint the table represented + by this table model + + @return the renderer to use. Must not be + */ + virtual PTableRenderer getRenderer() const = 0; + + /** returns the component handling input in a view associated with the model + */ + virtual PTableInputHandler getInputHandler() const = 0; + + /** determines the height of rows in the table. + + @return + the logical height of rows in the table, in 1/100 millimeters. The height must be + greater 0. + */ + virtual TableMetrics getRowHeight() const = 0; + + virtual void setRowHeight(TableMetrics _nRowHeight) = 0; + + /** determines the height of the column header row + + This method is not to be called if ->hasColumnHeaders() + returned . + + @return + the logical height of the column header row, in 1/100 millimeters. + Must be greater than 0. + */ + virtual TableMetrics getColumnHeaderHeight() const = 0; + + /** determines the width of the row header column + + This method is not to be called if ->hasRowHeaders() + returned . + + @return + the logical width of the row header column, in 1/100 millimeters. + Must be greater than 0. + */ + virtual TableMetrics getRowHeaderWidth() const = 0; + + /** determines the visibility of the vertical scrollbar of the table control + @param overAllHeight the height of the table with all rows + @param actHeight the given height of the table + */ + virtual ScrollbarVisibility getVerticalScrollbarVisibility(int overAllHeight,int actHeight) const = 0; + + /** determines the visibility of the horizontal scrollbar of the table control + @param overAllWidth the width of the table with all columns + @param actWidth the given width of the table + */ + virtual ScrollbarVisibility getHorizontalScrollbarVisibility(int overAllWidth, int actWidth) const = 0; + + /** fills cells with content + */ + virtual void setCellContent(std::vector > cellContent)=0; + /** gets the content of the cells + */ + virtual std::vector >& getCellContent() = 0; + /**sets title of header rows + */ + virtual void setRowHeaderName(std::vector cellColumnContent)=0; + /** gets title of header rows + */ + virtual std::vector& getRowHeaderName() = 0; + + /// destroys the table model instance + virtual ~ITableModel() { } + }; + typedef ::boost::shared_ptr< ITableModel > PTableModel; + +//........................................................................ +} } // namespace svt::table +//........................................................................ + +#endif // SVTOOLS_INC_TABLE_TABLEMODEL_HXX diff --git a/svtools/inc/svtools/table/tablerenderer.hxx b/svtools/inc/svtools/table/tablerenderer.hxx new file mode 100644 index 000000000000..eb645ad574c4 --- /dev/null +++ b/svtools/inc/svtools/table/tablerenderer.hxx @@ -0,0 +1,241 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef SVTOOLS_INC_TABLE_TABLERENDERER_HXX +#define SVTOOLS_INC_TABLE_TABLERENDERER_HXX + +#include + +#include + +#include + +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + + //==================================================================== + //= ITableRenderer + //==================================================================== + /** interface to implement by components rendering a ->TableControl + */ + class SAL_NO_VTABLE ITableRenderer + { + public: + /** paints a (part of) header area + + There are two header areas in a table control: +

  • The row containing all column headers, i.e. above all rows containing the data
  • +
  • The column containing all row headers. i.e. left of all columns containing the data
  • +
+ + A header area is more than the union of the single column/row headers. + + First, there might be less columns than fit into the view - in this case, right + beside the right-most column, there's still room which belongs to the column header + area, but is not occupied by any particular column header.
+ An equivalent statement holds for the row header area, if there are less rows than + fit into the view. + + Second, if the table control has both a row header and a column header, + the intersection between those both belongs to both the column header area and the + row header area, but not to any particular column or row header. + + There are two flags specifying whether the to-be-painted area is part of the column + and/or row header area. +
  • If both are , the intersection of both areas is to be painted.
  • +
  • If ->_bIsColHeaderArea is and ->_bIsRowHeaderArea is , + then ->_rArea denotes the column header area excluding the + intersection between row and column header area.
  • +
  • Equivalently for ->_bIsColHeaderArea being and ->_bIsRowHeaderArea + being
  • +
+ Note that it's not possible for both ->_bIsColHeaderArea and ->_bIsRowHeaderArea + to be at the same time. + + @param _rDevice + the device to paint onto + @param _rArea + the area to paint into + @param _bIsColHeaderArea + if and only if ->_rArea is part of the column header area. + @param _bIsRowHeaderArea + if and only if ->_rArea is part of the row header area. + @param _rStyle + the style to be used for drawing + */ + virtual void PaintHeaderArea( + OutputDevice& _rDevice, const Rectangle& _rArea, + bool _bIsColHeaderArea, bool _bIsRowHeaderArea, + const StyleSettings& _rStyle ) = 0; + + /** paints the header for a given column + + @param _nCol + the index of the column to paint + @param _bActive + if and only if the column whose column is to be painted + contains the active cell. + @param _bSelected + if and only if the column whose column is to be painted + is selected currently. + @param _rDevice + denotes the device to paint onto + @param _rArea + the are into which the column header should be painted + @param _rStyle + the style to be used for drawing + */ + virtual void PaintColumnHeader( ColPos _nCol, bool _bActive, bool _bSelected, + OutputDevice& _rDevice, const Rectangle& _rArea, + const StyleSettings& _rStyle ) = 0; + + /** prepares a row for painting + + Painting a table means painting rows as necessary, in an increasing + order. The assumption is that retrieving data for two different rows + is (potentially) more expensive than retrieving data for two different + columns. Thus, the renderer will get the chance to "seek" to a certain + row, and then has to render all cells in this row, before another + row is going to be painted. + + @param _nRow + the row which is going to be painted. The renderer should + at least remember this row, since subsequent calls to + ->PaintRowHeader(), ->PaintCell(), and ->FinishRow() will + not pass this parameter again. + + However, the renderer is also allowed to render any + cell-independent content of this row. + + @param _bActive + if and only if the row to be painted contains the + currently active cell. + @param _bSelected + if and only if the row to be prepared is + selected currently. + @param _rDevice + denotes the device to paint onto + @param _rRowArea + the are into which the row should be painted. This excludes + the row header area, if applicable. + @param _rStyle + the style to be used for drawing + */ + virtual void PrepareRow( RowPos _nRow, bool _bActive, bool _bSelected, + OutputDevice& _rDevice, const Rectangle& _rRowArea, + const StyleSettings& _rStyle ) = 0; + + /** paints the header of a row + + The row to be painted is denoted by the most recent call to + ->PrepareRow. + + @param _bActive + if and only if the row to be painted contains the + currently active cell. +
+ Note that this flag is equal to the respective flag in the + previous ->PrepareRow call, it's passed here for convinience + only. + @param _bSelected + if and only if the row whose header cell is to be + painted is selected currently. +
+ Note that this flag is equal to the respective flag in the + previous ->PrepareRow call, it's passed here for convinience + only. + @param _rDevice + denotes the device to paint onto + @param _rArea + the are into which the row header should be painted + @param _rStyle + the style to be used for drawing + @param _rText + the title of the header row + */ + virtual void PaintRowHeader( + bool _bActive, bool _bSelected, + OutputDevice& _rDevice, const Rectangle& _rArea, + const StyleSettings& _rStyle, rtl::OUString& _rText ) = 0; + + /** paints a certain cell + + The row to be painted is denoted by the most recent call to + ->PrepareRow. + + @param _bSelected + if and only if the cell to be painted is + selected currently. This is the case if either + the row or the column of the cell is currently selected. +
+ Note that this flag is equal to the respective flag in the + previous ->PrepareRow call, it's passed here for convinience + only. + @param _bActive + if the cell is currently active. +
+ Note that this flag is equal to the respective flag in the + previous ->PrepareRow call, it's passed here for convinience + only. + @param _rDevice + denotes the device to paint onto + @param _rArea + the are into which the cell should be painted + @param _rStyle + the style to be used for drawing + @param _rText + the content of the cell + */ + virtual void PaintCell( ColPos _nColumn, + bool _bActive, bool _bSelected, + OutputDevice& _rDevice, const Rectangle& _rArea, + const StyleSettings& _rStyle, rtl::OUString& _rText ) = 0; + + /** draws a cell cursor in the given rectangle + + The cell cursor is used to indicate the active/current cell + of a table control. + */ + virtual void ShowCellCursor( Window& _rView, const Rectangle& _rCursorRect) = 0; + + /** hides the cell cursor previously drawn into the given rectangle + + The cell cursor is used to indicate the active/current cell + of a table control. + */ + virtual void HideCellCursor( Window& _rView, const Rectangle& _rCursorRect) = 0; + + /// deletes the renderer instance + virtual ~ITableRenderer() { } + }; + typedef ::boost::shared_ptr< ITableRenderer > PTableRenderer; + +//........................................................................ +} } // namespace svt::table +//........................................................................ + +#endif // SVTOOLS_INC_TABLE_TABLERENDERER_HXX diff --git a/svtools/inc/svtools/table/tabletypes.hxx b/svtools/inc/svtools/table/tabletypes.hxx new file mode 100644 index 000000000000..167e49cfd521 --- /dev/null +++ b/svtools/inc/svtools/table/tabletypes.hxx @@ -0,0 +1,75 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef SVTOOLS_INC_TABLE_TABLETYPES_HXX +#define SVTOOLS_INC_TABLE_TABLETYPES_HXX + +#include + +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + /// a value denoting the size of a table + typedef sal_Int32 TableSize; + + /// a value denoting a column position within a table + typedef sal_Int32 ColPos; + /// a value denoting a row position within a table + typedef sal_Int32 RowPos; + + /** a value denoting an arbitrary coordinate value of a position within + a table + + Values of this type are guaranteed to be large enough to hold column + positions as well as row positions. + */ + typedef sal_Int32 AnyPos; + + /// the ID of a column in a table + typedef sal_Int32 ColumnID; + + typedef sal_Int32 TableMetrics; +/** special column width value which indicates that the column should be + automatically resized to fit the view +*/ +#define COLWIDTH_FIT_TO_VIEW ((TableMetrics)-1) + +/// denotes the column containing the row headers +#define COL_ROW_HEADERS ((ColPos)-1) +/// denotes the row containing the column headers +#define ROW_COL_HEADERS ((RowPos)-1) + +/// denotes an invalid column index +#define COL_INVALID ((ColPos)-2) +/// denotes an invalid row index +#define ROW_INVALID ((RowPos)-2) + + +//........................................................................ +} } // namespace svt::table +//........................................................................ + +#endif // SVTOOLS_INC_TABLE_TABLETYPES_HXX diff --git a/svtools/inc/svtools/textdata.hxx b/svtools/inc/svtools/textdata.hxx index 5b44b1364492..bd119b63c095 100644 --- a/svtools/inc/svtools/textdata.hxx +++ b/svtools/inc/svtools/textdata.hxx @@ -32,8 +32,8 @@ #define _TEXTDATA_HXX #include "svtools/svtdllapi.h" -#include -#include +#include +#include #include #define TEXTUNDO_START 100 diff --git a/svtools/inc/svtools/texteng.hxx b/svtools/inc/svtools/texteng.hxx index c1d7746d73c6..e1d64aa42ecd 100644 --- a/svtools/inc/svtools/texteng.hxx +++ b/svtools/inc/svtools/texteng.hxx @@ -54,7 +54,7 @@ class Timer; class TextLine; class TETextPortion; -#include +#include #include #include #include diff --git a/svtools/inc/svtools/tfrmitem.hxx b/svtools/inc/svtools/tfrmitem.hxx deleted file mode 100644 index 93e245a731a2..000000000000 --- a/svtools/inc/svtools/tfrmitem.hxx +++ /dev/null @@ -1,90 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: tfrmitem.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ -#ifndef _TFRMITEM_HXX -#define _TFRMITEM_HXX - -#include - -#include - -class SvStream; - -enum SfxOpenMode -{ - SfxOpenSelect = 0, // selected in view - SfxOpenOpen = 1, // doubleclicked or - SfxOpenAddTask = 2, // doubleclicked or with Ctrl-Modifier - SfxOpenDontKnow = 3, - SfxOpenReserved1 = 4, - SfxOpenReserved2 = 5, - SfxOpenModeLast = 5 -}; - -DBG_NAMEEX(SfxTargetFrameItem) - -// class SfxTargetFrameItem ------------------------------------------------- - -class SfxTargetFrameItem : public SfxPoolItem -{ -private: - String _aFrames[ (USHORT)SfxOpenModeLast+1 ]; -public: - TYPEINFO(); - - SfxTargetFrameItem( const SfxTargetFrameItem& rCpy ); - SfxTargetFrameItem( USHORT nWhich ); - SfxTargetFrameItem( - USHORT nWhich, - const String& rOpenSelectFrame, - const String& rOpenOpenFrame, - const String& rOpenAddTaskFrame ); - ~SfxTargetFrameItem(); - - virtual int operator==( const SfxPoolItem& ) const; - virtual SfxPoolItem* Create( SvStream&, USHORT nItemVersion ) const; - virtual SvStream& Store( SvStream&, USHORT nItemVersion ) const; - virtual SfxPoolItem* Clone( SfxItemPool* pPool = 0 ) const; - - virtual BOOL QueryValue( com::sun::star::uno::Any& rVal, - BYTE nMemberId = 0 ) const; - virtual BOOL PutValue ( const com::sun::star::uno::Any& rVal, - BYTE nMemberId = 0 ); - /* - Framebezeichner im Sfx: - _browser : Beamerview - _document : Desktopview - _blank : new task - "" : do nothing - */ - String GetTargetFrame( SfxOpenMode eMode ) const; -}; - -#endif - diff --git a/svtools/inc/svtools/tresitem.hxx b/svtools/inc/svtools/tresitem.hxx deleted file mode 100644 index 6282d3a7d4ff..000000000000 --- a/svtools/inc/svtools/tresitem.hxx +++ /dev/null @@ -1,65 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: tresitem.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef SVTOOLS_TRESITEM_HXX -#define SVTOOLS_TRESITEM_HXX - -#include -#include - -//============================================================================ -class CntTransferResultItem: public SfxPoolItem -{ - com::sun::star::ucb::TransferResult m_aResult; - -public: - TYPEINFO(); - - CntTransferResultItem(USHORT which = 0): SfxPoolItem(which) {} - - CntTransferResultItem(USHORT which, - com::sun::star::ucb::TransferResult const & - rTheResult): - SfxPoolItem(which), m_aResult(rTheResult) {} - - virtual int operator ==(SfxPoolItem const & rItem) const; - - virtual BOOL QueryValue(com::sun::star::uno::Any & rVal, BYTE = 0) const; - - virtual BOOL PutValue(const com::sun::star::uno::Any & rVal, BYTE = 0); - - virtual SfxPoolItem * Clone(SfxItemPool * = 0) const; - - com::sun::star::ucb::TransferResult const & GetValue() const - { return m_aResult; } -}; - -#endif // SVTOOLS_TRESITEM_HXX - diff --git a/svtools/inc/svtools/valueset.hxx b/svtools/inc/svtools/valueset.hxx index 647851008c8f..fc12f9517b6d 100644 --- a/svtools/inc/svtools/valueset.hxx +++ b/svtools/inc/svtools/valueset.hxx @@ -285,6 +285,7 @@ private: #ifdef _SV_VALUESET_CXX friend class ValueSetAcc; friend class ValueItemAcc; + using Control::ImplInitSettings; using Window::ImplInit; SVT_DLLPRIVATE void ImplInit(); SVT_DLLPRIVATE void ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ); diff --git a/svtools/inc/svtuno.hxx b/svtools/inc/svtuno.hxx deleted file mode 100644 index 378251488707..000000000000 --- a/svtools/inc/svtuno.hxx +++ /dev/null @@ -1,63 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: svtuno.hxx,v $ - * $Revision: 1.4 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _SVTOOLS_SVTUNO_HXX -#define _SVTOOLS_SVTUNO_HXX - -// Macro to define const unicode a'la "..." -// It's better then "OUString::createFromAscii(...)" !!! -#define DEFINE_CONST_UNICODE(CONSTASCII) UniString(RTL_CONSTASCII_USTRINGPARAM(CONSTASCII)) -#define DEFINE_CONST_OUSTRING(CONSTASCII) OUString(RTL_CONSTASCII_USTRINGPARAM(CONSTASCII)) - -// defines --------------------------------------------------------------- -#define UNOANY ::com::sun::star::uno::Any -#define UNOEXCEPTION ::com::sun::star::uno::Exception -#define UNOMUTEX ::osl::Mutex -#define UNOMUTEXGUARD ::osl::MutexGuard -#define UNOOIMPLEMENTATIONID ::cppu::OImplementationId -#define UNOOTYPECOLLECTION ::cppu::OTypeCollection -#define UNOOUSTRING ::rtl::OUString -#define UNOPROPERTYVALUE ::com::sun::star::beans::PropertyValue -#define UNOSTRINGPAIR ::com::sun::star::beans::StringPair -#define UNOREFERENCE ::com::sun::star::uno::Reference -#define UNORUNTIMEEXCEPTION ::com::sun::star::uno::RuntimeException -#define UNOINVALIDREGISTRYEXCEPTION ::com::sun::star::registry::InvalidRegistryException -#define UNOSEQUENCE ::com::sun::star::uno::Sequence -#define UNOTYPE ::com::sun::star::uno::Type -#define UNOURL ::com::sun::star::util::URL -#define UNOXINTERFACE ::com::sun::star::uno::XInterface -#define UNOXMULTISERVICEFACTORY ::com::sun::star::lang::XMultiServiceFactory -#define UNOXSINGLESERVICEFACTORY ::com::sun::star::lang::XSingleServiceFactory -#define UNOXTYPEPROVIDER ::com::sun::star::lang::XTypeProvider -#define UNOILLEGALARGUMENTEXCEPTION ::com::sun::star::lang::IllegalArgumentException - -// ----------------------------------------------------------------------- - -#endif diff --git a/svtools/inc/twain.hxx b/svtools/inc/twain.hxx deleted file mode 100644 index 786a8e65a624..000000000000 --- a/svtools/inc/twain.hxx +++ /dev/null @@ -1,99 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: twain.hxx,v $ - * $Revision: 1.3 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _TWAIN_HXX -#define _TWAIN_HXX - -// please add new platforms if TWAIN is available -#if defined WIN || defined WNT || defined UNX -#define TWAIN_AVAILABLE 1 -#else -#undef TWAIN_AVAILABLE -#endif - -// include following only, if define is not set -#ifndef _TWAIN_HXX_CHECK - -#include - -// ----------- -// - Defines - -// ----------- - -#define TWAIN_ERR_NO_ERROR 0 -#define TWAIN_ERR_MODULE_NOT_LOADED 2 -#define TWAIN_ERR_DSMENTRY_NOT_FOUND 4 -#define TWAIN_ERR_SOURCE_MANAGER_NOT_OPENED 6 -#define TWAIN_ERR_SOURCE_SELECTION_DIALOG 8 - -// --------- -// - Twain - -// --------- - -struct TwainImp; -namespace com { namespace sun { namespace star { namespace lang { struct EventObject; } } } } - -class Twain -{ -friend class TwainEventListener; - -private: - - TwainImp* mpImp; - - Bitmap maBitmap; - Link maUpdateLink; - USHORT mnErrorCode; - BOOL mbScanning; - - Twain(); - Twain( const Twain& rTwain ); - const Twain& operator=( const Twain& rTwain ) { return *this; } - -protected: - - void Disposing( const com::sun::star::lang::EventObject& rEventObject ); - -public: - - Twain( const Link& rUpdateLink ); - ~Twain(); - - BOOL SelectSource(); - BOOL PerformTransfer(); - - Bitmap GetBitmap(); - - BOOL IsScanning() const { return mbScanning; } - USHORT GetErrorCode() const { return mnErrorCode; } -}; - -#endif // _TWAIN_HXX_CHECK -#endif // _TWAIN_HXX diff --git a/svtools/inc/xmlcnimp.hxx b/svtools/inc/xmlcnimp.hxx deleted file mode 100644 index 8fb212fe70bd..000000000000 --- a/svtools/inc/xmlcnimp.hxx +++ /dev/null @@ -1,143 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: xmlcnimp.hxx,v $ - * $Revision: 1.5 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef _SVTOOLS_XMLCNIMP_HXX -#define _SVTOOLS_XMLCNIMP_HXX - -#include -#include - -#ifndef _SVTOOLS_NMSPMAP_HXX -#include -#endif - -namespace rtl { class OUString; } - -typedef ::rtl::OUString *OUStringPtr; -SV_DECL_PTRARR_DEL( OUStringsDtor2_Impl, OUStringPtr, 5, 5 ) - -class SvXMLAttrContainerItem_Impl -{ - SvXMLNamespaceMap aNamespaceMap; - SvUShorts aPrefixPoss; - OUStringsDtor2_Impl aLNames; - OUStringsDtor2_Impl aValues; - - inline sal_uInt16 GetPrefixPos( sal_uInt16 i ) const; -public: - - SvXMLAttrContainerItem_Impl( const SvXMLAttrContainerItem_Impl& rImpl ); - SvXMLAttrContainerItem_Impl(); - - int operator ==( const SvXMLAttrContainerItem_Impl& rCmp ) const; - - BOOL AddAttr( const ::rtl::OUString& rLName, const ::rtl::OUString& rValue ); - BOOL AddAttr( const ::rtl::OUString& rPrefix, const ::rtl::OUString& rNamespace, - const ::rtl::OUString& rLName, const ::rtl::OUString& rValue ); - BOOL AddAttr( const ::rtl::OUString& rPrefix, - const ::rtl::OUString& rLName, - const ::rtl::OUString& rValue ); - - sal_uInt16 GetAttrCount() const { return aLNames.Count(); } - inline ::rtl::OUString GetAttrNamespace( sal_uInt16 i ) const; - inline ::rtl::OUString GetAttrPrefix( sal_uInt16 i ) const; - inline const ::rtl::OUString& GetAttrLName( sal_uInt16 i ) const; - inline const ::rtl::OUString& GetAttrValue( sal_uInt16 i ) const; - - sal_uInt16 GetFirstNamespaceIndex() const { return aNamespaceMap.GetFirstIndex(); } - sal_uInt16 GetNextNamespaceIndex( sal_uInt16 nIdx ) const { return aNamespaceMap.GetNextIndex( nIdx ); } - inline const ::rtl::OUString& GetNamespace( sal_uInt16 i ) const; - inline const ::rtl::OUString& GetPrefix( sal_uInt16 i ) const; - - BOOL SetAt( sal_uInt16 i, - const ::rtl::OUString& rLName, const ::rtl::OUString& rValue ); - BOOL SetAt( sal_uInt16 i, - const ::rtl::OUString& rPrefix, const ::rtl::OUString& rNamespace, - const ::rtl::OUString& rLName, const ::rtl::OUString& rValue ); - BOOL SetAt( sal_uInt16 i, - const ::rtl::OUString& rPrefix, - const ::rtl::OUString& rLName, - const ::rtl::OUString& rValue ); - - void Remove( sal_uInt16 i ); -}; - -inline sal_uInt16 SvXMLAttrContainerItem_Impl::GetPrefixPos( sal_uInt16 i ) const -{ -// DBG_ASSERT( i >= 0 && i < aPrefixPoss.Count(), -// "SvXMLAttrContainerItem_Impl::GetPrefixPos: illegal index" ); - return aPrefixPoss[i]; -} - -inline ::rtl::OUString SvXMLAttrContainerItem_Impl::GetAttrNamespace( sal_uInt16 i ) const -{ - ::rtl::OUString sRet; - sal_uInt16 nPos = GetPrefixPos( i ); - if( USHRT_MAX != nPos ) - sRet = aNamespaceMap.GetNameByIndex( nPos ); - return sRet; -} - -inline ::rtl::OUString SvXMLAttrContainerItem_Impl::GetAttrPrefix( sal_uInt16 i ) const -{ - ::rtl::OUString sRet; - sal_uInt16 nPos = GetPrefixPos( i ); - if( USHRT_MAX != nPos ) - sRet = aNamespaceMap.GetPrefixByIndex( nPos ); - return sRet; -} - -inline const ::rtl::OUString& SvXMLAttrContainerItem_Impl::GetAttrLName(sal_uInt16 i) const -{ - DBG_ASSERT( i >= 0 && i < aLNames.Count(), - "SvXMLAttrContainerItem_Impl::GetLName: illegal index" ); - return *aLNames[i]; -} - -inline const ::rtl::OUString& SvXMLAttrContainerItem_Impl::GetAttrValue(sal_uInt16 i) const -{ - DBG_ASSERT( i >= 0 && i < aValues.Count(), - "SvXMLAttrContainerItem_Impl::GetValue: illegal index" ); - return *aValues[i]; -} - -inline const ::rtl::OUString& SvXMLAttrContainerItem_Impl::GetNamespace( - sal_uInt16 i ) const -{ - return aNamespaceMap.GetNameByIndex( i ); -} - -inline const ::rtl::OUString& SvXMLAttrContainerItem_Impl::GetPrefix( sal_uInt16 i ) const -{ - return aNamespaceMap.GetPrefixByIndex( i ); -} - -#endif - diff --git a/svtools/prj/build.lst b/svtools/prj/build.lst index ee2414e0da59..5a67b9414181 100644 --- a/svtools/prj/build.lst +++ b/svtools/prj/build.lst @@ -1,54 +1,28 @@ -st svtools : offuh toolkit ucbhelper unotools JPEG:jpeg cppu cppuhelper comphelper sal sot jvmfwk NULL -st svtools usr1 - all st_mkout NULL -st svtools\inc nmake - all st_inc NULL -st svtools\inc\sane get - all st_incsa NULL -st svtools\prj get - all st_prj NULL -st svtools\res get - all st_res NULL -st svtools\win\inc get - all st_winc NULL -st svtools\win\res get - all st_wres NULL -st svtools\os2\inc get - all st_oinc NULL -st svtools\mac\inc get - all st_minc NULL -st svtools\unx\inc get - all st_uinc NULL -st svtools\bmpmaker nmake - all st_bmp st_inc NULL -st svtools\source\memtools nmake - all st_mem st_inc NULL -st svtools\source\numbers nmake - all st_num st_inc NULL -st svtools\source\notify nmake - all st_not st_inc NULL -st svtools\source\config nmake - all st_conf st_inc NULL -st svtools\unx\source\svdde nmake - u st_usdde st_inc NULL -st svtools\unx\source\svdde nmake - p st_psdde st_inc NULL -st svtools\mac\source\svdde nmake - m st_msdde st_inc NULL -st svtools\mac\source\misc nmake - m st_msc st_inc NULL -st svtools\source\control nmake - all st_ctl st_inc NULL -st svtools\source\filerec nmake - all st_file st_inc NULL -st svtools\source\filter.vcl\filter nmake - all st_vfilt st_inc NULL -st svtools\source\filter.vcl\wmf nmake - all st_vwmf st_inc NULL -st svtools\source\filter.vcl\igif nmake - all st_vigif st_inc NULL -st svtools\source\filter.vcl\jpeg nmake - all st_vjpeg st_inc NULL -st svtools\source\filter.vcl\ixbm nmake - all st_vixbm st_inc NULL -st svtools\source\filter.vcl\ixpm nmake - all st_vixpm st_inc NULL +st svtools : l10n svl offuh toolkit ucbhelper unotools JPEG:jpeg cppu cppuhelper comphelper sal sot jvmfwk NULL +st svtools usr1 - all st_mkout NULL +st svtools\inc nmake - all st_inc NULL +st svtools\bmpmaker nmake - all st_bmp st_inc NULL st svtools\source\brwbox nmake - all st__brw st_bmp st_inc NULL -st svtools\source\urlobj nmake - all st__url st_inc NULL -st svtools\source\misc nmake - all st__misc st_bmp st_inc NULL -st svtools\source\misc1 nmake - all st__misc1 st_inc NULL +st svtools\source\config nmake - all st_conf st_inc NULL st svtools\source\contnr nmake - all st__ctr st_inc NULL -st svtools\source\svdde nmake - all st__dde st_inc NULL -st svtools\source\items nmake - all st__item st_inc NULL -st svtools\source\items1 nmake - all st__item1 st_inc NULL -st svtools\source\undo nmake - all st_undo st_inc NULL -st svtools\source\plugapp nmake - all st_papp st_inc NULL +st svtools\source\control nmake - all st_ctl st_inc NULL st svtools\source\dialogs nmake - all st_dial st_inc NULL -st svtools\source\edit nmake - all st_edit st_inc NULL -st svtools\source\uno nmake - all st_uno st_inc NULL -st svtools\source\svrtf nmake - all st_rtf st_inc NULL -st svtools\source\svsql nmake - all st_sql st_inc NULL +st svtools\source\edit nmake - all st_edit st_inc NULL +st svtools\source\filter.vcl\filter nmake - all st_vfilt st_inc NULL +st svtools\source\filter.vcl\wmf nmake - all st_vwmf st_inc NULL +st svtools\source\filter.vcl\igif nmake - all st_vigif st_inc NULL +st svtools\source\filter.vcl\jpeg nmake - all st_vjpeg st_inc NULL +st svtools\source\filter.vcl\ixbm nmake - all st_vixbm st_inc NULL +st svtools\source\filter.vcl\ixpm nmake - all st_vixpm st_inc NULL +st svtools\source\java nmake - all st_svtjava st_inc NULL +st svtools\source\misc nmake - all st__misc st_bmp st_inc NULL +st svtools\source\plugapp nmake - all st_papp st_inc NULL st svtools\source\svhtml nmake - all st_html st_inc NULL -st svtools\source\syslocale nmake - all st_sysloc st_inc NULL -st svtools\source\filepicker nmake - all st_filepick st_inc NULL -st svtools\util nmake - all st_util st__brw st__ctr st__dde st__item st__item1 st__misc st__misc1 st__url st_ctl st_dial st_edit st_file st_html st_papp st_rtf st_sql st_usdde.u st_psdde.p st_msdde.m st_msc.m st_undo st_uno st_vfilt st_vigif st_vixbm st_vixpm st_vjpeg st_vwmf st_sysloc st_filepick st_not st_conf st_mem st_num st_svtjava NULL -st svtools\source\fsstor nmake - all st_fsstor st_inc NULL +st svtools\source\svrtf nmake - all st_rtf st_inc NULL +st svtools\source\table nmake - all st_table st_inc NULL +st svtools\source\uno nmake - all st_uno st_inc NULL +st svtools\source\urlobj nmake - all st__url st_inc NULL +st svtools\util nmake - all st_util st__brw st__ctr st_conf st_ctl st_dial st_edit st__misc st__url st_html st_papp st_rtf st_table st_uno st_vfilt st_vigif st_vixbm st_vixpm st_vjpeg st_vwmf st_svtjava NULL st svtools\source\hatchwindow nmake - all st_hatchwin st_inc NULL -st svtools\source\passwordcontainer nmake - all st_passcont st_inc NULL st svtools\source\productregistration nmake - all st_prodreg st_util st_inc NULL -st svtools\uno nmake - all st_svtuno st_util st_inc NULL -st svtools\source\java nmake - all st_svtjava st_inc NULL st svtools\workben\unodialog nmake - all st_workben_udlg st_util NULL diff --git a/svtools/prj/d.lst b/svtools/prj/d.lst index 6b85194db6c1..0a3ccd8a9819 100644 --- a/svtools/prj/d.lst +++ b/svtools/prj/d.lst @@ -5,11 +5,8 @@ mkdir: %_DEST%\inc%_EXT%\svtools ..\%COMMON_OUTDIR%\misc\*.hid %COMMON_DEST%\bin%_EXT%\hid\*.hid ..\%__SRC%\srs\ehdl.srs %_DEST%\res%_EXT%\svtools.srs ..\%COMMON_OUTDIR%\srs\ehdl_srs.hid %COMMON_DEST%\res%_EXT%\svtools_srs.hid -..\%__SRC%\lib\isvl.lib %_DEST%\lib%_EXT%\isvl.lib ..\%__SRC%\lib\svtool.lib %_DEST%\lib%_EXT%\svtool.lib ..\%__SRC%\slb\svt.lib %_DEST%\lib%_EXT%\xsvtool.lib -..\%__SRC%\bin\dllver.exe %_DEST%\bin%_EXT%\dllver.exe -..\%__SRC%\bin\dllver %_DEST%\bin%_EXT%\dllver ..\%__SRC%\bin\*.dll %_DEST%\bin%_EXT%\* ..\%__SRC%\bin\*.res %_DEST%\bin%_EXT%\* ..\%__SRC%\bin\bmp.* %_DEST%\bin%_EXT%\bmp.* @@ -25,310 +22,12 @@ mkdir: %_DEST%\inc%_EXT%\svtools ..\%__SRC%\lib\*.so %_DEST%\lib%_EXT%\* ..\%__SRC%\lib\*.dylib %_DEST%\lib%_EXT%\* -..\inc\svtools\svldllapi.h %_DEST%\inc%_EXT%\svtools\svldllapi.h -..\inc\svtools\svtdllapi.h %_DEST%\inc%_EXT%\svtools\svtdllapi.h - -..\inc\svtools\globalnameitem.hxx %_DEST%\inc%_EXT%\svtools\globalnameitem.hxx -..\inc\imagemgr.hxx %_DEST%\inc%_EXT%\svtools\imagemgr.hxx -..\inc\imagemgr.hrc %_DEST%\inc%_EXT%\svtools\imagemgr.hrc -..\inc\testtool.hxx %_DEST%\inc%_EXT%\svtools\testtool.hxx -..\inc\flbytes.hxx %_DEST%\inc%_EXT%\svtools\flbytes.hxx -..\inc\adrparse.hxx %_DEST%\inc%_EXT%\svtools\adrparse.hxx -..\inc\svtools\aeitem.hxx %_DEST%\inc%_EXT%\svtools\aeitem.hxx -..\inc\svtools\brdcst.hxx %_DEST%\inc%_EXT%\svtools\brdcst.hxx -..\inc\broadcast.hxx %_DEST%\inc%_EXT%\svtools\broadcast.hxx -..\inc\svtools\brwbox.hxx %_DEST%\inc%_EXT%\svtools\brwbox.hxx -..\inc\calendar.hxx %_DEST%\inc%_EXT%\svtools\calendar.hxx -..\inc\svtools\cancel.hxx %_DEST%\inc%_EXT%\svtools\cancel.hxx -..\inc\cntnrsrt.hxx %_DEST%\inc%_EXT%\svtools\cntnrsrt.hxx -..\inc\svtools\colrdlg.hxx %_DEST%\inc%_EXT%\svtools\colrdlg.hxx -..\inc\svtools\colctrl.hxx %_DEST%\inc%_EXT%\svtools\colctrl.hxx -..\inc\ctrlbox.hxx %_DEST%\inc%_EXT%\svtools\ctrlbox.hxx -..\inc\ctrltool.hxx %_DEST%\inc%_EXT%\svtools\ctrltool.hxx -..\inc\collatorres.hxx %_DEST%\inc%_EXT%\svtools\collatorres.hxx -..\inc\indexentryres.hxx %_DEST%\inc%_EXT%\svtools\indexentryres.hxx -..\inc\cntwids.hrc %_DEST%\inc%_EXT%\svtools\cntwids.hrc -..\inc\svtools\dateitem.hxx %_DEST%\inc%_EXT%\svtools\dateitem.hxx -..\inc\svtools\dtritem.hxx %_DEST%\inc%_EXT%\svtools\dtritem.hxx -..\inc\svtools\frqitem.hxx %_DEST%\inc%_EXT%\svtools\frqitem.hxx -..\inc\svtools\cstitem.hxx %_DEST%\inc%_EXT%\svtools\cstitem.hxx -..\inc\svtools\tfrmitem.hxx %_DEST%\inc%_EXT%\svtools\tfrmitem.hxx -..\inc\svtools\cntwall.hxx %_DEST%\inc%_EXT%\svtools\cntwall.hxx -..\inc\svtools\langtab.hxx %_DEST%\inc%_EXT%\svtools\langtab.hxx -..\inc\itemdel.hxx %_DEST%\inc%_EXT%\svtools\itemdel.hxx -..\inc\wallitem.hxx %_DEST%\inc%_EXT%\svtools\wallitem.hxx -..\inc\svtools\sfontitm.hxx %_DEST%\inc%_EXT%\svtools\sfontitm.hxx -..\inc\svtools\bintitem.hxx %_DEST%\inc%_EXT%\svtools\bintitem.hxx -..\inc\stylepool.hxx %_DEST%\inc%_EXT%\svtools\stylepool.hxx -..\inc\dialogcontrolling.hxx %_DEST%\inc%_EXT%\svtools\dialogcontrolling.hxx -..\inc\svtools\eitem.hxx %_DEST%\inc%_EXT%\svtools\eitem.hxx -..\inc\eventcfg.hxx %_DEST%\inc%_EXT%\svtools\eventcfg.hxx -..\inc\filedlg.hxx %_DEST%\inc%_EXT%\svtools\filedlg.hxx -..\inc\svtools\filerec.hxx %_DEST%\inc%_EXT%\svtools\filerec.hxx -..\inc\svtools\flagitem.hxx %_DEST%\inc%_EXT%\svtools\flagitem.hxx -..\inc\svtools\fltcall.hxx %_DEST%\inc%_EXT%\svtools\fltcall.hxx -..\inc\svtools\wmf.hxx %_DEST%\inc%_EXT%\svtools\wmf.hxx -..\inc\fltdefs.hxx %_DEST%\inc%_EXT%\svtools\fltdefs.hxx -..\inc\svtools\filter.hxx %_DEST%\inc%_EXT%\svtools\filter.hxx -..\inc\svtools\FilterConfigItem.hxx %_DEST%\inc%_EXT%\svtools\FilterConfigItem.hxx -..\inc\svtools\fmtfield.hxx %_DEST%\inc%_EXT%\svtools\fmtfield.hxx -..\inc\svtools\hint.hxx %_DEST%\inc%_EXT%\svtools\hint.hxx -..\inc\svtools\accessibletableprovider.hxx %_DEST%\inc%_EXT%\svtools\accessibletableprovider.hxx -..\inc\svtools\AccessibleBrowseBoxObjType.hxx %_DEST%\inc%_EXT%\svtools\AccessibleBrowseBoxObjType.hxx -..\inc\svtools\accessiblefactory.hxx %_DEST%\inc%_EXT%\svtools\accessiblefactory.hxx -..\inc\svtools\textwindowpeer.hxx %_DEST%\inc%_EXT%\svtools\textwindowpeer.hxx -..\inc\imgdef.hxx %_DEST%\inc%_EXT%\svtools\imgdef.hxx -..\inc\inetdef.hxx %_DEST%\inc%_EXT%\svtools\inetdef.hxx -..\inc\svtools\inethist.hxx %_DEST%\inc%_EXT%\svtools\inethist.hxx -..\inc\inetmsg.hxx %_DEST%\inc%_EXT%\svtools\inetmsg.hxx -..\inc\inetstrm.hxx %_DEST%\inc%_EXT%\svtools\inetstrm.hxx -..\inc\svtools\intitem.hxx %_DEST%\inc%_EXT%\svtools\intitem.hxx -..\inc\svtools\visitem.hxx %_DEST%\inc%_EXT%\svtools\visitem.hxx -..\inc\svtools\imageitm.hxx %_DEST%\inc%_EXT%\svtools\imageitm.hxx -..\inc\svtools\isethint.hxx %_DEST%\inc%_EXT%\svtools\isethint.hxx -..\inc\svtools\itemiter.hxx %_DEST%\inc%_EXT%\svtools\itemiter.hxx -..\inc\svtools\itempool.hxx %_DEST%\inc%_EXT%\svtools\itempool.hxx -..\inc\svtools\itemset.hxx %_DEST%\inc%_EXT%\svtools\itemset.hxx -..\inc\svtools\lckbitem.hxx %_DEST%\inc%_EXT%\svtools\lckbitem.hxx -..\inc\listener.hxx %_DEST%\inc%_EXT%\svtools\listener.hxx -..\inc\listeneriter.hxx %_DEST%\inc%_EXT%\svtools\listeneriter.hxx -..\inc\svtools\lstner.hxx %_DEST%\inc%_EXT%\svtools\lstner.hxx -..\inc\svtools\macitem.hxx %_DEST%\inc%_EXT%\svtools\macitem.hxx -..\inc\memberid.hrc %_DEST%\inc%_EXT%\svtools\memberid.hrc -..\inc\svtools\nranges.hxx %_DEST%\inc%_EXT%\svtools\nranges.hxx -..\inc\svtools\ownlist.hxx %_DEST%\inc%_EXT%\svtools\ownlist.hxx -..\inc\prgsbar.hxx %_DEST%\inc%_EXT%\svtools\prgsbar.hxx -..\inc\svtools\prnsetup.hxx %_DEST%\inc%_EXT%\svtools\prnsetup.hxx -..\inc\poolcach.hxx %_DEST%\inc%_EXT%\svtools\poolcach.hxx -..\inc\svtools\poolitem.hxx %_DEST%\inc%_EXT%\svtools\poolitem.hxx -..\inc\svtools\printdlg.hxx %_DEST%\inc%_EXT%\svtools\printdlg.hxx -..\inc\svtools\ptitem.hxx %_DEST%\inc%_EXT%\svtools\ptitem.hxx -..\inc\svtools\szitem.hxx %_DEST%\inc%_EXT%\svtools\szitem.hxx -..\inc\svtools\rectitem.hxx %_DEST%\inc%_EXT%\svtools\rectitem.hxx -..\inc\svtools\rngitem.hxx %_DEST%\inc%_EXT%\svtools\rngitem.hxx -..\inc\ruler.hxx %_DEST%\inc%_EXT%\svtools\ruler.hxx -..\inc\scrwin.hxx %_DEST%\inc%_EXT%\svtools\scrwin.hxx -..\inc\svtools\sharecontrolfile.hxx %_DEST%\inc%_EXT%\svtools\sharecontrolfile.hxx -..\inc\svtools\documentlockfile.hxx %_DEST%\inc%_EXT%\svtools\documentlockfile.hxx -..\inc\svtools\lockfilecommon.hxx %_DEST%\inc%_EXT%\svtools\lockfilecommon.hxx -..\inc\svtools\slstitm.hxx %_DEST%\inc%_EXT%\svtools\slstitm.hxx -..\inc\svtools\ilstitem.hxx %_DEST%\inc%_EXT%\svtools\ilstitem.hxx -..\inc\svtools\smplhint.hxx %_DEST%\inc%_EXT%\svtools\smplhint.hxx -..\inc\svtools\cnclhint.hxx %_DEST%\inc%_EXT%\svtools\cnclhint.hxx -..\inc\svtools\inettype.hxx %_DEST%\inc%_EXT%\svtools\inettype.hxx -..\inc\svtools\brwhead.hxx %_DEST%\inc%_EXT%\svtools\brwhead.hxx -..\inc\svtools\solar.hrc %_DEST%\inc%_EXT%\svtools\solar.hrc -..\inc\scriptedtext.hxx %_DEST%\inc%_EXT%\svtools\scriptedtext.hxx -..\inc\svtools\stdctrl.hxx %_DEST%\inc%_EXT%\svtools\stdctrl.hxx -..\inc\svtools\stritem.hxx %_DEST%\inc%_EXT%\svtools\stritem.hxx -..\inc\svtools\style.hrc %_DEST%\inc%_EXT%\svtools\style.hrc -..\inc\svtools\style.hxx %_DEST%\inc%_EXT%\svtools\style.hxx -..\inc\svtools\svarray.hxx %_DEST%\inc%_EXT%\svtools\svarray.hxx -..\inc\svtools\svdde.hxx %_DEST%\inc%_EXT%\svtools\svdde.hxx -..\inc\svtools\svtdata.hxx %_DEST%\inc%_EXT%\svtools\svtdata.hxx -..\inc\tabbar.hxx %_DEST%\inc%_EXT%\svtools\tabbar.hxx -..\inc\taskbar.hxx %_DEST%\inc%_EXT%\svtools\taskbar.hxx -..\inc\svtools\undo.hxx %_DEST%\inc%_EXT%\svtools\undo.hxx -..\inc\whiter.hxx %_DEST%\inc%_EXT%\svtools\whiter.hxx -..\inc\svtools\valueset.hxx %_DEST%\inc%_EXT%\svtools\valueset.hxx -..\inc\stdmenu.hxx %_DEST%\inc%_EXT%\svtools\stdmenu.hxx -..\inc\svtools\headbar.hxx %_DEST%\inc%_EXT%\svtools\headbar.hxx -..\inc\svtools\svicnvw.hxx %_DEST%\inc%_EXT%\svtools\svicnvw.hxx -..\inc\svtools\svlbitm.hxx %_DEST%\inc%_EXT%\svtools\svlbitm.hxx -..\inc\svtools\svlbox.hxx %_DEST%\inc%_EXT%\svtools\svlbox.hxx -..\inc\svtools\svtabbx.hxx %_DEST%\inc%_EXT%\svtools\svtabbx.hxx -..\inc\svtools\svtreebx.hxx %_DEST%\inc%_EXT%\svtools\svtreebx.hxx -..\inc\tooltiplbox.hxx %_DEST%\inc%_EXT%\svtools\tooltiplbox.hxx -..\inc\svtools\treelist.hxx %_DEST%\inc%_EXT%\svtools\treelist.hxx -..\inc\svtools\xtextedt.hxx %_DEST%\inc%_EXT%\svtools\xtextedt.hxx -..\inc\svtools\texteng.hxx %_DEST%\inc%_EXT%\svtools\texteng.hxx -..\inc\svtools\textview.hxx %_DEST%\inc%_EXT%\svtools\textview.hxx -..\inc\svtools\textdata.hxx %_DEST%\inc%_EXT%\svtools\textdata.hxx -..\inc\txtattr.hxx %_DEST%\inc%_EXT%\svtools\txtattr.hxx -..\inc\sychconv.hxx %_DEST%\inc%_EXT%\svtools\sychconv.hxx -..\inc\svtools\ttprops.hxx %_DEST%\inc%_EXT%\svtools\ttprops.hxx -..\inc\svtools\transfer.hxx %_DEST%\inc%_EXT%\svtools\transfer.hxx -..\inc\svtools\embedtransfer.hxx %_DEST%\inc%_EXT%\svtools\embedtransfer.hxx -..\inc\svtools\embedhlp.hxx %_DEST%\inc%_EXT%\svtools\embedhlp.hxx -..\inc\cliplistener.hxx %_DEST%\inc%_EXT%\svtools\cliplistener.hxx -..\inc\txtcmp.hxx %_DEST%\inc%_EXT%\svtools\txtcmp.hxx -..\inc\urlbmk.hxx %_DEST%\inc%_EXT%\svtools\urlbmk.hxx -..\inc\inetimg.hxx %_DEST%\inc%_EXT%\svtools\inetimg.hxx -..\inc\svtools\svmedit.hxx %_DEST%\inc%_EXT%\svtools\svmedit.hxx -..\inc\svtools\editsyntaxhighlighter.hxx %_DEST%\inc%_EXT%\svtools\editsyntaxhighlighter.hxx -..\inc\svtools\syntaxhighlight.hxx %_DEST%\inc%_EXT%\svtools\syntaxhighlight.hxx -..\inc\svtools\svmedit2.hxx %_DEST%\inc%_EXT%\svtools\svmedit2.hxx -..\inc\svtools\svstdarr.hxx %_DEST%\inc%_EXT%\svtools\svstdarr.hxx -..\inc\svtools\metitem.hxx %_DEST%\inc%_EXT%\svtools\metitem.hxx -..\inc\svtools\nfversi.hxx %_DEST%\inc%_EXT%\svtools\nfversi.hxx -..\inc\svtools\nfkeytab.hxx %_DEST%\inc%_EXT%\svtools\nfkeytab.hxx -..\inc\nfsymbol.hxx %_DEST%\inc%_EXT%\svtools\nfsymbol.hxx -..\inc\svtools\wizdlg.hxx %_DEST%\inc%_EXT%\svtools\wizdlg.hxx -..\inc\svtools\zforlist.hxx %_DEST%\inc%_EXT%\svtools\zforlist.hxx -..\inc\svtools\zformat.hxx %_DEST%\inc%_EXT%\svtools\zformat.hxx -..\inc\numuno.hxx %_DEST%\inc%_EXT%\svtools\numuno.hxx -..\inc\svtools\ondemand.hxx %_DEST%\inc%_EXT%\svtools\ondemand.hxx -..\inc\svtools\loginerr.hxx %_DEST%\inc%_EXT%\svtools\loginerr.hxx -..\inc\svtools\logindlg.hxx %_DEST%\inc%_EXT%\svtools\logindlg.hxx -..\inc\svtools\httpcook.hxx %_DEST%\inc%_EXT%\svtools\httpcook.hxx -..\inc\imageresourceaccess.hxx %_DEST%\inc%_EXT%\svtools\imageresourceaccess.hxx -..\inc\svtools\itemprop.hxx %_DEST%\inc%_EXT%\svtools\itemprop.hxx -..\inc\addresstemplate.hxx %_DEST%\inc%_EXT%\svtools\addresstemplate.hxx -..\inc\svtools\genericunodialog.hxx %_DEST%\inc%_EXT%\svtools\genericunodialog.hxx -..\inc\svtools\editbrowsebox.hxx %_DEST%\inc%_EXT%\svtools\editbrowsebox.hxx -..\inc\svtools\editimplementation.hxx %_DEST%\inc%_EXT%\svtools\editimplementation.hxx -..\inc\templatefoldercache.hxx %_DEST%\inc%_EXT%\svtools\templatefoldercache.hxx -..\inc\folderrestriction.hxx %_DEST%\inc%_EXT%\svtools\folderrestriction.hxx -..\inc\filenotation.hxx %_DEST%\inc%_EXT%\svtools\filenotation.hxx -..\inc\svtools\urlcontrol.hxx %_DEST%\inc%_EXT%\svtools\urlcontrol.hxx -..\inc\svtools\fileurlbox.hxx %_DEST%\inc%_EXT%\svtools\fileurlbox.hxx -..\inc\svtools\toolboxcontroller.hxx %_DEST%\inc%_EXT%\svtools\toolboxcontroller.hxx -..\inc\framestatuslistener.hxx %_DEST%\inc%_EXT%\svtools\framestatuslistener.hxx -..\inc\statusbarcontroller.hxx %_DEST%\inc%_EXT%\svtools\statusbarcontroller.hxx -..\inc\svtools\generictoolboxcontroller.hxx %_DEST%\inc%_EXT%\svtools\generictoolboxcontroller.hxx -..\inc\svtools\restrictedpaths.hxx %_DEST%\inc%_EXT%\svtools\restrictedpaths.hxx - -..\inc\svtools\imap.hxx %_DEST%\inc%_EXT%\svtools\imap.hxx -..\inc\svtools\imapobj.hxx %_DEST%\inc%_EXT%\svtools\imapobj.hxx -..\inc\svtools\imaprect.hxx %_DEST%\inc%_EXT%\svtools\imaprect.hxx -..\inc\svtools\imapcirc.hxx %_DEST%\inc%_EXT%\svtools\imapcirc.hxx -..\inc\svtools\imappoly.hxx %_DEST%\inc%_EXT%\svtools\imappoly.hxx - -..\inc\svtools\parhtml.hxx %_DEST%\inc%_EXT%\svtools\parhtml.hxx -..\inc\htmltokn.h %_DEST%\inc%_EXT%\svtools\htmltokn.h -..\inc\htmlkywd.hxx %_DEST%\inc%_EXT%\svtools\htmlkywd.hxx -..\inc\svtools\svparser.hxx %_DEST%\inc%_EXT%\svtools\svparser.hxx -..\inc\svtools\htmlout.hxx %_DEST%\inc%_EXT%\svtools\htmlout.hxx -..\source\svrtf\rtfout.hxx %_DEST%\inc%_EXT%\svtools\rtfout.hxx -..\inc\svtools\parrtf.hxx %_DEST%\inc%_EXT%\svtools\parrtf.hxx -..\source\svrtf\rtftoken.h %_DEST%\inc%_EXT%\svtools\rtftoken.h -..\source\svrtf\rtfkeywd.hxx %_DEST%\inc%_EXT%\svtools\rtfkeywd.hxx - -..\inc\svtools\ctypeitm.hxx %_DEST%\inc%_EXT%\svtools\ctypeitm.hxx - -..\inc\strmadpt.hxx %_DEST%\inc%_EXT%\svtools\strmadpt.hxx -..\inc\instrm.hxx %_DEST%\inc%_EXT%\svtools\instrm.hxx -..\inc\outstrm.hxx %_DEST%\inc%_EXT%\svtools\outstrm.hxx - -..\inc\svtools\section.hxx %_DEST%\inc%_EXT%\svtools\section.hxx -..\inc\sectctr.hxx %_DEST%\inc%_EXT%\svtools\sectctr.hxx -..\inc\privsplt.hxx %_DEST%\inc%_EXT%\svtools\privsplt.hxx -..\inc\expander.hxx %_DEST%\inc%_EXT%\svtools\expander.hxx -..\source\svsql\converter.hxx %_DEST%\inc%_EXT%\svtools\converter.hxx - -..\inc\filectrl.hxx %_DEST%\inc%_EXT%\svtools\filectrl.hxx -..\inc\svtools\cenumitm.hxx %_DEST%\inc%_EXT%\svtools\cenumitm.hxx -..\inc\svtools\cintitem.hxx %_DEST%\inc%_EXT%\svtools\cintitem.hxx -..\inc\svtools\custritm.hxx %_DEST%\inc%_EXT%\svtools\custritm.hxx - -..\inc\sfxecode.hxx %_DEST%\inc%_EXT%\svtools\sfxecode.hxx -..\inc\svtools\ehdl.hxx %_DEST%\inc%_EXT%\svtools\ehdl.hxx -..\inc\svtools\svtools.hrc %_DEST%\inc%_EXT%\svtools\svtools.hrc -..\source\dialogs\filedlg2.hrc %_DEST%\inc%_EXT%\svtools\filedlg2.hrc - -..\inc\xmlement.hxx %_DEST%\inc%_EXT%\svtools\xmlement.hxx -..\inc\svtools\tresitem.hxx %_DEST%\inc%_EXT%\svtools\tresitem.hxx -..\inc\urihelper.hxx %_DEST%\inc%_EXT%\svtools\urihelper.hxx -..\inc\reginfo.hxx %_DEST%\inc%_EXT%\svtools\reginfo.hxx -..\inc\cacheoptions.hxx %_DEST%\inc%_EXT%\svtools\cacheoptions.hxx -..\inc\svtools\cjkoptions.hxx %_DEST%\inc%_EXT%\svtools\cjkoptions.hxx -..\inc\javaoptions.hxx %_DEST%\inc%_EXT%\svtools\javaoptions.hxx -..\inc\svtools\accelcfg.hxx %_DEST%\inc%_EXT%\svtools\accelcfg.hxx -..\inc\svtools\pathoptions.hxx %_DEST%\inc%_EXT%\svtools\pathoptions.hxx -..\inc\svtools\useroptions.hxx %_DEST%\inc%_EXT%\svtools\useroptions.hxx -..\inc\fstathelper.hxx %_DEST%\inc%_EXT%\svtools\fstathelper.hxx -..\inc\svtools\saveopt.hxx %_DEST%\inc%_EXT%\svtools\saveopt.hxx -..\inc\svtools\undoopt.hxx %_DEST%\inc%_EXT%\svtools\undoopt.hxx -..\inc\svtools\helpopt.hxx %_DEST%\inc%_EXT%\svtools\helpopt.hxx -..\inc\svtools\optionsdlg.hxx %_DEST%\inc%_EXT%\svtools\optionsdlg.hxx -..\inc\svtools\moduleoptions.hxx %_DEST%\inc%_EXT%\svtools\moduleoptions.hxx -..\inc\svtools\securityoptions.hxx %_DEST%\inc%_EXT%\svtools\securityoptions.hxx -..\inc\svtools\extendedsecurityoptions.hxx %_DEST%\inc%_EXT%\svtools\extendedsecurityoptions.hxx -..\inc\svtools\miscopt.hxx %_DEST%\inc%_EXT%\svtools\miscopt.hxx -..\inc\svtools\localisationoptions.hxx %_DEST%\inc%_EXT%\svtools\localisationoptions.hxx -..\inc\svtools\workingsetoptions.hxx %_DEST%\inc%_EXT%\svtools\workingsetoptions.hxx -..\inc\svtools\viewoptions.hxx %_DEST%\inc%_EXT%\svtools\viewoptions.hxx -..\inc\svtools\internaloptions.hxx %_DEST%\inc%_EXT%\svtools\internaloptions.hxx -..\inc\svtools\startoptions.hxx %_DEST%\inc%_EXT%\svtools\startoptions.hxx -..\inc\svtools\historyoptions.hxx %_DEST%\inc%_EXT%\svtools\historyoptions.hxx -..\inc\svtools\inetoptions.hxx %_DEST%\inc%_EXT%\svtools\inetoptions.hxx -..\inc\svtools\menuoptions.hxx %_DEST%\inc%_EXT%\svtools\menuoptions.hxx -..\inc\svtools\options3d.hxx %_DEST%\inc%_EXT%\svtools\options3d.hxx -..\inc\svtools\optionsdrawinglayer.hxx %_DEST%\inc%_EXT%\svtools\optionsdrawinglayer.hxx -..\inc\svtools\fontoptions.hxx %_DEST%\inc%_EXT%\svtools\fontoptions.hxx -..\inc\svtools\addxmltostorageoptions.hxx %_DEST%\inc%_EXT%\svtools\addxmltostorageoptions.hxx -..\inc\svtools\defaultoptions.hxx %_DEST%\inc%_EXT%\svtools\defaultoptions.hxx -..\inc\svtools\printwarningoptions.hxx %_DEST%\inc%_EXT%\svtools\printwarningoptions.hxx -..\inc\svtools\printoptions.hxx %_DEST%\inc%_EXT%\svtools\printoptions.hxx -..\inc\svtools\dynamicmenuoptions.hxx %_DEST%\inc%_EXT%\svtools\dynamicmenuoptions.hxx -..\inc\svtools\compatibility.hxx %_DEST%\inc%_EXT%\svtools\compatibility.hxx -..\inc\svtools\syslocaleoptions.hxx %_DEST%\inc%_EXT%\svtools\syslocaleoptions.hxx -..\inc\localresaccess.hxx %_DEST%\inc%_EXT%\svtools\localresaccess.hxx -..\inc\svtools\wizardmachine.hxx %_DEST%\inc%_EXT%\svtools\wizardmachine.hxx -..\inc\svtools\roadmapwizard.hxx %_DEST%\inc%_EXT%\svtools\roadmapwizard.hxx -..\inc\roadmap.hxx %_DEST%\inc%_EXT%\svtools\roadmap.hxx -..\inc\svtools\hyperlabel.hxx %_DEST%\inc%_EXT%\svtools\hyperlabel.hxx -..\inc\svtools\fixedhyper.hxx %_DEST%\inc%_EXT%\svtools\fixedhyper.hxx -..\inc\helpagentwindow.hxx %_DEST%\inc%_EXT%\svtools\helpagentwindow.hxx -..\inc\pickerhistory.hxx %_DEST%\inc%_EXT%\svtools\pickerhistory.hxx -..\inc\pickerhistoryaccess.hxx %_DEST%\inc%_EXT%\svtools\pickerhistoryaccess.hxx -..\inc\pickerhelper.hxx %_DEST%\inc%_EXT%\svtools\pickerhelper.hxx -..\inc\regoptions.hxx %_DEST%\inc%_EXT%\svtools\regoptions.hxx -..\inc\svtools\accessibilityoptions.hxx %_DEST%\inc%_EXT%\svtools\accessibilityoptions.hxx -..\inc\svtools\cmdoptions.hxx %_DEST%\inc%_EXT%\svtools\cmdoptions.hxx -..\inc\svtools\ctloptions.hxx %_DEST%\inc%_EXT%\svtools\ctloptions.hxx -..\inc\svtools\languageoptions.hxx %_DEST%\inc%_EXT%\svtools\languageoptions.hxx -..\inc\svtools\sourceviewconfig.hxx %_DEST%\inc%_EXT%\svtools\sourceviewconfig.hxx -..\inc\svtools\colorcfg.hxx %_DEST%\inc%_EXT%\svtools\colorcfg.hxx - -..\inc\lngmisc.hxx %_DEST%\inc%_EXT%\svtools\lngmisc.hxx -..\inc\svtools\lingucfg.hxx %_DEST%\inc%_EXT%\svtools\lingucfg.hxx -..\inc\linguprops.hxx %_DEST%\inc%_EXT%\svtools\linguprops.hxx -..\inc\searchopt.hxx %_DEST%\inc%_EXT%\svtools\searchopt.hxx - -..\inc\PasswordHelper.hxx %_DEST%\inc%_EXT%\svtools\PasswordHelper.hxx - -..\inc\svtools\syslocale.hxx %_DEST%\inc%_EXT%\svtools\syslocale.hxx - -..\inc\unoimap.hxx %_DEST%\inc%_EXT%\svtools\unoimap.hxx -..\inc\unoevent.hxx %_DEST%\inc%_EXT%\svtools\unoevent.hxx - -..\inc\svtools\stringtransfer.hxx %_DEST%\inc%_EXT%\svtools\stringtransfer.hxx - -..\inc\ivctrl.hxx %_DEST%\inc%_EXT%\svtools\ivctrl.hxx -..\inc\fileview.hxx %_DEST%\inc%_EXT%\svtools\fileview.hxx -..\inc\templdlg.hxx %_DEST%\inc%_EXT%\svtools\templdlg.hxx -..\inc\asynclink.hxx %_DEST%\inc%_EXT%\svtools\asynclink.hxx -..\inc\svtools\inettbc.hxx %_DEST%\inc%_EXT%\svtools\inettbc.hxx -..\inc\svtools\urlfilter.hxx %_DEST%\inc%_EXT%\svtools\urlfilter.hxx - -..\inc\controldims.hrc %_DEST%\inc%_EXT%\svtools\controldims.hrc - -..\inc\svtools\helpid.hrc %_DEST%\inc%_EXT%\svtools\helpid.hrc -..\inc\svtools\insdlg.hxx %_DEST%\inc%_EXT%\svtools\insdlg.hxx -..\inc\soerr.hxx %_DEST%\inc%_EXT%\svtools\soerr.hxx -..\inc\sores.hxx %_DEST%\inc%_EXT%\svtools\sores.hxx - -..\inc\textwindowaccessibility.hxx %_DEST%\inc%_EXT%\svtools\textwindowaccessibility.hxx - -..\inc\docpasswdrequest.hxx %_DEST%\inc%_EXT%\svtools\docpasswdrequest.hxx -..\inc\fontsubstconfig.hxx %_DEST%\inc%_EXT%\svtools\fontsubstconfig.hxx -..\inc\apearcfg.hxx %_DEST%\inc%_EXT%\svtools\apearcfg.hxx -..\inc\fltrcfg.hxx %_DEST%\inc%_EXT%\svtools\fltrcfg.hxx -..\inc\misccfg.hxx %_DEST%\inc%_EXT%\svtools\misccfg.hxx -..\inc\acceleratorexecute.hxx %_DEST%\inc%_EXT%\svtools\acceleratorexecute.hxx - -..\inc\QueryFolderName.hxx %_DEST%\inc%_EXT%\svtools\QueryFolderName.hxx -..\inc\DocumentInfoPreview.hxx %_DEST%\inc%_EXT%\svtools\DocumentInfoPreview.hxx -..\inc\svtools\javacontext.hxx %_DEST%\inc%_EXT%\svtools\javacontext.hxx -..\inc\svtools\javainteractionhandler.hxx %_DEST%\inc%_EXT%\svtools\javainteractionhandler.hxx -..\inc\dialogclosedlistener.hxx %_DEST%\inc%_EXT%\svtools\dialogclosedlistener.hxx -..\inc\svtools\options.hxx %_DEST%\inc%_EXT%\svtools\options.hxx -..\inc\contextmenuhelper.hxx %_DEST%\inc%_EXT%\svtools\contextmenuhelper.hxx -..\inc\extcolorcfg.hxx %_DEST%\inc%_EXT%\svtools\extcolorcfg.hxx - -..\inc\svtools\chartprettypainter.hxx %_DEST%\inc%_EXT%\svtools\chartprettypainter.hxx -..\inc\svtools\extensionlistbox.hxx %_DEST%\inc%_EXT%\svtools\extensionlistbox.hxx +..\inc\svtools\*.hxx %_DEST%\inc%_EXT%\svtools\*.hxx +..\inc\svtools\*.h %_DEST%\inc%_EXT%\svtools\*.h +..\inc\svtools\*.hrc %_DEST%\inc%_EXT%\svtools\*.hrc +..\inc\*.hxx %_DEST%\inc%_EXT%\svtools\*.hxx +..\inc\*.h %_DEST%\inc%_EXT%\svtools\*.h +..\inc\*.hrc %_DEST%\inc%_EXT%\svtools\*.hrc dos: sh -c "if test %OS% = MACOSX; then macosx-create-bundle %_DEST%\bin%_EXT%\bmp=%__PRJROOT%\%__SRC%\bin%_EXT%; fi" diff --git a/svtools/source/brwbox/brwbox1.cxx b/svtools/source/brwbox/brwbox1.cxx index 767283a8e425..4ebed0d70f3f 100644 --- a/svtools/source/brwbox/brwbox1.cxx +++ b/svtools/source/brwbox/brwbox1.cxx @@ -538,7 +538,7 @@ void BrowseBox::SetColumnPos( USHORT nColumnId, USHORT nPos ) aScrollArea = Rectangle(Point(aNextRect.Left(),0), Point(aToRect.Right(),aDataWinSize.Height())); - pDataWin->Scroll( nScroll, 0, aScrollArea, SCROLL_FLAGS ); + pDataWin->Scroll( nScroll, 0, aScrollArea ); aToRect.Top() = 0; aToRect.Bottom() = aScrollArea.Bottom(); Invalidate( aToRect ); diff --git a/svtools/source/brwbox/editbrowsebox.cxx b/svtools/source/brwbox/editbrowsebox.cxx index 086e00674a8e..09d1f5c869b9 100644 --- a/svtools/source/brwbox/editbrowsebox.cxx +++ b/svtools/source/brwbox/editbrowsebox.cxx @@ -50,7 +50,7 @@ #include #ifndef _SVTOOLS_HRC -#include +#include #endif #include @@ -70,17 +70,7 @@ namespace svt sal_Bool isHiContrast(Window* _pWindow) { OSL_ENSURE(_pWindow,"Window must be not null!"); - Window* pIter = _pWindow; - // while( pIter && pIter->GetBackground().GetColor().GetColor() == COL_TRANSPARENT ) - while( pIter ) - { - const Color& aColor = pIter->GetBackground().GetColor(); - if ( aColor.GetColor() == COL_TRANSPARENT ) - pIter = pIter->GetParent(); - else - break; - } - return pIter && pIter->GetBackground().GetColor().IsDark(); + return _pWindow && _pWindow->GetSettings().GetStyleSettings().GetHighContrastMode(); } //.............................................................. diff --git a/svtools/source/brwbox/editbrowsebox.src b/svtools/source/brwbox/editbrowsebox.src index 39991363c906..c04e1294c0af 100644 --- a/svtools/source/brwbox/editbrowsebox.src +++ b/svtools/source/brwbox/editbrowsebox.src @@ -33,7 +33,7 @@ #endif #ifndef _SVTOOLS_HRC -#include +#include #endif ImageList RID_SVTOOLS_IMAGELIST_EDITBROWSEBOX diff --git a/svtools/source/config/accessibilityoptions.cxx b/svtools/source/config/accessibilityoptions.cxx index 6f1e3882d705..4077231c5c84 100644 --- a/svtools/source/config/accessibilityoptions.cxx +++ b/svtools/source/config/accessibilityoptions.cxx @@ -31,11 +31,6 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION - #include #include "configitems/accessibilityoptions_const.hxx" @@ -57,10 +52,10 @@ #include #endif #ifndef _SVT_LOGHELPER_HXX_ -#include +#include #endif -#include +#include #include #include @@ -544,7 +539,7 @@ SvtAccessibilityOptions::~SvtAccessibilityOptions() void SvtAccessibilityOptions::Notify( SfxBroadcaster&, const SfxHint& rHint ) { - Broadcast( rHint ); + NotifyListeners(0); if ( rHint.IsA(TYPE(SfxSimpleHint)) ) { if ( ((SfxSimpleHint&)rHint).GetId() == SFX_HINT_ACCESSIBILITY_CHANGED ) diff --git a/svtools/source/config/addxmltostorageoptions.cxx b/svtools/source/config/addxmltostorageoptions.cxx deleted file mode 100644 index 92e2369a2a70..000000000000 --- a/svtools/source/config/addxmltostorageoptions.cxx +++ /dev/null @@ -1,291 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: addxmltostorageoptions.cxx,v $ - * $Revision: 1.9 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#ifndef GCC -#endif - -//_________________________________________________________________________________________________________________ -// includes -//_________________________________________________________________________________________________________________ - -#include -#include -#include -#include -#include -#include -#include - -#include -#include "itemholder1.hxx" - -//_________________________________________________________________________________________________________________ -// namespaces -//_________________________________________________________________________________________________________________ - -using namespace ::utl; -using namespace ::rtl; -using namespace ::osl; -using namespace ::com::sun::star::uno; - -//***************************************************************************************************************** -// initialize static member -// DON'T DO IT IN YOUR HEADER! -// see definition for further informations -//***************************************************************************************************************** -SvtAddXMLToStorageOptions_Impl* SvtAddXMLToStorageOptions::m_pDataContainer = 0; -sal_Int32 SvtAddXMLToStorageOptions::m_nRefCount = 0; - - -//_________________________________________________________________________________________________________________ -// private declarations! -//_________________________________________________________________________________________________________________ - -class SvtAddXMLToStorageOptions_Impl : public ConfigItem -{ - //------------------------------------------------------------------------------------------------------------- - // public methods - //------------------------------------------------------------------------------------------------------------- - - public: - - //--------------------------------------------------------------------------------------------------------- - // constructor / destructor - //--------------------------------------------------------------------------------------------------------- - - SvtAddXMLToStorageOptions_Impl(); - - //--------------------------------------------------------------------------------------------------------- - // overloaded methods of baseclass - //--------------------------------------------------------------------------------------------------------- - - //--------------------------------------------------------------------------------------------------------- - // public interface - //--------------------------------------------------------------------------------------------------------- - - /*-****************************************************************************************************//** - @short access method to get internal values - @descr These method give us a chance to regulate acces to ouer internal values. - It's not used in the moment - but it's possible for the feature! - - @seealso - - - @param - - @return - - - @onerror - - *//*-*****************************************************************************************************/ - - sal_Bool IsWriter_Add_XML_to_Storage() const { return bAddXmlToStg_Writer; } - sal_Bool IsCalc_Add_XML_to_Storage() const { return bAddXmlToStg_Calc; } - sal_Bool IsImpress_Add_XML_to_Storage() const { return bAddXmlToStg_Impress; } - sal_Bool IsDraw_Add_XML_to_Storage() const { return bAddXmlToStg_Draw; } - - //------------------------------------------------------------------------------------------------------------- - // private methods - //------------------------------------------------------------------------------------------------------------- - - private: - - /*-****************************************************************************************************//** - @short return list of key names of ouer configuration management which represent oue module tree - @descr These methods return a static const list of key names. We need it to get needed values from our - configuration management. - - @seealso - - - @param - - @return A list of needed configuration keys is returned. - - @onerror - - *//*-*****************************************************************************************************/ - - static Sequence< OUString > GetPropertyNames(); - - //------------------------------------------------------------------------------------------------------------- - // private member - //------------------------------------------------------------------------------------------------------------- - - private: - - sal_Bool bAddXmlToStg_Writer, - bAddXmlToStg_Calc, - bAddXmlToStg_Impress, - bAddXmlToStg_Draw; -}; - -//_________________________________________________________________________________________________________________ -// definitions -//_________________________________________________________________________________________________________________ - - -//***************************************************************************************************************** -// constructor -//***************************************************************************************************************** -SvtAddXMLToStorageOptions_Impl::SvtAddXMLToStorageOptions_Impl() - // Init baseclasses first - : ConfigItem( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( - "Office.Common/AddXMLToStorage"))), - // Init member then. - bAddXmlToStg_Writer( FALSE ), - bAddXmlToStg_Calc( FALSE ), - bAddXmlToStg_Impress( FALSE ), - bAddXmlToStg_Draw( FALSE ) -{ - // Use our static list of configuration keys to get his values. - Sequence< OUString > seqNames = GetPropertyNames(); - Sequence< Any > seqValues = GetProperties( seqNames ); - - // Copy values from list in right order to ouer internal member. - sal_Int32 nPropertyCount = seqValues.getLength(); - const Any* pValue = seqValues.getConstArray(); - for( sal_Int32 nProperty=0; nPropertyhasValue() ) - - switch( nProperty ) - { - case 0: - *pValue >>= bAddXmlToStg_Writer; - break; - case 1: - *pValue >>= bAddXmlToStg_Calc; - break; - case 2: - *pValue >>= bAddXmlToStg_Impress; - break; - case 3: - *pValue >>= bAddXmlToStg_Draw; - break; - } -} - -//***************************************************************************************************************** -// private method -//***************************************************************************************************************** -Sequence< OUString > SvtAddXMLToStorageOptions_Impl::GetPropertyNames() -{ - // Build static list of configuration key names. - static const sal_Char* pProperties[] = - { - "Writer", - "Calc", - "Impress", - "Draw" - }; - - const sal_uInt16 nCnt = sizeof(pProperties) / sizeof( pProperties[0] ); - Sequence aNames( nCnt ); - OUString* pNames = aNames.getArray(); - for( sal_uInt16 n = 0; n < nCnt; ++n ) - pNames[ n ] = OUString::createFromAscii( pProperties[ n ] ); - return aNames; -} - - -//***************************************************************************************************************** -// constructor -//***************************************************************************************************************** -SvtAddXMLToStorageOptions::SvtAddXMLToStorageOptions() -{ - // Global access, must be guarded (multithreading!). - MutexGuard aGuard( GetOwnStaticMutex() ); - // Increase ouer refcount ... - ++m_nRefCount; - // ... and initialize ouer data container only if it not already exist! - if( !m_pDataContainer ) - { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtAddXMLToStorageOptions_Impl::ctor()"); - m_pDataContainer = new SvtAddXMLToStorageOptions_Impl; - - ItemHolder1::holdConfigItem(E_ADDXMLTOSTORAGEOPTIONS); - } -} - -//***************************************************************************************************************** -// destructor -//***************************************************************************************************************** -SvtAddXMLToStorageOptions::~SvtAddXMLToStorageOptions() -{ - // Global access, must be guarded (multithreading!) - MutexGuard aGuard( GetOwnStaticMutex() ); - // Decrease ouer refcount. - // If last instance was deleted ... - // we must destroy ouer static data container! - if( !--m_nRefCount ) - delete m_pDataContainer, m_pDataContainer = 0; -} - -sal_Bool SvtAddXMLToStorageOptions::IsWriter_Add_XML_to_Storage() const -{ - MutexGuard aGuard( GetOwnStaticMutex() ); - return m_pDataContainer->IsWriter_Add_XML_to_Storage(); -} -sal_Bool SvtAddXMLToStorageOptions::IsCalc_Add_XML_to_Storage() const -{ - MutexGuard aGuard( GetOwnStaticMutex() ); - return m_pDataContainer->IsCalc_Add_XML_to_Storage(); -} -sal_Bool SvtAddXMLToStorageOptions::IsImpress_Add_XML_to_Storage() const -{ - MutexGuard aGuard( GetOwnStaticMutex() ); - return m_pDataContainer->IsImpress_Add_XML_to_Storage(); -} -sal_Bool SvtAddXMLToStorageOptions::IsDraw_Add_XML_to_Storage() const -{ - MutexGuard aGuard( GetOwnStaticMutex() ); - return m_pDataContainer->IsDraw_Add_XML_to_Storage(); -} - -//***************************************************************************************************************** -// private method -//***************************************************************************************************************** -Mutex& SvtAddXMLToStorageOptions::GetOwnStaticMutex() -{ - // Initialize static mutex only for one time! - static Mutex* pMutex = NULL; - // If these method first called (Mutex not already exist!) ... - if( pMutex == NULL ) - { - // ... we must create a new one. Protect follow code with the global mutex - - // It must be - we create a static variable! - MutexGuard aGuard( Mutex::getGlobalMutex() ); - // We must check our pointer again - because it can be that another instance of ouer class will be fastr then these! - if( pMutex == NULL ) - { - // Create the new mutex and set it for return on static variable. - static Mutex aMutex; - pMutex = &aMutex; - } - } - // Return new created or already existing mutex object. - return *pMutex; -} diff --git a/svtools/source/config/apearcfg.cxx b/svtools/source/config/apearcfg.cxx index 35a07a715dd5..0d4865ee563e 100644 --- a/svtools/source/config/apearcfg.cxx +++ b/svtools/source/config/apearcfg.cxx @@ -31,11 +31,6 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION - #include "apearcfg.hxx" #include "com/sun/star/uno/Any.hxx" @@ -176,6 +171,11 @@ void SvtTabAppearanceCfg::Commit() } PutProperties(rNames, aValues); } + +void SvtTabAppearanceCfg::Notify( const com::sun::star::uno::Sequence< rtl::OUString >& ) +{ +} + /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ diff --git a/svtools/source/config/colorcfg.cxx b/svtools/source/config/colorcfg.cxx index 0c39fde11390..9008d7a27ee1 100644 --- a/svtools/source/config/colorcfg.cxx +++ b/svtools/source/config/colorcfg.cxx @@ -31,11 +31,6 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION - #include #include #include @@ -46,8 +41,8 @@ #include #include #include -#include //Any2Bool -#include +#include //Any2Bool +#include #include #include @@ -81,15 +76,12 @@ ColorConfig_Impl* ColorConfig::m_pImpl = NULL; /* -----------------------------16.01.01 15:36-------------------------------- ---------------------------------------------------------------------------*/ -class ColorConfig_Impl : public utl::ConfigItem, public SfxBroadcaster +class ColorConfig_Impl : public utl::ConfigItem { ColorConfigValue m_aConfigValues[ColorConfigEntryCount]; sal_Bool m_bEditMode; rtl::OUString m_sIsVisible; rtl::OUString m_sLoadedScheme; - sal_Bool m_bIsBroadcastEnabled; - static sal_Bool m_bLockBroadcast; - static sal_Bool m_bBroadcastWhenUnlocked; uno::Sequence< ::rtl::OUString> GetPropertyNames(const rtl::OUString& rScheme); public: @@ -118,13 +110,6 @@ public: void ClearModified(){ConfigItem::ClearModified();} void SettingsChanged(); - static void DisableBroadcast(); - static void EnableBroadcast(); - static sal_Bool IsEnableBroadcast(); - - static void LockBroadcast(); - static void UnlockBroadcast(); - // #100822# DECL_LINK( DataChangedEventListener, VclWindowEvent* ); @@ -219,13 +204,10 @@ uno::Sequence< OUString> ColorConfig_Impl::GetPropertyNames(const rtl::OUString& /* -----------------------------22.03.2002 14:37------------------------------ ---------------------------------------------------------------------------*/ -sal_Bool ColorConfig_Impl::m_bLockBroadcast = sal_False; -sal_Bool ColorConfig_Impl::m_bBroadcastWhenUnlocked = sal_False; ColorConfig_Impl::ColorConfig_Impl(sal_Bool bEditMode) : ConfigItem(C2U("Office.UI/ColorScheme")), m_bEditMode(bEditMode), - m_sIsVisible(C2U("/IsVisible")), - m_bIsBroadcastEnabled(sal_True) + m_sIsVisible(C2U("/IsVisible")) { if(!m_bEditMode) { @@ -249,23 +231,6 @@ ColorConfig_Impl::~ColorConfig_Impl() // #100822# ::Application::RemoveEventListener( LINK(this, ColorConfig_Impl, DataChangedEventListener) ); } -// ----------------------------------------------------------------------------- -void ColorConfig_Impl::DisableBroadcast() -{ - if ( ColorConfig::m_pImpl ) - ColorConfig::m_pImpl->m_bIsBroadcastEnabled = sal_False; -} -// ----------------------------------------------------------------------------- -void ColorConfig_Impl::EnableBroadcast() -{ - if ( ColorConfig::m_pImpl ) - ColorConfig::m_pImpl->m_bIsBroadcastEnabled = sal_True; -} -// ----------------------------------------------------------------------------- -sal_Bool ColorConfig_Impl::IsEnableBroadcast() -{ - return ColorConfig::m_pImpl ? ColorConfig::m_pImpl->m_bIsBroadcastEnabled : sal_False; -} /* -----------------------------22.03.2002 14:38------------------------------ ---------------------------------------------------------------------------*/ @@ -308,16 +273,7 @@ void ColorConfig_Impl::Notify( const uno::Sequence& ) { //loading via notification always uses the default setting Load(::rtl::OUString()); - - vos::OGuard aVclGuard( Application::GetSolarMutex() ); - - if(m_bLockBroadcast) - { - m_bBroadcastWhenUnlocked = sal_True; - ImplUpdateApplicationSettings(); - } - else - Broadcast(SfxSimpleHint(SFX_HINT_COLORS_CHANGED)); + NotifyListeners(0); } /* -----------------------------22.03.2002 14:38------------------------------ @@ -414,34 +370,7 @@ void ColorConfig_Impl::SettingsChanged() ImplUpdateApplicationSettings(); - Broadcast( SfxSimpleHint( SFX_HINT_COLORS_CHANGED ) ); -} -/* -----------------11.12.2002 09:21----------------- - * - * --------------------------------------------------*/ -void ColorConfig_Impl::LockBroadcast() -{ - m_bLockBroadcast = sal_True; -} -/* -----------------11.12.2002 09:21----------------- - * - * --------------------------------------------------*/ -void ColorConfig_Impl::UnlockBroadcast() -{ - if ( m_bBroadcastWhenUnlocked ) - { - m_bBroadcastWhenUnlocked = ColorConfig::m_pImpl != NULL; - if ( m_bBroadcastWhenUnlocked ) - { - ColorConfig::m_pImpl->ImplUpdateApplicationSettings(); - if ( ColorConfig::m_pImpl->IsEnableBroadcast() ) - { - m_bBroadcastWhenUnlocked = sal_False; - ColorConfig::m_pImpl->Broadcast(SfxSimpleHint(SFX_HINT_COLORS_CHANGED)); - } - } - } - m_bLockBroadcast = sal_False; + NotifyListeners(0); } /* -----------------------------2002/08/16 12:07 ----------------------------- #100822# @@ -500,7 +429,7 @@ ColorConfig::ColorConfig() ItemHolder2::holdConfigItem(E_COLORCFG); } ++nColorRefCount_Impl; - StartListening( *m_pImpl); + m_pImpl->AddListener(this); } /* -----------------------------16.01.01 15:36-------------------------------- @@ -508,7 +437,7 @@ ColorConfig::ColorConfig() ColorConfig::~ColorConfig() { ::osl::MutexGuard aGuard( ColorMutex_Impl::get() ); - EndListening( *m_pImpl); + m_pImpl->RemoveListener(this); if(!--nColorRefCount_Impl) { delete m_pImpl; @@ -636,15 +565,6 @@ ColorConfigValue ColorConfig::GetColorValue(ColorConfigEntry eEntry, sal_Bool bS return aRet; } -/* -----------------------------12.04.2002 09:25------------------------------ - - ---------------------------------------------------------------------------*/ -void ColorConfig::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - vos::OGuard aVclGuard( Application::GetSolarMutex() ); - - Broadcast( rHint ); -} /* -----------------------------25.03.2002 12:01------------------------------ ---------------------------------------------------------------------------*/ @@ -652,14 +572,14 @@ EditableColorConfig::EditableColorConfig() : m_pImpl(new ColorConfig_Impl), m_bModified(sal_False) { - m_pImpl->LockBroadcast(); + m_pImpl->BlockBroadcasts(TRUE); } /*-- 25.03.2002 12:03:08--------------------------------------------------- -----------------------------------------------------------------------*/ EditableColorConfig::~EditableColorConfig() { - m_pImpl->UnlockBroadcast(); + m_pImpl->BlockBroadcasts(FALSE); if(m_bModified) m_pImpl->SetModified(); if(m_pImpl->IsModified()) @@ -757,12 +677,12 @@ void EditableColorConfig::Commit() // ----------------------------------------------------------------------------- void EditableColorConfig::DisableBroadcast() { - m_pImpl->DisableBroadcast(); + m_pImpl->BlockBroadcasts(TRUE); } // ----------------------------------------------------------------------------- void EditableColorConfig::EnableBroadcast() { - m_pImpl->EnableBroadcast(); + m_pImpl->BlockBroadcasts(FALSE); } // ----------------------------------------------------------------------------- diff --git a/svtools/source/config/extcolorcfg.cxx b/svtools/source/config/extcolorcfg.cxx index 4610a1571baf..89bf41ac9f58 100644 --- a/svtools/source/config/extcolorcfg.cxx +++ b/svtools/source/config/extcolorcfg.cxx @@ -27,11 +27,8 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ - -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" #include "extcolorcfg.hxx" #include @@ -43,8 +40,8 @@ #include #include #include -#include //Any2Bool -#include +#include //Any2Bool +#include #include /* #100822# ---- diff --git a/svtools/source/config/fontsubstconfig.cxx b/svtools/source/config/fontsubstconfig.cxx index 8fe799dec67a..dc9bfa64e6d4 100644 --- a/svtools/source/config/fontsubstconfig.cxx +++ b/svtools/source/config/fontsubstconfig.cxx @@ -31,13 +31,8 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION - #include "fontsubstconfig.hxx" -#include +#include #include #include #include @@ -129,6 +124,10 @@ SvtFontSubstConfig::~SvtFontSubstConfig() /*-- 18.01.01 12:08:00--------------------------------------------------- -----------------------------------------------------------------------*/ +void SvtFontSubstConfig::Notify( const com::sun::star::uno::Sequence< rtl::OUString >& ) +{ +} + void SvtFontSubstConfig::Commit() { Sequence aNames(1); diff --git a/svtools/source/config/helpopt.cxx b/svtools/source/config/helpopt.cxx index 0ca09c176072..16982a695e11 100644 --- a/svtools/source/config/helpopt.cxx +++ b/svtools/source/config/helpopt.cxx @@ -31,11 +31,6 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION - #include #include #include diff --git a/svtools/source/config/itemholder2.cxx b/svtools/source/config/itemholder2.cxx index 590e0f85ade1..759fabbee686 100644 --- a/svtools/source/config/itemholder2.cxx +++ b/svtools/source/config/itemholder2.cxx @@ -31,11 +31,6 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION - #include "itemholder2.hxx" //----------------------------------------------- @@ -45,18 +40,12 @@ #include #include -#include +#include #include -#include #include #include -#include -#include #include -#include -#include -#include -#include +#include #include @@ -178,18 +167,10 @@ void ItemHolder2::impl_newItem(TItemInfo& rItem) // no ref count rItem.pItem = new SvtTabAppearanceCfg(); break; - case E_CJKOPTIONS : - rItem.pItem = new SvtCJKOptions(); - break; - case E_COLORCFG : rItem.pItem = new ::svtools::ColorConfig(); break; - case E_CTLOPTIONS : - rItem.pItem = new SvtCTLOptions(); - break; - case E_FONTSUBSTCONFIG : // no ref count rItem.pItem = new SvtFontSubstConfig(); break; @@ -198,12 +179,8 @@ void ItemHolder2::impl_newItem(TItemInfo& rItem) rItem.pItem = new SvtHelpOptions(); break; - case E_LANGUAGEOPTIONS : -// capsulate CTL and CJL options ! rItem.pItem = new SvtLanguageOptions(); - break; - - case E_MISCCFG : -// no ref count rItem.pItem = new SfxMiscCfg(); + case E_MENUOPTIONS : + rItem.pItem = new SvtMenuOptions(); break; case E_PRINTOPTIONS : @@ -214,17 +191,6 @@ void ItemHolder2::impl_newItem(TItemInfo& rItem) rItem.pItem = new SvtPrintFileOptions(); break; - case E_SYSLOCALEOPTIONS : - rItem.pItem = new SvtSysLocaleOptions(); - break; - - case E_UNDOOPTIONS : - rItem.pItem = new SvtUndoOptions(); - break; - - case E_USEROPTIONS : - rItem.pItem = new SvtUserOptions(); - break; case E_MISCOPTIONS : rItem.pItem = new SvtMiscOptions(); break; diff --git a/svtools/source/config/itemholder2.hxx b/svtools/source/config/itemholder2.hxx index d32eee1fc093..192df8f746c9 100644 --- a/svtools/source/config/itemholder2.hxx +++ b/svtools/source/config/itemholder2.hxx @@ -34,7 +34,7 @@ //----------------------------------------------- // includes -#include "itemholderbase.hxx" +#include #include #include diff --git a/svtools/source/config/makefile.mk b/svtools/source/config/makefile.mk index 9c0985329eb3..9de32bd9e43d 100644 --- a/svtools/source/config/makefile.mk +++ b/svtools/source/config/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -32,80 +32,28 @@ PRJ=..$/.. PRJNAME=svtools TARGET=config -TARGET1=heavyconfig -LIBTARGET=NO ENABLE_EXCEPTIONS := TRUE # --- Settings ----------------------------------------------------- .INCLUDE : settings.mk -.INCLUDE : $(PRJ)$/util$/svl.pmk +.INCLUDE : $(PRJ)$/util$/svt.pmk # --- Files -------------------------------------------------------- -SLOFILES = $(LIB1OBJFILES) $(LIB2OBJFILES) - -# --- config.lib Files -------------------------------------------------------- -LIB1TARGET= $(SLB)$/$(TARGET).lib - -LIB1OBJFILES= \ - $(SLO)$/accelcfg.obj \ - $(SLO)$/fltrcfg.obj \ - $(SLO)$/xmlaccelcfg.obj \ - $(SLO)$/moduleoptions.obj \ - $(SLO)$/pathoptions.obj \ - $(SLO)$/saveopt.obj \ - $(SLO)$/lingucfg.obj \ - $(SLO)$/javaoptions.obj \ - $(SLO)$/securityoptions.obj \ - $(SLO)$/localisationoptions.obj \ - $(SLO)$/workingsetoptions.obj \ - $(SLO)$/viewoptions.obj \ - $(SLO)$/internaloptions.obj \ - $(SLO)$/startoptions.obj \ - $(SLO)$/historyoptions.obj \ - $(SLO)$/inetoptions.obj \ - $(SLO)$/menuoptions.obj \ - $(SLO)$/dynamicmenuoptions.obj \ - $(SLO)$/optionsdrawinglayer.obj \ - $(SLO)$/fontoptions.obj \ - $(SLO)$/addxmltostorageoptions.obj \ - $(SLO)$/defaultoptions.obj \ - $(SLO)$/searchopt.obj \ - $(SLO)$/printwarningoptions.obj \ - $(SLO)$/cacheoptions.obj \ - $(SLO)$/regoptions.obj \ - $(SLO)$/cmdoptions.obj \ - $(SLO)$/extendedsecurityoptions.obj \ - $(SLO)$/sourceviewconfig.obj \ - $(SLO)$/compatibility.obj \ - $(SLO)$/eventcfg.obj \ - $(SLO)$/optionsdlg.obj \ - $(SLO)$/itemholder1.obj \ - $(SLO)$/options.obj - -# $(SLO)$/miscopt.obj \ -# --- heavyconfig.lib Files -------------------------------------------------------- -LIB2TARGET= $(SLB)$/$(TARGET1).lib - -LIB2OBJFILES= \ - $(SLO)$/accessibilityoptions.obj \ - $(SLO)$/fontsubstconfig.obj \ - $(SLO)$/misccfg.obj \ - $(SLO)$/apearcfg.obj \ - $(SLO)$/helpopt.obj \ - $(SLO)$/printoptions.obj \ - $(SLO)$/languageoptions.obj \ - $(SLO)$/ctloptions.obj \ - $(SLO)$/cjkoptions.obj \ - $(SLO)$/colorcfg.obj \ - $(SLO)$/extcolorcfg.obj \ - $(SLO)$/undoopt.obj \ - $(SLO)$/useroptions.obj \ - $(SLO)$/syslocaleoptions.obj \ - $(SLO)$/itemholder2.obj \ - $(SLO)$/miscopt.obj +SLOFILES= \ + $(SLO)$/accessibilityoptions.obj \ + $(SLO)$/apearcfg.obj \ + $(SLO)$/colorcfg.obj \ + $(SLO)$/extcolorcfg.obj \ + $(SLO)$/fontsubstconfig.obj \ + $(SLO)$/helpopt.obj \ + $(SLO)$/itemholder2.obj \ + $(SLO)$/menuoptions.obj \ + $(SLO)$/miscopt.obj \ + $(SLO)$/optionsdrawinglayer.obj \ + $(SLO)$/printoptions.obj # --- Targets ------------------------------------------------------ diff --git a/svtools/source/config/menuoptions.cxx b/svtools/source/config/menuoptions.cxx index 2d0e8d905ad9..8c00d7165ba5 100644 --- a/svtools/source/config/menuoptions.cxx +++ b/svtools/source/config/menuoptions.cxx @@ -46,7 +46,7 @@ #include #include -#include "itemholder1.hxx" +#include "itemholder2.hxx" //_________________________________________________________________________________________________________________ // namespaces @@ -111,8 +111,8 @@ class SvtMenuOptions_Impl : public ConfigItem SvtMenuOptions_Impl(); ~SvtMenuOptions_Impl(); - void AddListener( const Link& rLink ); - void RemoveListener( const Link& rLink ); + void AddListenerLink( const Link& rLink ); + void RemoveListenerLink( const Link& rLink ); //--------------------------------------------------------------------------------------------------------- // overloaded methods of baseclass @@ -412,12 +412,12 @@ Sequence< OUString > SvtMenuOptions_Impl::impl_GetPropertyNames() return seqPropertyNames; } -void SvtMenuOptions_Impl::AddListener( const Link& rLink ) +void SvtMenuOptions_Impl::AddListenerLink( const Link& rLink ) { aList.Insert( new Link( rLink ) ); } -void SvtMenuOptions_Impl::RemoveListener( const Link& rLink ) +void SvtMenuOptions_Impl::RemoveListenerLink( const Link& rLink ) { for ( USHORT n=0; nAddListener( rLink ); + m_pDataContainer->AddListenerLink( rLink ); } -void SvtMenuOptions::RemoveListener( const Link& rLink ) +void SvtMenuOptions::RemoveListenerLink( const Link& rLink ) { - m_pDataContainer->RemoveListener( rLink ); + m_pDataContainer->RemoveListenerLink( rLink ); } diff --git a/svtools/source/config/miscopt.cxx b/svtools/source/config/miscopt.cxx index 7a6dc4281da6..af6861a5104f 100644 --- a/svtools/source/config/miscopt.cxx +++ b/svtools/source/config/miscopt.cxx @@ -33,10 +33,6 @@ //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION #include #include @@ -231,8 +227,8 @@ class SvtMiscOptions_Impl : public ConfigItem inline sal_Bool IsUseSystemPrintDialogReadOnly() const { return m_bIsUseSystemPrintDialogRO; } - void AddListener( const Link& rLink ); - void RemoveListener( const Link& rLink ); + void AddListenerLink( const Link& rLink ); + void RemoveListenerLink( const Link& rLink ); void CallListeners(); //------------------------------------------------------------------------------------------------------------- @@ -260,42 +256,6 @@ class SvtMiscOptions_Impl : public ConfigItem void ImplSetSymbolsStyle( bool bValue, sal_Int16 nSet, const ::rtl::OUString &rName ); }; -//_________________________________________________________________________________________________________________ -// definitions -//_________________________________________________________________________________________________________________ - -static sal_Int16 implSymbolsStyleFromVCL( ULONG nStyle ) -{ - switch ( nStyle ) - { - case STYLE_SYMBOLS_AUTO: return SFX_SYMBOLS_STYLE_AUTO; - case STYLE_SYMBOLS_DEFAULT: return SFX_SYMBOLS_STYLE_DEFAULT; - case STYLE_SYMBOLS_HICONTRAST: return SFX_SYMBOLS_STYLE_HICONTRAST; - case STYLE_SYMBOLS_INDUSTRIAL: return SFX_SYMBOLS_STYLE_INDUSTRIAL; - case STYLE_SYMBOLS_CRYSTAL: return SFX_SYMBOLS_STYLE_CRYSTAL; - case STYLE_SYMBOLS_TANGO: return SFX_SYMBOLS_STYLE_TANGO; - case STYLE_SYMBOLS_CLASSIC: return SFX_SYMBOLS_STYLE_CLASSIC; - } - - return SFX_SYMBOLS_STYLE_AUTO; -} - -static ULONG implSymbolsStyleToVCL( sal_Int16 nStyle ) -{ - switch ( nStyle ) - { - case SFX_SYMBOLS_STYLE_AUTO: return STYLE_SYMBOLS_AUTO; - case SFX_SYMBOLS_STYLE_DEFAULT: return STYLE_SYMBOLS_DEFAULT; - case SFX_SYMBOLS_STYLE_HICONTRAST: return STYLE_SYMBOLS_HICONTRAST; - case SFX_SYMBOLS_STYLE_INDUSTRIAL: return STYLE_SYMBOLS_INDUSTRIAL; - case SFX_SYMBOLS_STYLE_CRYSTAL: return STYLE_SYMBOLS_CRYSTAL; - case SFX_SYMBOLS_STYLE_TANGO: return STYLE_SYMBOLS_TANGO; - case SFX_SYMBOLS_STYLE_CLASSIC: return STYLE_SYMBOLS_CLASSIC; - } - - return STYLE_SYMBOLS_AUTO; -} - //***************************************************************************************************************** // constructor //***************************************************************************************************************** @@ -503,12 +463,12 @@ void SvtMiscOptions_Impl::Load( const Sequence< OUString >& rPropertyNames ) } } -void SvtMiscOptions_Impl::AddListener( const Link& rLink ) +void SvtMiscOptions_Impl::AddListenerLink( const Link& rLink ) { aList.Insert( new Link( rLink ) ); } -void SvtMiscOptions_Impl::RemoveListener( const Link& rLink ) +void SvtMiscOptions_Impl::RemoveListenerLink( const Link& rLink ) { for ( USHORT n=0; nAddListener( rLink ); + m_pDataContainer->AddListenerLink( rLink ); } -void SvtMiscOptions::RemoveListener( const Link& rLink ) +void SvtMiscOptions::RemoveListenerLink( const Link& rLink ) { - m_pDataContainer->RemoveListener( rLink ); + m_pDataContainer->RemoveListenerLink( rLink ); } diff --git a/svtools/source/config/optionsdrawinglayer.cxx b/svtools/source/config/optionsdrawinglayer.cxx index 125827d17faf..43490c5ea79e 100644 --- a/svtools/source/config/optionsdrawinglayer.cxx +++ b/svtools/source/config/optionsdrawinglayer.cxx @@ -27,6 +27,9 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" + #ifdef _MSC_VER #pragma hdrstop #endif @@ -92,6 +95,11 @@ using namespace ::com::sun::star::uno ; #define DEFAULT_QUADRATIC3DRENDERLIMIT 1000000 #define DEFAULT_QUADRATICFORMCONTROLRENDERLIMIT 45000 +// #i97672# selection settings +#define DEFAULT_TRANSPARENTSELECTION sal_True +#define DEFAULT_TRANSPARENTSELECTIONPERCENT 75 +#define DEFAULT_SELECTIONMAXIMUMLUMINANCEPERCENT 70 + #define PROPERTYNAME_OVERLAYBUFFER OUString(RTL_CONSTASCII_USTRINGPARAM("OverlayBuffer" )) #define PROPERTYNAME_PAINTBUFFER OUString(RTL_CONSTASCII_USTRINGPARAM("PaintBuffer" )) #define PROPERTYNAME_STRIPE_COLOR_A OUString(RTL_CONSTASCII_USTRINGPARAM("StripeColorA" )) @@ -125,6 +133,11 @@ using namespace ::com::sun::star::uno ; #define PROPERTYNAME_QUADRATIC3DRENDERLIMIT OUString(RTL_CONSTASCII_USTRINGPARAM("Quadratic3DRenderLimit")) #define PROPERTYNAME_QUADRATICFORMCONTROLRENDERLIMIT OUString(RTL_CONSTASCII_USTRINGPARAM("QuadraticFormControlRenderLimit")) +// #i97672# selection settings +#define PROPERTYNAME_TRANSPARENTSELECTION OUString(RTL_CONSTASCII_USTRINGPARAM("TransparentSelection")) +#define PROPERTYNAME_TRANSPARENTSELECTIONPERCENT OUString(RTL_CONSTASCII_USTRINGPARAM("TransparentSelectionPercent")) +#define PROPERTYNAME_SELECTIONMAXIMUMLUMINANCEPERCENT OUString(RTL_CONSTASCII_USTRINGPARAM("SelectionMaximumLuminancePercent")) + #define PROPERTYHANDLE_OVERLAYBUFFER 0 #define PROPERTYHANDLE_PAINTBUFFER 1 #define PROPERTYHANDLE_STRIPE_COLOR_A 2 @@ -158,7 +171,12 @@ using namespace ::com::sun::star::uno ; #define PROPERTYHANDLE_QUADRATIC3DRENDERLIMIT 22 #define PROPERTYHANDLE_QUADRATICFORMCONTROLRENDERLIMIT 23 -#define PROPERTYCOUNT 24 +// #i97672# selection settings +#define PROPERTYHANDLE_TRANSPARENTSELECTION 24 +#define PROPERTYHANDLE_TRANSPARENTSELECTIONPERCENT 25 +#define PROPERTYHANDLE_SELECTIONMAXIMUMLUMINANCEPERCENT 26 + +#define PROPERTYCOUNT 27 class SvtOptionsDrawinglayer_Impl : public ConfigItem { @@ -176,6 +194,7 @@ public: //--------------------------------------------------------------------------------------------------------- virtual void Commit(); + virtual void Notify( const com::sun::star::uno::Sequence& aPropertyNames); //--------------------------------------------------------------------------------------------------------- // public interface @@ -248,6 +267,15 @@ public: void SetQuadratic3DRenderLimit(sal_uInt32 nNew); void SetQuadraticFormControlRenderLimit(sal_uInt32 nNew); + // #i97672# selection settings + sal_Bool IsTransparentSelection() const; + sal_uInt16 GetTransparentSelectionPercent() const; + sal_uInt16 GetSelectionMaximumLuminancePercent() const; + + void SetTransparentSelection( sal_Bool bState ); + void SetTransparentSelectionPercent( sal_uInt16 nPercent ); + void SetSelectionMaximumLuminancePercent( sal_uInt16 nPercent ); + //------------------------------------------------------------------------------------------------------------- // private methods //------------------------------------------------------------------------------------------------------------- @@ -295,6 +323,11 @@ private: sal_uInt32 m_nQuadratic3DRenderLimit; sal_uInt32 m_nQuadraticFormControlRenderLimit; + // #i97672# selection settings + sal_uInt16 m_nTransparentSelectionPercent; + sal_uInt16 m_nSelectionMaximumLuminancePercent; + sal_Bool m_bTransparentSelection; + // local values bool m_bAllowAA : 1; bool m_bAllowAAChecked : 1; @@ -342,6 +375,11 @@ SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl() : m_nQuadratic3DRenderLimit(DEFAULT_QUADRATIC3DRENDERLIMIT), m_nQuadraticFormControlRenderLimit(DEFAULT_QUADRATICFORMCONTROLRENDERLIMIT), + // #i97672# selection settings + m_nTransparentSelectionPercent(DEFAULT_TRANSPARENTSELECTIONPERCENT), + m_nSelectionMaximumLuminancePercent(DEFAULT_SELECTIONMAXIMUMLUMINANCEPERCENT), + m_bTransparentSelection(DEFAULT_TRANSPARENTSELECTION), + // local values m_bAllowAA(true), m_bAllowAAChecked(false) @@ -537,6 +575,27 @@ SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl() : seqValues[nProperty] >>= m_nQuadraticFormControlRenderLimit; } break; + + // #i97672# selection settings + case PROPERTYHANDLE_TRANSPARENTSELECTION: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\TransparentSelection\"?" ); + seqValues[nProperty] >>= m_bTransparentSelection; + } + break; + + case PROPERTYHANDLE_TRANSPARENTSELECTIONPERCENT: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_SHORT), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\TransparentSelectionPercent\"?" ); + seqValues[nProperty] >>= m_nTransparentSelectionPercent; + } + + case PROPERTYHANDLE_SELECTIONMAXIMUMLUMINANCEPERCENT: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_SHORT), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\SelectionMaximumLuminancePercent\"?" ); + seqValues[nProperty] >>= m_nSelectionMaximumLuminancePercent; + } + break; } } } @@ -661,12 +720,29 @@ void SvtOptionsDrawinglayer_Impl::Commit() case PROPERTYHANDLE_QUADRATICFORMCONTROLRENDERLIMIT: aSeqValues[nProperty] <<= m_nQuadraticFormControlRenderLimit; break; + + // #i97672# selection settings + case PROPERTYHANDLE_TRANSPARENTSELECTION: + aSeqValues[nProperty] <<= m_bTransparentSelection; + break; + + case PROPERTYHANDLE_TRANSPARENTSELECTIONPERCENT: + aSeqValues[nProperty] <<= m_nTransparentSelectionPercent; + break; + + case PROPERTYHANDLE_SELECTIONMAXIMUMLUMINANCEPERCENT: + aSeqValues[nProperty] <<= m_nSelectionMaximumLuminancePercent; + break; } } PutProperties( aSeqNames, aSeqValues ); } +void SvtOptionsDrawinglayer_Impl::Notify( const com::sun::star::uno::Sequence& ) +{ +} + //***************************************************************************************************************** // public method //***************************************************************************************************************** @@ -1065,6 +1141,49 @@ void SvtOptionsDrawinglayer_Impl::SetQuadraticFormControlRenderLimit(sal_uInt32 } } +// #i97672# selection settings +sal_Bool SvtOptionsDrawinglayer_Impl::IsTransparentSelection() const +{ + return m_bTransparentSelection; +} + +void SvtOptionsDrawinglayer_Impl::SetTransparentSelection( sal_Bool bState ) +{ + if(m_bTransparentSelection != bState) + { + m_bTransparentSelection = bState; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetTransparentSelectionPercent( sal_uInt16 nPercent ) +{ + if(m_nTransparentSelectionPercent != nPercent) + { + m_nTransparentSelectionPercent = nPercent; + SetModified(); + } +} + +sal_uInt16 SvtOptionsDrawinglayer_Impl::GetTransparentSelectionPercent() const +{ + return m_nTransparentSelectionPercent; +} + +void SvtOptionsDrawinglayer_Impl::SetSelectionMaximumLuminancePercent( sal_uInt16 nPercent ) +{ + if(m_nSelectionMaximumLuminancePercent != nPercent) + { + m_nSelectionMaximumLuminancePercent = nPercent; + SetModified(); + } +} + +sal_uInt16 SvtOptionsDrawinglayer_Impl::GetSelectionMaximumLuminancePercent() const +{ + return m_nSelectionMaximumLuminancePercent; +} + //***************************************************************************************************************** // private method //***************************************************************************************************************** @@ -1104,7 +1223,12 @@ Sequence< OUString > SvtOptionsDrawinglayer_Impl::impl_GetPropertyNames() PROPERTYNAME_RENDERDECORATEDTEXTDIRECT, PROPERTYNAME_RENDERSIMPLETEXTDIRECT, PROPERTYNAME_QUADRATIC3DRENDERLIMIT, - PROPERTYNAME_QUADRATICFORMCONTROLRENDERLIMIT + PROPERTYNAME_QUADRATICFORMCONTROLRENDERLIMIT, + + // #i97672# selection settings + PROPERTYNAME_TRANSPARENTSELECTION, + PROPERTYNAME_TRANSPARENTSELECTIONPERCENT, + PROPERTYNAME_SELECTIONMAXIMUMLUMINANCEPERCENT }; // Initialize return sequence with these list ... @@ -1486,6 +1610,83 @@ void SvtOptionsDrawinglayer::SetQuadraticFormControlRenderLimit(sal_uInt32 nNew) m_pDataContainer->SetQuadraticFormControlRenderLimit( nNew ); } +// #i97672# selection settings +sal_Bool SvtOptionsDrawinglayer::IsTransparentSelection() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsTransparentSelection(); +} + +void SvtOptionsDrawinglayer::SetTransparentSelection( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetTransparentSelection( bState ); +} + +sal_uInt16 SvtOptionsDrawinglayer::GetTransparentSelectionPercent() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + sal_uInt16 aRetval(m_pDataContainer->GetTransparentSelectionPercent()); + + // crop to range [10% .. 90%] + if(aRetval < 10) + { + aRetval = 10; + } + + if(aRetval > 90) + { + aRetval = 90; + } + + return aRetval; +} + +void SvtOptionsDrawinglayer::SetTransparentSelectionPercent( sal_uInt16 nPercent ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + + // crop to range [10% .. 90%] + if(nPercent < 10) + { + nPercent = 10; + } + + if(nPercent > 90) + { + nPercent = 90; + } + + m_pDataContainer->SetTransparentSelectionPercent( nPercent ); +} + +sal_uInt16 SvtOptionsDrawinglayer::GetSelectionMaximumLuminancePercent() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + sal_uInt16 aRetval(m_pDataContainer->GetSelectionMaximumLuminancePercent()); + + // crop to range [0% .. 100%] + if(aRetval > 90) + { + aRetval = 90; + } + + return aRetval; +} + +void SvtOptionsDrawinglayer::SetSelectionMaximumLuminancePercent( sal_uInt16 nPercent ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + + // crop to range [0% .. 100%] + if(nPercent > 90) + { + nPercent = 90; + } + + m_pDataContainer->SetSelectionMaximumLuminancePercent( nPercent ); +} + //***************************************************************************************************************** // private method //***************************************************************************************************************** diff --git a/svtools/source/config/printoptions.cxx b/svtools/source/config/printoptions.cxx index 0f54366c47f6..9627a2ce10d9 100644 --- a/svtools/source/config/printoptions.cxx +++ b/svtools/source/config/printoptions.cxx @@ -31,11 +31,6 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION - //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ @@ -73,7 +68,7 @@ #endif #ifndef _SVT_LOGHELPER_HXX -#include +#include #endif #include diff --git a/svtools/source/config/test/test.cxx b/svtools/source/config/test/test.cxx index 4090f7cb8bf5..1ac0038b5131 100644 --- a/svtools/source/config/test/test.cxx +++ b/svtools/source/config/test/test.cxx @@ -42,7 +42,7 @@ // my own includes //_________________________________________________________________________________________________________________ -#include +#include //_________________________________________________________________________________________________________________ // interface includes diff --git a/svtools/source/contnr/contentenumeration.cxx b/svtools/source/contnr/contentenumeration.cxx index af379db9b12b..a0e6b353dfb6 100644 --- a/svtools/source/contnr/contentenumeration.cxx +++ b/svtools/source/contnr/contentenumeration.cxx @@ -31,7 +31,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" #include "contentenumeration.hxx" -#include +#include #include #include "imagemgr.hxx" diff --git a/svtools/source/contnr/fileview.cxx b/svtools/source/contnr/fileview.cxx index d56c270fd5a8..7fddf18ee266 100644 --- a/svtools/source/contnr/fileview.cxx +++ b/svtools/source/contnr/fileview.cxx @@ -37,7 +37,7 @@ #include #include -#include +#include #include "fileview.hrc" #include "contentenumeration.hxx" #include @@ -78,8 +78,8 @@ #include #include #include -#include -#include +#include +#include using namespace ::com::sun::star::lang; using namespace ::com::sun::star::sdbc; @@ -167,7 +167,7 @@ namespace static sal_Bool isHighContrast( const Window* _pView ) { - return _pView->GetDisplayBackground().GetColor().IsDark(); + return _pView->GetSettings().GetStyleSettings().GetHighContrastMode(); } // ----------------------------------------------------------------------- @@ -1065,7 +1065,10 @@ BOOL ViewTabListBox_Impl::DoubleClickHdl() ::rtl::OUString sRet = SvHeaderTabListBox::GetAccessibleObjectDescription( _eType, _nPos ); if ( ::svt::BBTYPE_TABLECELL == _eType ) { - sal_Int32 nRow = _nPos / GetColumnCount(); + sal_Int32 nRow = -1; + const sal_uInt16 nColumnCount = GetColumnCount(); + if (nColumnCount > 0) + nRow = _nPos / nColumnCount; SvLBoxEntry* pEntry = GetEntry( nRow ); if ( pEntry ) { diff --git a/svtools/source/contnr/fileview.src b/svtools/source/contnr/fileview.src index c86db1ce418a..9d1cdb618cda 100644 --- a/svtools/source/contnr/fileview.src +++ b/svtools/source/contnr/fileview.src @@ -30,7 +30,7 @@ // includes ------------------------------------------------------------------ -#include +#include #include "fileview.hrc" #include diff --git a/svtools/source/contnr/imivctl.hxx b/svtools/source/contnr/imivctl.hxx index d4ec597aebfc..d443beb7fff9 100644 --- a/svtools/source/contnr/imivctl.hxx +++ b/svtools/source/contnr/imivctl.hxx @@ -45,7 +45,7 @@ #include #include "ivctrl.hxx" -#include +#include class IcnCursor_Impl; class SvtIconChoiceCtrl; diff --git a/svtools/source/contnr/imivctl1.cxx b/svtools/source/contnr/imivctl1.cxx index da75608a38b3..954c8a7ca179 100644 --- a/svtools/source/contnr/imivctl1.cxx +++ b/svtools/source/contnr/imivctl1.cxx @@ -540,7 +540,13 @@ void SvxIconChoiceCtrl_Impl::EntrySelected( SvxIconChoiceCtrlEntry* pEntry, BOOL ShowCursor( TRUE ); } // if( bUpdateMode ) - CallEventListeners( VCLEVENT_LISTBOX_SELECT, pEntry ); + // --> OD 2009-05-27 #i101012# + // emit vcl event LISTBOX_SELECT only in case that the given entry is selected. + if ( bSelect ) + { + CallEventListeners( VCLEVENT_LISTBOX_SELECT, pEntry ); + } + // <-- } void SvxIconChoiceCtrl_Impl::ResetVirtSize() diff --git a/svtools/source/contnr/ivctrl.cxx b/svtools/source/contnr/ivctrl.cxx index c0f40fd306df..916738af70ae 100644 --- a/svtools/source/contnr/ivctrl.cxx +++ b/svtools/source/contnr/ivctrl.cxx @@ -201,7 +201,7 @@ BOOL SvtIconChoiceCtrl::EditingEntry( SvxIconChoiceCtrlEntry* ) } void SvtIconChoiceCtrl::DrawEntryImage( SvxIconChoiceCtrlEntry* pEntry, const Point& rPos, OutputDevice& rDev ) { - rDev.DrawImage ( rPos, GetDisplayBackground().GetColor().IsDark() ? pEntry->GetImageHC() : pEntry->GetImage() ); + rDev.DrawImage( rPos, GetSettings().GetStyleSettings().GetHighContrastMode() ? pEntry->GetImageHC() : pEntry->GetImage() ); } String SvtIconChoiceCtrl::GetEntryText( SvxIconChoiceCtrlEntry* pEntry, BOOL ) { @@ -579,8 +579,7 @@ Rectangle SvtIconChoiceCtrl::GetBoundingBox( SvxIconChoiceCtrlEntry* pEntry ) co void SvtIconChoiceCtrl::FillLayoutData() const { - DBG_ASSERT( !mpLayoutData, "SvtIconChoiceCtrl::FillLayoutData: shouldn't this be called with non-existent layout data only?" ); - mpLayoutData = new ::vcl::ControlLayoutData(); + CreateLayoutData(); SvtIconChoiceCtrl* pNonConstMe = const_cast< SvtIconChoiceCtrl* >( this ); @@ -598,7 +597,7 @@ void SvtIconChoiceCtrl::FillLayoutData() const sal_Bool bLargeIconMode = WB_ICON == ( _pImp->GetStyle() & ( VIEWMODE_MASK ) ); sal_uInt16 nTextPaintFlags = bLargeIconMode ? PAINTFLAG_HOR_CENTERED : PAINTFLAG_VER_CENTERED; - _pImp->PaintItem( aTextRect, IcnViewFieldTypeText, pEntry, nTextPaintFlags, pNonConstMe, &sEntryText, mpLayoutData ); + _pImp->PaintItem( aTextRect, IcnViewFieldTypeText, pEntry, nTextPaintFlags, pNonConstMe, &sEntryText, GetLayoutData() ); ++nPos; } diff --git a/svtools/source/contnr/svcontnr.src b/svtools/source/contnr/svcontnr.src index c26c906eb3f6..f81bc3fdfa9b 100644 --- a/svtools/source/contnr/svcontnr.src +++ b/svtools/source/contnr/svcontnr.src @@ -28,7 +28,7 @@ * ************************************************************************/ -#include +#include Image RID_IMG_TREENODE_COLLAPSED { diff --git a/svtools/source/contnr/svimpbox.cxx b/svtools/source/contnr/svimpbox.cxx index e17b81e548a9..f2674279f4df 100644 --- a/svtools/source/contnr/svimpbox.cxx +++ b/svtools/source/contnr/svimpbox.cxx @@ -50,7 +50,7 @@ #include #ifndef _SVTOOLS_HRC -#include +#include #endif // #102891# -------------------- diff --git a/svtools/source/contnr/svimpicn.cxx b/svtools/source/contnr/svimpicn.cxx index 37ee096dc6d9..8d7a79701d27 100644 --- a/svtools/source/contnr/svimpicn.cxx +++ b/svtools/source/contnr/svimpicn.cxx @@ -46,7 +46,7 @@ #ifndef _SVLBITM_HXX #include #endif -#include +#include diff --git a/svtools/source/contnr/svlbitm.cxx b/svtools/source/contnr/svlbitm.cxx index ccd98e6a32a1..e9125b7fb2e1 100644 --- a/svtools/source/contnr/svlbitm.cxx +++ b/svtools/source/contnr/svlbitm.cxx @@ -590,8 +590,7 @@ void SvLBoxContextBmp::Paint( const Point& _rPos, SvLBox& _rDev, BmpColorMode eMode( BMP_COLOR_NORMAL ); if ( !!m_pImpl->m_aImage1_hc ) { // we really have HC images - const Wallpaper& rDeviceBackground = _rDev.GetDisplayBackground(); - if ( rDeviceBackground.GetColor().IsDark() ) + if ( _rDev.GetSettings().GetStyleSettings().GetHighContrastMode() ) eMode = BMP_COLOR_HIGHCONTRAST; } diff --git a/svtools/source/contnr/svlbox.cxx b/svtools/source/contnr/svlbox.cxx index 1c81343cd84f..77a9a3798d6d 100644 --- a/svtools/source/contnr/svlbox.cxx +++ b/svtools/source/contnr/svlbox.cxx @@ -48,7 +48,7 @@ #include #define _SVSTDARR_ULONGSSORT -#include +#include #ifndef _SVEDI_HXX #include @@ -1203,6 +1203,12 @@ void SvLBox::ViewDataInitialized( SvLBoxEntry* ) DBG_CHKTHIS(SvLBox,0); } +void SvLBox::StateChanged( StateChangedType eType ) +{ + if( eType == STATE_CHANGE_ENABLE ) + Invalidate( INVALIDATE_CHILDREN ); + Control::StateChanged( eType ); +} void SvLBox::ImplShowTargetEmphasis( SvLBoxEntry* pEntry, BOOL bShow) { diff --git a/svtools/source/contnr/svtabbx.cxx b/svtools/source/contnr/svtabbx.cxx index 32e8e68facb1..3b4907e7a80d 100644 --- a/svtools/source/contnr/svtabbx.cxx +++ b/svtools/source/contnr/svtabbx.cxx @@ -34,7 +34,7 @@ #include #include #ifndef _SVTOOLS_HRC -#include +#include #endif #include #include @@ -980,14 +980,16 @@ Reference< XAccessible > SvHeaderTabListBox::CreateAccessibleCell( sal_Int32 _nR if ( !AreChildrenTransient() ) { + const sal_uInt16 nColumnCount = GetColumnCount(); + // first call? -> initial list if ( m_aAccessibleChildren.empty() ) { - sal_Int32 nCount = ( GetRowCount() + 1 ) * GetColumnCount(); + sal_Int32 nCount = ( GetRowCount() + 1 ) * nColumnCount; m_aAccessibleChildren.assign( nCount, Reference< XAccessible >() ); } - nIndex = ( _nRow * GetColumnCount() ) + _nColumnPos + GetColumnCount(); + nIndex = ( _nRow * nColumnCount ) + _nColumnPos + nColumnCount; xChild = m_aAccessibleChildren[ nIndex ]; } @@ -1021,8 +1023,9 @@ Reference< XAccessible > SvHeaderTabListBox::CreateAccessibleColumnHeader( sal_u // first call? -> initial list if ( m_aAccessibleChildren.empty() ) { - sal_Int32 nCount = AreChildrenTransient() ? GetColumnCount() - : ( GetRowCount() + 1 ) * GetColumnCount(); + const sal_uInt16 nColumnCount = GetColumnCount(); + sal_Int32 nCount = AreChildrenTransient() ? + nColumnCount : ( GetRowCount() + 1 ) * nColumnCount; m_aAccessibleChildren.assign( nCount, Reference< XAccessible >() ); } @@ -1081,15 +1084,10 @@ sal_Bool SvHeaderTabListBox::ConvertPointToColumnHeader( sal_uInt16&, const Poin switch( _eType ) { case ::svt::BBTYPE_BROWSEBOX: - aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "HeaderTabListBox" ) ); - break; - case ::svt::BBTYPE_TABLE: - aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "HeaderTabListBoxTable" ) ); - break; - case ::svt::BBTYPE_COLUMNHEADERBAR: - aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ColumnHeaderBar of HeaderTabListBox" ) ); + // should be empty now (see #i63983) + aRetText = ::rtl::OUString(); break; case ::svt::BBTYPE_TABLECELL: @@ -1098,9 +1096,12 @@ sal_Bool SvHeaderTabListBox::ConvertPointToColumnHeader( sal_uInt16&, const Poin if ( _nPos >= 0 ) { sal_uInt16 nColumnCount = GetColumnCount(); - sal_Int32 nRow = _nPos / nColumnCount; - sal_uInt16 nColumn = static_cast< sal_uInt16 >( _nPos % nColumnCount ); - aRetText = GetCellText( nRow, nColumn ); + if (nColumnCount > 0) + { + sal_Int32 nRow = _nPos / nColumnCount; + sal_uInt16 nColumn = static_cast< sal_uInt16 >( _nPos % nColumnCount ); + aRetText = GetCellText( nRow, nColumn ); + } } break; } @@ -1135,16 +1136,19 @@ sal_Bool SvHeaderTabListBox::ConvertPointToColumnHeader( sal_uInt16&, const Poin static const String sVar2( RTL_CONSTASCII_USTRINGPARAM( "%2" ) ); sal_uInt16 nColumnCount = GetColumnCount(); - sal_Int32 nRow = _nPos / nColumnCount; - sal_uInt16 nColumn = static_cast< sal_uInt16 >( _nPos % nColumnCount ); + if (nColumnCount > 0) + { + sal_Int32 nRow = _nPos / nColumnCount; + sal_uInt16 nColumn = static_cast< sal_uInt16 >( _nPos % nColumnCount ); - String aText( SvtResId( STR_SVT_ACC_DESC_TABLISTBOX ) ); - aText.SearchAndReplace( sVar1, String::CreateFromInt32( nRow ) ); - String sColHeader = m_pImpl->m_pHeaderBar->GetItemText( m_pImpl->m_pHeaderBar->GetItemId( nColumn ) ); - if ( sColHeader.Len() == 0 ) - sColHeader = String::CreateFromInt32( nColumn ); - aText.SearchAndReplace( sVar2, sColHeader ); - aRetText = aText; + String aText( SvtResId( STR_SVT_ACC_DESC_TABLISTBOX ) ); + aText.SearchAndReplace( sVar1, String::CreateFromInt32( nRow ) ); + String sColHeader = m_pImpl->m_pHeaderBar->GetItemText( m_pImpl->m_pHeaderBar->GetItemId( nColumn ) ); + if ( sColHeader.Len() == 0 ) + sColHeader = String::CreateFromInt32( nColumn ); + aText.SearchAndReplace( sVar2, sColHeader ); + aRetText = aText; + } } return aRetText; diff --git a/svtools/source/contnr/svtreebx.cxx b/svtools/source/contnr/svtreebx.cxx index 200dd30eda1a..503325ddf802 100644 --- a/svtools/source/contnr/svtreebx.cxx +++ b/svtools/source/contnr/svtreebx.cxx @@ -1040,6 +1040,14 @@ BOOL SvTreeListBox::Expand( SvLBoxEntry* pParent ) pParent->SetFlags( nFlags ); GetModel()->InvalidateEntry( pParent ); // neu zeichnen } + + // --> OD 2009-04-01 #i92103# + if ( bExpanded ) + { + pImp->CallEventListeners( VCLEVENT_LISTBOX_ENTRY_EXPANDED, pParent ); + } + // <-- + return bExpanded; } @@ -1059,6 +1067,14 @@ BOOL SvTreeListBox::Collapse( SvLBoxEntry* pParent ) pHdlEntry = pParent; ExpandedHdl(); } + + // --> OD 2009-04-01 #i92103# + if ( bCollapsed ) + { + pImp->CallEventListeners( VCLEVENT_LISTBOX_ENTRY_COLLAPSED, pParent ); + } + // <-- + return bCollapsed; } @@ -1797,7 +1813,7 @@ long SvTreeListBox::PaintEntry1(SvLBoxEntry* pEntry,long nLine,USHORT nTabFlags, const Image* pImg = 0; BmpColorMode eBitmapMode = BMP_COLOR_NORMAL; - if ( GetDisplayBackground().GetColor().IsDark() ) + if ( GetSettings().GetStyleSettings().GetHighContrastMode() ) eBitmapMode = BMP_COLOR_HIGHCONTRAST; if( IsExpanded(pEntry) ) diff --git a/svtools/source/contnr/templwin.cxx b/svtools/source/contnr/templwin.cxx index 2b212fdcffeb..06de35ba19aa 100644 --- a/svtools/source/contnr/templwin.cxx +++ b/svtools/source/contnr/templwin.cxx @@ -33,18 +33,18 @@ #include "templwin.hxx" #include "templdlg.hxx" #include -#include -#include -#include +#include +#include +#include #include -#include +#include #include "imagemgr.hxx" #include #include "templatefoldercache.hxx" #include "imgdef.hxx" #include "txtattr.hxx" #ifndef _SVTOOLS_HRC -#include +#include #endif #ifndef _SVTOOLS_TEMPLWIN_HRC #include "templwin.hrc" @@ -52,8 +52,8 @@ #ifndef _SVT_HELPID_HRC #include #endif -#include -#include +#include +#include #include #include "unotools/configmgr.hxx" @@ -369,7 +369,7 @@ SvtIconWindow_Impl::SvtIconWindow_Impl( Window* pParent ) : // insert the categories // "New Document" - sal_Bool bHiContrast = GetBackground().GetColor().IsDark(); + sal_Bool bHiContrast = GetSettings().GetStyleSettings().GetHighContrastMode(); Image aImage( SvtResId( bHiContrast ? IMG_SVT_NEWDOC_HC : IMG_SVT_NEWDOC ) ); nMaxTextLength = aImage.GetSizePixel().Width(); String aEntryStr = String( SvtResId( STR_SVT_NEWDOC ) ); @@ -1348,7 +1348,7 @@ void SvtTemplateWindow::InitToolBoxImages() { SvtMiscOptions aMiscOpt; BOOL bLarge = aMiscOpt.AreCurrentSymbolsLarge(); - sal_Bool bHiContrast = aFileViewTB.GetBackground().GetColor().IsDark(); + sal_Bool bHiContrast = aFileViewTB.GetSettings().GetStyleSettings().GetHighContrastMode(); aFileViewTB.SetItemImage( TI_DOCTEMPLATE_BACK, Image( SvtResId( bLarge ? bHiContrast ? IMG_SVT_DOCTEMPL_HC_BACK_LARGE : IMG_SVT_DOCTEMPLATE_BACK_LARGE @@ -1372,7 +1372,7 @@ void SvtTemplateWindow::InitToolBoxImages() void SvtTemplateWindow::UpdateIcons() { - pIconWin->UpdateIcons( aFileViewTB.GetBackground().GetColor().IsDark() ); + pIconWin->UpdateIcons( aFileViewTB.GetSettings().GetStyleSettings().GetHighContrastMode() ); } // ------------------------------------------------------------------------ diff --git a/svtools/source/contnr/templwin.hxx b/svtools/source/contnr/templwin.hxx index bd3eb4afd5dd..050ba7ab6739 100644 --- a/svtools/source/contnr/templwin.hxx +++ b/svtools/source/contnr/templwin.hxx @@ -38,7 +38,7 @@ #include "fileview.hxx" #include "ivctrl.hxx" #include -#include +#include #include #include diff --git a/svtools/source/contnr/templwin.src b/svtools/source/contnr/templwin.src index 30149de4da14..f7f42b7e176b 100644 --- a/svtools/source/contnr/templwin.src +++ b/svtools/source/contnr/templwin.src @@ -33,7 +33,7 @@ #include "templwin.hrc" #include "controldims.hrc" #include -#include +#include // Magenta and Grey as mask colors #define MASK_COL_MAGENTA Color { Red = 0xFFFF ; Green = 0x0000 ; Blue = 0xFFFF ; }; diff --git a/svtools/source/contnr/treelist.cxx b/svtools/source/contnr/treelist.cxx index eb4e533b628c..c1491571dd1c 100644 --- a/svtools/source/contnr/treelist.cxx +++ b/svtools/source/contnr/treelist.cxx @@ -38,7 +38,7 @@ #include -#ifndef PRODUCT +#ifdef DBG_UTIL // Prueft Integritaet der Liste nach jeder Operation //#define CHECK_INTEGRITY #endif diff --git a/svtools/source/control/calendar.cxx b/svtools/source/control/calendar.cxx index 8ff008eaf7e4..481f6f2ceeae 100644 --- a/svtools/source/control/calendar.cxx +++ b/svtools/source/control/calendar.cxx @@ -62,7 +62,7 @@ #include #define _SV_CALENDAR_CXX -#include +#include #include #include diff --git a/svtools/source/control/calendar.src b/svtools/source/control/calendar.src index 44bffd361847..043dd9808663 100644 --- a/svtools/source/control/calendar.src +++ b/svtools/source/control/calendar.src @@ -28,7 +28,7 @@ * ************************************************************************/ -#include +#include String STR_SVT_CALENDAR_DAY { Text [ en-US ] = "Day" ; diff --git a/svtools/source/control/collatorres.cxx b/svtools/source/control/collatorres.cxx index 692d470b8f5b..c976d7442bc0 100644 --- a/svtools/source/control/collatorres.cxx +++ b/svtools/source/control/collatorres.cxx @@ -32,7 +32,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" #include -#include +#include #include diff --git a/svtools/source/control/ctrlbox.cxx b/svtools/source/control/ctrlbox.cxx index 5be239a5593e..b0d20bf7ce30 100644 --- a/svtools/source/control/ctrlbox.cxx +++ b/svtools/source/control/ctrlbox.cxx @@ -43,7 +43,7 @@ #include #include -#include +#include #include #include @@ -644,8 +644,7 @@ void FontNameBox::DataChanged( const DataChangedEvent& rDCEvt ) void FontNameBox::InitBitmaps( void ) { - Color aCol = GetSettings().GetStyleSettings().GetWindowColor(); - BOOL bHC = aCol.IsDark(); + BOOL bHC = GetSettings().GetStyleSettings().GetHighContrastMode(); maImagePrinterFont = Image( SvtResId( bHC? RID_IMG_PRINTERFONT_HC : RID_IMG_PRINTERFONT ) ); maImageBitmapFont = Image( SvtResId( bHC? RID_IMG_BITMAPFONT_HC : RID_IMG_BITMAPFONT ) ); diff --git a/svtools/source/control/ctrlbox.src b/svtools/source/control/ctrlbox.src index 5cfee79e5f11..05c75577cdbf 100644 --- a/svtools/source/control/ctrlbox.src +++ b/svtools/source/control/ctrlbox.src @@ -27,7 +27,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#include +#include #ifndef IMAGE_STDBTN_COLOR #define IMAGE_STDBTN_COLOR Color { Red = 0xFFFF; Green = 0x0000; Blue = 0xFFFF; } diff --git a/svtools/source/control/ctrltool.cxx b/svtools/source/control/ctrltool.cxx index 35e86189c352..1573ed531662 100644 --- a/svtools/source/control/ctrltool.cxx +++ b/svtools/source/control/ctrltool.cxx @@ -45,7 +45,7 @@ #include #include -#include +#include #include #include @@ -161,7 +161,11 @@ static void ImplMakeSearchString( XubString& rStr ) static void ImplMakeSearchStringFromName( XubString& rStr ) { - rStr = rStr.GetToken( 0, ';' ); + // check for features before alternate font separator + if (rStr.Search(':') < rStr.Search(';')) + rStr = rStr.GetToken( 0, ':' ); + else + rStr = rStr.GetToken( 0, ';' ); ImplMakeSearchString( rStr ); } diff --git a/svtools/source/control/ctrltool.src b/svtools/source/control/ctrltool.src index 267a65e98517..ab8005cd9698 100644 --- a/svtools/source/control/ctrltool.src +++ b/svtools/source/control/ctrltool.src @@ -27,7 +27,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#include +#include String STR_SVT_STYLE_LIGHT { diff --git a/svtools/source/control/fileurlbox.cxx b/svtools/source/control/fileurlbox.cxx index 936f8b3e25c5..554f713fd4d6 100644 --- a/svtools/source/control/fileurlbox.cxx +++ b/svtools/source/control/fileurlbox.cxx @@ -32,7 +32,7 @@ #include "precompiled_svtools.hxx" #include #include -#include "filenotation.hxx" +#include "svl/filenotation.hxx" //......................................................................... namespace svt diff --git a/svtools/source/control/fmtfield.cxx b/svtools/source/control/fmtfield.cxx index 387c1db34fc1..bbf00329cf93 100644 --- a/svtools/source/control/fmtfield.cxx +++ b/svtools/source/control/fmtfield.cxx @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include #include #include @@ -45,7 +45,7 @@ #include #include #include -#include +#include #ifndef REGEXP_SUPPORT #include diff --git a/svtools/source/control/hyperlabel.cxx b/svtools/source/control/hyperlabel.cxx index ec8387ecb662..7d7477130e0d 100644 --- a/svtools/source/control/hyperlabel.cxx +++ b/svtools/source/control/hyperlabel.cxx @@ -107,35 +107,16 @@ namespace svt } - void HyperLabel::SetLabelAndSize(::rtl::OUString _rText, const Size& _rNewSize ) + Size HyperLabel::CalcMinimumSize( long nMaxWidth ) const { - Size rLocSize = _rNewSize; - Size rLogicLocSize = PixelToLogic( _rNewSize, MAP_APPFONT ); - SetLabel( _rText ); - ImplCalcMinimumSize( rLocSize ); - rLocSize.Height() = ( m_pImpl->m_aMinSize.Height()); -// else -// rLocSize = LogicToPixel( Size( rLogicLocSize.Width(), LABELBASEMAPHEIGHT ), MAP_APPFONT ); - SetSizePixel( rLocSize ); - Show(); - } - - sal_Bool HyperLabel::ImplCalcMinimumSize(const Size& _rCompSize ) - { - sal_Bool b_AdjustMinWidth = sal_False; - m_pImpl->m_aMinSize = CalcMinimumSize( ); - if ( m_pImpl->m_aMinSize.Width() >= _rCompSize.Width() ) // the MinimumSize is used to size the FocusRectangle - { - m_pImpl->m_aMinSize.Width() = _rCompSize.Width(); // and for the MouseMove method - m_pImpl->m_aMinSize = CalcMinimumSize(_rCompSize.Width() ); - b_AdjustMinWidth = sal_True; - } + m_pImpl->m_aMinSize = FixedText::CalcMinimumSize( nMaxWidth ); + // the MinimumSize is used to size the FocusRectangle + // and for the MouseMove method m_pImpl->m_aMinSize.Height() += 2; m_pImpl->m_aMinSize.Width() += 1; - return b_AdjustMinWidth; + return m_pImpl->m_aMinSize; } - void HyperLabel::implInit() { ToggleBackgroundColor( COL_TRANSPARENT ); @@ -234,17 +215,6 @@ namespace svt m_pImpl->bInteractive = ( _bInteractive && IsEnabled() ); } - void HyperLabel::SetHyperLabelPosition(sal_uInt16 XPos, sal_uInt16 YPos) - { - SetPosPixel( LogicToPixel( Point( XPos, YPos ), MAP_APPFONT ) ); - } - - Point HyperLabel::GetLogicalPosition() - { - Point aPoint = GetPosPixel( ); - return PixelToLogic( aPoint, MAP_APPFONT ); - } - sal_Int16 HyperLabel::GetID() const { return m_pImpl->ID; @@ -270,10 +240,9 @@ namespace svt return GetText(); } - void HyperLabel::SetLabel( ::rtl::OUString _rText ) + void HyperLabel::SetLabel( const ::rtl::OUString& _rText ) { SetText(_rText); - Show(); } diff --git a/svtools/source/control/indexentryres.cxx b/svtools/source/control/indexentryres.cxx index 49096144b215..f69e9b34e5ea 100644 --- a/svtools/source/control/indexentryres.cxx +++ b/svtools/source/control/indexentryres.cxx @@ -32,7 +32,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" #include -#include +#include #include diff --git a/svtools/source/control/inettbc.cxx b/svtools/source/control/inettbc.cxx index 4a01a03ad759..b4904afee418 100644 --- a/svtools/source/control/inettbc.cxx +++ b/svtools/source/control/inettbc.cxx @@ -66,16 +66,16 @@ #include #endif #include -#include -#include -#include -#include -#include -#include "urihelper.hxx" -#include +#include +#include +#include +#include +#include +#include "svl/urihelper.hxx" +#include #define _SVSTDARR_STRINGSDTOR -#include +#include #include #include #include @@ -83,7 +83,7 @@ #include "iodlg.hrc" #include -#include +#include #include #include diff --git a/svtools/source/control/makefile.mk b/svtools/source/control/makefile.mk index 10bb6beb50e4..eecf983ab756 100644 --- a/svtools/source/control/makefile.mk +++ b/svtools/source/control/makefile.mk @@ -77,7 +77,6 @@ SLOFILES=\ $(SLO)$/calendar.obj \ $(SLO)$/filectrl.obj \ $(SLO)$/scrwin.obj \ - $(SLO)$/reginfo.obj \ $(SLO)$/collatorres.obj \ $(SLO)$/indexentryres.obj \ $(SLO)$/hyperlabel.obj \ diff --git a/svtools/source/control/reginfo.cxx b/svtools/source/control/reginfo.cxx deleted file mode 100644 index 24daba5e6123..000000000000 --- a/svtools/source/control/reginfo.cxx +++ /dev/null @@ -1,375 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: reginfo.cxx,v $ - * $Revision: 1.8 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" - -#include "reginfo.hxx" -#include -#include - -#define MAXREGVALUE 200 - -// ***************************************************************************** -#if defined(WIN) || defined(WNT) - -#include - -#define DBG_HDL DBG_ASSERT(pImp->bValidGroup, "Keine Gruppe gesetzt"); \ - if( !pImp->bValidGroup ) return - -struct RegInfo_Impl -{ - HKEY aGroupHdl; - BOOL bValidGroup; -}; - -RegInfo::RegInfo() -{ - pImp=new RegInfo_Impl; - pImp->bValidGroup = FALSE; -} - -RegInfo::~RegInfo() -{ - if(pImp->bValidGroup) - RegCloseKey( pImp->aGroupHdl ); - delete pImp; -} - -String RegInfo::GetKeyName( USHORT nKey ) const -{ - DBG_HDL String::EmptyString(); - char aBuffer[MAXREGVALUE]; - RegEnumKey( pImp->aGroupHdl, nKey, aBuffer, MAXREGVALUE ); - return String( UniString::CreateFromAscii(aBuffer) ); -} - -USHORT RegInfo::GetKeyCount() const -{ - DBG_HDL 0; -#ifdef WNT - DWORD nKeys; - DWORD Dum1=10, Dum2, Dum3, Dum4, Dum5, Dum6, Dum7; - char s[10]; - FILETIME aDumFileTime; - RegQueryInfoKey( pImp->aGroupHdl, s, &Dum1, 0, &nKeys, &Dum2, &Dum3, - &Dum4, &Dum5, &Dum6, &Dum7, &aDumFileTime ); - return (USHORT) nKeys; -#else - char aBuffer[MAXREGVALUE]; - USHORT n=0; - while(RegEnumKey( - pImp->aGroupHdl, n, aBuffer, MAXREGVALUE) == ERROR_SUCCESS) - n++; - return n; -#endif -} - -inline String MakeAppGroupString_Impl( const String &rGroup ) -{ - String aGroup( UniString::CreateFromAscii("SvAppGroups\\") ); - aGroup+=rGroup; - return aGroup; -} - -void RegInfo::SetAppGroup( const String& rGroup ) -{ - aCurrentGroup = MakeAppGroupString_Impl(rGroup); - if( pImp->bValidGroup ) - { - RegCloseKey( pImp->aGroupHdl ); - pImp->bValidGroup = FALSE; - } - ByteString aBStr( aCurrentGroup, osl_getThreadTextEncoding() ); - RegCreateKey( HKEY_CLASSES_ROOT, aBStr.GetBuffer(), &pImp->aGroupHdl ); - pImp->bValidGroup = TRUE; -} - -void RegInfo::DeleteAppGroup( const String &rGroup ) -{ - String aOldGroup = aCurrentGroup; - SetAppGroup( rGroup ); - DBG_HDL; - USHORT nMax = GetKeyCount(); - for( USHORT n = nMax; n--; ) - { - String aKey( GetKeyName( n )); - DeleteKey( aKey ); - } - RegCloseKey( pImp->aGroupHdl ); - - ByteString aBStr( rGroup, osl_getThreadTextEncoding() ); - RegDeleteKey( HKEY_CLASSES_ROOT, aBStr.GetBuffer() ); - pImp->bValidGroup = FALSE; - if( rGroup != aOldGroup ) - SetAppGroup( aOldGroup ); -} - -BOOL ReadKey_Impl( const String& rKey, - HKEY aHdl, String& rResult ) -{ - char s[MAXREGVALUE]; - LONG aLen=MAXREGVALUE; - - ByteString aBStr( rKey, osl_getThreadTextEncoding() ); - LONG nRes = RegQueryValue( aHdl, aBStr.GetBuffer(), s, &aLen); - if(nRes == ERROR_SUCCESS) - { - rResult = UniString::CreateFromAscii(s); - return TRUE; - } - else - return FALSE; -} - -String RegInfo::ReadKey( const String& rKey ) const -{ - DBG_HDL String::EmptyString(); - String aRes; - if(ReadKey_Impl( rKey, pImp->aGroupHdl, aRes)) - return aRes; - else - return String::EmptyString(); -} - -String RegInfo::ReadKey( const String& rKey, const String &rDefault ) const -{ - DBG_HDL String::EmptyString(); - String aRes; - if(ReadKey_Impl( rKey, pImp->aGroupHdl, aRes)) - return aRes; - else - return rDefault; -} - -void RegInfo::WriteKey( const String& rKey, const String& rValue ) -{ - DBG_HDL; - ByteString aBStr( rKey, osl_getThreadTextEncoding() ); - ByteString aBStr1( rValue, osl_getThreadTextEncoding() ); - RegSetValue( pImp->aGroupHdl, aBStr.GetBuffer(), REG_SZ, aBStr1.GetBuffer(), 0); -} - - -void RegInfo::DeleteKey( const String& rKey ) -{ - DBG_HDL; - ByteString aBStr( rKey, osl_getThreadTextEncoding() ); - RegDeleteKey( pImp->aGroupHdl, aBStr.GetBuffer() ); -} - -// ***************************************************************************** -#elif defined(OS2) - -#define INCL_WINSHELLDATA -#include - -struct RegInfo_Impl -{ - char *pKeyList; - String aCurrentApp; - void BuildKeyList( const String &rGroup ); -}; - -void RegInfo_Impl::BuildKeyList( const String &rGroup ) -{ - ByteString aBStr( rGroup, osl_getThreadTextEncoding() ); - USHORT nLen = 0; - do - { - nLen+=1000; - delete[] pKeyList; - pKeyList = new char[nLen]; - *(int *)pKeyList = 0; - } - while( PrfQueryProfileString( - HINI_USERPROFILE, (PCSZ)aBStr.GetBuffer(), - 0, 0, pKeyList, nLen) == nLen); -} - - -RegInfo::RegInfo() -{ - pImp=new RegInfo_Impl; - pImp->pKeyList = 0; -} - -RegInfo::~RegInfo() -{ - delete[] pImp->pKeyList; - delete pImp; -} - -inline String MakeAppGroupString_Impl( const String &rGroup ) -{ - String aGroup(UniString::CreateFromAscii("SvAppGroups:")); - aGroup+=rGroup; - return aGroup; -} - -String RegInfo::GetKeyName( USHORT nKey ) const -{ - if( !pImp->pKeyList ) - pImp->BuildKeyList(pImp->aCurrentApp); - - const char *pc=pImp->pKeyList; - for( USHORT n=0; npKeyList ) - pImp->BuildKeyList( pImp->aCurrentApp); - - const char *pc=pImp->pKeyList; - USHORT nRet=0; - while(*pc) - { - while(*pc++); - nRet++; - } - return nRet; -} - -void RegInfo::SetAppGroup( const String& rGroup ) -{ - delete[] pImp->pKeyList; - pImp->pKeyList = 0; - aCurrentGroup = rGroup; - pImp->aCurrentApp = MakeAppGroupString_Impl( rGroup ); -} - -void RegInfo::DeleteAppGroup( const String &rGroup ) -{ - ByteString aBStr( MakeAppGroupString_Impl( rGroup ), osl_getThreadTextEncoding() ); - PrfWriteProfileString( - HINI_USERPROFILE, (PCSZ)aBStr.GetBuffer(), 0, 0); -} - - -String RegInfo::ReadKey( const String& rKey ) const -{ - ULONG ulBufferMax = MAXREGVALUE; - char *pBuffer= new char[MAXREGVALUE]; - ByteString aBStr( pImp->aCurrentApp, osl_getThreadTextEncoding() ); - ByteString aBStr1( rKey, osl_getThreadTextEncoding() ); - *pBuffer=0; - PrfQueryProfileData( - HINI_USERPROFILE, (PCSZ)aBStr.GetBuffer(), (PCSZ)aBStr1.GetBuffer(), pBuffer, &ulBufferMax); - String aRet(UniString::CreateFromAscii(pBuffer)); - delete[] pBuffer; - return aRet; -} - - -String RegInfo::ReadKey( const String& rKey, const String &rDefault ) const -{ - String aResult = ReadKey(rKey); - if (!aResult.Len()) - return rDefault; - else - return aResult; -} - - -void RegInfo::WriteKey( const String& rKey, const String& rValue ) -{ - ByteString aBStr( pImp->aCurrentApp, osl_getThreadTextEncoding() ); - ByteString aBStr1( rKey, osl_getThreadTextEncoding() ); - PrfWriteProfileData( - HINI_USERPROFILE, (PCSZ)aBStr.GetBuffer(), (PCSZ)aBStr1.GetBuffer(), (PVOID)rValue.GetBuffer(), rValue.Len()*2); -} - -void RegInfo::DeleteKey( const String& rKey ) -{ - ByteString aBStr( pImp->aCurrentApp, osl_getThreadTextEncoding() ); - ByteString aBStr1( rKey, osl_getThreadTextEncoding() ); - PrfWriteProfileString( - HINI_USERPROFILE, (PCSZ)aBStr.GetBuffer(), (PCSZ)rKey.GetBuffer(), 0); -} - -// ***************************************************************************** - -#else - -RegInfo::RegInfo() -{ -} - - -RegInfo::~RegInfo() -{ -} - -String RegInfo::GetKeyName( USHORT ) const -{ - return String::EmptyString(); -} - -USHORT RegInfo::GetKeyCount() const -{ - return 0; -} - -void RegInfo::SetAppGroup( const String& ) -{ - return ; -} - -void RegInfo::DeleteAppGroup( const String& ) -{ - return; -} - -String RegInfo::ReadKey( const String& ) const -{ - return String::EmptyString(); -} - -String RegInfo::ReadKey( const String&, const String& ) const -{ - return String::EmptyString(); -} - -void RegInfo::WriteKey( const String&, const String& ) -{ - return; -} - -void RegInfo::DeleteKey( const String& ) -{ - return; -} - -#endif diff --git a/svtools/source/control/roadmap.cxx b/svtools/source/control/roadmap.cxx index 7485efec7c7c..693bca733813 100644 --- a/svtools/source/control/roadmap.cxx +++ b/svtools/source/control/roadmap.cxx @@ -49,11 +49,10 @@ #endif #include -#define RMENTRYPOINT_X 4 -#define RMENTRYPOINT_Y 27 -#define RMITEMDISTANCE_Y 6 +#define ROADMAP_INDENT_X 4 +#define ROADMAP_INDENT_Y 27 +#define ROADMAP_ITEM_DISTANCE_Y 6 #define RMINCOMPLETE -1 -#define NREMOVERMITEM -1 #define NADDITEM 1 #define INCOMPLETELABEL ::String::CreateFromAscii("...") // TODO: Cast to String @@ -63,30 +62,18 @@ namespace svt //......................................................................... typedef std::vector< ::rtl::OUString > S_Vector; - typedef std::vector< ORoadmapHyperLabel* > HL_Vector; + typedef std::vector< RoadmapItem* > HL_Vector; //===================================================================== - //= FontChanger + //= ColorChanger //===================================================================== -// class FontChanger -// { -// protected: -// OutputDevice* m_pDev; -// -// public: -// FontChanger( OutputDevice* _pDev, const Font& _rNewFont ) -// :m_pDev( _pDev ) -// { -// m_pDev->Push( PUSH_FONT ); -// m_pDev->SetFont( _rNewFont ); -// } -// -// ~FontChanger() -// { -// m_pDev->Pop( ); -// } -// }; - + class IDLabel : public FixedText + { + public: + IDLabel( Window* _pParent, WinBits _nWinStyle = 0 ); + ~IDLabel( ); + virtual void DataChanged( const DataChangedEvent& rDCEvt ); + }; //===================================================================== //= ColorChanger @@ -111,6 +98,51 @@ namespace svt } }; + //===================================================================== + //= RoadmapItem + //===================================================================== + class RoadmapItem : public RoadmapTypes + { + private: + IDLabel* mpID; + HyperLabel* mpDescription; + const Size m_aItemPlayground; + + public: + RoadmapItem( ORoadmap& _rParent, const Size& _rItemPlayground ); + ~RoadmapItem( ); + + void SetID( sal_Int16 _ID ); + sal_Int16 GetID() const; + + void SetIndex( ItemIndex _Index ); + ItemIndex GetIndex() const; + + void SetLabel( const ::rtl::OUString& _rText ); + ::rtl::OUString GetLabel( ); + + void Update( ItemIndex _RMIndex, const ::rtl::OUString& _rText ); + + void SetPosition( RoadmapItem* OldHyperLabel ); + + void ToggleBackgroundColor( const Color& _rGBColor ); + void SetInteractive( sal_Bool _bInteractive ); + + void SetClickHdl( const Link& rLink ); + const Link& GetClickHdl() const; + void SetZOrder( RoadmapItem* pRefRoadmapHyperLabel, USHORT nFlags ); + void Enable( BOOL bEnable = TRUE); + BOOL IsEnabled() const; + void GrabFocus(); + + bool Contains( const Window* _pWindow ) const; + + HyperLabel* GetDescriptionHyperLabel() const { return mpDescription; } + + private: + void ImplUpdateIndex( const ItemIndex _nIndex ); + void ImplUpdatePosSize(); + }; //===================================================================== //= RoadmapImpl @@ -118,27 +150,32 @@ namespace svt class RoadmapImpl : public RoadmapTypes { protected: + const ORoadmap& m_rAntiImpl; Link m_aSelectHdl; BitmapEx m_aPicture; HL_Vector m_aRoadmapSteps; ItemId m_iCurItemID; sal_Bool m_bInteractive; sal_Bool m_bComplete; + Size m_aItemSizePixel; public: - RoadmapImpl() : - m_bInteractive( sal_True ), - m_bComplete( sal_True ) {} + RoadmapImpl( const ORoadmap& _rAntiImpl ) + :m_rAntiImpl( _rAntiImpl ) + ,m_iCurItemID( -1 ) + ,m_bInteractive( sal_True ) + ,m_bComplete( sal_True ) + { + } - Size aHyperLabelPixelSize; - ORoadmapHyperLabel* InCompleteHyperLabel; + RoadmapItem* InCompleteHyperLabel; - void addHyperLabel( ORoadmapHyperLabel* _rRoadmapStep ) { m_aRoadmapSteps.push_back(_rRoadmapStep); } + void addHyperLabel( RoadmapItem* _rRoadmapStep ) { m_aRoadmapSteps.push_back(_rRoadmapStep); } HL_Vector& getHyperLabels() { return m_aRoadmapSteps; } const HL_Vector& getHyperLabels() const { return m_aRoadmapSteps; } - void insertHyperLabel( ItemIndex _Index, ORoadmapHyperLabel* _rRoadmapStep ) { m_aRoadmapSteps.insert( m_aRoadmapSteps.begin() + _Index, _rRoadmapStep ); } + void insertHyperLabel( ItemIndex _Index, RoadmapItem* _rRoadmapStep ) { m_aRoadmapSteps.insert( m_aRoadmapSteps.begin() + _Index, _rRoadmapStep ); } ItemIndex getItemCount() const { return m_aRoadmapSteps.size();} @@ -157,6 +194,9 @@ namespace svt void setSelectHdl( const Link& _rHdl ) { m_aSelectHdl = _rHdl; } const Link& getSelectHdl( ) const { return m_aSelectHdl; } + void initItemSize(); + const Size& getItemSize() const { return m_aItemSizePixel; } + void removeHyperLabel( ItemIndex _Index ) { if ( ( _Index > -1 ) && ( _Index < getItemCount() ) ) @@ -172,8 +212,21 @@ namespace svt //= Roadmap //===================================================================== //--------------------------------------------------------------------- - ORoadmap::ORoadmap( Window* _pParent, const ResId& _rId ):Control( _pParent, _rId ) - ,m_pImpl( new RoadmapImpl() ) + void RoadmapImpl::initItemSize() + { + Size aLabelSize( m_rAntiImpl.GetOutputSizePixel() ); + aLabelSize.Height() = m_rAntiImpl.LogicToPixel( Size( 0, LABELBASEMAPHEIGHT ), MAP_APPFONT ).Height(); + aLabelSize.Width() -= m_rAntiImpl.LogicToPixel( Size( 2 * ROADMAP_INDENT_X, 0 ), MAP_APPFONT ).Width(); + m_aItemSizePixel = aLabelSize; + } + + //===================================================================== + //= Roadmap + //===================================================================== + //--------------------------------------------------------------------- + ORoadmap::ORoadmap( Window* _pParent, const ResId& _rId ) + :Control( _pParent, _rId ) + ,m_pImpl( new RoadmapImpl( *this ) ) { implInit(); } @@ -181,7 +234,7 @@ namespace svt //--------------------------------------------------------------------- ORoadmap::ORoadmap( Window* _pParent, WinBits _nWinStyle ) :Control( _pParent, _nWinStyle ) - , m_pImpl( new RoadmapImpl() ) + ,m_pImpl( new RoadmapImpl( *this ) ) { implInit(); @@ -201,18 +254,30 @@ namespace svt m_pImpl->InCompleteHyperLabel = NULL; m_pImpl->setCurItemID(-1 ); m_pImpl->setComplete( sal_True ); + + // Roadmap control should be reachable as one unit with a Tab key + // the next Tab key should spring out of the control. + // To reach it the control itself should get focus and set it + // on entries. The entries themself should not be reachable with + // the Tab key directly. So each entry should have WB_NOTABSTOP. + // + // In other words the creator should create the control with the following + // flags: + // SetStyle( ( GetStyle() | WB_TABSTOP ) & ~WB_DIALOGCONTROL ); + // TODO: if somebody sets a new font from outside (OutputDevice::SetFont), we would have to react // on this with calculating a new bold font. // Unfortunately, the OutputDevice does not offer a notify mechanism for a changed font. // So settings the font from outside is simply a forbidded scenario at the moment + EnableMapMode( sal_False ); } //--------------------------------------------------------------------- ORoadmap::~ORoadmap( ) { - HL_Vector pLocRoadmapItems = m_pImpl->getHyperLabels(); + HL_Vector aItemsCopy = m_pImpl->getHyperLabels(); m_pImpl->getHyperLabels().clear(); - for ( HL_Vector::iterator i = pLocRoadmapItems.begin(); i< pLocRoadmapItems.end(); i++) + for ( HL_Vector::iterator i = aItemsCopy.begin(); i< aItemsCopy.end(); ++i ) { delete *i; } @@ -229,54 +294,43 @@ namespace svt } - void ORoadmap::InitializeHyperLabelSize() + RoadmapItem* ORoadmap::GetPreviousHyperLabel( ItemIndex _Index) { - Size aSize = GetSizePixel(); - Size aLogicSize = PixelToLogic( aSize, MAP_APPFONT ); - aLogicSize.Height() = LABELBASEMAPHEIGHT; - aLogicSize.Width() -= (2*RMENTRYPOINT_X); - m_pImpl->aHyperLabelPixelSize = LogicToPixel( aLogicSize, MAP_APPFONT ); - EnableMapMode( sal_False ); - } - - - ORoadmapHyperLabel* ORoadmap::GetPreviousHyperLabel( ItemIndex _Index) - { - ORoadmapHyperLabel* OldHyperLabel = NULL; - if (_Index > 0) - OldHyperLabel = m_pImpl->getHyperLabels().at( _Index - 1 ); - return OldHyperLabel; + RoadmapItem* pOldItem = NULL; + if ( _Index > 0 ) + pOldItem = m_pImpl->getHyperLabels().at( _Index - 1 ); + return pOldItem; } //--------------------------------------------------------------------- - ORoadmapHyperLabel* ORoadmap::InsertHyperLabel( ItemIndex _Index, ::rtl::OUString _sLabel, ItemId _RMID, sal_Bool _bEnabled) + RoadmapItem* ORoadmap::InsertHyperLabel( ItemIndex _Index, const ::rtl::OUString& _sLabel, ItemId _RMID, sal_Bool _bEnabled) { - if (m_pImpl->getItemCount() == 0 ) - InitializeHyperLabelSize(); - ORoadmapHyperLabel* CurHyperLabel; - ORoadmapHyperLabel* OldHyperLabel = GetPreviousHyperLabel( _Index); + if ( m_pImpl->getItemCount() == 0 ) + m_pImpl->initItemSize(); - if (_RMID != RMINCOMPLETE ) + RoadmapItem* pItem = NULL; + RoadmapItem* pOldItem = GetPreviousHyperLabel( _Index ); + + pItem = new RoadmapItem( *this, m_pImpl->getItemSize() ); + if ( _RMID != RMINCOMPLETE ) { - CurHyperLabel = new ORoadmapHyperLabel(this, WB_WORDBREAK); - CurHyperLabel->SetInteractive( m_pImpl->isInteractive() ); - m_pImpl->insertHyperLabel(_Index, CurHyperLabel ); + pItem->SetInteractive( m_pImpl->isInteractive() ); + m_pImpl->insertHyperLabel( _Index, pItem ); } else { - CurHyperLabel = new ORoadmapHyperLabel(this); - CurHyperLabel->SetInteractive( sal_False ); + pItem->SetInteractive( sal_False ); } - CurHyperLabel->SetPosition( OldHyperLabel ); - CurHyperLabel->SetLabelAndSize( _Index, _sLabel, m_pImpl->aHyperLabelPixelSize ); - CurHyperLabel->SetClickHdl(LINK( this, ORoadmap, ImplClickHdl ) ); - CurHyperLabel->SetID( _RMID ); - CurHyperLabel->SetIndex( _Index ); + pItem->SetPosition( pOldItem ); + pItem->Update( _Index, _sLabel ); + pItem->SetClickHdl(LINK( this, ORoadmap, ImplClickHdl ) ); + pItem->SetID( _RMID ); + pItem->SetIndex( _Index ); if (!_bEnabled) - CurHyperLabel->Enable( _bEnabled ); - return CurHyperLabel; + pItem->Enable( _bEnabled ); + return pItem; } //--------------------------------------------------------------------- @@ -297,12 +351,14 @@ namespace svt void ORoadmap::SetRoadmapInteractive( sal_Bool _bInteractive ) { m_pImpl->setInteractive( _bInteractive ); - ORoadmapHyperLabel* CurHyperLabel; - HL_Vector pLocRoadmapItems = m_pImpl->getHyperLabels(); - for ( HL_Vector::iterator i = pLocRoadmapItems.begin(); i< pLocRoadmapItems.end(); i++) + + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + for ( HL_Vector::const_iterator i = rItems.begin(); + i < rItems.end(); + ++i + ) { - CurHyperLabel = *i; - CurHyperLabel->SetInteractive( _bInteractive ); + (*i)->SetInteractive( _bInteractive ); } } @@ -315,76 +371,55 @@ namespace svt //--------------------------------------------------------------------- void ORoadmap::SetRoadmapComplete( sal_Bool _bComplete ) { - sal_Bool OldbComplete = m_pImpl->isComplete(); - m_pImpl->setComplete( _bComplete); - if (_bComplete) + sal_Bool bWasComplete = m_pImpl->isComplete(); + m_pImpl->setComplete( _bComplete ); + if ( _bComplete ) { if ( m_pImpl->InCompleteHyperLabel != NULL) { - if (m_pImpl->getItemCount() > 0) - { - HL_Vector pLocRoadmapItems = m_pImpl->getHyperLabels(); - pLocRoadmapItems.pop_back(); - delete m_pImpl->InCompleteHyperLabel; - } + delete m_pImpl->InCompleteHyperLabel; m_pImpl->InCompleteHyperLabel = NULL; } } - else if (OldbComplete) - m_pImpl->InCompleteHyperLabel = InsertHyperLabel( m_pImpl->getItemCount(), ::String::CreateFromAscii("..."), RMINCOMPLETE ); + else if ( bWasComplete ) + m_pImpl->InCompleteHyperLabel = InsertHyperLabel( m_pImpl->getItemCount(), ::String::CreateFromAscii( "..." ), RMINCOMPLETE ); } //--------------------------------------------------------------------- - void ORoadmap::SetRoadmapLabel(ORoadmapHyperLabel* CurHyperLabel, sal_Int32 _nPrefix, String _sDescription) + void ORoadmap::UpdatefollowingHyperLabels( ItemIndex _nIndex ) { - const xub_StrLen n_Pos = _sDescription.Search( String::CreateFromAscii(".") ); - if ( n_Pos != STRING_NOTFOUND ) + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + if ( _nIndex < (ItemIndex)rItems.size() ) { - const String sID = ::String::CreateFromInt32( _nPrefix ); - _sDescription.Replace(0 , n_Pos, sID ); - } - CurHyperLabel->SetLabelAndSize( _nPrefix, _sDescription, m_pImpl->aHyperLabelPixelSize ); - } - - //--------------------------------------------------------------------- - void ORoadmap::UpdatefollowingHyperLabels( ItemIndex _Index, sal_Int16 ) - { - if ( _Index < ( m_pImpl->getItemCount() ) ) - { - Point aPos; - String sLabel; - HL_Vector pLocRoadmapItems = m_pImpl->getHyperLabels(); - ORoadmapHyperLabel* CurHyperLabel = NULL; - ItemIndex n_CurPrefix = _Index + 1 ; - for ( HL_Vector::iterator i = pLocRoadmapItems.begin()+ _Index; i< pLocRoadmapItems.end(); i++) + RoadmapItem* pItem = NULL; + for ( HL_Vector::const_iterator i = rItems.begin() + _nIndex; + i< rItems.end(); + ++i, ++_nIndex + ) { - CurHyperLabel = *i; - aPos = CurHyperLabel->GetLogicalPosition(); - CurHyperLabel->SetIndex( n_CurPrefix - 1); - sLabel = CurHyperLabel->GetLabel(); - SetRoadmapLabel(CurHyperLabel, n_CurPrefix, sLabel); - ORoadmapHyperLabel* OldHyperLabel = GetPreviousHyperLabel( n_CurPrefix-1); - CurHyperLabel->SetPosition( OldHyperLabel); - n_CurPrefix++; + pItem = *i; + + pItem->SetIndex( _nIndex ); + pItem->SetPosition( GetPreviousHyperLabel( _nIndex ) ); } } if ( ! m_pImpl->isComplete() ) { - ORoadmapHyperLabel* OldHyperLabel = GetPreviousHyperLabel( m_pImpl->getItemCount()); - m_pImpl->InCompleteHyperLabel->SetPosition( OldHyperLabel ); - m_pImpl->InCompleteHyperLabel->SetLabelAndSize( m_pImpl->getItemCount(), ::String::CreateFromAscii("..."), m_pImpl->aHyperLabelPixelSize ); + RoadmapItem* pOldItem = GetPreviousHyperLabel( m_pImpl->getItemCount() ); + m_pImpl->InCompleteHyperLabel->SetPosition( pOldItem ); + m_pImpl->InCompleteHyperLabel->Update( m_pImpl->getItemCount(), ::String::CreateFromAscii("...") ); } } //--------------------------------------------------------------------- - void ORoadmap::ReplaceRoadmapItem( ItemIndex _Index, ::rtl::OUString _RoadmapItem, ItemId _RMID, sal_Bool _bEnabled ) + void ORoadmap::ReplaceRoadmapItem( ItemIndex _Index, const ::rtl::OUString& _RoadmapItem, ItemId _RMID, sal_Bool _bEnabled ) { - ORoadmapHyperLabel* CurHyperLabel = GetByIndex( _Index); - if ( CurHyperLabel != NULL ) + RoadmapItem* pItem = GetByIndex( _Index); + if ( pItem != NULL ) { - CurHyperLabel->SetLabelAndSize( _Index, _RoadmapItem, m_pImpl->aHyperLabelPixelSize ); - CurHyperLabel->SetID( _RMID ); - CurHyperLabel->Enable( _bEnabled ); + pItem->Update( _Index, _RoadmapItem ); + pItem->SetID( _RMID ); + pItem->Enable( _bEnabled ); } } @@ -397,7 +432,7 @@ namespace svt //--------------------------------------------------------------------- RoadmapTypes::ItemId ORoadmap::GetItemID( ItemIndex _nIndex ) const { - const ORoadmapHyperLabel* pHyperLabel = GetByIndex( _nIndex ); + const RoadmapItem* pHyperLabel = GetByIndex( _nIndex ); if ( pHyperLabel ) return pHyperLabel->GetID(); return -1; @@ -406,28 +441,26 @@ namespace svt //--------------------------------------------------------------------- RoadmapTypes::ItemIndex ORoadmap::GetItemIndex( ItemId _nID ) const { - ORoadmapHyperLabel* CurHyperLabel; ItemId nLocID = 0; - HL_Vector &LocHyperLabels = m_pImpl->getHyperLabels(); - ItemIndex nResult = 0; - for ( HL_Vector::iterator i = LocHyperLabels.begin(); i< LocHyperLabels.end(); i++) + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + for ( HL_Vector::const_iterator i = rItems.begin(); + i < rItems.end(); + ++i + ) { - CurHyperLabel = *i; - nLocID = CurHyperLabel->GetID(); + nLocID = (*i)->GetID(); if ( nLocID == _nID ) - return nResult; - nResult++; + return ItemIndex( i - rItems.begin() ); } return -1; } //--------------------------------------------------------------------- - void ORoadmap::InsertRoadmapItem( ItemIndex _Index, ::rtl::OUString _RoadmapItem, ItemId _nUniqueId, sal_Bool _bEnabled ) + void ORoadmap::InsertRoadmapItem( ItemIndex _Index, const ::rtl::OUString& _RoadmapItem, ItemId _nUniqueId, sal_Bool _bEnabled ) { - ORoadmapHyperLabel* CurHyperLabel; - CurHyperLabel = InsertHyperLabel(_Index, _RoadmapItem, _nUniqueId, _bEnabled); + InsertHyperLabel( _Index, _RoadmapItem, _nUniqueId, _bEnabled ); // Todo: YPos is superfluous, if items are always appended - UpdatefollowingHyperLabels( _Index + 1); + UpdatefollowingHyperLabels( _Index + 1 ); } //--------------------------------------------------------------------- @@ -436,7 +469,7 @@ namespace svt if ( m_pImpl->getItemCount() > 0 && ( _Index > -1) && ( _Index < m_pImpl->getItemCount() ) ) { m_pImpl->removeHyperLabel( _Index ); - UpdatefollowingHyperLabels( _Index, NREMOVERMITEM); + UpdatefollowingHyperLabels( _Index ); } } @@ -449,33 +482,33 @@ namespace svt //--------------------------------------------------------------------- sal_Bool ORoadmap::IsRoadmapItemEnabled( ItemId _nItemId, ItemIndex _nStartIndex ) const { - const ORoadmapHyperLabel* _pLabelItem = GetByID( _nItemId, _nStartIndex ); + const RoadmapItem* _pLabelItem = GetByID( _nItemId, _nStartIndex ); return _pLabelItem ? _pLabelItem->IsEnabled() : sal_False; } //--------------------------------------------------------------------- void ORoadmap::EnableRoadmapItem( ItemId _nItemId, sal_Bool _bEnable, ItemIndex _nStartIndex ) { - ORoadmapHyperLabel* CurHyperLabel = GetByID( _nItemId, _nStartIndex ); - if ( CurHyperLabel != NULL ) - CurHyperLabel->Enable( _bEnable ); + RoadmapItem* pItem = GetByID( _nItemId, _nStartIndex ); + if ( pItem != NULL ) + pItem->Enable( _bEnable ); } //--------------------------------------------------------------------- - void ORoadmap::ChangeRoadmapItemLabel( ItemId _nID, ::rtl::OUString _sLabel, ItemIndex _nStartIndex ) + void ORoadmap::ChangeRoadmapItemLabel( ItemId _nID, const ::rtl::OUString& _sLabel, ItemIndex _nStartIndex ) { - ORoadmapHyperLabel* CurHyperLabel = GetByID( _nID, _nStartIndex ); - if ( CurHyperLabel != NULL ) + RoadmapItem* pItem = GetByID( _nID, _nStartIndex ); + if ( pItem != NULL ) { - CurHyperLabel->SetLabelAndSize( CurHyperLabel->GetIndex(), _sLabel, m_pImpl->aHyperLabelPixelSize ); - HL_Vector pLocRoadmapItems = m_pImpl->getHyperLabels(); - ItemIndex Index = _nStartIndex; - for ( HL_Vector::iterator i = pLocRoadmapItems.begin()+ Index; i< pLocRoadmapItems.end(); i++) + pItem->Update( pItem->GetIndex(), _sLabel ); + + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + for ( HL_Vector::const_iterator i = rItems.begin() + _nStartIndex; + i < rItems.end(); + ++i + ) { - CurHyperLabel = *i; - ORoadmapHyperLabel* OldHyperLabel = GetPreviousHyperLabel( Index ); - CurHyperLabel->SetPosition( OldHyperLabel); - Index++; + (*i)->SetPosition( GetPreviousHyperLabel( i - rItems.begin() ) ); } } } @@ -484,9 +517,9 @@ namespace svt ::rtl::OUString ORoadmap::GetRoadmapItemLabel( ItemId _nID, ItemIndex _nStartIndex ) { - ORoadmapHyperLabel* CurHyperLabel = GetByID( _nID, _nStartIndex ); - if ( CurHyperLabel != NULL ) - return CurHyperLabel->GetLabel(); + RoadmapItem* pItem = GetByID( _nID, _nStartIndex ); + if ( pItem != NULL ) + return pItem->GetLabel(); else return ::rtl::OUString(); } @@ -494,47 +527,47 @@ namespace svt //--------------------------------------------------------------------- void ORoadmap::ChangeRoadmapItemID( ItemId _nID, ItemId _NewID, ItemIndex _nStartIndex ) { - ORoadmapHyperLabel* CurHyperLabel = GetByID( _nID, _nStartIndex ); - if ( CurHyperLabel != NULL ) - CurHyperLabel->SetID( _NewID ); + RoadmapItem* pItem = GetByID( _nID, _nStartIndex ); + if ( pItem != NULL ) + pItem->SetID( _NewID ); } //--------------------------------------------------------------------- - ORoadmapHyperLabel* ORoadmap::GetByID( ItemId _nID, ItemIndex _nStartIndex) + RoadmapItem* ORoadmap::GetByID( ItemId _nID, ItemIndex _nStartIndex) { - ORoadmapHyperLabel* CurHyperLabel; ItemId nLocID = 0; - HL_Vector &LocHyperLabels = m_pImpl->getHyperLabels(); - for ( HL_Vector::iterator i = LocHyperLabels.begin()+ _nStartIndex; i< LocHyperLabels.end(); i++) + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + for ( HL_Vector::const_iterator i = rItems.begin() + _nStartIndex; + i < rItems.end(); + ++i + ) { - CurHyperLabel = *i; - nLocID = CurHyperLabel->GetID(); + nLocID = (*i)->GetID(); if ( nLocID == _nID ) - return CurHyperLabel; + return *i; } return NULL; } //--------------------------------------------------------------------- - const ORoadmapHyperLabel* ORoadmap::GetByID( ItemId _nID, ItemIndex _nStartIndex ) const + const RoadmapItem* ORoadmap::GetByID( ItemId _nID, ItemIndex _nStartIndex ) const { return const_cast< ORoadmap* >( this )->GetByID( _nID, _nStartIndex ); } //--------------------------------------------------------------------- - ORoadmapHyperLabel* ORoadmap::GetByIndex( ItemIndex _nItemIndex) + RoadmapItem* ORoadmap::GetByIndex( ItemIndex _nItemIndex) { - HL_Vector &LocHyperLabels = m_pImpl->getHyperLabels(); - if ((_nItemIndex > -1) && (_nItemIndex < m_pImpl->getItemCount( ) ) ) + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + if ( ( _nItemIndex > -1 ) && ( _nItemIndex < (ItemIndex)rItems.size() ) ) { - ORoadmapHyperLabel* CurHyperLabel = LocHyperLabels.at(_nItemIndex); // Vectors are one-based - return CurHyperLabel; + return rItems.at( _nItemIndex ); } return NULL; } //--------------------------------------------------------------------- - const ORoadmapHyperLabel* ORoadmap::GetByIndex( ItemIndex _nItemIndex ) const + const RoadmapItem* ORoadmap::GetByIndex( ItemIndex _nItemIndex ) const { return const_cast< ORoadmap* >( this )->GetByIndex( _nItemIndex ); } @@ -542,14 +575,14 @@ namespace svt //--------------------------------------------------------------------- RoadmapTypes::ItemId ORoadmap::GetNextAvailableItemId( ItemIndex _nNewIndex ) { - ORoadmapHyperLabel* CurHyperLabel; + RoadmapItem* pItem = NULL; ItemIndex searchIndex = ++_nNewIndex; while ( searchIndex < m_pImpl->getItemCount() ) { - CurHyperLabel = GetByIndex( searchIndex ); - if ( CurHyperLabel->IsEnabled() ) - return CurHyperLabel->GetID( ); + pItem = GetByIndex( searchIndex ); + if ( pItem->IsEnabled() ) + return pItem->GetID( ); ++searchIndex; } @@ -559,13 +592,13 @@ namespace svt //--------------------------------------------------------------------- RoadmapTypes::ItemId ORoadmap::GetPreviousAvailableItemId( ItemIndex _nNewIndex ) { - ORoadmapHyperLabel* CurHyperLabel; + RoadmapItem* pItem = NULL; ItemIndex searchIndex = --_nNewIndex; while ( searchIndex > -1 ) { - CurHyperLabel = GetByIndex( searchIndex ); - if ( CurHyperLabel->IsEnabled() ) - return CurHyperLabel->GetID( ); + pItem = GetByIndex( searchIndex ); + if ( pItem->IsEnabled() ) + return pItem->GetID( ); searchIndex--; } @@ -575,12 +608,13 @@ namespace svt //--------------------------------------------------------------------- void ORoadmap::DeselectOldRoadmapItems() { - HL_Vector pLocRoadmapItems = m_pImpl->getHyperLabels(); - ORoadmapHyperLabel* CurHyperLabel = NULL; - for ( HL_Vector::iterator i = pLocRoadmapItems.begin(); i< pLocRoadmapItems.end(); i++) + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + for ( HL_Vector::const_iterator i = rItems.begin(); + i < rItems.end(); + ++i + ) { - CurHyperLabel = *i; - CurHyperLabel->ToggleBackgroundColor( COL_TRANSPARENT ); + (*i)->ToggleBackgroundColor( COL_TRANSPARENT ); } } @@ -606,7 +640,7 @@ namespace svt //--------------------------------------------------------------------- void ORoadmap::GetFocus() { - ORoadmapHyperLabel* pCurHyperLabel = GetByID( GetCurrentRoadmapItemID() ); + RoadmapItem* pCurHyperLabel = GetByID( GetCurrentRoadmapItemID() ); if ( pCurHyperLabel != NULL ) pCurHyperLabel->GrabFocus(); } @@ -615,15 +649,15 @@ namespace svt sal_Bool ORoadmap::SelectRoadmapItemByID( ItemId _nNewID ) { DeselectOldRoadmapItems(); - ORoadmapHyperLabel* CurHyperLabel = GetByID( _nNewID ); - if (CurHyperLabel != NULL) + RoadmapItem* pItem = GetByID( _nNewID ); + if ( pItem != NULL ) { - if (CurHyperLabel->IsEnabled()) + if ( pItem->IsEnabled() ) { const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - CurHyperLabel->ToggleBackgroundColor( rStyleSettings.GetHighlightColor() ); //HighlightColor + pItem->ToggleBackgroundColor( rStyleSettings.GetHighlightColor() ); //HighlightColor - CurHyperLabel->GrabFocus(); + pItem->GrabFocus(); m_pImpl->setCurItemID(_nNewID); Select(); @@ -659,7 +693,7 @@ namespace svt //--------------------------------------------------------------------- void ORoadmap::DrawHeadline() { - Point aTextPos = LogicToPixel( Point( RMENTRYPOINT_X, 8 ), MAP_APPFONT ); + Point aTextPos = LogicToPixel( Point( ROADMAP_INDENT_X, 8 ), MAP_APPFONT ); Size aOutputSize( GetOutputSizePixel() ); @@ -672,15 +706,16 @@ namespace svt } //--------------------------------------------------------------------- - ORoadmapHyperLabel* ORoadmap::GetByPointer(Window* pWindow) + RoadmapItem* ORoadmap::GetByPointer(Window* pWindow) { - ORoadmapHyperLabel* CurHyperLabel; - HL_Vector &LocHyperLabels = m_pImpl->getHyperLabels(); - for ( HL_Vector::iterator i = LocHyperLabels.begin(); i< LocHyperLabels.end(); i++) + const HL_Vector& rItems = m_pImpl->getHyperLabels(); + for ( HL_Vector::const_iterator i = rItems.begin(); + i < rItems.end(); + ++i + ) { - CurHyperLabel = *i; - if ( (CurHyperLabel->GetIDLabel() == pWindow) || (CurHyperLabel->GetDescriptionHyperLabel() == pWindow) ) - return CurHyperLabel; + if ( (*i)->Contains( pWindow ) ) + return *i; } return NULL; } @@ -692,30 +727,30 @@ namespace svt if ( _rNEvt.GetType() == EVENT_KEYINPUT ) { Window* pWindow = _rNEvt.GetWindow(); - ORoadmapHyperLabel* CurHyperLabel = GetByPointer( pWindow ); - if ( CurHyperLabel != NULL ) + RoadmapItem* pItem = GetByPointer( pWindow ); + if ( pItem != NULL ) { sal_Int16 nKeyCode = _rNEvt.GetKeyEvent()->GetKeyCode().GetCode(); switch( nKeyCode ) { case KEY_UP: - { // Note: Performancewhise this is not optimal, because we search for an ID in the labels + { // Note: Performancewise this is not optimal, because we search for an ID in the labels // and afterwards we search again for a label with the appropriate ID -> // unnecessarily we search twice!!! - ItemId nPrevItemID = GetPreviousAvailableItemId( CurHyperLabel->GetIndex() ); + ItemId nPrevItemID = GetPreviousAvailableItemId( pItem->GetIndex() ); if ( nPrevItemID != -1 ) return SelectRoadmapItemByID( nPrevItemID ); } break; case KEY_DOWN: { - ItemId nNextItemID = GetNextAvailableItemId( CurHyperLabel->GetIndex() ); + ItemId nNextItemID = GetNextAvailableItemId( pItem->GetIndex() ); if ( nNextItemID != -1 ) return SelectRoadmapItemByID( nNextItemID ); } break; case KEY_SPACE: - return SelectRoadmapItemByID( CurHyperLabel->GetID() ); + return SelectRoadmapItemByID( pItem->GetID() ); } } } @@ -730,6 +765,7 @@ namespace svt + //--------------------------------------------------------------------- void ORoadmap::DataChanged( const DataChangedEvent& rDCEvt ) { if ((( rDCEvt.GetType() == DATACHANGED_SETTINGS ) || @@ -743,216 +779,228 @@ namespace svt aFont.SetColor( aTextColor ); SetFont( aFont ); RoadmapTypes::ItemId curItemID = GetCurrentRoadmapItemID(); - ORoadmapHyperLabel* pLabelItem = GetByID( curItemID ); + RoadmapItem* pLabelItem = GetByID( curItemID ); pLabelItem->ToggleBackgroundColor(rStyleSettings.GetHighlightColor()); Invalidate(); } } - ORoadmapHyperLabel::ORoadmapHyperLabel( Window* _pParent, const ResId& ) + //--------------------------------------------------------------------- + RoadmapItem::RoadmapItem( ORoadmap& _rParent, const Size& _rItemPlayground ) + :m_aItemPlayground( _rItemPlayground ) { - mpIDLabel = new ORoadmapIDHyperLabel(_pParent, WB_WORDBREAK); - mpDescHyperLabel = new HyperLabel(_pParent, WB_TABSTOP | WB_WORDBREAK); - } - - - ORoadmapHyperLabel::ORoadmapHyperLabel( Window* _pParent, WinBits ) - { - mpIDLabel = new ORoadmapIDHyperLabel(_pParent, WB_WORDBREAK); - mpIDLabel->SetTextColor( mpIDLabel->GetSettings().GetStyleSettings().GetFieldTextColor( ) ); - mpDescHyperLabel = new HyperLabel(_pParent, WB_TABSTOP | WB_WORDBREAK); + mpID = new IDLabel( &_rParent, WB_WORDBREAK ); + mpID->SetTextColor( mpID->GetSettings().GetStyleSettings().GetFieldTextColor( ) ); + mpID->Show(); + mpDescription = new HyperLabel( &_rParent, WB_NOTABSTOP | WB_WORDBREAK ); + mpDescription->Show(); } //--------------------------------------------------------------------- - void ORoadmapHyperLabel::GrabFocus() + bool RoadmapItem::Contains( const Window* _pWindow ) const { - if ( mpDescHyperLabel ) - mpDescHyperLabel->GrabFocus(); + return ( mpID == _pWindow ) || ( mpDescription == _pWindow ); } - - void ORoadmapHyperLabel::SetInteractive( sal_Bool _bInteractive ) + //--------------------------------------------------------------------- + void RoadmapItem::GrabFocus() { - if ( mpDescHyperLabel ) - mpDescHyperLabel->SetInteractive(_bInteractive); + if ( mpDescription ) + mpDescription->GrabFocus(); } - void ORoadmapHyperLabel::SetID( sal_Int16 _ID ) + //--------------------------------------------------------------------- + void RoadmapItem::SetInteractive( sal_Bool _bInteractive ) { - if ( mpDescHyperLabel ) - mpDescHyperLabel->SetID(_ID); + if ( mpDescription ) + mpDescription->SetInteractive(_bInteractive); } - sal_Int16 ORoadmapHyperLabel::GetID() const + //--------------------------------------------------------------------- + void RoadmapItem::SetID( sal_Int16 _ID ) { - return mpDescHyperLabel ? mpDescHyperLabel->GetID() : sal_Int16(-1); + if ( mpDescription ) + mpDescription->SetID(_ID); } - void ORoadmapHyperLabel::SetIndex( sal_Int32 _Index ) + //--------------------------------------------------------------------- + sal_Int16 RoadmapItem::GetID() const { - if ( mpDescHyperLabel ) - mpDescHyperLabel->SetIndex(_Index); + return mpDescription ? mpDescription->GetID() : sal_Int16(-1); } - - sal_Int32 ORoadmapHyperLabel::GetIndex() const + //--------------------------------------------------------------------- + void RoadmapItem::ImplUpdateIndex( const ItemIndex _nIndex ) { - return mpDescHyperLabel ? mpDescHyperLabel->GetIndex() : sal_Int32(-1); - } + if ( mpDescription ) + mpDescription->SetIndex( _nIndex ); - - void ORoadmapHyperLabel::SetLabel( ::rtl::OUString _rText ) - { - if ( mpDescHyperLabel ) - mpDescHyperLabel->SetText(_rText); - } - - - ::rtl::OUString ORoadmapHyperLabel::GetLabel( ) - { - return mpDescHyperLabel ? mpDescHyperLabel->GetText() : String(); - } - - - void ORoadmapHyperLabel::SetPosition(ORoadmapHyperLabel* OldHyperLabel) - { - Point aNewLogicalPoint; - Point aNewPoint; - if (OldHyperLabel == NULL) + if ( mpID ) { - aNewLogicalPoint = Point( RMENTRYPOINT_X, RMENTRYPOINT_Y); - aNewPoint = mpIDLabel->LogicToPixel(aNewLogicalPoint, MAP_APPFONT ); + ::rtl::OUString aIDText = ::rtl::OUString::valueOf( (sal_Int32)( _nIndex + 1 ) ) + ::rtl::OUString::createFromAscii( "." ); + mpID->SetText( aIDText ); + } + + // update the geometry of both controls + ImplUpdatePosSize(); + } + + //--------------------------------------------------------------------- + void RoadmapItem::SetIndex( ItemIndex _Index ) + { + ImplUpdateIndex( _Index ); + } + + //--------------------------------------------------------------------- + RoadmapTypes::ItemIndex RoadmapItem::GetIndex() const + { + return mpDescription ? mpDescription->GetIndex() : ItemIndex(-1); + } + + //--------------------------------------------------------------------- + void RoadmapItem::SetLabel( const ::rtl::OUString& _rText ) + { + if ( mpDescription ) + mpDescription->SetText(_rText); + } + + //--------------------------------------------------------------------- + ::rtl::OUString RoadmapItem::GetLabel( ) + { + return mpDescription ? mpDescription->GetText() : String(); + } + + //--------------------------------------------------------------------- + void RoadmapItem::SetPosition( RoadmapItem* _pOldItem ) + { + Point aIDPos; + if ( _pOldItem == NULL ) + { + aIDPos = mpID->LogicToPixel( Point( ROADMAP_INDENT_X, ROADMAP_INDENT_Y ), MAP_APPFONT ); } else { - Size aOldSize = OldHyperLabel->GetDescriptionHyperLabel()->GetSizePixel(); - Point aOldLogicalPoint = OldHyperLabel->GetLogicalPosition(); - aNewLogicalPoint = Point(aOldLogicalPoint.X(), (aOldLogicalPoint.Y() + RMITEMDISTANCE_Y)); - aNewPoint = mpIDLabel->LogicToPixel(aNewLogicalPoint, MAP_APPFONT ); - aNewPoint = Point(aNewPoint.X(),aNewPoint.Y() + aOldSize.Height()); + Size aOldSize = _pOldItem->GetDescriptionHyperLabel()->GetSizePixel(); + + aIDPos = _pOldItem->mpID->GetPosPixel(); + aIDPos.Y() += aOldSize.Height(); + aIDPos.Y() += mpID->GetParent()->LogicToPixel( Size( 0, ROADMAP_ITEM_DISTANCE_Y ) ).Height(); } - mpIDLabel->SetPosPixel( aNewPoint ); - sal_Int32 xDescPos = aNewPoint.X() + mpIDLabel->GetSizePixel().Width(); - mpDescHyperLabel->SetPosPixel( Point(xDescPos, aNewPoint.Y()) ); + mpID->SetPosPixel( aIDPos ); + + sal_Int32 nDescPos = aIDPos.X() + mpID->GetSizePixel().Width(); + mpDescription->SetPosPixel( Point( nDescPos, aIDPos.Y() ) ); } - - void ORoadmapHyperLabel::SetZOrder( ORoadmapHyperLabel* pRefRoadmapHyperLabel, USHORT nFlags ) + //--------------------------------------------------------------------- + void RoadmapItem::SetZOrder( RoadmapItem* pRefRoadmapHyperLabel, USHORT nFlags ) { if (pRefRoadmapHyperLabel == NULL) - mpDescHyperLabel->SetZOrder( NULL, nFlags); //WINDOW_ZORDER_FIRST ); + mpDescription->SetZOrder( NULL, nFlags); //WINDOW_ZORDER_FIRST ); else - mpDescHyperLabel->SetZOrder( pRefRoadmapHyperLabel->mpDescHyperLabel, nFlags); //, WINDOW_ZORDER_BEHIND ); + mpDescription->SetZOrder( pRefRoadmapHyperLabel->mpDescription, nFlags); //, WINDOW_ZORDER_BEHIND ); } - - void ORoadmapHyperLabel::Enable( BOOL _bEnable) + //--------------------------------------------------------------------- + void RoadmapItem::Enable( BOOL _bEnable) { - mpIDLabel->Enable(_bEnable); - mpDescHyperLabel->Enable(_bEnable); + mpID->Enable(_bEnable); + mpDescription->Enable(_bEnable); } - BOOL ORoadmapHyperLabel::IsEnabled() const + //--------------------------------------------------------------------- + BOOL RoadmapItem::IsEnabled() const { - return mpIDLabel->IsEnabled(); + return mpID->IsEnabled(); } -// void ORoadmapHyperLabel::GrabFocus() -// { -// mpDescHyperLabel->GrabFocus(); -// -// } - - void ORoadmapHyperLabel::ToggleBackgroundColor( const Color& _rGBColor ) + //--------------------------------------------------------------------- + void RoadmapItem::ToggleBackgroundColor( const Color& _rGBColor ) { if (_rGBColor == COL_TRANSPARENT) { - mpIDLabel->SetTextColor( mpIDLabel->GetSettings().GetStyleSettings().GetFieldTextColor( ) ); - mpIDLabel->SetControlBackground( COL_TRANSPARENT ); + mpID->SetTextColor( mpID->GetSettings().GetStyleSettings().GetFieldTextColor( ) ); + mpID->SetControlBackground( COL_TRANSPARENT ); } else { - mpIDLabel->SetControlBackground( mpIDLabel->GetSettings().GetStyleSettings().GetHighlightColor() ); - mpIDLabel->SetTextColor( mpIDLabel->GetSettings().GetStyleSettings().GetHighlightTextColor( ) ); + mpID->SetControlBackground( mpID->GetSettings().GetStyleSettings().GetHighlightColor() ); + mpID->SetTextColor( mpID->GetSettings().GetStyleSettings().GetHighlightTextColor( ) ); } - mpDescHyperLabel->ToggleBackgroundColor(_rGBColor); + mpDescription->ToggleBackgroundColor(_rGBColor); } - - Point ORoadmapHyperLabel::GetLogicalPosition() + //--------------------------------------------------------------------- + void RoadmapItem::ImplUpdatePosSize() { - Point aPoint = mpIDLabel->GetPosPixel( ); - Size aSize = Size(aPoint.X(), aPoint.Y()); - aSize = mpIDLabel->PixelToLogic( aSize, MAP_APPFONT ); - aPoint = Point(aSize.Width(), aSize.Height()); - return aPoint; + // calculate widths + long nIDWidth = mpID->GetTextWidth( mpID->GetText() ); + long nMaxIDWidth = mpID->GetTextWidth( ::rtl::OUString::createFromAscii( "100." ) ); + nIDWidth = ::std::min( nIDWidth, nMaxIDWidth ); + + // check how many space the description would need + Size aDescriptionSize = mpDescription->CalcMinimumSize( m_aItemPlayground.Width() - nIDWidth ); + + // position and size both controls + Size aIDSize( nIDWidth, aDescriptionSize.Height() ); + mpID->SetSizePixel( aIDSize ); + + Point aIDPos = mpID->GetPosPixel(); + mpDescription->SetPosPixel( Point( aIDPos.X() + nIDWidth, aIDPos.Y() ) ); + mpDescription->SetSizePixel( aDescriptionSize ); } - - void ORoadmapHyperLabel::SetLabelAndSize( ItemIndex _RMIndex, ::rtl::OUString _rText, const Size& _rNewSize) + //--------------------------------------------------------------------- + void RoadmapItem::Update( ItemIndex _RMIndex, const ::rtl::OUString& _rText ) { - Size rIDSize = _rNewSize; - ::rtl::OUString aStr = ::rtl::OUString::valueOf( (sal_Int32)( _RMIndex + 1 ) ) + ::rtl::OUString::createFromAscii( "." ); - rIDSize.Width() = (sal_Int32) mpIDLabel->GetTextWidth( aStr ); - long nMaxWidth = mpIDLabel->GetTextWidth( ::rtl::OUString::createFromAscii("100.") ); - rIDSize.Width() = ::std::min( rIDSize.getWidth(),nMaxWidth ); - mpIDLabel->SetSizePixel(mpIDLabel->LogicToPixel( rIDSize)); - mpIDLabel->SetText( aStr); - mpIDLabel->Show(); - Size rDescSize = _rNewSize; - rDescSize.Width() -= rIDSize.Width(); - sal_Int32 xDescPos = mpIDLabel->GetPosPixel().X() + mpIDLabel->GetSizePixel().Width(); - sal_Int32 yDescPos = mpIDLabel->GetPosPixel().Y(); - Point aPoint = Point(xDescPos, yDescPos); - mpDescHyperLabel->SetPosPixel( aPoint ); - mpDescHyperLabel->SetLabelAndSize(_rText, rDescSize); - mpIDLabel->SetSizePixel( Size( mpIDLabel->GetSizePixel().Width(), mpDescHyperLabel->GetSizePixel().Height() ) ); + // update description label + mpDescription->SetLabel( _rText ); + + // update the index in both controls, which triggers updating the geometry of both + ImplUpdateIndex( _RMIndex ); } - ORoadmapHyperLabel::~ORoadmapHyperLabel( ) + //--------------------------------------------------------------------- + RoadmapItem::~RoadmapItem( ) { { - ::std::auto_ptr aTemp(mpIDLabel); - mpIDLabel = NULL; + ::std::auto_ptr aTemp(mpID); + mpID = NULL; } { - ::std::auto_ptr aTemp(mpDescHyperLabel); - mpDescHyperLabel = NULL; + ::std::auto_ptr aTemp(mpDescription); + mpDescription = NULL; } } - - void ORoadmapHyperLabel::SetClickHdl( const Link& rLink ) + //--------------------------------------------------------------------- + void RoadmapItem::SetClickHdl( const Link& rLink ) { - if ( mpDescHyperLabel ) - mpDescHyperLabel->SetClickHdl( rLink); + if ( mpDescription ) + mpDescription->SetClickHdl( rLink); } - const Link& ORoadmapHyperLabel::GetClickHdl( ) const + //--------------------------------------------------------------------- + const Link& RoadmapItem::GetClickHdl( ) const { - return mpDescHyperLabel->GetClickHdl(); + return mpDescription->GetClickHdl(); } - - ORoadmapIDHyperLabel::ORoadmapIDHyperLabel( Window* _pParent, const ResId& _rId ) - :FixedText( _pParent, _rId ) - { - } - - ORoadmapIDHyperLabel::ORoadmapIDHyperLabel( Window* _pParent, WinBits _nWinStyle ) + //--------------------------------------------------------------------- + IDLabel::IDLabel( Window* _pParent, WinBits _nWinStyle ) :FixedText( _pParent, _nWinStyle ) { } - - ORoadmapIDHyperLabel::~ORoadmapIDHyperLabel( ) + //--------------------------------------------------------------------- + IDLabel::~IDLabel( ) { } - - void ORoadmapIDHyperLabel::DataChanged( const DataChangedEvent& rDCEvt ) + //--------------------------------------------------------------------- + void IDLabel::DataChanged( const DataChangedEvent& rDCEvt ) { const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); FixedText::DataChanged( rDCEvt ); diff --git a/svtools/source/control/scrwin.cxx b/svtools/source/control/scrwin.cxx index 9805110c9254..162f23948385 100644 --- a/svtools/source/control/scrwin.cxx +++ b/svtools/source/control/scrwin.cxx @@ -273,8 +273,8 @@ void __EXPORT ScrollableWindow::Resize() // disable painting in the corner between the scrollbars if ( bVVisible && bHVisible ) { - aCornerWin.SetPosSizePixel( - *((Point*) &aOutPixSz), Size(nScrSize, nScrSize) ); + aCornerWin.SetPosSizePixel(Point(aOutPixSz.Width(), aOutPixSz.Height()), + Size(nScrSize, nScrSize) ); aCornerWin.Show(); } else diff --git a/svtools/source/control/taskstat.cxx b/svtools/source/control/taskstat.cxx index 86098af7de4a..82165a711285 100644 --- a/svtools/source/control/taskstat.cxx +++ b/svtools/source/control/taskstat.cxx @@ -43,7 +43,7 @@ #include #include -#include +#include #include // ======================================================================= diff --git a/svtools/source/control/urlcontrol.cxx b/svtools/source/control/urlcontrol.cxx index 1252fc17a1d6..899867414e2f 100644 --- a/svtools/source/control/urlcontrol.cxx +++ b/svtools/source/control/urlcontrol.cxx @@ -31,12 +31,8 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" -#ifndef SVTOOL_URLCONTROL_HXX #include -#endif -#ifndef SVTOOLS_FILENOTATION_HXX_ -#include "filenotation.hxx" -#endif +#include "svl/filenotation.hxx" //......................................................................... namespace svt diff --git a/svtools/source/control/valueacc.cxx b/svtools/source/control/valueacc.cxx index afdb728f450e..96eb8bb39e99 100644 --- a/svtools/source/control/valueacc.cxx +++ b/svtools/source/control/valueacc.cxx @@ -37,6 +37,7 @@ #include #include #include "valueimp.hxx" +#include #include #include @@ -92,7 +93,8 @@ void ValueSetItem::ClearAccessible() ValueSetAcc::ValueSetAcc( ValueSet* pParent, bool bIsTransientChildrenDisabled ) : ValueSetAccComponentBase (m_aMutex), mpParent( pParent ), - mbIsTransientChildrenDisabled( bIsTransientChildrenDisabled ) + mbIsTransientChildrenDisabled( bIsTransientChildrenDisabled ), + mbIsFocused(false) { } @@ -166,6 +168,35 @@ ValueSetAcc* ValueSetAcc::getImplementation( const uno::Reference< uno::XInterfa } } + +// ----------------------------------------------------------------------------- + +void ValueSetAcc::GetFocus (void) +{ + mbIsFocused = true; + + // Boradcast the state change. + ::com::sun::star::uno::Any aOldState, aNewState; + aNewState <<= ::com::sun::star::accessibility::AccessibleStateType::FOCUSED; + FireAccessibleEvent( + ::com::sun::star::accessibility::AccessibleEventId::STATE_CHANGED, + aOldState, aNewState); +} + +// ----------------------------------------------------------------------------- + +void ValueSetAcc::LoseFocus (void) +{ + mbIsFocused = false; + + // Boradcast the state change. + ::com::sun::star::uno::Any aOldState, aNewState; + aOldState <<= ::com::sun::star::accessibility::AccessibleStateType::FOCUSED; + FireAccessibleEvent( + ::com::sun::star::accessibility::AccessibleEventId::STATE_CHANGED, + aOldState, aNewState); +} + // ----------------------------------------------------------------------------- uno::Reference< accessibility::XAccessibleContext > SAL_CALL ValueSetAcc::getAccessibleContext() @@ -321,6 +352,9 @@ uno::Reference< accessibility::XAccessibleStateSet > SAL_CALL ValueSetAcc::getAc pStateSet->AddState (accessibility::AccessibleStateType::VISIBLE); if ( !mbIsTransientChildrenDisabled ) pStateSet->AddState (accessibility::AccessibleStateType::MANAGES_DESCENDANTS); + pStateSet->AddState (accessibility::AccessibleStateType::FOCUSABLE); + if (mbIsFocused) + pStateSet->AddState (accessibility::AccessibleStateType::FOCUSED); return pStateSet; } diff --git a/svtools/source/control/valueimp.hxx b/svtools/source/control/valueimp.hxx index 8d7951da0dfc..c176629953ae 100644 --- a/svtools/source/control/valueimp.hxx +++ b/svtools/source/control/valueimp.hxx @@ -150,6 +150,17 @@ public: public: + /** Called by the corresponding ValueSet when it gets the focus. + Stores the new focus state and broadcasts a state change event. + */ + void GetFocus (void); + + /** Called by the corresponding ValueSet when it loses the focus. + Stores the new focus state and broadcasts a state change event. + */ + void LoseFocus (void); + + // XAccessible virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext( ) throw (::com::sun::star::uno::RuntimeException); @@ -201,6 +212,8 @@ private: ::com::sun::star::accessibility::XAccessibleEventListener > > mxEventListeners; ValueSet* mpParent; bool mbIsTransientChildrenDisabled; + /// The current FOCUSED state. + bool mbIsFocused; static const ::com::sun::star::uno::Sequence< sal_Int8 >& getUnoTunnelId(); diff --git a/svtools/source/control/valueset.cxx b/svtools/source/control/valueset.cxx index 7326f540c654..4033a9df7bb5 100644 --- a/svtools/source/control/valueset.cxx +++ b/svtools/source/control/valueset.cxx @@ -1683,13 +1683,10 @@ void ValueSet::GetFocus() ImplDrawSelect(); Control::GetFocus(); - // Send accessibility event. - ::com::sun::star::uno::Any aOldState, aNewState; - aNewState <<= ::com::sun::star::accessibility::AccessibleStateType::FOCUSED; - ImplFireAccessibleEvent ( - ::com::sun::star::accessibility::AccessibleEventId::STATE_CHANGED, - aOldState, aNewState); - + // Tell the accessible object that we got the focus. + ValueSetAcc* pAcc = ValueSetAcc::getImplementation( GetAccessible( FALSE ) ); + if( pAcc ) + pAcc->GetFocus(); } // ----------------------------------------------------------------------- @@ -1703,12 +1700,10 @@ void ValueSet::LoseFocus() HideFocus(); Control::LoseFocus(); - // Send accessibility event. - ::com::sun::star::uno::Any aOldState, aNewState; - aOldState <<= ::com::sun::star::accessibility::AccessibleStateType::FOCUSED; - ImplFireAccessibleEvent ( - ::com::sun::star::accessibility::AccessibleEventId::STATE_CHANGED, - aOldState, aNewState); + // Tell the accessible object that we lost the focus. + ValueSetAcc* pAcc = ValueSetAcc::getImplementation( GetAccessible( FALSE ) ); + if( pAcc ) + pAcc->LoseFocus(); } // ----------------------------------------------------------------------- diff --git a/svtools/source/dialogs/addresstemplate.cxx b/svtools/source/dialogs/addresstemplate.cxx index ddb34d5d4fd2..aa18a3683916 100644 --- a/svtools/source/dialogs/addresstemplate.cxx +++ b/svtools/source/dialogs/addresstemplate.cxx @@ -39,7 +39,7 @@ #include "addresstemplate.hrc" #endif #ifndef _SVTOOLS_HRC -#include +#include #endif #ifndef _SVT_HELPID_HRC #include @@ -70,7 +70,7 @@ #include #include "localresaccess.hxx" #ifndef SVTOOLS_FILENOTATION_HXX_ -#include "filenotation.hxx" +#include "svl/filenotation.hxx" #endif #include @@ -97,6 +97,22 @@ namespace svt DECLARE_STL_VECTOR( String, StringArray ); DECLARE_STL_STDKEY_SET( ::rtl::OUString, StringBag ); DECLARE_STL_USTRINGACCESS_MAP( ::rtl::OUString, MapString2String ); + + namespace + { + String lcl_getSelectedDataSource( const ComboBox& _dataSourceCombo ) + { + String selectedDataSource = _dataSourceCombo.GetText(); + if ( _dataSourceCombo.GetEntryPos( selectedDataSource ) == LISTBOX_ENTRY_NOTFOUND ) + { + // none of the pre-selected entries -> assume a path to a database document + OFileNotation aFileNotation( selectedDataSource, OFileNotation::N_SYSTEM ); + selectedDataSource = aFileNotation.get( OFileNotation::N_URL ); + } + return selectedDataSource; + } + } + // =================================================================== // = IAssigmentData // =================================================================== @@ -308,8 +324,20 @@ public: virtual void setDatasourceName(const ::rtl::OUString& _rName); virtual void setCommand(const ::rtl::OUString& _rCommand); + + virtual void Notify( const com::sun::star::uno::Sequence& aPropertyNames); + virtual void Commit(); }; + +void AssignmentPersistentData::Notify( const com::sun::star::uno::Sequence& ) +{ +} + +void AssignmentPersistentData::Commit() +{ +} + // ------------------------------------------------------------------- AssignmentPersistentData::AssignmentPersistentData() :ConfigItem( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Office.DataAccess/AddressBook" ))) @@ -857,9 +885,7 @@ public: Reference< XCompletedConnection > xDS; if ( m_pImpl->bWorkingPersistent ) { - String sSelectedDS = m_aDatasource.GetText(); - OFileNotation aFileNotation( sSelectedDS ,OFileNotation::N_SYSTEM); - sSelectedDS = aFileNotation.get(OFileNotation::N_URL); + String sSelectedDS = lcl_getSelectedDataSource( m_aDatasource ); // get the data source the user has chosen and let it build a connection INetURLObject aURL( sSelectedDS ); @@ -1179,9 +1205,7 @@ public: // ------------------------------------------------------------------- IMPL_LINK(AddressBookSourceDialog, OnOkClicked, Button*, EMPTYARG) { - String sSelectedDS = m_aDatasource.GetText(); - OFileNotation aFileNotation( sSelectedDS ,OFileNotation::N_SYSTEM); - sSelectedDS = aFileNotation.get(OFileNotation::N_URL); + String sSelectedDS = lcl_getSelectedDataSource( m_aDatasource ); if ( m_pImpl->bWorkingPersistent ) { m_pImpl->pConfigData->setDatasourceName(sSelectedDS); @@ -1231,7 +1255,6 @@ public: Reference xProp(xAdminDialog,UNO_QUERY); if ( xProp.is() ) { - String sOldDS = m_aDatasource.GetText(); ::rtl::OUString sName; xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataSourceName"))) >>= sName; diff --git a/svtools/source/dialogs/addresstemplate.src b/svtools/source/dialogs/addresstemplate.src index 9c4997cae9d2..63c0e6475597 100644 --- a/svtools/source/dialogs/addresstemplate.src +++ b/svtools/source/dialogs/addresstemplate.src @@ -29,7 +29,7 @@ ************************************************************************/ #ifndef _SVTOOLS_HRC -#include +#include #endif #ifndef _SVT_ADDRESSTEMPLATE_HRC_ #include "addresstemplate.hrc" diff --git a/svtools/source/dialogs/logindlg.cxx b/svtools/source/dialogs/logindlg.cxx index 7ac65a77947d..791e373086af 100644 --- a/svtools/source/dialogs/logindlg.cxx +++ b/svtools/source/dialogs/logindlg.cxx @@ -38,7 +38,7 @@ #include "logindlg.hrc" #endif #ifndef _SVTOOLS_HRC -#include +#include #endif #include diff --git a/svtools/source/dialogs/logindlg.src b/svtools/source/dialogs/logindlg.src index 897597f383bf..b3ef357bbae4 100644 --- a/svtools/source/dialogs/logindlg.src +++ b/svtools/source/dialogs/logindlg.src @@ -29,7 +29,7 @@ ************************************************************************/ #ifndef _SVTOOLS_HRC -#include +#include #endif #ifndef _SVTOOLS_LOGINDLG_HRC_ diff --git a/svtools/source/dialogs/printdlg.cxx b/svtools/source/dialogs/printdlg.cxx index 68acffc62a74..a006f209af18 100644 --- a/svtools/source/dialogs/printdlg.cxx +++ b/svtools/source/dialogs/printdlg.cxx @@ -47,7 +47,7 @@ #include #include #include -#include "pickerhelper.hxx" +#include "svl/pickerhelper.hxx" #ifndef _SVT_HELPID_HRC #include #endif @@ -172,7 +172,7 @@ PrintDialog::~PrintDialog() void PrintDialog::ImplSetImages() { - if( ! GetSettings().GetStyleSettings().GetDialogColor().IsDark() ) + if( ! GetSettings().GetStyleSettings().GetHighContrastMode() ) { maImgCollate.SetModeImage( Image( SvtResId( RID_IMG_PRNDLG_COLLATE ) ), BMP_COLOR_NORMAL ); maImgNotCollate.SetModeImage( Image( SvtResId( RID_IMG_PRNDLG_NOCOLLATE ) ), BMP_COLOR_NORMAL ); diff --git a/svtools/source/dialogs/printdlg.hrc b/svtools/source/dialogs/printdlg.hrc index cae57cefdb0e..2f2f43e3ba10 100644 --- a/svtools/source/dialogs/printdlg.hrc +++ b/svtools/source/dialogs/printdlg.hrc @@ -28,7 +28,7 @@ * ************************************************************************/ -#include +#include #define FL_PRINTER 1 #define LB_NAMES 2 diff --git a/svtools/source/dialogs/prnsetup.hrc b/svtools/source/dialogs/prnsetup.hrc index 33f98f7ed5e0..00623d97084c 100644 --- a/svtools/source/dialogs/prnsetup.hrc +++ b/svtools/source/dialogs/prnsetup.hrc @@ -27,7 +27,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#include +#include #define FL_PRINTER 1 #define LB_NAMES 2 diff --git a/svtools/inc/propctrl.hxx b/svtools/source/dialogs/propctrl.hxx similarity index 99% rename from svtools/inc/propctrl.hxx rename to svtools/source/dialogs/propctrl.hxx index b2698f6a1c8e..59019fc21b90 100644 --- a/svtools/inc/propctrl.hxx +++ b/svtools/source/dialogs/propctrl.hxx @@ -34,7 +34,7 @@ #include "sbx.hxx" #include "sbxbase.hxx" #include "sbxres.hxx" -#include +#include */ diff --git a/svtools/source/dialogs/roadmapwizard.cxx b/svtools/source/dialogs/roadmapwizard.cxx index b0fff49e5e8d..c7473e446986 100644 --- a/svtools/source/dialogs/roadmapwizard.cxx +++ b/svtools/source/dialogs/roadmapwizard.cxx @@ -32,7 +32,7 @@ #include "precompiled_svtools.hxx" #include -#include +#include #include #include "roadmap.hxx" #include diff --git a/svtools/source/dialogs/wizardmachine.cxx b/svtools/source/dialogs/wizardmachine.cxx index c436256a31c4..602c2e3e6f8a 100644 --- a/svtools/source/dialogs/wizardmachine.cxx +++ b/svtools/source/dialogs/wizardmachine.cxx @@ -36,7 +36,7 @@ #include #include #ifndef _SVTOOLS_HRC -#include +#include #endif //......................................................................... diff --git a/svtools/source/dialogs/wizardmachine.src b/svtools/source/dialogs/wizardmachine.src index d83fdd98824b..2fa50ef20bf6 100644 --- a/svtools/source/dialogs/wizardmachine.src +++ b/svtools/source/dialogs/wizardmachine.src @@ -29,7 +29,7 @@ ************************************************************************/ #ifndef _SVTOOLS_HRC -#include +#include #endif String STR_WIZDLG_FINISH diff --git a/svtools/source/dialogs/wizdlg.cxx b/svtools/source/dialogs/wizdlg.cxx index f0c69a24e4e4..aa0e62046ea6 100644 --- a/svtools/source/dialogs/wizdlg.cxx +++ b/svtools/source/dialogs/wizdlg.cxx @@ -303,8 +303,9 @@ void WizardDialog::ImplPosTabPage() } else if ( meViewAlign == WINDOWALIGN_LEFT ) { - nOffX += aViewSize.Width()+WIZARDDIALOG_VIEW_DLGOFFSET_X; - aDlgSize.Width() -= aViewSize.Width()+WIZARDDIALOG_VIEW_DLGOFFSET_X; + long nViewOffset = mbEmptyViewMargin ? 0 : WIZARDDIALOG_VIEW_DLGOFFSET_X; + nOffX += aViewSize.Width() + nViewOffset; + aDlgSize.Width() -= nOffX; } else if ( meViewAlign == WINDOWALIGN_BOTTOM ) aDlgSize.Height() -= aViewSize.Height()+WIZARDDIALOG_VIEW_DLGOFFSET_Y; diff --git a/svtools/source/edit/svmedit.cxx b/svtools/source/edit/svmedit.cxx index 135761195e48..8c60a62063df 100644 --- a/svtools/source/edit/svmedit.cxx +++ b/svtools/source/edit/svmedit.cxx @@ -43,11 +43,11 @@ #include #include -#include -#include +#include +#include #include -#include -#include +#include +#include // IDs erstmal aus VCL geklaut, muss mal richtig delivert werden... @@ -1478,7 +1478,7 @@ long MultiLineEdit::PreNotify( NotifyEvent& rNEvt ) { long nDone = 0; -#if (OSL_DEBUG_LEVEL > 1) && !defined( PRODUCT ) +#if (OSL_DEBUG_LEVEL > 1) && defined(DBG_UTIL) if( rNEvt.GetType() == EVENT_KEYINPUT ) { const KeyEvent& rKEvent = *rNEvt.GetKeyEvent(); diff --git a/svtools/source/edit/syntaxhighlight.cxx b/svtools/source/edit/syntaxhighlight.cxx index e2e71e86b662..7e2f98d0d37f 100644 --- a/svtools/source/edit/syntaxhighlight.cxx +++ b/svtools/source/edit/syntaxhighlight.cxx @@ -682,7 +682,7 @@ String SimpleTokenizer_Impl::getTokStr return String( pStartPos, (USHORT)( pEndPos - pStartPos ) ); } -#ifndef PRODUCT +#ifdef DBG_UTIL // TEST: Token ausgeben String SimpleTokenizer_Impl::getFullTokenStr( /*out*/TokenTypes eType, /*out*/const sal_Unicode* pStartPos, /*out*/const sal_Unicode* pEndPos ) diff --git a/svtools/source/edit/textdat2.hxx b/svtools/source/edit/textdat2.hxx index 51336e75741e..7ee667db2305 100644 --- a/svtools/source/edit/textdat2.hxx +++ b/svtools/source/edit/textdat2.hxx @@ -32,7 +32,7 @@ #ifndef _TEXTDAT2_HXX #define _TEXTDAT2_HXX -#include +#include #include #include #include diff --git a/svtools/source/edit/textdoc.hxx b/svtools/source/edit/textdoc.hxx index 45b03e70ac47..b940bb6f4da7 100644 --- a/svtools/source/edit/textdoc.hxx +++ b/svtools/source/edit/textdoc.hxx @@ -31,7 +31,7 @@ #ifndef _TEXTDOC_HXX #define _TEXTDOC_HXX -#include +#include #include #include diff --git a/svtools/source/edit/texteng.cxx b/svtools/source/edit/texteng.cxx index e7eff8385206..596ca89054e7 100644 --- a/svtools/source/edit/texteng.cxx +++ b/svtools/source/edit/texteng.cxx @@ -40,7 +40,7 @@ #include #include #include -#include +#include #include #include diff --git a/svtools/source/edit/textundo.hxx b/svtools/source/edit/textundo.hxx index fe2c53bca45e..7ce7169e1563 100644 --- a/svtools/source/edit/textundo.hxx +++ b/svtools/source/edit/textundo.hxx @@ -30,7 +30,7 @@ #ifndef _TEXTUNDO_HXX #define _TEXTUNDO_HXX -#include +#include class TextEngine; diff --git a/svtools/source/edit/textview.cxx b/svtools/source/edit/textview.cxx index e0697a488287..99b6fc900885 100644 --- a/svtools/source/edit/textview.cxx +++ b/svtools/source/edit/textview.cxx @@ -36,7 +36,7 @@ #include #include -#include +#include #include #include #include @@ -44,7 +44,7 @@ #include #include -#include +#include #ifndef _COM_SUN_STAR_TEXT_XBREAKITERATOR_HPP_ #include diff --git a/svtools/source/filter.vcl/filter/SvFilterOptionsDialog.cxx b/svtools/source/filter.vcl/filter/SvFilterOptionsDialog.cxx index 1bc83575ec38..584814dd9e92 100644 --- a/svtools/source/filter.vcl/filter/SvFilterOptionsDialog.cxx +++ b/svtools/source/filter.vcl/filter/SvFilterOptionsDialog.cxx @@ -37,7 +37,7 @@ #include "FilterConfigCache.hxx" #include #include -#include +#include #include #include "dlgexpor.hxx" #include "dlgejpg.hxx" @@ -49,7 +49,7 @@ #include #include #include -#include +#include #include "vcl/svapp.hxx" #if defined WIN || (defined OS2 && !defined ICC) diff --git a/svtools/source/filter.vcl/filter/dlgejpg.hrc b/svtools/source/filter.vcl/filter/dlgejpg.hrc index 4342a89d1d24..67ac915df367 100644 --- a/svtools/source/filter.vcl/filter/dlgejpg.hrc +++ b/svtools/source/filter.vcl/filter/dlgejpg.hrc @@ -27,7 +27,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#include +#include #define BTN_OK 1 #define BTN_CANCEL 1 diff --git a/svtools/source/filter.vcl/filter/dlgepng.hrc b/svtools/source/filter.vcl/filter/dlgepng.hrc index 79d4b189aa5a..d687141abf56 100644 --- a/svtools/source/filter.vcl/filter/dlgepng.hrc +++ b/svtools/source/filter.vcl/filter/dlgepng.hrc @@ -27,7 +27,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#include +#include #define BTN_OK 1 #define BTN_CANCEL 1 diff --git a/svtools/source/filter.vcl/filter/dlgexpor.hrc b/svtools/source/filter.vcl/filter/dlgexpor.hrc index 28921b5f178c..cae15d7276d2 100644 --- a/svtools/source/filter.vcl/filter/dlgexpor.hrc +++ b/svtools/source/filter.vcl/filter/dlgexpor.hrc @@ -27,7 +27,7 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#include +#include #define BTN_OK_PIX 1 #define BTN_CANCEL_PIX 1 diff --git a/svtools/source/filter.vcl/filter/filter.cxx b/svtools/source/filter.vcl/filter/filter.cxx index f87fabc7973d..306307a0bf91 100644 --- a/svtools/source/filter.vcl/filter/filter.cxx +++ b/svtools/source/filter.vcl/filter/filter.cxx @@ -54,7 +54,7 @@ #include "jpeg.hxx" #include "xbmread.hxx" #include "xpmread.hxx" -#include +#include #include "strings.hrc" #include "sgffilt.hxx" #include "osl/module.hxx" @@ -74,8 +74,8 @@ #include #include #include -#include #include +#include #include #include "SvFilterOptionsDialog.hxx" @@ -1038,8 +1038,13 @@ void GraphicFilter::ImplInit() if( bUseConfig ) { - SvtPathOptions aPathOpt; - aFilterPath = aPathOpt.GetModulePath(); +#if defined WNT + rtl::OUString url(RTL_CONSTASCII_USTRINGPARAM("$BRAND_BASE_DIR/program")); +#else + rtl::OUString url(RTL_CONSTASCII_USTRINGPARAM("$OOO_BASE_DIR/program")); +#endif + rtl::Bootstrap::expandMacros(url); //TODO: detect failure + utl::LocalFileHelper::ConvertURLToPhysicalName(url, aFilterPath); } pErrorEx = new FilterErrorEx; diff --git a/svtools/source/filter.vcl/filter/makefile.mk b/svtools/source/filter.vcl/filter/makefile.mk index 2229f8f05546..ecdf48ba5671 100644 --- a/svtools/source/filter.vcl/filter/makefile.mk +++ b/svtools/source/filter.vcl/filter/makefile.mk @@ -40,6 +40,8 @@ LIBTARGET=NO .INCLUDE : settings.mk .INCLUDE : $(PRJ)$/util$/svt.pmk +SOLARINC+=-I../../inc + # --- Files -------------------------------------------------------- SRS1NAME=$(TARGET) diff --git a/svtools/source/filter.vcl/filter/strings.hrc b/svtools/source/filter.vcl/filter/strings.hrc index 0cfa4e6bf7c4..a3356982609a 100644 --- a/svtools/source/filter.vcl/filter/strings.hrc +++ b/svtools/source/filter.vcl/filter/strings.hrc @@ -27,4 +27,4 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#include +#include diff --git a/svtools/source/filter.vcl/igif/decode.cxx b/svtools/source/filter.vcl/igif/decode.cxx index 960a91845bf8..9babc02665a3 100644 --- a/svtools/source/filter.vcl/igif/decode.cxx +++ b/svtools/source/filter.vcl/igif/decode.cxx @@ -51,7 +51,6 @@ GIFLZWDecompressor::GIFLZWDecompressor( BYTE cDataSize ) : bEOIFound ( FALSE ), nDataSize ( cDataSize ) { - pTable = new GIFLZWTableEntry[ 4096 ]; pOutBuf = new BYTE[ 4096 ]; nClearCode = 1 << nDataSize; @@ -61,6 +60,8 @@ GIFLZWDecompressor::GIFLZWDecompressor( BYTE cDataSize ) : nOldCode = 0xffff; pOutBufData = pOutBuf + 4096; + pTable = new GIFLZWTableEntry[ 4098 ]; + for( USHORT i = 0; i < nTableSize; i++ ) { pTable[i].pPrev = NULL; diff --git a/svtools/source/filter.vcl/igif/makefile.mk b/svtools/source/filter.vcl/igif/makefile.mk index 0562813c00cc..49e2461bd7a8 100644 --- a/svtools/source/filter.vcl/igif/makefile.mk +++ b/svtools/source/filter.vcl/igif/makefile.mk @@ -38,6 +38,7 @@ TARGET=igif .INCLUDE : settings.mk .INCLUDE : $(PRJ)$/util$/svt.pmk +SOLARINC+=-I../../inc # --- Files -------------------------------------------------------- diff --git a/svtools/source/filter.vcl/ixbm/makefile.mk b/svtools/source/filter.vcl/ixbm/makefile.mk index 9c090e1de04a..41d6f7425474 100644 --- a/svtools/source/filter.vcl/ixbm/makefile.mk +++ b/svtools/source/filter.vcl/ixbm/makefile.mk @@ -38,6 +38,7 @@ TARGET=ixbm .INCLUDE : settings.mk .INCLUDE : $(PRJ)$/util$/svt.pmk +SOLARINC+=-I../../inc # --- Files -------------------------------------------------------- diff --git a/svtools/source/filter.vcl/ixpm/makefile.mk b/svtools/source/filter.vcl/ixpm/makefile.mk index 2e5cb851ebbf..10792f41ab3a 100644 --- a/svtools/source/filter.vcl/ixpm/makefile.mk +++ b/svtools/source/filter.vcl/ixpm/makefile.mk @@ -38,6 +38,7 @@ TARGET=ixpm .INCLUDE : settings.mk .INCLUDE : $(PRJ)$/util$/svt.pmk +SOLARINC+=-I../../inc # --- Files -------------------------------------------------------- diff --git a/svtools/source/filter.vcl/ixpm/xpmread.cxx b/svtools/source/filter.vcl/ixpm/xpmread.cxx index 0aa070e41596..1a667908f2f1 100644 --- a/svtools/source/filter.vcl/ixpm/xpmread.cxx +++ b/svtools/source/filter.vcl/ixpm/xpmread.cxx @@ -109,6 +109,10 @@ ReadState XPMReader::ReadXPM( Graphic& rGraphic ) mnColors = ImplGetULONG( 2 ); mnCpp = ImplGetULONG( 3 ); } + if ( mnColors > ( SAL_MAX_UINT32 / ( 4 + mnCpp ) ) ) + mbStatus = sal_False; + if ( ( mnWidth * mnCpp ) >= XPMSTRINGBUF ) + mbStatus = sal_False; if ( mbStatus && mnWidth && mnHeight && mnColors && mnCpp ) { mnIdentifier = XPMCOLORS; @@ -118,15 +122,20 @@ ReadState XPMReader::ReadXPM( Graphic& rGraphic ) // 1 Byte -> 0xff wenn Farbe transparent ist // 3 Bytes -> RGB Wert der Farbe mpColMap = new BYTE[ mnColors * ( 4 + mnCpp ) ]; - - for ( ULONG i = 0; i < mnColors; i++ ) + if ( mpColMap ) { - if ( ImplGetColor( i ) == FALSE ) + for ( ULONG i = 0; i < mnColors; i++ ) { - mbStatus = FALSE; - break; + if ( ImplGetColor( i ) == FALSE ) + { + mbStatus = FALSE; + break; + } } } + else + mbStatus = sal_False; + if ( mbStatus ) { // bei mehr als 256 Farben wird eine 24 Bit Grafik erstellt @@ -630,7 +639,7 @@ BOOL XPMReader::ImplGetString( void ) mnStatus &=~XPMSTRING; // end of parameter by eol break; } - if ( mnStringSize >= XPMSTRINGBUF ) + if ( mnStringSize >= ( XPMSTRINGBUF - 1 ) ) { mbStatus = FALSE; break; diff --git a/svtools/source/filter.vcl/jpeg/makefile.mk b/svtools/source/filter.vcl/jpeg/makefile.mk index 86c9c89c8bf0..7a9b5fc509c9 100644 --- a/svtools/source/filter.vcl/jpeg/makefile.mk +++ b/svtools/source/filter.vcl/jpeg/makefile.mk @@ -43,6 +43,8 @@ TARGET=jpeg CFLAGS+=-DSYSTEM_JPEG .ENDIF +SOLARINC+=-I../../inc + # --- Files -------------------------------------------------------- SLOFILES= $(SLO)$/jpegc.obj \ diff --git a/svtools/source/filter.vcl/wmf/wmfwr.cxx b/svtools/source/filter.vcl/wmf/wmfwr.cxx index 3c3ca09692af..d25d4e94f97a 100644 --- a/svtools/source/filter.vcl/wmf/wmfwr.cxx +++ b/svtools/source/filter.vcl/wmf/wmfwr.cxx @@ -33,7 +33,7 @@ #include #include "wmfwr.hxx" -#include +#include #include #include #include @@ -438,16 +438,7 @@ void WMFWriter::WMFRecord_CreateFontIndirect(const Font & rFont) BYTE nPitchFamily; WriteRecordHeader(0x00000000,W_META_CREATEFONTINDIRECT); - - if ( !rFont.GetSize().Width() ) - { - VirtualDevice aDev; - FontMetric aMetric( aDev.GetFontMetric( rFont ) ); - WriteHeightWidth(Size(aMetric.GetWidth(),-rFont.GetSize().Height())); - } - else - WriteHeightWidth(Size(rFont.GetSize().Width(),-rFont.GetSize().Height())); - + WriteHeightWidth(Size(rFont.GetSize().Width(),-rFont.GetSize().Height())); *pWMF << (short)rFont.GetOrientation() << (short)rFont.GetOrientation(); switch (rFont.GetWeight()) { @@ -764,7 +755,7 @@ void WMFWriter::WMFRecord_Polygon(const Polygon & rPoly) Polygon aSimplePoly; if ( rPoly.HasFlags() ) - rPoly.GetSimple( aSimplePoly ); + rPoly.AdaptiveSubdivide( aSimplePoly ); else aSimplePoly = rPoly; nSize = aSimplePoly.GetSize(); @@ -779,7 +770,7 @@ void WMFWriter::WMFRecord_PolyLine(const Polygon & rPoly) USHORT nSize,i; Polygon aSimplePoly; if ( rPoly.HasFlags() ) - rPoly.GetSimple( aSimplePoly ); + rPoly.AdaptiveSubdivide( aSimplePoly ); else aSimplePoly = rPoly; nSize=aSimplePoly.GetSize(); @@ -801,7 +792,7 @@ void WMFWriter::WMFRecord_PolyPolygon(const PolyPolygon & rPolyPoly) if ( aSimplePolyPoly[ i ].HasFlags() ) { Polygon aSimplePoly; - aSimplePolyPoly[ i ].GetSimple( aSimplePoly ); + aSimplePolyPoly[ i ].AdaptiveSubdivide( aSimplePoly ); aSimplePolyPoly[ i ] = aSimplePoly; } } diff --git a/svtools/source/inc/hatchwindowfactory.hxx b/svtools/source/hatchwindow/hatchwindowfactory.hxx similarity index 100% rename from svtools/source/inc/hatchwindowfactory.hxx rename to svtools/source/hatchwindow/hatchwindowfactory.hxx diff --git a/svtools/inc/filectrl.hrc b/svtools/source/inc/filectrl.hrc similarity index 100% rename from svtools/inc/filectrl.hrc rename to svtools/source/inc/filectrl.hrc diff --git a/svtools/inc/gifread.hxx b/svtools/source/inc/gifread.hxx similarity index 100% rename from svtools/inc/gifread.hxx rename to svtools/source/inc/gifread.hxx diff --git a/svtools/inc/gradwrap.hxx b/svtools/source/inc/gradwrap.hxx similarity index 100% rename from svtools/inc/gradwrap.hxx rename to svtools/source/inc/gradwrap.hxx diff --git a/svtools/inc/iodlg.hrc b/svtools/source/inc/iodlg.hrc similarity index 99% rename from svtools/inc/iodlg.hrc rename to svtools/source/inc/iodlg.hrc index 36e3092064cd..9c41e06a2b6c 100644 --- a/svtools/inc/iodlg.hrc +++ b/svtools/source/inc/iodlg.hrc @@ -32,7 +32,7 @@ #define _SVTOOLS_IODLGIMPL_HRC #ifndef _SVTOOLS_HRC -#include +#include #endif // ModalDialog DLG_SVT_EXPLORERFILE diff --git a/svtools/inc/jpeg.hxx b/svtools/source/inc/jpeg.hxx similarity index 100% rename from svtools/inc/jpeg.hxx rename to svtools/source/inc/jpeg.hxx diff --git a/svtools/inc/msgrd.hxx b/svtools/source/inc/msgrd.hxx similarity index 100% rename from svtools/inc/msgrd.hxx rename to svtools/source/inc/msgrd.hxx diff --git a/svtools/inc/msgwr.hxx b/svtools/source/inc/msgwr.hxx similarity index 100% rename from svtools/inc/msgwr.hxx rename to svtools/source/inc/msgwr.hxx diff --git a/svtools/inc/property.hxx b/svtools/source/inc/property.hxx similarity index 99% rename from svtools/inc/property.hxx rename to svtools/source/inc/property.hxx index cfdc62dd350c..2a756f177608 100644 --- a/svtools/inc/property.hxx +++ b/svtools/source/inc/property.hxx @@ -54,17 +54,17 @@ #endif #include #include -#include +#include #define _SVSTDARR_USHORTS -#include +#include #include #include -#include +#include #ifndef _SVSTDARR_STRINGS #define _SVSTDARR_STRINGS -#include +#include #endif #include #include diff --git a/svtools/inc/sgfbram.hxx b/svtools/source/inc/sgfbram.hxx similarity index 100% rename from svtools/inc/sgfbram.hxx rename to svtools/source/inc/sgfbram.hxx diff --git a/svtools/inc/sgffilt.hxx b/svtools/source/inc/sgffilt.hxx similarity index 100% rename from svtools/inc/sgffilt.hxx rename to svtools/source/inc/sgffilt.hxx diff --git a/svtools/inc/sgvmain.hxx b/svtools/source/inc/sgvmain.hxx similarity index 100% rename from svtools/inc/sgvmain.hxx rename to svtools/source/inc/sgvmain.hxx diff --git a/svtools/inc/sgvspln.hxx b/svtools/source/inc/sgvspln.hxx similarity index 100% rename from svtools/inc/sgvspln.hxx rename to svtools/source/inc/sgvspln.hxx diff --git a/svtools/inc/svimpbox.hxx b/svtools/source/inc/svimpbox.hxx similarity index 100% rename from svtools/inc/svimpbox.hxx rename to svtools/source/inc/svimpbox.hxx diff --git a/svtools/inc/svimpicn.hxx b/svtools/source/inc/svimpicn.hxx similarity index 100% rename from svtools/inc/svimpicn.hxx rename to svtools/source/inc/svimpicn.hxx diff --git a/svtools/inc/xbmread.hxx b/svtools/source/inc/xbmread.hxx similarity index 100% rename from svtools/inc/xbmread.hxx rename to svtools/source/inc/xbmread.hxx diff --git a/svtools/inc/xpmread.hxx b/svtools/source/inc/xpmread.hxx similarity index 100% rename from svtools/inc/xpmread.hxx rename to svtools/source/inc/xpmread.hxx diff --git a/svtools/source/items1/bintitem.cxx b/svtools/source/items1/bintitem.cxx deleted file mode 100644 index a3b6c1c2b54d..000000000000 --- a/svtools/source/items1/bintitem.cxx +++ /dev/null @@ -1,169 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: bintitem.cxx,v $ - * $Revision: 1.8 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include -#include -#include -#include - -// STATIC DATA - -DBG_NAME(SfxBigIntItem) - -// RTTI -TYPEINIT1_AUTOFACTORY(SfxBigIntItem, SfxPoolItem); - -// SfxBigIntItem - -//============================================================================ -SfxBigIntItem::SfxBigIntItem() - : SfxPoolItem(0), - aVal(0) -{ - DBG_CTOR(SfxBigIntItem, 0); -} - -//============================================================================ -SfxBigIntItem::SfxBigIntItem(USHORT which, const BigInt& rValue) - : SfxPoolItem(which), - aVal(rValue) -{ - DBG_CTOR(SfxBigIntItem, 0); -} - -//============================================================================ -SfxBigIntItem::SfxBigIntItem(USHORT which, SvStream &rStream) - : SfxPoolItem(which) -{ - DBG_CTOR(SfxBigIntItem, 0); - ByteString sTmp; - rStream.ReadByteString(sTmp); - BigInt aTmp(sTmp); - aVal = aTmp; -} - -//============================================================================ -SfxBigIntItem::SfxBigIntItem(const SfxBigIntItem& rItem) - : SfxPoolItem(rItem), - aVal(rItem.aVal) -{ - DBG_CTOR(SfxBigIntItem, 0); -} - -//============================================================================ -SfxItemPresentation SfxBigIntItem::GetPresentation( - SfxItemPresentation /*ePresentation*/, - SfxMapUnit /*eCoreMetric*/, - SfxMapUnit /*ePresentationMetric*/, - XubString& rText, - const IntlWrapper * ) const -{ - DBG_CHKTHIS(SfxBigIntItem, 0); - rText = aVal.GetString(); - return SFX_ITEM_PRESENTATION_NAMELESS; -} - -//============================================================================ -int SfxBigIntItem::operator==(const SfxPoolItem& rItem) const -{ - DBG_CHKTHIS(SfxBigIntItem, 0); - DBG_ASSERT(SfxPoolItem::operator==(rItem), "unequal type"); - return ((SfxBigIntItem&)rItem).aVal == aVal; -} - -//============================================================================ -int SfxBigIntItem::Compare(const SfxPoolItem& rItem) const -{ - DBG_CHKTHIS(SfxBigIntItem, 0); - DBG_ASSERT(SfxPoolItem::operator==(rItem), "unequal type"); - - if (((const SfxBigIntItem&)rItem ).aVal < aVal ) - return -1; - else if (((const SfxBigIntItem&)rItem ).aVal == aVal) - return 0; - else - return 1; -} - -//============================================================================ -SfxPoolItem* SfxBigIntItem::Clone(SfxItemPool *) const -{ - DBG_CHKTHIS(SfxBigIntItem, 0); - return new SfxBigIntItem(*this); -} - -//============================================================================ -SfxPoolItem* SfxBigIntItem::Create(SvStream &rStream, USHORT) const -{ - DBG_CHKTHIS(SfxBigIntItem, 0); - return new SfxBigIntItem(Which(), rStream); -} - -//============================================================================ -SvStream& SfxBigIntItem::Store(SvStream &rStream, USHORT ) const -{ - DBG_CHKTHIS(SfxBigIntItem, 0); - rStream.WriteByteString( aVal.GetByteString() ); - return rStream; -} - -//============================================================================ -SfxFieldUnit SfxBigIntItem::GetUnit() const -{ - DBG_CHKTHIS(SfxBigIntItem, 0); - return SFX_FUNIT_NONE; -} - -//============================================================================ -// virtual -BOOL SfxBigIntItem::PutValue( const com::sun::star::uno::Any& rVal, BYTE ) -{ - double aValue = 0.0; - if ( rVal >>= aValue ) - { - SetValue( aValue ); - return TRUE; - } - - DBG_ERROR( "SfxBigIntItem::PutValue - Wrong type!" ); - return FALSE; -} - -//============================================================================ -// virtual -BOOL SfxBigIntItem::QueryValue( com::sun::star::uno::Any& rVal, BYTE ) const -{ - double aValue = GetValue(); - rVal <<= aValue; - return TRUE; -} - diff --git a/svtools/source/items1/cstitem.cxx b/svtools/source/items1/cstitem.cxx deleted file mode 100644 index 9755f4bb9944..000000000000 --- a/svtools/source/items1/cstitem.cxx +++ /dev/null @@ -1,252 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: cstitem.cxx,v $ - * $Revision: 1.9 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include - -#include - -#include -#include -#include - -#include -#include - -#include -#include - -DBG_NAME( SfxCrawlStatusItem ) -TYPEINIT1( SfxCrawlStatusItem, SfxPoolItem ); - -// ----------------------------------------------------------------------- - -SfxCrawlStatusItem::SfxCrawlStatusItem( USHORT which ) : - SfxPoolItem( which ) -{ - DBG_CTOR( SfxCrawlStatusItem, 0 ); -} - -// ----------------------------------------------------------------------- - -SfxCrawlStatusItem::SfxCrawlStatusItem( USHORT which, CrawlStatus eStat ) : - SfxPoolItem( which ), - eStatus( eStat ) -{ - DBG_CTOR( SfxCrawlStatusItem, 0 ); -} - -// ----------------------------------------------------------------------- - -SfxCrawlStatusItem::SfxCrawlStatusItem( const SfxCrawlStatusItem& rItem ) : - SfxPoolItem( rItem ), - eStatus( rItem.eStatus ) -{ - DBG_CTOR( SfxCrawlStatusItem, 0 ); -} - -// ----------------------------------------------------------------------- - -int SfxCrawlStatusItem::operator==( const SfxPoolItem& rItem ) const -{ - DBG_CHKTHIS( SfxCrawlStatusItem, 0 ); - DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal type" ); - - return ((SfxCrawlStatusItem&)rItem).eStatus == eStatus; -} - -// ----------------------------------------------------------------------- - -int SfxCrawlStatusItem::Compare( const SfxPoolItem& rItem ) const -{ - DBG_CHKTHIS( SfxCrawlStatusItem, 0 ); - DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal type" ); - - if( ((const SfxCrawlStatusItem&)rItem).eStatus < eStatus ) - return -1; - else if( ((const SfxCrawlStatusItem&)rItem).eStatus == eStatus ) - return 0; - else - return 1; -} - -// ----------------------------------------------------------------------- - -SfxPoolItem* SfxCrawlStatusItem::Create( SvStream& rStream, USHORT ) const -{ - DBG_CHKTHIS(SfxCrawlStatusItem, 0); - - USHORT _eStatus; - rStream >> _eStatus; - - return new SfxCrawlStatusItem( Which(), (CrawlStatus)_eStatus ); -} - -// ----------------------------------------------------------------------- - -SvStream& SfxCrawlStatusItem::Store( SvStream& rStream, USHORT ) const -{ - DBG_CHKTHIS( SfxCrawlStatusItem, 0 ); - - USHORT nStatus = (USHORT)eStatus; - rStream << (USHORT) nStatus; - - return rStream; -} - -// ----------------------------------------------------------------------- - -SfxPoolItem* SfxCrawlStatusItem::Clone( SfxItemPool* ) const -{ - DBG_CHKTHIS( SfxCrawlStatusItem, 0 ); - return new SfxCrawlStatusItem( *this ); -} -// ----------------------------------------------------------------------- - -SfxItemPresentation SfxCrawlStatusItem::GetPresentation -( - SfxItemPresentation /*ePresentation*/, - SfxMapUnit /*eCoreMetric*/, - SfxMapUnit /*ePresentationMetric*/, - XubString& rText, - const IntlWrapper * pIntlWrapper -) const -{ - DBG_CHKTHIS(SfxCrawlStatusItem, 0); - DBG_ASSERT(pIntlWrapper, - "SfxCrawlStatusItem::GetPresentation():" - " Using default IntlWrapper"); - - ::com::sun::star::lang::Locale aLocale; - - switch (eStatus) - { - case CSTAT_NEVER_UPD: - rText = String(SvtResId(STR_CSTAT_NEVER_UPD, - pIntlWrapper ? - pIntlWrapper->getLocale() : - aLocale)); - break; - - case CSTAT_IN_UPD: - rText = String(SvtResId(STR_CSTAT_IN_UPD, - pIntlWrapper ? - pIntlWrapper->getLocale() : - aLocale)); - break; - - case CSTAT_UPD_NEWER: - rText = String(SvtResId(STR_CSTAT_UPD_NEWER, - pIntlWrapper ? - pIntlWrapper->getLocale() : - aLocale)); - break; - - case CSTAT_UPD_NOT_NEWER: - rText = String(SvtResId(STR_CSTAT_UPD_NOT_NEWER, - pIntlWrapper ? - pIntlWrapper->getLocale() : - aLocale)); - break; - - case CSTAT_UPD_CANCEL: - rText = String(SvtResId(STR_CSTAT_UPD_CANCEL, - pIntlWrapper ? - pIntlWrapper->getLocale() : - aLocale)); - break; - - case CSTAT_ERR_GENERAL: - rText = String(SvtResId(STR_CSTAT_ERR_GENERAL, - pIntlWrapper ? - pIntlWrapper->getLocale() : - aLocale)); - break; - - case CSTAT_ERR_NOTEXISTS: - rText = String(SvtResId(STR_CSTAT_ERR_NOTEXISTS, - pIntlWrapper ? - pIntlWrapper->getLocale() : - aLocale)); - break; - - case CSTAT_ERR_NOTREACHED: - rText = String(SvtResId(STR_CSTAT_ERR_NOTREACHED, - pIntlWrapper ? - pIntlWrapper->getLocale() : - aLocale)); - break; - - case CSTAT_UPD_IMMEDIATELY: - rText = String(SvtResId(STR_CSTAT_UPD_IMMEDIATELY, - pIntlWrapper ? - pIntlWrapper->getLocale() : - aLocale)); - break; - - case CSTAT_ERR_OFFLINE: - rText = String(SvtResId(STR_CSTAT_ERR_OFFLINE, - pIntlWrapper ? - pIntlWrapper->getLocale() : - aLocale)); - break; - - default: - rText.Erase(); - break; - } - return SFX_ITEM_PRESENTATION_NAMELESS; -} - -//---------------------------------------------------------------------------- -// virtual -BOOL SfxCrawlStatusItem::PutValue( const com::sun::star::uno::Any& rVal,BYTE ) -{ - sal_Int16 aValue = sal_Int16(); - if ( rVal >>= aValue ) - { - SetStatus( static_cast< CrawlStatus >( aValue ) ); - return TRUE; - } - - DBG_ERROR( "SfxCrawlStatusItem::PutValue - Wrong type!" ); - return FALSE; -} - -//---------------------------------------------------------------------------- -// virtual -BOOL SfxCrawlStatusItem::QueryValue( com::sun::star::uno::Any& rVal,BYTE ) const -{ - sal_Int16 aValue = sal::static_int_cast< sal_Int16 >(GetStatus()); - rVal <<= aValue; - return TRUE; -} - diff --git a/svtools/source/items1/cstitem.src b/svtools/source/items1/cstitem.src deleted file mode 100644 index 8d6e2d0280c0..000000000000 --- a/svtools/source/items1/cstitem.src +++ /dev/null @@ -1,112 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: cstitem.src,v $ - * $Revision: 1.7 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#include -String STR_CSTAT_NEVER_UPD -{ - Text [ en-US ] = "No update has occurred" ; -}; -String STR_CSTAT_IN_UPD -{ - Text [ en-US ] = "Updating in progress" ; -}; -String STR_CSTAT_UPD_NEWER -{ - Text [ en-US ] = "Changes discovered" ; -}; -String STR_CSTAT_UPD_NOT_NEWER -{ - Text [ en-US ] = "No changes discovered" ; -}; -String STR_CSTAT_UPD_CANCEL -{ - Text [ en-US ] = "Canceled by user" ; -}; -String STR_CSTAT_UPD_IMMEDIATELY -{ - Text [ en-US ] = "Updating immediately" ; -}; -String STR_CSTAT_ERR_OFFLINE -{ - Text [ en-US ] = "failed, you have not been online" ; -}; -String STR_CSTAT_ERR_GENERAL -{ - Text [ en-US ] = "General error" ; -}; -String STR_CSTAT_ERR_NOTEXISTS -{ - Text [ en-US ] = "Server does not exist" ; -}; -String STR_CSTAT_ERR_NOTREACHED -{ - Text [ en-US ] = "Server not available" ; -}; -String STR_COLUM_DT_AUTO -{ - Text [ en-US ] = "automatic" ; -}; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/svtools/source/items1/dtritem.cxx b/svtools/source/items1/dtritem.cxx deleted file mode 100644 index fa3a36b762f5..000000000000 --- a/svtools/source/items1/dtritem.cxx +++ /dev/null @@ -1,244 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: dtritem.cxx,v $ - * $Revision: 1.8 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include - -#include - - -DBG_NAME( SfxDateTimeRangeItem ) -TYPEINIT1( SfxDateTimeRangeItem, SfxPoolItem ); - -// ----------------------------------------------------------------------- - -SfxDateTimeRangeItem::SfxDateTimeRangeItem( USHORT which ) : - SfxPoolItem( which ) -{ - DBG_CTOR( SfxDateTimeRangeItem, 0 ); -} - -// ----------------------------------------------------------------------- - -SfxDateTimeRangeItem::SfxDateTimeRangeItem( USHORT which, const DateTime& rStartDT, - const DateTime& rEndDT ) : - SfxPoolItem( which ), - aStartDateTime( rStartDT ), - aEndDateTime( rEndDT ) -{ - DBG_CTOR( SfxDateTimeRangeItem, 0 ); -} - -// ----------------------------------------------------------------------- - -SfxDateTimeRangeItem::SfxDateTimeRangeItem( const SfxDateTimeRangeItem& rItem ) : - SfxPoolItem( rItem ), - aStartDateTime( rItem.aStartDateTime ), - aEndDateTime( rItem.aEndDateTime ) -{ - DBG_CTOR( SfxDateTimeRangeItem, 0 ); -} - -// ----------------------------------------------------------------------- - -int SfxDateTimeRangeItem::operator==( const SfxPoolItem& rItem ) const -{ - DBG_CHKTHIS( SfxDateTimeRangeItem, 0 ); - DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal type" ); - - return ((SfxDateTimeRangeItem&)rItem ).aStartDateTime == aStartDateTime && - ((SfxDateTimeRangeItem&)rItem ).aEndDateTime == aEndDateTime; -} - -// ----------------------------------------------------------------------- - -int SfxDateTimeRangeItem::Compare( const SfxPoolItem& rItem ) const -{ - DBG_CHKTHIS( SfxDateTimeRangeItem, 0 ); - DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal type" ); - - double fThisRange = aEndDateTime - aStartDateTime; - double fRange = ((const SfxDateTimeRangeItem&)rItem).aEndDateTime - - ((const SfxDateTimeRangeItem&)rItem).aStartDateTime; - - if ( ::rtl::math::approxEqual( fRange, fThisRange ) ) - return 0; - else if ( fRange < fThisRange ) - return -1; - else - return 1; -} - -// ----------------------------------------------------------------------- - -SfxPoolItem* SfxDateTimeRangeItem::Create( SvStream& rStream, USHORT ) const -{ - DBG_CHKTHIS(SfxDateTimeRangeItem, 0); - - sal_uInt32 nStartDate, nEndDate; - sal_Int32 nStartTime, nEndTime; - - rStream >> nStartDate; - rStream >> nStartTime; - - rStream >> nEndDate; - rStream >> nEndTime; - - DateTime aStartDT, aEndDT; - - aStartDT.SetDate( nStartDate ); - aStartDT.SetTime( nStartTime ); - - aEndDT.SetDate( nEndDate ); - aEndDT.SetTime( nEndTime ); - - return new SfxDateTimeRangeItem( Which(), aStartDT, aEndDT ); -} - -// ----------------------------------------------------------------------- - -SvStream& SfxDateTimeRangeItem::Store( SvStream& rStream, USHORT ) const -{ - DBG_CHKTHIS( SfxDateTimeRangeItem, 0 ); - - rStream << aStartDateTime.GetDate(); - rStream << aStartDateTime.GetTime(); - - rStream << aEndDateTime.GetDate(); - rStream << aEndDateTime.GetTime(); - - return rStream; -} - -// ----------------------------------------------------------------------- - -SfxPoolItem* SfxDateTimeRangeItem::Clone( SfxItemPool* ) const -{ - DBG_CHKTHIS( SfxDateTimeRangeItem, 0 ); - - return new SfxDateTimeRangeItem( *this ); -} -// ----------------------------------------------------------------------- - -SfxItemPresentation SfxDateTimeRangeItem::GetPresentation -( - SfxItemPresentation /*ePresentation*/, - SfxMapUnit /*eCoreMetric*/, - SfxMapUnit /*ePresentationMetric*/, - XubString& rText, - const IntlWrapper * pIntlWrapper -) const -{ - DBG_CHKTHIS(SfxDateTimeRangeItem, 0); - DateTime aRange(aEndDateTime - (const Time&)aStartDateTime); - if (pIntlWrapper) - { - rText = pIntlWrapper->getLocaleData()->getDate(aRange); - rText.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ")); - rText += pIntlWrapper->getLocaleData()->getTime(aRange); - } - else - { - DBG_WARNING("SfxDateTimeRangeItem::GetPresentation():" - " Using default en_US IntlWrapper"); - const IntlWrapper aIntlWrapper( - ::comphelper::getProcessServiceFactory(), LANGUAGE_ENGLISH_US ); - rText = aIntlWrapper.getLocaleData()->getDate(aRange); - rText.AppendAscii(RTL_CONSTASCII_STRINGPARAM(", ")); - rText += aIntlWrapper.getLocaleData()->getTime(aRange); - } - return SFX_ITEM_PRESENTATION_NAMELESS; -} - -//---------------------------------------------------------------------------- -// virtual -BOOL SfxDateTimeRangeItem::PutValue( const com::sun::star::uno::Any& rVal,BYTE ) -{ - com::sun::star::util::DateTimeRange aValue; - if ( rVal >>= aValue ) - { - aStartDateTime = DateTime( Date( aValue.StartDay, - aValue.StartMonth, - aValue.StartYear ), - Time( aValue.StartHours, - aValue.StartMinutes, - aValue.StartSeconds, - aValue.StartHundredthSeconds ) ); - aEndDateTime = DateTime( Date( aValue.EndDay, - aValue.EndMonth, - aValue.EndYear ), - Time( aValue.EndHours, - aValue.EndMinutes, - aValue.EndSeconds, - aValue.EndHundredthSeconds ) ); - return TRUE; - } - - DBG_ERROR( "SfxDateTimeRangeItem::PutValue - Wrong type!" ); - return FALSE; -} - -//---------------------------------------------------------------------------- -// virtual -BOOL SfxDateTimeRangeItem::QueryValue( com::sun::star::uno::Any& rVal, - BYTE nMemberId ) const -{ - nMemberId &= ~CONVERT_TWIPS; - com::sun::star::util::DateTimeRange aValue( aStartDateTime.Get100Sec(), - aStartDateTime.GetSec(), - aStartDateTime.GetMin(), - aStartDateTime.GetHour(), - aStartDateTime.GetDay(), - aStartDateTime.GetMonth(), - aStartDateTime.GetYear(), - aEndDateTime.Get100Sec(), - aEndDateTime.GetSec(), - aEndDateTime.GetMin(), - aEndDateTime.GetHour(), - aEndDateTime.GetDay(), - aEndDateTime.GetMonth(), - aEndDateTime.GetYear() ); - rVal <<= aValue; - return TRUE; -} - - diff --git a/svtools/source/items1/frqitem.cxx b/svtools/source/items1/frqitem.cxx deleted file mode 100644 index 4068ef8f97f1..000000000000 --- a/svtools/source/items1/frqitem.cxx +++ /dev/null @@ -1,580 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: frqitem.cxx,v $ - * $Revision: 1.8.136.1 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#ifndef GCC -#endif - -#include - -#include -#include -#include - -#include - -DBG_NAME( SfxFrequencyItem ) - -TYPEINIT1( SfxFrequencyItem, SfxPoolItem ); - -#define MAX_GOTO 32000 - -#define DECL_SAVE_GOTO() \ - ULONG nSafetyMeasures = 0; - -#define SAVE_GOTO(tag) \ - if(nSafetyMeasures < MAX_GOTO) \ - { nSafetyMeasures++; goto tag; } - -// ----------------------------------------------------------------------- - -SfxFrequencyItem::SfxFrequencyItem( USHORT which ) : - SfxPoolItem ( which ), - eFrqMode ( FRQ_DAILY ), - eFrqTimeMode ( FRQ_TIME_AT ), - nDInterval1 ( 1 ), - nDInterval2 ( 0 ), - nDInterval3 ( 0 ), - nTInterval1 ( 1 ), - aTime1 ( Time( 12, 0, 0 ) ), - aTime2 ( Time( 12, 0, 0 ) ), - bMissingDate ( FALSE ), - aMissingDate ( DateTime(0, 0) ) -{ - DBG_CTOR( SfxFrequencyItem, 0 ); -} - -// ----------------------------------------------------------------------- - -SfxFrequencyItem::SfxFrequencyItem( USHORT which, FrequencyMode eMode, FrequencyTimeMode eTMode, - USHORT nDI1, USHORT nDI2, USHORT nDI3, USHORT nTI1, - const Time& rT1, const Time& rT2 ) : - SfxPoolItem ( which ), - eFrqMode ( eMode ), - eFrqTimeMode ( eTMode ), - nDInterval1 ( nDI1 ), - nDInterval2 ( nDI2 ), - nDInterval3 ( nDI3 ), - nTInterval1 ( nTI1 ), - aTime1 ( rT1 ), - aTime2 ( rT2 ), - bMissingDate ( FALSE ) -{ - DBG_CTOR( SfxFrequencyItem, 0 ); -} - -// ----------------------------------------------------------------------- - -SfxFrequencyItem::SfxFrequencyItem( const SfxFrequencyItem& rItem ) : - SfxPoolItem ( rItem ), - eFrqMode ( rItem.eFrqMode ), - eFrqTimeMode ( rItem.eFrqTimeMode ), - nDInterval1 ( rItem.nDInterval1 ), - nDInterval2 ( rItem.nDInterval2 ), - nDInterval3 ( rItem.nDInterval3 ), - nTInterval1 ( rItem.nTInterval1 ), - aTime1 ( rItem.aTime1 ), - aTime2 ( rItem.aTime2 ), - bMissingDate ( rItem.bMissingDate ) -{ - DBG_CTOR( SfxFrequencyItem, 0 ); -} - -// ----------------------------------------------------------------------- - -int SfxFrequencyItem::operator==( const SfxPoolItem& rItem ) const -{ - DBG_CHKTHIS( SfxFrequencyItem, 0 ); - DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal type" ); - - return ((SfxFrequencyItem&)rItem ).eFrqMode == eFrqMode && - ((SfxFrequencyItem&)rItem ).eFrqTimeMode == eFrqTimeMode && - ((SfxFrequencyItem&)rItem ).nDInterval1 == nDInterval1 && - ((SfxFrequencyItem&)rItem ).nDInterval2 == nDInterval2 && - ((SfxFrequencyItem&)rItem ).nDInterval3 == nDInterval3 && - ((SfxFrequencyItem&)rItem ).nTInterval1 == nTInterval1 && - ((SfxFrequencyItem&)rItem ).aTime1 == aTime1 && - ((SfxFrequencyItem&)rItem ).aTime2 == aTime2; -} - -// ----------------------------------------------------------------------- - -int SfxFrequencyItem::Compare( const SfxPoolItem& -#ifdef DBG_UTIL -rItem -#endif -) const -{ - DBG_CHKTHIS( SfxFrequencyItem, 0 ); - DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal type" ); - -/* DateTime aThisRange( aEndDateTime - aStartDateTime ); - DateTime aRange(((const SfxFrequencyItem&)rItem).aEndDateTime - - ((const SfxFrequencyItem&)rItem).aStartDateTime ); - if( aRange < aThisRange ) - return -1; - else if( aRange == aThisRange ) - return 0; - else -*/ - return 1; -} - -// ----------------------------------------------------------------------- - -SfxPoolItem* SfxFrequencyItem::Create( SvStream& rStream, USHORT ) const -{ - DBG_CHKTHIS(SfxFrequencyItem, 0); - - USHORT _eFrqMode; - USHORT _eFrqTimeMode; - USHORT _nDInterval1; - USHORT _nDInterval2; - USHORT _nDInterval3; - USHORT _nTInterval1; - long _nTime1; - long _nTime2; - - rStream >> _eFrqMode; - rStream >> _eFrqTimeMode; - rStream >> _nDInterval1; - rStream >> _nDInterval2; - rStream >> _nDInterval3; - rStream >> _nTInterval1; - rStream >> _nTime1; - rStream >> _nTime2; - - return new SfxFrequencyItem( Which(), (FrequencyMode)_eFrqMode, - (FrequencyTimeMode) _eFrqTimeMode, _nDInterval1, _nDInterval2, _nDInterval3, - _nTInterval1, Time(_nTime1), Time(_nTime2) ); -} - -// ----------------------------------------------------------------------- - -SvStream& SfxFrequencyItem::Store( SvStream& rStream, USHORT ) const -{ - DBG_CHKTHIS( SfxFrequencyItem, 0 ); - - USHORT nEMode = (USHORT)eFrqMode; - USHORT nETimeMode = (USHORT)eFrqTimeMode; - - rStream << (USHORT) nEMode; - rStream << (USHORT) nETimeMode; - - rStream << nDInterval1; - rStream << nDInterval2; - rStream << nDInterval3; - - rStream << nTInterval1; - rStream << aTime1.GetTime(); - rStream << aTime2.GetTime(); - - return rStream; -} - -// ----------------------------------------------------------------------- - -SfxPoolItem* SfxFrequencyItem::Clone( SfxItemPool* ) const -{ - DBG_CHKTHIS( SfxFrequencyItem, 0 ); - return new SfxFrequencyItem( *this ); -} - -// ----------------------------------------------------------------------- - -SfxItemPresentation SfxFrequencyItem::GetPresentation -( - SfxItemPresentation /*ePresentation*/, - SfxMapUnit /*eCoreMetric*/, - SfxMapUnit /*ePresentationMetric*/, - XubString& rText, - const IntlWrapper * -) const -{ - DBG_CHKTHIS(SfxFrequencyItem, 0); - rText.AssignAscii(RTL_CONSTASCII_STRINGPARAM("SNIY")); - return SFX_ITEM_PRESENTATION_NAMELESS; -} - -// ----------------------------------------------------------------------- - -Time SfxFrequencyItem::_CalcTime( BOOL bForToday ) const -{ - Time aNow; - Time aTime; - - DECL_SAVE_GOTO(); - - switch( eFrqTimeMode ) - { - ////////////////////////////////////////////////////////// - // FRQ_TIME_AT - // - // Update um Uhrzeit - // nTime1 = 00:00:00 - 24:00:00 - // - case FRQ_TIME_AT : - aTime = aTime1; - break; - - ////////////////////////////////////////////////////////// - // FRQ_TIME_REPEAT - // - // Wiederhole alle X Stunden - // nTInterval1 = 1 .. 8 - // - case FRQ_TIME_REPEAT : - aTime = Time( 0, 0 ); - if( bForToday ) - { - - RECALC_TIME_REPEAT: - if( aNow > aTime ) - { - aTime += Time( nTInterval1, 0 ); - SAVE_GOTO( RECALC_TIME_REPEAT ); - } - break; - } - break; - - ////////////////////////////////////////////////////////// - // FRQ_TIME_REPEAT_RANGE - // - // FRQ_TIME_REPEAT zwischen Uhrzeit 1 und 2 - // nTime1 = 00:00:00 - 24:00:00 - // nTime2 = 00:00:00 - 24:00:00 - // - case FRQ_TIME_REPEAT_RANGE : - aTime = aTime1; - if( bForToday ) - { - if( aNow > aTime2 ) - return aTime1; - - RECALC_TIME_REPEAT_RANGE: - if( aNow > aTime ) - { - aTime += Time( nTInterval1, 0 ); - if( aTime > aTime2 ) - return aTime1; - SAVE_GOTO( RECALC_TIME_REPEAT_RANGE ); - } - break; - } - break; - } - return aTime; -} - -DateTime SfxFrequencyItem::CalcNextTick( const DateTime& rBase, BOOL bFirst ) -{ - Date aDateToday; - Time aTimeToday; - Date aDateBase; - Time aTimeBase; - - if( bFirst ) - { - aDateBase = Date( 17, 2, 1969 ); - aTimeBase = Time( 8, 0, 0 ); - } - else - { - aDateBase = rBase.GetDate(); - aTimeBase = rBase.GetTime(); - } - - Time aNextTime( _CalcTime(FALSE) ); - Date aNextDate( aDateBase ); - bMissingDate = FALSE; - - DECL_SAVE_GOTO(); - - switch( eFrqMode ) - { - ////////////////////////////////////////////////////////// - // FRQ_DAILY - // - // jeden X'ten Tag - // nInterval1 = 1 .. 999 - // - // jeden Wochentag - // nInterval1 = USHRT_MAX - // - case FRQ_DAILY : - { - if( bFirst ) - { - aNextTime = _CalcTime( TRUE ); - if( aNextTime < aTimeToday ) - { - aNextTime = _CalcTime( FALSE ); - aNextDate = aDateToday + (USHORT) - ((nDInterval1 == USHRT_MAX)? 1 : nDInterval1); - } - else - aNextDate = aDateToday; - break; - } - - RECALC_FRQ_DAILY: - if( aNextDate < aDateToday ) - { - bMissingDate = TRUE; - aMissingDate.SetDate(aNextDate.GetDate()); - aMissingDate.SetTime(_CalcTime(FALSE).GetTime()); - - aNextDate += (USHORT)((nDInterval1 == USHRT_MAX)? 1 : nDInterval1); - SAVE_GOTO( RECALC_FRQ_DAILY ); - } - - if( aNextDate == aDateToday ) - { - aNextTime = _CalcTime( TRUE ); - if( aNextTime < aTimeToday ) - { - bMissingDate = TRUE; - aMissingDate.SetDate(aNextDate.GetDate()); - aMissingDate.SetTime(_CalcTime(FALSE).GetTime()); - - aNextDate += (USHORT)((nDInterval1 == USHRT_MAX)? 1 : nDInterval1); - aNextTime = _CalcTime( FALSE ); - } - } - else - aNextTime = _CalcTime( FALSE ); - } break; - - ////////////////////////////////////////////////////////// - // FRQ_WEEKLY - // wiederhole jede X'te Woche - // nInterval1 = 1 .. 99 - // - // an SU, MO, TU, WE, TH, FR, SA - // nInterval2 = WD_SUNDAY | WD_MONDAY | WD_TUESDAY | - // WD_WEDNESDAY | WD_THURSDAY | WD_FRIDAY | - // WD_SATURDAY - // - case FRQ_WEEKLY : - { - BOOL bInRecalc = FALSE; - - RECALC_FRQ_WEEKLY: - if( !bFirst || bInRecalc ) - aNextDate += (nDInterval1 - 1) * 7; - - aNextDate -= (USHORT) ((aNextDate.GetDayOfWeek() != SUNDAY) ? - aNextDate.GetDayOfWeek() + 1 : 0); - - if( nDInterval2 & WD_SUNDAY && (aNextDate >= aDateToday) ) - aNextDate += 0; - else if( nDInterval2 & WD_MONDAY && (aNextDate + 1 >= aDateToday) ) - aNextDate += 1; - else if( nDInterval2 & WD_TUESDAY && (aNextDate + 2 >= aDateToday) ) - aNextDate += 2; - else if( nDInterval2 & WD_WEDNESDAY && (aNextDate + 3 >= aDateToday) ) - aNextDate += 3; - else if( nDInterval2 & WD_THURSDAY && (aNextDate + 4 >= aDateToday) ) - aNextDate += 4; - else if( nDInterval2 & WD_FRIDAY && (aNextDate + 5 >= aDateToday) ) - aNextDate += 5; - else if( nDInterval2 & WD_SATURDAY && (aNextDate + 6 >= aDateToday) ) - aNextDate += 6; - - if( aNextDate < aDateToday ) - { - bMissingDate = TRUE; - aMissingDate.SetDate(aNextDate.GetDate()); - aMissingDate.SetTime(_CalcTime(FALSE).GetTime()); - - bInRecalc = TRUE; - aNextDate += 7; - SAVE_GOTO( RECALC_FRQ_WEEKLY ); - } - if( aNextDate == aDateToday ) - { - aNextTime = _CalcTime( TRUE ); - if( aNextTime < aTimeToday ) - { - bInRecalc = TRUE; - aNextDate += 7; - SAVE_GOTO( RECALC_FRQ_WEEKLY ); - } - } - else - aNextTime = _CalcTime( FALSE ); - } break; - - ////////////////////////////////////////////////////////// - // FRQ_MONTHLY_DAILY - // - // jeden X'ten Tag von jedem X'ten Monat - // nInterval1 = 1 .. 31 - // nInterval2 = 1 .. 6 - // - case FRQ_MONTHLY_DAILY : - { - BOOL bInRecalc = FALSE; - aNextDate.SetDay( nDInterval1 ); - - RECALC_FRQ_MONTHLY_DAILY: - if( nDInterval2 > 1 || bInRecalc ) - { - long nMonth = aNextDate.GetMonth() - 1; - nMonth += nDInterval2; - aNextDate.SetYear( - sal::static_int_cast< USHORT >( - aNextDate.GetYear() + nMonth / 12 ) ); - aNextDate.SetMonth( - sal::static_int_cast< USHORT >( ( nMonth % 12 ) + 1 ) ); - } - - if( aNextDate < aDateToday ) - { - bMissingDate = TRUE; - aMissingDate.SetDate(aNextDate.GetDate()); - aMissingDate.SetTime(_CalcTime(FALSE).GetTime()); - - bInRecalc = TRUE; - SAVE_GOTO( RECALC_FRQ_MONTHLY_DAILY ); - } - - if( aNextDate == aDateToday ) - { - aNextTime = _CalcTime( TRUE ); - if( aNextTime < aTimeToday ) - { - bMissingDate = TRUE; - aMissingDate.SetDate(aNextDate.GetDate()); - aMissingDate.SetTime(_CalcTime(FALSE).GetTime()); - - bInRecalc = TRUE; - SAVE_GOTO( RECALC_FRQ_MONTHLY_DAILY ); - } - } - else - aNextTime = _CalcTime( FALSE ); - } break; - - ////////////////////////////////////////////////////////// - // FRQ_MONTHLY_LOGIC - // - // jeden ersten, zweiten, dritten, vierten oder letzten - // Wochentag jeden X'ten Monats - // nInterval1 = 0 .. 4 - // nInterval2 = WD_SUNDAY | WD_MONDAY | WD_TUESDAY | - // WD_WEDNESDAY | WD_THURSDAY | WD_FRIDAY | - // WD_SATURDAY - // nInterval3 = 1 .. 6 - // - case FRQ_MONTHLY_LOGIC : - { - BOOL bInRecalc = FALSE; - - RECALC_FRQ_MONTHLY_LOGIC: - if( nDInterval3 > 1 || bInRecalc ) - { - long nMonth = aNextDate.GetMonth() - 1; - nMonth += nDInterval3; - aNextDate.SetYear( - sal::static_int_cast< USHORT >( - aNextDate.GetYear() + nMonth / 12 ) ); - aNextDate.SetMonth( - sal::static_int_cast< USHORT >( ( nMonth % 12 ) + 1 ) ); - } - - USHORT nDay; - if( nDInterval2 & WD_SUNDAY ) - nDay = 6; - else if( nDInterval2 & WD_MONDAY ) - nDay = 0; - else if( nDInterval2 & WD_TUESDAY ) - nDay = 1; - else if( nDInterval2 & WD_WEDNESDAY ) - nDay = 2; - else if( nDInterval2 & WD_THURSDAY ) - nDay = 3; - else if( nDInterval2 & WD_FRIDAY ) - nDay = 4; - else nDay = 5; - - if( nDInterval1 == 4 ) - { - DateTime aDT = aNextDate; - aDT.SetDay( 1 ); - aDT += (long)(aNextDate.GetDaysInMonth() - 1); - if( aDT.GetDayOfWeek() != nDay ) - for( aDT--; aDT.GetDayOfWeek() != nDay; aDT-- ) ; - aNextDate = aDT; - } - else - { - DateTime aDT = aNextDate; - aDT.SetDay( 1 ); - aDT += (long)(nDay - USHORT(aDT.GetDayOfWeek())); - if( aDT.GetMonth() != aNextDate.GetMonth() ) - aDT += 7L; - aDT += (long)(nDInterval1 * 7); - aNextDate = aDT; - } - - if( aNextDate < aDateToday ) - { - bMissingDate = TRUE; - aMissingDate.SetDate(aNextDate.GetDate()); - aMissingDate.SetTime(_CalcTime(FALSE).GetTime()); - - bInRecalc = TRUE; - SAVE_GOTO( RECALC_FRQ_MONTHLY_LOGIC ); - } - - if( aNextDate == aDateToday ) - { - aNextTime = _CalcTime( TRUE ); - if( aNextTime < aTimeToday ) - { - bMissingDate = TRUE; - aMissingDate.SetDate(aNextDate.GetDate()); - aMissingDate.SetTime(_CalcTime(FALSE).GetTime()); - - bInRecalc = TRUE; - SAVE_GOTO( RECALC_FRQ_MONTHLY_LOGIC ); - } - } - else - aNextTime = _CalcTime( FALSE ); - } break; - } - - return DateTime( aNextDate, aNextTime ); -} - diff --git a/svtools/source/items1/tfrmitem.cxx b/svtools/source/items1/tfrmitem.cxx deleted file mode 100644 index a7019ff69947..000000000000 --- a/svtools/source/items1/tfrmitem.cxx +++ /dev/null @@ -1,184 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: tfrmitem.cxx,v $ - * $Revision: 1.8 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include - -#include -#include -#include - -#include - -DBG_NAME( SfxTargetFrameItem ) -TYPEINIT1( SfxTargetFrameItem, SfxPoolItem ); - -// ----------------------------------------------------------------------- - -SfxTargetFrameItem::SfxTargetFrameItem( USHORT which ) : - SfxPoolItem( which ) -{ - DBG_CTOR( SfxTargetFrameItem, 0 ); -} - -// ----------------------------------------------------------------------- - -SfxTargetFrameItem::SfxTargetFrameItem( const SfxTargetFrameItem& rItem ) : - SfxPoolItem( rItem ) -{ - DBG_CTOR( SfxTargetFrameItem, 0 ); - for( USHORT nCur = 0; nCur <= (USHORT)SfxOpenModeLast; nCur++ ) - _aFrames[nCur] = rItem._aFrames[nCur]; -} - -// ----------------------------------------------------------------------- - -SfxTargetFrameItem::SfxTargetFrameItem( USHORT which, - const String& rOpenSelectFrame, const String& rOpenOpenFrame, - const String& rOpenAddTaskFrame ) : SfxPoolItem( which ) -{ - DBG_CTOR( SfxTargetFrameItem, 0 ); - _aFrames[ (USHORT)SfxOpenSelect ] = rOpenSelectFrame; - _aFrames[ (USHORT)SfxOpenOpen ] = rOpenOpenFrame; - _aFrames[ (USHORT)SfxOpenAddTask ] = rOpenAddTaskFrame; -} - -// ----------------------------------------------------------------------- - -SfxTargetFrameItem::~SfxTargetFrameItem() -{ - DBG_DTOR(SfxTargetFrameItem, 0); -} - -// ----------------------------------------------------------------------- - -String SfxTargetFrameItem::GetTargetFrame( SfxOpenMode eMode ) const -{ - DBG_CHKTHIS( SfxTargetFrameItem, 0 ); - if( eMode <= SfxOpenModeLast ) - return _aFrames[ (USHORT)eMode ]; - String aResult; - return aResult; -} - -// ----------------------------------------------------------------------- - -int SfxTargetFrameItem::operator==( const SfxPoolItem& rItem ) const -{ - DBG_CHKTHIS( SfxTargetFrameItem, 0 ); - DBG_ASSERT( SfxPoolItem::operator==( rItem ), "unequal type" ); - - for( USHORT nCur = 0; nCur <= (USHORT)SfxOpenModeLast; nCur++ ) - { - if( _aFrames[nCur] != ((const SfxTargetFrameItem&)rItem)._aFrames[nCur] ) - return 0; - } - return 1; -} - -// ----------------------------------------------------------------------- - -SfxPoolItem* SfxTargetFrameItem::Create( SvStream& rStream, USHORT ) const -{ - DBG_CHKTHIS(SfxTargetFrameItem, 0); - SfxTargetFrameItem* pItem = new SfxTargetFrameItem( Which() ); - USHORT nCount = 0; - rStream >> nCount; - for(USHORT nCur=0; nCur<= (USHORT)SfxOpenModeLast && nCount; nCur++,nCount--) - { - readByteString(rStream, pItem->_aFrames[ nCur ]); - } - // die uebriggebliebenen ueberspringen - String aTemp; - while( nCount ) - { - readByteString(rStream, aTemp); - nCount--; - } - return pItem; -} - -// ----------------------------------------------------------------------- - -SvStream& SfxTargetFrameItem::Store( SvStream& rStream, USHORT ) const -{ - DBG_CHKTHIS( SfxTargetFrameItem, 0 ); - USHORT nCount = (USHORT)(SfxOpenModeLast+1); - rStream << nCount; - for( USHORT nCur = 0; nCur <= (USHORT)SfxOpenModeLast; nCur++ ) - { - writeByteString(rStream, _aFrames[ nCur ]); - } - return rStream; -} - -// ----------------------------------------------------------------------- - -SfxPoolItem* SfxTargetFrameItem::Clone( SfxItemPool* ) const -{ - DBG_CHKTHIS( SfxTargetFrameItem, 0 ); - return new SfxTargetFrameItem( *this ); -} - -// ----------------------------------------------------------------------- -// virtual -BOOL SfxTargetFrameItem::QueryValue( com::sun::star::uno::Any& rVal,BYTE ) const -{ - String aVal; - for ( int i = 0; i <= SfxOpenModeLast; i++ ) - { - aVal += _aFrames[ i ]; - aVal += ';' ; - } - - rVal <<= rtl::OUString( aVal ); - return TRUE; -} - -// ----------------------------------------------------------------------- -// virtual -BOOL SfxTargetFrameItem::PutValue( const com::sun::star::uno::Any& rVal,BYTE ) -{ - rtl::OUString aValue; - if ( rVal >>= aValue ) - { - const String aVal( aValue ); - - for ( USHORT i = 0; i <= SfxOpenModeLast; i++ ) - _aFrames[ i ] = aVal.GetToken( i ); - - return TRUE; - } - - DBG_ERROR( "SfxTargetFrameItem::PutValue - Wrong type!" ); - return FALSE; -} - diff --git a/svtools/source/items1/tresitem.cxx b/svtools/source/items1/tresitem.cxx deleted file mode 100644 index 6e70c82a4d03..000000000000 --- a/svtools/source/items1/tresitem.cxx +++ /dev/null @@ -1,78 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: tresitem.cxx,v $ - * $Revision: 1.6 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include - -using namespace com::sun::star; - -//============================================================================ -// -// CntTransferResultItem -// -//============================================================================ - -TYPEINIT1_AUTOFACTORY(CntTransferResultItem, SfxPoolItem) - -//============================================================================ -// virtual -int CntTransferResultItem::operator ==(SfxPoolItem const & rItem) const -{ - if (CntTransferResultItem * pResultItem = PTR_CAST(CntTransferResultItem, - &rItem)) - return m_aResult.Source == pResultItem->m_aResult.Source - && m_aResult.Target == pResultItem->m_aResult.Target - && m_aResult.Result == pResultItem->m_aResult.Result; - return false; -} - -//============================================================================ -// virtual -BOOL CntTransferResultItem::QueryValue(uno::Any & rVal, BYTE) const -{ - rVal <<= m_aResult; - return true; -} - -//============================================================================ -// virtual -BOOL CntTransferResultItem::PutValue(uno::Any const & rVal, BYTE) -{ - return rVal >>= m_aResult; -} - -//============================================================================ -// virtual -SfxPoolItem * CntTransferResultItem::Clone(SfxItemPool *) const -{ - return new CntTransferResultItem(*this); -} - diff --git a/svtools/source/java/javaerror.src b/svtools/source/java/javaerror.src index 3063bcd994d5..3460df859c2b 100644 --- a/svtools/source/java/javaerror.src +++ b/svtools/source/java/javaerror.src @@ -28,7 +28,7 @@ * ************************************************************************/ -#include +#include WarningBox WARNINGBOX_JAVANOTFOUND { diff --git a/svtools/source/java/javainteractionhandler.cxx b/svtools/source/java/javainteractionhandler.cxx index 30f8775a6d5f..a7808c80992b 100644 --- a/svtools/source/java/javainteractionhandler.cxx +++ b/svtools/source/java/javainteractionhandler.cxx @@ -33,7 +33,7 @@ -#include +#include #include #include #include diff --git a/svtools/source/java/patchjavaerror.src b/svtools/source/java/patchjavaerror.src index bfdfd5a8bcba..2d2ad06a9592 100644 --- a/svtools/source/java/patchjavaerror.src +++ b/svtools/source/java/patchjavaerror.src @@ -28,7 +28,7 @@ * ************************************************************************/ -#include +#include WarningBox WARNINGBOX_JAVANOTFOUND { diff --git a/svtools/source/misc/acceleratorexecute.cxx b/svtools/source/misc/acceleratorexecute.cxx index 3e2d63e0b622..16bc8339a0d9 100644 --- a/svtools/source/misc/acceleratorexecute.cxx +++ b/svtools/source/misc/acceleratorexecute.cxx @@ -476,8 +476,14 @@ css::uno::Reference< css::ui::XAcceleratorConfiguration > AcceleratorExecute::st xSMGR->createInstance(::rtl::OUString::createFromAscii("com.sun.star.ui.ModuleUIConfigurationManagerSupplier")), css::uno::UNO_QUERY_THROW); - css::uno::Reference< css::ui::XUIConfigurationManager > xUIManager = xUISupplier->getUIConfigurationManager(sModule); - css::uno::Reference< css::ui::XAcceleratorConfiguration > xAccCfg (xUIManager->getShortCutManager(), css::uno::UNO_QUERY_THROW); + css::uno::Reference< css::ui::XAcceleratorConfiguration > xAccCfg; + try + { + css::uno::Reference< css::ui::XUIConfigurationManager > xUIManager = xUISupplier->getUIConfigurationManager(sModule); + xAccCfg = css::uno::Reference< css::ui::XAcceleratorConfiguration >(xUIManager->getShortCutManager(), css::uno::UNO_QUERY_THROW); + } + catch(const css::container::NoSuchElementException&) + {} return xAccCfg; } diff --git a/svtools/source/misc/dialogcontrolling.cxx b/svtools/source/misc/dialogcontrolling.cxx index 01f9d4ed0eef..d461e5898227 100644 --- a/svtools/source/misc/dialogcontrolling.cxx +++ b/svtools/source/misc/dialogcontrolling.cxx @@ -79,8 +79,8 @@ namespace svt //= DialogController //===================================================================== //--------------------------------------------------------------------- - DialogController::DialogController( Window& _rInstigator, const PWindowEventFilter _pEventFilter, - const PWindowOperator _pOperator ) + DialogController::DialogController( Window& _rInstigator, const PWindowEventFilter& _pEventFilter, + const PWindowOperator& _pOperator ) :m_pImpl( new DialogController_Data( _rInstigator, _pEventFilter, _pOperator ) ) { DBG_ASSERT( m_pImpl->pEventFilter.get() && m_pImpl->pOperator.get(), @@ -108,31 +108,33 @@ namespace svt void DialogController::addDependentWindow( Window& _rWindow ) { m_pImpl->aConcernedWindows.push_back( &_rWindow ); - impl_update( _rWindow ); + + VclWindowEvent aEvent( &_rWindow, 0, NULL ); + impl_update( aEvent, _rWindow ); } //--------------------------------------------------------------------- - IMPL_LINK( DialogController, OnWindowEvent, const VclSimpleEvent*, _pEvent ) + IMPL_LINK( DialogController, OnWindowEvent, const VclWindowEvent*, _pEvent ) { if ( m_pImpl->pEventFilter->payAttentionTo( *_pEvent ) ) - impl_updateAll(); + impl_updateAll( *_pEvent ); return 0L; } //--------------------------------------------------------------------- - void DialogController::impl_updateAll() + void DialogController::impl_updateAll( const VclWindowEvent& _rTriggerEvent ) { for ( ::std::vector< Window* >::iterator loop = m_pImpl->aConcernedWindows.begin(); loop != m_pImpl->aConcernedWindows.end(); ++loop ) - impl_update( *(*loop) ); + impl_update( _rTriggerEvent, *(*loop) ); } //--------------------------------------------------------------------- - void DialogController::impl_update( Window& _rWindow ) + void DialogController::impl_update( const VclWindowEvent& _rTriggerEvent, Window& _rWindow ) { - m_pImpl->pOperator->operateOn( _rWindow ); + m_pImpl->pOperator->operateOn( _rTriggerEvent, _rWindow ); } //===================================================================== @@ -176,6 +178,13 @@ namespace svt m_pImpl->aControllers.clear(); } + //--------------------------------------------------------------------- + void ControlDependencyManager::addController( const PDialogController& _pController ) + { + OSL_ENSURE( _pController.get() != NULL, "ControlDependencyManager::addController: invalid controller, this will crash, sooner or later!" ); + m_pImpl->aControllers.push_back( _pController ); + } + //--------------------------------------------------------------------- void ControlDependencyManager::enableOnRadioCheck( RadioButton& _rRadio, Window& _rDependentWindow ) { diff --git a/svtools/source/misc/ehdl.cxx b/svtools/source/misc/ehdl.cxx index 6e89193f1b6b..4084aa47bc80 100644 --- a/svtools/source/misc/ehdl.cxx +++ b/svtools/source/misc/ehdl.cxx @@ -45,7 +45,7 @@ #include #include -#include +#include #include "sfxecode.hxx" //========================================================================= diff --git a/svtools/source/misc/ehdl.src b/svtools/source/misc/ehdl.src index ed32172a92e2..5267d13765c3 100644 --- a/svtools/source/misc/ehdl.src +++ b/svtools/source/misc/ehdl.src @@ -29,7 +29,7 @@ ************************************************************************/ #define __RSC -#include +#include #include "sfxecode.hxx" // pragma ---------------------------------------------------------------- diff --git a/svtools/source/misc/embedhlp.cxx b/svtools/source/misc/embedhlp.cxx index 8eaf915f3b0c..3554f6955171 100644 --- a/svtools/source/misc/embedhlp.cxx +++ b/svtools/source/misc/embedhlp.cxx @@ -7,7 +7,6 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: embedhlp.cxx,v $ - * $Revision: 1.28 $ * * This file is part of OpenOffice.org. * @@ -33,7 +32,7 @@ #include #include -#include +#include #include #include @@ -54,9 +53,11 @@ #include #include #include +#include #include #include "vcl/svapp.hxx" #include +#include using namespace com::sun::star; @@ -188,7 +189,6 @@ void SAL_CALL EmbedEventListener_Impl::modified( const lang::EventObject& ) thro pObject->UpdateReplacementOnDemand(); } } - } void SAL_CALL EmbedEventListener_Impl::notifyEvent( const document::EventObject& aEvent ) throw( uno::RuntimeException ) @@ -249,6 +249,10 @@ struct EmbeddedObjectRef_Impl sal_Int64 nViewAspect; BOOL bIsLocked; sal_Bool bNeedUpdate; + + // #i104867# + sal_uInt32 mnGraphicVersion; + awt::Size aDefaultSizeForChart_In_100TH_MM;//#i103460# charts do not necessaryly have an own size within ODF files, in this case they need to use the size settings from the surrounding frame, which is made available with this member }; void EmbeddedObjectRef::Construct_Impl() @@ -260,6 +264,8 @@ void EmbeddedObjectRef::Construct_Impl() mpImp->nViewAspect = embed::Aspects::MSOLE_CONTENT; mpImp->bIsLocked = FALSE; mpImp->bNeedUpdate = sal_False; + mpImp->mnGraphicVersion = 0; + mpImp->aDefaultSizeForChart_In_100TH_MM = awt::Size(8000,7000); } EmbeddedObjectRef::EmbeddedObjectRef() @@ -286,6 +292,7 @@ EmbeddedObjectRef::EmbeddedObjectRef( const EmbeddedObjectRef& rObj ) mpImp->aPersistName = rObj.mpImp->aPersistName; mpImp->aMediaType = rObj.mpImp->aMediaType; mpImp->bNeedUpdate = rObj.mpImp->bNeedUpdate; + mpImp->aDefaultSizeForChart_In_100TH_MM = rObj.mpImp->aDefaultSizeForChart_In_100TH_MM; if ( rObj.mpImp->pGraphic && !rObj.mpImp->bNeedUpdate ) mpImp->pGraphic = new Graphic( *rObj.mpImp->pGraphic ); @@ -293,12 +300,14 @@ EmbeddedObjectRef::EmbeddedObjectRef( const EmbeddedObjectRef& rObj ) mpImp->pGraphic = 0; mpImp->pHCGraphic = 0; + mpImp->mnGraphicVersion = 0; } EmbeddedObjectRef::~EmbeddedObjectRef() { delete mpImp->pGraphic; - if ( mpImp->pHCGraphic ) DELETEZ( mpImp->pHCGraphic ); + if ( mpImp->pHCGraphic ) + DELETEZ( mpImp->pHCGraphic ); Clear(); } /* @@ -334,6 +343,14 @@ void EmbeddedObjectRef::Assign( const NS_UNO::Reference < NS_EMBED::XEmbeddedObj mpImp->nViewAspect = nAspect; mxObj = xObj; mpImp->xListener = EmbedEventListener_Impl::Create( this ); + + //#i103460# + { + ::com::sun::star::uno::Reference < ::com::sun::star::chart2::XDefaultSizeTransmitter > xSizeTransmitter( xObj, uno::UNO_QUERY ); + DBG_ASSERT( xSizeTransmitter.is(), "Object does not support XDefaultSizeTransmitter -> will cause #i103460#!" ); + if( xSizeTransmitter.is() ) + xSizeTransmitter->setDefaultSize( mpImp->aDefaultSizeForChart_In_100TH_MM ); + } } void EmbeddedObjectRef::Clear() @@ -441,10 +458,15 @@ void EmbeddedObjectRef::GetReplacement( BOOL bUpdate ) DELETEZ( mpImp->pGraphic ); mpImp->aMediaType = ::rtl::OUString(); mpImp->pGraphic = new Graphic; - if ( mpImp->pHCGraphic ) DELETEZ( mpImp->pHCGraphic ); + if ( mpImp->pHCGraphic ) + DELETEZ( mpImp->pHCGraphic ); + mpImp->mnGraphicVersion++; } else if ( !mpImp->pGraphic ) + { mpImp->pGraphic = new Graphic; + mpImp->mnGraphicVersion++; + } else { DBG_ERROR("No update, but replacement exists already!"); @@ -457,6 +479,7 @@ void EmbeddedObjectRef::GetReplacement( BOOL bUpdate ) GraphicFilter* pGF = GraphicFilter::GetGraphicFilter(); if( mpImp->pGraphic ) pGF->ImportGraphic( *mpImp->pGraphic, String(), *pGraphicStream, GRFILTER_FORMAT_DONTKNOW ); + mpImp->mnGraphicVersion++; delete pGraphicStream; } } @@ -586,6 +609,7 @@ Graphic* EmbeddedObjectRef::GetHCGraphic() const mpImp->pHCGraphic = pGraphic; else delete pGraphic; + mpImp->mnGraphicVersion++; } delete pStream; @@ -603,7 +627,9 @@ void EmbeddedObjectRef::SetGraphicStream( const uno::Reference< io::XInputStream delete mpImp->pGraphic; mpImp->pGraphic = new Graphic(); mpImp->aMediaType = rMediaType; - if ( mpImp->pHCGraphic ) DELETEZ( mpImp->pHCGraphic ); + if ( mpImp->pHCGraphic ) + DELETEZ( mpImp->pHCGraphic ); + mpImp->mnGraphicVersion++; SvStream* pGraphicStream = ::utl::UcbStreamHelper::CreateStream( xInGrStream ); @@ -611,6 +637,7 @@ void EmbeddedObjectRef::SetGraphicStream( const uno::Reference< io::XInputStream { GraphicFilter* pGF = GraphicFilter::GetGraphicFilter(); pGF->ImportGraphic( *mpImp->pGraphic, String(), *pGraphicStream, GRFILTER_FORMAT_DONTKNOW ); + mpImp->mnGraphicVersion++; if ( mpImp->pContainer ) { @@ -633,7 +660,9 @@ void EmbeddedObjectRef::SetGraphic( const Graphic& rGraphic, const ::rtl::OUStri delete mpImp->pGraphic; mpImp->pGraphic = new Graphic( rGraphic ); mpImp->aMediaType = rMediaType; - if ( mpImp->pHCGraphic ) DELETEZ( mpImp->pHCGraphic ); + if ( mpImp->pHCGraphic ) + DELETEZ( mpImp->pHCGraphic ); + mpImp->mnGraphicVersion++; if ( mpImp->pContainer ) SetGraphicToContainer( rGraphic, *mpImp->pContainer, mpImp->aPersistName, rMediaType ); @@ -868,7 +897,9 @@ void EmbeddedObjectRef::UpdateReplacementOnDemand() { DELETEZ( mpImp->pGraphic ); mpImp->bNeedUpdate = sal_True; - if ( mpImp->pHCGraphic ) DELETEZ( mpImp->pHCGraphic ); + if ( mpImp->pHCGraphic ) + DELETEZ( mpImp->pHCGraphic ); + mpImp->mnGraphicVersion++; if( mpImp->pContainer ) { @@ -902,4 +933,25 @@ BOOL EmbeddedObjectRef::IsChart() const return sal_False; } +// #i104867# +sal_uInt32 EmbeddedObjectRef::getGraphicVersion() const +{ + return mpImp->mnGraphicVersion; } + +void EmbeddedObjectRef::SetDefaultSizeForChart( const Size& rSizeIn_100TH_MM ) +{ + //#i103460# charts do not necessaryly have an own size within ODF files, + //for this case they need to use the size settings from the surrounding frame, + //which is made available with this method + + mpImp->aDefaultSizeForChart_In_100TH_MM = awt::Size( rSizeIn_100TH_MM.getWidth(), rSizeIn_100TH_MM.getHeight() ); + + ::com::sun::star::uno::Reference < ::com::sun::star::chart2::XDefaultSizeTransmitter > xSizeTransmitter( mxObj, uno::UNO_QUERY ); + DBG_ASSERT( xSizeTransmitter.is(), "Object does not support XDefaultSizeTransmitter -> will cause #i103460#!" ); + if( xSizeTransmitter.is() ) + xSizeTransmitter->setDefaultSize( mpImp->aDefaultSizeForChart_In_100TH_MM ); +} + +} // namespace svt + diff --git a/svtools/source/misc/errtxt.src b/svtools/source/misc/errtxt.src index 72b575f96f43..3ab58ef92dbf 100644 --- a/svtools/source/misc/errtxt.src +++ b/svtools/source/misc/errtxt.src @@ -29,7 +29,7 @@ ************************************************************************/ #define __RSC -#include +#include #include "sfxecode.hxx" // pragma ---------------------------------------------------------------- Resource RID_ERRCTX @@ -478,6 +478,10 @@ Resource RID_ERRHDL { Text [ en-US ] = "The digitally signed document content and/or macros do not match the current document signature.\n\nThis could be the result of document manipulation or of structural document damage due to data transmission.\n\nWe recommend that you do not trust the content of the current document.\nExecution of macros is disabled for this document.\n " ; }; + String ERRCODE_SFX_INCOMPLETE_ENCRYPTION + { + Text [ en-US ] = "The encrypted document contains unexpected non-encrypted streams.\n\nThis could be the result of document manipulation.\n\nWe recommend that you do not trust the content of the current document.\nExecution of macros is disabled for this document.\n " ; + }; String ERRCODE_IO_INVALIDLENGTH { @@ -503,6 +507,10 @@ Resource RID_ERRHDL { Text [ en-US ] = "Function not possible: write protected." ; }; + String ERRCODE_SFX_SHARED_NOPASSWORDCHANGE + { + Text [ en-US ] = "The password of a shared spreadsheet cannot be set or changed.\nDeactivate sharing mode first."; + }; }; // eof ------------------------------------------------------------------------ diff --git a/svtools/source/misc/flbytes.cxx b/svtools/source/misc/flbytes.cxx deleted file mode 100644 index acf53d9b3e94..000000000000 --- a/svtools/source/misc/flbytes.cxx +++ /dev/null @@ -1,432 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: flbytes.cxx,v $ - * $Revision: 1.6 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include -#include - -#ifndef _SVSTDARR_ULONGS_DECL -#define _SVSTDARR_ULONGS -#include -#undef _SVSTDARR_ULONGS -#endif - -namespace unnamed_svtools_flbytes {} using namespace unnamed_svtools_flbytes; - // unnamed namespaces don't work well yet - -//============================================================================ -namespace unnamed_svtools_flbytes { - -inline ULONG MyMin( long a, long b ) -{ - return Max( long( Min( a , b ) ), 0L ); -} - -} - -//============================================================================ -// -// SvFillLockBytes -// -//============================================================================ - -TYPEINIT1(SvFillLockBytes, SvLockBytes); - -//============================================================================ -SvFillLockBytes::SvFillLockBytes( SvLockBytes* pLockBytes ) - : xLockBytes( pLockBytes ), - nFilledSize( 0 ), - bTerminated( FALSE ) -{ -} - -//============================================================================ -ErrCode SvFillLockBytes::ReadAt( ULONG nPos, void* pBuffer, ULONG nCount, - ULONG *pRead ) const -{ - if( bTerminated ) - return xLockBytes->ReadAt( nPos, pBuffer, nCount, pRead ); - else - { - ULONG nWanted = nPos + nCount; - if( IsSynchronMode() ) - { - while( nWanted > nFilledSize && !bTerminated ) - Application::Yield(); - return xLockBytes->ReadAt( nPos, pBuffer, nCount, pRead ); - } - else - { - ULONG nRead = MyMin( nCount, long( nFilledSize ) - nPos ); - ULONG nErr = xLockBytes->ReadAt( nPos, pBuffer, nRead, pRead ); - return ( !nCount || nRead == nCount || nErr ) ? - nErr : ERRCODE_IO_PENDING; - } - } -} - -//============================================================================ -ErrCode SvFillLockBytes::WriteAt( ULONG nPos, const void* pBuffer, - ULONG nCount, ULONG *pWritten ) -{ - if( bTerminated ) - return xLockBytes->WriteAt( nPos, pBuffer, nCount, pWritten ); - else - { - ULONG nWanted = nPos + nCount; - if( IsSynchronMode() ) - { - while( nWanted > nFilledSize && !bTerminated ) - Application::Yield(); - return xLockBytes->WriteAt( nPos, pBuffer, nCount, pWritten ); - } - else - { - ULONG nRead = MyMin( nCount, long( nFilledSize ) - nPos ); - ULONG nErr = xLockBytes->WriteAt( nPos, pBuffer, nRead, pWritten ); - return ( !nCount || nRead == nCount || nErr ) ? - nErr : ERRCODE_IO_PENDING; - } - } -} - -//============================================================================ -ErrCode SvFillLockBytes::Flush() const -{ - return xLockBytes->Flush( ); -} - -//============================================================================ -ErrCode SvFillLockBytes::SetSize( ULONG nSize ) -{ - return xLockBytes->SetSize( nSize ); -} - -//============================================================================ -ErrCode SvFillLockBytes::LockRegion( ULONG nPos, ULONG nCount, LockType eType) -{ - return xLockBytes->LockRegion( nPos, nCount, eType ); -} - -//============================================================================ -ErrCode SvFillLockBytes::UnlockRegion( - ULONG nPos, ULONG nCount, LockType eType) -{ - return xLockBytes->UnlockRegion( nPos, nCount, eType ); -} - -//============================================================================ -ErrCode SvFillLockBytes::Stat( - SvLockBytesStat* pStat, SvLockBytesStatFlag eFlag) const -{ - return xLockBytes->Stat( pStat, eFlag ); -} - -//============================================================================ -ErrCode SvFillLockBytes::FillAppend( const void* pBuffer, ULONG nCount, ULONG *pWritten ) -{ - ErrCode nRet = xLockBytes->WriteAt( - nFilledSize, pBuffer, nCount, pWritten ); - nFilledSize += *pWritten; - return nRet; -} - -//============================================================================ -void SvFillLockBytes::Terminate() -{ - bTerminated = TRUE; -} - -//============================================================================ -SV_DECL_IMPL_REF_LIST( SvLockBytes, SvLockBytes* ) - -//============================================================================ -// -// SvSyncLockBytes -// -//============================================================================ - -TYPEINIT1(SvSyncLockBytes, SvOpenLockBytes); - -//============================================================================ -// virtual -ErrCode SvSyncLockBytes::ReadAt(ULONG nPos, void * pBuffer, ULONG nCount, - ULONG * pRead) const -{ - for (ULONG nReadTotal = 0;;) - { - ULONG nReadCount = 0; - ErrCode nError = m_xAsyncLockBytes->ReadAt(nPos, pBuffer, nCount, - &nReadCount); - nReadTotal += nReadCount; - if (nError != ERRCODE_IO_PENDING || !IsSynchronMode()) - { - if (pRead) - *pRead = nReadTotal; - return nError; - } - nPos += nReadCount; - pBuffer = static_cast< sal_Char * >(pBuffer) + nReadCount; - nCount -= nReadCount; - Application::Yield(); - } -} - -//============================================================================ -// virtual -ErrCode SvSyncLockBytes::WriteAt(ULONG nPos, const void * pBuffer, - ULONG nCount, ULONG * pWritten) -{ - for (ULONG nWrittenTotal = 0;;) - { - ULONG nWrittenCount = 0; - ErrCode nError = m_xAsyncLockBytes->WriteAt(nPos, pBuffer, nCount, - &nWrittenCount); - nWrittenTotal += nWrittenCount; - if (nError != ERRCODE_IO_PENDING || !IsSynchronMode()) - { - if (pWritten) - *pWritten = nWrittenTotal; - return nError; - } - nPos += nWrittenCount; - pBuffer = static_cast< sal_Char const * >(pBuffer) + nWrittenCount; - nCount -= nWrittenCount; - Application::Yield(); - } -} - -//============================================================================ -// -// SvCompositeLockBytes -// -//============================================================================ - -struct SvCompositeLockBytes_Impl -{ - SvLockBytesMemberList aLockBytes; - SvULongs aPositions; - SvULongs aOffsets; - BOOL bPending; - ULONG RelativeOffset( ULONG nPos ) const; - ErrCode ReadWrite_Impl( - ULONG nPos, void* pBuffer, ULONG nCount, ULONG* pProcessed, - BOOL bRead ); - SvCompositeLockBytes_Impl() : bPending( FALSE ){} -}; - -//============================================================================ -ULONG SvCompositeLockBytes_Impl::RelativeOffset( ULONG nPos ) const -{ - const SvULongs& rPositions = aPositions; - const SvULongs& rOffsets = aOffsets; - - USHORT nMinPos = 0; - USHORT nListCount = rPositions.Count(); - - // Erster Lockbytes, der bearbeitet werden muss - while( nMinPos + 1 < nListCount && rPositions[ nMinPos + 1 ] <= nPos ) - nMinPos ++; - ULONG nSectionStart = rPositions[ nMinPos ]; - if( nSectionStart > nPos ) - return ULONG_MAX; - return rOffsets[ nMinPos ] + nPos - nSectionStart; -} - -//============================================================================ -ErrCode SvCompositeLockBytes_Impl::ReadWrite_Impl( - ULONG nPos, void* pBuffer, ULONG nCount, ULONG* pProcessed, - BOOL bRead ) -{ - ErrCode nErr = ERRCODE_NONE; - SvULongs& rPositions = aPositions; - SvULongs& rOffsets = aOffsets; - SvLockBytesMemberList& rLockBytes = aLockBytes; - - ULONG nBytes = nCount; - USHORT nListCount = rPositions.Count(); - USHORT nMinPos = 0; - - // Erster Lockbytes, der bearbeitet werden muss - while( nMinPos + 1 < nListCount && rPositions[ nMinPos + 1 ] <= nPos ) - nMinPos ++; - ULONG nSectionStart = rPositions[ nMinPos ]; - - if( nSectionStart > nPos ) - { - // Es wird aus fuehrendem Leerbereich gearbeitet - *pProcessed = 0; - return ERRCODE_IO_CANTREAD; - } - - ULONG nDone; - while( nMinPos < nListCount ) - { - ULONG nToProcess; - ULONG nSectionStop; - if( nMinPos + 1 < nListCount ) - { - nSectionStop = rPositions[ nMinPos + 1 ]; - nToProcess = MyMin( long( nSectionStop ) - nPos, nBytes ); - } - else - { - nToProcess = nBytes; - nSectionStop = 0; - } - ULONG nAbsPos = nPos - nSectionStart + rOffsets[ nMinPos ]; - SvLockBytes* pLB = rLockBytes.GetObject( nMinPos ); - if( bRead ) - nErr = pLB->ReadAt( nAbsPos, pBuffer, nToProcess, &nDone ); - else - nErr = pLB->WriteAt( nAbsPos, pBuffer, nToProcess, &nDone ); - nBytes -= nDone; - if( nErr || nDone < nToProcess || !nBytes ) - { - *pProcessed = nCount - nBytes; - // Wenn aus dem letzten LockBytes nichts mehr gelesen wurde und - // bPending gesetzt ist, Pending zurueck - if( !nDone && nMinPos == nListCount - 1 ) - return bPending ? ERRCODE_IO_PENDING : nErr; - else return nErr; - } - pBuffer = static_cast< sal_Char * >(pBuffer) + nDone; - nPos += nDone; - nSectionStart = nSectionStop; - nMinPos++; - } - return nErr; -} - -//============================================================================ -TYPEINIT1(SvCompositeLockBytes, SvLockBytes); - -//============================================================================ -SvCompositeLockBytes::SvCompositeLockBytes() - : pImpl( new SvCompositeLockBytes_Impl ) -{ -} - -//============================================================================ -SvCompositeLockBytes::~SvCompositeLockBytes() -{ - delete pImpl; -} - -//============================================================================ -void SvCompositeLockBytes::SetIsPending( BOOL bSet ) -{ - pImpl->bPending = bSet; -} - -//============================================================================ -ULONG SvCompositeLockBytes::RelativeOffset( ULONG nPos ) const -{ - return pImpl->RelativeOffset( nPos ); -} - -//============================================================================ -ErrCode SvCompositeLockBytes::ReadAt( - ULONG nPos, void* pBuffer, ULONG nCount, ULONG* pRead ) const -{ - return pImpl->ReadWrite_Impl( nPos, pBuffer, nCount, pRead, TRUE ); -} - -//============================================================================ -ErrCode SvCompositeLockBytes::WriteAt( - ULONG nPos, const void* pBuffer, ULONG nCount, ULONG* pWritten ) -{ - return pImpl->ReadWrite_Impl( - nPos, const_cast< void * >(pBuffer), nCount, pWritten, FALSE ); -} - -//============================================================================ -ErrCode SvCompositeLockBytes::Flush() const -{ - SvLockBytesMemberList& rLockBytes = pImpl->aLockBytes; - ErrCode nErr = ERRCODE_NONE; - for( USHORT nCount = (USHORT)rLockBytes.Count(); !nErr && nCount--; ) - nErr = rLockBytes.GetObject( nCount )->Flush(); - return nErr; -} - -//============================================================================ -ErrCode SvCompositeLockBytes::SetSize( ULONG ) -{ - DBG_ERROR( "not implemented" ); - return ERRCODE_IO_NOTSUPPORTED; -} - -//============================================================================ -ErrCode SvCompositeLockBytes::LockRegion( ULONG, ULONG, LockType ) -{ - DBG_ERROR( "not implemented" ); - return ERRCODE_IO_NOTSUPPORTED; -} - -//============================================================================ -ErrCode SvCompositeLockBytes::UnlockRegion( - ULONG, ULONG, LockType ) -{ - DBG_ERROR( "not implemented" ); - return ERRCODE_IO_NOTSUPPORTED; -} - -//============================================================================ -ErrCode SvCompositeLockBytes::Stat( - SvLockBytesStat* pStat, SvLockBytesStatFlag eFlag) const -{ - USHORT nMax = pImpl->aPositions.Count() - 1; - - SvLockBytesStat aStat; - ErrCode nErr = pImpl->aLockBytes.GetObject( nMax )->Stat( &aStat, eFlag ); - pStat->nSize = pImpl->aPositions[ nMax ] + aStat.nSize; - - return nErr; -} - -//============================================================================ -void SvCompositeLockBytes::Append( - SvLockBytes* pLockBytes, ULONG nPos, ULONG nOffset ) -{ - USHORT nCount = pImpl->aOffsets.Count(); - pImpl->aLockBytes.Insert( pLockBytes, nCount ); - pImpl->aPositions.Insert( nPos, nCount ); - pImpl->aOffsets.Insert( nOffset, nCount ); -} - -//============================================================================ -SvLockBytes* SvCompositeLockBytes::GetLastLockBytes() const -{ - return pImpl->aLockBytes.Count() ? - pImpl->aLockBytes.GetObject( pImpl->aLockBytes.Count() - 1 ) : 0; -} - diff --git a/svtools/source/misc/helpagent.src b/svtools/source/misc/helpagent.src index 3b9e2a450ec1..181583bc8f6d 100644 --- a/svtools/source/misc/helpagent.src +++ b/svtools/source/misc/helpagent.src @@ -29,7 +29,7 @@ ************************************************************************/ #ifndef _SVTOOLS_HRC -#include +#include #endif Bitmap BMP_HELP_AGENT_IMAGE diff --git a/svtools/source/misc/helpagentwindow.cxx b/svtools/source/misc/helpagentwindow.cxx index 368c55a94ade..51cd7ebfb740 100644 --- a/svtools/source/misc/helpagentwindow.cxx +++ b/svtools/source/misc/helpagentwindow.cxx @@ -39,7 +39,7 @@ #include #ifndef _SVTOOLS_HRC -#include +#include #endif #ifndef _SVT_HELPID_HRC #include diff --git a/svtools/source/misc/imagemgr.cxx b/svtools/source/misc/imagemgr.cxx index 314242063711..76752b27354e 100644 --- a/svtools/source/misc/imagemgr.cxx +++ b/svtools/source/misc/imagemgr.cxx @@ -55,9 +55,10 @@ #include #include -#include +#include #include "imagemgr.hrc" #include +#include // globals ******************************************************************* diff --git a/svtools/source/misc/imagemgr.src b/svtools/source/misc/imagemgr.src index 0aada34305da..e082398beaa1 100644 --- a/svtools/source/misc/imagemgr.src +++ b/svtools/source/misc/imagemgr.src @@ -29,7 +29,7 @@ ************************************************************************/ // includes ****************************************************************** -#include +#include #include "imagemgr.hrc" // images ******************************************************************** diff --git a/svtools/source/misc/imap.cxx b/svtools/source/misc/imap.cxx index 9fb60111094e..df7760f7931b 100644 --- a/svtools/source/misc/imap.cxx +++ b/svtools/source/misc/imap.cxx @@ -36,7 +36,7 @@ #include #include -#include "urihelper.hxx" +#include "svl/urihelper.hxx" #include #include #include diff --git a/svtools/source/misc/imap2.cxx b/svtools/source/misc/imap2.cxx index b1e03a574188..1dd10c36c81a 100644 --- a/svtools/source/misc/imap2.cxx +++ b/svtools/source/misc/imap2.cxx @@ -43,7 +43,7 @@ #endif #include -#include "urihelper.hxx" +#include "svl/urihelper.hxx" #include #include #include diff --git a/svtools/source/misc/inidef.cxx b/svtools/source/misc/inidef.cxx deleted file mode 100644 index bdecd1b833dd..000000000000 --- a/svtools/source/misc/inidef.cxx +++ /dev/null @@ -1,269 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: inidef.cxx,v $ - * $Revision: 1.6 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" - - -#include -#include "inetdef.hxx" -#include "inidef.hxx" - -//======================================================================== - -class SfxStdIniDef_Impl: public SfxIniDefaulter -{ -public: - SfxStdIniDef_Impl( SfxIniDefaultManager *pDefMgr ) - : SfxIniDefaulter( pDefMgr ) - {} - virtual BOOL QueryDefault( String &rValue, const SfxIniEntry &rEntry ); -}; - -//------------------------------------------------------------------------- - -BOOL SfxStdIniDef_Impl::QueryDefault( String &rValue, const SfxIniEntry &rEntry ) -{ - switch ( rEntry.GetKey() ) - { - case SFX_KEY_BROWSERRESTORE: - { - rValue = "1"; - return TRUE; - } - - case SFX_KEY_INET_HOME: - { - if ( System::GetLanguage() == LANGUAGE_GERMAN ) - rValue = "http://www.stardivision.de"; - else - rValue = "http://www.stardivision.com"; - return TRUE; - } - - case SFX_KEY_INET_MEMCACHE: - rValue = "4"; - return TRUE; - - case SFX_KEY_INET_DISKCACHE: - rValue = "2048"; - return TRUE; - - case SFX_KEY_INET_CACHEEXPIRATION: - rValue = "3"; - return TRUE; - - case SFX_KEY_INET_MAXHTTPCONS: - rValue = "4"; - return TRUE; - - case SFX_KEY_INET_MAXFTPCONS: - rValue = "2"; - return TRUE; - -// case SFX_KEY_INET_JAVAMINHEAP: -// rValue = "256"; -// return TRUE; - -// case SFX_KEY_INET_JAVAMAXHEAP: -// rValue = ""; -// return TRUE; - - case SFX_KEY_INET_USERAGENT: - rValue = INET_DEF_CALLERNAME; - return TRUE; - - case SFX_KEY_INET_EXE_JAVASCRIPT: -#ifdef SOLAR_JAVA - rValue = "0"; // noch "0", solange es noch soviel Bugs gibt -#else - rValue = "0"; // immer "0" -#endif - return TRUE; - - case SFX_KEY_INET_EXE_PLUGIN: - rValue = "1"; - return TRUE; - -/* case SFX_KEY_INET_JAVA_ENABLE: -#ifdef SOLAR_JAVA - rValue = "1"; -#else - rValue = "0"; -#endif - return TRUE; */ - -// case SFX_KEY_INET_NETACCESS: -// rValue = "2"; -// return TRUE; - - case SFX_KEY_INET_CHANNELS: - rValue = "1"; - return TRUE; - - case SFX_KEY_BASIC_ENABLE: - rValue = "1"; - return TRUE; - - case SFX_KEY_INET_COOKIES: - rValue = "1"; - return TRUE; - - case SFX_KEY_ICONGRID: - rValue = "100;70;0"; - return TRUE; - - case SFX_KEY_METAFILEPRINT: - rValue = "1"; - return TRUE; - } - - return SfxIniDefaulter::QueryDefault( rValue, rEntry ); -} - -//========================================================================= - -SfxIniDefaultManager::SfxIniDefaultManager() -: _pList( new SfxIniDefaulterList ) -{ - new SfxStdIniDef_Impl( this ); -} - -//------------------------------------------------------------------------- - -SfxIniDefaultManager::~SfxIniDefaultManager() -{ - if ( _pList ) - { - for ( USHORT n = _pList->Count(); n--; ) - delete _pList->GetObject(n); - delete _pList; - } -} - -//------------------------------------------------------------------------- - -BOOL SfxIniDefaultManager::QueryDefault -( - String& rValue, /* out: Default-Wert f"ur 'rEntry' - (Default ist Leerstring) */ - const SfxIniEntry& rEntry // in: Beschreibung des Eintrags -) - -/* [Beschreibung] - - "Uber diese interne Methode besorgt sich der den - Default f"ur einen in 'rEntry' beschriebenen Eintrag. -*/ - -{ - for ( USHORT n = _pList->Count(); n--; ) - if ( _pList->GetObject(n)->QueryDefault( rValue, rEntry ) ) - return TRUE; - return FALSE; -} - -//========================================================================= - -SfxIniDefaulter::SfxIniDefaulter( SfxIniDefaultManager *pManager ) - -/* [Beschreibung] - - Der Ctor dieser Klasse meldet die neue Instanz automatisch am - 'pManager' an. -*/ - -: _pManager( pManager ) - -{ - pManager->Insert( this ); -} - -//------------------------------------------------------------------------- - -SfxIniDefaulter::~SfxIniDefaulter() - -/* [Beschreibung] - - Der Dtor dieser Klasse meldet die neue Instanz automatisch am - ab, der im Ctor angegeben wurde. -*/ - -{ - _pManager->Remove( this ); -} - -//------------------------------------------------------------------------- - -BOOL SfxIniDefaulter::QueryDefault -( - String& rValue, /* out: Default-Wert f"ur 'rEntry' - (Default ist Leerstring) */ - const SfxIniEntry& rEntry // in: Beschreibung des Eintrags -) - -/* [Beschreibung] - - Diese virtuelle Methode mu\s "uberladen werden. Sie soll dann in - 'rValue' einen Default-Wert f"ur den in 'rEntry' beschriebenen - ini-Eintrag setzen, falls ihr dieser bekannt ist. - - - [Returnwert] - - TRUE In 'rValue' befindet sich der Default-Wert. - - FALSE F"ur diesen Eintrag ist kein Default-Wert bekannt. - -*/ - -{ - return FALSE; -}; - -//======================================================================== - -SfxIniEntry::SfxIniEntry -( - const String& aGroup, - const String& aKey, - SfxIniGroup eGroup, - SfxIniKey eKey, - USHORT nIndex -) -: _aGroup( aGroup ), - _aKey( aKey ), - _eGroup( eGroup ), - _eKey( eKey ), - _nIndex( nIndex ) -{ -} - - diff --git a/svtools/source/items/itemdel.cxx b/svtools/source/misc/itemdel.cxx similarity index 98% rename from svtools/source/items/itemdel.cxx rename to svtools/source/misc/itemdel.cxx index 4028aa497c22..9db70f852d30 100644 --- a/svtools/source/items/itemdel.cxx +++ b/svtools/source/misc/itemdel.cxx @@ -37,8 +37,8 @@ #include #include -#include -#include +#include +#include // STATIC DATA ----------------------------------------------------------- diff --git a/svtools/source/misc/langtab.cxx b/svtools/source/misc/langtab.cxx index 870e6378a216..ef2cedcc50c2 100644 --- a/svtools/source/misc/langtab.cxx +++ b/svtools/source/misc/langtab.cxx @@ -42,10 +42,10 @@ #include #include -#include +#include #include #include -#include +#include using namespace ::com::sun::star; diff --git a/svtools/source/misc/langtab.src b/svtools/source/misc/langtab.src index 21953d25d92a..0aa90f8e96b9 100644 --- a/svtools/source/misc/langtab.src +++ b/svtools/source/misc/langtab.src @@ -29,7 +29,7 @@ ************************************************************************/ // include --------------------------------------------------------------- -#include +#include #define RSC_RESOURCE_USAGE 1 #include @@ -302,6 +302,14 @@ StringArray STR_ARR_SVT_LANGUAGE_TABLE < "Maltese" ; LANGUAGE_MALTESE ; > ; < "Tok Pisin" ; LANGUAGE_USER_TOK_PISIN ; > ; < "Shuswap" ; LANGUAGE_USER_SHUSWAP ; > ; + < "Oromo" ; LANGUAGE_OROMO ; > ; + < "Greek, Ancient" ; LANGUAGE_USER_ANCIENT_GREEK ; > ; + < "Yiddish" ; LANGUAGE_YIDDISH ; > ; + < "Quechua (Ecuador)" ; LANGUAGE_QUECHUA_ECUADOR ; > ; + < "Uyghur" ; LANGUAGE_UIGHUR_CHINA ; > ; + < "Asturian" ; LANGUAGE_USER_ASTURIAN ; > ; + < "Sorbian, Upper" ; LANGUAGE_UPPER_SORBIAN_GERMANY ; > ; + < "Sorbian, Lower" ; LANGUAGE_LOWER_SORBIAN_GERMANY ; > ; }; }; diff --git a/svtools/source/misc/makefile.mk b/svtools/source/misc/makefile.mk index a23092e120da..77cf8a41a8bd 100644 --- a/svtools/source/misc/makefile.mk +++ b/svtools/source/misc/makefile.mk @@ -46,11 +46,9 @@ ENABLE_EXCEPTIONS := TRUE SRS1NAME=misc SRC1FILES=\ - config.src \ - iniman.src \ ehdl.src \ - imagemgr.src \ helpagent.src \ + imagemgr.src \ langtab.src SRS2NAME=ehdl @@ -59,33 +57,28 @@ SRC2FILES=\ SLOFILES=\ $(SLO)$/acceleratorexecute.obj \ + $(SLO)$/chartprettypainter.obj \ $(SLO)$/cliplistener.obj \ + $(SLO)$/dialogclosedlistener.obj\ + $(SLO)$/dialogcontrolling.obj \ + $(SLO)$/ehdl.obj \ $(SLO)$/embedhlp.obj \ $(SLO)$/embedtransfer.obj \ + $(SLO)$/helpagentwindow.obj \ $(SLO)$/imagemgr.obj \ $(SLO)$/imageresourceaccess.obj \ - $(SLO)$/templatefoldercache.obj \ - $(SLO)$/transfer.obj \ - $(SLO)$/transfer2.obj \ - $(SLO)$/stringtransfer.obj \ - $(SLO)$/urihelper.obj \ - $(SLO)$/svtaccessiblefactory.obj \ - $(SLO)$/ehdl.obj \ - $(SLO)$/flbytes.obj \ - $(SLO)$/helpagentwindow.obj \ $(SLO)$/imap.obj \ $(SLO)$/imap2.obj \ $(SLO)$/imap3.obj \ - $(SLO)$/ownlist.obj \ - $(SLO)$/vcldata.obj \ - $(SLO)$/restrictedpaths.obj \ - $(SLO)$/dialogclosedlistener.obj\ - $(SLO)$/dialogcontrolling.obj \ - $(SLO)$/chartprettypainter.obj \ - $(SLO)$/lockfilecommon.obj \ - $(SLO)$/sharecontrolfile.obj \ - $(SLO)$/documentlockfile.obj \ - $(SLO)$/langtab.obj + $(SLO)$/itemdel.obj \ + $(SLO)$/langtab.obj \ + $(SLO)$/stringtransfer.obj \ + $(SLO)$/svtaccessiblefactory.obj \ + $(SLO)$/svtdata.obj \ + $(SLO)$/templatefoldercache.obj \ + $(SLO)$/transfer.obj \ + $(SLO)$/transfer2.obj \ + $(SLO)$/wallitem.obj # --- Targets ------------------------------------------------------- diff --git a/svtools/source/misc/svtaccessiblefactory.cxx b/svtools/source/misc/svtaccessiblefactory.cxx index b2d57c250d32..a4b3cc1e8ecc 100644 --- a/svtools/source/misc/svtaccessiblefactory.cxx +++ b/svtools/source/misc/svtaccessiblefactory.cxx @@ -107,6 +107,15 @@ namespace svt return NULL; } + virtual table::IAccessibleTableControl* + createAccessibleTableControl( + const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& /*_rxParent*/, + table::IAccessibleTable& /*_rTable*/ + ) const + { + return NULL; + } + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > createAccessibleIconChoiceCtrl( SvtIconChoiceCtrl& /*_rIconCtrl*/, diff --git a/svtools/source/misc/vcldata.cxx b/svtools/source/misc/svtdata.cxx similarity index 63% rename from svtools/source/misc/vcldata.cxx rename to svtools/source/misc/svtdata.cxx index 28b2e833e974..2bc1977e9197 100644 --- a/svtools/source/misc/vcldata.cxx +++ b/svtools/source/misc/svtdata.cxx @@ -6,8 +6,8 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: vcldata.cxx,v $ - * $Revision: 1.10 $ + * $RCSfile: svtdata.cxx,v $ + * $Revision: 1.7 $ * * This file is part of OpenOffice.org. * @@ -30,21 +30,49 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" -#include -#include + +#include +#include +#include +#include #include +#include //============================================================================ // -// class ImpSvtData +// ImpSvtData // //============================================================================ +ImpSvtData::~ImpSvtData() +{ + delete pResMgr; +} + +//============================================================================ +ResMgr * ImpSvtData::GetResMgr(const ::com::sun::star::lang::Locale aLocale) +{ + if (!pResMgr) + { + pResMgr = ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(svt), aLocale ); + } + return pResMgr; +} + ResMgr * ImpSvtData::GetResMgr() { return GetResMgr(Application::GetSettings().GetUILocale()); } +ResMgr * ImpSvtData::GetPatchResMgr(const ::com::sun::star::lang::Locale& aLocale) +{ + if (!pPatchResMgr) + { + pPatchResMgr = ResMgr::CreateResMgr(CREATEVERSIONRESMGR_NAME(svp), aLocale); + } + return pPatchResMgr; +} + ResMgr * ImpSvtData::GetPatchResMgr() { return GetPatchResMgr(Application::GetSettings().GetUILocale()); @@ -55,3 +83,13 @@ SvpResId::SvpResId( USHORT nId ) : { } +//============================================================================ +// static +ImpSvtData & ImpSvtData::GetSvtData() +{ + void ** pAppData = GetAppData(SHL_SVT); + if (!*pAppData) + *pAppData= new ImpSvtData; + return *static_cast(*pAppData); +} + diff --git a/svtools/source/misc/templatefoldercache.cxx b/svtools/source/misc/templatefoldercache.cxx index 93ed9a7f5c90..348a9638399b 100644 --- a/svtools/source/misc/templatefoldercache.cxx +++ b/svtools/source/misc/templatefoldercache.cxx @@ -45,7 +45,7 @@ #include #include #include -#include +#include #include "comphelper/processfactory.hxx" diff --git a/svtools/source/misc/transfer.cxx b/svtools/source/misc/transfer.cxx index 0bcd00af40aa..4a814637e1af 100644 --- a/svtools/source/misc/transfer.cxx +++ b/svtools/source/misc/transfer.cxx @@ -76,7 +76,7 @@ #include #include -#include "urlbmk.hxx" +#include "svl/urlbmk.hxx" #include "inetimg.hxx" #include #include diff --git a/svtools/source/misc/transfer2.cxx b/svtools/source/misc/transfer2.cxx index 8dcbbf9d93dc..027dbc31572d 100644 --- a/svtools/source/misc/transfer2.cxx +++ b/svtools/source/misc/transfer2.cxx @@ -50,7 +50,7 @@ #include #endif -#include "urlbmk.hxx" +#include "svl/urlbmk.hxx" #include "inetimg.hxx" #include #include diff --git a/svtools/source/items/wallitem.cxx b/svtools/source/misc/wallitem.cxx similarity index 98% rename from svtools/source/items/wallitem.cxx rename to svtools/source/misc/wallitem.cxx index 32797f69a48c..6ceb414db003 100644 --- a/svtools/source/items/wallitem.cxx +++ b/svtools/source/misc/wallitem.cxx @@ -52,7 +52,7 @@ #include #include "wallitem.hxx" -#include +#include // ----------------------------------------------------------------------- diff --git a/svtools/source/misc1/docpasswdrequest.cxx b/svtools/source/misc1/docpasswdrequest.cxx deleted file mode 100644 index 37ceb85ec132..000000000000 --- a/svtools/source/misc1/docpasswdrequest.cxx +++ /dev/null @@ -1,142 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: docpasswdrequest.cxx,v $ - * $Revision: 1.5 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" - -#include "docpasswdrequest.hxx" -#include -#include - -//========================================================================== - -class AbortContinuation : public ::cppu::WeakImplHelper1< ::com::sun::star::task::XInteractionAbort > -{ - sal_Bool mbSelected; - -public: - AbortContinuation() : mbSelected( sal_False ) {} - - sal_Bool isSelected() { return mbSelected; } - - void reset() { mbSelected = sal_False; } - - virtual void SAL_CALL select() throw(::com::sun::star::uno::RuntimeException) { mbSelected = sal_True; } -}; - -//========================================================================== - -class PasswordContinuation : public ::cppu::WeakImplHelper1< ::com::sun::star::task::XInteractionPassword > -{ - sal_Bool mbSelected; - ::rtl::OUString maPassword; - -public: - PasswordContinuation() : mbSelected( sal_False ) {} - - sal_Bool isSelected() { return mbSelected; } - - void reset() { mbSelected = sal_False; } - - virtual void SAL_CALL select() throw(::com::sun::star::uno::RuntimeException); - virtual void SAL_CALL setPassword( const ::rtl::OUString& aPass ) throw (::com::sun::star::uno::RuntimeException); - virtual ::rtl::OUString SAL_CALL getPassword( ) throw (::com::sun::star::uno::RuntimeException); -}; - -void SAL_CALL PasswordContinuation::select() - throw(::com::sun::star::uno::RuntimeException) -{ - mbSelected = sal_True; -} - -void SAL_CALL PasswordContinuation::setPassword( const ::rtl::OUString& aPass ) - throw (::com::sun::star::uno::RuntimeException) -{ - maPassword = aPass; -} - -::rtl::OUString SAL_CALL PasswordContinuation::getPassword() - throw (::com::sun::star::uno::RuntimeException) -{ - return maPassword; -} - -//========================================================================== - -RequestDocumentPassword::RequestDocumentPassword( ::com::sun::star::task::PasswordRequestMode nMode, ::rtl::OUString aName ) -{ - ::rtl::OUString temp; - ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > temp2; - ::com::sun::star::task::DocumentPasswordRequest - aDocumentPasswordRequest( temp, - temp2, - ::com::sun::star::task::InteractionClassification_QUERY, - nMode, - aName ); - - m_aRequest <<= aDocumentPasswordRequest; - - m_pAbort = new AbortContinuation; - m_pPassword = new PasswordContinuation; - - m_lContinuations.realloc( 2 ); - m_lContinuations[0] = ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation >( m_pAbort ); - m_lContinuations[1] = ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation >( m_pPassword ); -} - -sal_Bool RequestDocumentPassword::isAbort() -{ - return m_pAbort->isSelected(); -} - -sal_Bool RequestDocumentPassword::isPassword() -{ - return m_pPassword->isSelected(); -} - -::rtl::OUString RequestDocumentPassword::getPassword() -{ - return m_pPassword->getPassword(); -} - -::com::sun::star::uno::Any SAL_CALL RequestDocumentPassword::getRequest() - throw( ::com::sun::star::uno::RuntimeException ) -{ - return m_aRequest; -} - -::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation > > - SAL_CALL RequestDocumentPassword::getContinuations() - throw( ::com::sun::star::uno::RuntimeException ) -{ - return m_lContinuations; -} - - diff --git a/svtools/source/misc1/iniadrtk.cxx b/svtools/source/misc1/iniadrtk.cxx deleted file mode 100644 index 8d4c929fc988..000000000000 --- a/svtools/source/misc1/iniadrtk.cxx +++ /dev/null @@ -1,76 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: iniadrtk.cxx,v $ - * $Revision: 1.5 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include -#include - -//============================================================================ -// -// class SfxIniManagerAddressEntry -// -//============================================================================ - -// static -String SfxIniManagerAddressEntry::get(const String & rAddress, - AddressToken eToken) -{ - String aToken; - USHORT i = 0, nTxt = 0; - - while ( i < rAddress.Len() ) - { - while ( i < rAddress.Len() && rAddress.GetChar(i) != '#' ) - { - if ( rAddress.GetChar(i) == '\\' ) - i++; - aToken += rAddress.GetChar(i++); - } - - // rAddress[i] == '#' oder am Ende, also eine Position weiter gehen - i++; - - if ( eToken == (AddressToken)nTxt ) - break; - else if ( i >= rAddress.Len() ) - { - aToken.Erase(); - break; - } - else - { - aToken.Erase(); - nTxt++; - } - } - return aToken; -} - diff --git a/svtools/source/plugapp/testtool.src b/svtools/source/plugapp/testtool.src index 599675a6c494..78b63c2fb819 100644 --- a/svtools/source/plugapp/testtool.src +++ b/svtools/source/plugapp/testtool.src @@ -28,7 +28,7 @@ * ************************************************************************/ #include "testtool.hrc" -#include +#include #define Control_Control 5 diff --git a/svtools/source/productregistration/makefile.mk b/svtools/source/productregistration/makefile.mk index bc964e142232..1892f1600dd8 100644 --- a/svtools/source/productregistration/makefile.mk +++ b/svtools/source/productregistration/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -57,6 +57,7 @@ SHL1STDLIBS=\ $(TKLIB) \ $(VCLLIB) \ $(SVLLIB) \ + $(UNOTOOLSLIB) \ $(TOOLSLIB) \ $(CPPUHELPERLIB) \ $(CPPULIB) \ diff --git a/svtools/source/productregistration/productregistration.cxx b/svtools/source/productregistration/productregistration.cxx index b3d90a73b231..f5fc03337cd6 100644 --- a/svtools/source/productregistration/productregistration.cxx +++ b/svtools/source/productregistration/productregistration.cxx @@ -32,10 +32,10 @@ #include "precompiled_svtools.hxx" #include "productregistration.hxx" -#include "regoptions.hxx" +#include "unotools/regoptions.hxx" #include "registrationdlg.hxx" #ifndef _SVTOOLS_HRC -#include +#include #endif #include "cppuhelper/factory.hxx" #include @@ -308,18 +308,18 @@ namespace svt sal_Bool bDeactivateJob = sal_True; // our config options - RegOptions aRegOptions; + utl::RegOptions aRegOptions; // check them for the permissions for the dialog - RegOptions::DialogPermission ePermission( aRegOptions.getDialogPermission() ); + utl::RegOptions::DialogPermission ePermission( aRegOptions.getDialogPermission() ); - if ( RegOptions::dpDisabled != ePermission ) + if ( utl::RegOptions::dpDisabled != ePermission ) { // the dialog is _not_ disabled // for this session, I'm no interested in the dialog registration anymore aRegOptions.markSessionDone( ); - if ( ( RegOptions::dpNotThisSession == ePermission ) // first trigger session not reached - || ( RegOptions::dpRemindLater == ePermission ) // or at a later reminder date + if ( ( utl::RegOptions::dpNotThisSession == ePermission ) // first trigger session not reached + || ( utl::RegOptions::dpRemindLater == ePermission ) // or at a later reminder date ) { // the dialog should be executed during one of the next sessions bDeactivateJob = sal_False; @@ -327,7 +327,7 @@ namespace svt else { // if we're here, the dialog should be executed during this session - OSL_ENSURE( RegOptions::dpThisSession == ePermission, "OProductRegistration::execute: invalid permissions!" ); + OSL_ENSURE( utl::RegOptions::dpThisSession == ePermission, "OProductRegistration::execute: invalid permissions!" ); { // this is some kind of HACK. @@ -412,7 +412,7 @@ namespace svt OSL_ENSURE( xSystemShell.is(), "OProductRegistration::doOnlineRegistration: invalid SystemExecute component!" ); // access the configuration to retrieve the URL we shall use for registration - RegOptions aOptions; + utl::RegOptions aOptions; OUString sRegistrationURL( aOptions.getRegistrationURL( ) ); OSL_ENSURE( sRegistrationURL.getLength(), "OProductRegistration::doOnlineRegistration: invalid URL found!" ); @@ -436,7 +436,7 @@ namespace svt aRegistrationError.Execute(); // try again later - RegOptions aRegOptions; + utl::RegOptions aRegOptions; aRegOptions.activateReminder( 7 ); } } diff --git a/svtools/source/productregistration/registrationdlg.cxx b/svtools/source/productregistration/registrationdlg.cxx index 83018cfa804b..d3969828cb1f 100644 --- a/svtools/source/productregistration/registrationdlg.cxx +++ b/svtools/source/productregistration/registrationdlg.cxx @@ -35,7 +35,7 @@ #if 0 /* @@@ */ #include #ifndef _SVTOOLS_HRC -#include +#include #endif #endif /* @@@ */ diff --git a/svtools/source/productregistration/registrationdlg.src b/svtools/source/productregistration/registrationdlg.src index 86024ef765cd..f9462a420061 100644 --- a/svtools/source/productregistration/registrationdlg.src +++ b/svtools/source/productregistration/registrationdlg.src @@ -32,7 +32,7 @@ #include "registrationdlg.hrc" #endif #ifndef _SVTOOLS_HRC -#include +#include #endif #ifndef _SVT_HELPID_HRC #include diff --git a/svtools/source/svhtml/htmlout.cxx b/svtools/source/svhtml/htmlout.cxx index 5b584a37059d..5bb26367075e 100644 --- a/svtools/source/svhtml/htmlout.cxx +++ b/svtools/source/svhtml/htmlout.cxx @@ -32,11 +32,11 @@ #include "precompiled_svtools.hxx" #include -#include -#include +#include +#include #include #include -#include +#include #include #include "htmlkywd.hxx" @@ -44,7 +44,7 @@ #include #include #include -#include "urihelper.hxx" +#include "svl/urihelper.hxx" #ifndef RTL_CONSTASCII_STRINGPARAM #define RTL_CONSTASCII_STRINGPARAM( c ) c, sizeof(c)-1 diff --git a/svtools/source/svhtml/htmlsupp.cxx b/svtools/source/svhtml/htmlsupp.cxx index 11f48e7fdf5d..9103161afb51 100644 --- a/svtools/source/svhtml/htmlsupp.cxx +++ b/svtools/source/svhtml/htmlsupp.cxx @@ -36,7 +36,7 @@ #include #ifndef _SVSTDARR_HXX #define _SVSTDARR_ULONGS -#include +#include #endif #include diff --git a/svtools/source/svhtml/makefile.mk b/svtools/source/svhtml/makefile.mk index 577cc83e65c7..b597763ac390 100644 --- a/svtools/source/svhtml/makefile.mk +++ b/svtools/source/svhtml/makefile.mk @@ -34,6 +34,8 @@ PRJ=..$/.. PRJNAME=svtools TARGET=svhtml +ENABLE_EXCEPTIONS=TRUE + # --- Settings ----------------------------------------------------- .INCLUDE : settings.mk diff --git a/svtools/source/svhtml/parhtml.cxx b/svtools/source/svhtml/parhtml.cxx index 3413cd3e7fb8..b4eb6c05cffd 100644 --- a/svtools/source/svhtml/parhtml.cxx +++ b/svtools/source/svhtml/parhtml.cxx @@ -40,13 +40,24 @@ #include #ifndef _SVSTDARR_HXX #define _SVSTDARR_ULONGS -#include +#include #endif +#include +#include +#include +#include +#include +#include + #include #include "htmltokn.h" #include "htmlkywd.hxx" + +using namespace ::com::sun::star; + + const sal_Int32 MAX_LEN( 1024L ); //static sal_Unicode sTmpBuffer[ MAX_LEN+1 ]; const sal_Int32 MAX_MACRO_LEN( 1024 ); @@ -2080,7 +2091,6 @@ BOOL HTMLParser::InternalImgToPrivateURL( String& rURL ) return bFound; } - #ifdef USED void HTMLParser::SaveState( int nToken ) { @@ -2093,3 +2103,241 @@ void HTMLParser::RestoreState() } #endif + +enum eHtmlMetas { + HTML_META_NONE = 0, + HTML_META_AUTHOR, + HTML_META_DESCRIPTION, + HTML_META_KEYWORDS, + HTML_META_REFRESH, + HTML_META_CLASSIFICATION, + HTML_META_CREATED, + HTML_META_CHANGEDBY, + HTML_META_CHANGED, + HTML_META_GENERATOR, + HTML_META_SDFOOTNOTE, + HTML_META_SDENDNOTE, + HTML_META_CONTENT_TYPE +}; + +// +#ifdef __MINGW32__ // for runtime pseudo reloc +static HTMLOptionEnum aHTMLMetaNameTable[] = +#else +static HTMLOptionEnum __READONLY_DATA aHTMLMetaNameTable[] = +#endif +{ + { OOO_STRING_SVTOOLS_HTML_META_author, HTML_META_AUTHOR }, + { OOO_STRING_SVTOOLS_HTML_META_changed, HTML_META_CHANGED }, + { OOO_STRING_SVTOOLS_HTML_META_changedby, HTML_META_CHANGEDBY }, + { OOO_STRING_SVTOOLS_HTML_META_classification,HTML_META_CLASSIFICATION}, + { OOO_STRING_SVTOOLS_HTML_META_content_type, HTML_META_CONTENT_TYPE }, + { OOO_STRING_SVTOOLS_HTML_META_created, HTML_META_CREATED }, + { OOO_STRING_SVTOOLS_HTML_META_description, HTML_META_DESCRIPTION }, + { OOO_STRING_SVTOOLS_HTML_META_keywords, HTML_META_KEYWORDS }, + { OOO_STRING_SVTOOLS_HTML_META_generator, HTML_META_GENERATOR }, + { OOO_STRING_SVTOOLS_HTML_META_refresh, HTML_META_REFRESH }, + { OOO_STRING_SVTOOLS_HTML_META_sdendnote, HTML_META_SDENDNOTE }, + { OOO_STRING_SVTOOLS_HTML_META_sdfootnote, HTML_META_SDFOOTNOTE }, + { 0, 0 } +}; + + +void HTMLParser::AddMetaUserDefined( ::rtl::OUString const & ) +{ +} + +bool HTMLParser::ParseMetaOptionsImpl( + const uno::Reference & i_xDocProps, + SvKeyValueIterator *i_pHTTPHeader, + const HTMLOptions *i_pOptions, + rtl_TextEncoding& o_rEnc ) +{ + String aName, aContent; + USHORT nAction = HTML_META_NONE; + bool bHTTPEquiv = false, bChanged = false; + + for ( USHORT i = i_pOptions->Count(); i; ) + { + const HTMLOption *pOption = (*i_pOptions)[ --i ]; + switch ( pOption->GetToken() ) + { + case HTML_O_NAME: + aName = pOption->GetString(); + if ( HTML_META_NONE==nAction ) + { + pOption->GetEnum( nAction, aHTMLMetaNameTable ); + } + break; + case HTML_O_HTTPEQUIV: + aName = pOption->GetString(); + pOption->GetEnum( nAction, aHTMLMetaNameTable ); + bHTTPEquiv = true; + break; + case HTML_O_CONTENT: + aContent = pOption->GetString(); + break; + } + } + + if ( bHTTPEquiv || HTML_META_DESCRIPTION != nAction ) + { + // if it is not a Description, remove CRs and LFs from CONTENT + aContent.EraseAllChars( _CR ); + aContent.EraseAllChars( _LF ); + } + else + { + // convert line endings for Description + aContent.ConvertLineEnd(); + } + + + if ( bHTTPEquiv && i_pHTTPHeader ) + { + // #57232#: Netscape seems to just ignore a closing ", so we do too + if ( aContent.Len() && '"' == aContent.GetChar( aContent.Len()-1 ) ) + { + aContent.Erase( aContent.Len() - 1 ); + } + SvKeyValue aKeyValue( aName, aContent ); + i_pHTTPHeader->Append( aKeyValue ); + } + + switch ( nAction ) + { + case HTML_META_AUTHOR: + if (i_xDocProps.is()) { + i_xDocProps->setAuthor( aContent ); + bChanged = true; + } + break; + case HTML_META_DESCRIPTION: + if (i_xDocProps.is()) { + i_xDocProps->setDescription( aContent ); + bChanged = true; + } + break; + case HTML_META_KEYWORDS: + if (i_xDocProps.is()) { + i_xDocProps->setKeywords( + ::comphelper::string::convertCommaSeparated(aContent)); + bChanged = true; + } + break; + case HTML_META_CLASSIFICATION: + if (i_xDocProps.is()) { + i_xDocProps->setSubject( aContent ); + bChanged = true; + } + break; + + case HTML_META_CHANGEDBY: + if (i_xDocProps.is()) { + i_xDocProps->setModifiedBy( aContent ); + } + break; + + case HTML_META_CREATED: + case HTML_META_CHANGED: + if ( i_xDocProps.is() && aContent.Len() && + aContent.GetTokenCount() == 2 ) + { + Date aDate( (ULONG)aContent.GetToken(0).ToInt32() ); + Time aTime( (ULONG)aContent.GetToken(1).ToInt32() ); + DateTime aDateTime( aDate, aTime ); + ::util::DateTime uDT(aDateTime.Get100Sec(), + aDateTime.GetSec(), aDateTime.GetMin(), + aDateTime.GetHour(), aDateTime.GetDay(), + aDateTime.GetMonth(), aDateTime.GetYear()); + if ( HTML_META_CREATED==nAction ) + i_xDocProps->setCreationDate( uDT ); + else + i_xDocProps->setModificationDate( uDT ); + bChanged = true; + } + break; + + case HTML_META_REFRESH: + DBG_ASSERT( !bHTTPEquiv || i_pHTTPHeader, + "Reload-URL aufgrund unterlassener MUSS-Aenderung verlorengegangen" ); + break; + + case HTML_META_CONTENT_TYPE: + if ( aContent.Len() ) + { + o_rEnc = GetEncodingByMIME( aContent ); + } + break; + + case HTML_META_NONE: + if ( !bHTTPEquiv ) + { + if (i_xDocProps.is()) + { + uno::Reference xUDProps + = i_xDocProps->getUserDefinedProperties(); + try { + xUDProps->addProperty(aName, + beans::PropertyAttribute::REMOVEABLE, + uno::makeAny(::rtl::OUString(aContent))); + AddMetaUserDefined(aName); + bChanged = true; + } catch (uno::Exception &) { + // ignore + } + } + } + break; + default: + break; + } + + return bChanged; +} + +bool HTMLParser::ParseMetaOptions( + const uno::Reference & i_xDocProps, + SvKeyValueIterator *i_pHeader ) +{ + USHORT nContentOption = HTML_O_CONTENT; + rtl_TextEncoding eEnc = RTL_TEXTENCODING_DONTKNOW; + + bool bRet = ParseMetaOptionsImpl( i_xDocProps, i_pHeader, + GetOptions(&nContentOption), + eEnc ); + + // If the encoding is set by a META tag, it may only overwrite the + // current encoding if both, the current and the new encoding, are 1-BYTE + // encodings. Everything else cannot lead to reasonable results. + if (RTL_TEXTENCODING_DONTKNOW != eEnc && + rtl_isOctetTextEncoding( eEnc ) && + rtl_isOctetTextEncoding( GetSrcEncoding() ) ) + { + eEnc = GetExtendedCompatibilityTextEncoding( eEnc ); // #89973# + SetSrcEncoding( eEnc ); + } + + return bRet; +} + +rtl_TextEncoding HTMLParser::GetEncodingByMIME( const String& rMime ) +{ + ByteString sType; + ByteString sSubType; + INetContentTypeParameterList aParameters; + ByteString sMime( rMime, RTL_TEXTENCODING_ASCII_US ); + if (INetContentTypes::parse(sMime, sType, sSubType, &aParameters)) + { + const INetContentTypeParameter * pCharset + = aParameters.find("charset"); + if (pCharset != 0) + { + ByteString sValue( pCharset->m_sValue, RTL_TEXTENCODING_ASCII_US ); + return GetExtendedCompatibilityTextEncoding( + rtl_getTextEncodingFromMimeCharset( sValue.GetBuffer() ) ); + } + } + return RTL_TEXTENCODING_DONTKNOW; +} + diff --git a/svtools/source/svrtf/rtfkey2.cxx b/svtools/source/svrtf/rtfkey2.cxx new file mode 100644 index 000000000000..5c4e1039d92c --- /dev/null +++ b/svtools/source/svrtf/rtfkey2.cxx @@ -0,0 +1,1162 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: rtfkey2.cxx,v $ + * $Revision: 1.14.134.1 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" + +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- */ + +#include "rtfkeywd.hxx" + +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HEXCHAR, "\\'" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_IGNORE, "\\*" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OPTHYPH, "\\-" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SUBENTRY, "\\:" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ABSH, "\\absh" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ABSW, "\\absw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ALT, "\\alt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ANNOTATION, "\\annotation" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ANSI, "\\ansi" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ATNID, "\\atnid" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AUTHOR, "\\author" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_B, "\\b" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BGBDIAG, "\\bgbdiag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BGCROSS, "\\bgcross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BGDCROSS, "\\bgdcross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BGDKBDIAG, "\\bgdkbdiag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BGDKCROSS, "\\bgdkcross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BGDKDCROSS, "\\bgdkdcross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BGDKFDIAG, "\\bgdkfdiag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BGDKHORIZ, "\\bgdkhoriz" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BGDKVERT, "\\bgdkvert" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BGFDIAG, "\\bgfdiag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BGHORIZ, "\\bghoriz" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BGVERT, "\\bgvert" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BIN, "\\bin" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BINFSXN, "\\binfsxn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BINSXN, "\\binsxn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BKMKCOLF, "\\bkmkcolf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BKMKCOLL, "\\bkmkcoll" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BKMKEND, "\\bkmkend" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BKMKSTART, "\\bkmkstart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BLUE, "\\blue" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BOX, "\\box" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRB, "\\brdrb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRBAR, "\\brdrbar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRBTW, "\\brdrbtw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRCF, "\\brdrcf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRDB, "\\brdrdb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRDOT, "\\brdrdot" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRHAIR, "\\brdrhair" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRL, "\\brdrl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRR, "\\brdrr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRS, "\\brdrs" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRSH, "\\brdrsh" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRT, "\\brdrt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRTH, "\\brdrth" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRW, "\\brdrw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRSP, "\\brsp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BULLET, "\\bullet" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BUPTIM, "\\buptim" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BXE, "\\bxe" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CAPS, "\\caps" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CB, "\\cb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CBPAT, "\\cbpat" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CELL, "\\cell" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CELLX, "\\cellx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CF, "\\cf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CFPAT, "\\cfpat" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHATN, "\\chatn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHDATE, "\\chdate" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHDPA, "\\chdpa" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHDPL, "\\chdpl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHFTN, "\\chftn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHFTNSEP, "\\chftnsep" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHFTNSEPC, "\\chftnsepc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHPGN, "\\chpgn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHTIME, "\\chtime" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBGBDIAG, "\\clbgbdiag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBGCROSS, "\\clbgcross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBGDCROSS, "\\clbgdcross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBGDKBDIAG, "\\clbgdkbdiag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBGDKCROSS, "\\clbgdkcross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBGDKDCROSS, "\\clbgdkdcross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBGDKFDIAG, "\\clbgdkfdiag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBGDKHOR, "\\clbgdkhor" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBGDKVERT, "\\clbgdkvert" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBGFDIAG, "\\clbgfdiag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBGHORIZ, "\\clbghoriz" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBGVERT, "\\clbgvert" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBRDRB, "\\clbrdrb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBRDRL, "\\clbrdrl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBRDRR, "\\clbrdrr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLBRDRT, "\\clbrdrt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLCBPAT, "\\clcbpat" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLCFPAT, "\\clcfpat" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLMGF, "\\clmgf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLMRG, "\\clmrg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLSHDNG, "\\clshdng" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_COLNO, "\\colno" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_COLORTBL, "\\colortbl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_COLS, "\\cols" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_COLSR, "\\colsr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_COLSX, "\\colsx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_COLUMN, "\\column" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_COLW, "\\colw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_COMMENT, "\\comment" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CREATIM, "\\creatim" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CTRL, "\\ctrl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DEFF, "\\deff" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DEFFORMAT, "\\defformat" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DEFLANG, "\\deflang" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DEFTAB, "\\deftab" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DELETED, "\\deleted" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DFRMTXTX, "\\dfrmtxtx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DFRMTXTY, "\\dfrmtxty" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DIBITMAP, "\\dibitmap" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DN, "\\dn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DOCCOMM, "\\doccomm" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DOCTEMP, "\\doctemp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DROPCAPLI, "\\dropcapli" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DROPCAPT, "\\dropcapt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ABSNOOVRLP, "\\absnoovrlp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DXFRTEXT, "\\dxfrtext" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DY, "\\dy" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_EDMINS, "\\edmins" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_EMDASH, "\\emdash" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ENDASH, "\\endash" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ENDDOC, "\\enddoc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ENDNHERE, "\\endnhere" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ENDNOTES, "\\endnotes" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_EXPND, "\\expnd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_EXPNDTW, "\\expndtw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_F, "\\f" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FACINGP, "\\facingp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FACPGSXN, "\\facpgsxn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FALT, "\\falt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FCHARSET, "\\fcharset" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FDECOR, "\\fdecor" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FI, "\\fi" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FIELD, "\\field" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLDDIRTY, "\\flddirty" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLDEDIT, "\\fldedit" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLDINST, "\\fldinst" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLDLOCK, "\\fldlock" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLDPRIV, "\\fldpriv" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLDRSLT, "\\fldrslt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FMODERN, "\\fmodern" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FN, "\\fn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FNIL, "\\fnil" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FONTTBL, "\\fonttbl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FOOTER, "\\footer" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FOOTERF, "\\footerf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FOOTERL, "\\footerl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FOOTERR, "\\footerr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FOOTERY, "\\footery" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FOOTNOTE, "\\footnote" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FPRQ, "\\fprq" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FRACWIDTH, "\\fracwidth" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FROMAN, "\\froman" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FS, "\\fs" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FSCRIPT, "\\fscript" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FSWISS, "\\fswiss" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTECH, "\\ftech" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNBJ, "\\ftnbj" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNCN, "\\ftncn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNRESTART, "\\ftnrestart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNSEP, "\\ftnsep" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNSEPC, "\\ftnsepc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNSTART, "\\ftnstart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNTJ, "\\ftntj" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_GREEN, "\\green" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_GUTTER, "\\gutter" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_GUTTERSXN, "\\guttersxn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HEADER, "\\header" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HEADERF, "\\headerf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HEADERL, "\\headerl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HEADERR, "\\headerr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HEADERY, "\\headery" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HR, "\\hr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HYPHHOTZ, "\\hyphhotz" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_I, "\\i" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ID, "\\id" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_INFO, "\\info" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_INTBL, "\\intbl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_IXE, "\\ixe" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_KEEP, "\\keep" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_KEEPN, "\\keepn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_KERNING, "\\kerning" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_KEYCODE, "\\keycode" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_KEYWORDS, "\\keywords" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LANDSCAPE, "\\landscape" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LANG, "\\lang" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LDBLQUOTE, "\\ldblquote" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVEL, "\\level" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LI, "\\li" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LIN, "\\lin" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LINE, "\\line" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LINEBETCOL, "\\linebetcol" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LINECONT, "\\linecont" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LINEMOD, "\\linemod" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LINEPPAGE, "\\lineppage" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LINERESTART, "\\linerestart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LINESTART, "\\linestart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LINESTARTS, "\\linestarts" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LINEX, "\\linex" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LNDSCPSXN, "\\lndscpsxn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LQUOTE, "\\lquote" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MAC, "\\mac" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MACPICT, "\\macpict" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MAKEBACKUP, "\\makebackup" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MARGB, "\\margb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MARGBSXN, "\\margbsxn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MARGL, "\\margl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MARGLSXN, "\\marglsxn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MARGMIRROR, "\\margmirror" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MARGR, "\\margr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MARGRSXN, "\\margrsxn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MARGT, "\\margt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MARGTSXN, "\\margtsxn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MIN, "\\min" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MO, "\\mo" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NEXTCSET, "\\nextcset" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NEXTFILE, "\\nextfile" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOFCHARS, "\\nofchars" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOFPAGES, "\\nofpages" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOFWORDS, "\\nofwords" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOLINE, "\\noline" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOSUPERSUB, "\\nosupersub" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOWRAP, "\\nowrap" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OPERATOR, "\\operator" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OUTL, "\\outl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PAGE, "\\page" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PAGEBB, "\\pagebb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PAPERH, "\\paperh" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PAPERW, "\\paperw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PAR, "\\par" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PARD, "\\pard" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PC, "\\pc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PCA, "\\pca" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGHSXN, "\\pghsxn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNCONT, "\\pgncont" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNDEC, "\\pgndec" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNLCLTR, "\\pgnlcltr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNLCRM, "\\pgnlcrm" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNRESTART, "\\pgnrestart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNSTART, "\\pgnstart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNSTARTS, "\\pgnstarts" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNUCLTR, "\\pgnucltr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNUCRM, "\\pgnucrm" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNX, "\\pgnx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNY, "\\pgny" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGWSXN, "\\pgwsxn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PHCOL, "\\phcol" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PHMRG, "\\phmrg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PHPG, "\\phpg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICCROPB, "\\piccropb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICCROPL, "\\piccropl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICCROPR, "\\piccropr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICCROPT, "\\piccropt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICH, "\\pich" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICHGOAL, "\\pichgoal" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICSCALED, "\\picscaled" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICSCALEX, "\\picscalex" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICSCALEY, "\\picscaley" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICT, "\\pict" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICW, "\\picw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICWGOAL, "\\picwgoal" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PLAIN, "\\plain" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PMMETAFILE, "\\pmmetafile" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSNEGX, "\\posnegx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSNEGY, "\\posnegy" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSX, "\\posx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSXC, "\\posxc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSXI, "\\posxi" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSXL, "\\posxl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSXO, "\\posxo" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSXR, "\\posxr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSY, "\\posy" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSYB, "\\posyb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSYC, "\\posyc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSYIL, "\\posyil" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSYT, "\\posyt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PRINTIM, "\\printim" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PSOVER, "\\psover" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PVMRG, "\\pvmrg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PVPARA, "\\pvpara" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PVPG, "\\pvpg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_QC, "\\qc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_QJ, "\\qj" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_QL, "\\ql" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_QR, "\\qr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RDBLQUOTE, "\\rdblquote" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RED, "\\red" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_REVBAR, "\\revbar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_REVISED, "\\revised" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_REVISIONS, "\\revisions" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_REVPROP, "\\revprop" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_REVTIM, "\\revtim" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RI, "\\ri" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RIN, "\\rin" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ROW, "\\row" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RQUOTE, "\\rquote" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RTF, "\\rtf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RXE, "\\rxe" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_S, "\\s" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SA, "\\sa" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SB, "\\sb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SBASEDON, "\\sbasedon" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SBKCOL, "\\sbkcol" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SBKEVEN, "\\sbkeven" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SBKNONE, "\\sbknone" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SBKODD, "\\sbkodd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SBKPAGE, "\\sbkpage" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SBYS, "\\sbys" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SCAPS, "\\scaps" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SECT, "\\sect" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SECTD, "\\sectd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHAD, "\\shad" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHADING, "\\shading" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHIFT, "\\shift" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SL, "\\sl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SNEXT, "\\snext" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_STRIKE, "\\strike" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_STYLESHEET, "\\stylesheet" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SUB, "\\sub" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SUBJECT, "\\subject" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SUPER, "\\super" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TAB, "\\tab" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TB, "\\tb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TC, "\\tc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TCF, "\\tcf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TCL, "\\tcl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TEMPLATE, "\\template" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TITLE, "\\title" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TITLEPG, "\\titlepg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TLDOT, "\\tldot" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TLEQ, "\\tleq" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TLHYPH, "\\tlhyph" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TLTH, "\\tlth" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TLUL, "\\tlul" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TQC, "\\tqc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TQDEC, "\\tqdec" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TQR, "\\tqr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TQL, "\\tql" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRGAPH, "\\trgaph" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRLEFT, "\\trleft" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TROWD, "\\trowd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRQC, "\\trqc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRQL, "\\trql" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRQR, "\\trqr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRRH, "\\trrh" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TX, "\\tx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TXE, "\\txe" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_UL, "\\ul" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULD, "\\uld" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULDB, "\\uldb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULNONE, "\\ulnone" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULW, "\\ulw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_UP, "\\up" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_V, "\\v" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_VERN, "\\vern" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_VERSION, "\\version" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_VERTALB, "\\vertalb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_VERTALC, "\\vertalc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_VERTALJ, "\\vertalj" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_VERTALT, "\\vertalt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_WBITMAP, "\\wbitmap" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_WBMBITSPIXEL, "\\wbmbitspixel" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_WBMPLANES, "\\wbmplanes" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_WBMWIDTHBYTES, "\\wbmwidthbytes" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_WIDOWCTRL, "\\widowctrl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_WMETAFILE, "\\wmetafile" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_XE, "\\xe" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_YR, "\\yr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOBRKHYPH, "\\_" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FORMULA, "\\|" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOBREAK, "\\~" ); + + +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AB, "\\ab" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ACAPS, "\\acaps" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ACF, "\\acf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ADDITIVE, "\\additive" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ADN, "\\adn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AENDDOC, "\\aenddoc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AENDNOTES, "\\aendnotes" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AEXPND, "\\aexpnd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AF, "\\af" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFS, "\\afs" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNBJ, "\\aftnbj" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNCN, "\\aftncn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNALC, "\\aftnnalc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNAR, "\\aftnnar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNAUC, "\\aftnnauc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNCHI, "\\aftnnchi" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNRLC, "\\aftnnrlc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNRUC, "\\aftnnruc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNRESTART, "\\aftnrestart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNRSTCONT, "\\aftnrstcont" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNSEP, "\\aftnsep" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNSEPC, "\\aftnsepc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNSTART, "\\aftnstart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNTJ, "\\aftntj" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AI, "\\ai" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ALANG, "\\alang" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ALLPROT, "\\allprot" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ANNOTPROT, "\\annotprot" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AOUTL, "\\aoutl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ASCAPS, "\\ascaps" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ASHAD, "\\ashad" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ASTRIKE, "\\astrike" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ATNAUTHOR, "\\atnauthor" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ATNICN, "\\atnicn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ATNREF, "\\atnref" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ATNTIME, "\\atntime" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ATRFEND, "\\atrfend" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ATRFSTART, "\\atrfstart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AUL, "\\aul" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AULD, "\\auld" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AULDB, "\\auldb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AULNONE, "\\aulnone" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AULW, "\\aulw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AUP, "\\aup" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BKMKPUB, "\\bkmkpub" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRDASH, "\\brdrdash" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRKFRM, "\\brkfrm" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CCHS, "\\cchs" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CPG, "\\cpg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CS, "\\cs" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CVMME, "\\cvmme" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DATAFIELD, "\\datafield" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DO, "\\do" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DOBXCOLUMN, "\\dobxcolumn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DOBXMARGIN, "\\dobxmargin" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DOBXPAGE, "\\dobxpage" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DOBYMARGIN, "\\dobymargin" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DOBYPAGE, "\\dobypage" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DOBYPARA, "\\dobypara" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DODHGT, "\\dodhgt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DOLOCK, "\\dolock" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPAENDHOL, "\\dpaendhol" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPAENDL, "\\dpaendl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPAENDSOL, "\\dpaendsol" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPAENDW, "\\dpaendw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPARC, "\\dparc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPARCFLIPX, "\\dparcflipx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPARCFLIPY, "\\dparcflipy" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPASTARTHOL, "\\dpastarthol" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPASTARTL, "\\dpastartl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPASTARTSOL, "\\dpastartsol" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPASTARTW, "\\dpastartw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCALLOUT, "\\dpcallout" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOA, "\\dpcoa" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOACCENT, "\\dpcoaccent" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOBESTFIT, "\\dpcobestfit" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOBORDER, "\\dpcoborder" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCODABS, "\\dpcodabs" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCODBOTTOM, "\\dpcodbottom" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCODCENTER, "\\dpcodcenter" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCODTOP, "\\dpcodtop" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOLENGTH, "\\dpcolength" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOMINUSX, "\\dpcominusx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOMINUSY, "\\dpcominusy" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOOFFSET, "\\dpcooffset" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOSMARTA, "\\dpcosmarta" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOTDOUBLE, "\\dpcotdouble" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOTRIGHT, "\\dpcotright" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOTSINGLE, "\\dpcotsingle" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOTTRIPLE, "\\dpcottriple" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCOUNT, "\\dpcount" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPELLIPSE, "\\dpellipse" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPENDGROUP, "\\dpendgroup" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPFILLBGCB, "\\dpfillbgcb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPFILLBGCG, "\\dpfillbgcg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPFILLBGCR, "\\dpfillbgcr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPFILLBGGRAY, "\\dpfillbggray" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPFILLBGPAL, "\\dpfillbgpal" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPFILLFGCB, "\\dpfillfgcb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPFILLFGCG, "\\dpfillfgcg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPFILLFGCR, "\\dpfillfgcr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPFILLFGGRAY, "\\dpfillfggray" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPFILLFGPAL, "\\dpfillfgpal" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPFILLPAT, "\\dpfillpat" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPGROUP, "\\dpgroup" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINE, "\\dpline" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINECOB, "\\dplinecob" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINECOG, "\\dplinecog" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINECOR, "\\dplinecor" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINEDADO, "\\dplinedado" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINEDADODO, "\\dplinedadodo" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINEDASH, "\\dplinedash" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINEDOT, "\\dplinedot" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINEGRAY, "\\dplinegray" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINEHOLLOW, "\\dplinehollow" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINEPAL, "\\dplinepal" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINESOLID, "\\dplinesolid" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPLINEW, "\\dplinew" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPPOLYCOUNT, "\\dppolycount" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPPOLYGON, "\\dppolygon" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPPOLYLINE, "\\dppolyline" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPPTX, "\\dpptx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPPTY, "\\dppty" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPRECT, "\\dprect" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPROUNDR, "\\dproundr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPSHADOW, "\\dpshadow" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPSHADX, "\\dpshadx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPSHADY, "\\dpshady" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPTXBX, "\\dptxbx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPTXBXMAR, "\\dptxbxmar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPTXBXTEXT, "\\dptxbxtext" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPX, "\\dpx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPXSIZE, "\\dpxsize" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPY, "\\dpy" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPYSIZE, "\\dpysize" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DS, "\\ds" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_EMSPACE, "\\emspace" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ENSPACE, "\\enspace" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FBIDI, "\\fbidi" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FET, "\\fet" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FID, "\\fid" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FILE, "\\file" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FILETBL, "\\filetbl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLDALT, "\\fldalt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FNETWORK, "\\fnetwork" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FONTEMB, "\\fontemb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FONTFILE, "\\fontfile" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FORMDISP, "\\formdisp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FORMPROT, "\\formprot" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FORMSHADE, "\\formshade" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FOSNUM, "\\fosnum" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FRELATIVE, "\\frelative" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNALT, "\\ftnalt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNIL, "\\ftnil" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNALC, "\\ftnnalc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNAR, "\\ftnnar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNAUC, "\\ftnnauc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNCHI, "\\ftnnchi" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNRLC, "\\ftnnrlc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNRUC, "\\ftnnruc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNRSTCONT, "\\ftnrstcont" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNRSTPG, "\\ftnrstpg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTTRUETYPE, "\\fttruetype" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FVALIDDOS, "\\fvaliddos" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FVALIDHPFS, "\\fvalidhpfs" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FVALIDMAC, "\\fvalidmac" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FVALIDNTFS, "\\fvalidntfs" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HYPHAUTO, "\\hyphauto" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HYPHCAPS, "\\hyphcaps" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HYPHCONSEC, "\\hyphconsec" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HYPHPAR, "\\hyphpar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LINKSELF, "\\linkself" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LINKSTYLES, "\\linkstyles" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LTRCH, "\\ltrch" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LTRDOC, "\\ltrdoc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LTRMARK, "\\ltrmark" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LTRPAR, "\\ltrpar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LTRROW, "\\ltrrow" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LTRSECT, "\\ltrsect" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOCOLBAL, "\\nocolbal" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOEXTRASPRL, "\\noextrasprl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOTABIND, "\\notabind" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOWIDCTLPAR, "\\nowidctlpar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJALIAS, "\\objalias" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJALIGN, "\\objalign" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJAUTLINK, "\\objautlink" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJCLASS, "\\objclass" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJCROPB, "\\objcropb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJCROPL, "\\objcropl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJCROPR, "\\objcropr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJCROPT, "\\objcropt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJDATA, "\\objdata" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJECT, "\\object" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJEMB, "\\objemb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJH, "\\objh" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJICEMB, "\\objicemb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJLINK, "\\objlink" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJLOCK, "\\objlock" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJNAME, "\\objname" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJPUB, "\\objpub" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJSCALEX, "\\objscalex" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJSCALEY, "\\objscaley" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJSECT, "\\objsect" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJSETSIZE, "\\objsetsize" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJSUB, "\\objsub" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJTIME, "\\objtime" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJTRANSY, "\\objtransy" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJUPDATE, "\\objupdate" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJW, "\\objw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OTBLRUL, "\\otblrul" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNHN, "\\pgnhn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNHNSC, "\\pgnhnsc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNHNSH, "\\pgnhnsh" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNHNSM, "\\pgnhnsm" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNHNSN, "\\pgnhnsn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNHNSP, "\\pgnhnsp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICBMP, "\\picbmp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICBPP, "\\picbpp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PN, "\\pn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNACROSS, "\\pnacross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNB, "\\pnb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNCAPS, "\\pncaps" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNCARD, "\\pncard" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNCF, "\\pncf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNDEC, "\\pndec" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNF, "\\pnf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNFS, "\\pnfs" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNHANG, "\\pnhang" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNI, "\\pni" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNINDENT, "\\pnindent" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNLCLTR, "\\pnlcltr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNLCRM, "\\pnlcrm" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNLVL, "\\pnlvl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNLVLBLT, "\\pnlvlblt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNLVLBODY, "\\pnlvlbody" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNLVLCONT, "\\pnlvlcont" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNNUMONCE, "\\pnnumonce" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNORD, "\\pnord" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNORDT, "\\pnordt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNPREV, "\\pnprev" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNQC, "\\pnqc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNQL, "\\pnql" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNQR, "\\pnqr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNRESTART, "\\pnrestart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNSCAPS, "\\pnscaps" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNSECLVL, "\\pnseclvl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNSP, "\\pnsp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNSTART, "\\pnstart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNSTRIKE, "\\pnstrike" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNTEXT, "\\pntext" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNTXTA, "\\pntxta" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNTXTB, "\\pntxtb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNUCLTR, "\\pnucltr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNUCRM, "\\pnucrm" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNUL, "\\pnul" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNULD, "\\pnuld" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNULDB, "\\pnuldb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNULNONE, "\\pnulnone" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNULW, "\\pnulw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PRCOLBL, "\\prcolbl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PRINTDATA, "\\printdata" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PSZ, "\\psz" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PUBAUTO, "\\pubauto" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RESULT, "\\result" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_REVAUTH, "\\revauth" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_REVDTTM, "\\revdttm" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_REVPROT, "\\revprot" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_REVTBL, "\\revtbl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RSLTBMP, "\\rsltbmp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RSLTMERGE, "\\rsltmerge" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RSLTPICT, "\\rsltpict" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RSLTRTF, "\\rsltrtf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RSLTTXT, "\\rslttxt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RTLCH, "\\rtlch" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RTLDOC, "\\rtldoc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RTLMARK, "\\rtlmark" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RTLPAR, "\\rtlpar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RTLROW, "\\rtlrow" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_RTLSECT, "\\rtlsect" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SEC, "\\sec" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SECTNUM, "\\sectnum" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SECTUNLOCKED, "\\sectunlocked" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SLMULT, "\\slmult" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SOFTCOL, "\\softcol" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SOFTLHEIGHT, "\\softlheight" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SOFTLINE, "\\softline" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SOFTPAGE, "\\softpage" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SPRSSPBF, "\\sprsspbf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SPRSTSP, "\\sprstsp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SUBDOCUMENT, "\\subdocument" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SWPBDR, "\\swpbdr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TCN, "\\tcn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRANSMF, "\\transmf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRBRDRB, "\\trbrdrb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRBRDRH, "\\trbrdrh" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRBRDRL, "\\trbrdrl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRBRDRR, "\\trbrdrr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRBRDRT, "\\trbrdrt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRBRDRV, "\\trbrdrv" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRHDR, "\\trhdr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRKEEP, "\\trkeep" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRPADDB, "\\trpaddb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRPADDL, "\\trpaddl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRPADDR, "\\trpaddr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRPADDT, "\\trpaddt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRPADDFB, "\\trpaddfb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRPADDFL, "\\trpaddfl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRPADDFR, "\\trpaddfr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRPADDFT, "\\trpaddft" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_WRAPTRSP, "\\wraptrsp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_XEF, "\\xef" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ZWJ, "\\zwj" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ZWNJ, "\\zwnj" ); + +// neue Tokens zur 1.5 +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ABSLOCK, "\\abslock" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ADJUSTRIGHT, "\\adjustright" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNCHOSUNG, "\\aftnnchosung" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNCNUM, "\\aftnncnum" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNDBAR, "\\aftnndbar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNDBNUM, "\\aftnndbnum" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNDBNUMD, "\\aftnndbnumd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNDBNUMK, "\\aftnndbnumk" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNDBNUMT, "\\aftnndbnumt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNGANADA, "\\aftnnganada" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNGBNUM, "\\aftnngbnum" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNGBNUMD, "\\aftnngbnumd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNGBNUMK, "\\aftnngbnumk" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNGBNUML, "\\aftnngbnuml" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNZODIAC, "\\aftnnzodiac" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNZODIACD, "\\aftnnzodiacd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_AFTNNZODIACL, "\\aftnnzodiacl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ANIMTEXT, "\\animtext" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ANSICPG, "\\ansicpg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BACKGROUND, "\\background" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BDBFHDR, "\\bdbfhdr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BLIPTAG, "\\bliptag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BLIPUID, "\\blipuid" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BLIPUPI, "\\blipupi" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRART, "\\brdrart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRDASHD, "\\brdrdashd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRDASHDD, "\\brdrdashdd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRDASHDOTSTR, "\\brdrdashdotstr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRDASHSM, "\\brdrdashsm" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDREMBOSS, "\\brdremboss" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRENGRAVE, "\\brdrengrave" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRFRAME, "\\brdrframe" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRTHTNLG, "\\brdrthtnlg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRTHTNMG, "\\brdrthtnmg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRTHTNSG, "\\brdrthtnsg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRTNTHLG, "\\brdrtnthlg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRTNTHMG, "\\brdrtnthmg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRTNTHSG, "\\brdrtnthsg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRTNTHTNLG, "\\brdrtnthtnlg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRTNTHTNMG, "\\brdrtnthtnmg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRTNTHTNSG, "\\brdrtnthtnsg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRTRIPLE, "\\brdrtriple" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRWAVY, "\\brdrwavy" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDRWAVYDB, "\\brdrwavydb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CATEGORY, "\\category" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CGRID, "\\cgrid" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHARSCALEX, "\\charscalex" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBGBDIAG, "\\chbgbdiag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBGCROSS, "\\chbgcross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBGDCROSS, "\\chbgdcross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBGDKBDIAG, "\\chbgdkbdiag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBGDKCROSS, "\\chbgdkcross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBGDKDCROSS, "\\chbgdkdcross" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBGDKFDIAG, "\\chbgdkfdiag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBGDKHORIZ, "\\chbgdkhoriz" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBGDKVERT, "\\chbgdkvert" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBGFDIAG, "\\chbgfdiag" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBGHORIZ, "\\chbghoriz" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBGVERT, "\\chbgvert" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHBRDR, "\\chbrdr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHCBPAT, "\\chcbpat" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHCFPAT, "\\chcfpat" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CHSHDNG, "\\chshdng" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLPADL, "\\clpadl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLPADT, "\\clpadt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLPADB, "\\clpadb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLPADR, "\\clpadr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLPADFL, "\\clpadfl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLPADFT, "\\clpadft" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLPADFB, "\\clpadfb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLPADFR, "\\clpadfr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLTXLRTB, "\\cltxlrtb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLTXTBRL, "\\cltxtbrl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLVERTALB, "\\clvertalb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLVERTALC, "\\clvertalc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLVERTALT, "\\clvertalt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLVMGF, "\\clvmgf" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLVMRG, "\\clvmrg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLTXTBRLV, "\\cltxtbrlv" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLTXBTLR, "\\cltxbtlr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CLTXLRTBV, "\\cltxlrtbv" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_COMPANY, "\\company" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CRAUTH, "\\crauth" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_CRDATE, "\\crdate" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DATE, "\\date" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DEFLANGFE, "\\deflangfe" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DFRAUTH, "\\dfrauth" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DFRDATE, "\\dfrdate" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DFRSTART, "\\dfrstart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DFRSTOP, "\\dfrstop" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DFRXST, "\\dfrxst" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DGMARGIN, "\\dgmargin" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DNTBLNSBDB, "\\dntblnsbdb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DOCTYPE, "\\doctype" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DOCVAR, "\\docvar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DPCODESCENT, "\\dpcodescent" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_EMBO, "\\embo" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_EMFBLIP, "\\emfblip" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_EXPSHRTN, "\\expshrtn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FAAUTO, "\\faauto" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FBIAS, "\\fbias" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFDEFRES, "\\ffdefres" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFDEFTEXT, "\\ffdeftext" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFENTRYMCR, "\\ffentrymcr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFEXITMCR, "\\ffexitmcr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFFORMAT, "\\ffformat" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFHASLISTBOX, "\\ffhaslistbox" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFHELPTEXT, "\\ffhelptext" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFHPS, "\\ffhps" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFL, "\\ffl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFMAXLEN, "\\ffmaxlen" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFNAME, "\\ffname" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFOWNHELP, "\\ffownhelp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFOWNSTAT, "\\ffownstat" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFPROT, "\\ffprot" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFRECALC, "\\ffrecalc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFRES, "\\ffres" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFSIZE, "\\ffsize" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFSTATTEXT, "\\ffstattext" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFTYPE, "\\fftype" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FFTYPETXT, "\\fftypetxt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLDTYPE, "\\fldtype" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FNAME, "\\fname" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FORMFIELD, "\\formfield" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FROMTEXT, "\\fromtext" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNCHOSUNG, "\\ftnnchosung" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNCNUM, "\\ftnncnum" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNDBAR, "\\ftnndbar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNDBNUM, "\\ftnndbnum" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNDBNUMD, "\\ftnndbnumd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNDBNUMK, "\\ftnndbnumk" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNDBNUMT, "\\ftnndbnumt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNGANADA, "\\ftnnganada" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNGBNUM, "\\ftnngbnum" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNGBNUMD, "\\ftnngbnumd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNGBNUMK, "\\ftnngbnumk" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNGBNUML, "\\ftnngbnuml" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNZODIAC, "\\ftnnzodiac" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNZODIACD, "\\ftnnzodiacd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FTNNZODIACL, "\\ftnnzodiacl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_G, "\\g" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_GCW, "\\gcw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_GRIDTBL, "\\gridtbl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HIGHLIGHT, "\\highlight" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HLFR, "\\hlfr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HLINKBASE, "\\hlinkbase" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HLLOC, "\\hlloc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HLSRC, "\\hlsrc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ILVL, "\\ilvl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_IMPR, "\\impr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_JPEGBLIP, "\\jpegblip" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELFOLLOW, "\\levelfollow" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELINDENT, "\\levelindent" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELJC, "\\leveljc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELLEGAL, "\\levellegal" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELNFC, "\\levelnfc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELNORESTART, "\\levelnorestart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELNUMBERS, "\\levelnumbers" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELOLD, "\\levelold" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELPREV, "\\levelprev" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELPREVSPACE, "\\levelprevspace" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELSPACE, "\\levelspace" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELSTARTAT, "\\levelstartat" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LEVELTEXT, "\\leveltext" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LINKVAL, "\\linkval" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LIST, "\\list" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTID, "\\listid" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTLEVEL, "\\listlevel" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTNAME, "\\listname" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTOVERRIDE, "\\listoverride" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTOVERRIDECOUNT, "\\listoverridecount" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTOVERRIDEFORMAT, "\\listoverrideformat" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTOVERRIDESTART, "\\listoverridestart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTOVERRIDETABLE, "\\listoverridetable" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTRESTARTHDN, "\\listrestarthdn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTSIMPLE, "\\listsimple" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTTABLE, "\\listtable" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTTEMPLATEID, "\\listtemplateid" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LISTTEXT, "\\listtext" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LS, "\\ls" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LYTEXCTTP, "\\lytexcttp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LYTPRTMET, "\\lytprtmet" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MANAGER, "\\manager" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_MSMCAP, "\\msmcap" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOFCHARSWS, "\\nofcharsws" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOLEAD, "\\nolead" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NONSHPPICT, "\\nonshppict" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOSECTEXPAND, "\\nosectexpand" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOSNAPLINEGRID, "\\nosnaplinegrid" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOSPACEFORUL, "\\nospaceforul" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOULTRLSPC, "\\noultrlspc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOXLATTOYEN, "\\noxlattoyen" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJATTPH, "\\objattph" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJHTML, "\\objhtml" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OBJOCX, "\\objocx" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLDLINEWRAP, "\\oldlinewrap" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OUTLINELEVEL, "\\outlinelevel" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OVERLAY, "\\overlay" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PANOSE, "\\panose" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGBRDRB, "\\pgbrdrb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGBRDRFOOT, "\\pgbrdrfoot" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGBRDRHEAD, "\\pgbrdrhead" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGBRDRL, "\\pgbrdrl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGBRDROPT, "\\pgbrdropt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGBRDRR, "\\pgbrdrr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGBRDRSNAP, "\\pgbrdrsnap" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGBRDRT, "\\pgbrdrt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNCHOSUNG, "\\pgnchosung" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNCNUM, "\\pgncnum" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNDBNUMK, "\\pgndbnumk" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNDBNUMT, "\\pgndbnumt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNGANADA, "\\pgnganada" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNGBNUM, "\\pgngbnum" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNGBNUMD, "\\pgngbnumd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNGBNUMK, "\\pgngbnumk" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNGBNUML, "\\pgngbnuml" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNZODIAC, "\\pgnzodiac" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNZODIACD, "\\pgnzodiacd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGNZODIACL, "\\pgnzodiacl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PICPROP, "\\picprop" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNAIUEO, "\\pnaiueo" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNAIUEOD, "\\pnaiueod" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNCHOSUNG, "\\pnchosung" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNDBNUMD, "\\pndbnumd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNDBNUMK, "\\pndbnumk" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNDBNUML, "\\pndbnuml" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNDBNUMT, "\\pndbnumt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNGANADA, "\\pnganada" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNGBLIP, "\\pngblip" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNGBNUM, "\\pngbnum" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNGBNUMD, "\\pngbnumd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNGBNUMK, "\\pngbnumk" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNGBNUML, "\\pngbnuml" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNRAUTH, "\\pnrauth" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNRDATE, "\\pnrdate" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNRNFC, "\\pnrnfc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNRNOT, "\\pnrnot" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNRPNBR, "\\pnrpnbr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNRRGB, "\\pnrrgb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNRSTART, "\\pnrstart" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNRSTOP, "\\pnrstop" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNRXST, "\\pnrxst" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNZODIAC, "\\pnzodiac" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNZODIACD, "\\pnzodiacd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PNZODIACL, "\\pnzodiacl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LFOLEVEL, "\\lfolevel" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSYIN, "\\posyin" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_POSYOUT, "\\posyout" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PRIVATE, "\\private" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PROPNAME, "\\propname" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PROPTYPE, "\\proptype" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_REVAUTHDEL, "\\revauthdel" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_REVDTTMDEL, "\\revdttmdel" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SAUTOUPD, "\\sautoupd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SECTDEFAULTCL, "\\sectdefaultcl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SECTEXPAND, "\\sectexpand" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SECTLINEGRID, "\\sectlinegrid" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SECTSPECIFYCL, "\\sectspecifycl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SECTSPECIFYL, "\\sectspecifyl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHIDDEN, "\\shidden" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPBOTTOM, "\\shpbottom" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPBXCOLUMN, "\\shpbxcolumn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPBXMARGIN, "\\shpbxmargin" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPBXPAGE, "\\shpbxpage" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPBYMARGIN, "\\shpbymargin" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPBYPAGE, "\\shpbypage" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPBYPARA, "\\shpbypara" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPFBLWTXT, "\\shpfblwtxt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPFHDR, "\\shpfhdr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPGRP, "\\shpgrp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPLEFT, "\\shpleft" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPLID, "\\shplid" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPLOCKANCHOR, "\\shplockanchor" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPPICT, "\\shppict" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPRIGHT, "\\shpright" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPRSLT, "\\shprslt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPTOP, "\\shptop" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPTXT, "\\shptxt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPWRK, "\\shpwrk" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPWR, "\\shpwr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPZ, "\\shpz" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SPRSBSP, "\\sprsbsp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SPRSLNSP, "\\sprslnsp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SPRSTSM, "\\sprstsm" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_STATICVAL, "\\staticval" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_STEXTFLOW, "\\stextflow" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_STRIKED, "\\striked" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SUBFONTBYSIZE, "\\subfontbysize" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TCELLD, "\\tcelld" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TIME, "\\time" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TRUNCATEFONTHEIGHT, "\\truncatefontheight" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_UC, "\\uc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_UD, "\\ud" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULDASH, "\\uldash" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULDASHD, "\\uldashd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULDASHDD, "\\uldashdd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULTH, "\\ulth" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULWAVE, "\\ulwave" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULC, "\\ulc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_U, "\\u" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_UPR, "\\upr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_USERPROPS, "\\userprops" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_VIEWKIND, "\\viewkind" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_VIEWSCALE, "\\viewscale" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_VIEWZK, "\\viewzk" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_WIDCTLPAR, "\\widctlpar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_WINDOWCAPTION, "\\windowcaption" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_WPEQN, "\\wpeqn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_WPJST, "\\wpjst" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_WPSP, "\\wpsp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_YXE, "\\yxe" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FRMTXLRTB, "\\frmtxlrtb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FRMTXTBRL, "\\frmtxtbrl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FRMTXBTLR, "\\frmtxbtlr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FRMTXLRTBV, "\\frmtxlrtbv" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FRMTXTBRLV, "\\frmtxtbrlv" ); + +// MS-2000 Tokens +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULTHD, "\\ulthd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULTHDASH, "\\ulthdash" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULLDASH, "\\ulldash" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULTHLDASH, "\\ulthldash" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULTHDASHD, "\\ulthdashd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULTHDASHDD, "\\ulthdashdd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULHWAVE, "\\ulhwave" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ULULDBWAVE, "\\ululdbwave" ); + +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LOCH, "\\loch" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HICH, "\\hich" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DBCH, "\\dbch" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_LANGFE, "\\langfe" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ADEFLANG, "\\adeflang" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ADEFF, "\\adeff" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ACCNONE, "\\accnone" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ACCDOT, "\\accdot" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ACCCOMMA, "\\acccomma" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TWOINONE, "\\twoinone" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HORZVERT, "\\horzvert" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FAHANG, "\\fahang" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FAVAR, "\\favar" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FACENTER, "\\facenter" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FAROMAN, "\\faroman" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FAFIXED, "\\fafixed" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOCWRAP, "\\nocwrap" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_NOOVERFLOW,"\\nooverflow" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_ASPALPHA, "\\aspalpha" ); + +// SWG spezifische Attribute +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_GRFALIGNV, "\\grfalignv" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_GRFALIGNH, "\\grfalignh" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_GRFMIRROR, "\\grfmirror" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HEADERYB, "\\headeryb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HEADERXL, "\\headerxl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HEADERXR, "\\headerxr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FOOTERYT, "\\footeryt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FOOTERXL, "\\footerxl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FOOTERXR, "\\footerxr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HEADERYH, "\\headeryh" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FOOTERYH, "\\footeryh" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BALANCEDCOLUMN, "\\swcolmnblnc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_UPDNPROP, "\\updnprop" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PRTDATA, "\\prtdata" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BKMKKEY, "\\bkmkkey" ); + +// Attribute fuer die freifliegenden Rahmen +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLYPRINT, "\\flyprint" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLYOPAQUE, "\\flyopaque" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLYPRTCTD, "\\flyprtctd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLYMAINCNT, "\\flymaincnt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLYVERT, "\\flyvert" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLYHORZ, "\\flyhorz" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DFRMTXTL, "\\dfrmtxtl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DFRMTXTR, "\\dfrmtxtr" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DFRMTXTU, "\\dfrmtxtu" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_DFRMTXTW, "\\dfrmtxtw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLYANCHOR, "\\flyanchor" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLYCNTNT, "\\flycntnt" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLYCOLUMN, "\\flycolumn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLYPAGE, "\\flypage" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_FLYINPARA, "\\flyinpara" ); + +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDBOX, "\\brdbox" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDLNCOL, "\\brdlncol" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDLNIN, "\\brdlnin" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDLNOUT, "\\brdlnout" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_BRDLNDIST, "\\brdlndist" ); + +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHADOW, "\\shadow" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHDWDIST, "\\shdwdist" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHDWSTYLE, "\\shdwstyle" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHDWCOL, "\\shdwcol" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHDWFCOL, "\\shdwfcol" ); + + +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGDSCTBL, "\\pgdsctbl" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGDSC, "\\pgdsc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGDSCUSE, "\\pgdscuse" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGDSCNXT, "\\pgdscnxt" ); + +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HYPHEN, "\\hyphen" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HYPHLEAD, "\\hyphlead" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HYPHTRAIL, "\\hyphtrail" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_HYPHMAX, "\\hyphmax" ); + +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_TLSWG, "\\tlswg" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGBRK, "\\pgbrk" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_PGDSCNO, "\\pgdscno" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SOUTLVL, "\\soutlvl" ); + +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHP, "\\shp" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SN, "\\sn" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SV, "\\sv" ); +/* +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPLEFT, "\\shpleft" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPTOP, "\\shptop" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPBOTTOM, "\\shpbottom" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_SHPRIGHT, "\\shpright" ); +*/ + +// Support for overline attributes +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OL, "\\ol" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLD, "\\old" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLDB, "\\oldb" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLNONE, "\\olnone" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLW, "\\olw" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLDASH, "\\oldash" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLDASHD, "\\oldashd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLDASHDD, "\\oldashdd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLTH, "\\olth" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLWAVE, "\\olwave" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLC, "\\olc" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLTHD, "\\olthd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLTHDASH, "\\olthdash" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLLDASH, "\\olldash" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLTHLDASH, "\\olthldash" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLTHDASHD, "\\olthdashd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLTHDASHDD, "\\olthdashdd" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLHWAVE, "\\olhwave" ); +sal_Char const SVTOOLS_CONSTASCII_DEF( sRTF_OLOLDBWAVE, "\\ololdbwave" ); + +/* vi:set tabstop=4 shiftwidth=4 expandtab: */ diff --git a/svtools/source/svrtf/svparser.cxx b/svtools/source/svrtf/svparser.cxx index f58a5d11a3c6..2af7af71adac 100644 --- a/svtools/source/svrtf/svparser.cxx +++ b/svtools/source/svrtf/svparser.cxx @@ -37,7 +37,7 @@ #include #include #define _SVSTDARR_USHORTS -#include +#include #include #include @@ -66,7 +66,7 @@ struct SvParser_Impl rtl_TextToUnicodeConverter hConv; rtl_TextToUnicodeContext hContext; -#ifndef PRODUCT +#ifdef DBG_UTIL SvFileStream aOut; #endif @@ -100,7 +100,7 @@ SvParser::SvParser( SvStream& rIn, BYTE nStackSize ) pTokenStack = new TokenStackType[ nTokenStackSize ]; pTokenStackPos = pTokenStack; -#ifndef PRODUCT +#ifdef DBG_UTIL // wenn die Datei schon existiert, dann Anhaengen: if( !pImplData ) @@ -119,7 +119,7 @@ SvParser::SvParser( SvStream& rIn, BYTE nStackSize ) SvParser::~SvParser() { -#ifndef PRODUCT +#ifdef DBG_UTIL if( pImplData->aOut.IsOpen() ) pImplData->aOut << "\n\n >>>>>>>>>>>>>>> Dump Ende <<<<<<<<<<<<<<<\n"; pImplData->aOut.Close(); @@ -417,7 +417,7 @@ sal_Unicode SvParser::GetNextChar() return sal_Unicode(EOF); } -#ifndef PRODUCT +#ifdef DBG_UTIL if( pImplData->aOut.IsOpen() ) pImplData->aOut << ByteString::ConvertFromUnicode( c, RTL_TEXTENCODING_MS_1251 ); @@ -666,4 +666,64 @@ IMPL_STATIC_LINK( SvParser, NewDataRead, void*, EMPTYARG ) return 0; } +/*======================================================================== + * + * SvKeyValueIterator. + * + *======================================================================*/ +SV_DECL_PTRARR_DEL(SvKeyValueList_Impl, SvKeyValue*, 0, 4) +SV_IMPL_PTRARR(SvKeyValueList_Impl, SvKeyValue*); + +/* + * SvKeyValueIterator. + */ +SvKeyValueIterator::SvKeyValueIterator (void) + : m_pList (new SvKeyValueList_Impl), + m_nPos (0) +{ +} + +/* + * ~SvKeyValueIterator. + */ +SvKeyValueIterator::~SvKeyValueIterator (void) +{ + delete m_pList; +} + +/* + * GetFirst. + */ +BOOL SvKeyValueIterator::GetFirst (SvKeyValue &rKeyVal) +{ + m_nPos = m_pList->Count(); + return GetNext (rKeyVal); +} + +/* + * GetNext. + */ +BOOL SvKeyValueIterator::GetNext (SvKeyValue &rKeyVal) +{ + if (m_nPos > 0) + { + rKeyVal = *m_pList->GetObject(--m_nPos); + return TRUE; + } + else + { + // Nothing to do. + return FALSE; + } +} + +/* + * Append. + */ +void SvKeyValueIterator::Append (const SvKeyValue &rKeyVal) +{ + SvKeyValue *pKeyVal = new SvKeyValue (rKeyVal); + m_pList->C40_INSERT(SvKeyValue, pKeyVal, m_pList->Count()); +} + /* vi:set tabstop=4 shiftwidth=4 expandtab: */ diff --git a/svtools/source/table/defaultinputhandler.cxx b/svtools/source/table/defaultinputhandler.cxx new file mode 100644 index 000000000000..17ee0222857f --- /dev/null +++ b/svtools/source/table/defaultinputhandler.cxx @@ -0,0 +1,210 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" + +#include "svtools/table/defaultinputhandler.hxx" +#include "svtools/table/abstracttablecontrol.hxx" + +#include +#include +#include +#include "svtools/table/tabledatawindow.hxx" + +//........................................................................ +namespace svt { namespace table +{ +//....................................................................... + + struct DefaultInputHandler_Impl + { + }; + + //==================================================================== + //= DefaultInputHandler + //==================================================================== + //-------------------------------------------------------------------- + DefaultInputHandler::DefaultInputHandler() + :m_pImpl( new DefaultInputHandler_Impl ) + { + } + + //-------------------------------------------------------------------- + DefaultInputHandler::~DefaultInputHandler() + { + DELETEZ( m_pImpl ); + } + + //-------------------------------------------------------------------- + bool DefaultInputHandler::MouseMove( IAbstractTableControl& _rControl, const MouseEvent& _rMEvt ) + { + (void)_rControl; + (void)_rMEvt; + return false; + } + + //-------------------------------------------------------------------- + bool DefaultInputHandler::MouseButtonDown( IAbstractTableControl& _rControl, const MouseEvent& _rMEvt ) + { + bool bHandled = false; + Point aPoint = _rMEvt.GetPosPixel(); + if(_rControl.isClickInVisibleArea(aPoint)) + { + if(_rControl.getSelEngine()->GetSelectionMode() == NO_SELECTION) + { + LoseFocus(_rControl); + _rControl.setCursorAtCurrentCell(aPoint); + bHandled = true; + } + else + { + bHandled = _rControl.getSelEngine()->SelMouseButtonDown(_rMEvt); + } + } + return bHandled; + } + + //-------------------------------------------------------------------- + bool DefaultInputHandler::MouseButtonUp( IAbstractTableControl& _rControl, const MouseEvent& _rMEvt ) + { + bool bHandled = false; + Point aPoint = _rMEvt.GetPosPixel(); + if(_rControl.isClickInVisibleArea(aPoint)) + { + if(_rControl.getSelEngine()->GetSelectionMode() == NO_SELECTION) + { + GetFocus(_rControl); + _rControl.setCursorAtCurrentCell(aPoint); + bHandled = true; + } + else + bHandled = _rControl.getSelEngine()->SelMouseButtonUp(_rMEvt); + } + return bHandled; + } + + //-------------------------------------------------------------------- + bool DefaultInputHandler::KeyInput( IAbstractTableControl& _rControl, const KeyEvent& rKEvt ) + { + bool bHandled = false; + + const KeyCode& rKeyCode = rKEvt.GetKeyCode(); + USHORT nKeyCode = rKeyCode.GetCode(); + + struct _ActionMapEntry + { + USHORT nKeyCode; + USHORT nKeyModifier; + TableControlAction eAction; + } + static aKnownActions[] = { + { KEY_DOWN, 0, cursorDown }, + { KEY_UP, 0, cursorUp }, + { KEY_LEFT, 0, cursorLeft }, + { KEY_RIGHT, 0, cursorRight }, + { KEY_HOME, 0, cursorToLineStart }, + { KEY_END, 0, cursorToLineEnd }, + { KEY_PAGEUP, 0, cursorPageUp }, + { KEY_PAGEDOWN, 0, cursorPageDown }, + { KEY_PAGEUP, KEY_MOD1, cursorToFirstLine }, + { KEY_PAGEDOWN, KEY_MOD1, cursorToLastLine }, + { KEY_HOME, KEY_MOD1, cursorTopLeft }, + { KEY_END, KEY_MOD1, cursorBottomRight }, + { KEY_SPACE, KEY_MOD1, cursorSelectRow }, + { KEY_UP, KEY_SHIFT, cursorSelectRowUp }, + { KEY_DOWN, KEY_SHIFT, cursorSelectRowDown }, + { KEY_END, KEY_SHIFT, cursorSelectRowAreaBottom }, + { KEY_HOME, KEY_SHIFT, cursorSelectRowAreaTop }, + + { 0, 0, invalidTableControlAction } + }; + + const _ActionMapEntry* pActions = aKnownActions; + for ( ; pActions->eAction != invalidTableControlAction; ++pActions ) + { + if ( ( pActions->nKeyCode == nKeyCode ) && ( pActions->nKeyModifier == rKeyCode.GetAllModifier() ) ) + { + bHandled = _rControl.dispatchAction( pActions->eAction ); + break; + } + } + + return bHandled; + } + + //-------------------------------------------------------------------- + bool DefaultInputHandler::GetFocus( IAbstractTableControl& _rControl ) + { + _rControl.showCursor(); + return false; // continue processing + } + + //-------------------------------------------------------------------- + bool DefaultInputHandler::LoseFocus( IAbstractTableControl& _rControl ) + { + _rControl.hideCursor(); + return false; // continue processing + } + + //-------------------------------------------------------------------- + bool DefaultInputHandler::RequestHelp( IAbstractTableControl& _rControl, const HelpEvent& _rHEvt ) + { + (void)_rControl; + (void)_rHEvt; + // TODO + return false; + } + + //-------------------------------------------------------------------- + bool DefaultInputHandler::Command( IAbstractTableControl& _rControl, const CommandEvent& _rCEvt ) + { + (void)_rControl; + (void)_rCEvt; + // TODO + return false; + } + + //-------------------------------------------------------------------- + bool DefaultInputHandler::PreNotify( IAbstractTableControl& _rControl, NotifyEvent& _rNEvt ) + { + (void)_rControl; + (void)_rNEvt; + // TODO + return false; + } + + //-------------------------------------------------------------------- + bool DefaultInputHandler::Notify( IAbstractTableControl& _rControl, NotifyEvent& _rNEvt ) + { + (void)_rControl; + (void)_rNEvt; + // TODO + return false; + } + +//........................................................................ +} } // namespace svt::table +//........................................................................ diff --git a/svtools/source/table/gridtablerenderer.cxx b/svtools/source/table/gridtablerenderer.cxx new file mode 100644 index 000000000000..2c4fda711009 --- /dev/null +++ b/svtools/source/table/gridtablerenderer.cxx @@ -0,0 +1,234 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" + +#include "svtools/table/gridtablerenderer.hxx" + +#include +#include + +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + + struct GridTableRenderer_Impl + { + ITableModel& rModel; + RowPos nCurrentRow; + + GridTableRenderer_Impl( ITableModel& _rModel ) + :rModel( _rModel ) + ,nCurrentRow( ROW_INVALID ) + { + } + }; + + //==================================================================== + //= GridTableRenderer + //==================================================================== + //-------------------------------------------------------------------- + GridTableRenderer::GridTableRenderer( ITableModel& _rModel ) + :m_pImpl( new GridTableRenderer_Impl( _rModel ) ) + { + } + + //-------------------------------------------------------------------- + GridTableRenderer::~GridTableRenderer() + { + DELETEZ( m_pImpl ); + } + + //-------------------------------------------------------------------- + RowPos GridTableRenderer::getCurrentRow() + { + return m_pImpl->nCurrentRow; + } + + //-------------------------------------------------------------------- + void GridTableRenderer::PaintHeaderArea( + OutputDevice& _rDevice, const Rectangle& _rArea, bool _bIsColHeaderArea, bool _bIsRowHeaderArea, + const StyleSettings& _rStyle ) + { + OSL_PRECOND( _bIsColHeaderArea || _bIsRowHeaderArea, + "GridTableRenderer::PaintHeaderArea: invalid area flags!" ); + + // fill the rows with alternating background colors + _rDevice.Push( PUSH_FILLCOLOR | PUSH_LINECOLOR ); + + _rDevice.SetLineColor(); + _rDevice.SetFillColor( _rStyle.GetDialogColor() ); + _rDevice.DrawRect( _rArea ); + + // delimiter lines at bottom/right + _rDevice.SetLineColor( _rStyle.GetDialogTextColor() ); + _rDevice.DrawLine( _rArea.BottomLeft(), _rArea.BottomRight() ); + _rDevice.DrawLine( _rArea.BottomRight(), _rArea.TopRight() ); + + _rDevice.Pop(); + (void)_bIsColHeaderArea; + (void)_bIsRowHeaderArea; + } + + //-------------------------------------------------------------------- + void GridTableRenderer::PaintColumnHeader( ColPos _nCol, bool _bActive, bool _bSelected, + OutputDevice& _rDevice, const Rectangle& _rArea, const StyleSettings& _rStyle ) + { + _rDevice.Push( PUSH_LINECOLOR ); + + _rDevice.SetLineColor( _rStyle.GetDialogTextColor() ); + _rDevice.DrawLine( _rArea.BottomRight(), _rArea.TopRight() ); + + String sHeaderText; + + PColumnModel pColumn = m_pImpl->rModel.getColumnModel( _nCol ); + DBG_ASSERT( !!pColumn, "GridTableRenderer::PaintColumnHeader: invalid column model object!" ); + if ( !!pColumn ) + sHeaderText = pColumn->getName(); + Color aRowBackground = _rStyle.GetFieldColor(); + if ( _bSelected ) + { + aRowBackground = COL_BLUE; + } + _rDevice.DrawText( _rArea, sHeaderText, TEXT_DRAW_LEFT | TEXT_DRAW_TOP ); + _rDevice.DrawLine( _rArea.BottomLeft(), _rArea.BottomRight() ); + _rDevice.Pop(); + + (void)_bActive; + // no special painting for the active column at the moment + + //(void)_bSelected; + // TODO: selection not yet implemented + } + + //-------------------------------------------------------------------- + void GridTableRenderer::PrepareRow( RowPos _nRow, bool _bActive, bool _bSelected, + OutputDevice& _rDevice, const Rectangle& _rRowArea, const StyleSettings& _rStyle ) + { + // remember the row for subsequent calls to the other ->ITableRenderer methods + m_pImpl->nCurrentRow = _nRow; + + // fill the rows with alternating background colors + _rDevice.Push( PUSH_FILLCOLOR | PUSH_LINECOLOR ); + + _rDevice.SetLineColor(); + + Color aRowBackground = _rStyle.GetFieldColor(); + + _rDevice.SetFillColor( aRowBackground ); + + _rDevice.DrawRect( _rRowArea ); + + // TODO: active? selected? + + _rDevice.Pop(); + (void) _bSelected; + (void)_bActive; + + // no special painting for the active row at the moment + + //(void)_bSelected; + // TODO: selection not yet implemented + } + + //-------------------------------------------------------------------- + void GridTableRenderer::PaintRowHeader( bool _bActive, bool _bSelected, OutputDevice& _rDevice, const Rectangle& _rArea, + const StyleSettings& _rStyle, rtl::OUString& _rText ) + { + _rDevice.Push( PUSH_FILLCOLOR | PUSH_LINECOLOR ); + + _rDevice.SetLineColor( _rStyle.GetDialogTextColor() ); + _rDevice.DrawLine( _rArea.BottomLeft(), _rArea.BottomRight() ); + _rDevice.DrawText( _rArea, _rText, TEXT_DRAW_LEFT); + // TODO: active? selected? + (void)_bActive; + (void)_bSelected; + + _rDevice.Pop(); + } + + //-------------------------------------------------------------------- + void GridTableRenderer::PaintCell( ColPos _nColumn, bool _bSelected, bool _bActive, + OutputDevice& _rDevice, const Rectangle& _rArea, const StyleSettings& _rStyle, rtl::OUString& _rText ) + { + _rDevice.Push( PUSH_LINECOLOR ); + + // draw the grid + _rDevice.SetLineColor( COL_LIGHTGRAY ); + // TODO: the LIGHTGRAY should probably be a property/setting + _rDevice.DrawLine( _rArea.BottomRight(), _rArea.TopRight() ); + _rDevice.DrawLine( _rArea.BottomLeft(), _rArea.BottomRight() ); + + { + // TODO: remove those temporary place holders + Rectangle aRect( _rArea ); + ++aRect.Left(); --aRect.Right(); + ++aRect.Top(); --aRect.Bottom(); + + String sText; + if(_bSelected) + { + Color aRed(COL_BLUE); + _rDevice.SetFillColor( aRed ); + _rDevice.SetTextColor(COL_WHITE); + } + _rDevice.DrawRect( _rArea ); + (void)_nColumn; + _rDevice.DrawText( aRect, _rText, TEXT_DRAW_LEFT | TEXT_DRAW_TOP); + } + if(_bSelected) + { + _rDevice.SetFillColor( _rStyle.GetFieldColor() ); + _rDevice.SetTextColor(COL_BLACK); + } + + _rDevice.Pop(); + + (void)_bActive; +// // no special painting for the active cell at the moment + (void)_rStyle; +// // TODO: do we need this? + } + + //-------------------------------------------------------------------- + void GridTableRenderer::ShowCellCursor( Window& _rView, const Rectangle& _rCursorRect) + { + _rView.ShowFocus( _rCursorRect ); + } + + //-------------------------------------------------------------------- + void GridTableRenderer::HideCellCursor( Window& _rView, const Rectangle& _rCursorRect) + { + (void)_rCursorRect; + _rView.HideFocus(); + + } + +//........................................................................ +} } // namespace svt::table +//........................................................................ + diff --git a/svtools/source/table/makefile.mk b/svtools/source/table/makefile.mk new file mode 100644 index 000000000000..8feb7fee10d8 --- /dev/null +++ b/svtools/source/table/makefile.mk @@ -0,0 +1,59 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.16 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/.. + +ENABLE_EXCEPTIONS=TRUE +PRJNAME=svtools +TARGET=table +#LIBTARGET=NO + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/util$/svt.pmk + +# --- Files -------------------------------------------------------- + +SLOFILES=\ + $(SLO)$/tablecontrol.obj \ + $(SLO)$/tablecontrol_impl.obj \ + $(SLO)$/gridtablerenderer.obj \ + $(SLO)$/tablegeometry.obj \ + $(SLO)$/defaultinputhandler.obj \ + $(SLO)$/tabledatawindow.obj + +#LIB1TARGET= $(SLB)$/$(TARGET).lib +#LIB1OBJFILES= $(SLOFILES) + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/svtools/source/table/tablecontrol.cxx b/svtools/source/table/tablecontrol.cxx new file mode 100644 index 000000000000..1d7b046ae94b --- /dev/null +++ b/svtools/source/table/tablecontrol.cxx @@ -0,0 +1,539 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" + +#include "svtools/table/tablecontrol.hxx" +#include "tablegeometry.hxx" +#include "tablecontrol_impl.hxx" +#include "svtools/table/tabledatawindow.hxx" +#include +#include + +using namespace ::com::sun::star::uno; +using ::com::sun::star::accessibility::XAccessible; +using namespace ::com::sun::star::accessibility; +using namespace ::com::sun::star::lang; +using namespace utl; +//using namespace rtl; +//........................................................................ +namespace svt { namespace table +{ + //==================================================================== + //= AccessibleTableControl_Impl + //==================================================================== + // ---------------------------------------------------------------------------- + Reference< XAccessible > AccessibleTableControl_Impl::getAccessibleTableHeader( AccessibleTableControlObjType _eObjType ) + { + if ( m_pAccessible && m_pAccessible->isAlive() ) + return m_pAccessible->getTableHeader( _eObjType ); + return NULL; + } + // ---------------------------------------------------------------------------- + Reference< XAccessible > AccessibleTableControl_Impl::getAccessibleTable( ) + { + if ( m_pAccessible && m_pAccessible->isAlive() ) + return m_pAccessible->getTable( ); + return NULL; + } + + //==================================================================== + //= TableControl + //==================================================================== + //-------------------------------------------------------------------- + TableControl::TableControl( Window* _pParent, WinBits _nStyle ) + :Control( _pParent, _nStyle ) + ,m_pImpl( new TableControl_Impl( *this ) ) + { + m_pImpl->getDataWindow()->SetMouseButtonDownHdl( LINK( this, TableControl, ImplMouseButtonDownHdl ) ); + m_pImpl->getDataWindow()->SetMouseButtonUpHdl( LINK( this, TableControl, ImplMouseButtonUpHdl ) ); + m_pAccessTable.reset(new ::svt::table::AccessibleTableControl_Impl()); + } + + //-------------------------------------------------------------------- + TableControl::~TableControl() + { + DELETEZ( m_pImpl ); + if ( m_pAccessTable->m_pAccessible ) + { + m_pAccessTable->m_pAccessible->dispose(); + } + } + + //-------------------------------------------------------------------- + void TableControl::GetFocus() + { + if ( !m_pImpl->getInputHandler()->GetFocus( *m_pImpl ) ) + { + Control::GetFocus(); + Control::GrabFocus(); + } + } + + //-------------------------------------------------------------------- + void TableControl::LoseFocus() + { + if ( !m_pImpl->getInputHandler()->LoseFocus( *m_pImpl ) ) + Control::LoseFocus(); + } + + //-------------------------------------------------------------------- + void TableControl::KeyInput( const KeyEvent& rKEvt ) + { + if ( !m_pImpl->getInputHandler()->KeyInput( *m_pImpl, rKEvt ) ) + Control::KeyInput( rKEvt ); + } + //-------------------------------------------------------------------- + void TableControl::Resize() + { + Control::Resize(); + m_pImpl->onResize(); + } + + //-------------------------------------------------------------------- + void TableControl::SetModel( PTableModel _pModel ) + { + m_pImpl->setModel( _pModel ); + } + + //-------------------------------------------------------------------- + PTableModel TableControl::GetModel() const + { + return m_pImpl->getModel(); + } + + //-------------------------------------------------------------------- + RowPos TableControl::GetTopRow() const + { + return m_pImpl->getTopRow(); + } + + //-------------------------------------------------------------------- + void TableControl::SetTopRow( RowPos _nRow ) + { + // TODO + (void)_nRow; + } + + //-------------------------------------------------------------------- + sal_Int32 TableControl::GetCurrentRow() const + { + return m_pImpl->getCurRow(); + } + + //-------------------------------------------------------------------- + sal_Int32 TableControl::GetCurrentColumn() const + { + return m_pImpl->getCurColumn(); + } + + //-------------------------------------------------------------------- + bool TableControl::GoTo( ColPos _nColumn, RowPos _nRow ) + { + return m_pImpl->goTo( _nColumn, _nRow ); + } + //-------------------------------------------------------------------- + sal_Bool TableControl::GoToCell(sal_Int32 _nColPos, sal_Int32 _nRowPos) + { + return m_pImpl->goTo( _nColPos, _nRowPos ); + } + //-------------------------------------------------------------------- + void TableControl::InvalidateDataWindow(RowPos _nRowStart, bool _bRemoved) + { + Rectangle _rRect; + if(_bRemoved) + return m_pImpl->invalidateRows(_nRowStart, _rRect); + else + return m_pImpl->invalidateRow(_nRowStart, _rRect); + } + //-------------------------------------------------------------------- + std::vector& TableControl::GetSelectedRows() + { + return m_pImpl->getSelectedRows(); + } + //-------------------------------------------------------------------- + void TableControl::removeSelectedRow(RowPos _nRowPos) + { + m_pImpl->removeSelectedRow(_nRowPos); + } + //-------------------------------------------------------------------- + + RowPos TableControl::GetCurrentRow(const Point& rPoint) + { + return m_pImpl->getCurrentRow( rPoint ); + } + + //-------------------------------------------------------------------- + + IMPL_LINK( TableControl, ImplMouseButtonDownHdl, MouseEvent*, pData ) + { + CallEventListeners( VCLEVENT_WINDOW_MOUSEBUTTONDOWN, pData ); + return 1; + } + + IMPL_LINK( TableControl, ImplMouseButtonUpHdl, MouseEvent*, pData ) + { + CallEventListeners( VCLEVENT_WINDOW_MOUSEBUTTONUP, pData ); + return 1; + } + + SelectionEngine* TableControl::getSelEngine() + { + return m_pImpl->getSelEngine(); + } + + TableDataWindow* TableControl::getDataWindow() + { + return m_pImpl->getDataWindow(); + } + + Reference< XAccessible > TableControl::CreateAccessible() + { + Window* pParent = GetAccessibleParentWindow(); + DBG_ASSERT( pParent, "TableControl::CreateAccessible - parent not found" ); + + if( pParent && !m_pAccessTable->m_pAccessible) + { + Reference< XAccessible > xAccParent = pParent->GetAccessible(); + if( xAccParent.is() ) + { + m_pAccessTable->m_pAccessible = getAccessibleFactory().createAccessibleTableControl( + xAccParent, *this + ); + } + } + Reference< XAccessible > xAccessible; + if ( m_pAccessTable->m_pAccessible ) + xAccessible = m_pAccessTable->m_pAccessible->getMyself(); + return xAccessible; + } + Reference TableControl::CreateAccessibleControl( sal_Int32 _nIndex ) + { + (void)_nIndex; + DBG_ASSERT( FALSE, "TableControl::CreateAccessibleControl: to be overwritten!" ); + return NULL; + } + ::rtl::OUString TableControl::GetAccessibleObjectName( AccessibleTableControlObjType eObjType, sal_Int32 _nRow, sal_Int32 _nCol) const + { + ::rtl::OUString aRetText; + switch( eObjType ) + { + case TCTYPE_GRIDCONTROL: + aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "GridControl" ) ); + break; + case TCTYPE_TABLE: + aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Table" ) ); + break; + case TCTYPE_ROWHEADERBAR: + aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "RowHeaderBar" ) ); + break; + case TCTYPE_COLUMNHEADERBAR: + aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ColumnHeaderBar" ) ); + break; + case TCTYPE_TABLECELL: + aRetText = GetCellContent(_nRow, _nCol); + break; + case TCTYPE_ROWHEADERCELL: + aRetText = GetRowName(_nRow); + break; + case TCTYPE_COLUMNHEADERCELL: + aRetText = GetColumnName(_nCol); + break; + default: + OSL_ENSURE(0,"GridControl::GetAccessibleName: invalid enum!"); + } + return aRetText; + } +// ----------------------------------------------------------------------------- + +::rtl::OUString TableControl::GetAccessibleObjectDescription( AccessibleTableControlObjType eObjType, sal_Int32 ) const +{ + ::rtl::OUString aRetText; + switch( eObjType ) + { + case TCTYPE_GRIDCONTROL: + aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "GridControl description" ) ); + break; + case TCTYPE_TABLE: + aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TABLE description" ) ); + break; + case TCTYPE_ROWHEADERBAR: + aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ROWHEADERBAR description" ) ); + break; + case TCTYPE_COLUMNHEADERBAR: + aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "COLUMNHEADERBAR description" ) ); + break; + case TCTYPE_TABLECELL: + aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "TABLECELL description" ) ); + break; + case TCTYPE_ROWHEADERCELL: + aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ROWHEADERCELL description" ) ); + break; + case TCTYPE_COLUMNHEADERCELL: + aRetText = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "COLUMNHEADERCELL description" ) ); + break; + } + return aRetText; +} +// ----------------------------------------------------------------------------- + +::rtl::OUString TableControl::GetRowDescription( sal_Int32 _nRow) const +{ + (void)_nRow; + return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "row description" ) ); +} +// ----------------------------------------------------------------------------- + +::rtl::OUString TableControl::GetRowName( sal_Int32 _nIndex) const +{ + return GetModel()->getRowHeaderName()[_nIndex]; +} +// ----------------------------------------------------------------------------- + +::rtl::OUString TableControl::GetColumnDescription( sal_uInt16 _nColumn) const +{ + (void)_nColumn; + return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "col description" ) ); +} +// ----------------------------------------------------------------------------- + +::rtl::OUString TableControl::GetColumnName( sal_Int32 _nIndex) const +{ + return GetModel()->getColumnModel(_nIndex)->getName(); +} + +// ----------------------------------------------------------------------------- + +::rtl::OUString TableControl::GetCellContent( sal_Int32 _nRowPos, sal_Int32 _nColPos) const +{ + ::rtl::OUString cellContent = ::rtl::OUString::createFromAscii(""); + std::vector >& aTableContent = GetModel()->getCellContent(); + if(&aTableContent) + { + std::vector& aRowContent = aTableContent[_nRowPos]; + if(&aRowContent) + cellContent = aRowContent[_nColPos]; + } + return cellContent; +} +// ----------------------------------------------------------------------------- + +void TableControl::FillAccessibleStateSet( + ::utl::AccessibleStateSetHelper& rStateSet, + AccessibleTableControlObjType eObjType ) const +{ + switch( eObjType ) + { + case TCTYPE_GRIDCONTROL: + case TCTYPE_TABLE: + + rStateSet.AddState( AccessibleStateType::FOCUSABLE ); + rStateSet.AddState( AccessibleStateType::MULTI_SELECTABLE); + if ( HasFocus() ) + rStateSet.AddState( AccessibleStateType::FOCUSED ); + if ( IsActive() ) + rStateSet.AddState( AccessibleStateType::ACTIVE ); + if ( IsEnabled() ) + rStateSet.AddState( AccessibleStateType::ENABLED ); + if ( IsReallyVisible() ) + rStateSet.AddState( AccessibleStateType::VISIBLE ); + rStateSet.AddState( AccessibleStateType::MANAGES_DESCENDANTS ); + + break; + case TCTYPE_ROWHEADERBAR: + rStateSet.AddState( AccessibleStateType::VISIBLE ); + rStateSet.AddState( AccessibleStateType::MANAGES_DESCENDANTS ); + break; + case TCTYPE_COLUMNHEADERBAR: + rStateSet.AddState( AccessibleStateType::VISIBLE ); + rStateSet.AddState( AccessibleStateType::MANAGES_DESCENDANTS ); + break; + case TCTYPE_TABLECELL: + { + //sal_Int32 nRow = GetCurRow(); + //sal_uInt16 nColumn = GetCurColumnId(); + //if ( IsFieldVisible(nRow,nColumn) ) + // rStateSet.AddState( AccessibleStateType::VISIBLE ); + rStateSet.AddState( AccessibleStateType::TRANSIENT ); + rStateSet.AddState( AccessibleStateType::SELECTABLE); + if( GetSelectedRowCount()>0) + rStateSet.AddState( AccessibleStateType::SELECTED); + } + break; + case TCTYPE_ROWHEADERCELL: + rStateSet.AddState( AccessibleStateType::VISIBLE ); + rStateSet.AddState( AccessibleStateType::TRANSIENT ); + break; + case TCTYPE_COLUMNHEADERCELL: + rStateSet.AddState( AccessibleStateType::VISIBLE ); + break; + } +} + +Rectangle TableControl::GetWindowExtentsRelative( Window *pRelativeWindow ) +{ + return Control::GetWindowExtentsRelative( pRelativeWindow ); +} +//----------------------------------------------------------------------------- +void TableControl::GrabFocus() +{ + Control::GrabFocus(); +} +// ----------------------------------------------------------------------------- +Reference< XAccessible > TableControl::GetAccessible( BOOL bCreate ) +{ + return Control::GetAccessible( bCreate ); +} +// ----------------------------------------------------------------------------- +Window* TableControl::GetAccessibleParentWindow() const +{ + return Control::GetAccessibleParentWindow(); +} +// ----------------------------------------------------------------------------- +Window* TableControl::GetWindowInstance() +{ + return this; +} + +sal_Bool TableControl::HasRowHeader() +{ + return GetModel()->hasRowHeaders(); +} +//-------------------------------------------------------------------------------- +sal_Bool TableControl::HasColHeader() +{ + return GetModel()->hasColumnHeaders(); +} +//-------------------------------------------------------------------------------- +sal_Int32 TableControl::GetAccessibleControlCount() const +{ + sal_Int32 count = 0; + if(GetRowCount()>0) + count+=1; + if(GetModel()->hasRowHeaders()) + count+=1; + if(GetModel()->hasColumnHeaders()) + count+=1; + return count; +} +sal_Bool TableControl::ConvertPointToControlIndex( sal_Int32& _rnIndex, const Point& _rPoint ) +{ + sal_Int32 nRow = m_pImpl->getCurrentRow(_rPoint); + sal_Int32 nCol = GetCurrentColumn(); + _rnIndex = nRow * GetColumnCount() + nCol; + return nRow>=0 ? sal_True : sal_False; +} + +long TableControl::GetRowCount() const +{ + return m_pImpl->getRowCount(); +} +long TableControl::GetColumnCount() const +{ + return m_pImpl->getColumnCount(); +} +sal_Bool TableControl::HasRowHeader() const +{ + PTableModel pModel = GetModel(); + return pModel->hasRowHeaders(); +} +sal_Int32 TableControl::GetSelectedRowCount() const +{ + return m_pImpl->getSelectedRows().size(); +} +bool TableControl::IsRowSelected( long _nRow ) const +{ + return m_pImpl->isRowSelected(m_pImpl->getSelectedRows(), _nRow); +} +sal_Bool TableControl::ConvertPointToCellAddress( sal_Int32& _rnRow, sal_Int32& _rnColPos, const Point& _rPoint ) +{ + _rnRow = m_pImpl->getCurrentRow(_rPoint); + _rnColPos = GetCurrentColumn(); + return _rnRow>=0 ? sal_True : sal_False; +} +void TableControl::FillAccessibleStateSetForCell( ::utl::AccessibleStateSetHelper& _rStateSet, sal_Int32 _nRow, sal_uInt16 _nColumnPos ) const +{ + if ( GetCurrentRow() == _nRow && GetCurrentColumn() == _nColumnPos ) + _rStateSet.AddState( AccessibleStateType::FOCUSED ); + else // only transient when column is not focused + _rStateSet.AddState( AccessibleStateType::TRANSIENT ); +} +Rectangle TableControl::GetFieldCharacterBounds(sal_Int32 _nRow,sal_Int32 _nColumnPos,sal_Int32 nIndex) +{ + (void)_nRow; + (void)_nColumnPos; + return GetCharacterBounds(nIndex); +} +sal_Int32 TableControl::GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint) +{ + (void)_nRow; + (void)_nColumnPos; + return GetIndexForPoint(_rPoint); +; +} + // ----------------------------------------------------------------------------- +sal_Bool TableControl::isAccessibleAlive( ) const +{ + return ( NULL != m_pAccessTable->m_pAccessible ) && m_pAccessTable->m_pAccessible->isAlive(); +} + +// ----------------------------------------------------------------------------- +::svt::IAccessibleFactory& TableControl::getAccessibleFactory() +{ + return m_pAccessTable->m_aFactoryAccess.getFactory(); +} +// ----------------------------------------------------------------------------- +void TableControl::commitGridControlEvent( sal_Int16 _nEventId, const Any& _rNewValue, const Any& _rOldValue ) +{ + if ( isAccessibleAlive() ) + m_pAccessTable->m_pAccessible->commitEvent( _nEventId, _rNewValue, _rOldValue); +} +// ----------------------------------------------------------------------------- +Rectangle TableControl::calcHeaderRect(sal_Bool _bIsColumnBar,BOOL _bOnScreen) +{ + (void)_bOnScreen; + Rectangle aRectTable, aRectTableWithHeaders; + m_pImpl->impl_getAllVisibleDataCellArea(aRectTable); + m_pImpl->impl_getAllVisibleCellsArea(aRectTableWithHeaders); + Size aSizeTable(aRectTable.GetSize()); + Size aSizeTableWithHeaders(aRectTableWithHeaders.GetSize()); + if(_bIsColumnBar) + return Rectangle(aRectTableWithHeaders.TopLeft(),Size(aSizeTableWithHeaders.Width()-aSizeTable.Width(), aSizeTableWithHeaders.Height())); + else + return Rectangle(aRectTableWithHeaders.TopLeft(),Size(aSizeTableWithHeaders.Width(), aSizeTableWithHeaders.Height()-aSizeTable.Height())); +} +// ----------------------------------------------------------------------------- +Rectangle TableControl::calcTableRect(BOOL _bOnScreen) +{ + (void)_bOnScreen; + Rectangle aRect; + m_pImpl->impl_getAllVisibleDataCellArea(aRect); + return aRect; +} + +//........................................................................ +}} // namespace svt::table +//........................................................................ diff --git a/svtools/source/table/tablecontrol_impl.cxx b/svtools/source/table/tablecontrol_impl.cxx new file mode 100644 index 000000000000..89c0eed4229a --- /dev/null +++ b/svtools/source/table/tablecontrol_impl.cxx @@ -0,0 +1,2002 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" + +#include "svtools/table/tablecontrol.hxx" +#include "svtools/table/defaultinputhandler.hxx" +#include "svtools/table/tablemodel.hxx" +#include "tablecontrol_impl.hxx" +#include "tablegeometry.hxx" +#include "svtools/table/tabledatawindow.hxx" + +#include +#include + +#include +#include + +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + + //==================================================================== + //= TempHideCursor + //==================================================================== + class TempHideCursor + { + private: + IAbstractTableControl& m_rTable; + + public: + TempHideCursor( IAbstractTableControl& _rTable ) + :m_rTable( _rTable ) + { + m_rTable.hideCursor(); + } + ~TempHideCursor() + { + m_rTable.showCursor(); + } + }; + + //==================================================================== + //= EmptyTableModel + //==================================================================== + /** default implementation of an ->ITableModel, used as fallback when no + real model is present + + Instances of this class are static in any way, and provide the least + necessary default functionality for a table model. + */ + class EmptyTableModel : public ITableModel + { + public: + EmptyTableModel() + { + } + + // ITableModel overridables + virtual TableSize getColumnCount() const + { + return 0; + } + virtual TableSize getRowCount() const + { + return 0; + } + virtual bool hasColumnHeaders() const + { + return false; + } + virtual bool hasRowHeaders() const + { + return false; + } + virtual void setRowHeaders(bool _bRowHeaders) + { + (void)_bRowHeaders; + } + virtual void setColumnHeaders(bool _bColumnHeaders) + { + (void)_bColumnHeaders; + } + void setColumnCount(TableSize _nColCount) + { + (void) _nColCount; + } + void setRowCount(TableSize _nRowCount) + { + (void)_nRowCount; + } + virtual bool isCellEditable( ColPos col, RowPos row ) const + { + (void)col; + (void)row; + return false; + } + virtual void addTableModelListener( const PTableModelListener& listener ) + { + (void)listener; + // ignore + } + virtual void removeTableModelListener( const PTableModelListener& listener ) + { + (void)listener; + // ignore + } + virtual PColumnModel getColumnModel( ColPos column ) + { + DBG_ERROR( "EmptyTableModel::getColumnModel: invalid call!" ); + (void)column; + return PColumnModel(); + } + virtual PColumnModel getColumnModelByID( ColumnID id ) + { + DBG_ERROR( "EmptyTableModel::getColumnModel: invalid call!" ); + (void)id; + return PColumnModel(); + } + virtual PTableRenderer getRenderer() const + { + return PTableRenderer(); + } + virtual PTableInputHandler getInputHandler() const + { + return PTableInputHandler(); + } + virtual TableMetrics getRowHeight() const + { + return 5 * 100; + } + virtual void setRowHeight(TableMetrics _nRowHeight) + { + (void)_nRowHeight; + } + virtual TableMetrics getColumnHeaderHeight() const + { + return 0; + } + virtual TableMetrics getRowHeaderWidth() const + { + return 0; + } + virtual ScrollbarVisibility getVerticalScrollbarVisibility(int overAllHeight, int actHeight) const + { + (void)overAllHeight; + (void)actHeight; + return ScrollbarShowNever; + } + virtual ScrollbarVisibility getHorizontalScrollbarVisibility(int overAllWidth, int actWidth) const + { + (void)overAllWidth; + (void)actWidth; + return ScrollbarShowNever; + } + virtual void setCellContent(std::vector > pCellEntryType) + { + (void)pCellEntryType; + } + virtual std::vector >& getCellContent() + { + return *( new std::vector >); + } + virtual void setRowHeaderName(std::vector pCellEntryType) + { + (void)pCellEntryType; + } + virtual std::vector& getRowHeaderName() + { + aRowHeaderNames.clear(); + aRowHeaderNames.push_back(rtl::OUString::createFromAscii("")); + return aRowHeaderNames; + } + + private: + std::vector aRowHeaderNames; + }; + + + //==================================================================== + //= TableControl_Impl + //==================================================================== + DBG_NAME( TableControl_Impl ) + +#if DBG_UTIL + //==================================================================== + //= SuspendInvariants + //==================================================================== + class SuspendInvariants + { + private: + const TableControl_Impl& m_rTable; + sal_Int32 m_nSuspendFlags; + + public: + SuspendInvariants( const TableControl_Impl& _rTable, sal_Int32 _nSuspendFlags ) + :m_rTable( _rTable ) + ,m_nSuspendFlags( _nSuspendFlags ) + { + DBG_ASSERT( ( m_rTable.m_nRequiredInvariants & m_nSuspendFlags ) == m_nSuspendFlags, + "SuspendInvariants: cannot suspend what is already suspended!" ); + const_cast< TableControl_Impl& >( m_rTable ).m_nRequiredInvariants &= ~m_nSuspendFlags; + } + ~SuspendInvariants() + { + const_cast< TableControl_Impl& >( m_rTable ).m_nRequiredInvariants |= m_nSuspendFlags; + } + }; + #define DBG_SUSPEND_INV( flags ) \ + SuspendInvariants aSuspendInv( *this, flags ); +#else + #define DBG_SUSPEND_INV( flags ) +#endif + +#if DBG_UTIL + //==================================================================== + const char* TableControl_Impl_checkInvariants( const void* _pInstance ) + { + return static_cast< const TableControl_Impl* >( _pInstance )->impl_checkInvariants(); + } + + namespace + { + template< typename SCALAR_TYPE > + bool lcl_checkLimitsExclusive( SCALAR_TYPE _nValue, SCALAR_TYPE _nMin, SCALAR_TYPE _nMax ) + { + return ( _nValue > _nMin ) && ( _nValue < _nMax ); + } + + template< typename SCALAR_TYPE > + bool lcl_checkLimitsExclusive_OrDefault_OrFallback( SCALAR_TYPE _nValue, SCALAR_TYPE _nMin, SCALAR_TYPE _nMax, + PTableModel _pModel, SCALAR_TYPE _nDefaultOrFallback ) + { + if ( !_pModel ) + return _nValue == _nDefaultOrFallback; + if ( _nMax <= _nMin ) + return _nDefaultOrFallback == _nValue; + return lcl_checkLimitsExclusive( _nValue, _nMin, _nMax ); + } + } + + //-------------------------------------------------------------------- + const sal_Char* TableControl_Impl::impl_checkInvariants() const + { + if ( !m_pModel ) + return "no model, not even an EmptyTableModel"; + + if ( !m_pDataWindow ) + return "invalid data window!"; + + if ( m_pModel->getColumnCount() != m_nColumnCount ) + return "column counts are inconsistent!"; + + if ( m_pModel->getRowCount() != m_nRowCount ) + return "row counts are inconsistent!"; + + if ( ( m_nCurColumn != COL_INVALID ) && !m_aColumnWidthsPixel.empty() && ( m_nCurColumn < 0 ) || ( m_nCurColumn >= (ColPos)m_aColumnWidthsPixel.size() ) ) + return "current column is invalid!"; + + if ( m_aColumnWidthsPixel.size() != m_aAccColumnWidthsPixel.size() ) + return "columnd width caches are inconsistent!"; + + if ( !lcl_checkLimitsExclusive_OrDefault_OrFallback( m_nTopRow, (RowPos)-1, m_nRowCount, getModel(), (RowPos)0 ) ) + return "invalid top row value!"; + + if ( !lcl_checkLimitsExclusive_OrDefault_OrFallback( m_nCurRow, (RowPos)-1, m_nRowCount, getModel(), ROW_INVALID ) ) + return "invalid current row value!"; + + if ( !lcl_checkLimitsExclusive_OrDefault_OrFallback( m_nLeftColumn, (ColPos)-1, m_nColumnCount, getModel(), (ColPos)0 ) ) + return "invalid current column value!"; + + if ( !lcl_checkLimitsExclusive_OrDefault_OrFallback( m_nCurColumn, (ColPos)-1, m_nColumnCount, getModel(), COL_INVALID ) ) + return "invalid current column value!"; + + if ( m_pInputHandler != m_pModel->getInputHandler() ) + return "input handler is not the model-provided one!"; + + // m_nColHeaderHeightPixel consistent with the model's value? + { + TableMetrics nHeaderHeight = m_pModel->hasColumnHeaders() ? m_pModel->getColumnHeaderHeight() : 0; + nHeaderHeight = m_rAntiImpl.LogicToPixel( Size( 0, nHeaderHeight ), MAP_100TH_MM ).Height(); + if ( nHeaderHeight != m_nColHeaderHeightPixel ) + return "column header heights are inconsistent!"; + } + + bool isDummyModel = dynamic_cast< const EmptyTableModel* >( m_pModel.get() ) != NULL; + if ( !isDummyModel ) + { + TableMetrics nRowHeight = m_pModel->getRowHeight(); + nRowHeight = m_rAntiImpl.LogicToPixel( Size( 0, nRowHeight ), MAP_100TH_MM ).Height(); + if ( nRowHeight != m_nRowHeightPixel ) + return "row heights are inconsistent!"; + } + + // m_nRowHeaderWidthPixel consistent with the model's value? + { + TableMetrics nHeaderWidth = m_pModel->hasRowHeaders() ? m_pModel->getRowHeaderWidth() : 0; + nHeaderWidth = m_rAntiImpl.LogicToPixel( Size( nHeaderWidth, 0 ), MAP_100TH_MM ).Width(); + if ( nHeaderWidth != m_nRowHeaderWidthPixel ) + return "row header widths are inconsistent!"; + } + + // TODO: check m_aColumnWidthsPixel and m_aAccColumnWidthsPixel + + if ( m_nCursorHidden < 0 ) + return "invalid hidden count for the cursor!"; + + if ( ( m_nRequiredInvariants & INV_SCROLL_POSITION ) && m_pVScroll ) + { + DBG_SUSPEND_INV( INV_SCROLL_POSITION ); + // prevent infinite recursion + + if ( m_pVScroll->GetThumbPos() != m_nTopRow ) + return "vertical scroll bar |position| is incorrect!"; + if ( m_pVScroll->GetRange().Max() != m_nRowCount ) + return "vertical scroll bar |range| is incorrect!"; + if ( m_pVScroll->GetVisibleSize() != impl_getVisibleRows( false ) ) + return "vertical scroll bar |visible size| is incorrect!"; + } + + if ( ( m_nRequiredInvariants & INV_SCROLL_POSITION ) && m_pHScroll ) + { + DBG_SUSPEND_INV( INV_SCROLL_POSITION ); + // prevent infinite recursion + + if ( m_pHScroll->GetThumbPos() != m_nLeftColumn ) + return "horizontal scroll bar |position| is incorrect!"; + if ( m_pHScroll->GetRange().Max() != m_nColumnCount ) + return "horizontal scroll bar |range| is incorrect!"; + if ( m_pHScroll->GetVisibleSize() != impl_getVisibleColumns( false ) ) + return "horizontal scroll bar |visible size| is incorrect!"; + } + + return NULL; + } +#endif + +#define DBG_CHECK_ME() \ + DBG_CHKTHIS( TableControl_Impl, TableControl_Impl_checkInvariants ) + + //-------------------------------------------------------------------- + TableControl_Impl::TableControl_Impl( TableControl& _rAntiImpl ) + :m_rAntiImpl ( _rAntiImpl ) + ,m_pModel ( new EmptyTableModel ) + ,m_pInputHandler ( ) + ,m_nRowHeightPixel ( 15 ) + ,m_nColHeaderHeightPixel( 0 ) + ,m_nRowHeaderWidthPixel ( 0 ) + ,m_nColumnCount ( 0 ) + ,m_nRowCount ( 0 ) + ,m_nCurColumn ( COL_INVALID ) + ,m_nCurRow ( ROW_INVALID ) + ,m_nLeftColumn ( 0 ) + ,m_nTopRow ( 0 ) + ,m_nCursorHidden ( 1 ) + ,m_pDataWindow ( new TableDataWindow( *this ) ) + ,m_pVScroll ( NULL ) + ,m_pHScroll ( NULL ) + ,m_pScrollCorner ( NULL ) + ,m_pSelEngine ( ) + ,m_nRowSelected ( ) + ,m_pTableFunctionSet ( new TableFunctionSet(this ) ) + ,m_nAnchor (-1 ) +#if DBG_UTIL + ,m_nRequiredInvariants ( INV_SCROLL_POSITION ) +#endif + { + DBG_CTOR( TableControl_Impl, TableControl_Impl_checkInvariants ); + m_pSelEngine = new SelectionEngine(m_pDataWindow, m_pTableFunctionSet); + m_pSelEngine->SetSelectionMode(SINGLE_SELECTION); + m_pDataWindow->SetPosPixel( Point( 0, 0 ) ); + m_pDataWindow->Show(); + } + + //-------------------------------------------------------------------- + TableControl_Impl::~TableControl_Impl() + { + DBG_DTOR( TableControl_Impl, TableControl_Impl_checkInvariants ); + + DELETEZ( m_pVScroll ); + DELETEZ( m_pHScroll ); + DELETEZ( m_pScrollCorner ); + DELETEZ( m_pTableFunctionSet ); + DELETEZ( m_pSelEngine ); + DELETEZ( m_pDataWindow ); + } + + //-------------------------------------------------------------------- + PTableModel TableControl_Impl::getModel() const + { + if ( dynamic_cast< const EmptyTableModel* >( m_pModel.get() ) != NULL ) + // if it's an EmptyTableModel, pretend that there is no model + return PTableModel(); + + return m_pModel; + } + + //-------------------------------------------------------------------- + void TableControl_Impl::setModel( PTableModel _pModel ) + { + DBG_CHECK_ME(); + + TempHideCursor aHideCursor( *this ); + + // TODO: revoke as table listener from the model + + m_pModel = _pModel; + if ( !m_pModel ) + m_pModel.reset( new EmptyTableModel ); + + // TODO: register as table listener + //m_pModel->addTableModelListener(PTableModelListener(m_pTableModelListener)); + m_nCurRow = ROW_INVALID; + m_nCurColumn = COL_INVALID; + + // recalc some model-dependent cached info + impl_ni_updateCachedModelValues(); + + // completely invalidate + m_rAntiImpl.Invalidate(); + + // reset cursor to (0,0) + if ( m_nRowCount ) m_nCurRow = 0; + if ( m_nColumnCount ) m_nCurColumn = 0; + } + + //-------------------------------------------------------------------- + void TableControl_Impl::impl_getAllVisibleCellsArea( Rectangle& _rCellArea ) const + { + DBG_CHECK_ME(); + + _rCellArea.Left() = 0; + _rCellArea.Top() = 0; + + // determine the right-most border of the last column which is + // at least partially visible + _rCellArea.Right() = m_nRowHeaderWidthPixel; + if ( !m_aAccColumnWidthsPixel.empty() ) + { + // the number of pixels which are scroll out of the left hand + // side of the window + long nScrolledOutLeft = m_nLeftColumn == 0 ? 0 : m_aAccColumnWidthsPixel[ m_nLeftColumn - 1 ]; + + ArrayOfLong::const_reverse_iterator loop = m_aAccColumnWidthsPixel.rbegin(); + do + { + _rCellArea.Right() = *loop++ - nScrolledOutLeft + m_nRowHeaderWidthPixel; + } + while ( ( loop != m_aAccColumnWidthsPixel.rend() ) + && ( *loop - nScrolledOutLeft >= _rCellArea.Right() ) + ); + } + // so far, _rCellArea.Right() denotes the first pixel *after* the cell area + --_rCellArea.Right(); + + // determine the last row which is at least partially visible + _rCellArea.Bottom() = + m_nColHeaderHeightPixel + + impl_getVisibleRows( true ) * m_nRowHeightPixel + - 1; + } + + //-------------------------------------------------------------------- + void TableControl_Impl::impl_getAllVisibleDataCellArea( Rectangle& _rCellArea ) const + { + DBG_CHECK_ME(); + + impl_getAllVisibleCellsArea( _rCellArea ); + _rCellArea.Left() = m_nRowHeaderWidthPixel; + _rCellArea.Top() = m_nColHeaderHeightPixel; + } + + //-------------------------------------------------------------------- + void TableControl_Impl::impl_ni_updateCachedModelValues() + { + m_nRowHeightPixel = 15; + m_nColHeaderHeightPixel = 0; + m_nRowHeaderWidthPixel = 0; + m_pInputHandler.reset(); + m_nColumnCount = m_nRowCount = 0; + + m_nRowHeightPixel = m_rAntiImpl.LogicToPixel( Size( 0, m_pModel->getRowHeight() ), MAP_100TH_MM ).Height(); + if ( m_pModel->hasColumnHeaders() ) + m_nColHeaderHeightPixel = m_rAntiImpl.LogicToPixel( Size( 0, m_pModel->getColumnHeaderHeight() ), MAP_100TH_MM ).Height(); + if ( m_pModel->hasRowHeaders() ) + m_nRowHeaderWidthPixel = m_rAntiImpl.LogicToPixel( Size( m_pModel->getRowHeaderWidth(), 0 ), MAP_100TH_MM ).Width(); + + impl_ni_updateColumnWidths(); + + m_pInputHandler = m_pModel->getInputHandler(); + if ( !m_pInputHandler ) + m_pInputHandler.reset( new DefaultInputHandler ); + + m_nColumnCount = m_pModel->getColumnCount(); + m_nRowCount = m_pModel->getRowCount(); + } + + //-------------------------------------------------------------------- + void TableControl_Impl::impl_ni_updateColumnWidths() + { + m_aColumnWidthsPixel.resize( 0 ); + m_aAccColumnWidthsPixel.resize( 0 ); + if ( !m_pModel ) + return; + + TableSize colCount = m_pModel->getColumnCount(); + m_aColumnWidthsPixel.reserve( colCount ); + m_aAccColumnWidthsPixel.reserve( colCount ); + long accumulatedPixelWidth = 0; + for ( ColPos col = 0; col < colCount; ++col ) + { + PColumnModel pColumn = m_pModel->getColumnModel( col ); + DBG_ASSERT( !!pColumn, "TableControl_Impl::impl_ni_updateColumnWidths: invalid column returned by the model!" ); + if ( !pColumn ) + continue; + + TableMetrics colWidth = pColumn->getWidth(); + DBG_ASSERT( ( colWidth == COLWIDTH_FIT_TO_VIEW ) || ( colWidth > 0 ), + "TableControl_Impl::impl_ni_updateColumnWidths: invalid column width!" ); + + long pixelWidth = 0; + if ( colWidth == COLWIDTH_FIT_TO_VIEW ) + { + // TODO + DBG_ERROR( "TableControl_Impl::impl_ni_updateColumnWidths: COLWIDTH_FIT_TO_VIEW not implemented, yet!" ); + } + else + { + pixelWidth = m_rAntiImpl.LogicToPixel( Size( colWidth, 0 ), MAP_100TH_MM ).Width(); + } + + m_aColumnWidthsPixel.push_back( pixelWidth ); + + m_aAccColumnWidthsPixel.push_back( accumulatedPixelWidth += pixelWidth ); + } + } + + //-------------------------------------------------------------------- + namespace + { + //................................................................ + /// determines whether a scrollbar is needed for the given values + bool lcl_determineScrollbarNeed( ScrollbarVisibility _eVisibility, + long _nVisibleUnits, long _nRange ) + { + if ( _eVisibility == ScrollbarShowNever ) + return false; + if ( _eVisibility == ScrollbarShowAlways ) + return true; + return _nVisibleUnits > _nRange; + } + + //................................................................ + void lcl_setButtonRepeat( Window& _rWindow, ULONG _nDelay ) + { + AllSettings aSettings = _rWindow.GetSettings(); + MouseSettings aMouseSettings = aSettings.GetMouseSettings(); + + aMouseSettings.SetButtonRepeat( _nDelay ); + aSettings.SetMouseSettings( aMouseSettings ); + + _rWindow.SetSettings( aSettings, TRUE ); + } + + //................................................................ + void lcl_updateScrollbar( Window& _rParent, ScrollBar*& _rpBar, + ScrollbarVisibility _eVisibility, long _nVisibleUnits, + long _nPosition, long _nLineSize, long _nRange, + bool _bHorizontal, const Link& _rScrollHandler ) + { + // do we need the scrollbar? + bool bNeedBar = lcl_determineScrollbarNeed( _eVisibility, _nVisibleUnits, _nRange ); + + // do we currently have the scrollbar? + bool bHaveBar = _rpBar != NULL; + + // do we need to correct the scrollbar visibility? + if ( bHaveBar && !bNeedBar ) + { + DELETEZ( _rpBar ); + } + else if ( !bHaveBar && bNeedBar ) + { + _rpBar = new ScrollBar( + &_rParent, + WB_DRAG | ( _bHorizontal ? WB_HSCROLL : WB_VSCROLL ) + ); + _rpBar->SetScrollHdl( _rScrollHandler ); + // get some speed into the scrolling .... + lcl_setButtonRepeat( *_rpBar, 0 ); + } + + if ( _rpBar ) + { + _rpBar->SetRange( Range( 0, _nRange ) ); + _rpBar->SetVisibleSize( _nVisibleUnits ); + _rpBar->SetPageSize( _nVisibleUnits ); + _rpBar->SetLineSize( _nLineSize ); + _rpBar->SetThumbPos( _nPosition ); + _rpBar->Show(); + } + } + + //................................................................ + /** returns the number of rows fitting into the given range, + for the given row height. Partially fitting rows are counted, too, if the + respective parameter says so. + */ + TableSize lcl_getRowsFittingInto( long _nOverallHeight, long _nRowHeightPixel, bool _bAcceptPartialRow = false ) + { + return _bAcceptPartialRow + ? ( _nOverallHeight + ( _nRowHeightPixel - 1 ) ) / _nRowHeightPixel + : _nOverallHeight / _nRowHeightPixel; + } + + //................................................................ + /** returns the number of columns fitting into the given area, + with the first visible column as given. Partially fitting columns are counted, too, + if the respective parameter says so. + */ + TableSize lcl_getColumnsVisibleWithin( const Rectangle& _rArea, ColPos _nFirstVisibleColumn, + const TableControl_Impl& _rControl, bool _bAcceptPartialRow ) + { + TableSize visibleColumns = 0; + TableColumnGeometry aColumn( _rControl, _rArea, _nFirstVisibleColumn ); + while ( aColumn.isValid() ) + { + if ( !_bAcceptPartialRow ) + if ( aColumn.getRect().Right() > _rArea.Right() ) + // this column is only partially visible, and this is not allowed + break; + + aColumn.moveRight(); + ++visibleColumns; + } + return visibleColumns; + } + + } + + //-------------------------------------------------------------------- + void TableControl_Impl::impl_ni_updateScrollbars() + { + TempHideCursor aHideCursor( *this ); + + // the width/height of a scrollbar, needed several times below + long nScrollbarMetrics = m_rAntiImpl.GetSettings().GetStyleSettings().GetScrollBarSize(); + if ( m_rAntiImpl.IsZoom() ) + nScrollbarMetrics = (long)( nScrollbarMetrics * (double)m_rAntiImpl.GetZoom() ); + + // determine the playground for the data cells (excluding headers) + // TODO: what if the control is smaller than needed for the headers/scrollbars? + Rectangle aDataCellPlayground( Point( 0, 0 ), m_rAntiImpl.GetOutputSizePixel() ); + aDataCellPlayground.Left() = m_nRowHeaderWidthPixel; + aDataCellPlayground.Top() = m_nColHeaderHeightPixel; + + // do we need a vertical scrollbar? + bool bFirstRoundVScrollNeed = false; + if ( lcl_determineScrollbarNeed( + m_pModel->getVerticalScrollbarVisibility(aDataCellPlayground.GetHeight(), m_nRowHeightPixel*m_nRowCount), + lcl_getRowsFittingInto( aDataCellPlayground.GetHeight(), m_nRowHeightPixel ), + m_nRowCount ) ) + { + aDataCellPlayground.Right() -= nScrollbarMetrics; + bFirstRoundVScrollNeed = true; + } + // do we need a horizontal scrollbar? + if ( lcl_determineScrollbarNeed( + m_pModel->getHorizontalScrollbarVisibility(aDataCellPlayground.GetWidth(), m_aAccColumnWidthsPixel[m_nColumnCount-1]), + lcl_getColumnsVisibleWithin( aDataCellPlayground, m_nLeftColumn, *this, false ), + m_nColumnCount ) ) + { + aDataCellPlayground.Bottom() -= nScrollbarMetrics; + + // now that we just found that we need a horizontal scrollbar, + // the need for a vertical one may have changed, since the horizontal + // SB might just occupy enough space so that not all rows do fit + // anymore + if ( !bFirstRoundVScrollNeed && lcl_determineScrollbarNeed( + m_pModel->getVerticalScrollbarVisibility(aDataCellPlayground.GetHeight(),m_nRowHeightPixel*m_nRowCount), + lcl_getRowsFittingInto( aDataCellPlayground.GetHeight(), m_nRowHeightPixel ), + m_nRowCount ) ) + { + aDataCellPlayground.Right() -= nScrollbarMetrics; + } + } + else + { + Size regionWithoutHeader = m_rAntiImpl.PixelToLogic(Size(aDataCellPlayground.Right() - aDataCellPlayground.Left(),0),MAP_100TH_MM); + TableMetrics nColWidth = regionWithoutHeader.Width()/m_nColumnCount; + for ( ColPos col = 0; col < m_nColumnCount; ++col ) + m_pModel->getColumnModel(col)->setWidth(nColWidth); + m_rAntiImpl.SetModel(m_pModel); + } + + // create or destroy the vertical scrollbar, as needed + lcl_updateScrollbar( + m_rAntiImpl, + m_pVScroll, + m_pModel->getVerticalScrollbarVisibility(aDataCellPlayground.GetHeight(),m_nRowHeightPixel*m_nRowCount), + lcl_getRowsFittingInto( aDataCellPlayground.GetHeight(), m_nRowHeightPixel ), + // visible units + m_nTopRow, // current position + 1, // line size + m_nRowCount, // range + false, // vertical + LINK( this, TableControl_Impl, OnScroll ) // scroll handler + ); + // position it + if ( m_pVScroll ) + { + Rectangle aScrollbarArea( + Point( aDataCellPlayground.Right() + 1, 0 ), + Size( nScrollbarMetrics, aDataCellPlayground.Bottom() + 1 ) + ); + m_pVScroll->SetPosSizePixel( + aScrollbarArea.TopLeft(), aScrollbarArea.GetSize() ); + } + + // create or destroy the horizontal scrollbar, as needed + lcl_updateScrollbar( + m_rAntiImpl, + m_pHScroll, + m_pModel->getHorizontalScrollbarVisibility(aDataCellPlayground.GetWidth(), m_aAccColumnWidthsPixel[m_nColumnCount-1]), + lcl_getColumnsVisibleWithin( aDataCellPlayground, m_nLeftColumn, *this, false ), + // visible units + m_nLeftColumn, // current position + 1, // line size + m_nColumnCount, // range + true, // horizontal + LINK( this, TableControl_Impl, OnScroll ) // scroll handler + ); + // position it + if ( m_pHScroll ) + { + Rectangle aScrollbarArea( + Point( 0, aDataCellPlayground.Bottom() + 1 ), + Size( aDataCellPlayground.Right() + 1, nScrollbarMetrics ) + ); + m_pHScroll->SetPosSizePixel( + aScrollbarArea.TopLeft(), aScrollbarArea.GetSize() ); + } + + // the corner window connecting the two scrollbars in the lower right corner + bool bHaveScrollCorner = NULL != m_pScrollCorner; + bool bNeedScrollCorner = ( NULL != m_pHScroll ) && ( NULL != m_pVScroll ); + if ( bHaveScrollCorner && !bNeedScrollCorner ) + { + DELETEZ( m_pScrollCorner ); + } + else if ( !bHaveScrollCorner && bNeedScrollCorner ) + { + m_pScrollCorner = new ScrollBarBox( &m_rAntiImpl ); + m_pScrollCorner->SetSizePixel( Size( nScrollbarMetrics, nScrollbarMetrics ) ); + m_pScrollCorner->SetPosPixel( Point( aDataCellPlayground.Right() + 1, aDataCellPlayground.Bottom() + 1 ) ); + m_pScrollCorner->Show(); + } + + // resize the data window + m_pDataWindow->SetSizePixel( Size( + aDataCellPlayground.GetWidth() + m_nRowHeaderWidthPixel, + aDataCellPlayground.GetHeight() + m_nColHeaderHeightPixel + ) ); + } + + //-------------------------------------------------------------------- + void TableControl_Impl::onResize() + { + DBG_CHECK_ME(); + impl_ni_updateScrollbars(); + //Rectangle aAllCells; + // impl_getAllVisibleCellsArea( aAllCells ); + //m_pSelEngine->SetVisibleArea(aAllCells); + } + + //-------------------------------------------------------------------- + void TableControl_Impl::doPaintContent( const Rectangle& _rUpdateRect ) + { + DBG_CHECK_ME(); + + if ( !getModel() ) + return; + + PTableRenderer pRenderer = getModel()->getRenderer(); + DBG_ASSERT( !!pRenderer, "TableDataWindow::Paint: invalid renderer!" ); + if ( !pRenderer ) + return; + + // our current style settings, to be passed to the renderer + const StyleSettings& rStyle = m_rAntiImpl.GetSettings().GetStyleSettings(); + + // the area occupied by all (at least partially) visible cells, including + // headers + Rectangle aAllCellsWithHeaders; + impl_getAllVisibleCellsArea( aAllCellsWithHeaders ); + + m_nRowCount = m_pModel->getRowCount(); + // ............................ + // draw the header column area + if ( getModel()->hasColumnHeaders() ) + { + TableRowGeometry aHeaderRow( *this, Rectangle( Point( 0, 0 ), + aAllCellsWithHeaders.BottomRight() ), ROW_COL_HEADERS ); + pRenderer->PaintHeaderArea( + *m_pDataWindow, aHeaderRow.getRect(), true, false, rStyle + ); + // Note that strictly, aHeaderRow.getRect() also contains the intersection between column + // and row header area. However, below we go to paint this intersection, again, + // so this hopefully doesn't hurt if we already paint it here. + + for ( TableCellGeometry aCell( aHeaderRow, m_nLeftColumn ); + aCell.isValid(); + aCell.moveRight() + ) + { + if ( _rUpdateRect.GetIntersection( aCell.getRect() ).IsEmpty() ) + continue; + + bool isActiveColumn = ( aCell.getColumn() == getCurColumn() ); + bool isSelectedColumn = false; + pRenderer->PaintColumnHeader( aCell.getColumn(), isActiveColumn, isSelectedColumn, + *m_pDataWindow, aCell.getRect(), rStyle ); + } + } + + // the area occupied by the row header, if any + Rectangle aRowHeaderArea; + if ( getModel()->hasRowHeaders() ) + { + aRowHeaderArea = aAllCellsWithHeaders; + aRowHeaderArea.Right() = m_nRowHeaderWidthPixel - 1; + aRowHeaderArea.Bottom() = m_nRowHeightPixel * m_nRowCount + m_nColHeaderHeightPixel - 1; + pRenderer->PaintHeaderArea( + *m_pDataWindow, aRowHeaderArea, false, true, rStyle + ); + // Note that strictly, aRowHeaderArea also contains the intersection between column + // and row header area. However, below we go to paint this intersection, again, + // so this hopefully doesn't hurt if we already paint it here. + + if ( getModel()->hasColumnHeaders() ) + { + TableCellGeometry aIntersection( *this, Rectangle( Point( 0, 0 ), + aAllCellsWithHeaders.BottomRight() ), COL_ROW_HEADERS, ROW_COL_HEADERS ); + pRenderer->PaintHeaderArea( + *m_pDataWindow, aIntersection.getRect(), true, true, rStyle + ); + } + } + + // ............................ + // draw the table content row by row + + TableSize colCount = getModel()->getColumnCount(); + + // paint all rows + Rectangle aAllDataCellsArea; + impl_getAllVisibleDataCellArea( aAllDataCellsArea ); + + //get the vector, which contains row vectors, each containing the data for the cells in this row + std::vector >& aCellContent = m_pModel->getCellContent(); + //if the vector is empty, fill it with empty data, so the table can be painted + if(aCellContent.empty()) + { + std::vector emptyCells; + while(m_nRowCount!=0) + { + aCellContent.push_back(emptyCells); + --m_nRowCount; + } + } + std::vector >::iterator it = aCellContent.begin()+m_nTopRow; + //get the vector, which contains the row header titles + std::vector& aRowHeaderContent = m_pModel->getRowHeaderName(); + ::std::vector::iterator itRowName = aRowHeaderContent.begin(); + + if(m_pModel->hasRowHeaders()) + { + aRowHeaderContent = m_pModel->getRowHeaderName(); + //if the vector is empty, fill it with empty strings, so the table can be painted + if(aRowHeaderContent.empty()) + { + while(m_nRowCount!=0) + { + aRowHeaderContent.push_back(rtl::OUString::createFromAscii("")); + --m_nRowCount; + } + } + itRowName = aRowHeaderContent.begin()+m_nTopRow; + } + for ( TableRowGeometry aRowIterator( *this, aAllCellsWithHeaders, getTopRow() ); + aRowIterator.isValid(); + aRowIterator.moveDown() ) + { + if ( _rUpdateRect.GetIntersection( aRowIterator.getRect() ).IsEmpty() ) + { + if(m_pModel->hasRowHeaders()) + ++itRowName; + ++it; + continue; + } + bool isActiveRow = ( aRowIterator.getRow() == getCurRow() ); + bool isSelectedRow = false; + if(!m_nRowSelected.empty()) + { + for(std::vector::iterator itSel=m_nRowSelected.begin(); + itSel!=m_nRowSelected.end();++itSel) + { + if(*itSel == aRowIterator.getRow()) + isSelectedRow = true; + } + } + std::vector aCellData; + if(it != aCellContent.end()) + { + aCellData = *it; + ++it; + } + ::std::vector::iterator iter = aCellData.begin()+m_nLeftColumn; + + // give the redenderer a chance to prepare the row + pRenderer->PrepareRow( aRowIterator.getRow(), isActiveRow, isSelectedRow, + *m_pDataWindow, aRowIterator.getRect().GetIntersection( aAllDataCellsArea ), rStyle ); + + // paint the row header + if ( m_pModel->hasRowHeaders() ) + { + rtl::OUString rowHeaderName; + if(itRowName != aRowHeaderContent.end()) + { + rowHeaderName = *itRowName; + ++itRowName; + } + Rectangle aCurrentRowHeader( aRowHeaderArea.GetIntersection( aRowIterator.getRect() ) ); + pRenderer->PaintRowHeader( isActiveRow, isSelectedRow, *m_pDataWindow, aCurrentRowHeader, + rStyle, rowHeaderName ); + } + if ( !colCount ) + continue; + + // paint all cells in this row + for ( TableCellGeometry aCell( aRowIterator, m_nLeftColumn ); + aCell.isValid(); + aCell.moveRight() + ) + { + // if ( _rUpdateRect.GetIntersection( aCell.getRect() ).IsEmpty() ) + // continue; + + //bool isActiveCell = isActiveRow && ( aCell.getColumn() == getCurColumn() ); + bool isSelectedColumn = false; + rtl::OUString cellData; + if(aCellData.empty()) + cellData=rtl::OUString::createFromAscii(""); + else if(iter != aCellData.end()) + { + cellData = *iter; + ++iter; + } + pRenderer->PaintCell( aCell.getColumn(), isSelectedRow || isSelectedColumn, isActiveRow, + *m_pDataWindow, aCell.getRect(), rStyle, cellData ); + } + } + } + + //-------------------------------------------------------------------- + void TableControl_Impl::hideCursor() + { + DBG_CHECK_ME(); + + if ( ++m_nCursorHidden == 1 ) + impl_ni_doSwitchCursor( false ); + } + + //-------------------------------------------------------------------- + void TableControl_Impl::showCursor() + { + DBG_CHECK_ME(); + + DBG_ASSERT( m_nCursorHidden > 0, "TableControl_Impl::showCursor: cursor not hidden!" ); + if ( --m_nCursorHidden == 0 ) + impl_ni_doSwitchCursor( true ); + } + + //-------------------------------------------------------------------- + bool TableControl_Impl::dispatchAction( TableControlAction _eAction ) + { + DBG_CHECK_ME(); + + bool bSuccess = false; + Rectangle rCells; + switch ( _eAction ) + { + case cursorDown: + if(m_pSelEngine->GetSelectionMode() == SINGLE_SELECTION) + { + //if other rows already selected, deselect them + if(m_nRowSelected.size()>0) + { + for(std::vector::iterator it=m_nRowSelected.begin(); + it!=m_nRowSelected.end();++it) + { + invalidateSelectedRow(*it,rCells); + m_pDataWindow->Invalidate(rCells); + } + m_nRowSelected.clear(); + } + if(m_nCurRow < m_nRowCount-1) + { + ++m_nCurRow; + m_nRowSelected.push_back(m_nCurRow); + } + else + m_nRowSelected.push_back(m_nCurRow); + invalidateSelectedRow(m_nCurRow, rCells); + ensureVisible(m_nCurColumn,m_nCurRow,false); + bSuccess = true; + } + else + { + if ( m_nCurRow < m_nRowCount - 1 ) + bSuccess = goTo( m_nCurColumn, m_nCurRow + 1 ); + } + break; + + case cursorUp: + if(m_pSelEngine->GetSelectionMode() == SINGLE_SELECTION) + { + if(m_nRowSelected.size()>0) + { + for(std::vector::iterator it=m_nRowSelected.begin(); + it!=m_nRowSelected.end();++it) + { + invalidateSelectedRow(*it,rCells); + m_pDataWindow->Invalidate(rCells); + } + m_nRowSelected.clear(); + } + if(m_nCurRow>0) + { + --m_nCurRow; + m_nRowSelected.push_back(m_nCurRow); + invalidateSelectedRow(m_nCurRow, rCells); + } + else + { + m_nRowSelected.push_back(m_nCurRow); + invalidateSelectedRow(m_nCurRow, rCells); + } + ensureVisible(m_nCurColumn,m_nCurRow,false); + bSuccess = true; + } + else + { + if ( m_nCurRow > 0 ) + bSuccess = goTo( m_nCurColumn, m_nCurRow - 1 ); + } + break; + case cursorLeft: + if ( m_nCurColumn > 0 ) + bSuccess = goTo( m_nCurColumn - 1, m_nCurRow ); + else + if ( ( m_nCurColumn == 0) && ( m_nCurRow > 0 ) ) + bSuccess = goTo( m_nColumnCount - 1, m_nCurRow - 1 ); + break; + + case cursorRight: + if ( m_nCurColumn < m_nColumnCount - 1 ) + bSuccess = goTo( m_nCurColumn + 1, m_nCurRow ); + else + if ( ( m_nCurColumn == m_nColumnCount - 1 ) && ( m_nCurRow < m_nRowCount - 1 ) ) + bSuccess = goTo( 0, m_nCurRow + 1 ); + break; + + case cursorToLineStart: + bSuccess = goTo( 0, m_nCurRow ); + break; + + case cursorToLineEnd: + bSuccess = goTo( m_nColumnCount - 1, m_nCurRow ); + break; + + case cursorToFirstLine: + bSuccess = goTo( m_nCurColumn, 0 ); + break; + + case cursorToLastLine: + bSuccess = goTo( m_nCurColumn, m_nRowCount - 1 ); + break; + + case cursorPageUp: + { + RowPos nNewRow = ::std::max( (RowPos)0, m_nCurRow - impl_getVisibleRows( false ) ); + bSuccess = goTo( m_nCurColumn, nNewRow ); + } + break; + + case cursorPageDown: + { + RowPos nNewRow = ::std::min( m_nRowCount - 1, m_nCurRow + impl_getVisibleRows( false ) ); + bSuccess = goTo( m_nCurColumn, nNewRow ); + } + break; + + case cursorTopLeft: + bSuccess = goTo( 0, 0 ); + break; + + case cursorBottomRight: + bSuccess = goTo( m_nColumnCount - 1, m_nRowCount - 1 ); + break; + + case cursorSelectRow: + { + if(m_pSelEngine->GetSelectionMode() == NO_SELECTION) + return bSuccess = false; + //pos is the position of the current row in the vector of selected rows, if current row is selected + int pos = getRowSelectedNumber(m_nRowSelected, m_nCurRow); + //if current row is selected, it should be deselected, when ALT+SPACE are pressed + if(pos>-1) + m_nRowSelected.erase(m_nRowSelected.begin()+pos); + //else select the row->put it in the vector + else + m_nRowSelected.push_back(m_nCurRow); + invalidateSelectedRow(m_nCurRow, rCells); + bSuccess = true; + } + break; + case cursorSelectRowUp: + { + if(m_pSelEngine->GetSelectionMode() == NO_SELECTION) + return bSuccess = false; + else if(m_pSelEngine->GetSelectionMode() == SINGLE_SELECTION) + { + //if there are other selected rows, deselect them + return false; + } + else + { + //there are other selected rows + if(m_nRowSelected.size()>0) + { + //the anchor wasn't set -> a region is not selected, that's why clear all selection + //and select the current row + if(m_nAnchor==-1) + { + for(std::vector::iterator it=m_nRowSelected.begin(); + it!=m_nRowSelected.end();++it) + { + invalidateSelectedRow(*it,rCells); + m_pDataWindow->Invalidate(rCells); + } + m_nRowSelected.clear(); + m_nRowSelected.push_back(m_nCurRow); + invalidateSelectedRow(m_nCurRow, rCells); + } + else + { + //a region is already selected, prevRow is last selected row and the row above - nextRow - should be selected + int prevRow = getRowSelectedNumber(m_nRowSelected, m_nCurRow); + int nextRow = getRowSelectedNumber(m_nRowSelected, m_nCurRow-1); + if(prevRow>-1) + { + //if m_nCurRow isn't the upper one, can move up, otherwise not + if(m_nCurRow>0) + m_nCurRow--; + else + return bSuccess = true; + //if nextRow already selected, deselect it, otherwise select it + if(m_nRowSelected[nextRow] == m_nCurRow) + { + m_nRowSelected.erase(m_nRowSelected.begin()+prevRow); + invalidateSelectedRow(m_nCurRow+1, rCells); + } + else + { + m_nRowSelected.push_back(m_nCurRow); + invalidateSelectedRow(m_nCurRow, rCells); + } + } + } + } + else + { + //if nothing is selected and the current row isn't the upper one + //select the current and one row above + //otherwise select only the upper row + if(m_nCurRow>0) + { + m_nRowSelected.push_back(m_nCurRow); + m_nCurRow--; + m_nRowSelected.push_back(m_nCurRow); + invalidateSelectedRegion(m_nCurRow+1, m_nCurRow, rCells); + } + else + { + m_nRowSelected.push_back(m_nCurRow); + invalidateSelectedRow(m_nCurRow, rCells); + } + } + m_pSelEngine->SetAnchor(TRUE); + m_nAnchor = m_nCurRow; + ensureVisible(m_nCurColumn, m_nCurRow, false); + bSuccess = true; + } + } + break; + case cursorSelectRowDown: + { + if(m_pSelEngine->GetSelectionMode() == NO_SELECTION) + bSuccess = false; + else if(m_pSelEngine->GetSelectionMode() == SINGLE_SELECTION) + { + bSuccess = false; + } + else + { + if(m_nRowSelected.size()>0) + { + //the anchor wasn't set -> a region is not selected, that's why clear all selection + //and select the current row + if(m_nAnchor==-1) + { + for(std::vector::iterator it=m_nRowSelected.begin(); + it!=m_nRowSelected.end();++it) + { + invalidateSelectedRow(*it,rCells); + m_pDataWindow->Invalidate(rCells); + } + m_nRowSelected.clear(); + m_nRowSelected.push_back(m_nCurRow); + invalidateSelectedRow(m_nCurRow, rCells); + } + else + { + //a region is already selected, prevRow is last selected row and the row beneath - nextRow - should be selected + int prevRow = getRowSelectedNumber(m_nRowSelected, m_nCurRow); + int nextRow = getRowSelectedNumber(m_nRowSelected, m_nCurRow+1); + if(prevRow>-1) + { + //if m_nCurRow isn't the last one, can move down, otherwise not + if(m_nCurRowSetAnchor(TRUE); + m_nAnchor = m_nCurRow; + ensureVisible(m_nCurColumn, m_nCurRow, false); + bSuccess = true; + } + } + break; + case cursorSelectRowAreaTop: + { + if(m_pSelEngine->GetSelectionMode() == NO_SELECTION) + bSuccess = false; + else if(m_pSelEngine->GetSelectionMode() == SINGLE_SELECTION) + bSuccess = false; + else + { + //select the region between the current and the upper row + RowPos iter = m_nCurRow; + invalidateSelectedRegion(m_nCurRow, 0, rCells); + //put the rows in vector + while(iter>=0) + { + if(!isRowSelected(m_nRowSelected, iter)) + m_nRowSelected.push_back(iter); + --iter; + } + m_nCurRow = 0; + m_nAnchor = m_nCurRow; + m_pSelEngine->SetAnchor(TRUE); + ensureVisible(m_nCurColumn, 0, false); + bSuccess = true; + } + } + break; + case cursorSelectRowAreaBottom: + { + if(m_pSelEngine->GetSelectionMode() == NO_SELECTION) + return bSuccess = false; + else if(m_pSelEngine->GetSelectionMode() == SINGLE_SELECTION) + return bSuccess = false; + //select the region between the current and the last row + RowPos iter = m_nCurRow; + invalidateSelectedRegion(m_nCurRow, m_nRowCount-1, rCells); + //put the rows in the vector + while(iter<=m_nRowCount) + { + if(!isRowSelected(m_nRowSelected, iter)) + m_nRowSelected.push_back(iter); + ++iter; + } + m_nCurRow = m_nRowCount-1; + m_nAnchor = m_nCurRow; + m_pSelEngine->SetAnchor(TRUE); + ensureVisible(m_nCurColumn, m_nRowCount, false); + bSuccess = true; + } + break; + default: + DBG_ERROR( "TableControl_Impl::dispatchAction: unsupported action!" ); + } + return bSuccess; + } + + //-------------------------------------------------------------------- + void TableControl_Impl::impl_ni_doSwitchCursor( bool _bShow ) + { + PTableRenderer pRenderer = !!m_pModel ? m_pModel->getRenderer() : PTableRenderer(); + if ( !!pRenderer ) + { + Rectangle aCellRect; + impl_getCellRect( m_nCurColumn, m_nCurRow, aCellRect ); + + // const StyleSettings& rStyle = m_rAntiImpl.GetSettings().GetStyleSettings(); + if ( _bShow ) + { + pRenderer->ShowCellCursor( *m_pDataWindow, aCellRect); + } + else + { + pRenderer->HideCellCursor( *m_pDataWindow, aCellRect); + } + } + } + + //-------------------------------------------------------------------- + void TableControl_Impl::impl_getCellRect( ColPos _nColumn, RowPos _nRow, Rectangle& _rCellRect ) const + { + DBG_CHECK_ME(); + + if ( !m_pModel + || ( COL_INVALID == _nColumn ) + || ( ROW_INVALID == _nRow ) + ) + { + _rCellRect.SetEmpty(); + return; + } + + DBG_ASSERT( ( _nColumn >= 0 ) && ( _nColumn < m_pModel->getColumnCount() ), + "TableControl_Impl::impl_getCellRect: invalid column index!" ); + DBG_ASSERT( ( _nRow >= 0 ) && ( _nRow < m_pModel->getRowCount() ), + "TableControl_Impl::impl_getCellRect: invalid row index!" ); + + Rectangle aAllCells; + impl_getAllVisibleCellsArea( aAllCells ); + + TableCellGeometry aCell( *this, aAllCells, _nColumn, _nRow ); + _rCellRect = aCell.getRect(); + } + //------------------------------------------------------------------------------- + RowPos TableControl_Impl::getCurrentRow(const Point& rPoint) + { + DBG_CHECK_ME(); + Rectangle rCellRect; + RowPos newRowPos = -2;//-1 is HeaderRow + ColPos newColPos = 0; + //To Do: when only row position needed, the second loop isn't necessary, Please proove this!!! + for(int i=0;i= rCellRect.Left() && rPoint.X() <= rCellRect.Right()) && rPoint.Y() >= rCellRect.Top() && rPoint.Y() <= rCellRect.Bottom()) + { + newRowPos = i; + newColPos = j; + if(newColPos == -1) + m_nCurColumn = 0; + else + m_nCurColumn = newColPos; + return newRowPos; + } + } + } + return newRowPos; + } + //------------------------------------------------------------------------------- + void TableControl_Impl::setCursorAtCurrentCell(const Point& rPoint) + { + DBG_CHECK_ME(); + hideCursor(); + Rectangle rCellRect; + RowPos newRowPos = -2;//-1 is HeaderRow + ColPos newColPos = 0; + //To Do: when only row position needed, the second loop isn't necessary, Please proove this!!! + for(int i=0;i= rCellRect.Left() && rPoint.X() <= rCellRect.Right()) && rPoint.Y() >= rCellRect.Top() && rPoint.Y() <= rCellRect.Bottom()) + { + newRowPos = i; + m_nCurRow = newRowPos; + newColPos = j; + if(newColPos == -1) + m_nCurColumn = 0; + else + m_nCurColumn = newColPos; + } + } + } + showCursor(); + } + + //------------------------------------------------------------------------------- + void TableControl_Impl::invalidateSelectedRegion(RowPos _nPrevRow, RowPos _nCurRow, Rectangle& _rCellRect) + { + DBG_CHECK_ME(); + Rectangle aAllCells; + //get the visible area of the table control and set the Left and right border of the region to be repainted + impl_getAllVisibleCellsArea( aAllCells ); + _rCellRect.Left() = aAllCells.Left(); + _rCellRect.Right() = aAllCells.Right(); + Rectangle rCells; + //if only one row is selected + if(_nPrevRow == _nCurRow) + { + impl_getCellRect(m_nCurColumn,_nCurRow,rCells); + _rCellRect.Top()=rCells.Top(); + _rCellRect.Bottom()=rCells.Bottom(); + } + //if the region is above the current row + else if(_nPrevRow < _nCurRow ) + { + impl_getCellRect(m_nCurColumn,_nPrevRow,rCells); + _rCellRect.Top()=rCells.Top(); + impl_getCellRect(m_nCurColumn,_nCurRow,rCells); + _rCellRect.Bottom()=rCells.Bottom(); + } + //if the region is beneath the current row + else + { + impl_getCellRect(m_nCurColumn,_nCurRow,rCells); + _rCellRect.Top()=rCells.Top(); + impl_getCellRect(m_nCurColumn,_nPrevRow,rCells); + _rCellRect.Bottom()=rCells.Bottom(); + } + m_pDataWindow->Invalidate(_rCellRect); + } + + //------------------------------------------------------------------------------- + //To Do: not really needed, because in method above one row can be invalidate. Please Prove this!!! + void TableControl_Impl::invalidateSelectedRow(RowPos _nCurRow, Rectangle& _rCellRect) + { + DBG_CHECK_ME(); + Rectangle aAllCells; + impl_getAllVisibleCellsArea( aAllCells ); + _rCellRect.Left() = aAllCells.Left(); + _rCellRect.Right() = aAllCells.Right(); + Rectangle rCells; + impl_getCellRect(m_nCurColumn,_nCurRow,rCells); + _rCellRect.Top()=rCells.Top(); + _rCellRect.Bottom()=rCells.Bottom(); + m_pDataWindow->Invalidate(_rCellRect); + } + //------------------------------------------------------------------------------- + //this method is to be called, when a new row is added + void TableControl_Impl::invalidateRow(RowPos _nRowPos, Rectangle& _rCellRect) + { + //DBG_CHECK_ME(); + TempHideCursor aHideCursor( *this ); + impl_getAllVisibleCellsArea( _rCellRect ); + TableRowGeometry _rRow( *this, _rCellRect, _nRowPos); + impl_ni_updateScrollbars(); + m_pDataWindow->Invalidate(_rRow.getRect()); + } + + //------------------------------------------------------------------------------- + std::vector& TableControl_Impl::getSelectedRows() + { + return m_nRowSelected; + } + + void TableControl_Impl::removeSelectedRow(RowPos _nRowPos) + { + int i =0; + //if the row is selected, remove it from the selection vector + if(isRowSelected(m_nRowSelected, _nRowPos)) + { + if(m_nRowSelected.size()>1) + m_nRowSelected.erase(m_nRowSelected.begin()+_nRowPos); + else + m_nRowSelected.clear(); + } + //after removing a row, row positions must be updated, so selected rows could stay selected + if(m_nRowSelected.size()>1) + { + for(std::vector::iterator it=m_nRowSelected.begin();it!=m_nRowSelected.end();++it) + { + if(*it > _nRowPos) + m_nRowSelected[i]=*it-1; + ++i; + } + } + if(_nRowPos == 0) + m_nCurRow = 0; + else + m_nCurRow = _nRowPos-1; + } + //------------------------------------------------------------------------------- + void TableControl_Impl::invalidateRows(RowPos _nRowStart, Rectangle& _rCellRect) + { + //DBG_CHECK_ME(); + (void)_nRowStart; + (void)_rCellRect; + /*TempHideCursor aHideCursor(*this); + Rectangle aAllCells; + impl_getAllVisibleCellsArea( aAllCells ); + TableRowGeometry _rRow( *this, aAllCells, _nRowStart); + _rCellRect = _rRow.getRect(); + Rectangle rCells1; + impl_getCellRect(m_nCurColumn,m_nRowCount,rCells1); + _rCellRect.Bottom() = rCells1.Bottom();*/ + /*if(_nRowStart != _nRowEnd) + { + TableRowGeometry _rRow( *this, aAllCells, _nRowEnd); + _rCellRect.Bottom() = _rRow.getRect().Bottom(); + } + */ + //_rCellRect.Right() = aAllCells.Right(); + //_rCellRect.Left() = aAllCells.Left(); + //Rectangle rCells1; + //impl_getCellRect(m_nCurColumn,_nRowStart,rCells1); + //_rCellRect.Top()=rCells1.Top(); + //Rectangle rCells2; + //impl_getCellRect(m_nCurColumn,_nRowEnd,rCells2); + //_rCellRect.Bottom()=rCells2.Bottom(); + impl_ni_updateScrollbars(); + //m_pDataWindow->Invalidate(_rCellRect); + m_pDataWindow->Invalidate(); + } + + + //------------------------------------------------------------------------------- + bool TableControl_Impl::isClickInVisibleArea(const Point& rPoint) + { + DBG_CHECK_ME(); + long nScrollbarMetrics = m_rAntiImpl.GetSettings().GetStyleSettings().GetScrollBarSize(); + //clickable area is in the visible table control area without the scrollbars + Rectangle aDataCellPlayground( Point( 0, 0 ), m_rAntiImpl.GetOutputSizePixel() ); + aDataCellPlayground.Top() = m_nColHeaderHeightPixel; + aDataCellPlayground.Right() -= nScrollbarMetrics; + aDataCellPlayground.Bottom() -= nScrollbarMetrics; + if((rPoint.X() >= aDataCellPlayground.Left() && rPoint.X() <= aDataCellPlayground.Right()) && rPoint.Y() >= aDataCellPlayground.Top() && rPoint.Y() <= aDataCellPlayground.Bottom()) + { + return true; + } + else + return false; + } + //-------------------------------------------------------------------- + TableSize TableControl_Impl::impl_getVisibleRows( bool _bAcceptPartialRow ) const + { + DBG_CHECK_ME(); + + DBG_ASSERT( m_pDataWindow, "TableControl_Impl::impl_getVisibleRows: no data window!" ); + + return lcl_getRowsFittingInto( + m_pDataWindow->GetOutputSizePixel().Height() - m_nColHeaderHeightPixel, + m_nRowHeightPixel, + _bAcceptPartialRow + ); + } + + //-------------------------------------------------------------------- + TableSize TableControl_Impl::impl_getVisibleColumns( bool _bAcceptPartialRow ) const + { + DBG_CHECK_ME(); + + DBG_ASSERT( m_pDataWindow, "TableControl_Impl::impl_getVisibleColumns: no data window!" ); + + return lcl_getColumnsVisibleWithin( + Rectangle( Point( 0, 0 ), m_pDataWindow->GetOutputSizePixel() ), + m_nLeftColumn, + *this, + _bAcceptPartialRow + ); + } + + //-------------------------------------------------------------------- + bool TableControl_Impl::goTo( ColPos _nColumn, RowPos _nRow ) + { + DBG_CHECK_ME(); + + // TODO: give veto listeners a chance + + if ( ( _nColumn < -1 ) || ( _nColumn >= m_nColumnCount ) + || ( _nRow < -1 ) || ( _nRow >= m_nRowCount ) + ) + return false; + + TempHideCursor aHideCursor( *this ); + m_nCurColumn = _nColumn; + m_nCurRow = _nRow; + + // ensure that the new cell is visible + ensureVisible( m_nCurColumn, m_nCurRow, false ); + + // TODO: invalidate all and new column/row header, if present, to enforce + // re-painting them + //if(!m_nRowSelected.empty()) + //{ + // Rectangle rCells; + // for(std::vector::iterator it=m_nRowSelected.begin(); + // it!=m_nRowSelected.end();++it) + // { + // invalidateSelectedRow(*it,rCells); + // } + // m_nRowSelected.clear(); + //} + // TODO: notify listeners about new position + return true; + } + + //-------------------------------------------------------------------- + void TableControl_Impl::ensureVisible( ColPos _nColumn, RowPos _nRow, bool _bAcceptPartialVisibility ) + { + DBG_CHECK_ME(); + DBG_ASSERT( ( _nColumn >= 0 ) && ( _nColumn < m_nColumnCount ) + && ( _nRow >= 0 ) && ( _nRow < m_nRowCount ), + "TableControl_Impl::ensureVisible: invalid coordinates!" ); + + TempHideCursor aHideCursor( *this ); + + if ( _nColumn < m_nLeftColumn ) + impl_ni_ScrollColumns( _nColumn - m_nLeftColumn ); + else + { + TableSize nVisibleColumns = impl_getVisibleColumns( _bAcceptPartialVisibility ); + if ( _nColumn > m_nLeftColumn + nVisibleColumns - 1 ) + { + impl_ni_ScrollColumns( _nColumn - ( m_nLeftColumn + nVisibleColumns - 1 ) ); + // TODO: since not all columns have the same width, this might in theory result + // in the column still not being visible. + } + } + + if ( _nRow < m_nTopRow ) + impl_ni_ScrollRows( _nRow - m_nTopRow ); + else + { + TableSize nVisibleRows = impl_getVisibleRows( _bAcceptPartialVisibility ); + if ( _nRow > m_nTopRow + nVisibleRows - 1 ) + impl_ni_ScrollRows( _nRow - ( m_nTopRow + nVisibleRows - 1 ) ); + } + } + + //-------------------------------------------------------------------- + TableSize TableControl_Impl::impl_ni_ScrollRows( TableSize _nRowDelta ) + { + // compute new top row + RowPos nNewTopRow = + ::std::max( + ::std::min( (RowPos)( m_nTopRow + _nRowDelta ), (RowPos)( m_nRowCount - 1 ) ), + (RowPos)0 + ); + + RowPos nOldTopRow = m_nTopRow; + m_nTopRow = nNewTopRow; + + // if updates are enabled currently, scroll the viewport + if ( m_rAntiImpl.IsUpdateMode() && ( m_nTopRow != nOldTopRow ) ) + { + DBG_SUSPEND_INV( INV_SCROLL_POSITION ); + TempHideCursor aHideCursor( *this ); + // TODO: call a onStartScroll at our listener (or better an own onStartScroll, + // which hides the cursor and then calls the listener) + // Same for onEndScroll + + // scroll the view port, if possible + long nPixelDelta = m_nRowHeightPixel * ( m_nTopRow - nOldTopRow ); + + Rectangle aDataArea( Point( 0, m_nColHeaderHeightPixel ), m_pDataWindow->GetOutputSizePixel() ); + + if ( m_pDataWindow->GetBackground().IsScrollable() + && abs( nPixelDelta ) < aDataArea.GetHeight() + ) + { + m_pDataWindow->Scroll( 0, (long)-nPixelDelta, aDataArea, SCROLL_CLIP | SCROLL_UPDATE ); + } + else + m_pDataWindow->Invalidate( INVALIDATE_UPDATE ); + + // update the position at the vertical scrollbar + m_pVScroll->SetThumbPos( m_nTopRow ); + } + + return (TableSize)( m_nTopRow - nOldTopRow ); + } + + //-------------------------------------------------------------------- + TableSize TableControl_Impl::impl_ni_ScrollColumns( TableSize _nColumnDelta ) + { + // compute new left column + ColPos nNewLeftColumn = + ::std::max( + ::std::min( (ColPos)( m_nLeftColumn + _nColumnDelta ), (ColPos)( m_nColumnCount - 1 ) ), + (ColPos)0 + ); + + ColPos nOldLeftColumn = m_nLeftColumn; + m_nLeftColumn = nNewLeftColumn; + + // if updates are enabled currently, scroll the viewport + if ( m_rAntiImpl.IsUpdateMode() && ( m_nLeftColumn != nOldLeftColumn ) ) + { + DBG_SUSPEND_INV( INV_SCROLL_POSITION ); + TempHideCursor aHideCursor( *this ); + // TODO: call a onStartScroll at our listener (or better an own onStartScroll, + // which hides the cursor and then calls the listener) + // Same for onEndScroll + + // scroll the view port, if possible + Rectangle aDataArea( Point( m_nRowHeaderWidthPixel, 0 ), m_pDataWindow->GetOutputSizePixel() ); + + long nPixelDelta = + ( m_nLeftColumn > 0 ? m_aAccColumnWidthsPixel[ m_nLeftColumn - 1 ] : 0 ) + - ( nOldLeftColumn > 0 ? m_aAccColumnWidthsPixel[ nOldLeftColumn - 1 ] : 0 ); + + if ( m_pDataWindow->GetBackground().IsScrollable() + && abs( nPixelDelta ) < aDataArea.GetWidth() + ) + { + m_pDataWindow->Scroll( (long)-nPixelDelta, 0, aDataArea, SCROLL_CLIP | SCROLL_UPDATE ); + } + else + m_pDataWindow->Invalidate( INVALIDATE_UPDATE ); + + // update the position at the horizontal scrollbar + m_pHScroll->SetThumbPos( m_nLeftColumn ); + } + + return (TableSize)( m_nLeftColumn - nOldLeftColumn ); + } + + SelectionEngine* TableControl_Impl::getSelEngine() + { + return m_pSelEngine; + } + TableDataWindow* TableControl_Impl::getDataWindow() + { + return m_pDataWindow; + } + BOOL TableControl_Impl::isRowSelected(::std::vector selectedRows, RowPos current) + { + for(::std::vector::iterator it=selectedRows.begin(); + it!=selectedRows.end();++it) + { + if(*it == current) + return TRUE; + } + return FALSE; + } + + int TableControl_Impl::getRowSelectedNumber(::std::vector selectedRows, RowPos current) + { + int pos = -1; + int i = 0; + for(std::vector::iterator it=selectedRows.begin();it!=selectedRows.end();++it) + { + if(*it == current) + return pos = i; + ++i; + } + return pos; + } + + void TableControl_Impl::setCellContent(CellEntryType* pCellEntryType) + { + (void)pCellEntryType; + } + + //-------------------------------------------------------------------- + IMPL_LINK( TableControl_Impl, OnScroll, ScrollBar*, _pScrollbar ) + { + DBG_ASSERT( ( _pScrollbar == m_pVScroll ) || ( _pScrollbar == m_pHScroll ), + "TableControl_Impl::OnScroll: where did this come from?" ); + + if ( _pScrollbar == m_pVScroll ) + impl_ni_ScrollRows( _pScrollbar->GetDelta() ); + else + impl_ni_ScrollColumns( _pScrollbar->GetDelta() ); + + return 0L; + } + + //--------------------------------------------------------------------------------------- + TableFunctionSet::TableFunctionSet(TableControl_Impl* _pTableControl): + m_pTableControl( _pTableControl) + ,m_nCurrentRow (-2) + { + } + + TableFunctionSet::~TableFunctionSet() + { + } + + void TableFunctionSet::BeginDrag() + { + } + + void TableFunctionSet::CreateAnchor() + { + m_pTableControl->m_nAnchor = m_pTableControl->m_nCurRow; + } + + void TableFunctionSet::DestroyAnchor() + { + m_pTableControl->m_nAnchor = -1; + } + + BOOL TableFunctionSet::SetCursorAtPoint(const Point& rPoint, BOOL bDontSelectAtCursor) + { + BOOL bHandled = FALSE; + Rectangle rCells; + //curRow is the row where the mouse click happened, m_nCurRow is the last selected row, before the mouse click + RowPos curRow = m_pTableControl->getCurrentRow(rPoint); + if(curRow == -2) + return FALSE; + if( bDontSelectAtCursor ) + { + if(m_pTableControl->m_nRowSelected.size()>1) + m_pTableControl->m_pSelEngine->AddAlways(TRUE); + bHandled = TRUE; + } + else if(m_pTableControl->m_nAnchor == m_pTableControl->m_nCurRow) + { + //selecting region, + int diff = m_pTableControl->m_nCurRow - curRow; + //bool isAlreadySelected = m_pTableControl->isRowSelected(m_pTableControl->m_nRowSelected, m_pTableControl->m_nAnchor); + /* if(!isAlreadySelected && m_nCurrentRow != m_pTableControl->m_nCurRow) + m_pTableControl->m_nRowSelected.push_back(m_nAnchor);*/ + //selected region lies above the last selection + if( diff >= 0) + { + //put selected rows in vector + while(m_pTableControl->m_nAnchor>=curRow) + { + bool isAlreadySelected = m_pTableControl->isRowSelected(m_pTableControl->m_nRowSelected, m_pTableControl->m_nAnchor); + //if row isn't selected, put it in vector, otherwise don't put it there, because it will be twice there + if(!isAlreadySelected) + m_pTableControl->m_nRowSelected.push_back(m_pTableControl->m_nAnchor); + m_pTableControl->m_nAnchor--; + diff--; + } + m_pTableControl->m_nAnchor++; + } + //selected region lies beneath the last selected row + else + { + while(m_pTableControl->m_nAnchor<=curRow) + { + bool isAlreadySelected = m_pTableControl->isRowSelected(m_pTableControl->m_nRowSelected, m_pTableControl->m_nAnchor); + if(!isAlreadySelected) + m_pTableControl->m_nRowSelected.push_back(m_pTableControl->m_nAnchor); + m_pTableControl->m_nAnchor++; + diff++; + } + m_pTableControl->m_nAnchor--; + } + m_pTableControl->invalidateSelectedRegion(m_pTableControl->m_nCurRow, curRow, rCells); + bHandled = TRUE; + } + //no region selected + else + { + if(m_pTableControl->m_nRowSelected.empty()) + { + m_pTableControl->m_nRowSelected.push_back(curRow); + } + else + { + if(m_pTableControl->m_pSelEngine->GetSelectionMode()==SINGLE_SELECTION) + { + DeselectAll(); + m_pTableControl->m_nRowSelected.push_back(curRow); + } + else + { + bool isAlreadySelected = m_pTableControl->isRowSelected(m_pTableControl->m_nRowSelected, curRow); + if(!isAlreadySelected) + m_pTableControl->m_nRowSelected.push_back(curRow); + } + } + if(m_pTableControl->m_nRowSelected.size()>1 && m_pTableControl->m_pSelEngine->GetSelectionMode()!=SINGLE_SELECTION) + m_pTableControl->m_pSelEngine->AddAlways(TRUE); + m_pTableControl->invalidateSelectedRow(curRow,rCells); + bHandled = TRUE; + } + m_pTableControl->m_nCurRow = curRow; + m_pTableControl->ensureVisible(m_pTableControl->m_nCurColumn,m_pTableControl->m_nCurRow,false); + return bHandled; + } + + BOOL TableFunctionSet::IsSelectionAtPoint( const Point& rPoint ) + { + m_pTableControl->m_pSelEngine->AddAlways(FALSE); + if(m_pTableControl->m_nRowSelected.empty()) + return FALSE; + else + { + RowPos curRow = m_pTableControl->getCurrentRow(rPoint); + m_pTableControl->m_nAnchor = -1; + bool selected = m_pTableControl->isRowSelected(m_pTableControl->m_nRowSelected, curRow); + m_nCurrentRow = curRow; + return selected; + } + } + + void TableFunctionSet::DeselectAtPoint( const Point& rPoint ) + { + (void)rPoint; + long pos = 0; + long i = 0; + Rectangle rCells; + for(std::vector::iterator it=m_pTableControl->m_nRowSelected.begin(); + it!=m_pTableControl->m_nRowSelected.end();++it) + { + if(*it == m_nCurrentRow) + { + pos = i; + m_pTableControl->invalidateSelectedRow(*it,rCells); + } + ++i; + } + m_pTableControl->m_nRowSelected.erase(m_pTableControl->m_nRowSelected.begin()+pos); + } + void TableFunctionSet::DeselectAll() + { + if(!m_pTableControl->m_nRowSelected.empty()) + { + Rectangle rCells; + for(std::vector::iterator it=m_pTableControl->m_nRowSelected.begin(); + it!=m_pTableControl->m_nRowSelected.end();++it) + { + m_pTableControl->invalidateSelectedRow(*it,rCells); + } + m_pTableControl->m_nRowSelected.clear(); + } + } + +//........................................................................ +} } // namespace svt::table +//........................................................................ diff --git a/svtools/source/table/tablecontrol_impl.hxx b/svtools/source/table/tablecontrol_impl.hxx new file mode 100644 index 000000000000..0a25e82e4502 --- /dev/null +++ b/svtools/source/table/tablecontrol_impl.hxx @@ -0,0 +1,342 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef SVTOOLS_TABLECONTROL_IMPL_HXX +#define SVTOOLS_TABLECONTROL_IMPL_HXX + +#ifndef SVTOOLS_INC_TABLE_TABLEMODEL_HXX +#include +#endif + +#ifndef SVTOOLS_INC_TABLE_ABSTRACTTABLECONTROL_HXX +#include +#endif + +#include +#include +#include + +class ScrollBar; +class ScrollBarBox; + +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + + typedef ::std::vector< long > ArrayOfLong; + + class TableControl; + class TableDataWindow; + class TableFunctionSet; + + //==================================================================== + //= TableControl_Impl + //==================================================================== + class TableControl_Impl : public IAbstractTableControl + { + friend class TableGeometry; + friend class TableRowGeometry; + friend class TableColumnGeometry; + friend class SuspendInvariants; + friend class TableFunctionSet; + private: + /// the control whose impl-instance we implemnt + TableControl& m_rAntiImpl; + /// the model of the table control + PTableModel m_pModel; + /// the input handler to use, usually the input handler as provided by ->m_pModel + PTableInputHandler m_pInputHandler; + /// the widths of the single columns, measured in pixel + ArrayOfLong m_aColumnWidthsPixel; + /** the accumulated widths of the single columns, i.e. their exclusive right borders, + counting the space for a possible row header column + */ + ArrayOfLong m_aAccColumnWidthsPixel; + /// the height of a single row in the table, measured in pixels + long m_nRowHeightPixel; + /// the height of the column header row in the table, measured in pixels + long m_nColHeaderHeightPixel; + /// the width of the row header column in the table, measured in pixels + long m_nRowHeaderWidthPixel; + + /// the number of columns in the table control. Cached model value. + TableSize m_nColumnCount; + /// the number of rows in the table control. Cached model value. + TableSize m_nRowCount; + + ColPos m_nCurColumn; + RowPos m_nCurRow; + ColPos m_nLeftColumn; + RowPos m_nTopRow; + + sal_Int32 m_nCursorHidden; + + /** the window to contain all data content, including header bars + + The window's upper left corner is at position (0,0), relative to the + table control, which is the direct parent of the data window. + */ + TableDataWindow* m_pDataWindow; + /// the vertical scrollbar, if any + ScrollBar* m_pVScroll; + /// the horizontal scrollbar, if any + ScrollBar* m_pHScroll; + ScrollBarBox* m_pScrollCorner; + //selection engine - for determining selection range, e.g. single, multiple + SelectionEngine* m_pSelEngine; + //vector which contains the selected rows + std::vector m_nRowSelected; + //part of selection engine + TableFunctionSet* m_pTableFunctionSet; + //part of selection engine + RowPos m_nAnchor; + + + +#if DBG_UTIL + #define INV_SCROLL_POSITION 1 + /** represents a bitmask of invariants to check + + Actually, impl_checkInvariants checks more invariants than denoted in this + bit mask, but only those present here can be disabled temporarily. + */ + sal_Int32 m_nRequiredInvariants; +#endif + + public: + + + PTableModel getModel() const; + void setModel( PTableModel _pModel ); + + inline const PTableInputHandler& getInputHandler() const { return m_pInputHandler; } + + inline ColPos getCurColumn() const { return m_nCurColumn; } + inline RowPos getCurRow() const { return m_nCurRow; } + inline void setCurRow(RowPos curRow){ m_nCurRow = curRow; } + inline RowPos getTopRow() const { return m_nTopRow; } + inline long getRowCount() const { return m_nRowCount; } + inline long getColumnCount() const { return m_nColumnCount; } + + inline long getColHeaderHightPixel() const { return m_nColHeaderHeightPixel; } + + inline const TableControl& getAntiImpl() const { return m_rAntiImpl; } + inline TableControl& getAntiImpl() { return m_rAntiImpl; } + void setCellContent(CellEntryType* pCellEntryType); + + public: + TableControl_Impl( TableControl& _rAntiImpl ); + ~TableControl_Impl(); + +#if DBG_UTIL + const sal_Char* impl_checkInvariants() const; +#endif + /** to be called when the anti-impl instance has been resized + */ + void onResize(); + + /** paints the table control content which intersects with the given rectangle + */ + void doPaintContent( const Rectangle& _rUpdateRect ); + + /** moves the cursor to the cell with the given coordinates + + To ease the caller's code, the coordinates must not necessarily denote a + valid position. If they don't, will be returned. + */ + bool goTo( ColPos _nColumn, RowPos _nRow ); + + /** ensures that the given coordinate is visible + @param _nColumn + the column position which should be visible. Must be non-negative, and smaller + than the column count. + @param _nRow + the row position which should be visibleMust be non-negative, and smaller + than the row count. + @param _bAcceptPartialVisibility + if it's okay that the given cooordinate is only partially visible + */ + void ensureVisible( ColPos _nColumn, RowPos _nRow, bool _bAcceptPartialVisibility ); + /** returns the row, which contains the input point*/ + RowPos getCurrentRow (const Point& rPoint); + + void setCursorAtCurrentCell(const Point& rPoint); + /** proves whether the vector with the selected rows contains the current row*/ + BOOL isRowSelected(::std::vector selectedRows, RowPos current); + /** returns the position of the current row in the selecttion vector */ + int getRowSelectedNumber(::std::vector selectedRows, RowPos current); + /** _rCellRect contains the region, which should be invalidate after some action e.g. selectiong row*/ + void invalidateSelectedRegion(RowPos _nPrevRow, RowPos _nCurRow, Rectangle& _rCellRect ); + /** _rCellRect contains the region, which should be invalidate after some action e.g. selectiong row*/ + //vielleicht kann man mit den anderen verschmelzen, mit einer berprfung ob prev==curr? + void invalidateSelectedRow( RowPos _nCurRow, Rectangle& _rCellRect ); + /** to be called when a new row is added to the control*/ + void invalidateRow(RowPos _nRowPos, Rectangle& _rCellRect ); + /** returns the vector, which contains the selected rows*/ + std::vector& getSelectedRows(); + /** updates the vector, which contains the selected rows after removing the row nRowPos*/ + void removeSelectedRow(RowPos _nRowPos); + void invalidateRows(RowPos _nRowStart, Rectangle& _rCellRect ); + //virtual void DoubleClick(); + + // IAbstractTableControl + virtual void hideCursor(); + virtual void showCursor(); + virtual bool dispatchAction( TableControlAction _eAction ); + virtual bool isClickInVisibleArea(const Point& rPoint); + virtual SelectionEngine* getSelEngine(); + + TableDataWindow* getDataWindow(); + /** retrieves the area occupied by the totality of (at least partially) visible cells + + The returned area includes row and column headers. Also, it takes into + account the the fact that there might be less columns than would normally + find room in the control. + + As a result of respecting the partial visibility of rows and columns, + the returned area might be larger than the data window's output size. + */ + void impl_getAllVisibleCellsArea( Rectangle& _rCellArea ) const; + + /** retrieves the area occupied by all (at least partially) visible data cells. + + Effectively, the returned area is the same as returned by ->impl_getAllVisibleCellsArea, + minus the row and column header areas. + */ + void impl_getAllVisibleDataCellArea( Rectangle& _rCellArea ) const; + private: + /** toggles the cursor visibility + + The method is not bound to the classes public invariants, as it's used in + situations where the they must not necessarily be fullfilled. + */ + void impl_ni_doSwitchCursor( bool _bOn ); + + /** returns the number of visible rows. + + @param _bAcceptPartialRow + specifies whether a possible only partially visible last row is + counted, too. + */ + TableSize impl_getVisibleRows( bool _bAcceptPartialRow ) const; + + /** returns the number of visible columns + + The value may change with different horizontal scroll positions, as + different columns have different widths. For instance, if your control is + 100 pixels wide, and has three columns of width 50, 50, 100, respectively, + then this method will return either "2" or "1", depending on which column + is the first visible one. + + @param _bAcceptPartialRow + specifies whether a possible only partially visible last row is + counted, too. + */ + TableSize impl_getVisibleColumns( bool _bAcceptPartialRow ) const; + + /** determines the rectangle occupied by the given cell + */ + void impl_getCellRect( ColPos _nColumn, RowPos _nRow, Rectangle& _rCellRect ) const; + + /** updates all cached model values + + The method is not bound to the classes public invariants, as it's used in + situations where the they must not necessarily be fullfilled. + */ + void impl_ni_updateCachedModelValues(); + + /** updates ->m_aColumnWidthsPixel with the current pixel widths of all model columns + + The method takes into account the current zoom factor and map mode of the table + control, plus any possible COLWIDTH_FIT_TO_VIEW widths in the model columns. + + The method is not bound to the classes public invariants, as it's used in + situations where the they must not necessarily be fullfilled. + */ + void impl_ni_updateColumnWidths(); + + /** updates the scrollbars of the control + + The method is not bound to the classes public invariants, as it's used in + situations where the they must not necessarily be fullfilled. + + This includes both the existence of the scrollbars, and their + state. + */ + void impl_ni_updateScrollbars(); + + /** scrolls the view by the given number of rows + + The method is not bound to the classes public invariants, as it's used in + situations where the they must not necessarily be fullfilled. + + @return + the number of rows by which the viewport was scrolled. This may differ + from the given numbers to scroll in case the begin or the end of the + row range were reached. + */ + TableSize impl_ni_ScrollRows( TableSize _nRowDelta ); + + /** scrolls the view by the given number of columns + + The method is not bound to the classes public invariants, as it's used in + situations where the they must not necessarily be fullfilled. + + @return + the number of columns by which the viewport was scrolled. This may differ + from the given numbers to scroll in case the begin or the end of the + column range were reached. + */ + TableSize impl_ni_ScrollColumns( TableSize _nRowDelta ); + + DECL_LINK( OnScroll, ScrollBar* ); + }; + //see seleng.hxx, seleng.cxx, FunctionSet overwritables, part of selection engine + class TableFunctionSet : public FunctionSet + { + friend class TableDataWindow; + private: + TableControl_Impl* m_pTableControl; + RowPos m_nCurrentRow; + public: + TableFunctionSet(TableControl_Impl* _pTableControl); + virtual ~TableFunctionSet(); + + virtual void BeginDrag(); + virtual void CreateAnchor(); + virtual void DestroyAnchor(); + virtual BOOL SetCursorAtPoint(const Point& rPoint, BOOL bDontSelectAtCursor); + virtual BOOL IsSelectionAtPoint( const Point& rPoint ); + virtual void DeselectAtPoint( const Point& rPoint ); + virtual void DeselectAll(); + }; + + +//........................................................................ +} } // namespace svt::table +//........................................................................ + +#endif // SVTOOLS_TABLECONTROL_IMPL_HXX diff --git a/svtools/source/table/tabledatawindow.cxx b/svtools/source/table/tabledatawindow.cxx new file mode 100644 index 000000000000..71a313bb2e00 --- /dev/null +++ b/svtools/source/table/tabledatawindow.cxx @@ -0,0 +1,81 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" + +#include "svtools/table/tablecontrol.hxx" +#include "svtools/table/tabledatawindow.hxx" +#include "tablecontrol_impl.hxx" + +//........................................................................ +namespace svt { namespace table +{ + class TableControl_Impl; +//........................................................................ + + //==================================================================== + //= TableDataWindow + //==================================================================== + //-------------------------------------------------------------------- + TableDataWindow::TableDataWindow( TableControl_Impl& _rTableControl ) + :Window( &_rTableControl.getAntiImpl() ) + ,m_rTableControl ( _rTableControl ) + { + Color backgroundColor = m_rTableControl.getAntiImpl().GetSettings().GetStyleSettings().GetFieldColor(); + SetBackground( backgroundColor ); + SetControlBackground( backgroundColor ); + } + + //-------------------------------------------------------------------- + void TableDataWindow::Paint( const Rectangle& rUpdateRect ) + { + m_rTableControl.doPaintContent( rUpdateRect ); + } + void TableDataWindow::MouseMove( const MouseEvent& rMEvt ) + { + if ( !m_rTableControl.getInputHandler()->MouseMove( m_rTableControl, rMEvt ) ) + Window::MouseMove( rMEvt ); + } + void TableDataWindow::MouseButtonDown( const MouseEvent& rMEvt ) + { + if ( !m_rTableControl.getInputHandler()->MouseButtonDown( m_rTableControl, rMEvt ) ) + Window::MouseButtonDown( rMEvt ); + else + m_aMouseButtonDownHdl.Call( (MouseEvent*) &rMEvt); + m_rTableControl.getAntiImpl().LoseFocus(); + } + void TableDataWindow::MouseButtonUp( const MouseEvent& rMEvt ) + { + if ( !m_rTableControl.getInputHandler()->MouseButtonUp( m_rTableControl, rMEvt ) ) + Window::MouseButtonUp( rMEvt ); + else + m_aMouseButtonUpHdl.Call( (MouseEvent*) &rMEvt); + m_rTableControl.getAntiImpl().GetFocus(); + } + +//........................................................................ +} } // namespace svt::table +//........................................................................ diff --git a/svtools/source/table/tablegeometry.cxx b/svtools/source/table/tablegeometry.cxx new file mode 100644 index 000000000000..569e14c61726 --- /dev/null +++ b/svtools/source/table/tablegeometry.cxx @@ -0,0 +1,130 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" + + +#include "tablegeometry.hxx" +#include "tablecontrol_impl.hxx" + +#include + +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + + //==================================================================== + //= TableRowGeometry + //==================================================================== + //-------------------------------------------------------------------- + TableRowGeometry::TableRowGeometry( const TableControl_Impl& _rControl, const Rectangle& _rBoundaries, + RowPos _nRow ) + :TableGeometry( _rControl, _rBoundaries ) + ,m_nRowPos( _nRow ) + { + if ( m_nRowPos == ROW_COL_HEADERS ) + { + DBG_ASSERT( m_rControl.m_pModel->hasColumnHeaders(), + "TableRowGeometry::TableRowGeometry: why asking for the geoemtry of the non-existent column header row?" ); + m_aRect.Top() = 0; + m_aRect.Bottom() = m_rControl.m_nColHeaderHeightPixel - 1; + } + else + { + if ( ( m_nRowPos >= m_rControl.m_nTopRow ) && ( m_nRowPos < m_rControl.m_pModel->getRowCount() ) ) + { + m_aRect.Top() = m_rControl.m_nColHeaderHeightPixel + ( m_nRowPos - m_rControl.m_nTopRow ) * m_rControl.m_nRowHeightPixel; + m_aRect.Bottom() = m_aRect.Top() + m_rControl.m_nRowHeightPixel - 1; + } + else + m_aRect.SetEmpty(); + } + } + + //-------------------------------------------------------------------- + bool TableRowGeometry::moveDown() + { + if ( ++m_nRowPos < m_rControl.m_pModel->getRowCount() ) + m_aRect.Move( 0, m_rControl.m_nRowHeightPixel ); + else + m_aRect.SetEmpty(); + return isValid(); + } + + //==================================================================== + //= TableColumnGeometry + //==================================================================== + //-------------------------------------------------------------------- + TableColumnGeometry::TableColumnGeometry( const TableControl_Impl& _rControl, const Rectangle& _rBoundaries, + ColPos _nCol ) + :TableGeometry( _rControl, _rBoundaries ) + ,m_nColPos( _nCol ) + { + if ( m_nColPos == COL_ROW_HEADERS ) + { + DBG_ASSERT( m_rControl.m_pModel->hasRowHeaders(), + "TableColumnGeometry::TableColumnGeometry: why asking for the geoemtry of the non-existent row header column?" ); + m_aRect.Left() = 0; + m_aRect.Right() = m_rControl.m_nRowHeaderWidthPixel - 1; + } + else + { + ColPos nLeftColumn = m_rControl.m_nLeftColumn; + if ( ( m_nColPos >= nLeftColumn ) && ( m_nColPos < (ColPos)m_rControl.m_aColumnWidthsPixel.size() ) ) + { + m_aRect.Left() = m_rControl.m_nRowHeaderWidthPixel; + // TODO: take into account any possibly frozen columns + + for ( ColPos col = nLeftColumn; col < m_nColPos; ++col ) + m_aRect.Left() += m_rControl.m_aColumnWidthsPixel[ col ]; + m_aRect.Right() = m_aRect.Left() + m_rControl.m_aColumnWidthsPixel[ m_nColPos ] - 1; + } + else + m_aRect.SetEmpty(); + } + } + + //-------------------------------------------------------------------- + bool TableColumnGeometry::moveRight() + { + DBG_ASSERT( m_nColPos != COL_ROW_HEADERS, "TableColumnGeometry::moveRight: cannot move the row header column!" ); + // what would be COL_ROW_HEADERS + 1? + + if ( ++m_nColPos < (ColPos)m_rControl.m_aColumnWidthsPixel.size() ) + { + m_aRect.Left() = m_aRect.Right() + 1; + m_aRect.Right() += m_rControl.m_aColumnWidthsPixel[ m_nColPos ]; + } + else + m_aRect.SetEmpty(); + + return isValid(); + } + +//........................................................................ +} } // namespace svt::table +//........................................................................ diff --git a/svtools/source/table/tablegeometry.hxx b/svtools/source/table/tablegeometry.hxx new file mode 100644 index 000000000000..18b40c1e3781 --- /dev/null +++ b/svtools/source/table/tablegeometry.hxx @@ -0,0 +1,161 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef SVTOOLS_TABLEGEOMETRY_HXX +#define SVTOOLS_TABLEGEOMETRY_HXX + +#ifndef SVTOOLS_INC_TABLE_TABLETYPES_HXX +#include +#endif + +#ifndef _SV_GEN_HXX +#include +#endif + +//........................................................................ +namespace svt { namespace table +{ +//........................................................................ + + class TableControl_Impl; + + //==================================================================== + //= TableGeometry + //==================================================================== + class TableGeometry + { + protected: + const TableControl_Impl& m_rControl; + const Rectangle& m_rBoundaries; + Rectangle m_aRect; + + protected: + TableGeometry( + const TableControl_Impl& _rControl, + const Rectangle& _rBoundaries + ) + :m_rControl( _rControl ) + ,m_rBoundaries( _rBoundaries ) + ,m_aRect( _rBoundaries ) + { + } + + public: + // attribute access + const TableControl_Impl& getControl() const { return m_rControl; } + + // status + const Rectangle& getRect() const { return m_aRect; } + bool isValid() const { return !m_aRect.GetIntersection( m_rBoundaries ).IsEmpty(); } + }; + + //==================================================================== + //= TableRowGeometry + //==================================================================== + class TableRowGeometry : public TableGeometry + { + protected: + RowPos m_nRowPos; + + public: + TableRowGeometry( + const TableControl_Impl& _rControl, + const Rectangle& _rBoundaries, + RowPos _nRow + ); + + // status + RowPos getRow() const { return m_nRowPos; } + // operations + bool moveDown(); + }; + + //==================================================================== + //= TableColumnGeometry + //==================================================================== + class TableColumnGeometry : public TableGeometry + { + protected: + ColPos m_nColPos; + + public: + TableColumnGeometry( + const TableControl_Impl& _rControl, + const Rectangle& _rBoundaries, + ColPos _nCol + ); + + // status + ColPos getCol() const { return m_nColPos; } + // operations + bool moveRight(); + }; + + //==================================================================== + //= TableCellGeometry + //==================================================================== + /** a helper representing geometry information of a cell + */ + class TableCellGeometry + { + private: + TableRowGeometry m_aRow; + TableColumnGeometry m_aCol; + + public: + TableCellGeometry( + const TableControl_Impl& _rControl, + const Rectangle& _rBoundaries, + ColPos _nCol, + RowPos _nRow + ) + :m_aRow( _rControl, _rBoundaries, _nRow ) + ,m_aCol( _rControl, _rBoundaries, _nCol ) + { + } + + TableCellGeometry( + const TableRowGeometry& _rRow, + ColPos _nCol + ) + :m_aRow( _rRow ) + ,m_aCol( _rRow.getControl(), _rRow.getRect(), _nCol ) + { + } + + inline Rectangle getRect() const { return m_aRow.getRect().GetIntersection( m_aCol.getRect() ); } + inline RowPos getRow() const { return m_aRow.getRow(); } + inline ColPos getColumn() const { return m_aCol.getCol(); } + inline bool isValid() const { return !getRect().IsEmpty(); } + + inline bool moveDown() {return m_aRow.moveDown(); } + inline bool moveRight() {return m_aCol.moveRight(); } + }; + +//........................................................................ +} } // namespace svt::table +//........................................................................ + +#endif // SVTOOLS_TABLEGEOMETRY_HXX diff --git a/svtools/uno/addrtempuno.cxx b/svtools/source/uno/addrtempuno.cxx similarity index 100% rename from svtools/uno/addrtempuno.cxx rename to svtools/source/uno/addrtempuno.cxx diff --git a/svtools/source/uno/contextmenuhelper.cxx b/svtools/source/uno/contextmenuhelper.cxx index be7738adaf14..b3ae322aa3ba 100644 --- a/svtools/source/uno/contextmenuhelper.cxx +++ b/svtools/source/uno/contextmenuhelper.cxx @@ -611,7 +611,7 @@ ContextMenuHelper::completeMenuProperties( // menu correctly. const StyleSettings& rSettings = Application::GetSettings().GetStyleSettings(); bool bShowMenuImages( rSettings.GetUseImagesInMenus() ); - bool bIsHiContrast( rSettings.GetMenuColor().IsDark() ); + bool bIsHiContrast( rSettings.GetHighContrastMode() ); if ( pMenu ) { diff --git a/svtools/source/uno/makefile.mk b/svtools/source/uno/makefile.mk index 76ab335d58d5..82e509f1ce08 100644 --- a/svtools/source/uno/makefile.mk +++ b/svtools/source/uno/makefile.mk @@ -1,4 +1,4 @@ - +#************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # @@ -46,17 +46,20 @@ SRS1NAME= uno SRC1FILES= unoifac2.src SLOFILES= \ - $(SLO)$/unoiface.obj \ - $(SLO)$/unoevent.obj \ - $(SLO)$/unoimap.obj \ - $(SLO)$/toolboxcontroller.obj \ + $(SLO)$/addrtempuno.obj \ + $(SLO)$/contextmenuhelper.obj \ $(SLO)$/framestatuslistener.obj \ - $(SLO)$/statusbarcontroller.obj \ - $(SLO)$/genericunodialog.obj \ $(SLO)$/generictoolboxcontroller.obj \ + $(SLO)$/genericunodialog.obj \ + $(SLO)$/miscservices.obj\ + $(SLO)$/statusbarcontroller.obj \ + $(SLO)$/toolboxcontroller.obj \ $(SLO)$/treecontrolpeer.obj \ - $(SLO)$/registerservices.obj\ - $(SLO)$/contextmenuhelper.obj + $(SLO)$/unocontroltablemodel.obj \ + $(SLO)$/unoevent.obj \ + $(SLO)$/unoiface.obj \ + $(SLO)$/unoimap.obj \ + $(SLO)$/svtxgridcontrol.obj # --- Targets ------------------------------------------------------ diff --git a/svtools/uno/miscservices.cxx b/svtools/source/uno/miscservices.cxx similarity index 86% rename from svtools/uno/miscservices.cxx rename to svtools/source/uno/miscservices.cxx index e5c5aac3c35d..0f7b79720179 100644 --- a/svtools/uno/miscservices.cxx +++ b/svtools/source/uno/miscservices.cxx @@ -92,11 +92,6 @@ SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo ( xNewKey->createKey ( OUString::createFromAscii( "com.sun.star.ui.dialogs.FilterOptionsDialog" ) ); - xNewKey = xRegistryKey->createKey( - OUString::createFromAscii( "/com.sun.star.comp.svtools.PathService/UNO/SERVICES" ) ); - xNewKey->createKey ( - OUString::createFromAscii( "com.sun.star.config.SpecialConfigManager" ) ); - return sal_True; } return sal_False; @@ -135,18 +130,6 @@ SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory ( SvFilterOptionsDialog_CreateInstance, aServiceNames); } - else if (rtl_str_compare ( - pImplementationName, "com.sun.star.comp.svtools.PathService") == 0) - { - Sequence< OUString > aServiceNames(1); - aServiceNames.getArray()[0] = - OUString::createFromAscii( "com.sun.star.config.SpecialConfigManager" ); - xFactory = ::cppu::createSingleFactory ( - reinterpret_cast< XMultiServiceFactory* >( _pServiceManager ), - OUString::createFromAscii( pImplementationName ), - PathService_CreateInstance, - aServiceNames); - } if ( xFactory.is() ) { xFactory->acquire(); diff --git a/svtools/source/uno/svtxgridcontrol.cxx b/svtools/source/uno/svtxgridcontrol.cxx new file mode 100755 index 000000000000..2f2c896ee6a8 --- /dev/null +++ b/svtools/source/uno/svtxgridcontrol.cxx @@ -0,0 +1,458 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: SVTXGridControl.cxx,v $ + * $Revision: 1.32 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" + +#include "svtxgridcontrol.hxx" +#include +#include "svtools/table/gridtablerenderer.hxx" +#include "svtools/table/defaultinputhandler.hxx" +#include "svtools/table/tablecontrol.hxx" +#include "unocontroltablemodel.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using ::rtl::OUString; +using namespace ::svt::table; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::awt::grid; +using namespace ::com::sun::star::view; +using namespace ::toolkit; +using namespace ::com::sun::star::accessibility; +using namespace ::com::sun::star::accessibility::AccessibleEventId; +using namespace ::com::sun::star::accessibility::AccessibleTableModelChangeType; +using ::com::sun::star::accessibility::AccessibleTableModelChange; + + +SVTXGridControl::SVTXGridControl() + :m_pTableModel (new UnoControlTableModel()), + m_xDataModel(0), + m_xColumnModel(0), + m_bHasColumnHeaders(false), + m_bHasRowHeaders(false), + m_bVScroll(false), + m_bHScroll(false) +{ +} + +//-------------------------------------------------------------------- +SVTXGridControl::~SVTXGridControl() +{ + DELETEZ(m_pTableModel); +} + +::com::sun::star::uno::Any SVTXGridControl::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException) +{ + ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType, + SAL_STATIC_CAST( ::com::sun::star::awt::grid::XGridControl*, this ), + SAL_STATIC_CAST( ::com::sun::star::awt::grid::XGridDataListener*, this ), + SAL_STATIC_CAST( ::com::sun::star::lang::XTypeProvider*, this ) ); + return (aRet.hasValue() ? aRet : VCLXWindow::queryInterface( rType )); +} + +// ::com::sun::star::lang::XTypeProvider +IMPL_XTYPEPROVIDER_START( SVTXGridControl ) + getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridControl>* ) NULL ), + getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel>* ) NULL ), + getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener>* ) NULL ), + VCLXWindow::getTypes() +IMPL_XTYPEPROVIDER_END + +::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumnModel > SAL_CALL SVTXGridControl::getColumnModel( ) throw (::com::sun::star::uno::RuntimeException) +{ + return NULL; +} +void SAL_CALL SVTXGridControl::setColumnModel( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumnModel >& model ) throw (::com::sun::star::uno::RuntimeException) +{ + (void)model; +} +::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel > SAL_CALL SVTXGridControl::getDataModel( ) throw (::com::sun::star::uno::RuntimeException) +{ + return NULL; +} +void SAL_CALL SVTXGridControl::setDataModel( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel >& model ) throw (::com::sun::star::uno::RuntimeException) +{ + (void)model; +} +sal_Int32 SAL_CALL SVTXGridControl::getItemIndexAtPoint(::sal_Int32 x, ::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException) +{ + TableControl* pTable = (TableControl*)GetWindow(); + return pTable->GetCurrentRow( Point(x,y) ); +} + +void SAL_CALL SVTXGridControl::addSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException) +{ + (void)listener; +} + +void SAL_CALL SVTXGridControl::removeSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException) +{ + (void) listener; +} + +void SVTXGridControl::setProperty( const ::rtl::OUString& PropertyName, const Any& aValue) throw(RuntimeException) +{ + ::vos::OGuard aGuard( GetMutex() ); + + TableControl* pTable = (TableControl*)GetWindow(); + + switch( GetPropertyId( PropertyName ) ) + { + case BASEPROPERTY_GRID_SELECTIONMODE: + { + SelectionType eSelectionType; + if( aValue >>= eSelectionType ) + { + SelectionMode eSelMode; + switch( eSelectionType ) + { + case SelectionType_SINGLE: eSelMode = SINGLE_SELECTION; break; + case SelectionType_RANGE: eSelMode = RANGE_SELECTION; break; + case SelectionType_MULTI: eSelMode = MULTIPLE_SELECTION; break; + // case SelectionType_NONE: + default: eSelMode = NO_SELECTION; break; + } + if( pTable->getSelEngine()->GetSelectionMode() != eSelMode ) + pTable->getSelEngine()->SetSelectionMode( eSelMode ); + } + break; + } + case BASEPROPERTY_HSCROLL: + { + sal_Bool bHScroll = true; + if( aValue >>= bHScroll ) + { + m_bHScroll = bHScroll; + } + break; + } + case BASEPROPERTY_VSCROLL: + { + sal_Bool bVScroll = true; + if( aValue >>= bVScroll ) + { + m_bVScroll = bVScroll; + } + break; + } + case BASEPROPERTY_GRID_SHOWROWHEADER: + { + sal_Bool rowHeader = true; + if( aValue >>= rowHeader ) + { + m_pTableModel->setRowHeaders(rowHeader); + } + break; + } + + case BASEPROPERTY_GRID_SHOWCOLUMNHEADER: + { + sal_Bool colHeader = true; + if( aValue >>= colHeader ) + { + m_pTableModel->setColumnHeaders(colHeader); + } + break; + } + case BASEPROPERTY_GRID_DATAMODEL: + { + m_xDataModel = Reference< XGridDataModel >( aValue, UNO_QUERY ); + Sequence > cellData = m_xDataModel->getData(); + Sequence rowData(0); + std::vector< std::vector< rtl::OUString > > aCellContent(0); + for(int i = 0; i< m_xDataModel->getRowCount();++i) + { + rowData = cellData[i]; + std::vector newRow( + comphelper::sequenceToContainer< std::vector >(rowData)); + if(newRow.size() < (unsigned)m_pTableModel->getColumnCount()) + newRow.resize( m_pTableModel->getColumnCount(),rtl::OUString::createFromAscii("")); + aCellContent.push_back(newRow); + } + m_pTableModel->setCellContent(aCellContent); + Sequence< ::rtl::OUString > rowHeaders = m_xDataModel->getRowHeaders(); + std::vector< rtl::OUString > newRow( + comphelper::sequenceToContainer< std::vector >(rowHeaders)); + m_pTableModel->setRowCount(m_xDataModel->getRowCount()); + m_pTableModel->setRowHeaderName(newRow); + break; + } + case BASEPROPERTY_GRID_COLUMNMODEL: + { + m_xColumnModel = Reference< XGridColumnModel >( aValue, UNO_QUERY ); + Sequence > columns = m_xColumnModel->getColumns(); + std::vector > aNewColumns( + comphelper::sequenceToContainer > >(columns)); + /* if(m_pTable->GetColumnCount().size()>0) + m_pTable->GetColumnName.clear();*/ + for ( ::svt::table::ColPos col = 0; col < m_xColumnModel->getColumnCount(); ++col ) + { + UnoControlTableColumn* tableColumn = new UnoControlTableColumn(aNewColumns[col]); + m_pTableModel->getColumnModel().push_back((PColumnModel)tableColumn); + } + break; + } + default: + VCLXWindow::setProperty( PropertyName, aValue ); + break; + } +} + +Any SVTXGridControl::getProperty( const ::rtl::OUString& PropertyName ) throw(RuntimeException) +{ + ::vos::OGuard aGuard( GetMutex() ); + + const sal_uInt16 nPropId = GetPropertyId( PropertyName ); + TableControl* pTable = (TableControl*)GetWindow(); + if(pTable) + { + switch(nPropId) + { + case BASEPROPERTY_GRID_SELECTIONMODE: + { + SelectionType eSelectionType; + + SelectionMode eSelMode = pTable->getSelEngine()->GetSelectionMode(); + switch( eSelMode ) + { + case SINGLE_SELECTION: eSelectionType = SelectionType_SINGLE; break; + case RANGE_SELECTION: eSelectionType = SelectionType_RANGE; break; + case MULTIPLE_SELECTION:eSelectionType = SelectionType_MULTI; break; +// case NO_SELECTION: + default: eSelectionType = SelectionType_NONE; break; + } + return Any( eSelectionType ); + } + case BASEPROPERTY_GRID_SHOWROWHEADER: + { + return Any ((sal_Bool) m_pTableModel->hasRowHeaders()); + } + case BASEPROPERTY_GRID_SHOWCOLUMNHEADER: + return Any ((sal_Bool) m_pTableModel->hasColumnHeaders()); + case BASEPROPERTY_GRID_DATAMODEL: + return Any ( m_xDataModel ); + case BASEPROPERTY_GRID_COLUMNMODEL: + return Any ( m_xColumnModel); + case BASEPROPERTY_HSCROLL: + return Any ( m_bHScroll); + case BASEPROPERTY_VSCROLL: + return Any ( m_bVScroll); + } + } + return VCLXWindow::getProperty( PropertyName ); +} + +void SVTXGridControl::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) +{ + PushPropertyIds( rIds, + BASEPROPERTY_GRID_SHOWROWHEADER, + BASEPROPERTY_GRID_SHOWCOLUMNHEADER, + BASEPROPERTY_GRID_DATAMODEL, + BASEPROPERTY_GRID_COLUMNMODEL, + BASEPROPERTY_GRID_SELECTIONMODE, + 0); + VCLXWindow::ImplGetPropertyIds( rIds, true ); +} +void SAL_CALL SVTXGridControl::setVisible( sal_Bool bVisible ) throw(::com::sun::star::uno::RuntimeException) +{ + TableControl* pTable = (TableControl*)GetWindow(); + if ( pTable ) + { + pTable->SetModel(PTableModel(m_pTableModel)); + //m_pTable->SetPosSizePixel( Point( nPosX, nPosY ), Size(nWidth, nHeight) ); + pTable->Show( bVisible ); + } +} +void SAL_CALL SVTXGridControl::setFocus() throw(::com::sun::star::uno::RuntimeException) +{ + ::vos::OGuard aGuard( GetMutex() ); + if ( GetWindow()) + GetWindow()->GrabFocus(); +} +void SAL_CALL SVTXGridControl::rowAdded(const ::com::sun::star::awt::grid::GridDataEvent& Event ) throw (::com::sun::star::uno::RuntimeException) +{ + std::vector aNewRow( + comphelper::sequenceToContainer< std::vector >(Event.rowData)); + if(aNewRow.size()< (unsigned)m_pTableModel->getColumnCount()) + aNewRow.resize(m_pTableModel->getColumnCount(),rtl::OUString::createFromAscii("")); + m_pTableModel->getCellContent().push_back(aNewRow); + if(m_pTableModel->hasRowHeaders()) + m_pTableModel->getRowHeaderName().push_back(Event.headerName); + m_pTableModel->setRowCount(m_pTableModel->getRowHeaderName().size()); + TableControl* pTable = (TableControl*)GetWindow(); + pTable->InvalidateDataWindow(m_pTableModel->getRowHeaderName().size()-1, false); + //pTable->GrabFocus(); + if(pTable->isAccessibleAlive()) + { + pTable->commitGridControlEvent(TABLE_MODEL_CHANGED, + makeAny( AccessibleTableModelChange(INSERT, m_pTableModel->getRowCount()-1, m_pTableModel->getRowCount(), 0, m_pTableModel->getColumnCount())), + Any()); + pTable->commitGridControlEvent(CHILD, + makeAny( pTable->m_pAccessTable->m_pAccessible->getTableHeader(TCTYPE_ROWHEADERBAR)), + Any()); + for (sal_Int32 i = 0 ; i <= m_pTableModel->getColumnCount() ; ++i) + { + pTable->commitGridControlEvent( + CHILD, + makeAny( pTable->m_pAccessTable->m_pAccessible->getTable() ), + Any()); + } + } +} + +void SAL_CALL SVTXGridControl::rowRemoved(const ::com::sun::star::awt::grid::GridDataEvent& Event ) throw (::com::sun::star::uno::RuntimeException) +{ + TableControl* pTable = (TableControl*)GetWindow(); + //unsigned int rows =m_pImpl->aCellContent.size()-1; + if(Event.index == -1) + { + if(m_pTableModel->hasRowHeaders()) + m_pTableModel->getRowHeaderName().clear(); + m_pTableModel->getCellContent().clear(); + if(pTable->isAccessibleAlive()) + { + pTable->commitGridControlEvent(TABLE_MODEL_CHANGED, + makeAny( AccessibleTableModelChange(DELETE, 0, m_pTableModel->getColumnCount(), 0, m_pTableModel->getColumnCount())), + Any()); + } + } + else + { + pTable->removeSelectedRow(Event.index); + if(m_pTableModel->getCellContent().size()>1) + { + if(m_pTableModel->hasRowHeaders()) + m_pTableModel->getRowHeaderName().erase(m_pTableModel->getRowHeaderName().begin()+Event.index); + m_pTableModel->getCellContent().erase(m_pTableModel->getCellContent().begin()+Event.index); + + } + else + { + if(m_pTableModel->hasRowHeaders()) + m_pTableModel->getRowHeaderName().clear(); + m_pTableModel->getCellContent().clear(); + //m_pImpl->nRowCount=0; + } + } + //pTable->InvalidateDataWindow(Event.index, true); + m_pTableModel->setRowCount(m_pTableModel->getCellContent().size()); + pTable->InvalidateDataWindow(Event.index, true); + if(pTable->isAccessibleAlive()) + { + pTable->commitGridControlEvent(TABLE_MODEL_CHANGED, + makeAny( AccessibleTableModelChange(DELETE, Event.index, Event.index+1, 0, m_pTableModel->getColumnCount())), + Any()); + //pTable->commitGridControlEvent(CHILD, + // makeAny( pTable->m_pAccessTable->m_pAccessible->getTableHeader(TCTYPE_ROWHEADERBAR)), + // Any()); + //for (sal_Int32 i = 0 ; i <= m_pTableModel->getColumnCount() ; ++i) + //{ + // pTable->commitGridControlEvent( + // CHILD, + // makeAny( pTable->m_pAccessTable->m_pAccessible->getTable() ), + // Any()); + //} + } + //pTable->Invalidate(); +} + +void SAL_CALL SVTXGridControl::dataChanged(const ::com::sun::star::awt::grid::GridDataEvent& Event ) throw (::com::sun::star::uno::RuntimeException) +{ + (void) Event; +} + + void SAL_CALL SVTXGridControl::disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException) + { + VCLXWindow::disposing( Source ); + } + +::sal_Int32 SAL_CALL SVTXGridControl::getMinSelectionIndex() throw (::com::sun::star::uno::RuntimeException) +{ + return 0; +} + +::sal_Int32 SAL_CALL SVTXGridControl::getMaxSelectionIndex() throw (::com::sun::star::uno::RuntimeException) +{ + return 0; +} + +void SAL_CALL SVTXGridControl::insertIndexIntervall(::sal_Int32 start, ::sal_Int32 length) throw (::com::sun::star::uno::RuntimeException) +{ + (void)length; + (void)start; +} + +void SAL_CALL SVTXGridControl::removeIndexIntervall(::sal_Int32 start, ::sal_Int32 end) throw (::com::sun::star::uno::RuntimeException) +{ + (void)end; + (void)start; +} + +::com::sun::star::uno::Sequence< ::sal_Int32 > SAL_CALL SVTXGridControl::getSelection() throw (::com::sun::star::uno::RuntimeException) +{ + TableControl* pTable = (TableControl*)GetWindow(); + std::vector& selectedRows = pTable->GetSelectedRows(); + Sequence selectedRowsToSequence(comphelper::containerToSequence(selectedRows)); + return selectedRowsToSequence; +} + +::sal_Bool SAL_CALL SVTXGridControl::isCellEditable() throw (::com::sun::star::uno::RuntimeException) +{ + return sal_False; +} + +::sal_Bool SAL_CALL SVTXGridControl::isSelectionEmpty() throw (::com::sun::star::uno::RuntimeException) +{ + return sal_False; +} + +::sal_Bool SAL_CALL SVTXGridControl::isSelectedIndex(::sal_Int32 index) throw (::com::sun::star::uno::RuntimeException) +{ + (void)index; + return sal_False; +} + +void SAL_CALL SVTXGridControl::selectRow(::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException) +{ + (void)y; +} + +void SAL_CALL SVTXGridControl::selectColumn(::sal_Int32 x) throw (::com::sun::star::uno::RuntimeException) +{ + (void)x; +} diff --git a/svtools/source/uno/svtxgridcontrol.hxx b/svtools/source/uno/svtxgridcontrol.hxx new file mode 100755 index 000000000000..9ca6901681c9 --- /dev/null +++ b/svtools/source/uno/svtxgridcontrol.hxx @@ -0,0 +1,106 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: SVTXGridControl.hxx,v $ + * $Revision: 1.32 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _SVT_GRIDCONTROL_HXX_ +#define _SVT_GRIDCONTROL_HXX_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include + + +using namespace ::svt::table; + +class SVTXGridControl : public ::cppu::ImplInheritanceHelper2< VCLXWindow, ::com::sun::star::awt::grid::XGridControl, + ::com::sun::star::awt::grid::XGridDataListener> +{ +private: + UnoControlTableModel* m_pTableModel; + ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel >m_xDataModel; + ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumnModel >m_xColumnModel; + bool m_bHasColumnHeaders; + bool m_bHasRowHeaders; + bool m_bVScroll; + bool m_bHScroll; + +public: + SVTXGridControl(); + ~SVTXGridControl(); + //XGridDataListener overridables + virtual void SAL_CALL rowAdded(const ::com::sun::star::awt::grid::GridDataEvent& Event) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL rowRemoved(const ::com::sun::star::awt::grid::GridDataEvent & Event) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL dataChanged(const ::com::sun::star::awt::grid::GridDataEvent & Event) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException); + + ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + void SAL_CALL acquire() throw() { VCLXWindow::acquire(); } + void SAL_CALL release() throw() { VCLXWindow::release(); } + + // ::com::sun::star::lang::XTypeProvider + ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes() throw(::com::sun::star::uno::RuntimeException); + ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException); + + //::com::sun::star::awt::grid::XGridControl + ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumnModel > SAL_CALL getColumnModel( ) throw (::com::sun::star::uno::RuntimeException); + void SAL_CALL setColumnModel( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumnModel >& model ) throw (::com::sun::star::uno::RuntimeException); + ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel > SAL_CALL getDataModel( ) throw (::com::sun::star::uno::RuntimeException); + void SAL_CALL setDataModel( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel >& model ) throw (::com::sun::star::uno::RuntimeException); + + virtual ::sal_Int32 SAL_CALL getMinSelectionIndex() throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getMaxSelectionIndex() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL insertIndexIntervall(::sal_Int32 start, ::sal_Int32 length) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeIndexIntervall(::sal_Int32 start, ::sal_Int32 end) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::sal_Int32 > SAL_CALL getSelection() throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL isCellEditable() throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL isSelectionEmpty() throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL isSelectedIndex(::sal_Int32 index) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL selectRow(::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL selectColumn(::sal_Int32 x) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL addSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getItemIndexAtPoint(::sal_Int32 x, ::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException); + + void SAL_CALL setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value ) throw(::com::sun::star::uno::RuntimeException); + ::com::sun::star::uno::Any SAL_CALL getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException); + static void ImplGetPropertyIds( std::list< sal_uInt16 > &aIds ); + void SAL_CALL setVisible(sal_Bool bVisible) throw(::com::sun::star::uno::RuntimeException); + void SAL_CALL setFocus() throw(::com::sun::star::uno::RuntimeException); + }; + #endif // _SVT_GRIDCONTROL_HXX_ diff --git a/svtools/source/uno/toolboxcontroller.cxx b/svtools/source/uno/toolboxcontroller.cxx index eb8a543d31f9..a8d05c49a7ae 100644 --- a/svtools/source/uno/toolboxcontroller.cxx +++ b/svtools/source/uno/toolboxcontroller.cxx @@ -646,7 +646,7 @@ sal_Bool ToolboxController::isHighContrast() const vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); if ( pWindow ) - bHighContrast = ( ((ToolBox *)pWindow)->GetBackground().GetColor().IsDark() ); + bHighContrast = ( ((ToolBox *)pWindow)->GetSettings().GetStyleSettings().GetHighContrastMode() ); } return bHighContrast; diff --git a/svtools/source/uno/unocontroltablemodel.cxx b/svtools/source/uno/unocontroltablemodel.cxx new file mode 100644 index 000000000000..b4ddc2cc472d --- /dev/null +++ b/svtools/source/uno/unocontroltablemodel.cxx @@ -0,0 +1,411 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: unocontroltablemodel.cxx,v $ + * $Revision: 1.32 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svtools.hxx" + +#include "unocontroltablemodel.hxx" +#include +#include "svtools/table/gridtablerenderer.hxx" +#include "svtools/table/defaultinputhandler.hxx" +#include "svtools/table/tablecontrol.hxx" +#include +#include +#include +#include +#include +#include + +using ::rtl::OUString; +using namespace ::svt::table; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::awt::grid; + + + //-------------------------------------------------------------------- + UnoControlTableColumn::UnoControlTableColumn(Reference m_xGridColumn) + :m_nID( 0 ) + ,m_sName() + ,m_bIsResizable( false ) + ,m_nWidth( 10 * 100 ) // 1 cm + ,m_nMinWidth( 0 ) // no min width + ,m_nMaxWidth( 0 ) // no max width + { + //m_nID = m_xGridColumn->getIdentifier(); + //m_nWidth = m_xGridColumn->getColumnWidth(); + m_sName = m_xGridColumn->getTitle(); + } + + //-------------------------------------------------------------------- + ColumnID UnoControlTableColumn::getID() const + { + return m_nID; + } + + //-------------------------------------------------------------------- + bool UnoControlTableColumn::setID( const ColumnID _nID ) + { + // TODO: conflict check + + m_nID = _nID; + // TODO: notifications? + + return true; + } + + //-------------------------------------------------------------------- + String UnoControlTableColumn::getName() const + { + return m_sName; + } + + //-------------------------------------------------------------------- + void UnoControlTableColumn::setName( const String& _rName ) + { + m_sName = _rName; + // TODO: notifications? + } + + //-------------------------------------------------------------------- + bool UnoControlTableColumn::isResizable() const + { + return m_bIsResizable; + } + + //-------------------------------------------------------------------- + void UnoControlTableColumn::setResizable( bool _bResizable ) + { + m_bIsResizable = _bResizable; + // TODO: notifications? + } + + //-------------------------------------------------------------------- + TableMetrics UnoControlTableColumn::getWidth() const + { + return m_nWidth; + } + + //-------------------------------------------------------------------- + void UnoControlTableColumn::setWidth( TableMetrics _nWidth ) + { + m_nWidth = _nWidth; + // TODO: notifications? + } + + //-------------------------------------------------------------------- + TableMetrics UnoControlTableColumn::getMinWidth() const + { + return m_nMinWidth; + } + + //-------------------------------------------------------------------- + void UnoControlTableColumn::setMinWidth( TableMetrics _nMinWidth ) + { + m_nMinWidth = _nMinWidth; + // TODO: notifications? + } + + //-------------------------------------------------------------------- + TableMetrics UnoControlTableColumn::getMaxWidth() const + { + return m_nMaxWidth; + } + + //-------------------------------------------------------------------- + void UnoControlTableColumn::setMaxWidth( TableMetrics _nMaxWidth ) + { + m_nMaxWidth = _nMaxWidth; + // TODO: notifications? + } + + //==================================================================== + //= DefaultTableModel_Impl + //==================================================================== + struct UnoControlTableModel_Impl + { + ::std::vector< PColumnModel >& aColumns; + TableSize nRowCount; + bool bHasColumnHeaders; + bool bHasRowHeaders; + PTableRenderer pRenderer; + PTableInputHandler pInputHandler; + TableMetrics nRowHeight; + TableMetrics nColumnHeaderHeight; + TableMetrics nRowHeaderWidth; + std::vector& aRowHeadersTitle; + std::vector >& aCellContent; + + UnoControlTableModel_Impl() + :aColumns ( *(new std::vector< PColumnModel> (0))) + ,nRowCount ( 0 ) + ,bHasColumnHeaders ( false ) + ,bHasRowHeaders ( false ) + ,pRenderer ( ) + ,pInputHandler ( ) + ,nRowHeight ( 4 * 100 ) // 40 mm + ,nColumnHeaderHeight( 5 * 100 ) // 50 mm + ,nRowHeaderWidth ( 10 * 100 ) // 50 mm + ,aRowHeadersTitle ( *(new std::vector(0))) + ,aCellContent ( *(new std::vector >(0))) + { + } + }; + + //==================================================================== + //= UnoControlTableModel + //==================================================================== + //-------------------------------------------------------------------- + UnoControlTableModel::UnoControlTableModel() + :m_pImpl( new UnoControlTableModel_Impl ) + { + m_pImpl->bHasColumnHeaders = false; + m_pImpl->bHasRowHeaders = false; + m_pImpl->pRenderer.reset( new GridTableRenderer( *this ) ); + m_pImpl->pInputHandler.reset( new DefaultInputHandler ); + } + + //-------------------------------------------------------------------- + UnoControlTableModel::~UnoControlTableModel() + { + DELETEZ( m_pImpl ); + } + + //-------------------------------------------------------------------- + TableSize UnoControlTableModel::getColumnCount() const + { + //m_pImpl->aColumns.resize( m_xColumnModel->getColumnCount()); + return (TableSize)m_pImpl->aColumns.size(); + } + + //-------------------------------------------------------------------- + TableSize UnoControlTableModel::getRowCount() const + { + return m_pImpl->nRowCount; + } + + //-------------------------------------------------------------------- + bool UnoControlTableModel::hasColumnHeaders() const + { + return m_pImpl->bHasColumnHeaders; + } + + //-------------------------------------------------------------------- + bool UnoControlTableModel::hasRowHeaders() const + { + return m_pImpl->bHasRowHeaders; + } + + //-------------------------------------------------------------------- + void UnoControlTableModel::setRowHeaders(bool _bRowHeaders) + { + m_pImpl->bHasRowHeaders = _bRowHeaders; + } + //-------------------------------------------------------------------- + void UnoControlTableModel::setColumnHeaders(bool _bColumnHeaders) + { + m_pImpl->bHasColumnHeaders = _bColumnHeaders; + } + + void UnoControlTableModel::setColumnCount(TableSize _nColCount) + { + m_pImpl->aColumns.resize( _nColCount); + } + //-------------------------------------------------------------------- + void UnoControlTableModel::setRowCount(TableSize _nRowCount) + { + m_pImpl->nRowCount = _nRowCount; + } + //-------------------------------------------------------------------- + bool UnoControlTableModel::isCellEditable( ColPos col, RowPos row ) const + { + (void)col; + (void)row; + return false; + } + + //-------------------------------------------------------------------- + void UnoControlTableModel::addTableModelListener( const PTableModelListener& listener ) + { + (void) listener; + //listener->onTableModelChanged(PTableModel(this)); + // TODO + DBG_ERROR( "DefaultTableModel::addTableModelListener: not yet implemented!" ); + } + + //-------------------------------------------------------------------- + void UnoControlTableModel::removeTableModelListener( const PTableModelListener& listener ) + { + (void)listener; + // TODO + DBG_ERROR( "DefaultTableModel::removeTableModelListener: not yet implemented!" ); + } + + //-------------------------------------------------------------------- + PColumnModel UnoControlTableModel::getColumnModel( ColPos column ) + { + DBG_ASSERT( ( column >= 0 ) && ( column < getColumnCount() ), + "DefaultTableModel::getColumnModel: invalid index!" ); + return m_pImpl->aColumns[ column ]; + } + + //-------------------------------------------------------------------- + std::vector& UnoControlTableModel::getColumnModel() + { + return m_pImpl->aColumns; + } + //-------------------------------------------------------------------- + PColumnModel UnoControlTableModel::getColumnModelByID( ColumnID id ) + { + (void)id; + // TODO + DBG_ERROR( "DefaultTableModel::getColumnModelByID: not yet implemented!" ); + return PColumnModel(); + } + + //-------------------------------------------------------------------- + PTableRenderer UnoControlTableModel::getRenderer() const + { + return m_pImpl->pRenderer; + } + + //-------------------------------------------------------------------- + PTableInputHandler UnoControlTableModel::getInputHandler() const + { + return m_pImpl->pInputHandler; + } + + //-------------------------------------------------------------------- + TableMetrics UnoControlTableModel::getRowHeight() const + { + return m_pImpl->nRowHeight; + } + //-------------------------------------------------------------------- + void UnoControlTableModel::setRowHeight(TableMetrics _nRowHeight) + { + m_pImpl->nRowHeight = _nRowHeight; + } + + //-------------------------------------------------------------------- + TableMetrics UnoControlTableModel::getColumnHeaderHeight() const + { + DBG_ASSERT( hasColumnHeaders(), "DefaultTableModel::getColumnHeaderHeight: invalid call!" ); + return m_pImpl->nColumnHeaderHeight; + } + + //-------------------------------------------------------------------- + TableMetrics UnoControlTableModel::getRowHeaderWidth() const + { + DBG_ASSERT( hasRowHeaders(), "DefaultTableModel::getRowHeaderWidth: invalid call!" ); + return m_pImpl->nRowHeaderWidth; + } + + //-------------------------------------------------------------------- + void UnoControlTableModel::SetTitleHeight( TableMetrics _nHeight ) + { + DBG_ASSERT( _nHeight > 0, "DefaultTableModel::SetTitleHeight: invalid height value!" ); + m_pImpl->nColumnHeaderHeight = _nHeight; + // TODO: notification + } + + //-------------------------------------------------------------------- + void UnoControlTableModel::SetHandleWidth( TableMetrics _nWidth ) + { + DBG_ASSERT( _nWidth > 0, "DefaultTableModel::SetHandleWidth: invalid width value!" ); + m_pImpl->nRowHeaderWidth = _nWidth; + // TODO: notification + } + + //-------------------------------------------------------------------- + ScrollbarVisibility UnoControlTableModel::getVerticalScrollbarVisibility(int overAllHeight, int actHeight) const + { + if(overAllHeight>=actHeight)// && !m_bVScroll) + return ScrollbarShowNever; + else + return ScrollbarShowAlways; + } + + //-------------------------------------------------------------------- + ScrollbarVisibility UnoControlTableModel::getHorizontalScrollbarVisibility(int overAllWidth, int actWidth) const + { + if(overAllWidth>=actWidth)// && !m_bHScroll) + return ScrollbarShowNever; + else + return ScrollbarShowAlways; + } + //-------------------------------------------------------------------- + void UnoControlTableModel::setCellContent(std::vector > cellContent) + { + //if(cellContent.empty()) + //{ + // unsigned int i = m_pImpl->aColumns.size(); + // std::vector& emptyCells; + // while(i!=0) + // { + // cellContent.push_back(emptyCells); + // --i; + // } + //} + //std::vector cCC; + //for(::std::vector >::iterator iter = cellContent.begin(); iter!= cellContent.end();++iter) + //{ + // cCC = *iter; + // m_pImpl->aCellContent.push_back(cCC); + //} + m_pImpl->aCellContent.swap( cellContent ); + } + + std::vector >& UnoControlTableModel::getCellContent() + { + return m_pImpl->aCellContent; + } + + //-------------------------------------------------------------------- + void UnoControlTableModel::setRowHeaderName(std::vector cellColumnContent) + { + if(cellColumnContent.empty()) + { + unsigned int i = m_pImpl->aColumns.size(); + while(i!=0) + { + cellColumnContent.push_back(rtl::OUString::createFromAscii("")); + --i; + } + } + for(::std::vector::iterator iter = cellColumnContent.begin(); iter!= cellColumnContent.end();++iter) + { + rtl::OUString s = *iter; + m_pImpl->aRowHeadersTitle.push_back(*iter); + } + } + + std::vector& UnoControlTableModel::getRowHeaderName() + { + return m_pImpl->aRowHeadersTitle; + } + diff --git a/svtools/source/uno/unocontroltablemodel.hxx b/svtools/source/uno/unocontroltablemodel.hxx new file mode 100644 index 000000000000..fe3d1f28e9ed --- /dev/null +++ b/svtools/source/uno/unocontroltablemodel.hxx @@ -0,0 +1,153 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: unocontroltablemodel.hxx,v $ + * $Revision: 1.32 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _UNOCONTROL_TABLEMODEL_HXX_ +#define _UNOCONTROL_TABLEMODEL_HXX_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include + + +using namespace ::svt::table; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::awt::grid; + +class UnoControlTableColumn : public IColumnModel + { + private: + ColumnID m_nID; + String m_sName; + bool m_bIsResizable; + TableMetrics m_nWidth; + TableMetrics m_nMinWidth; + TableMetrics m_nMaxWidth; + + public: + UnoControlTableColumn(Reference); + + // IColumnModel overridables + virtual ColumnID getID() const; + virtual bool setID( const ColumnID _nID ); + virtual String getName() const; + virtual void setName( const String& _rName ); + virtual bool isResizable() const; + virtual void setResizable( bool _bResizable ); + virtual TableMetrics getWidth() const; + virtual void setWidth( TableMetrics _nWidth ); + virtual TableMetrics getMinWidth() const; + virtual void setMinWidth( TableMetrics _nMinWidth ); + virtual TableMetrics getMaxWidth() const; + virtual void setMaxWidth( TableMetrics _nMaxWidth ); + }; + + struct UnoControlTableModel_Impl; + + class UnoControlTableModel : public ITableModel + { + private: + UnoControlTableModel_Impl* m_pImpl; + + public: + UnoControlTableModel(); + ~UnoControlTableModel(); + + /// returns the current row height, in 1/100 millimeters + inline TableMetrics GetRowHeight() const { return getRowHeight(); } + /// sets a new row height. + void setRowHeight( TableMetrics _nHeight ); + + /// returns the height of the title row (containing the column headers) + inline TableMetrics GetTitleHeight() const { return getColumnHeaderHeight(); } + /// sets a new height for the title row (containing the column headers) + void SetTitleHeight( TableMetrics _nHeight ); + + /// returns the width of the handle column (containing the row headers) + inline TableMetrics GetHandleWidth() const { return getRowHeaderWidth(); } + /// sets a new width for the handle column (containing the row headers) + void SetHandleWidth( TableMetrics _nWidth ); + + /// sets the width of a column + inline void SetColumnWidth( ColPos _nColumn, TableMetrics _nWidth100thMM ); + /// retrieves the width of a column, in 1/100th millimeters + inline TableMetrics GetColumnWidth( ColPos _nColumn ); + + // TODO: setters and getters for ID, Name, Resizable, MinWidth, MaxWidth + + public: + // ITableModel overridables + virtual TableSize getColumnCount() const; + virtual TableSize getRowCount() const; + virtual void setColumnCount(TableSize _nColCount); + virtual void setRowCount(TableSize _nRowCount); + virtual bool hasColumnHeaders() const; + virtual bool hasRowHeaders() const; + virtual void setRowHeaders(bool _bRowHeaders); + virtual void setColumnHeaders(bool _bColumnHeaders); + virtual bool isCellEditable( ColPos col, RowPos row ) const; + virtual void addTableModelListener( const PTableModelListener& listener ); + virtual void removeTableModelListener( const PTableModelListener& listener ); + virtual PColumnModel getColumnModel( ColPos column ); + virtual std::vector& getColumnModel(); + virtual PColumnModel getColumnModelByID( ColumnID id ); + virtual PTableRenderer getRenderer() const; + virtual PTableInputHandler getInputHandler() const; + virtual TableMetrics getRowHeight() const; + virtual TableMetrics getColumnHeaderHeight() const; + virtual TableMetrics getRowHeaderWidth() const; + virtual ScrollbarVisibility getVerticalScrollbarVisibility(int overAllHeight, int actHeight) const; + virtual ScrollbarVisibility getHorizontalScrollbarVisibility(int overAllWidth, int actWidth) const; + virtual void setCellContent(std::vector > cellContent); + virtual std::vector >& getCellContent(); + virtual void setRowHeaderName(std::vector cellColumnContent); + virtual std::vector& getRowHeaderName(); + }; + + inline void UnoControlTableModel::SetColumnWidth( ColPos _nColumn, TableMetrics _nWidth100thMM ) + { + getColumnModel( _nColumn )->setWidth( _nWidth100thMM ); + } + + inline TableMetrics UnoControlTableModel::GetColumnWidth( ColPos _nColumn ) + { + return getColumnModel( _nColumn )->getWidth(); + } + #endif // _UNOCONTROL_TABLEMODEL_HXX_ diff --git a/svtools/source/uno/unoevent.cxx b/svtools/source/uno/unoevent.cxx index 14321ecdd84c..6fc8b0017ad8 100644 --- a/svtools/source/uno/unoevent.cxx +++ b/svtools/source/uno/unoevent.cxx @@ -40,7 +40,7 @@ #include #include #include "unoevent.hxx" -#include +#include using namespace ::com::sun::star; using namespace ::com::sun::star::uno; @@ -492,7 +492,7 @@ SvDetachedEventDescriptor::~SvDetachedEventDescriptor() delete aMacros[i]; } - delete aMacros; + delete [] aMacros; } sal_Int16 SvDetachedEventDescriptor::getIndex(const sal_uInt16 nID) const diff --git a/svtools/source/uno/unoifac2.hrc b/svtools/source/uno/unoifac2.hrc index 4e8cf0303da5..4f46edffdc51 100644 --- a/svtools/source/uno/unoifac2.hrc +++ b/svtools/source/uno/unoifac2.hrc @@ -33,7 +33,7 @@ #ifndef _SOLAR_HRC -#include +#include #endif //! Um den berblick ber alle benutzten HelpID's zu behalten sind diese diff --git a/svtools/source/uno/unoiface.cxx b/svtools/source/uno/unoiface.cxx index 91a6de4c404d..a1ff1ad2ac3e 100644 --- a/svtools/source/uno/unoiface.cxx +++ b/svtools/source/uno/unoiface.cxx @@ -48,12 +48,14 @@ #include #include #include -#include +#include #include #include #include #include "treecontrolpeer.hxx" +#include "svtxgridcontrol.hxx" +#include namespace { @@ -83,8 +85,6 @@ SAL_DLLPUBLIC_EXPORT Window* CreateWindow( VCLXWindow** ppNewComp, const ::com:: if ( pParent ) { pWindow = new MultiLineEdit( pParent, nWinBits|WB_IGNORETAB); - static_cast< MultiLineEdit* >( pWindow )->DisableSelectionOnFocus(); - // #i89821# / 2008-12-17 / frank.schoenheit@sun.com *ppNewComp = new VCLXMultiLineEdit; } else @@ -132,7 +132,7 @@ SAL_DLLPUBLIC_EXPORT Window* CreateWindow( VCLXWindow** ppNewComp, const ::com:: } else if (aServiceName.EqualsIgnoreCaseAscii("roadmap") ) { - pWindow = new ::svt::ORoadmap( pParent, WB_DIALOGCONTROL); + pWindow = new ::svt::ORoadmap( pParent, WB_TABSTOP ); *ppNewComp = new SVTXRoadmap; } else if ( aServiceName.EqualsIgnoreCaseAscii( "ProgressBar" ) ) @@ -167,6 +167,19 @@ SAL_DLLPUBLIC_EXPORT Window* CreateWindow( VCLXWindow** ppNewComp, const ::com:: return NULL; } } + else if ( aServiceName.EqualsIgnoreCaseAscii( "Grid" ) ) + { + if ( pParent ) + { + pWindow = new ::svt::table::TableControl(pParent, nWinBits); + *ppNewComp = new SVTXGridControl; + } + else + { + *ppNewComp = NULL; + return NULL; + } + } return pWindow; } diff --git a/svtools/uno/exports.map b/svtools/uno/exports.map deleted file mode 100644 index f4ed78b9e970..000000000000 --- a/svtools/uno/exports.map +++ /dev/null @@ -1,8 +0,0 @@ -UDK_3_0_0 { - global: - component_getImplementationEnvironment; - component_writeInfo; - component_getFactory; - local: - *; -}; diff --git a/svtools/uno/makefile.mk b/svtools/uno/makefile.mk deleted file mode 100644 index b572242f1d85..000000000000 --- a/svtools/uno/makefile.mk +++ /dev/null @@ -1,79 +0,0 @@ -#************************************************************************* -# -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# Copyright 2008 by Sun Microsystems, Inc. -# -# OpenOffice.org - a multi-platform office productivity suite -# -# $RCSfile: makefile.mk,v $ -# -# $Revision: 1.4 $ -# -# This file is part of OpenOffice.org. -# -# OpenOffice.org is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License version 3 -# only, as published by the Free Software Foundation. -# -# OpenOffice.org is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License version 3 for more details -# (a copy is included in the LICENSE file that accompanied this code). -# -# You should have received a copy of the GNU Lesser General Public License -# version 3 along with OpenOffice.org. If not, see -# -# for a copy of the LGPLv3 License. -# -#************************************************************************* - -PRJ=.. -PRJNAME=svtools -TARGET=svtmisc.uno -LIBTARGET=NO -ENABLE_EXCEPTIONS=TRUE -VISIBILITY_HIDDEN=TRUE - -# --- Settings ---------------------------------- - -.INCLUDE : settings.mk -DLLPRE= - -# --- Files ------------------------------------- - -SLOFILES= \ - $(SLO)$/addrtempuno.obj \ - $(SLO)$/miscservices.obj \ - $(SLO)$/pathservice.obj - -SHL1TARGET= $(TARGET) -SHL1IMPLIB= i$(TARGET) - -SHL1OBJS= \ - $(SLO)$/svtdata.obj \ - $(SLOFILES) - -SHL1LIBS= \ - $(SLB)$/filter.uno.lib - -SHL1STDLIBS=\ - $(SVTOOLLIB) \ - $(VCLLIB) \ - $(SVLLIB) \ - $(UNOTOOLSLIB) \ - $(TOOLSLIB) \ - $(COMPHELPERLIB) \ - $(CPPUHELPERLIB) \ - $(CPPULIB) \ - $(SALLIB) - -SHL1VERSIONMAP=exports.map -SHL1DEF= $(MISC)$/$(SHL1TARGET).def -DEF1NAME= $(SHL1TARGET) - -# --- Targets ---------------------------------- - -.INCLUDE : target.mk - diff --git a/svtools/util/makefile.mk b/svtools/util/makefile.mk index d40195609115..51ea7a9fef31 100644 --- a/svtools/util/makefile.mk +++ b/svtools/util/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* #* # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -35,7 +35,6 @@ PRJNAME=svtools TARGET=svtool RESTARGET=svt RESTARGETPATCH=svp -RESTARGETSIMPLE=svs GEN_HID=TRUE GEN_HID_OTHER=TRUE ENABLE_EXCEPTIONS=TRUE @@ -49,53 +48,33 @@ USE_LDUMP2=TRUE # --- general section ---------------------------------------------------- .IF "$(GUI)"!="UNX" -LIB3TARGET= $(LB)$/svtool.lib -LIB3FILES= $(LB)$/_svt.lib +LIB2TARGET= $(LB)$/svtool.lib +LIB2FILES= $(LB)$/_svt.lib .ENDIF -.IF "$(GUI)"!="UNX" -LIB4TARGET= $(LB)$/isvl.lib -LIB4FILES= $(LB)$/_isvl.lib -.ENDIF - -LIB7TARGET= $(SLB)$/svt.lib -LIB7FILES= \ - $(SLB)$/misc.lib \ - $(SLB)$/items.lib \ +LIB1TARGET= $(SLB)$/svt.lib +LIB1FILES= \ $(SLB)$/browse.lib \ + $(SLB)$/config.lib \ + $(SLB)$/svcontnr.lib \ $(SLB)$/ctrl.lib \ $(SLB)$/dialogs.lib \ $(SLB)$/edit.lib \ - $(SLB)$/unoiface.lib \ $(SLB)$/filter.lib \ + $(SLB)$/filter.uno.lib \ $(SLB)$/igif.lib \ $(SLB)$/jpeg.lib \ $(SLB)$/ixpm.lib \ $(SLB)$/ixbm.lib \ - $(SLB)$/numbers.lib \ - $(SLB)$/numbers.uno.lib \ $(SLB)$/wmf.lib \ - $(SLB)$/undo.lib \ - $(SLB)$/urlobj.lib \ + $(SLB)$/java.lib \ + $(SLB)$/misc.lib \ $(SLB)$/plugapp.lib \ - $(SLB)$/svcontnr.lib \ - $(SLB)$/syslocale.lib \ - $(SLB)$/svdde.lib \ $(SLB)$/svhtml.lib \ $(SLB)$/svrtf.lib \ - $(SLB)$/heavyconfig.lib \ - $(SLB)$/java.lib - -LIB8TARGET= $(SLB)$/svl.lib -LIB8FILES= \ - $(SLB)$/config.lib \ - $(SLB)$/filerec.lib \ - $(SLB)$/filepicker.lib \ - $(SLB)$/items1.lib \ - $(SLB)$/misc1.lib \ - $(SLB)$/notify.lib \ - $(SLB)$/svarray.lib \ - $(SLB)$/svsql.lib + $(SLB)$/table.lib \ + $(SLB)$/unoiface.lib \ + $(SLB)$/urlobj.lib # generation of resourcen-lib ---------------------------------------- @@ -112,12 +91,6 @@ RESLIB1SRSFILES= \ $(SRS)$/browse.srs \ $(SRS)$/javaerror.srs -RESLIB2NAME= $(RESTARGETSIMPLE) -RESLIB2SRSFILES=\ - $(SRS)$/items1.srs \ - $(SRS)$/misc1.srs - - RESLIB3NAME= $(RESTARGETPATCH) RESLIB3SRSFILES= \ $(SRS)$/patchjavaerror.srs @@ -168,55 +141,16 @@ SHL1STDLIBS+= \ $(OLEAUT32LIB) .ENDIF # WNT -SHL1OBJS= \ - $(SLO)$/svtdata.obj - SHL1LIBS= \ $(SLB)$/svt.lib SHL1DEF= $(MISC)$/$(SHL1TARGET).def -SHL1DEPN=$(SHL2TARGETN) DEF1NAME= $(SHL1TARGET) -DEF1DEPN= $(MISC)$/$(SHL1TARGET).flt DEFLIB1NAME =svt DEF1DES =SvTools -# --- svtools lite -------------------------------------------------- - -SHL2TARGET= svl$(DLLPOSTFIX) -SHL2IMPLIB= _isvl -SHL2USE_EXPORTS=name -#Do not link with VCL or any other library that links with VCL -SHL2STDLIBS= \ - $(UNOTOOLSLIB) \ - $(TOOLSLIB) \ - $(I18NISOLANGLIB) \ - $(UCBHELPERLIB) \ - $(COMPHELPERLIB) \ - $(CPPUHELPERLIB) \ - $(CPPULIB) \ - $(VOSLIB) \ - $(VCLLIB) \ - $(SALLIB) - -.IF "$(GUI)"=="WNT" -SHL2STDLIBS+= \ - $(UWINAPILIB) \ - $(ADVAPI32LIB) \ - $(GDI32LIB) -.ENDIF # WNT - -SHL2LIBS= $(SLB)$/svl.lib - -SHL2DEF= $(MISC)$/$(SHL2TARGET).def - -DEF2NAME= $(SHL2TARGET) -DEF2DEPN= $(MISC)$/$(SHL2TARGET).flt $(SLB)$/svl.lib -DEFLIB2NAME=svl -DEF2DES =SvTools lite - # --- g2g application -------------------------------------------------- APP2TARGET = g2g @@ -240,19 +174,14 @@ APP2STDLIBS+= $(VCLLIB) \ # --- Targets ------------------------------------------------------ .IF "$(GUI)"=="UNX" -SVTTARGETS= $(LB)$/lib$(SHL2TARGET)$(DLLPOST) $(LB)$/lib$(SHL1TARGET)$(DLLPOST) +SVTTARGETS= $(LB)$/lib$(SHL1TARGET)$(DLLPOST) .ELSE -SVTTARGETS= $(LB)$/isvl.lib \ - $(BIN)$/$(SHL2TARGET)$(DLLPOST) $(BIN)$/$(SHL1TARGET)$(DLLPOST) +SVTTARGETS= $(BIN)$/$(SHL1TARGET)$(DLLPOST) .ENDIF # just a quick fix - has to be cleaned up some day... .IF "$(L10N-framework)"=="" -ALL: $(SLB)$/svl.lib \ - $(SLB)$/svt.lib \ - $(MISC)$/$(SHL2TARGET).flt \ - $(MISC)$/$(SHL1TARGET).flt \ - $(MISC)$/$(SHL2TARGET).def \ +ALL: $(SLB)$/svt.lib \ $(MISC)$/$(SHL1TARGET).def \ $(SVTTARGETS) \ ALLTAR @@ -260,15 +189,4 @@ ALL: $(SLB)$/svl.lib \ .INCLUDE : target.mk -# --- Svtools-Control-Filter-Datei --- - -$(MISC)$/$(SHL1TARGET).flt: svt.flt - @echo ------------------------------ - @echo Making: $@ - $(TYPE) svt.flt >$@ - -$(MISC)$/$(SHL2TARGET).flt: svl.flt - @echo ------------------------------ - @echo Making: $@ - $(TYPE) svl.flt >$@ diff --git a/svtools/util/svl.flt b/svtools/util/svl.flt deleted file mode 100644 index be7de3bce8c5..000000000000 --- a/svtools/util/svl.flt +++ /dev/null @@ -1,85 +0,0 @@ -AUTO_CODE -BrowserDataWin -BrowserColumn -ButtonFrame -CreateLoader -DdeString -DlgSource -DlgExport -EditWindow -FileEntry -GIFLZWDecompressor -GIFReader -PNGReader -ImpDetect -ImpDraw -ImpGet -ImpPut -ImpSvNum -JPEGReader -WMFReader -EnhWMFReader -WMFWriter -LinkStub -MultiTextLineInfo -Regexpr -RemoteControlServer -RemoteControlService -RetStream -SCmdStream -SbxArrayRef -SbxBasicFormater -SbxRes -SbxVariableRef -SfxListUndoAction -SfxPointerEntry -SfxUINT32s -SfxULongRangeItem -SfxULongRanges -SfxULongRangesItem -SgfFontLst -SgfFontOne -StatementCommand -StatementControl -StatementFlow -StatementList -StatementSlot -SVDDE_MISC_CODE -SvInterfaceClient -SvImp -SvStringLockBytes -svtools -SVTOOLS_FILTER -SVTOOLS_CODE -SVTOOLS_FILTER4 -SVTOOLS_FILTER_CODE -ValueSetItem -WMFRecord -WriteRecord -XPMReader -XBMReader -_grow -_ImplINetHistoryLoadTimer -_ImplINetHistoryStoreTimer -sRTF_ -sHTML_ -SdbSqlScanner -Sdbyy_scan -SqlInternalNode -unnamed -WEP -LIBMAIN -LibMain -??_7 -??_8 -??_C -??_E -??_F -??_G -??_H -??_I -0Imp -Impl@@ -Imp@@ -__CT -_STL diff --git a/svtools/util/svt.flt b/svtools/util/svt.flt deleted file mode 100644 index f021d41b1dca..000000000000 --- a/svtools/util/svt.flt +++ /dev/null @@ -1,81 +0,0 @@ -AUTO_CODE -BrowserDataWin -BrowserColumn -ButtonFrame -CreateLoader -DdeString -DlgSource -DlgExport -EditWindow -FileEntry -GIFLZWDecompressor -GIFReader -PNGReader -ImpDetect -ImpDraw -ImpGet -ImpPut -ImpSv -JPEGReader -WMFReader -EnhWMFReader -WMFWriter -LinkStub -MultiTextLineInfo -Regexpr -RemoteControlServer -RemoteControlService -RetStream -SCmdStream -SbxArrayRef -SbxBasicFormater -SbxRes -SbxVariableRef -SfxListUndoAction -SfxPointerEntry -SfxUINT32s -SfxULongRangeItem -SfxULongRanges -SfxULongRangesItem -SgfFontLst -SgfFontOne -StatementCommand -StatementControl -StatementFlow -StatementList -StatementSlot -SVDDE_MISC_CODE -SvInterfaceClient -SvImp -SvStringLockBytes -SVTOOLS_FILTER -SVTOOLS_CODE -SVTOOLS_FILTER4 -SVTOOLS_FILTER_CODE -ValueSetItem -WMFRecord -WriteRecord -XPMReader -XBMReader -_grow -_ImplINetHistoryLoadTimer -_ImplINetHistoryStoreTimer -sRTF_ -sHTML_ -unnamed -svtools\ -WEP -LIBMAIN -LibMain -??_7 -??_8 -??_C -??_E -??_F -??_G -??_H -??_I -0Imp -Impl@@ -Imp@@ -__CT diff --git a/svtools/workben/unodialog/udlg_global.hrc b/svtools/workben/unodialog/udlg_global.hrc index 71a67cd2b7e8..bde0e5e86ce2 100644 --- a/svtools/workben/unodialog/udlg_global.hrc +++ b/svtools/workben/unodialog/udlg_global.hrc @@ -31,7 +31,7 @@ #ifndef SVTOOLS_UDLG_GLOBAL_HRC #define SVTOOLS_UDLG_GLOBAL_HRC -#include +#include //===================================================================== //= bases diff --git a/toolkit/inc/toolkit/awt/vclxtopwindow.hxx b/toolkit/inc/toolkit/awt/vclxtopwindow.hxx index 7b4f1922b99e..4716120a347b 100644 --- a/toolkit/inc/toolkit/awt/vclxtopwindow.hxx +++ b/toolkit/inc/toolkit/awt/vclxtopwindow.hxx @@ -32,31 +32,45 @@ #define _TOOLKIT_AWT_VCLXTOPWINDOW_HXX_ #include -#include +#include #include #include #include -#include +#include #include -typedef ::cppu::ImplHelper2 < ::com::sun::star::awt::XTopWindow, - ::com::sun::star::awt::XSystemDependentWindowPeer - > VCLXTopWindow_XBase; +typedef ::cppu::ImplHelper1 < ::com::sun::star::awt::XTopWindow2 + > VCLXTopWindow_XBase; +typedef ::cppu::ImplHelper1 < ::com::sun::star::awt::XSystemDependentWindowPeer + > VCLXTopWindow_SBase; -class TOOLKIT_DLLPUBLIC VCLXTopWindow_Base: public VCLXTopWindow_XBase +class TOOLKIT_DLLPUBLIC VCLXTopWindow_Base :public VCLXTopWindow_XBase + ,public VCLXTopWindow_SBase { +private: + const bool m_bWHWND; + protected: ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMenuBar> mxMenuBar; + bool isSystemDependentWindowPeer() const { return m_bWHWND; } + virtual ::vos::IMutex& GetMutexImpl() = 0; virtual Window* GetWindowImpl() = 0; virtual ::cppu::OInterfaceContainerHelper& GetTopWindowListenersImpl() = 0; + VCLXTopWindow_Base( const bool _bSupportSystemWindowPeer ); + public: virtual ~VCLXTopWindow_Base(); + // XInterface equivalents + ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + // XTypeProvider equivalents + ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes() throw(::com::sun::star::uno::RuntimeException); + // ::com::sun::star::awt::XSystemDependentWindowPeer ::com::sun::star::uno::Any SAL_CALL getWindowHandle( const ::com::sun::star::uno::Sequence< sal_Int8 >& ProcessId, sal_Int16 SystemType ) throw(::com::sun::star::uno::RuntimeException); @@ -66,6 +80,14 @@ public: void SAL_CALL toFront() throw(::com::sun::star::uno::RuntimeException); void SAL_CALL toBack() throw(::com::sun::star::uno::RuntimeException); void SAL_CALL setMenuBar( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMenuBar >& xMenu ) throw(::com::sun::star::uno::RuntimeException); + + // XTopWindow2 + virtual ::sal_Bool SAL_CALL getIsMaximized() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setIsMaximized( ::sal_Bool _ismaximized ) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL getIsMinimized() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setIsMinimized( ::sal_Bool _isminimized ) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getDisplay() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setDisplay( ::sal_Int32 _display ) throw (::com::sun::star::uno::RuntimeException, ::com::sun::star::lang::IndexOutOfBoundsException); }; // ---------------------------------------------------- @@ -75,9 +97,6 @@ public: class VCLXTopWindow: public VCLXTopWindow_Base, public VCLXContainer { -private: - bool m_bWHWND; - protected: virtual vos::IMutex& GetMutexImpl(); virtual Window* GetWindowImpl(); diff --git a/toolkit/inc/toolkit/awt/vclxwindows.hxx b/toolkit/inc/toolkit/awt/vclxwindows.hxx index 3e61a9e9aa87..b6958c720f29 100644 --- a/toolkit/inc/toolkit/awt/vclxwindows.hxx +++ b/toolkit/inc/toolkit/awt/vclxwindows.hxx @@ -32,6 +32,7 @@ #define _TOOLKIT_AWT_VCLXWINDOWS_HXX_ #include + #include #include #include @@ -88,8 +89,8 @@ #include #include -#include -#include +#include "toolkit/awt/vclxwindow.hxx" +#include "toolkit/awt/vclxtopwindow.hxx" #include #include diff --git a/toolkit/inc/toolkit/helper/listenermultiplexer.hxx b/toolkit/inc/toolkit/helper/listenermultiplexer.hxx index 24a16d5868dd..543c8a85c401 100644 --- a/toolkit/inc/toolkit/helper/listenermultiplexer.hxx +++ b/toolkit/inc/toolkit/helper/listenermultiplexer.hxx @@ -129,7 +129,7 @@ DECL_LISTENERMULTIPLEXER_END // ---------------------------------------------------- // class MouseListenerMultiplexer // ---------------------------------------------------- -DECL_LISTENERMULTIPLEXER_START( MouseListenerMultiplexer, ::com::sun::star::awt::XMouseListener ) +DECL_LISTENERMULTIPLEXER_START_DLLPUB( MouseListenerMultiplexer, ::com::sun::star::awt::XMouseListener ) void SAL_CALL mousePressed( const ::com::sun::star::awt::MouseEvent& e ) throw(::com::sun::star::uno::RuntimeException); void SAL_CALL mouseReleased( const ::com::sun::star::awt::MouseEvent& e ) throw(::com::sun::star::uno::RuntimeException); void SAL_CALL mouseEntered( const ::com::sun::star::awt::MouseEvent& e ) throw(::com::sun::star::uno::RuntimeException); diff --git a/toolkit/inc/toolkit/helper/property.hxx b/toolkit/inc/toolkit/helper/property.hxx index da2de08c9544..f82df1f5b53f 100644 --- a/toolkit/inc/toolkit/helper/property.hxx +++ b/toolkit/inc/toolkit/helper/property.hxx @@ -165,7 +165,7 @@ namespace rtl { #define BASEPROPERTY_IMAGEPOSITION 113 // sal_Int16 #define BASEPROPERTY_NATIVE_WIDGET_LOOK 114 // sal_Bool #define BASEPROPERTY_VERTICALALIGN 115 // VerticalAlignment -#define BASEPROPERTY_WHEELWITHOUTFOCUS 116 // sal_Bool +#define BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR 116 // sal_Int16 #define BASEPROPERTY_GRAPHIC 117 // css.graphic.XGraphic #define BASEPROPERTY_STEP_TIME 118 // sal_Int32 #define BASEPROPERTY_DECORATION 119 // sal_Bool @@ -191,6 +191,14 @@ namespace rtl { #define BASEPROPERTY_IMAGE_SCALE_MODE 137 #define BASEPROPERTY_WRITING_MODE 138 #define BASEPROPERTY_CONTEXT_WRITING_MODE 139 +#define BASEPROPERTY_GRID_SHOWROWHEADER 140 +#define BASEPROPERTY_GRID_SHOWCOLUMNHEADER 141 +#define BASEPROPERTY_GRID_DATAMODEL 142 +#define BASEPROPERTY_GRID_COLUMNMODEL 143 +#define BASEPROPERTY_GRID_SELECTIONMODE 144 +#define BASEPROPERTY_ENABLEVISIBLE 145 // sal_Bool +#define BASEPROPERTY_REFERENCE_DEVICE 146 + // Keine gebundenen Properties, werden immer aus der Property BASEPROPERTY_FONTDESCRIPTOR entnommen. #define BASEPROPERTY_FONTDESCRIPTORPART_START 1000 diff --git a/toolkit/inc/toolkit/helper/servicenames.hxx b/toolkit/inc/toolkit/helper/servicenames.hxx index 31513f0f2358..89810ae69482 100644 --- a/toolkit/inc/toolkit/helper/servicenames.hxx +++ b/toolkit/inc/toolkit/helper/servicenames.hxx @@ -95,6 +95,12 @@ extern const sal_Char __FAR_DATA szServiceName_TreeControl[]; extern const sal_Char __FAR_DATA szServiceName_TreeControlModel[]; extern const sal_Char __FAR_DATA szServiceName_MutableTreeDataModel[]; +extern const sal_Char __FAR_DATA szServiceName_GridControl[]; +extern const sal_Char __FAR_DATA szServiceName_GridControlModel[]; +extern const sal_Char __FAR_DATA szServiceName_DefaultGridDataModel[]; +extern const sal_Char __FAR_DATA szServiceName_DefaultGridColumnModel[]; +extern const sal_Char __FAR_DATA szServiceName_GridColumn[]; + extern const sal_Char __FAR_DATA szServiceName_UnoSimpleAnimationControl[], szServiceName_UnoSimpleAnimationControlModel[]; extern const sal_Char __FAR_DATA szServiceName_UnoThrobberControl[], szServiceName_UnoThrobberControlModel[]; extern const sal_Char __FAR_DATA szServiceName_UnoControlFixedHyperlink[], szServiceName_UnoControlFixedHyperlinkModel[]; diff --git a/toolkit/inc/toolkit/helper/vclunohelper.hxx b/toolkit/inc/toolkit/helper/vclunohelper.hxx index 68583f99b447..e29b7237abb8 100644 --- a/toolkit/inc/toolkit/helper/vclunohelper.hxx +++ b/toolkit/inc/toolkit/helper/vclunohelper.hxx @@ -36,6 +36,7 @@ #include #include +#include namespace com { namespace sun { namespace star { namespace uno { @@ -59,6 +60,7 @@ namespace com { namespace sun { namespace star { namespace awt { struct SimpleFontMetric; struct FontDescriptor; struct Rectangle; + struct KeyEvent; }}}} @@ -71,6 +73,8 @@ namespace com { namespace sun { namespace star { namespace awt { class Window; class OutputDevice; +class MouseEvent; +class KeyEvent; // ---------------------------------------------------- // class VclUnoHelper @@ -135,11 +139,27 @@ public: static MapUnit /* MapModeUnit */ ConvertToMapModeUnit(sal_Int16 /* com.sun.star.util.MeasureUnit.* */ _nMeasureUnit) throw (::com::sun::star::lang::IllegalArgumentException); static sal_Int16 /* com.sun.star.util.MeasureUnit.* */ ConvertToMeasurementUnit(MapUnit /* MapModeUnit */ _nMapModeUnit) throw (::com::sun::star::lang::IllegalArgumentException); + static ::Size /* VCLSize */ ConvertToVCLSize(::com::sun::star::awt::Size const& _aSize); static ::com::sun::star::awt::Size ConvertToAWTSize(::Size /* VCLSize */ const& _aSize); + static ::Point /* VCLPoint */ ConvertToVCLPoint(::com::sun::star::awt::Point const& _aPoint); static ::com::sun::star::awt::Point ConvertToAWTPoint(::Point /* VCLPoint */ const& _aPoint); + static ::Rectangle ConvertToVCLRect( ::com::sun::star::awt::Rectangle const & _rRect ); + static ::com::sun::star::awt::Rectangle ConvertToAWTRect( ::Rectangle const & _rRect ); + + static ::com::sun::star::awt::MouseEvent + createMouseEvent( + const ::MouseEvent& _rVclEvent, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext + ); + + static ::com::sun::star::awt::KeyEvent + createKeyEvent( + const ::KeyEvent& _rVclEvent, + const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _rxContext + ); }; diff --git a/toolkit/prj/build.lst b/toolkit/prj/build.lst index 7fa0efaded53..304d0e7c978f 100644 --- a/toolkit/prj/build.lst +++ b/toolkit/prj/build.lst @@ -7,6 +7,7 @@ ti toolkit\source\helper nmake - all ti_helper ti_inc NULL ti toolkit\source\awt nmake - all ti_awt ti_inc NULL ti toolkit\source\controls nmake - all ti_controls ti_inc NULL ti toolkit\source\controls\tree nmake - all ti_tree NULL +ti toolkit\source\controls\grid nmake - all ti_grid NULL ti toolkit\source\layout\core nmake - all ti_layout_core NULL ti toolkit\source\layout\vcl nmake - all ti_layout_vcl NULL -ti toolkit\util nmake - all ti_util ti_awt ti_controls ti_layout_core ti_helper ti_tree ti_layout_vcl NULL +ti toolkit\util nmake - all ti_util ti_awt ti_controls ti_layout_core ti_helper ti_tree ti_grid ti_layout_vcl NULL diff --git a/toolkit/qa/complex/toolkit/interface_tests/makefile.mk b/toolkit/qa/complex/toolkit/interface_tests/makefile.mk index 8c9cb27ecd04..ed7855663f36 100755 --- a/toolkit/qa/complex/toolkit/interface_tests/makefile.mk +++ b/toolkit/qa/complex/toolkit/interface_tests/makefile.mk @@ -40,7 +40,7 @@ PACKAGE = complex$/toolkit$/interface_tests #----- compile .java files ----------------------------------------- -JARFILES = mysql.jar sandbox.jar ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar +JARFILES = mysql.jar ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar JAVAFILES = _XAccessibleComponent.java \ _XAccessibleContext.java \ _XAccessibleExtendedComponent.java \ diff --git a/toolkit/qa/complex/toolkit/makefile.mk b/toolkit/qa/complex/toolkit/makefile.mk index b375d1d5b238..c895c8403498 100755 --- a/toolkit/qa/complex/toolkit/makefile.mk +++ b/toolkit/qa/complex/toolkit/makefile.mk @@ -40,7 +40,7 @@ PACKAGE = complex$/toolkit #----- compile .java files ----------------------------------------- -JARFILES = mysql.jar sandbox.jar ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar +JARFILES = mysql.jar ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar JAVAFILES = CheckAccessibleStatusBar.java CheckAccessibleStatusBarItem.java CheckAsyncCallback.java CallbackClass.java JAVACLASSFILES = $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) SUBDIRS = interface_tests diff --git a/toolkit/source/awt/makefile.mk b/toolkit/source/awt/makefile.mk index 86953691ad27..406386c5723e 100644 --- a/toolkit/source/awt/makefile.mk +++ b/toolkit/source/awt/makefile.mk @@ -44,7 +44,6 @@ ENABLE_EXCEPTIONS=TRUE # --- Files -------------------------------------------------------- .IF "$(GUIBASE)"=="aqua" -OBJCXXFLAGS=-x objective-c++ -fobjc-exceptions CFLAGSCXX+=$(OBJCXXFLAGS) .ENDIF # "$(GUIBASE)"=="aqua" diff --git a/toolkit/source/awt/vclxdialog.cxx b/toolkit/source/awt/vclxdialog.cxx index 0712f8ca074c..32f2931e7438 100644 --- a/toolkit/source/awt/vclxdialog.cxx +++ b/toolkit/source/awt/vclxdialog.cxx @@ -66,6 +66,7 @@ DBG_NAME( VCLXDialog ) VCLXDialog::VCLXDialog() : VCLXWindow() + , VCLXTopWindow_Base( true ) , VCLXDialog_Base() , Bin() , bRealized( false ) diff --git a/toolkit/source/awt/vclxmenu.cxx b/toolkit/source/awt/vclxmenu.cxx index c8e5e1bd3853..5200849d66ed 100644 --- a/toolkit/source/awt/vclxmenu.cxx +++ b/toolkit/source/awt/vclxmenu.cxx @@ -578,7 +578,7 @@ sal_Int16 VCLXMenu::execute( const ::com::sun::star::uno::Reference< ::com::sun: sal_Int16 nRet = 0; if ( mpMenu && IsPopupMenu() ) - nRet = ((PopupMenu*)mpMenu)->Execute( VCLUnoHelper::GetWindow( rxWindowPeer ), VCLRectangle(rArea), nFlags ); + nRet = ((PopupMenu*)mpMenu)->Execute( VCLUnoHelper::GetWindow( rxWindowPeer ), VCLRectangle(rArea), nFlags | POPUPMENU_NOMOUSEUPCLOSE ); return nRet; } diff --git a/toolkit/source/awt/vclxtopwindow.cxx b/toolkit/source/awt/vclxtopwindow.cxx index 26e457d74583..6e532c7bef3e 100644 --- a/toolkit/source/awt/vclxtopwindow.cxx +++ b/toolkit/source/awt/vclxtopwindow.cxx @@ -46,6 +46,7 @@ #include #include #include +#include #include #include @@ -54,13 +55,44 @@ #include #include #include +#include #include +using ::com::sun::star::uno::RuntimeException; +using ::com::sun::star::uno::Sequence; +using ::com::sun::star::uno::Type; +using ::com::sun::star::uno::Any; +using ::com::sun::star::lang::IndexOutOfBoundsException; + +VCLXTopWindow_Base::VCLXTopWindow_Base( const bool _bSupportSystemWindowPeer ) + :m_bWHWND( _bSupportSystemWindowPeer ) +{ +} + VCLXTopWindow_Base::~VCLXTopWindow_Base() { } +Any VCLXTopWindow_Base::queryInterface( const Type & rType ) throw(RuntimeException) +{ + ::com::sun::star::uno::Any aRet( VCLXTopWindow_XBase::queryInterface( rType ) ); + + // do not expose XSystemDependentWindowPeer if we do not have a system window handle + if ( !aRet.hasValue() && m_bWHWND ) + aRet = VCLXTopWindow_SBase::queryInterface( rType ); + + return aRet; +} + +Sequence< Type > VCLXTopWindow_Base::getTypes() throw(RuntimeException) +{ + Sequence< Type > aTypes( VCLXTopWindow_XBase::getTypes() ); + if ( m_bWHWND ) + aTypes = ::comphelper::concatSequences( aTypes, VCLXTopWindow_SBase::getTypes() ); + return aTypes; +} + ::com::sun::star::uno::Any VCLXTopWindow_Base::getWindowHandle( const ::com::sun::star::uno::Sequence< sal_Int8 >& /*ProcessId*/, sal_Int16 SystemType ) throw(::com::sun::star::uno::RuntimeException) { ::vos::OGuard aGuard( GetMutexImpl() ); @@ -157,6 +189,81 @@ void VCLXTopWindow_Base::setMenuBar( const ::com::sun::star::uno::Reference< ::c mxMenuBar = rxMenu; } +//-------------------------------------------------------------------- +::sal_Bool SAL_CALL VCLXTopWindow_Base::getIsMaximized() throw (RuntimeException) +{ + ::vos::OGuard aGuard( GetMutexImpl() ); + + const WorkWindow* pWindow = dynamic_cast< const WorkWindow* >( GetWindowImpl() ); + if ( !pWindow ) + return sal_False; + + return pWindow->IsMaximized(); +} + +//-------------------------------------------------------------------- +void SAL_CALL VCLXTopWindow_Base::setIsMaximized( ::sal_Bool _ismaximized ) throw (RuntimeException) +{ + ::vos::OGuard aGuard( GetMutexImpl() ); + + WorkWindow* pWindow = dynamic_cast< WorkWindow* >( GetWindowImpl() ); + if ( !pWindow ) + return; + + pWindow->Maximize( _ismaximized ); +} + +//-------------------------------------------------------------------- +::sal_Bool SAL_CALL VCLXTopWindow_Base::getIsMinimized() throw (RuntimeException) +{ + ::vos::OGuard aGuard( GetMutexImpl() ); + + const WorkWindow* pWindow = dynamic_cast< const WorkWindow* >( GetWindowImpl() ); + if ( !pWindow ) + return sal_False; + + return pWindow->IsMinimized(); +} + +//-------------------------------------------------------------------- +void SAL_CALL VCLXTopWindow_Base::setIsMinimized( ::sal_Bool _isMinimized ) throw (RuntimeException) +{ + ::vos::OGuard aGuard( GetMutexImpl() ); + + WorkWindow* pWindow = dynamic_cast< WorkWindow* >( GetWindowImpl() ); + if ( !pWindow ) + return; + + _isMinimized ? pWindow->Minimize() : pWindow->Restore(); +} + +//-------------------------------------------------------------------- +::sal_Int32 SAL_CALL VCLXTopWindow_Base::getDisplay() throw (RuntimeException) +{ + ::vos::OGuard aGuard( GetMutexImpl() ); + + const SystemWindow* pWindow = dynamic_cast< const SystemWindow* >( GetWindowImpl() ); + if ( !pWindow ) + return 0; + + return pWindow->GetScreenNumber(); +} + +//-------------------------------------------------------------------- +void SAL_CALL VCLXTopWindow_Base::setDisplay( ::sal_Int32 _display ) throw (RuntimeException, IndexOutOfBoundsException) +{ + ::vos::OGuard aGuard( GetMutexImpl() ); + + if ( ( _display < 0 ) || ( _display >= (sal_Int32)Application::GetScreenCount() ) ) + throw IndexOutOfBoundsException(); + + SystemWindow* pWindow = dynamic_cast< SystemWindow* >( GetWindowImpl() ); + if ( !pWindow ) + return; + + pWindow->SetScreenNumber( _display ); +} + // ---------------------------------------------------- // class VCLXTopWindow // ---------------------------------------------------- @@ -167,7 +274,7 @@ void VCLXTopWindow::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) } VCLXTopWindow::VCLXTopWindow(bool bWHWND) - : m_bWHWND(bWHWND) + : VCLXTopWindow_Base( bWHWND ) { } @@ -193,24 +300,19 @@ Window* VCLXTopWindow::GetWindowImpl() // ::com::sun::star::uno::XInterface ::com::sun::star::uno::Any VCLXTopWindow::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException) { - ::com::sun::star::uno::Any aRet; - if(! m_bWHWND) { - aRet = ::cppu::queryInterface( rType, - SAL_STATIC_CAST( ::com::sun::star::awt::XTopWindow*, this ) ); - } - else { - aRet = ::cppu::queryInterface( rType, - SAL_STATIC_CAST( ::com::sun::star::awt::XTopWindow*, this ), - SAL_STATIC_CAST( ::com::sun::star::awt::XSystemDependentWindowPeer*, this ) ); - } - return (aRet.hasValue() ? aRet : VCLXContainer::queryInterface( rType )); + ::com::sun::star::uno::Any aRet( VCLXTopWindow_Base::queryInterface( rType ) ); + + if ( !aRet.hasValue() ) + aRet = VCLXContainer::queryInterface( rType ); + + return aRet; } ::com::sun::star::uno::Sequence< sal_Int8 > VCLXTopWindow::getImplementationId() throw(::com::sun::star::uno::RuntimeException) { static ::cppu::OImplementationId* pId = NULL; static ::cppu::OImplementationId* pIdWithHandle = NULL; - if ( m_bWHWND ) + if ( isSystemDependentWindowPeer() ) { if( !pIdWithHandle ) { @@ -242,41 +344,5 @@ Window* VCLXTopWindow::GetWindowImpl() ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > VCLXTopWindow::getTypes() throw(::com::sun::star::uno::RuntimeException) { - static ::cppu::OTypeCollection* pCollection = NULL; - static ::cppu::OTypeCollection* pCollectionWithHandle = NULL; - - if ( m_bWHWND ) - { - if( !pCollectionWithHandle ) - { - ::osl::Guard< ::osl::Mutex > aGuard( ::osl::Mutex::getGlobalMutex() ); - if( !pCollectionWithHandle ) - { - static ::cppu::OTypeCollection collectionWithHandle( - getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::lang::XTypeProvider>* ) NULL ), - getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTopWindow>* ) NULL ), - getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XSystemDependentWindowPeer>* ) NULL ), - VCLXContainer::getTypes() ); - pCollectionWithHandle = &collectionWithHandle; - } - } - - return (*pCollectionWithHandle).getTypes(); - } - else - { - if( !pCollection ) - { - ::osl::Guard< ::osl::Mutex > aGuard( ::osl::Mutex::getGlobalMutex() ); - if( !pCollection ) - { - static ::cppu::OTypeCollection collection( - getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::lang::XTypeProvider>* ) NULL ), - getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTopWindow>* ) NULL ), - VCLXContainer::getTypes() ); - pCollection = &collection; - } - } - return (*pCollection).getTypes(); - } + return ::comphelper::concatSequences( VCLXTopWindow_Base::getTypes(), VCLXContainer::getTypes() ); } diff --git a/toolkit/source/awt/vclxwindow.cxx b/toolkit/source/awt/vclxwindow.cxx index 09e318800184..3d2069ab8385 100644 --- a/toolkit/source/awt/vclxwindow.cxx +++ b/toolkit/source/awt/vclxwindow.cxx @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -63,6 +64,7 @@ #include #include #include +#include #include #include @@ -75,6 +77,7 @@ using ::com::sun::star::uno::UNO_QUERY; using ::com::sun::star::lang::EventObject; using ::com::sun::star::awt::XWindowListener2; using ::com::sun::star::awt::XDockableWindowListener; +using ::com::sun::star::awt::XDevice; using ::com::sun::star::style::VerticalAlignment; using ::com::sun::star::style::VerticalAlignment_TOP; using ::com::sun::star::style::VerticalAlignment_MIDDLE; @@ -82,6 +85,7 @@ using ::com::sun::star::style::VerticalAlignment_BOTTOM; using ::com::sun::star::style::VerticalAlignment_MAKE_FIXED_SIZE; namespace WritingMode2 = ::com::sun::star::text::WritingMode2; +namespace MouseWheelBehavior = ::com::sun::star::awt::MouseWheelBehavior; //==================================================================== @@ -226,6 +230,8 @@ private: ::toolkit::AccessibilityClient maAccFactory; bool mbDisposed; bool mbDrawingOntoParent; // no bit mask, is passed around by reference + sal_Bool mbEnableVisible; + sal_Bool mbDirectVisible; ::osl::Mutex maListenerContainerMutex; ::cppu::OInterfaceContainerHelper maWindow2Listeners; @@ -273,6 +279,15 @@ public: */ VCLXWindowImpl( VCLXWindow& _rAntiImpl, ::vos::IMutex& _rMutex, bool _bWithDefaultProps ); + /** synchronously mbEnableVisible + */ + void setEnableVisible( sal_Bool bEnableVisible ) { mbEnableVisible = bEnableVisible; } + sal_Bool isEnableVisible() { return mbEnableVisible; } + /** synchronously mbDirectVisible; + */ + void setDirectVisible( sal_Bool bDirectVisible ) { mbDirectVisible = bDirectVisible; } + sal_Bool isDirectVisible() { return mbDirectVisible; } + /** asynchronously notifies a mouse event to the VCLXWindow's XMouseListeners */ void notifyMouseEvent( const awt::MouseEvent& _rMouseEvent, MouseEventType _nType ); @@ -347,6 +362,8 @@ VCLXWindowImpl::VCLXWindowImpl( VCLXWindow& _rAntiImpl, ::vos::IMutex& _rMutex, ,mrMutex( _rMutex ) ,mbDisposed( false ) ,mbDrawingOntoParent( false ) + ,mbEnableVisible(sal_True) + ,mbDirectVisible(sal_True) ,maListenerContainerMutex( ) ,maWindow2Listeners( maListenerContainerMutex ) ,maDockableWindowListeners( maListenerContainerMutex ) @@ -539,48 +556,6 @@ void ImplInitWindowEvent( ::com::sun::star::awt::WindowEvent& rEvent, Window* pW pWindow->GetBorder( rEvent.LeftInset, rEvent.TopInset, rEvent.RightInset, rEvent.BottomInset ); } -void ImplInitKeyEvent( ::com::sun::star::awt::KeyEvent& rEvent, const KeyEvent& rEvt ) -{ - rEvent.Modifiers = 0; - if ( rEvt.GetKeyCode().IsShift() ) - rEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::SHIFT; - if ( rEvt.GetKeyCode().IsMod1() ) - rEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::MOD1; - if ( rEvt.GetKeyCode().IsMod2() ) - rEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::MOD2; - if ( rEvt.GetKeyCode().IsMod3() ) - rEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::MOD3; - - rEvent.KeyCode = rEvt.GetKeyCode().GetCode(); - rEvent.KeyChar = rEvt.GetCharCode(); - rEvent.KeyFunc = sal::static_int_cast< sal_Int16 >( - rEvt.GetKeyCode().GetFunction()); -} - -void ImplInitMouseEvent( awt::MouseEvent& rEvent, const MouseEvent& rEvt ) -{ - rEvent.Modifiers = 0; - if ( rEvt.IsShift() ) - rEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::SHIFT; - if ( rEvt.IsMod1() ) - rEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::MOD1; - if ( rEvt.IsMod2() ) - rEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::MOD2; - - rEvent.Buttons = 0; - if ( rEvt.IsLeft() ) - rEvent.Buttons |= ::com::sun::star::awt::MouseButton::LEFT; - if ( rEvt.IsRight() ) - rEvent.Buttons |= ::com::sun::star::awt::MouseButton::RIGHT; - if ( rEvt.IsMiddle() ) - rEvent.Buttons |= ::com::sun::star::awt::MouseButton::MIDDLE; - - rEvent.X = rEvt.GetPosPixel().X(); - rEvent.Y = rEvt.GetPosPixel().Y(); - rEvent.ClickCount = rEvt.GetClicks(); - rEvent.PopupTrigger = sal_False; -} - // ---------------------------------------------------- // class VCLXWindow // ---------------------------------------------------- @@ -625,7 +600,12 @@ void VCLXWindow::SetWindow( Window* pWindow ) SetOutputDevice( pWindow ); if ( GetWindow() ) + { GetWindow()->AddEventListener( LINK( this, VCLXWindow, WindowEventListener ) ); + sal_Bool bDirectVisible = pWindow ? pWindow->IsVisible() : false; + mpImpl->setDirectVisible( bDirectVisible ); + } + } void VCLXWindow::suspendVclEventListening( ) @@ -870,9 +850,9 @@ void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) { if ( mpImpl->getKeyListeners().getLength() ) { - ::com::sun::star::awt::KeyEvent aEvent; - aEvent.Source = (::cppu::OWeakObject*)this; - ImplInitKeyEvent( aEvent, *(KeyEvent*)rVclWindowEvent.GetData() ); + ::com::sun::star::awt::KeyEvent aEvent( VCLUnoHelper::createKeyEvent( + *(KeyEvent*)rVclWindowEvent.GetData(), *this + ) ); mpImpl->getKeyListeners().keyPressed( aEvent ); } } @@ -881,9 +861,9 @@ void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) { if ( mpImpl->getKeyListeners().getLength() ) { - ::com::sun::star::awt::KeyEvent aEvent; - aEvent.Source = (::cppu::OWeakObject*)this; - ImplInitKeyEvent( aEvent, *(KeyEvent*)rVclWindowEvent.GetData() ); + ::com::sun::star::awt::KeyEvent aEvent( VCLUnoHelper::createKeyEvent( + *(KeyEvent*)rVclWindowEvent.GetData(), *this + ) ); mpImpl->getKeyListeners().keyReleased( aEvent ); } } @@ -905,9 +885,7 @@ void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) } MouseEvent aMEvt( aWhere, 1, MOUSE_SIMPLECLICK, MOUSE_LEFT, 0 ); - awt::MouseEvent aEvent; - aEvent.Source = (::cppu::OWeakObject*)this; - ImplInitMouseEvent( aEvent, aMEvt ); + awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( aMEvt, *this ) ); aEvent.PopupTrigger = sal_True; mpImpl->notifyMouseEvent( aEvent, EVENT_MOUSE_PRESSED ); } @@ -918,10 +896,7 @@ void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) MouseEvent* pMouseEvt = (MouseEvent*)rVclWindowEvent.GetData(); if ( mpImpl->getMouseListeners().getLength() && ( pMouseEvt->IsEnterWindow() || pMouseEvt->IsLeaveWindow() ) ) { - awt::MouseEvent aEvent; - aEvent.Source = (::cppu::OWeakObject*)this; - ImplInitMouseEvent( aEvent, *pMouseEvt ); - + awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *pMouseEvt, *this ) ); mpImpl->notifyMouseEvent( aEvent, pMouseEvt->IsEnterWindow() ? EVENT_MOUSE_ENTERED : EVENT_MOUSE_EXITED @@ -930,11 +905,8 @@ void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) if ( mpImpl->getMouseMotionListeners().getLength() && !pMouseEvt->IsEnterWindow() && !pMouseEvt->IsLeaveWindow() ) { - awt::MouseEvent aEvent; - aEvent.Source = (::cppu::OWeakObject*)this; - ImplInitMouseEvent( aEvent, *pMouseEvt ); + awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *pMouseEvt, *this ) ); aEvent.ClickCount = 0; // #92138# - if ( pMouseEvt->GetMode() & MOUSE_SIMPLEMOVE ) mpImpl->getMouseMotionListeners().mouseMoved( aEvent ); else @@ -946,9 +918,7 @@ void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) { if ( mpImpl->getMouseListeners().getLength() ) { - awt::MouseEvent aEvent; - aEvent.Source = (::cppu::OWeakObject*)this; - ImplInitMouseEvent( aEvent, *(MouseEvent*)rVclWindowEvent.GetData() ); + awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *(MouseEvent*)rVclWindowEvent.GetData(), *this ) ); mpImpl->notifyMouseEvent( aEvent, EVENT_MOUSE_PRESSED ); } } @@ -957,9 +927,7 @@ void VCLXWindow::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent ) { if ( mpImpl->getMouseListeners().getLength() ) { - awt::MouseEvent aEvent; - aEvent.Source = (::cppu::OWeakObject*)this; - ImplInitMouseEvent( aEvent, *(MouseEvent*)rVclWindowEvent.GetData() ); + awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *(MouseEvent*)rVclWindowEvent.GetData(), *this ) ); mpImpl->notifyMouseEvent( aEvent, EVENT_MOUSE_RELEASED ); } } @@ -1226,7 +1194,8 @@ void VCLXWindow::setVisible( sal_Bool bVisible ) throw(::com::sun::star::uno::Ru } } */ - pWindow->Show( bVisible ); + mpImpl->setDirectVisible( bVisible ); + pWindow->Show( bVisible && mpImpl->isEnableVisible() ); } } @@ -1529,6 +1498,7 @@ void VCLXWindow::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds, bool bWithDe BASEPROPERTY_HELPURL, BASEPROPERTY_TEXT, BASEPROPERTY_PRINTABLE, + BASEPROPERTY_ENABLEVISIBLE, // for visibility BASEPROPERTY_TABSTOP, 0); @@ -1617,6 +1587,18 @@ void VCLXWindow::setProperty( const ::rtl::OUString& PropertyName, const ::com:: sal_uInt16 nPropType = GetPropertyId( PropertyName ); switch ( nPropType ) { + case BASEPROPERTY_REFERENCE_DEVICE: + { + Control* pControl = dynamic_cast< Control* >( pWindow ); + OSL_ENSURE( pControl, "VCLXWindow::setProperty( RefDevice ): need a Control for this!" ); + if ( !pControl ) + break; + Reference< XDevice > xDevice( Value, UNO_QUERY ); + OutputDevice* pDevice = VCLUnoHelper::GetOutputDevice( xDevice ); + pControl->SetReferenceDevice( pDevice ); + } + break; + case BASEPROPERTY_CONTEXT_WRITING_MODE: { OSL_VERIFY( Value >>= mpImpl->mnContextWritingMode ); @@ -1634,19 +1616,27 @@ void VCLXWindow::setProperty( const ::rtl::OUString& PropertyName, const ::com:: } break; - case BASEPROPERTY_WHEELWITHOUTFOCUS: + case BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR: { - sal_Bool bWheelOnHover( sal_True ); - if ( Value >>= bWheelOnHover ) + sal_uInt16 nWheelBehavior( MouseWheelBehavior::SCROLL_FOCUS_ONLY ); + OSL_VERIFY( Value >>= nWheelBehavior ); + + AllSettings aSettings = pWindow->GetSettings(); + MouseSettings aMouseSettings = aSettings.GetMouseSettings(); + + USHORT nVclBehavior( MOUSE_WHEEL_FOCUS_ONLY ); + switch ( nWheelBehavior ) { - AllSettings aSettings = pWindow->GetSettings(); - MouseSettings aMouseSettings = aSettings.GetMouseSettings(); - - aMouseSettings.SetNoWheelActionWithoutFocus( !bWheelOnHover ); - aSettings.SetMouseSettings( aMouseSettings ); - - pWindow->SetSettings( aSettings, TRUE ); + case MouseWheelBehavior::SCROLL_DISABLED: nVclBehavior = MOUSE_WHEEL_DISABLE; break; + case MouseWheelBehavior::SCROLL_FOCUS_ONLY: nVclBehavior = MOUSE_WHEEL_FOCUS_ONLY; break; + case MouseWheelBehavior::SCROLL_ALWAYS: nVclBehavior = MOUSE_WHEEL_ALWAYS; break; + default: + OSL_ENSURE( false, "VCLXWindow::setProperty( 'MouseWheelBehavior' ): illegal property value!" ); } + + aMouseSettings.SetWheelBehavior( nWheelBehavior ); + aSettings.SetMouseSettings( aMouseSettings ); + pWindow->SetSettings( aSettings, TRUE ); } break; @@ -1672,6 +1662,19 @@ void VCLXWindow::setProperty( const ::rtl::OUString& PropertyName, const ::com:: setEnable( b ); } break; + case BASEPROPERTY_ENABLEVISIBLE: + { + sal_Bool b = sal_False; + if ( Value >>= b ) + { + if( b != mpImpl->isEnableVisible() ) + { + mpImpl->setEnableVisible( b ); + pWindow->Show( b && mpImpl->isDirectVisible() ); + } + } + } + break; case BASEPROPERTY_TEXT: case BASEPROPERTY_LABEL: case BASEPROPERTY_TITLE: @@ -2114,6 +2117,19 @@ void VCLXWindow::setProperty( const ::rtl::OUString& PropertyName, const ::com:: sal_uInt16 nPropType = GetPropertyId( PropertyName ); switch ( nPropType ) { + case BASEPROPERTY_REFERENCE_DEVICE: + { + Control* pControl = dynamic_cast< Control* >( GetWindow() ); + OSL_ENSURE( pControl, "VCLXWindow::setProperty( RefDevice ): need a Control for this!" ); + if ( !pControl ) + break; + + VCLXDevice* pDevice = new VCLXDevice; + pDevice->SetOutputDevice( pControl->GetReferenceDevice() ); + aProp <<= Reference< XDevice >( pDevice ); + } + break; + case BASEPROPERTY_CONTEXT_WRITING_MODE: aProp <<= mpImpl->mnContextWritingMode; break; @@ -2122,10 +2138,19 @@ void VCLXWindow::setProperty( const ::rtl::OUString& PropertyName, const ::com:: aProp <<= mpImpl->mnWritingMode; break; - case BASEPROPERTY_WHEELWITHOUTFOCUS: + case BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR: { - sal_Bool bWheelOnHover = !GetWindow()->GetSettings().GetMouseSettings().GetNoWheelActionWithoutFocus(); - aProp <<= bWheelOnHover; + USHORT nVclBehavior = GetWindow()->GetSettings().GetMouseSettings().GetWheelBehavior(); + sal_Int16 nBehavior = MouseWheelBehavior::SCROLL_FOCUS_ONLY; + switch ( nVclBehavior ) + { + case MOUSE_WHEEL_DISABLE: nBehavior = MouseWheelBehavior::SCROLL_DISABLED; break; + case MOUSE_WHEEL_FOCUS_ONLY: nBehavior = MouseWheelBehavior::SCROLL_FOCUS_ONLY; break; + case MOUSE_WHEEL_ALWAYS: nBehavior = MouseWheelBehavior::SCROLL_ALWAYS; break; + default: + OSL_ENSURE( false, "VCLXWindow::getProperty( 'MouseWheelBehavior' ): illegal VCL value!" ); + } + aProp <<= nBehavior; } break; @@ -2137,6 +2162,10 @@ void VCLXWindow::setProperty( const ::rtl::OUString& PropertyName, const ::com:: aProp <<= (sal_Bool) GetWindow()->IsEnabled(); break; + case BASEPROPERTY_ENABLEVISIBLE: + aProp <<= (sal_Bool) mpImpl->isEnableVisible(); + break; + case BASEPROPERTY_TEXT: case BASEPROPERTY_LABEL: case BASEPROPERTY_TITLE: @@ -2411,7 +2440,7 @@ void VCLXWindow::draw( sal_Int32 nX, sal_Int32 nY ) throw(::com::sun::star::uno: if ( !pWindow ) return; - if ( pWindow ) + if ( isDesignMode() || mpImpl->isEnableVisible() ) { TabPage* pTabPage = dynamic_cast< TabPage* >( pWindow ); if ( pTabPage ) @@ -2481,7 +2510,7 @@ void VCLXWindow::draw( sal_Int32 nX, sal_Int32 nY ) throw(::com::sun::star::uno: vcl::PDFExtOutDevData* pPDFExport = dynamic_cast(pDev->GetExtOutDevData()); bool bDrawSimple = ( pDev->GetOutDevType() == OUTDEV_PRINTER ) || ( pDev->GetOutDevViewType() == OUTDEV_VIEWTYPE_PRINTPREVIEW ) - || ( pPDFExport && ! pPDFExport->GetIsExportFormFields() ); + || ( pPDFExport != NULL ); if ( bDrawSimple ) { pWindow->Draw( pDev, aP, aSz, WINDOW_DRAW_NOCONTROLS ); @@ -2504,7 +2533,14 @@ void VCLXWindow::setZoom( float fZoomX, float /*fZoomY*/ ) throw(::com::sun::sta ::vos::OGuard aGuard( GetMutex() ); if ( GetWindow() ) - GetWindow()->SetZoom( Fraction( fZoomX ) ); + { + // Fraction::Fraction takes a double, but we have a float only. + // The implicit conversion from float to double can result in a precision loss, i.e. 1.2 is converted to + // 1.200000000047something. To prevent this, we convert explicitly to double, and round it. + double nZoom( fZoomX ); + nZoom = ::rtl::math::round( nZoom, 4 ); + GetWindow()->SetZoom( Fraction( nZoom ) ); + } } // ::com::sun::star::lang::XEventListener diff --git a/toolkit/source/awt/vclxwindows.cxx b/toolkit/source/awt/vclxwindows.cxx index 59cb9632b7e1..7757d170256a 100644 --- a/toolkit/source/awt/vclxwindows.cxx +++ b/toolkit/source/awt/vclxwindows.cxx @@ -386,6 +386,7 @@ void VCLXButton::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_DEFAULTBUTTON, BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_GRAPHIC, BASEPROPERTY_HELPTEXT, @@ -407,6 +408,7 @@ void VCLXButton::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_VERTICALALIGN, BASEPROPERTY_WRITING_MODE, BASEPROPERTY_CONTEXT_WRITING_MODE, + BASEPROPERTY_REFERENCE_DEVICE, 0); VCLXImageConsumer::ImplGetPropertyIds( rIds ); } @@ -419,9 +421,6 @@ VCLXButton::VCLXButton() VCLXButton::~VCLXButton() { -#ifndef __SUNPRO_CC - OSL_TRACE ("%s", __FUNCTION__); -#endif } ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext > VCLXButton::CreateAccessibleContext() @@ -668,6 +667,7 @@ void VCLXImageControl::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_BORDERCOLOR, BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_GRAPHIC, BASEPROPERTY_HELPTEXT, BASEPROPERTY_HELPURL, @@ -796,6 +796,7 @@ void VCLXCheckBox::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) PushPropertyIds( rIds, BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_GRAPHIC, BASEPROPERTY_HELPTEXT, @@ -814,6 +815,7 @@ void VCLXCheckBox::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_VERTICALALIGN, BASEPROPERTY_WRITING_MODE, BASEPROPERTY_CONTEXT_WRITING_MODE, + BASEPROPERTY_REFERENCE_DEVICE, 0); VCLXImageConsumer::ImplGetPropertyIds( rIds ); } @@ -1095,6 +1097,7 @@ void VCLXRadioButton::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) PushPropertyIds( rIds, BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_GRAPHIC, BASEPROPERTY_HELPTEXT, @@ -1112,6 +1115,7 @@ void VCLXRadioButton::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_VERTICALALIGN, BASEPROPERTY_WRITING_MODE, BASEPROPERTY_CONTEXT_WRITING_MODE, + BASEPROPERTY_REFERENCE_DEVICE, 0); VCLXImageConsumer::ImplGetPropertyIds( rIds ); } @@ -1380,6 +1384,9 @@ void VCLXRadioButton::ImplClickedOrToggled( BOOL bToggled ) // ---------------------------------------------------- void VCLXSpinField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) { + PushPropertyIds( rIds, + BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR, + 0 ); VCLXEdit::ImplGetPropertyIds( rIds ); } @@ -1519,6 +1526,7 @@ void VCLXListBox::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_DROPDOWN, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_HELPTEXT, BASEPROPERTY_HELPURL, @@ -1532,6 +1540,8 @@ void VCLXListBox::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_ALIGN, BASEPROPERTY_WRITING_MODE, BASEPROPERTY_CONTEXT_WRITING_MODE, + BASEPROPERTY_REFERENCE_DEVICE, + BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR, 0); VCLXWindow::ImplGetPropertyIds( rIds ); } @@ -2709,6 +2719,7 @@ void VCLXFixedHyperlink::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_BORDERCOLOR, BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_HELPTEXT, BASEPROPERTY_HELPURL, @@ -2737,6 +2748,7 @@ void VCLXFixedText::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_BORDERCOLOR, BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_HELPTEXT, BASEPROPERTY_HELPURL, @@ -2748,6 +2760,7 @@ void VCLXFixedText::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_VERTICALALIGN, BASEPROPERTY_WRITING_MODE, BASEPROPERTY_CONTEXT_WRITING_MODE, + BASEPROPERTY_REFERENCE_DEVICE, 0); VCLXWindow::ImplGetPropertyIds( rIds ); } @@ -2879,6 +2892,7 @@ void VCLXScrollBar::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_BORDERCOLOR, BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_HELPTEXT, BASEPROPERTY_HELPURL, BASEPROPERTY_LINEINCREMENT, @@ -3358,6 +3372,7 @@ void VCLXEdit::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_ECHOCHAR, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_HARDLINEBREAKS, BASEPROPERTY_HELPTEXT, @@ -3734,6 +3749,7 @@ void VCLXComboBox::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_DROPDOWN, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_HELPTEXT, BASEPROPERTY_HELPURL, @@ -3748,6 +3764,8 @@ void VCLXComboBox::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_ALIGN, BASEPROPERTY_WRITING_MODE, BASEPROPERTY_CONTEXT_WRITING_MODE, + BASEPROPERTY_REFERENCE_DEVICE, + BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR, 0); // no, don't call VCLXEdit here - it has properties which we do *not* want to have at at combo box // #i92690# / 2008-08-12 / frank.schoenheit@sun.com @@ -4250,6 +4268,7 @@ void VCLXDateField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_DROPDOWN, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_EXTDATEFORMAT, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_HELPTEXT, @@ -4266,6 +4285,7 @@ void VCLXDateField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_HIDEINACTIVESELECTION, BASEPROPERTY_WRITING_MODE, BASEPROPERTY_CONTEXT_WRITING_MODE, + BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR, 0); VCLXFormattedSpinField::ImplGetPropertyIds( rIds ); } @@ -4586,6 +4606,7 @@ void VCLXTimeField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_BORDERCOLOR, BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_EXTTIMEFORMAT, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_HELPTEXT, @@ -4605,6 +4626,7 @@ void VCLXTimeField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_HIDEINACTIVESELECTION, BASEPROPERTY_WRITING_MODE, BASEPROPERTY_CONTEXT_WRITING_MODE, + BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR, 0); VCLXFormattedSpinField::ImplGetPropertyIds( rIds ); } @@ -4887,6 +4909,7 @@ void VCLXNumericField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_DECIMALACCURACY, BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_HELPTEXT, BASEPROPERTY_HELPURL, @@ -4906,6 +4929,7 @@ void VCLXNumericField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_HIDEINACTIVESELECTION, BASEPROPERTY_WRITING_MODE, BASEPROPERTY_CONTEXT_WRITING_MODE, + BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR, 0); VCLXFormattedSpinField::ImplGetPropertyIds( rIds ); } @@ -5227,6 +5251,7 @@ void VCLXMetricField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_DECIMALACCURACY, BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_HELPTEXT, BASEPROPERTY_HELPURL, @@ -5244,6 +5269,7 @@ void VCLXMetricField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_CUSTOMUNITTEXT, BASEPROPERTY_WRITING_MODE, BASEPROPERTY_CONTEXT_WRITING_MODE, + BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR, 0); VCLXFormattedSpinField::ImplGetPropertyIds( rIds ); } @@ -5477,6 +5503,7 @@ void VCLXCurrencyField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_DECIMALACCURACY, BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_HELPTEXT, BASEPROPERTY_HELPURL, @@ -5496,6 +5523,7 @@ void VCLXCurrencyField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_HIDEINACTIVESELECTION, BASEPROPERTY_WRITING_MODE, BASEPROPERTY_CONTEXT_WRITING_MODE, + BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR, 0); VCLXFormattedSpinField::ImplGetPropertyIds( rIds ); } @@ -5828,6 +5856,7 @@ void VCLXPatternField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_DEFAULTCONTROL, BASEPROPERTY_EDITMASK, BASEPROPERTY_ENABLED, + BASEPROPERTY_ENABLEVISIBLE, BASEPROPERTY_FONTDESCRIPTOR, BASEPROPERTY_HELPTEXT, BASEPROPERTY_HELPURL, @@ -5841,6 +5870,7 @@ void VCLXPatternField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds ) BASEPROPERTY_HIDEINACTIVESELECTION, BASEPROPERTY_WRITING_MODE, BASEPROPERTY_CONTEXT_WRITING_MODE, + BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR, 0); VCLXFormattedSpinField::ImplGetPropertyIds( rIds ); } diff --git a/toolkit/source/controls/dialogcontrol.cxx b/toolkit/source/controls/dialogcontrol.cxx index 47028cc8e071..07d459a6111a 100644 --- a/toolkit/source/controls/dialogcontrol.cxx +++ b/toolkit/source/controls/dialogcontrol.cxx @@ -66,6 +66,7 @@ #include #include "tree/treecontrol.hxx" +#include "grid/gridcontrol.hxx" #include #include @@ -453,6 +454,8 @@ Reference< XInterface > UnoControlDialogModel::createInstance( const ::rtl::OUSt pNewModel = new OGeometryControlModel< UnoControlRoadmapModel >; else if ( aServiceSpecifier.compareToAscii( szServiceName_TreeControlModel ) == 0 ) pNewModel = new OGeometryControlModel< UnoTreeModel >; + else if ( aServiceSpecifier.compareToAscii( szServiceName_GridControlModel ) == 0 ) + pNewModel = new OGeometryControlModel< UnoGridModel >; if ( !pNewModel ) { @@ -515,6 +518,7 @@ Sequence< ::rtl::OUString > UnoControlDialogModel::getAvailableServiceNames() th pNames[18] = ::rtl::OUString::createFromAscii( szServiceName2_UnoControlFixedLineModel ); pNames[19] = ::rtl::OUString::createFromAscii( szServiceName2_UnoControlRoadmapModel ); pNames[20] = ::rtl::OUString::createFromAscii( szServiceName_TreeControlModel ); + pNames[20] = ::rtl::OUString::createFromAscii( szServiceName_GridControlModel ); } return *pNamesSeq; diff --git a/toolkit/source/controls/formattedcontrol.cxx b/toolkit/source/controls/formattedcontrol.cxx index 19fb4c3609d0..6171067f1185 100644 --- a/toolkit/source/controls/formattedcontrol.cxx +++ b/toolkit/source/controls/formattedcontrol.cxx @@ -142,6 +142,7 @@ namespace toolkit ImplRegisterProperty( BASEPROPERTY_EFFECTIVE_MAX ); ImplRegisterProperty( BASEPROPERTY_EFFECTIVE_MIN ); ImplRegisterProperty( BASEPROPERTY_ENABLED ); + ImplRegisterProperty( BASEPROPERTY_ENABLEVISIBLE ); ImplRegisterProperty( BASEPROPERTY_FONTDESCRIPTOR ); ImplRegisterProperty( BASEPROPERTY_FORMATKEY ); ImplRegisterProperty( BASEPROPERTY_FORMATSSUPPLIER ); @@ -161,6 +162,7 @@ namespace toolkit ImplRegisterProperty( BASEPROPERTY_ENFORCE_FORMAT ); ImplRegisterProperty( BASEPROPERTY_WRITING_MODE ); ImplRegisterProperty( BASEPROPERTY_CONTEXT_WRITING_MODE ); + ImplRegisterProperty( BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR ); Any aTreatAsNumber; aTreatAsNumber <<= (sal_Bool) sal_True; diff --git a/toolkit/source/controls/grid/defaultgridcolumnmodel.cxx b/toolkit/source/controls/grid/defaultgridcolumnmodel.cxx new file mode 100644 index 000000000000..bdd7fb475afe --- /dev/null +++ b/toolkit/source/controls/grid/defaultgridcolumnmodel.cxx @@ -0,0 +1,242 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: treedatamodel.cxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_toolkit.hxx" +#include "defaultgridcolumnmodel.hxx" +#include +#include +#include + +using ::rtl::OUString; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::awt::grid; +using namespace ::com::sun::star::lang; + +#define COLUMNSELECTIONALLOWED ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "ColumnSelectionAllowed" )) + +namespace toolkit +{ + +/////////////////////////////////////////////////////////////////////// +// class DefaultGridColumnModel +/////////////////////////////////////////////////////////////////////// + +DefaultGridColumnModel::DefaultGridColumnModel() +: columns(std::vector< Reference< XGridColumn > >()) +{ +} + +//--------------------------------------------------------------------- + +DefaultGridColumnModel::~DefaultGridColumnModel() +{ +} + +//--------------------------------------------------------------------- + +void DefaultGridColumnModel::broadcast( broadcast_type eType, const GridColumnEvent& aEvent ) +{ + ::cppu::OInterfaceContainerHelper* pIter = BrdcstHelper.getContainer( XGridColumnListener::static_type() ); + if( pIter ) + { + ::cppu::OInterfaceIteratorHelper aListIter(*pIter); + while(aListIter.hasMoreElements()) + { + XGridColumnListener* pListener = static_cast(aListIter.next()); + switch( eType ) + { + case column_added: pListener->columnAdded(aEvent); break; + case column_removed: pListener->columnRemoved(aEvent); break; + case column_changed: pListener->columnChanged(aEvent); break; + } + } + } +} + +//--------------------------------------------------------------------- + +void DefaultGridColumnModel::broadcast_changed( ::rtl::OUString name, Any oldValue, Any newValue ) +{ + Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) ); + GridColumnEvent aEvent( xSource, name, oldValue, newValue, 0, NULL ); + broadcast( column_changed, aEvent); +} + +//--------------------------------------------------------------------- + +void DefaultGridColumnModel::broadcast_add( sal_Int32 index, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > & rColumn ) +{ + Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) ); + GridColumnEvent aEvent( xSource, ::rtl::OUString(), Any(), Any(), index, rColumn ); + broadcast( column_added, aEvent); +} + +//--------------------------------------------------------------------- + +void DefaultGridColumnModel::broadcast_remove( sal_Int32 index, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > & rColumn ) +{ + Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) ); + GridColumnEvent aEvent( xSource, ::rtl::OUString(), Any(), Any(), index, rColumn ); + broadcast( column_changed, aEvent); +} + +//--------------------------------------------------------------------- +// XDefaultGridColumnModel +//--------------------------------------------------------------------- +::sal_Bool SAL_CALL DefaultGridColumnModel::getColumnSelectionAllowed() throw (::com::sun::star::uno::RuntimeException) +{ + return selectionAllowed; +} + +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridColumnModel::setColumnSelectionAllowed(::sal_Bool value) throw (::com::sun::star::uno::RuntimeException) +{ + sal_Bool oldValue = selectionAllowed; + selectionAllowed = value; + broadcast_changed( COLUMNSELECTIONALLOWED, Any(oldValue) , Any(selectionAllowed)); +} + +//--------------------------------------------------------------------- + +::sal_Int32 SAL_CALL DefaultGridColumnModel::getColumnCount() throw (::com::sun::star::uno::RuntimeException) +{ + return columns.size(); +} + +//--------------------------------------------------------------------- + +::sal_Int32 SAL_CALL DefaultGridColumnModel::addColumn(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > & column) throw (::com::sun::star::uno::RuntimeException) +{ + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + + columns.push_back(column); + + sal_Int32 index = columns.size() - 1; + broadcast_add(index, column ); + return index; +} + +//--------------------------------------------------------------------- + +::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > > SAL_CALL DefaultGridColumnModel::getColumns() throw (::com::sun::star::uno::RuntimeException) +{ + return comphelper::containerToSequence(columns); +} + +//--------------------------------------------------------------------- + +::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > SAL_CALL DefaultGridColumnModel::getColumn(::sal_Int32 index) throw (::com::sun::star::uno::RuntimeException) +{ + if ( index >=0 && index < ((sal_Int32)columns.size())) + return columns[index]; + else + return Reference< XGridColumn >(); +} + +void SAL_CALL DefaultGridColumnModel::addColumnListener( const Reference< XGridColumnListener >& xListener ) throw (RuntimeException) +{ + BrdcstHelper.addListener( XGridColumnListener::static_type(), xListener ); +} + +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridColumnModel::removeColumnListener( const Reference< XGridColumnListener >& xListener ) throw (RuntimeException) +{ + BrdcstHelper.removeListener( XGridColumnListener::static_type(), xListener ); +} + +//--------------------------------------------------------------------- +// XComponent +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridColumnModel::dispose() throw (RuntimeException) +{ + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + + ::com::sun::star::lang::EventObject aEvent; + aEvent.Source.set( static_cast< ::cppu::OWeakObject* >( this ) ); + BrdcstHelper.aLC.disposeAndClear( aEvent ); + +} + +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridColumnModel::addEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException) +{ + BrdcstHelper.addListener( XEventListener::static_type(), xListener ); +} + +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridColumnModel::removeEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException) +{ + BrdcstHelper.removeListener( XEventListener::static_type(), xListener ); +} + +//--------------------------------------------------------------------- +// XServiceInfo +//--------------------------------------------------------------------- + +::rtl::OUString SAL_CALL DefaultGridColumnModel::getImplementationName( ) throw (RuntimeException) +{ + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + static const OUString aImplName( RTL_CONSTASCII_USTRINGPARAM( "toolkit.DefaultGridColumnModel" ) ); + return aImplName; +} + +//--------------------------------------------------------------------- + +sal_Bool SAL_CALL DefaultGridColumnModel::supportsService( const ::rtl::OUString& ServiceName ) throw (RuntimeException) +{ + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + return ServiceName.equalsAscii( szServiceName_DefaultGridColumnModel ); +} + +//--------------------------------------------------------------------- + +::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL DefaultGridColumnModel::getSupportedServiceNames( ) throw (RuntimeException) +{ + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + static const OUString aServiceName( OUString::createFromAscii( szServiceName_DefaultGridColumnModel ) ); + static const Sequence< OUString > aSeq( &aServiceName, 1 ); + return aSeq; +} + +} + +Reference< XInterface > SAL_CALL DefaultGridColumnModel_CreateInstance( const Reference< XMultiServiceFactory >& ) +{ + return Reference < XInterface >( ( ::cppu::OWeakObject* ) new ::toolkit::DefaultGridColumnModel ); +} + diff --git a/toolkit/source/controls/grid/defaultgridcolumnmodel.hxx b/toolkit/source/controls/grid/defaultgridcolumnmodel.hxx new file mode 100644 index 000000000000..b230188f9107 --- /dev/null +++ b/toolkit/source/controls/grid/defaultgridcolumnmodel.hxx @@ -0,0 +1,96 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: griddatamodel.hxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_toolkit.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using ::rtl::OUString; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::awt::grid; +using namespace ::com::sun::star::lang; + +namespace toolkit +{ + +enum broadcast_type { column_added, column_removed, column_changed}; + +class DefaultGridColumnModel : public ::cppu::WeakImplHelper2< XGridColumnModel, XServiceInfo >, + public MutexAndBroadcastHelper +{ +public: + DefaultGridColumnModel(); + virtual ~DefaultGridColumnModel(); + + // XGridColumnModel + + virtual ::sal_Bool SAL_CALL getColumnSelectionAllowed() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setColumnSelectionAllowed(::sal_Bool the_value) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getColumnCount() throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL addColumn(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > & column) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > > SAL_CALL getColumns() throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > SAL_CALL getColumn(::sal_Int32 index) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL addColumnListener( const Reference< XGridColumnListener >& xListener ) throw (RuntimeException); + virtual void SAL_CALL removeColumnListener( const Reference< XGridColumnListener >& xListener ) throw (RuntimeException); + + // XComponent + virtual void SAL_CALL dispose( ) throw (RuntimeException); + virtual void SAL_CALL addEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException); + virtual void SAL_CALL removeEventListener( const Reference< XEventListener >& aListener ) throw (RuntimeException); + + // XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (RuntimeException); + virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException); + +private: + + void broadcast( broadcast_type eType, const GridColumnEvent& aEvent ); + void broadcast_changed( ::rtl::OUString name, Any oldValue, Any newValue ); + void broadcast_add( sal_Int32 index,const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > & rColumn ); + void broadcast_remove( sal_Int32 index, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > & rColumn ); + + std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumn > > columns; + sal_Bool selectionAllowed; +}; + +} diff --git a/toolkit/source/controls/grid/defaultgriddatamodel.cxx b/toolkit/source/controls/grid/defaultgriddatamodel.cxx new file mode 100644 index 000000000000..865be80f55a7 --- /dev/null +++ b/toolkit/source/controls/grid/defaultgriddatamodel.cxx @@ -0,0 +1,310 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: treedatamodel.cxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_toolkit.hxx" +#include "defaultgriddatamodel.hxx" +#include +#include +#include + +using ::rtl::OUString; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::awt::grid; +using namespace ::com::sun::star::lang; + +#define ROWHEIGHT ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "RowHeight" )) +#define ROWHEADERS ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "RowHeaders" )) + +namespace toolkit +{ + +/////////////////////////////////////////////////////////////////////// +// class DefaultGridDataModel +/////////////////////////////////////////////////////////////////////// + +DefaultGridDataModel::DefaultGridDataModel() +: rowHeight(0), + rowHeaders(std::vector< ::rtl::OUString >()) +{ +} + +//--------------------------------------------------------------------- + +DefaultGridDataModel::~DefaultGridDataModel() +{ +} + +void DefaultGridDataModel::broadcast( broadcast_type eType, const GridDataEvent& aEvent ) +{ + ::cppu::OInterfaceContainerHelper* pIter = BrdcstHelper.getContainer( XGridDataListener::static_type() ); + if( pIter ) + { + ::cppu::OInterfaceIteratorHelper aListIter(*pIter); + while(aListIter.hasMoreElements()) + { + XGridDataListener* pListener = static_cast(aListIter.next()); + switch( eType ) + { + case row_added: pListener->rowAdded(aEvent); break; + case row_removed: pListener->rowRemoved(aEvent); break; + case data_changed: pListener->dataChanged(aEvent); break; + } + } + } +} + +//--------------------------------------------------------------------- + +void DefaultGridDataModel::broadcast_changed( ::rtl::OUString name, Any oldValue, Any newValue ) +{ + Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) ); + GridDataEvent aEvent( xSource, name, oldValue, newValue, 0, ::rtl::OUString(), Sequence< ::rtl::OUString>() ); + broadcast( data_changed, aEvent); +} + +//--------------------------------------------------------------------- + +void DefaultGridDataModel::broadcast_add( sal_Int32 index, const ::rtl::OUString & headerName, const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rowData ) +{ + Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) ); + GridDataEvent aEvent( xSource, ::rtl::OUString(), Any(), Any(), index, headerName, rowData ); + broadcast( row_added, aEvent); +} + +//--------------------------------------------------------------------- + +void DefaultGridDataModel::broadcast_remove( sal_Int32 index, const ::rtl::OUString & headerName, const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rowData ) +{ + Reference< XInterface > xSource( static_cast< ::cppu::OWeakObject* >( this ) ); + GridDataEvent aEvent( xSource, ::rtl::OUString(), Any(), Any(), index, headerName, rowData ); + broadcast( row_removed, aEvent); +} + +//--------------------------------------------------------------------- + +//--------------------------------------------------------------------- +// XDefaultGridDataModel +//--------------------------------------------------------------------- +::sal_Int32 SAL_CALL DefaultGridDataModel::getRowHeight() throw (::com::sun::star::uno::RuntimeException) +{ + return rowHeight; +} + +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridDataModel::setRowHeight(::sal_Int32 value) throw (::com::sun::star::uno::RuntimeException) +{ + sal_Int32 oldValue = rowHeight; + rowHeight = value; + + broadcast_changed( ROWHEIGHT, Any(oldValue), Any(value) ); +} + +//--------------------------------------------------------------------- + +::sal_Int32 SAL_CALL DefaultGridDataModel::getRowCount() throw (::com::sun::star::uno::RuntimeException) +{ + return data.size(); +} + +//--------------------------------------------------------------------- + +::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL DefaultGridDataModel::getRowHeaders() throw (::com::sun::star::uno::RuntimeException) +{ + return comphelper::containerToSequence(rowHeaders); +} + +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridDataModel::setRowHeaders(const ::com::sun::star::uno::Sequence< ::rtl::OUString > & value) throw (::com::sun::star::uno::RuntimeException) +{ + ::com::sun::star::uno::Sequence< ::rtl::OUString > oldValue( comphelper::containerToSequence(rowHeaders) ); + + std::vector< rtl::OUString>::iterator iterator; + int i = 0; + int sequenceSize = value.getLength(); + + for(iterator = rowHeaders.begin(); iterator != rowHeaders.end(); iterator++) + { + if ( sequenceSize > i ) + *iterator = value[i]; + else + *iterator = ::rtl::OUString(); + i++; + } + + broadcast_changed( ROWHEADERS, Any(oldValue), Any(comphelper::containerToSequence(rowHeaders)) ); +} + +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridDataModel::addRow(const ::rtl::OUString & headername, const ::com::sun::star::uno::Sequence< ::rtl::OUString > & rRowdata) throw (::com::sun::star::uno::RuntimeException) +{ + // store header name + rowHeaders.push_back(headername); + + + // store row data + std::vector< rtl::OUString > newRow( + comphelper::sequenceToContainer< std::vector >(rRowdata)); + + data.push_back( newRow ); + + broadcast_add( data.size()-1, headername, rRowdata); + +} + +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridDataModel::removeRow(::sal_Int32 index) throw (::com::sun::star::uno::RuntimeException) +{ + if ( index >= 0 && index <= getRowCount()-1) + { + /* if(Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->isSelectedIndex( index )) + { + ::com::sun::star::uno::Sequence<::sal_Int32> selectedRows = Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->getSelection(); + selectedRow.erase(selectedRows.begin()+index); + }*/ + + ::rtl::OUString headerName( (::rtl::OUString) rowHeaders[index] ); + rowHeaders.erase(rowHeaders.begin() + index); + + Sequence< ::rtl::OUString >& rowData ( (Sequence< ::rtl::OUString >&)data[index] ); + data.erase(data.begin() + index); + broadcast_remove( index, headerName, rowData); + } + else + return; +} +//--------------------------------------------------------------------- +::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > SAL_CALL DefaultGridDataModel::getData() throw (::com::sun::star::uno::RuntimeException) +{ + + std::vector< std::vector< ::rtl::OUString > >::iterator iterator; + std::vector< Sequence< ::rtl::OUString > > dummyContainer(0); + + + for(iterator = data.begin(); iterator != data.end(); iterator++) + { + Sequence< ::rtl::OUString > cols(comphelper::containerToSequence(*iterator)); + dummyContainer.push_back( cols ); + } + Sequence< Sequence< ::rtl::OUString > > dataSequence(comphelper::containerToSequence(dummyContainer)); + + return dataSequence; +} + +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridDataModel::addDataListener( const Reference< XGridDataListener >& xListener ) throw (RuntimeException) +{ + BrdcstHelper.addListener( XGridDataListener::static_type(), xListener ); +} + +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridDataModel::removeDataListener( const Reference< XGridDataListener >& xListener ) throw (RuntimeException) +{ + BrdcstHelper.removeListener( XGridDataListener::static_type(), xListener ); +} + +void SAL_CALL DefaultGridDataModel::removeAll() throw (RuntimeException) +{ + rowHeaders.clear(); + data.clear(); + broadcast_remove( -1, ::rtl::OUString(), 0); +} + +//--------------------------------------------------------------------- +// XComponent +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridDataModel::dispose() throw (RuntimeException) +{ + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + + ::com::sun::star::lang::EventObject aEvent; + aEvent.Source.set( static_cast< ::cppu::OWeakObject* >( this ) ); + BrdcstHelper.aLC.disposeAndClear( aEvent ); + +} + +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridDataModel::addEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException) +{ + BrdcstHelper.addListener( XEventListener::static_type(), xListener ); +} + +//--------------------------------------------------------------------- + +void SAL_CALL DefaultGridDataModel::removeEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException) +{ + BrdcstHelper.removeListener( XEventListener::static_type(), xListener ); +} +//--------------------------------------------------------------------- +// XServiceInfo +//--------------------------------------------------------------------- + +::rtl::OUString SAL_CALL DefaultGridDataModel::getImplementationName( ) throw (RuntimeException) +{ + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + static const OUString aImplName( RTL_CONSTASCII_USTRINGPARAM( "toolkit.DefaultGridDataModel" ) ); + return aImplName; +} + +//--------------------------------------------------------------------- + +sal_Bool SAL_CALL DefaultGridDataModel::supportsService( const ::rtl::OUString& ServiceName ) throw (RuntimeException) +{ + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + return ServiceName.equalsAscii( szServiceName_DefaultGridDataModel ); +} + +//--------------------------------------------------------------------- + +::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL DefaultGridDataModel::getSupportedServiceNames( ) throw (RuntimeException) +{ + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + static const OUString aServiceName( OUString::createFromAscii( szServiceName_DefaultGridDataModel ) ); + static const Sequence< OUString > aSeq( &aServiceName, 1 ); + return aSeq; +} + +} + +Reference< XInterface > SAL_CALL DefaultGridDataModel_CreateInstance( const Reference< XMultiServiceFactory >& ) +{ + return Reference < XInterface >( ( ::cppu::OWeakObject* ) new ::toolkit::DefaultGridDataModel ); +} + diff --git a/toolkit/source/controls/grid/defaultgriddatamodel.hxx b/toolkit/source/controls/grid/defaultgriddatamodel.hxx new file mode 100644 index 000000000000..18000c9f5a71 --- /dev/null +++ b/toolkit/source/controls/grid/defaultgriddatamodel.hxx @@ -0,0 +1,99 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: griddatamodel.hxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_toolkit.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using ::rtl::OUString; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::awt::grid; +using namespace ::com::sun::star::lang; + +namespace toolkit +{ + +enum broadcast_type { row_added, row_removed, data_changed}; + +class DefaultGridDataModel : public ::cppu::WeakImplHelper2< XGridDataModel, XServiceInfo >, + public MutexAndBroadcastHelper +{ +public: + DefaultGridDataModel(); + virtual ~DefaultGridDataModel(); + + // XGridDataModel + virtual ::sal_Int32 SAL_CALL getRowHeight() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setRowHeight(::sal_Int32 the_value) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getRowCount() throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getRowHeaders() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setRowHeaders(const ::com::sun::star::uno::Sequence< ::rtl::OUString > & value) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > SAL_CALL getData() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL addRow(const ::rtl::OUString & headername, const ::com::sun::star::uno::Sequence< ::rtl::OUString > & data) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeRow(::sal_Int32 index) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL addDataListener( const Reference< XGridDataListener >& xListener ) throw (RuntimeException); + virtual void SAL_CALL removeDataListener( const Reference< XGridDataListener >& xListener ) throw (RuntimeException); + virtual void SAL_CALL removeAll() throw (RuntimeException); + + // XComponent + virtual void SAL_CALL dispose( ) throw (RuntimeException); + virtual void SAL_CALL addEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException); + virtual void SAL_CALL removeEventListener( const Reference< XEventListener >& aListener ) throw (RuntimeException); + + // XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (RuntimeException); + virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException); + +private: + + void broadcast( broadcast_type eType, const GridDataEvent& aEvent ); + void broadcast_changed( ::rtl::OUString name, Any oldValue, Any newValue ); + void broadcast_add( sal_Int32 index, const ::rtl::OUString & headerName, const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rowData ); + void broadcast_remove( sal_Int32 index, const ::rtl::OUString & headerName, const ::com::sun::star::uno::Sequence< ::rtl::OUString >& rowData ); + + sal_Int32 rowHeight; + std::vector< std::vector < ::rtl::OUString > > data; + std::vector< ::rtl::OUString > rowHeaders; +}; + +} diff --git a/toolkit/source/controls/grid/gridcolumn.cxx b/toolkit/source/controls/grid/gridcolumn.cxx new file mode 100644 index 000000000000..8b398b4aed58 --- /dev/null +++ b/toolkit/source/controls/grid/gridcolumn.cxx @@ -0,0 +1,166 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: treedatamodel.cxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_toolkit.hxx" +#include "gridcolumn.hxx" +#include +#include +#include + +using ::rtl::OUString; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::awt::grid; +using namespace ::com::sun::star::lang; + +namespace toolkit +{ + +/////////////////////////////////////////////////////////////////////// +// class GridColumn +/////////////////////////////////////////////////////////////////////// + +GridColumn::GridColumn() +: identifier(Any()) +{ +} + +//--------------------------------------------------------------------- + +GridColumn::~GridColumn() +{ +} + +//--------------------------------------------------------------------- + +//--------------------------------------------------------------------- +// XGridColumn +//--------------------------------------------------------------------- + +::com::sun::star::uno::Any SAL_CALL GridColumn::getIdentifier() throw (::com::sun::star::uno::RuntimeException) +{ + return identifier; +} + +//--------------------------------------------------------------------- + +void SAL_CALL GridColumn::setIdentifier(const ::com::sun::star::uno::Any & value) throw (::com::sun::star::uno::RuntimeException) +{ + value >>= identifier; +} + +//-------------------------------------------------------------------- + +::sal_Int32 SAL_CALL GridColumn::getColumnWidth() throw (::com::sun::star::uno::RuntimeException) +{ + return columnWidth; +} + +//-------------------------------------------------------------------- + +void SAL_CALL GridColumn::setColumnWidth(::sal_Int32 value) throw (::com::sun::star::uno::RuntimeException) +{ + columnWidth = value; +} + +//-------------------------------------------------------------------- + +::rtl::OUString SAL_CALL GridColumn::getTitle() throw (::com::sun::star::uno::RuntimeException) +{ + return title; +} + +//-------------------------------------------------------------------- + +void SAL_CALL GridColumn::setTitle(const ::rtl::OUString & value) throw (::com::sun::star::uno::RuntimeException) +{ + title = value; +} + +//--------------------------------------------------------------------- +// XComponent +//--------------------------------------------------------------------- + +void SAL_CALL GridColumn::dispose() throw (RuntimeException) +{ +} + +//--------------------------------------------------------------------- + +void SAL_CALL GridColumn::addEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException) +{ + (void) xListener; +} + +//--------------------------------------------------------------------- + +void SAL_CALL GridColumn::removeEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException) +{ + (void) xListener; +} + +//--------------------------------------------------------------------- +// XServiceInfo +//--------------------------------------------------------------------- + +::rtl::OUString SAL_CALL GridColumn::getImplementationName( ) throw (RuntimeException) +{ + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + static const OUString aImplName( RTL_CONSTASCII_USTRINGPARAM( "toolkit.GridColumn" ) ); + return aImplName; +} + +//--------------------------------------------------------------------- + +sal_Bool SAL_CALL GridColumn::supportsService( const ::rtl::OUString& ServiceName ) throw (RuntimeException) +{ + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + return ServiceName.equalsAscii( szServiceName_GridColumn ); +} + +//--------------------------------------------------------------------- + +::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL GridColumn::getSupportedServiceNames( ) throw (RuntimeException) +{ + ::osl::Guard< ::osl::Mutex > aGuard( GetMutex() ); + static const OUString aServiceName( OUString::createFromAscii( szServiceName_GridColumn ) ); + static const Sequence< OUString > aSeq( &aServiceName, 1 ); + return aSeq; +} + +} + +Reference< XInterface > SAL_CALL GridColumn_CreateInstance( const Reference< XMultiServiceFactory >& ) +{ + return Reference < XInterface >( ( ::cppu::OWeakObject* ) new ::toolkit::GridColumn ); +} + diff --git a/toolkit/source/controls/grid/gridcolumn.hxx b/toolkit/source/controls/grid/gridcolumn.hxx new file mode 100644 index 000000000000..a451054ce93f --- /dev/null +++ b/toolkit/source/controls/grid/gridcolumn.hxx @@ -0,0 +1,85 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: griddatamodel.hxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_toolkit.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using ::rtl::OUString; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::awt::grid; +using namespace ::com::sun::star::lang; + +namespace toolkit +{ + +class GridColumn : public ::cppu::WeakImplHelper2< XGridColumn, XServiceInfo >, + public MutexAndBroadcastHelper +{ +public: + GridColumn(); + virtual ~GridColumn(); + + // XGridColumn + virtual ::com::sun::star::uno::Any SAL_CALL getIdentifier() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setIdentifier(const ::com::sun::star::uno::Any & value) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getColumnWidth() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setColumnWidth(::sal_Int32 the_value) throw (::com::sun::star::uno::RuntimeException); + virtual ::rtl::OUString SAL_CALL getTitle() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setTitle(const ::rtl::OUString & value) throw (::com::sun::star::uno::RuntimeException); + + // XComponent + virtual void SAL_CALL dispose( ) throw (RuntimeException); + virtual void SAL_CALL addEventListener( const Reference< XEventListener >& xListener ) throw (RuntimeException); + virtual void SAL_CALL removeEventListener( const Reference< XEventListener >& aListener ) throw (RuntimeException); + + // XServiceInfo + virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (RuntimeException); + virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException); + + +private: + Any identifier; + sal_Int32 columnWidth; + ::rtl::OUString title; +}; + +} diff --git a/toolkit/source/controls/grid/gridcontrol.cxx b/toolkit/source/controls/grid/gridcontrol.cxx new file mode 100644 index 000000000000..c642d8a0dcce --- /dev/null +++ b/toolkit/source/controls/grid/gridcontrol.cxx @@ -0,0 +1,273 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: gridcontrol.cxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_toolkit.hxx" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using ::rtl::OUString; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::awt::grid; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::view; + +namespace toolkit +{ +// ---------------------------------------------------- +// class UnoGridModel +// ---------------------------------------------------- +UnoGridModel::UnoGridModel() +{ + ImplRegisterProperty( BASEPROPERTY_BACKGROUNDCOLOR ); + ImplRegisterProperty( BASEPROPERTY_BORDER ); + ImplRegisterProperty( BASEPROPERTY_BORDERCOLOR ); + ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL ); + ImplRegisterProperty( BASEPROPERTY_ENABLED ); + ImplRegisterProperty( BASEPROPERTY_FILLCOLOR ); + ImplRegisterProperty( BASEPROPERTY_HELPTEXT ); + ImplRegisterProperty( BASEPROPERTY_HELPURL ); + ImplRegisterProperty( BASEPROPERTY_PRINTABLE ); + ImplRegisterProperty( BASEPROPERTY_SIZEABLE ); // resizeable + ImplRegisterProperty( BASEPROPERTY_HSCROLL ); + ImplRegisterProperty( BASEPROPERTY_VSCROLL ); + ImplRegisterProperty( BASEPROPERTY_GRID_SHOWROWHEADER ); + ImplRegisterProperty( BASEPROPERTY_GRID_SHOWCOLUMNHEADER ); + ImplRegisterProperty( BASEPROPERTY_GRID_DATAMODEL ); + ImplRegisterProperty( BASEPROPERTY_GRID_COLUMNMODEL ); + ImplRegisterProperty( BASEPROPERTY_GRID_SELECTIONMODE ); + +} + +UnoGridModel::UnoGridModel( const UnoGridModel& rModel ) +: UnoControlModel( rModel ) +{ +} + +UnoControlModel* UnoGridModel::Clone() const +{ + return new UnoGridModel( *this ); +} + +OUString UnoGridModel::getServiceName() throw(RuntimeException) +{ + return OUString::createFromAscii( szServiceName_GridControlModel ); +} + +Any UnoGridModel::ImplGetDefaultValue( sal_uInt16 nPropId ) const +{ + switch( nPropId ) + { + case BASEPROPERTY_DEFAULTCONTROL: + return uno::makeAny( ::rtl::OUString::createFromAscii( szServiceName_GridControl ) ); + case BASEPROPERTY_GRID_SELECTIONMODE: + return uno::makeAny( SelectionType(1) ); + default: + return UnoControlModel::ImplGetDefaultValue( nPropId ); + } + +} + +::cppu::IPropertyArrayHelper& UnoGridModel::getInfoHelper() +{ + static UnoPropertyArrayHelper* pHelper = NULL; + if ( !pHelper ) + { + Sequence aIDs = ImplGetPropertyIds(); + pHelper = new UnoPropertyArrayHelper( aIDs ); + } + return *pHelper; +} + +// XMultiPropertySet +Reference< XPropertySetInfo > UnoGridModel::getPropertySetInfo( ) throw(RuntimeException) +{ + static Reference< XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) ); + return xInfo; +} + + +// ---------------------------------------------------- +// class UnoGridControl +// ---------------------------------------------------- +UnoGridControl::UnoGridControl() +: mSelectionMode(SelectionType(1)) +{ +} + +OUString UnoGridControl::GetComponentServiceName() +{ + return OUString::createFromAscii( "Grid" ); +} + +void SAL_CALL UnoGridControl::dispose( ) throw(RuntimeException) +{ + UnoControl::dispose(); +} + +void UnoGridControl::createPeer( const uno::Reference< awt::XToolkit > & rxToolkit, const uno::Reference< awt::XWindowPeer > & rParentPeer ) throw(uno::RuntimeException) +{ + UnoControlBase::createPeer( rxToolkit, rParentPeer ); + + Reference< XGridControl > xGrid( getPeer(), UNO_QUERY_THROW ); + + Reference xListener ( getPeer(), UNO_QUERY_THROW ); + Reference xPropSet ( getModel(), UNO_QUERY_THROW ); + + Reference xGridDataModel ( xPropSet->getPropertyValue(OUString::createFromAscii( "GridDataModel" )), UNO_QUERY_THROW ); + xGridDataModel->addDataListener(xListener); +} + + +// ------------------------------------------------------------------- +// XGridControl +// ------------------------------------------------------------------- + +::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumnModel > SAL_CALL UnoGridControl::getColumnModel() throw (::com::sun::star::uno::RuntimeException) +{ + Reference xPropSet ( getModel(), UNO_QUERY_THROW ); + Reference xGridColumnModel ( xPropSet->getPropertyValue(OUString::createFromAscii( "ColumnModel" )), UNO_QUERY_THROW ); + + return xGridColumnModel; +} + +void SAL_CALL UnoGridControl::setColumnModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumnModel > & model) throw (::com::sun::star::uno::RuntimeException) +{ + Reference xPropSet ( getModel(), UNO_QUERY_THROW ); + xPropSet->setPropertyValue(OUString::createFromAscii( "ColumnModel" ), Any (model)); +} + +::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel > SAL_CALL UnoGridControl::getDataModel() throw (::com::sun::star::uno::RuntimeException) +{ + Reference xPropSet ( getModel(), UNO_QUERY_THROW ); + Reference xGridDataModel ( xPropSet->getPropertyValue(OUString::createFromAscii( "GridDataModel" )), UNO_QUERY_THROW ); + + return xGridDataModel; +} + +void SAL_CALL UnoGridControl::setDataModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel > & model) throw (::com::sun::star::uno::RuntimeException) +{ + Reference xPropSet ( getModel(), UNO_QUERY_THROW ); + xPropSet->setPropertyValue(OUString::createFromAscii( "GridDataModel" ), Any(model)); +} + +::sal_Int32 UnoGridControl::getItemIndexAtPoint(::sal_Int32 x, ::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException) +{ + return Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->getItemIndexAtPoint( x, y ); +} + +/* +void SAL_CALL UnoGridControl::addMouseListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener > & listener) throw (::com::sun::star::uno::RuntimeException) +{ + Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->addMouseListener( listener ); +} + +void SAL_CALL UnoGridControl::removeMouseListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener > & listener) throw (::com::sun::star::uno::RuntimeException) +{ + Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->removeMouseListener( listener ); +} +*/ +// ------------------------------------------------------------------- +// XGridSelection +// ------------------------------------------------------------------- + +::sal_Int32 SAL_CALL UnoGridControl::getMinSelectionIndex() throw (::com::sun::star::uno::RuntimeException) +{ + return Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->getMinSelectionIndex(); +} + +::sal_Int32 SAL_CALL UnoGridControl::getMaxSelectionIndex() throw (::com::sun::star::uno::RuntimeException) +{ + return Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->getMaxSelectionIndex(); +} + +void SAL_CALL UnoGridControl::insertIndexIntervall(::sal_Int32 start, ::sal_Int32 length) throw (::com::sun::star::uno::RuntimeException) +{ + Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->insertIndexIntervall( start, length); +} + +void SAL_CALL UnoGridControl::removeIndexIntervall(::sal_Int32 start, ::sal_Int32 length) throw (::com::sun::star::uno::RuntimeException) +{ + Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->removeIndexIntervall( start, length ); +} + +::com::sun::star::uno::Sequence< ::sal_Int32 > SAL_CALL UnoGridControl::getSelection() throw (::com::sun::star::uno::RuntimeException) +{ + return Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->getSelection(); +} + +::sal_Bool SAL_CALL UnoGridControl::isSelectionEmpty() throw (::com::sun::star::uno::RuntimeException) +{ + return Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->isSelectionEmpty(); +} + +::sal_Bool SAL_CALL UnoGridControl::isSelectedIndex(::sal_Int32 index) throw (::com::sun::star::uno::RuntimeException) +{ + return Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->isSelectedIndex( index ); +} + +void SAL_CALL UnoGridControl::selectRow(::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException) +{ + Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->selectRow( y ); +} + +void SAL_CALL UnoGridControl::addSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException) +{ + Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->addSelectionListener( listener ); +} + +void SAL_CALL UnoGridControl::removeSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException) +{ + Reference< XGridControl >( getPeer(), UNO_QUERY_THROW )->removeSelectionListener( listener ); +} +} + +Reference< XInterface > SAL_CALL GridControl_CreateInstance( const Reference< XMultiServiceFactory >& ) +{ + return Reference < XInterface >( ( ::cppu::OWeakObject* ) new ::toolkit::UnoGridControl ); +} + +Reference< XInterface > SAL_CALL GridControlModel_CreateInstance( const Reference< XMultiServiceFactory >& ) +{ + return Reference < XInterface >( ( ::cppu::OWeakObject* ) new ::toolkit::UnoGridModel ); +} diff --git a/toolkit/source/controls/grid/gridcontrol.hxx b/toolkit/source/controls/grid/gridcontrol.hxx new file mode 100644 index 000000000000..5648c812fbff --- /dev/null +++ b/toolkit/source/controls/grid/gridcontrol.hxx @@ -0,0 +1,124 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: gridcontrol.hxx,v $ + * $Revision: 1.3 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef TOOLKIT_GRID_CONTROL_HXX +#define TOOLKIT_GRID_CONTROL_HXX + +#include +#include +#include +#include +#include +#include + +#include + +namespace toolkit { + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::awt; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; + +// =================================================================== +// = UnoGridModel +// =================================================================== +class UnoGridModel : public UnoControlModel +{ +protected: + Any ImplGetDefaultValue( sal_uInt16 nPropId ) const; + ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); + +public: + UnoGridModel(); + UnoGridModel( const UnoGridModel& rModel ); + + UnoControlModel* Clone() const; + + // ::com::sun::star::beans::XMultiPropertySet + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::io::XPersistObject + ::rtl::OUString SAL_CALL getServiceName() throw(::com::sun::star::uno::RuntimeException); + + // XServiceInfo + DECLIMPL_SERVICEINFO_DERIVED( UnoGridModel, UnoControlModel, szServiceName_GridControlModel ) +}; + + +// =================================================================== +// = UnoGridControl +// =================================================================== +class UnoGridControl : public ::cppu::ImplInheritanceHelper1< UnoControlBase, ::com::sun::star::awt::grid::XGridControl > +{ +public: + UnoGridControl(); + ::rtl::OUString GetComponentServiceName(); + + // ::com::sun::star::lang::XComponent + void SAL_CALL dispose( ) throw(::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::awt::XControl + void SAL_CALL createPeer( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit >& Toolkit, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >& Parent ) throw(::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::awt::grid::XGridControl + virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumnModel > SAL_CALL getColumnModel() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setColumnModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridColumnModel > & model) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel > SAL_CALL getDataModel() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL setDataModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridDataModel > & model) throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getItemIndexAtPoint(::sal_Int32 x, ::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException); + //virtual void SAL_CALL addMouseListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener > & listener) throw (::com::sun::star::uno::RuntimeException); + //virtual void SAL_CALL removeMouseListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener > & listener) throw (::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::awt::grid::XGridSelection + + virtual ::sal_Int32 SAL_CALL getMinSelectionIndex() throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Int32 SAL_CALL getMaxSelectionIndex() throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL insertIndexIntervall(::sal_Int32 start, ::sal_Int32 length) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeIndexIntervall(::sal_Int32 start, ::sal_Int32 length) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::sal_Int32 > SAL_CALL getSelection() throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL isSelectionEmpty() throw (::com::sun::star::uno::RuntimeException); + virtual ::sal_Bool SAL_CALL isSelectedIndex(::sal_Int32 index) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL selectRow(::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL addSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL removeSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException); + + // ::com::sun::star::lang::XServiceInfo + DECLIMPL_SERVICEINFO_DERIVED( UnoGridControl, UnoControlBase, szServiceName_GridControl ) + + using UnoControl::getPeer; +private: + ::com::sun::star::view::SelectionType mSelectionMode; +}; + +} // toolkit + +#endif // _TOOLKIT_TREE_CONTROL_HXX diff --git a/toolkit/source/controls/grid/makefile.mk b/toolkit/source/controls/grid/makefile.mk new file mode 100644 index 000000000000..7c904b3ef02e --- /dev/null +++ b/toolkit/source/controls/grid/makefile.mk @@ -0,0 +1,54 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.3 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/..$/.. + +PRJNAME=toolkit +TARGET=grid + +ENABLE_EXCEPTIONS=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/util$/makefile.pmk + +# --- Files -------------------------------------------------------- + +SLOFILES= \ + $(SLO)$/gridcontrol.obj\ + $(SLO)$/defaultgriddatamodel.obj\ + $(SLO)$/defaultgridcolumnmodel.obj\ + $(SLO)$/gridcolumn.obj + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/toolkit/source/controls/roadmapcontrol.cxx b/toolkit/source/controls/roadmapcontrol.cxx index 724421da5f3c..da3a265130b8 100644 --- a/toolkit/source/controls/roadmapcontrol.cxx +++ b/toolkit/source/controls/roadmapcontrol.cxx @@ -104,6 +104,7 @@ static void lcl_throwIndexOutOfBoundsException( ) ImplRegisterProperty( BASEPROPERTY_COMPLETE ); ImplRegisterProperty( BASEPROPERTY_ACTIVATED ); ImplRegisterProperty( BASEPROPERTY_CURRENTITEMID ); + ImplRegisterProperty( BASEPROPERTY_TABSTOP ); ImplRegisterProperty( BASEPROPERTY_TEXT ); } diff --git a/toolkit/source/controls/tkspinbutton.cxx b/toolkit/source/controls/tkspinbutton.cxx index 5c4e47e240dc..138b849a190c 100644 --- a/toolkit/source/controls/tkspinbutton.cxx +++ b/toolkit/source/controls/tkspinbutton.cxx @@ -60,6 +60,7 @@ namespace toolkit ImplRegisterProperty( BASEPROPERTY_BORDERCOLOR ); ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL ); ImplRegisterProperty( BASEPROPERTY_ENABLED ); + ImplRegisterProperty( BASEPROPERTY_ENABLEVISIBLE ); ImplRegisterProperty( BASEPROPERTY_HELPTEXT ); ImplRegisterProperty( BASEPROPERTY_HELPURL ); ImplRegisterProperty( BASEPROPERTY_ORIENTATION ); diff --git a/toolkit/source/controls/tree/treecontrol.cxx b/toolkit/source/controls/tree/treecontrol.cxx index 68c3212f5692..2949954bb13c 100644 --- a/toolkit/source/controls/tree/treecontrol.cxx +++ b/toolkit/source/controls/tree/treecontrol.cxx @@ -65,6 +65,7 @@ UnoTreeModel::UnoTreeModel() ImplRegisterProperty( BASEPROPERTY_BORDERCOLOR ); ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL ); ImplRegisterProperty( BASEPROPERTY_ENABLED ); + ImplRegisterProperty( BASEPROPERTY_ENABLEVISIBLE ); ImplRegisterProperty( BASEPROPERTY_FILLCOLOR ); ImplRegisterProperty( BASEPROPERTY_HELPTEXT ); ImplRegisterProperty( BASEPROPERTY_HELPURL ); diff --git a/toolkit/source/controls/unocontrol.cxx b/toolkit/source/controls/unocontrol.cxx index 92c27e33ead0..21876feb072b 100644 --- a/toolkit/source/controls/unocontrol.cxx +++ b/toolkit/source/controls/unocontrol.cxx @@ -1049,7 +1049,13 @@ void UnoControl::draw( sal_Int32 x, sal_Int32 y ) throw(RuntimeException) } if ( xDrawPeerView.is() ) + { + Reference< XVclWindowPeer > xWindowPeer; + xWindowPeer.set( xDrawPeer, UNO_QUERY ); + if ( xWindowPeer.is() ) + xWindowPeer->setDesignMode( mbDesignMode ); xDrawPeerView->draw( x, y ); + } if ( bDisposeDrawPeer ) xDrawPeer->dispose(); @@ -1420,7 +1426,6 @@ void UnoControl::setDesignMode( sal_Bool bOn ) throw(RuntimeException) // remember this mbDesignMode = bOn; xWindow = xWindow.query( getPeer() ); - // dispose our current AccessibleContext, if we have one // (changing the design mode implies having a new implementation for this context, // so the old one must be declared DEFUNC) diff --git a/toolkit/source/controls/unocontrolmodel.cxx b/toolkit/source/controls/unocontrolmodel.cxx index 0f54a204a010..a4febcd33b33 100644 --- a/toolkit/source/controls/unocontrolmodel.cxx +++ b/toolkit/source/controls/unocontrolmodel.cxx @@ -36,7 +36,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -261,7 +263,11 @@ void UnoControlModel::ImplPropertyChanged( sal_uInt16 ) switch ( nPropId ) { case BASEPROPERTY_GRAPHIC: - aDefault <<= makeAny( Reference< graphic::XGraphic >() ); + aDefault <<= Reference< graphic::XGraphic >(); + break; + + case BASEPROPERTY_REFERENCE_DEVICE: + aDefault <<= Reference< awt::XDevice >(); break; case BASEPROPERTY_VERTICALALIGN: @@ -294,6 +300,7 @@ void UnoControlModel::ImplPropertyChanged( sal_uInt16 ) case BASEPROPERTY_IMAGEALIGN: aDefault <<= (sal_Int16) 1 /*ImageAlign::TOP*/; break; case BASEPROPERTY_IMAGEPOSITION: aDefault <<= (sal_Int16) 12 /*ImagePosition::Centered*/; break; case BASEPROPERTY_PUSHBUTTONTYPE: aDefault <<= (sal_Int16) 0 /*PushButtonType::STANDARD*/; break; + case BASEPROPERTY_MOUSE_WHEEL_BEHAVIOUR:aDefault <<= (sal_Int16) awt::MouseWheelBehavior::SCROLL_FOCUS_ONLY; break; case BASEPROPERTY_DATEMAX: aDefault <<= (sal_Int32) Date( 31, 12, 2200 ).GetDate(); break; case BASEPROPERTY_DATEMIN: aDefault <<= (sal_Int32) Date( 1, 1, 1900 ).GetDate(); break; @@ -338,13 +345,13 @@ void UnoControlModel::ImplPropertyChanged( sal_uInt16 ) case BASEPROPERTY_HARDLINEBREAKS: case BASEPROPERTY_NOLABEL: aDefault <<= (sal_Bool) sal_False; break; - case BASEPROPERTY_WHEELWITHOUTFOCUS: case BASEPROPERTY_HIDEINACTIVESELECTION: case BASEPROPERTY_ENFORCE_FORMAT: case BASEPROPERTY_AUTOCOMPLETE: case BASEPROPERTY_SCALEIMAGE: case BASEPROPERTY_ENABLED: case BASEPROPERTY_PRINTABLE: + case BASEPROPERTY_ENABLEVISIBLE: case BASEPROPERTY_DECORATION: aDefault <<= (sal_Bool) sal_True; break; case BASEPROPERTY_HELPTEXT: diff --git a/toolkit/source/controls/unocontrols.cxx b/toolkit/source/controls/unocontrols.cxx index 771a69c532b9..3abacef7b67f 100644 --- a/toolkit/source/controls/unocontrols.cxx +++ b/toolkit/source/controls/unocontrols.cxx @@ -481,6 +481,7 @@ UnoControlFileControlModel::UnoControlFileControlModel() ImplRegisterProperty( BASEPROPERTY_BORDERCOLOR ); ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL ); ImplRegisterProperty( BASEPROPERTY_ENABLED ); + ImplRegisterProperty( BASEPROPERTY_ENABLEVISIBLE ); ImplRegisterProperty( BASEPROPERTY_FONTDESCRIPTOR ); ImplRegisterProperty( BASEPROPERTY_HELPTEXT ); ImplRegisterProperty( BASEPROPERTY_HELPURL ); @@ -1778,6 +1779,7 @@ UnoControlGroupBoxModel::UnoControlGroupBoxModel() { ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL ); ImplRegisterProperty( BASEPROPERTY_ENABLED ); + ImplRegisterProperty( BASEPROPERTY_ENABLEVISIBLE ); ImplRegisterProperty( BASEPROPERTY_FONTDESCRIPTOR ); ImplRegisterProperty( BASEPROPERTY_HELPTEXT ); ImplRegisterProperty( BASEPROPERTY_HELPURL ); @@ -3594,6 +3596,7 @@ UnoControlProgressBarModel::UnoControlProgressBarModel() ImplRegisterProperty( BASEPROPERTY_BORDERCOLOR ); ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL ); ImplRegisterProperty( BASEPROPERTY_ENABLED ); + ImplRegisterProperty( BASEPROPERTY_ENABLEVISIBLE ); ImplRegisterProperty( BASEPROPERTY_FILLCOLOR ); ImplRegisterProperty( BASEPROPERTY_HELPTEXT ); ImplRegisterProperty( BASEPROPERTY_HELPURL ); @@ -3723,6 +3726,7 @@ UnoControlFixedLineModel::UnoControlFixedLineModel() ImplRegisterProperty( BASEPROPERTY_BACKGROUNDCOLOR ); ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL ); ImplRegisterProperty( BASEPROPERTY_ENABLED ); + ImplRegisterProperty( BASEPROPERTY_ENABLEVISIBLE ); ImplRegisterProperty( BASEPROPERTY_FONTDESCRIPTOR ); ImplRegisterProperty( BASEPROPERTY_HELPTEXT ); ImplRegisterProperty( BASEPROPERTY_HELPURL ); diff --git a/toolkit/source/helper/property.cxx b/toolkit/source/helper/property.cxx index bace3ff94771..a59af95a2e1f 100644 --- a/toolkit/source/helper/property.cxx +++ b/toolkit/source/helper/property.cxx @@ -47,7 +47,11 @@ #include #include #include +#include #include +#include +#include +#include #include #include #include @@ -62,6 +66,7 @@ using ::com::sun::star::uno::Any; using ::com::sun::star::uno::Sequence; using ::com::sun::star::uno::Reference; +using ::com::sun::star::awt::XDevice; using ::com::sun::star::awt::FontDescriptor; using ::com::sun::star::style::VerticalAlignment; @@ -252,12 +257,11 @@ ImplPropertyInfo* ImplGetPropertyInfos( sal_uInt16& rElementCount ) DECL_PROP_2 ( "ValueStep", VALUESTEP_DOUBLE, double, BOUND, MAYBEDEFAULT ), DECL_PROP_3 ( "VerticalAlign", VERTICALALIGN, VerticalAlignment, BOUND, MAYBEDEFAULT, MAYBEVOID ), DECL_DEP_PROP_3 ( "VisibleSize", VISIBLESIZE, sal_Int32, BOUND, MAYBEDEFAULT, MAYBEVOID ), - DECL_PROP_2 ( "Activated", ACTIVATED, sal_Bool, BOUND, MAYBEDEFAULT ), DECL_PROP_2 ( "Complete", COMPLETE, sal_Bool, BOUND, MAYBEDEFAULT ), DECL_PROP_2 ( "CurrentItemID", CURRENTITEMID, sal_Int16, BOUND, MAYBEDEFAULT ), - DECL_PROP_2 ( "WheelWithoutFocus", WHEELWITHOUTFOCUS, sal_Bool, BOUND, MAYBEDEFAULT ), + DECL_PROP_2 ( "MouseWheelBehavior", MOUSE_WHEEL_BEHAVIOUR, sal_Int16, BOUND, MAYBEDEFAULT ), DECL_PROP_2 ( "StepTime", STEP_TIME, sal_Int32, BOUND, MAYBEDEFAULT ), DECL_PROP_2 ( "Decoration", DECORATION, sal_Bool, BOUND, MAYBEDEFAULT ), @@ -272,7 +276,14 @@ ImplPropertyInfo* ImplGetPropertyInfos( sal_uInt16& rElementCount ) DECL_PROP_2 ( "DialogSourceURL", DIALOGSOURCEURL, ::rtl::OUString, BOUND, MAYBEDEFAULT ), DECL_PROP_2 ( "URL", URL, ::rtl::OUString, BOUND, MAYBEDEFAULT ), DECL_PROP_2 ( "WritingMode", WRITING_MODE, sal_Int16, BOUND, MAYBEDEFAULT ), - DECL_PROP_3 ( "ContextWritingMode", CONTEXT_WRITING_MODE, sal_Int16, BOUND, MAYBEDEFAULT, TRANSIENT ) + DECL_PROP_3 ( "ContextWritingMode", CONTEXT_WRITING_MODE, sal_Int16, BOUND, MAYBEDEFAULT, TRANSIENT ), + DECL_PROP_2 ( "ShowRowHeader", GRID_SHOWROWHEADER, sal_Bool, BOUND, MAYBEDEFAULT ), + DECL_PROP_2 ( "ShowColumnHeader", GRID_SHOWCOLUMNHEADER, sal_Bool, BOUND, MAYBEDEFAULT ), + DECL_PROP_3 ( "GridDataModel", GRID_DATAMODEL, Reference< ::com::sun::star::awt::grid::XGridDataModel >, BOUND, MAYBEDEFAULT, MAYBEVOID ), + DECL_PROP_3 ( "ColumnModel", GRID_COLUMNMODEL, Reference< ::com::sun::star::awt::grid::XGridColumnModel >, BOUND, MAYBEDEFAULT, MAYBEVOID ), + DECL_PROP_3 ( "SelectionModel", GRID_SELECTIONMODE, ::com::sun::star::view::SelectionType, BOUND, MAYBEDEFAULT, MAYBEVOID ), + DECL_PROP_2 ( "EnableVisible", ENABLEVISIBLE, sal_Bool, BOUND, MAYBEDEFAULT ), + DECL_PROP_3 ( "ReferenceDevice", REFERENCE_DEVICE, Reference< XDevice >,BOUND, MAYBEDEFAULT, TRANSIENT ) }; pPropertyInfos = aImplPropertyInfos; nElements = sizeof( aImplPropertyInfos ) / sizeof( ImplPropertyInfo ); diff --git a/toolkit/source/helper/registerservices.cxx b/toolkit/source/helper/registerservices.cxx index d9264f22cb51..ea29c9810beb 100644 --- a/toolkit/source/helper/registerservices.cxx +++ b/toolkit/source/helper/registerservices.cxx @@ -202,6 +202,12 @@ IMPL_CREATEINSTANCE( UnoThrobberControlModel ) extern ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL TreeControl_CreateInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ); extern ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL TreeControlModel_CreateInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ); extern ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL MutableTreeDataModel_CreateInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ); +extern ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL GridControl_CreateInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ); +extern ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL GridControlModel_CreateInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ); +extern ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL DefaultGridDataModel_CreateInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ); +extern ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL DefaultGridColumnModel_CreateInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ); +extern ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL GridColumn_CreateInstance( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& ); + extern sal_Bool SAL_CALL comp_AsyncCallback_component_writeInfo( void * serviceManager, void * registryKey ); extern void * SAL_CALL comp_AsyncCallback_component_getFactory( const char * implName, void * serviceManager, void * registryKey ); @@ -287,6 +293,11 @@ TOOLKIT_DLLPUBLIC sal_Bool SAL_CALL component_writeInfo( void* _pServiceManager, registerServices( xRegistryKey, "UnoThrobberControl", szServiceName_UnoThrobberControl ); registerServices( xRegistryKey, "UnoFixedHyperlinkControl", szServiceName_UnoControlFixedHyperlink ); registerServices( xRegistryKey, "UnoControlFixedHyperlinkModel", szServiceName_UnoControlFixedHyperlinkModel ); + registerServices( xRegistryKey, "GridControl", szServiceName_GridControl ); + registerServices( xRegistryKey, "GridControlModel", szServiceName_GridControlModel ); + registerServices( xRegistryKey, "DefaultGridDataModel", szServiceName_DefaultGridDataModel ); + registerServices( xRegistryKey, "DefaultGridColumnModel", szServiceName_DefaultGridColumnModel ); + registerServices( xRegistryKey, "GridColumn", szServiceName_GridColumn ); comp_AsyncCallback_component_writeInfo( _pServiceManager, _pRegistryKey ); comp_Layout_component_writeInfo( _pServiceManager, _pRegistryKey ); @@ -369,6 +380,12 @@ TOOLKIT_DLLPUBLIC void* SAL_CALL component_getFactory( const sal_Char* sImplemen CHECKANDCREATEFACTORY( UnoThrobberControl, szServiceName_UnoThrobberControl, NULL ) CHECKANDCREATEFACTORY( UnoFixedHyperlinkControl, szServiceName_UnoControlFixedHyperlink, NULL ) CHECKANDCREATEFACTORY( UnoControlFixedHyperlinkModel, szServiceName_UnoControlFixedHyperlinkModel, NULL ) + CHECKANDCREATEFACTORY( GridControl, szServiceName_GridControl, NULL ); + CHECKANDCREATEFACTORY( GridControlModel, szServiceName_GridControlModel, NULL ); + CHECKANDCREATEFACTORY( DefaultGridDataModel, szServiceName_DefaultGridDataModel, NULL ); + CHECKANDCREATEFACTORY( DefaultGridColumnModel, szServiceName_DefaultGridColumnModel, NULL ); + CHECKANDCREATEFACTORY( GridColumn, szServiceName_GridColumn, NULL ); + if ( rtl_str_compare( sImplementationName, "com.sun.star.awt.comp.AsyncCallback" ) == 0 ) return comp_AsyncCallback_component_getFactory( sImplementationName, _pServiceManager, _pRegistryKey ); diff --git a/toolkit/source/helper/servicenames.cxx b/toolkit/source/helper/servicenames.cxx index 903f18f95eae..f00e7a2b09fa 100644 --- a/toolkit/source/helper/servicenames.cxx +++ b/toolkit/source/helper/servicenames.cxx @@ -101,4 +101,8 @@ const sal_Char __FAR_DATA szServiceName_UnoThrobberControlModel[] = "com.sun.sta const sal_Char __FAR_DATA szServiceName_UnoThrobberControl[] = "com.sun.star.awt.UnoThrobberControl"; const sal_Char __FAR_DATA szServiceName_UnoControlFixedHyperlink[] = "com.sun.star.awt.UnoControlFixedHyperlink"; const sal_Char __FAR_DATA szServiceName_UnoControlFixedHyperlinkModel[] = "com.sun.star.awt.UnoControlFixedHyperlinkModel"; - +const sal_Char __FAR_DATA szServiceName_GridControl[] = "com.sun.star.awt.grid.UnoControlGrid"; +const sal_Char __FAR_DATA szServiceName_GridControlModel[] = "com.sun.star.awt.grid.UnoControlGridModel"; +const sal_Char __FAR_DATA szServiceName_DefaultGridDataModel[] = "com.sun.star.awt.grid.DefaultGridDataModel"; +const sal_Char __FAR_DATA szServiceName_DefaultGridColumnModel[] = "com.sun.star.awt.grid.DefaultGridColumnModel"; +const sal_Char __FAR_DATA szServiceName_GridColumn[] = "com.sun.star.awt.grid.GridColumn"; diff --git a/toolkit/source/helper/throbberimpl.cxx b/toolkit/source/helper/throbberimpl.cxx index 902792918de0..423e40c4f305 100644 --- a/toolkit/source/helper/throbberimpl.cxx +++ b/toolkit/source/helper/throbberimpl.cxx @@ -110,9 +110,9 @@ namespace toolkit { FixedImage* pImage = static_cast< FixedImage* >( mxParent->GetWindow() ); if ( pImage ) - return pImage->GetSettings().GetStyleSettings().GetFaceColor().IsDark(); + return pImage->GetSettings().GetStyleSettings().GetHighContrastMode(); else - return Application::GetSettings().GetStyleSettings().GetFaceColor().IsDark(); + return Application::GetSettings().GetStyleSettings().GetHighContrastMode(); } // ----------------------------------------------------------------------- diff --git a/toolkit/source/helper/unowrapper.cxx b/toolkit/source/helper/unowrapper.cxx index a652d493e653..96b8908558a7 100644 --- a/toolkit/source/helper/unowrapper.cxx +++ b/toolkit/source/helper/unowrapper.cxx @@ -65,6 +65,13 @@ using namespace ::com::sun::star; case WINDOW_OKBUTTON: case WINDOW_CANCELBUTTON: return new VCLXButton; case WINDOW_CHECKBOX: return new VCLXCheckBox; + // --> OD 2009-06-29 #i95042# + // A Window of type is inherited from type . + // Thus, it does make more sense to return a instance + // instead of only a instance, especially regarding its + // corresponding accessibility API. + case WINDOW_METRICBOX: + // <-- case WINDOW_COMBOBOX: return new VCLXComboBox; case WINDOW_SPINFIELD: case WINDOW_NUMERICFIELD: @@ -109,7 +116,6 @@ using namespace ::com::sun::star; // case WINDOW_DATEBOX: // case WINDOW_GROUPBOX: // case WINDOW_LONGCURRENCYBOX: - // case WINDOW_METRICBOX: // case WINDOW_SPLITTER: // case WINDOW_STATUSBAR: // case WINDOW_TABCONTROL: diff --git a/toolkit/source/helper/vclunohelper.cxx b/toolkit/source/helper/vclunohelper.cxx index d76b56a6a37d..89bde88d018e 100644 --- a/toolkit/source/helper/vclunohelper.cxx +++ b/toolkit/source/helper/vclunohelper.cxx @@ -45,6 +45,8 @@ #include #include #include +#include +#include #include #include @@ -67,6 +69,8 @@ #include #include +using namespace ::com::sun::star; + // ---------------------------------------------------- // class VCLUnoHelper // ---------------------------------------------------- @@ -736,4 +740,63 @@ com::sun::star::awt::Point VCLUnoHelper::ConvertToAWTPoint(::Point /* VCLPoint * return aAWTPoint; } +::Rectangle VCLUnoHelper::ConvertToVCLRect( ::com::sun::star::awt::Rectangle const & _rRect ) +{ + return ::Rectangle( _rRect.X, _rRect.Y, _rRect.X + _rRect.Width - 1, _rRect.Y + _rRect.Height - 1 ); +} +::com::sun::star::awt::Rectangle VCLUnoHelper::ConvertToAWTRect( ::Rectangle const & _rRect ) +{ + return ::com::sun::star::awt::Rectangle( _rRect.Left(), _rRect.Top(), _rRect.GetWidth(), _rRect.GetHeight() ); +} + +awt::MouseEvent VCLUnoHelper::createMouseEvent( const ::MouseEvent& _rVclEvent, const uno::Reference< uno::XInterface >& _rxContext ) +{ + awt::MouseEvent aMouseEvent; + aMouseEvent.Source = _rxContext; + + aMouseEvent.Modifiers = 0; + if ( _rVclEvent.IsShift() ) + aMouseEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::SHIFT; + if ( _rVclEvent.IsMod1() ) + aMouseEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::MOD1; + if ( _rVclEvent.IsMod2() ) + aMouseEvent.Modifiers |= ::com::sun::star::awt::KeyModifier::MOD2; + + aMouseEvent.Buttons = 0; + if ( _rVclEvent.IsLeft() ) + aMouseEvent.Buttons |= ::com::sun::star::awt::MouseButton::LEFT; + if ( _rVclEvent.IsRight() ) + aMouseEvent.Buttons |= ::com::sun::star::awt::MouseButton::RIGHT; + if ( _rVclEvent.IsMiddle() ) + aMouseEvent.Buttons |= ::com::sun::star::awt::MouseButton::MIDDLE; + + aMouseEvent.X = _rVclEvent.GetPosPixel().X(); + aMouseEvent.Y = _rVclEvent.GetPosPixel().Y(); + aMouseEvent.ClickCount = _rVclEvent.GetClicks(); + aMouseEvent.PopupTrigger = sal_False; + + return aMouseEvent; +} + +awt::KeyEvent VCLUnoHelper::createKeyEvent( const ::KeyEvent& _rVclEvent, const uno::Reference< uno::XInterface >& _rxContext ) +{ + awt::KeyEvent aKeyEvent; + aKeyEvent.Source = _rxContext; + + aKeyEvent.Modifiers = 0; + if ( _rVclEvent.GetKeyCode().IsShift() ) + aKeyEvent.Modifiers |= awt::KeyModifier::SHIFT; + if ( _rVclEvent.GetKeyCode().IsMod1() ) + aKeyEvent.Modifiers |= awt::KeyModifier::MOD1; + if ( _rVclEvent.GetKeyCode().IsMod2() ) + aKeyEvent.Modifiers |= awt::KeyModifier::MOD2; + if ( _rVclEvent.GetKeyCode().IsMod3() ) + aKeyEvent.Modifiers |= awt::KeyModifier::MOD3; + + aKeyEvent.KeyCode = _rVclEvent.GetKeyCode().GetCode(); + aKeyEvent.KeyChar = _rVclEvent.GetCharCode(); + aKeyEvent.KeyFunc = ::sal::static_int_cast< sal_Int16 >( _rVclEvent.GetKeyCode().GetFunction()); + + return aKeyEvent; +} diff --git a/toolkit/src2xml/include.lst b/toolkit/src2xml/include.lst index 7b35ccc73c73..d4be6f5e3517 100644 --- a/toolkit/src2xml/include.lst +++ b/toolkit/src2xml/include.lst @@ -128,7 +128,6 @@ ../../cppcanvas/inc ../../cppcanvas/source/inc ../../cppcanvas/unxlngi6.pro/inc -../../sandbox/unxlngi6.pro/inc ../../eventattacher/unxlngi6.pro/inc ../../unotools/inc ../../unotools/unxlngi6.pro/inc @@ -301,4 +300,4 @@ ../../cli_ure/inc ../../cli_ure/unxlngi6.pro/inc ../../psprint/inc -../../psprint/unxlngi6.pro/inc \ No newline at end of file +../../psprint/unxlngi6.pro/inc diff --git a/toolkit/util/makefile.mk b/toolkit/util/makefile.mk index d6a1e5f15c65..3c5da82d0dd9 100644 --- a/toolkit/util/makefile.mk +++ b/toolkit/util/makefile.mk @@ -52,6 +52,7 @@ USE_DEFFILE=TRUE LIB1TARGET= $(SLB)$/$(TARGET).lib LIB1FILES= $(SLB)$/awt.lib \ $(SLB)$/tree.lib \ + $(SLB)$/grid.lib \ $(SLB)$/controls.lib \ $(SLB)$/helper.lib\ $(SLB)$/layout-core.lib \ @@ -79,22 +80,6 @@ DEF1DEPN =$(LIB1TARGET) DEF1DES =TK DEFLIB1NAME =tk -.IF "$(OS)"=="MACOSX" - -# [ed] 6/16/02 Add in X libraries if we're building X - -.IF "$(GUIBASE)"=="unx" -SHL1STDLIBS +=\ - -lX11 -lXt -lXmu -.ENDIF - -.ELSE -.IF "$(GUI)"=="UNX" -SHL1STDLIBS +=\ - -lX11 -.ENDIF -.ENDIF - RESLIB1IMAGES=$(PRJ)$/source$/awt RES1FILELIST=$(SRS)$/awt.srs RESLIB1NAME=$(TARGET) diff --git a/toolkit/util/toolkit.xml b/toolkit/util/toolkit.xml index 8ec1a48d440d..2fb4588550bc 100644 --- a/toolkit/util/toolkit.xml +++ b/toolkit/util/toolkit.xml @@ -701,4 +701,50 @@ com.sun.star.awt.tree.MutableTreeNode + + Tobias Krause + stardiv.Toolkit.UnoGridModel + specifies the model of a grid control + com.sun.star.loader.SharedLibrary + c++ + + com.sun.star.awt.grid.UnoControlGridModel + + + Tobias Krause + stardiv.Toolkit.UnoGridControl + specifies a grid control + com.sun.star.loader.SharedLibrary + c++ + + com.sun.star.awt.grid.UnoControlGrid + + + Tobias Krause + stardiv.Toolkit.DefaultGridDataModel + specifies the grid control default data model + com.sun.star.loader.SharedLibrary + c++ + + com.sun.star.awt.grid.DefaultGridDataModel + + + Tobias Krause + stardiv.Toolkit.DefaultGridColumnModel + specifies the grid control default column model + com.sun.star.loader.SharedLibrary + c++ + + com.sun.star.awt.grid.DefaultGridColumnModel + + + Tobias Krause + stardiv.Toolkit.GridColumn + specifies the grid coloumn model + com.sun.star.loader.SharedLibrary + c++ + + com.sun.star.awt.grid.GridColumn + + \ No newline at end of file diff --git a/toolkit/workben/layout/editor.cxx b/toolkit/workben/layout/editor.cxx index dd218de40da7..3b5bd768566b 100644 --- a/toolkit/workben/layout/editor.cxx +++ b/toolkit/workben/layout/editor.cxx @@ -34,7 +34,6 @@ #undef NDEBUG /* -#include #include #include */ @@ -189,12 +188,12 @@ public: while ( xParent.is() && !uno::Reference< awt::XWindow >( xParent, uno::UNO_QUERY ).is() ) { uno::Reference< awt::XLayoutContainer > xContainer( xParent, uno::UNO_QUERY ); - assert( xContainer.is() ); + OSL_ASSERT( xContainer.is() ); xParent = uno::Reference< awt::XLayoutContainer >( xContainer->getParent(), uno::UNO_QUERY ); } mxWidget = WidgetFactory::createWidget( xToolkit, xParent, unoName, nAttrbs ); - assert( mxWidget.is() ); + OSL_ASSERT( mxWidget.is() ); mxContainer = uno::Reference< awt::XLayoutContainer >( mxWidget, uno::UNO_QUERY ); mrLabel = mrUnoName = unoName; @@ -340,7 +339,7 @@ public: else maChildren.push_back( pChild ); - assert( pChild->mpParent == NULL ); + OSL_ASSERT( pChild->mpParent == NULL ); pChild->mpParent = this; // store container props @@ -1733,7 +1732,7 @@ EditorImpl::EditorImpl( layout::Dialog *dialog, mxFactory->createInstance( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.Toolkit" ) ) ), uno::UNO_QUERY ); - assert( mxToolkit.is() ); + OSL_ASSERT( mxToolkit.is() ); // custom widgets #if DEBUG_PRINT @@ -1890,7 +1889,7 @@ IMPL_LINK( EditorImpl, CreateWidgetHdl, layout::Button *, pBtn ) if ( pBtn == *it ) break; } - assert( i < WIDGETS_SPECS_LEN ); + OSL_ASSERT( i < WIDGETS_SPECS_LEN ); createWidget( WIDGETS_SPECS[i].pName ); return 0; } diff --git a/tools/bootstrp/makefile.mk b/tools/bootstrp/makefile.mk index d0adff1278e4..60bfc57bf96b 100644 --- a/tools/bootstrp/makefile.mk +++ b/tools/bootstrp/makefile.mk @@ -81,18 +81,20 @@ LIB2OBJFILES=\ APP1TARGET= sspretty APP1OBJS= $(OBJ)$/sspretty.obj APP1LIBS= $(LB)$/$(TARGET).lib $(LB)$/$(TARGET1).lib -APP1STDLIBS=$(SALLIB) $(VOSLIB) $(TOOLSLIB) +APP1STDLIBS=$(SALLIB) $(VOSLIB) $(TOOLSLIB) $(BASEGFXLIB) $(UCBHELPERLIB) $(CPPULIB) $(COMPHELPERLIB) $(CPPUHELPERLIB) $(SALHELPERLIB) $(I18NISOLANGLIB) APP2TARGET= rscdep APP2OBJS= $(OBJ)$/rscdep.obj APP2LIBS= $(LB)$/$(TARGET).lib $(LB)$/$(TARGET1).lib -APP2STDLIBS= $(SALLIB) $(VOSLIB) $(TOOLSLIB) +APP2STDLIBS= $(SALLIB) $(VOSLIB) $(TOOLSLIB) $(BASEGFXLIB) $(UCBHELPERLIB) $(CPPULIB) $(COMPHELPERLIB) $(I18NISOLANGLIB) $(CPPUHELPERLIB) $(SALHELPERLIB) +APP2RPATH= NONE +APP2RPATH= NONE APP2RPATH= NONE APP3TARGET= so_checksum APP3OBJS= $(OBJ)$/md5.obj \ $(OBJ)$/so_checksum.obj -APP3STDLIBS= $(TOOLSLIB) $(SALLIB) +APP3STDLIBS= $(TOOLSLIB) $(SALLIB) $(VOSLIB) $(BASEGFXLIB) $(UCBHELPERLIB) $(CPPULIB) $(COMPHELPERLIB) $(I18NISOLANGLIB) $(CPPUHELPERLIB) $(SALHELPERLIB) DEPOBJFILES = $(APP1OBJS) $(APP2OBJS) $(APP3OBJS) diff --git a/tools/bootstrp/md5.cxx b/tools/bootstrp/md5.cxx index bca89725fac2..a234f278cc9d 100644 --- a/tools/bootstrp/md5.cxx +++ b/tools/bootstrp/md5.cxx @@ -44,8 +44,62 @@ #define FILE_OPEN_READ "r" #endif +// Extended calc_md5_checksum to recognize Windows executables and libraries. To +// create the same md5 checksum for a (code/data) identical file it ignores a different +// date and header checksum. Please see crashrep/source/win32/soreport.cpp +// where the same method is also used. The crash reporter uses the MD5 +// checksums to transfer them to the crash database. You have to make sure that both +// methods use the same algorithm otherwise there could be problems with stack reports. + +void normalize_pe_image(sal_uInt8* buffer, size_t nBufferSize) +{ + const int OFFSET_PE_OFFSET = 0x3c; + const int OFFSET_COFF_TIMEDATESTAMP = 4; + const int PE_SIGNATURE_SIZE = 4; + const int COFFHEADER_SIZE = 20; + const int OFFSET_PE_OPTIONALHEADER_CHECKSUM = 64; + + // Check the header part of the file buffer + if (buffer[0] == sal_uInt8('M') && buffer[1] == sal_uInt8('Z')) + { + unsigned long PEHeaderOffset = (long)buffer[OFFSET_PE_OFFSET]; + if (PEHeaderOffset < nBufferSize-4) + { + if ( buffer[PEHeaderOffset+0] == sal_uInt8('P') && + buffer[PEHeaderOffset+1] == sal_uInt8('E') && + buffer[PEHeaderOffset+2] == 0 && + buffer[PEHeaderOffset+3] == 0 ) + { + PEHeaderOffset += PE_SIGNATURE_SIZE; + if (PEHeaderOffset+OFFSET_COFF_TIMEDATESTAMP < nBufferSize-4) + { + // Set timedatestamp and checksum fields to a normalized + // value to enforce the same MD5 checksum for identical + // Windows executables/libraries. + buffer[PEHeaderOffset+OFFSET_COFF_TIMEDATESTAMP+0] = 0; + buffer[PEHeaderOffset+OFFSET_COFF_TIMEDATESTAMP+1] = 0; + buffer[PEHeaderOffset+OFFSET_COFF_TIMEDATESTAMP+2] = 0; + buffer[PEHeaderOffset+OFFSET_COFF_TIMEDATESTAMP+3] = 0; + } + + if (PEHeaderOffset+COFFHEADER_SIZE+OFFSET_PE_OPTIONALHEADER_CHECKSUM < nBufferSize-4) + { + // Set checksum to a normalized value + buffer[PEHeaderOffset+COFFHEADER_SIZE+OFFSET_PE_OPTIONALHEADER_CHECKSUM] = 0; + buffer[PEHeaderOffset+COFFHEADER_SIZE+OFFSET_PE_OPTIONALHEADER_CHECKSUM+1] = 0; + buffer[PEHeaderOffset+COFFHEADER_SIZE+OFFSET_PE_OPTIONALHEADER_CHECKSUM+2] = 0; + buffer[PEHeaderOffset+COFFHEADER_SIZE+OFFSET_PE_OPTIONALHEADER_CHECKSUM+3] = 0; + } + } + } + } +} + rtlDigestError calc_md5_checksum( const char *filename, ByteString &aChecksum ) { + const size_t BUFFER_SIZE = 0x1000; + const size_t MINIMAL_SIZE = 512; + sal_uInt8 checksum[RTL_DIGEST_LENGTH_MD5]; rtlDigestError error = rtl_Digest_E_None; @@ -58,11 +112,19 @@ rtlDigestError calc_md5_checksum( const char *filename, ByteString &aChecksum ) if ( digest ) { size_t nBytesRead; - sal_uInt8 buffer[0x1000]; + sal_uInt8 buffer[BUFFER_SIZE]; + bool bHeader(true); while ( rtl_Digest_E_None == error && 0 != (nBytesRead = fread( buffer, 1, sizeof(buffer), fp )) ) { + if (bHeader) + { + bHeader = false; + if (nBytesRead >= MINIMAL_SIZE && buffer[0] == sal_uInt8('M') && buffer[1] == sal_uInt8('Z') ) + normalize_pe_image(buffer, nBytesRead); + } + error = rtl_digest_updateMD5( digest, buffer, nBytesRead ); } diff --git a/tools/inc/poly.h b/tools/inc/poly.h index ed70359be0c0..4f281a9b1359 100644 --- a/tools/inc/poly.h +++ b/tools/inc/poly.h @@ -99,17 +99,4 @@ public: ~ImplPolyPolygon(); }; -inline long MinMax( long nVal, long nMin, long nMax ) -{ - return( nVal >= nMin ? ( nVal <= nMax ? nVal : nMax ) : nMin ); -} - -// ------------------------------------------------------------------ - -inline long FRound( double fVal ) -{ - return( fVal > 0.0 ? (long) ( fVal + 0.5 ) : -(long) ( -fVal + 0.5 ) ); -} - - #endif // _SV_POLY_H diff --git a/tools/inc/tools/date.hxx b/tools/inc/tools/date.hxx index 87602e27d874..e14be54b7df1 100644 --- a/tools/inc/tools/date.hxx +++ b/tools/inc/tools/date.hxx @@ -115,6 +115,9 @@ public: TOOLS_DLLPUBLIC friend Date operator +( const Date& rDate, long nDays ); TOOLS_DLLPUBLIC friend Date operator -( const Date& rDate, long nDays ); TOOLS_DLLPUBLIC friend long operator -( const Date& rDate1, const Date& rDate2 ); + + static long DateToDays( USHORT nDay, USHORT nMonth, USHORT nYear ); + }; #endif // _DATE_HXX diff --git a/tools/inc/tools/errcode.hxx b/tools/inc/tools/errcode.hxx index af420397eba2..337fedfea44a 100644 --- a/tools/inc/tools/errcode.hxx +++ b/tools/inc/tools/errcode.hxx @@ -314,6 +314,7 @@ inline ULONG ERRCODE_TOERROR( ULONG x ) #define PRINTER_ABORT ERRCODE_IO_ABORT #define PRINTER_OUTOFMEMORY ERRCODE_IO_OUTOFMEMORY #define PRINTER_GENERALERROR ERRCODE_IO_GENERAL +#define PRINTER_ACCESSDENIED ERRCODE_IO_ACCESSDENIED #define ERRCODE_INET_NAME_RESOLVE (ERRCODE_AREA_INET | ERRCODE_CLASS_READ | 1) #define ERRCODE_INET_CONNECT (ERRCODE_AREA_INET | ERRCODE_CLASS_READ | 2) diff --git a/tools/inc/tools/fldunit.hxx b/tools/inc/tools/fldunit.hxx new file mode 100644 index 000000000000..786796030eb3 --- /dev/null +++ b/tools/inc/tools/fldunit.hxx @@ -0,0 +1,44 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: fldunit.hxx,v $ + * $Revision: 1.3 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _TOOLS_FLDUNIT_HXX +#define _TOOLS_FLDUNIT_HXX + +// -------------- +// - FieldTypes - +// -------------- + +// By changes you must also change: rsc/vclrsc.hxx +enum FieldUnit { FUNIT_NONE, FUNIT_MM, FUNIT_CM, FUNIT_M, FUNIT_KM, + FUNIT_TWIP, FUNIT_POINT, FUNIT_PICA, + FUNIT_INCH, FUNIT_FOOT, FUNIT_MILE, FUNIT_CUSTOM, + FUNIT_PERCENT, FUNIT_100TH_MM }; + +#endif // _TOOLS_FLDUNIT_HXX diff --git a/tools/inc/tools/fontenum.hxx b/tools/inc/tools/fontenum.hxx new file mode 100644 index 000000000000..6c529cedb30d --- /dev/null +++ b/tools/inc/tools/fontenum.hxx @@ -0,0 +1,175 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: vclenum.hxx,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _TOOLS_FONTENUM_HXX +#define _TOOLS_FONTENUM_HXX + +#include +#include + +#ifndef ENUM_FONTFAMILY_DECLARED +#define ENUM_FONTFAMILY_DECLARED + +enum FontFamily { FAMILY_DONTKNOW, FAMILY_DECORATIVE, FAMILY_MODERN, + FAMILY_ROMAN, FAMILY_SCRIPT, FAMILY_SWISS, FAMILY_SYSTEM, FontFamily_FORCE_EQUAL_SIZE=SAL_MAX_ENUM }; + +#endif + +// ------------------------------------------------------------ + +#ifndef ENUM_FONTPITCH_DECLARED +#define ENUM_FONTPITCH_DECLARED + +enum FontPitch { PITCH_DONTKNOW, PITCH_FIXED, PITCH_VARIABLE, FontPitch_FORCE_EQUAL_SIZE=SAL_MAX_ENUM }; + +#endif + +// ------------------------------------------------------------ + +#ifndef ENUM_TEXTALIGN_DECLARED +#define ENUM_TEXTALIGN_DECLARED + +enum TextAlign { ALIGN_TOP, ALIGN_BASELINE, ALIGN_BOTTOM, TextAlign_FORCE_EQUAL_SIZE=SAL_MAX_ENUM }; + +#endif + +// ------------------------------------------------------------ + +#ifndef ENUM_FONTWEIGHT_DECLARED +#define ENUM_FONTWEIGHT_DECLARED + +enum FontWeight { WEIGHT_DONTKNOW, WEIGHT_THIN, WEIGHT_ULTRALIGHT, + WEIGHT_LIGHT, WEIGHT_SEMILIGHT, WEIGHT_NORMAL, + WEIGHT_MEDIUM, WEIGHT_SEMIBOLD, WEIGHT_BOLD, + WEIGHT_ULTRABOLD, WEIGHT_BLACK, FontWeight_FORCE_EQUAL_SIZE=SAL_MAX_ENUM }; + +#endif + +// ------------------------------------------------------------ + +#ifndef ENUM_FONTWIDTH_DECLARED +#define ENUM_FONTWIDTH_DECLARED + +enum FontWidth { WIDTH_DONTKNOW, WIDTH_ULTRA_CONDENSED, WIDTH_EXTRA_CONDENSED, + WIDTH_CONDENSED, WIDTH_SEMI_CONDENSED, WIDTH_NORMAL, + WIDTH_SEMI_EXPANDED, WIDTH_EXPANDED, WIDTH_EXTRA_EXPANDED, + WIDTH_ULTRA_EXPANDED, + FontWidth_FORCE_EQUAL_SIZE=SAL_MAX_ENUM }; + +#endif + +// ------------------------------------------------------------ + +#ifndef ENUM_FONTITALIC_DECLARED +#define ENUM_FONTITALIC_DECLARED + +enum FontItalic { ITALIC_NONE, ITALIC_OBLIQUE, ITALIC_NORMAL, ITALIC_DONTKNOW, FontItalic_FORCE_EQUAL_SIZE=SAL_MAX_ENUM }; + +#endif + +// ------------------------------------------------------------ + +#ifndef ENUM_FONTUNDERLINE_DECLARED +#define ENUM_FONTUNDERLINE_DECLARED + +enum FontUnderline { UNDERLINE_NONE, UNDERLINE_SINGLE, UNDERLINE_DOUBLE, + UNDERLINE_DOTTED, UNDERLINE_DONTKNOW, + UNDERLINE_DASH, UNDERLINE_LONGDASH, + UNDERLINE_DASHDOT, UNDERLINE_DASHDOTDOT, + UNDERLINE_SMALLWAVE, + UNDERLINE_WAVE, UNDERLINE_DOUBLEWAVE, + UNDERLINE_BOLD, UNDERLINE_BOLDDOTTED, + UNDERLINE_BOLDDASH, UNDERLINE_BOLDLONGDASH, + UNDERLINE_BOLDDASHDOT, UNDERLINE_BOLDDASHDOTDOT, + UNDERLINE_BOLDWAVE, + FontUnderline_FORCE_EQUAL_SIZE=SAL_MAX_ENUM }; + +#endif + +// ------------------------------------------------------------ + +#ifndef ENUM_FONTSTRIKEOUT_DECLARED +#define ENUM_FONTSTRIKEOUT_DECLARED + +enum FontStrikeout { STRIKEOUT_NONE, STRIKEOUT_SINGLE, STRIKEOUT_DOUBLE, + STRIKEOUT_DONTKNOW, STRIKEOUT_BOLD, + STRIKEOUT_SLASH, STRIKEOUT_X, + FontStrikeout_FORCE_EQUAL_SIZE=SAL_MAX_ENUM }; + +#endif + +// ------------------------------------------------------------ + +#ifndef ENUM_FONTEMPHASISMARK_DECLARED +#define ENUM_FONTEMPHASISMARK_DECLARED + +typedef USHORT FontEmphasisMark; +#define EMPHASISMARK_NONE ((FontEmphasisMark)0x0000) +#define EMPHASISMARK_DOT ((FontEmphasisMark)0x0001) +#define EMPHASISMARK_CIRCLE ((FontEmphasisMark)0x0002) +#define EMPHASISMARK_DISC ((FontEmphasisMark)0x0003) +#define EMPHASISMARK_ACCENT ((FontEmphasisMark)0x0004) +#define EMPHASISMARK_STYLE ((FontEmphasisMark)0x00FF) +#define EMPHASISMARK_POS_ABOVE ((FontEmphasisMark)0x1000) +#define EMPHASISMARK_POS_BELOW ((FontEmphasisMark)0x2000) + +// Only for kompability +#define EMPHASISMARK_DOTS_ABOVE (EMPHASISMARK_DOT | EMPHASISMARK_POS_ABOVE) +#define EMPHASISMARK_DOTS_BELOW (EMPHASISMARK_DOT | EMPHASISMARK_POS_BELOW) +#define EMPHASISMARK_SIDE_DOTS (EMPHASISMARK_ACCENT | EMPHASISMARK_POS_ABOVE) +#define EMPHASISMARK_CIRCLE_ABOVE (EMPHASISMARK_CIRCLE | EMPHASISMARK_POS_ABOVE) + +#endif + +// ------------------------------------------------------------ + +#ifndef ENUM_FONTTYPE_DECLARED +#define ENUM_FONTTYPE_DECLARED + +enum FontType { TYPE_DONTKNOW, TYPE_RASTER, TYPE_VECTOR, TYPE_SCALABLE, + FontType_FORCE_EQUAL_SIZE=SAL_MAX_ENUM }; + +#endif + +#ifndef ENUM_FONTEMBEDDEDBITMAP_DECLARED +#define ENUM_FONTEMBEDDEDBITMAP_DECLARED + +enum FontEmbeddedBitmap { EMBEDDEDBITMAP_DONTKNOW, EMBEDDEDBITMAP_FALSE, EMBEDDEDBITMAP_TRUE }; + +#endif + +#ifndef ENUM_FONTANTIALIAS_DECLARED +#define ENUM_FONTANTIALIAS_DECLARED + +enum FontAntiAlias { ANTIALIAS_DONTKNOW, ANTIALIAS_FALSE, ANTIALIAS_TRUE }; + +#endif + +#endif // _TOOLS_FONTENUM_HXX diff --git a/tools/inc/tools/fsys.hxx b/tools/inc/tools/fsys.hxx index 8223d77106e3..f1da7579aee6 100644 --- a/tools/inc/tools/fsys.hxx +++ b/tools/inc/tools/fsys.hxx @@ -570,7 +570,7 @@ void FSysEnableSysErrorBox( BOOL bEnable ); //======================================================================== -#if defined(DBG_UTIL) && !defined(PRODUCT) +#if defined(DBG_UTIL) void FSysTest(); #endif diff --git a/tools/inc/tools/gen.hxx b/tools/inc/tools/gen.hxx index e01eb98842c2..0d82f4d73160 100644 --- a/tools/inc/tools/gen.hxx +++ b/tools/inc/tools/gen.hxx @@ -37,6 +37,37 @@ class SvStream; +// -------------------- +// - Helper functions - +// -------------------- + +inline long MinMax( long nVal, long nMin, long nMax ); +inline long AlignedWidth4Bytes( long nWidthBits ); +inline long FRound( double fVal ); + +// --------------- +// - Inlines - +// --------------- + +inline long MinMax( long nVal, long nMin, long nMax ) +{ + return( nVal >= nMin ? ( nVal <= nMax ? nVal : nMax ) : nMin ); +} + +// ------------------------------------------------------------------ + +inline long AlignedWidth4Bytes( long nWidthBits ) +{ + return( ( ( nWidthBits + 31 ) >> 5 ) << 2 ); +} + +// ------------------------------------------------------------------ + +inline long FRound( double fVal ) +{ + return( fVal > 0.0 ? (long) ( fVal + 0.5 ) : -(long) ( -fVal + 0.5 ) ); +} + // -------- // - Pair - // -------- diff --git a/tools/inc/tools/mapunit.hxx b/tools/inc/tools/mapunit.hxx new file mode 100644 index 000000000000..76267192347a --- /dev/null +++ b/tools/inc/tools/mapunit.hxx @@ -0,0 +1,44 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: mapunit.hxx,v $ + * $Revision: 1.3 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _TOOLS_MAPUNIT_HXX +#define _TOOLS_MAPUNIT_HXX + +// ----------------- +// - MapMode-Types - +// ----------------- + +// By changes you must also change: rsc/vclrsc.hxx +enum MapUnit { MAP_100TH_MM, MAP_10TH_MM, MAP_MM, MAP_CM, + MAP_1000TH_INCH, MAP_100TH_INCH, MAP_10TH_INCH, MAP_INCH, + MAP_POINT, MAP_TWIP, MAP_PIXEL, MAP_SYSFONT, MAP_APPFONT, + MAP_RELATIVE, MAP_REALAPPFONT, MAP_LASTENUMDUMMY }; + +#endif // _TOOLS_MAPUNIT_HXX diff --git a/tools/inc/tools/poly.hxx b/tools/inc/tools/poly.hxx index 606c9c91e879..05092957c48e 100644 --- a/tools/inc/tools/poly.hxx +++ b/tools/inc/tools/poly.hxx @@ -182,7 +182,6 @@ public: void Clip( const Rectangle& rRect, BOOL bPolygon = TRUE ); void Optimize( ULONG nOptimizeFlags, const PolyOptimizeData* pData = NULL ); - void GetSimple( Polygon& rResult ) const; /** Adaptive subdivision of polygons with curves This method adaptively subdivides bezier arcs within the @@ -260,7 +259,6 @@ private: ImplPolyPolygon* mpImplPolyPolygon; //#if 0 // _SOLAR__PRIVATE - TOOLS_DLLPRIVATE void *ImplCreateGPCPolygon() const; TOOLS_DLLPRIVATE void ImplDoOperation( const PolyPolygon& rPolyPoly, PolyPolygon& rResult, ULONG nOperation ) const; TOOLS_DLLPRIVATE void *ImplCreateArtVpath() const; TOOLS_DLLPRIVATE void ImplSetFromArtVpath( void *pVpath ); @@ -289,7 +287,6 @@ public: void Clip( const Rectangle& rRect ); void Optimize( ULONG nOptimizeFlags, const PolyOptimizeData* pData = NULL ); - void GetSimple( PolyPolygon& rResult ) const; /** Adaptive subdivision of polygons with curves This method adaptively subdivides bezier arcs within the diff --git a/tools/inc/tools/rc.h b/tools/inc/tools/rc.h index 11d6e2030162..8bad7dbf3f8a 100644 --- a/tools/inc/tools/rc.h +++ b/tools/inc/tools/rc.h @@ -102,6 +102,7 @@ typedef short RSWND_STYLE; //#define NUMERICFORMATTER_I12 0x08 // erAck: got rid of class International (2005-06-17) #define NUMERICFORMATTER_DECIMALDIGITS 0x10 #define NUMERICFORMATTER_VALUE 0x20 +#define NUMERICFORMATTER_NOTHOUSANDSEP 0x40 #define METRICFORMATTER_UNIT 0x01 #define METRICFORMATTER_CUSTOMUNITTEXT 0x02 diff --git a/tools/inc/tools/solar.h b/tools/inc/tools/solar.h index 46fe42b9c36f..cd069886d8b6 100644 --- a/tools/inc/tools/solar.h +++ b/tools/inc/tools/solar.h @@ -385,6 +385,8 @@ template inline T Abs(T a) { return (a>=0?a:-a); } #define __DLLEXTENSION "la.so" #elif defined LINUX && defined M68K #define __DLLEXTENSION "lm.so" +#elif defined LINUX && defined HPPA + #define __DLLEXTENSION "lh.so" #elif defined LINUX #error unknown plattform #elif defined FREEBSD && defined X86 diff --git a/svtools/source/misc/iniman.src b/tools/inc/tools/solarmutex.hxx old mode 100644 new mode 100755 similarity index 75% rename from svtools/source/misc/iniman.src rename to tools/inc/tools/solarmutex.hxx index afc129318653..42aff1f23f43 --- a/svtools/source/misc/iniman.src +++ b/tools/inc/tools/solarmutex.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: iniman.src,v $ - * $Revision: 1.27 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -27,42 +24,22 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ +#ifndef _TOOLS_SOLARMUTEX_HXX +#define _TOOLS_SOLARMUTEX_HXX -#include +#include "tools/toolsdllapi.h" +#include -ErrorBox ERRBOX_CHECK_PLZ +namespace tools { - BUTTONS = WB_OK ; - Message [ en-US ] = "The ZIP code specified is invalid.\nA ZIP code should begin with a number (or in some cases a letter) and\ncan only contain numbers, letters, spaces and dashes."; -}; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + class TOOLS_DLLPUBLIC SolarMutex + { + public: + static ::vos::IMutex* GetSolarMutex(); + static void SetSolarMutex( ::vos::IMutex* pMutex ); + static bool Acquire(); + static void Release(); + }; +} +#endif diff --git a/tools/inc/tools/wintypes.hxx b/tools/inc/tools/wintypes.hxx new file mode 100644 index 000000000000..a9c23de87ddd --- /dev/null +++ b/tools/inc/tools/wintypes.hxx @@ -0,0 +1,337 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: wintypes.hxx,v $ + * $Revision: 1.9 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _TOOLS_WINTYPES_HXX +#define _TOOLS_WINTYPES_HXX + +#include +#include + +// ---------------- +// - Window-Types - +// ---------------- + +typedef USHORT WindowType; +#define WINDOW_BASE 0x0100 +#define WINDOW_FIRST (WINDOW_BASE + 0x30) +#define WINDOW_MESSBOX (WINDOW_FIRST) +#define WINDOW_INFOBOX (WINDOW_FIRST + 0x01) +#define WINDOW_WARNINGBOX (WINDOW_FIRST + 0x02) +#define WINDOW_ERRORBOX (WINDOW_FIRST + 0x03) +#define WINDOW_QUERYBOX (WINDOW_FIRST + 0x04) +#define WINDOW_WINDOW (WINDOW_FIRST + 0x05) +#define WINDOW_SYSWINDOW (WINDOW_FIRST + 0x06) +#define WINDOW_WORKWINDOW (WINDOW_FIRST + 0x07) +// #define WINDOW_MDIWINDOW (WINDOW_FIRST + 0x08) +#define WINDOW_FLOATINGWINDOW (WINDOW_FIRST + 0x09) +#define WINDOW_DIALOG (WINDOW_FIRST + 0x0a) +#define WINDOW_MODELESSDIALOG (WINDOW_FIRST + 0x0b) +#define WINDOW_MODALDIALOG (WINDOW_FIRST + 0x0c) +#define WINDOW_SYSTEMDIALOG (WINDOW_FIRST + 0x0d) +#define WINDOW_PATHDIALOG (WINDOW_FIRST + 0x0e) +#define WINDOW_FILEDIALOG (WINDOW_FIRST + 0x0f) +#define WINDOW_PRINTERSETUPDIALOG (WINDOW_FIRST + 0x10) +#define WINDOW_PRINTDIALOG (WINDOW_FIRST + 0x11) +#define WINDOW_COLORDIALOG (WINDOW_FIRST + 0x12) +#define WINDOW_FONTDIALOG (WINDOW_FIRST + 0x13) +#define WINDOW_CONTROL (WINDOW_FIRST + 0x14) +#define WINDOW_BUTTON (WINDOW_FIRST + 0x15) +#define WINDOW_PUSHBUTTON (WINDOW_FIRST + 0x16) +#define WINDOW_OKBUTTON (WINDOW_FIRST + 0x17) +#define WINDOW_CANCELBUTTON (WINDOW_FIRST + 0x18) +#define WINDOW_HELPBUTTON (WINDOW_FIRST + 0x19) +#define WINDOW_IMAGEBUTTON (WINDOW_FIRST + 0x1a) +#define WINDOW_MENUBUTTON (WINDOW_FIRST + 0x1b) +#define WINDOW_MOREBUTTON (WINDOW_FIRST + 0x1c) +#define WINDOW_SPINBUTTON (WINDOW_FIRST + 0x1d) +#define WINDOW_RADIOBUTTON (WINDOW_FIRST + 0x1e) +#define WINDOW_IMAGERADIOBUTTON (WINDOW_FIRST + 0x1f) +#define WINDOW_CHECKBOX (WINDOW_FIRST + 0x20) +#define WINDOW_TRISTATEBOX (WINDOW_FIRST + 0x21) +#define WINDOW_EDIT (WINDOW_FIRST + 0x22) +#define WINDOW_MULTILINEEDIT (WINDOW_FIRST + 0x23) +#define WINDOW_COMBOBOX (WINDOW_FIRST + 0x24) +#define WINDOW_LISTBOX (WINDOW_FIRST + 0x25) +#define WINDOW_MULTILISTBOX (WINDOW_FIRST + 0x26) +#define WINDOW_FIXEDTEXT (WINDOW_FIRST + 0x27) +#define WINDOW_FIXEDLINE (WINDOW_FIRST + 0x28) +#define WINDOW_FIXEDBITMAP (WINDOW_FIRST + 0x29) +#define WINDOW_FIXEDIMAGE (WINDOW_FIRST + 0x2a) +#define WINDOW_GROUPBOX (WINDOW_FIRST + 0x2c) +#define WINDOW_SCROLLBAR (WINDOW_FIRST + 0x2d) +#define WINDOW_SCROLLBARBOX (WINDOW_FIRST + 0x2e) +#define WINDOW_SPLITTER (WINDOW_FIRST + 0x2f) +#define WINDOW_SPLITWINDOW (WINDOW_FIRST + 0x30) +#define WINDOW_SPINFIELD (WINDOW_FIRST + 0x31) +#define WINDOW_PATTERNFIELD (WINDOW_FIRST + 0x32) +#define WINDOW_NUMERICFIELD (WINDOW_FIRST + 0x33) +#define WINDOW_METRICFIELD (WINDOW_FIRST + 0x34) +#define WINDOW_CURRENCYFIELD (WINDOW_FIRST + 0x35) +#define WINDOW_DATEFIELD (WINDOW_FIRST + 0x36) +#define WINDOW_TIMEFIELD (WINDOW_FIRST + 0x37) +#define WINDOW_PATTERNBOX (WINDOW_FIRST + 0x38) +#define WINDOW_NUMERICBOX (WINDOW_FIRST + 0x39) +#define WINDOW_METRICBOX (WINDOW_FIRST + 0x3a) +#define WINDOW_CURRENCYBOX (WINDOW_FIRST + 0x3b) +#define WINDOW_DATEBOX (WINDOW_FIRST + 0x3c) +#define WINDOW_TIMEBOX (WINDOW_FIRST + 0x3d) +#define WINDOW_LONGCURRENCYFIELD (WINDOW_FIRST + 0x3e) +#define WINDOW_LONGCURRENCYBOX (WINDOW_FIRST + 0x3f) +#define WINDOW_TOOLBOX (WINDOW_FIRST + 0x41) +#define WINDOW_DOCKINGWINDOW (WINDOW_FIRST + 0x42) +#define WINDOW_STATUSBAR (WINDOW_FIRST + 0x43) +#define WINDOW_TABPAGE (WINDOW_FIRST + 0x44) +#define WINDOW_TABCONTROL (WINDOW_FIRST + 0x45) +#define WINDOW_TABDIALOG (WINDOW_FIRST + 0x46) +#define WINDOW_BORDERWINDOW (WINDOW_FIRST + 0x47) +#define WINDOW_BUTTONDIALOG (WINDOW_FIRST + 0x48) +#define WINDOW_SYSTEMCHILDWINDOW (WINDOW_FIRST + 0x49) +#define WINDOW_FIXEDBORDER (WINDOW_FIRST + 0x4a) +#define WINDOW_SLIDER (WINDOW_FIRST + 0x4b) +#define WINDOW_MENUBARWINDOW (WINDOW_FIRST + 0x4c) +#define WINDOW_TREELISTBOX (WINDOW_FIRST + 0x4d) +#define WINDOW_HELPTEXTWINDOW (WINDOW_FIRST + 0x4e) +#define WINDOW_INTROWINDOW (WINDOW_FIRST + 0x4f) +#define WINDOW_LISTBOXWINDOW (WINDOW_FIRST + 0x50) +#define WINDOW_DOCKINGAREA (WINDOW_FIRST + 0x51) +#define WINDOW_LAST (WINDOW_DOCKINGAREA) + + +// --------------- +// - Window-Bits - +// --------------- + +// By changes you must also change: rsc/vclrsc.hxx +typedef sal_Int64 WinBits; + +// Window-Bits fuer Window +#define WB_CLIPCHILDREN ((WinBits)0x00000001) +#define WB_DIALOGCONTROL ((WinBits)0x00000002) +#define WB_NODIALOGCONTROL ((WinBits)0x00000004) +#define WB_BORDER ((WinBits)0x00000008) +#define WB_NOBORDER ((WinBits)0x00000010) +#define WB_SIZEABLE ((WinBits)0x00000020) +#define WB_3DLOOK ((WinBits)0x00000040) +#define WB_AUTOSIZE ((WinBits)0x00000080) + +// Window-Bits fuer SystemWindows +#define WB_MOVEABLE ((WinBits)0x00000100) +#define WB_ROLLABLE ((WinBits)0x00000200) +#define WB_CLOSEABLE ((WinBits)0x00000400) +#define WB_STANDALONE ((WinBits)0x00000800) +#define WB_APP ((WinBits)0x00001000) +#define WB_PINABLE ((WinBits)0x00002000) +#define WB_SYSTEMWINDOW ((WinBits)SAL_CONST_INT64(0x40000000)) +// warning: do not confuse WB_SYSTEMCHILDWINDOW with the SystemChildWindow class + +// the SystemChildWindow class was there first and is a very specialized +// sytem child window type for plugged applications. The SystemChildWindow class +// explicitly should never use the WB_SYSTEMCHILDWINDOW WinBit + +// WB_SYSTEMCHILDWINDOW on the other hand is to be used on system windows +// which should be created as system child windows with (more or less) +// normal event handling +#define WB_SYSTEMCHILDWINDOW ((WinBits)SAL_CONST_INT64(0x8000000000)) +#define WB_SIZEMOVE (WB_SIZEABLE | WB_MOVEABLE) + +// Standard-Window-Bits fuer ChildWindows +#define WB_TABSTOP ((WinBits)0x00000100) +#define WB_NOTABSTOP ((WinBits)0x00000200) +#define WB_GROUP ((WinBits)0x00000400) +#define WB_NOGROUP ((WinBits)0x00000800) +#define WB_HORZ ((WinBits)0x00001000) +#define WB_VERT ((WinBits)0x00002000) +#define WB_LEFT ((WinBits)0x00004000) +#define WB_CENTER ((WinBits)0x00008000) +#define WB_RIGHT ((WinBits)0x00010000) +#define WB_TOP ((WinBits)0x00020000) +#define WB_VCENTER ((WinBits)0x00040000) +#define WB_BOTTOM ((WinBits)0x00080000) +#define WB_DRAG ((WinBits)0x00100000) +#define WB_SPIN ((WinBits)0x00200000) +#define WB_REPEAT ((WinBits)0x00400000) +#define WB_NOPOINTERFOCUS ((WinBits)0x00800000) +#define WB_WORDBREAK ((WinBits)0x01000000) +#define WB_NOLABEL ((WinBits)0x02000000) +#define WB_SORT ((WinBits)0x04000000) +#define WB_DROPDOWN ((WinBits)0x08000000) +#define WB_AUTOHSCROLL ((WinBits)SAL_CONST_INT64(0x10000000)) +#define WB_DOCKABLE ((WinBits)SAL_CONST_INT64(0x20000000)) +#define WB_AUTOVSCROLL ((WinBits)SAL_CONST_INT64(0x40000000)) +#define WB_HYPHENATION (((WinBits)SAL_CONST_INT64(0x80000000)) | WB_WORDBREAK) +#define WB_CHILDDLGCTRL ((WinBits)SAL_CONST_INT64(0x100000000000)) + +// system floating window +#define WB_SYSTEMFLOATWIN ((WinBits)SAL_CONST_INT64(0x100000000)) +#define WB_INTROWIN ((WinBits)SAL_CONST_INT64(0x200000000)) +#define WB_NOSHADOW ((WinBits)SAL_CONST_INT64(0x400000000)) +#define WB_TOOLTIPWIN ((WinBits)SAL_CONST_INT64(0x800000000)) +#define WB_OWNERDRAWDECORATION ((WinBits)SAL_CONST_INT64(0x2000000000)) +#define WB_DEFAULTWIN ((WinBits)SAL_CONST_INT64(0x4000000000)) +#define WB_NEEDSFOCUS ((WinBits)SAL_CONST_INT64(0x1000000000)) + +#define WB_HIDE ((WinBits)SAL_CONST_INT64(0x80000000)) +#define WB_HSCROLL WB_HORZ +#define WB_VSCROLL WB_VERT +#define WB_TOPIMAGE WB_TOP + +// Window-Bits for PushButtons +#define WB_DEFBUTTON ((WinBits)0x10000000) +#define WB_NOLIGHTBORDER ((WinBits)0x20000000) +#define WB_RECTSTYLE ((WinBits)0x08000000) +#define WB_SMALLSTYLE ((WinBits)0x04000000) +#define WB_TOGGLE ((WinBits)SAL_CONST_INT64(0x1000000000)) +#define WB_BEVELBUTTON ((WinBits)SAL_CONST_INT64(0x2000000000)) + +// Window-Bits for FixedText +#define WB_PATHELLIPSIS ((WinBits)0x00100000) +#define WB_EXTRAOFFSET ((WinBits)0x02000000) +#define WB_NOMULTILINE ((WinBits)0x10000000) +#define WB_INFO ((WinBits)0x20000000) + +// Window-Bits for CheckBox +#define WB_CBLINESTYLE ((WinBits)SAL_CONST_INT64(0x2000000000)) + +// Window-Bits for Edit +#define WB_PASSWORD ((WinBits)0x01000000) +#define WB_READONLY ((WinBits)0x02000000) +#define WB_NOHIDESELECTION ((WinBits)SAL_CONST_INT64(0x1000000000)) +#define WB_FORCECTRLBACKGROUND ((WinBits)0x80000000) + +// Window-Bits for MultiLineEdit +#define WB_IGNORETAB ((WinBits)0x20000000) + +// Window-Bits for ListBox and MultiListBox +#define WB_SIMPLEMODE ((WinBits)0x20000000) + +// Window-Bits for FixedBitmap +#define WB_FAST ((WinBits)0x04000000) +#define WB_SCALE ((WinBits)0x08000000) +#define WB_TOPLEFTVISIBLE ((WinBits)0x10000000) + +// Window-Bits for ToolBox +#define WB_LINESPACING ((WinBits)0x01000000) +#define WB_SCROLL ((WinBits)0x02000000) +#define WB_FORCETABCYCLE ((WinBits)0x04000000) + +// Window-Bits for TabControl +#define WB_SINGLELINE ((WinBits)0x02000000) + +// Window-Bits for DockingWindows +#define WB_DOCKBORDER ((WinBits)0x00001000) + +// Window-Bits for SplitWindow +#define WB_NOSPLITDRAW ((WinBits)0x01000000) +#define WB_FLATSPLITDRAW ((WinBits)0x02000000) + +// Window-Bits for MessageBoxen +#define WB_OK ((WinBits)0x00100000) +#define WB_OK_CANCEL ((WinBits)0x00200000) +#define WB_YES_NO ((WinBits)0x00400000) +#define WB_YES_NO_CANCEL ((WinBits)0x00800000) +#define WB_RETRY_CANCEL ((WinBits)0x01000000) +#define WB_DEF_OK ((WinBits)0x02000000) +#define WB_DEF_CANCEL ((WinBits)0x04000000) +#define WB_DEF_RETRY ((WinBits)0x08000000) +#define WB_DEF_YES ((WinBits)SAL_CONST_INT64(0x10000000)) +#define WB_DEF_NO ((WinBits)SAL_CONST_INT64(0x20000000)) +#define WB_ABORT_RETRY_IGNORE ((WinBits)SAL_CONST_INT64(0x1000000000)) +#define WB_DEF_IGNORE ((WinBits)SAL_CONST_INT64(0x2000000000)) + +// Standard-WinBits +#define WB_STDWORK (WB_SIZEMOVE | WB_CLOSEABLE) +#define WB_STDDOCKWIN (WB_DOCKABLE | WB_MOVEABLE | WB_CLOSEABLE) +#define WB_STDFLOATWIN (WB_SIZEMOVE | WB_CLOSEABLE | WB_ROLLABLE) +#define WB_STDDIALOG (WB_MOVEABLE | WB_CLOSEABLE) +#define WB_STDMODELESS (WB_STDDIALOG) +#define WB_STDMODAL (WB_STDDIALOG) +#define WB_STDTABDIALOG (WB_STDDIALOG) +#define WB_STDTABCONTROL 0 + +// For TreeListBox +#define WB_HASBUTTONS ((WinBits)0x00800000) +#define WB_HASLINES ((WinBits)0x01000000) +#define WB_HASLINESATROOT ((WinBits)0x02000000) + +// For FileOpen Dialog +#define WB_PATH ((WinBits)0x00100000) +#define WB_OPEN ((WinBits)0x00200000) +#define WB_SAVEAS ((WinBits)0x00400000) + +// For Slider +// Window-Bits for TabControl +#define WB_SLIDERSET ((WinBits)0x02000000) + + +// -------------------- +// - extended WinBits - +// -------------------- +#define WB_EXT_DOCUMENT ((WinBits)0x00000001) +#define WB_EXT_DOCMODIFIED ((WinBits)0x00000002) + +// --------------- +// - WindowAlign - +// --------------- + +// By changes you must also change: rsc/vclrsc.hxx +enum WindowAlign { WINDOWALIGN_LEFT, WINDOWALIGN_TOP, WINDOWALIGN_RIGHT, WINDOWALIGN_BOTTOM }; +enum ImageAlign { IMAGEALIGN_LEFT, IMAGEALIGN_TOP, IMAGEALIGN_RIGHT, IMAGEALIGN_BOTTOM, + IMAGEALIGN_LEFT_TOP, IMAGEALIGN_LEFT_BOTTOM, IMAGEALIGN_TOP_LEFT, + IMAGEALIGN_TOP_RIGHT, IMAGEALIGN_RIGHT_TOP, IMAGEALIGN_RIGHT_BOTTOM, + IMAGEALIGN_BOTTOM_LEFT, IMAGEALIGN_BOTTOM_RIGHT, IMAGEALIGN_CENTER }; +enum SymbolAlign { SYMBOLALIGN_LEFT, SYMBOLALIGN_RIGHT }; + +// ------------ +// - TriState - +// ------------ + +// By changes you must also change: rsc/vclrsc.hxx +enum TriState { STATE_NOCHECK, STATE_CHECK, STATE_DONTKNOW }; + + +// ---------------------- +// - ButtonDialog-Types - +// ---------------------- + +typedef USHORT StandardButtonType; +#define BUTTON_OK ((StandardButtonType)0) +#define BUTTON_CANCEL ((StandardButtonType)1) +#define BUTTON_YES ((StandardButtonType)2) +#define BUTTON_NO ((StandardButtonType)3) +#define BUTTON_RETRY ((StandardButtonType)4) +#define BUTTON_HELP ((StandardButtonType)5) +#define BUTTON_CLOSE ((StandardButtonType)6) +#define BUTTON_MORE ((StandardButtonType)7) +#define BUTTON_IGNORE ((StandardButtonType)8) +#define BUTTON_ABORT ((StandardButtonType)9) +#define BUTTON_LESS ((StandardButtonType)10) +#define BUTTON_COUNT 11 + +#endif // _TOOLS_WINTYPES_HXX + diff --git a/tools/prj/d.lst b/tools/prj/d.lst index e8fde61686a4..3208ecbb3168 100644 --- a/tools/prj/d.lst +++ b/tools/prj/d.lst @@ -34,7 +34,11 @@ mkdir: %_DEST%\inc%_EXT%\bootstrp ..\inc\tools\postx.h %_DEST%\inc%_EXT%\tools\postx.h ..\inc\tools\prex.h %_DEST%\inc%_EXT%\tools\prex.h -..\inc\tools\agapi.hxx %_DEST%\inc%_EXT%\tools\agapi.hxx +..\inc\tools\solarmutex.hxx %_DEST%\inc%_EXT%\tools\solarmutex.hxx +..\inc\tools\wintypes.hxx %_DEST%\inc%_EXT%\tools\wintypes.hxx +..\inc\tools\mapunit.hxx %_DEST%\inc%_EXT%\tools\mapunit.hxx +..\inc\tools\fldunit.hxx %_DEST%\inc%_EXT%\tools\fldunit.hxx +..\inc\tools\fontenum.hxx %_DEST%\inc%_EXT%\tools\fontenum.hxx ..\inc\tools\agapi.hxx %_DEST%\inc%_EXT%\tools\agapi.hxx ..\inc\tools\agitem.hxx %_DEST%\inc%_EXT%\tools\agitem.hxx ..\inc\tools\appendunixshellword.hxx %_DEST%\inc%_EXT%\tools\appendunixshellword.hxx diff --git a/tools/qa/makefile.mk b/tools/qa/makefile.mk index 15f9c6a9fdaf..c63aa966b7fc 100644 --- a/tools/qa/makefile.mk +++ b/tools/qa/makefile.mk @@ -40,7 +40,7 @@ DLLPRE = # no leading "lib" on .so files SHL1TARGET = test_pathutils SHL1OBJS = $(SLO)$/test_pathutils.obj $(SLO)$/pathutils.obj -SHL1STDLIBS = $(CPPUNITLIB) $(SALLIB) +SHL1STDLIBS = $(CPPUNITLIB) $(SALLIB) $(TESTSHL2LIB) SHL1VERSIONMAP = version.map SHL1IMPLIB = i$(SHL1TARGET) DEF1NAME = $(SHL1TARGET) @@ -52,4 +52,4 @@ SLOFILES = $(SHL1OBJS) ALLTAR: test test .PHONY: $(SHL1TARGETN) - testshl2 $(SHL1TARGETN) -forward $(BIN)$/$(TARGET).rdb + $(TESTSHL2) $(SHL1TARGETN) -forward $(BIN)$/$(TARGET).rdb diff --git a/tools/qa/test_pathutils.cxx b/tools/qa/test_pathutils.cxx index 9cd4e2110937..c028a2f654c4 100644 --- a/tools/qa/test_pathutils.cxx +++ b/tools/qa/test_pathutils.cxx @@ -33,7 +33,7 @@ #include -#include "cppunit/simpleheader.hxx" +#include "testshl/simpleheader.hxx" #include "tools/pathutils.hxx" namespace { diff --git a/tools/source/datetime/tdate.cxx b/tools/source/datetime/tdate.cxx index 7f204d5e46da..5f0d7f3ebe1d 100644 --- a/tools/source/datetime/tdate.cxx +++ b/tools/source/datetime/tdate.cxx @@ -88,7 +88,7 @@ inline USHORT DaysInMonth( USHORT nMonth, USHORT nYear ) // ----------------------------------------------------------------------- -static long DateToDays( USHORT nDay, USHORT nMonth, USHORT nYear ) +long Date::DateToDays( USHORT nDay, USHORT nMonth, USHORT nYear ) { long nDays; @@ -489,9 +489,9 @@ Date operator -( const Date& rDate, long nDays ) long operator -( const Date& rDate1, const Date& rDate2 ) { - ULONG nTempDays1 = DateToDays( rDate1.GetDay(), rDate1.GetMonth(), + ULONG nTempDays1 = Date::DateToDays( rDate1.GetDay(), rDate1.GetMonth(), rDate1.GetYear() ); - ULONG nTempDays2 = DateToDays( rDate2.GetDay(), rDate2.GetMonth(), + ULONG nTempDays2 = Date::DateToDays( rDate2.GetDay(), rDate2.GetMonth(), rDate2.GetYear() ); return nTempDays1 - nTempDays2; } diff --git a/tools/source/fsys/urlobj.cxx b/tools/source/fsys/urlobj.cxx index e3484aee4e2d..f7ffed5e4dd1 100644 --- a/tools/source/fsys/urlobj.cxx +++ b/tools/source/fsys/urlobj.cxx @@ -407,7 +407,7 @@ static INetURLObject::SchemeInfo const aSchemeInfoMap[INET_PROT_END] { "out", "out://", 0, true, false, false, false, false, false, false, false }, { "vnd.sun.star.wfs", "vnd.sun.star.wfs://", 0, true, false, false, - false, true, false, true, false }, + false, true, true, true, false }, { "vnd.sun.star.hier", "vnd.sun.star.hier:", 0, true, false, false, false, false, false, true, false }, { "vim", "vim://", 0, true, true, false, true, false, false, true, @@ -1523,8 +1523,15 @@ bool INetURLObject::convertRelToAbs(rtl::OUString const & rTheRelURIRef, else if (pEnd - q >= 2 && q[0] == '\\' && q[1] == '\\') { q += 2; - if (scanDomain(q, pEnd) > 0 && (q == pEnd || *q == '\\')) + sal_Int32 n = rtl_ustr_indexOfChar_WithLength( + q, pEnd - q, '\\'); + sal_Unicode const * qe = n == -1 ? pEnd : q + n; + if (parseHostOrNetBiosName( + q, qe, bOctets, ENCODE_ALL, RTL_TEXTENCODING_DONTKNOW, + true, NULL)) + { bFSys = true; // 1st + } } if (bFSys) { @@ -4818,9 +4825,8 @@ bool INetURLObject::setFSysPath(rtl::OUString const & rFSysPath, break; } - rtl::OUStringBuffer aSynAbsURIRef( - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file://"), - RTL_TEXTENCODING_ASCII_US)); + rtl::OUStringBuffer aSynAbsURIRef(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("file://"))); + switch (eStyle) { case FSYS_VOS: diff --git a/tools/source/fsys/wntmsc.cxx b/tools/source/fsys/wntmsc.cxx index 0e8e5ebc7918..153fbf37de2e 100644 --- a/tools/source/fsys/wntmsc.cxx +++ b/tools/source/fsys/wntmsc.cxx @@ -91,7 +91,7 @@ struct dirent *readdir( DIR *pDir ) pDir->h = FindFirstFile( pBuf, &pDir->aDirEnt ); bOk = pDir->h != INVALID_HANDLE_VALUE; pDir->p = NULL; - delete pBuf; + delete [] pBuf; } else pDir->h = INVALID_HANDLE_VALUE; diff --git a/tools/source/generic/line.cxx b/tools/source/generic/line.cxx index 5e698d50c006..d86ff82cb739 100644 --- a/tools/source/generic/line.cxx +++ b/tools/source/generic/line.cxx @@ -39,11 +39,6 @@ #include #include -inline long FRound( double fVal ) -{ - return( fVal > 0.0 ? (long) ( fVal + 0.5 ) : -(long) ( -fVal + 0.5 ) ); -} - // -------- // - Line - // -------- diff --git a/tools/source/generic/makefile.mk b/tools/source/generic/makefile.mk index 9562999bd5d7..6340e4daae08 100644 --- a/tools/source/generic/makefile.mk +++ b/tools/source/generic/makefile.mk @@ -39,10 +39,6 @@ TARGET=gen .INCLUDE : settings.mk .INCLUDE : $(PRJ)$/util$/makefile.pmk -.IF "$(WITH_GPC)"!="NO" -CDEFS+=-DHAVE_GPC_H -.ENDIF - # --- Files -------------------------------------------------------- EXCEPTIONSFILES = $(SLO)$/poly.obj $(OBJ)$/poly.obj diff --git a/tools/source/generic/poly.cxx b/tools/source/generic/poly.cxx index 5cca29b3066e..7f1eb94b646d 100644 --- a/tools/source/generic/poly.cxx +++ b/tools/source/generic/poly.cxx @@ -957,59 +957,6 @@ void Polygon::Optimize( ULONG nOptimizeFlags, const PolyOptimizeData* pData ) } } -// ----------------------------------------------------------------------- - -void Polygon::GetSimple( Polygon& rResult ) const -{ - if( !mpImplPolygon->mpFlagAry ) - rResult = *this; - else - { - ::std::vector< Point > aPointVector; - - for( USHORT i = 0, nCount = GetSize(); i < nCount; ) - { - if( ( ( i + 3 ) < nCount ) && - ( POLY_NORMAL == mpImplPolygon->mpFlagAry[ i ] ) && - ( POLY_CONTROL == mpImplPolygon->mpFlagAry[ i + 1 ] ) && - ( POLY_CONTROL == mpImplPolygon->mpFlagAry[ i + 2 ] ) && - ( POLY_NORMAL == mpImplPolygon->mpFlagAry[ i + 3 ] ) ) - { - const USHORT nSegmentPoints = 25; - const Polygon aSegmentPoly( mpImplPolygon->mpPointAry[ i ], mpImplPolygon->mpPointAry[ i + 1 ], - mpImplPolygon->mpPointAry[ i + 3 ], mpImplPolygon->mpPointAry[ i + 2 ], - nSegmentPoints ); - const USHORT nSegmentSize = aSegmentPoly.GetSize(); - - if( nSegmentSize ) - { - const Point* pPointArray = aSegmentPoly.mpImplPolygon->mpPointAry; - const Point* pCur = pPointArray; - const Point* pLast; - - aPointVector.push_back( *( pLast = pCur ) ); - - for( USHORT j = 1; j < nSegmentSize; j++ ) - if( *( pCur = pPointArray + j ) != *pLast ) - aPointVector.push_back( *( pLast = pCur ) ); - } - - i += 3; - } - else - aPointVector.push_back( mpImplPolygon->mpPointAry[ i++ ] ); - } - - // fill result polygon - rResult = Polygon( (USHORT)aPointVector.size() ); - ::std::vector< Point >::iterator aIter( aPointVector.begin() ), aEnd( aPointVector.end() ); - Point* pPointArray = rResult.mpImplPolygon->mpPointAry; - USHORT nPoints = rResult.mpImplPolygon->mnPoints; - while( nPoints-- && aIter != aEnd ) - *pPointArray++ = *aIter++; - } -} - // ======================================================================= /* Recursively subdivide cubic bezier curve via deCasteljau. diff --git a/tools/source/generic/poly2.cxx b/tools/source/generic/poly2.cxx index a560c961f481..692e47a9d1d2 100644 --- a/tools/source/generic/poly2.cxx +++ b/tools/source/generic/poly2.cxx @@ -33,17 +33,10 @@ #define _SV_POLY2_CXX -extern "C" -{ -#if defined (HAVE_GPC_H) && !defined (__gpc_h) -# include -#else -# define GPC_INT 0 -# define GPC_UNION 1 -# define GPC_DIFF 2 -# define GPC_XOR 3 -#endif // HAVE_GPC_H -} +#define POLY_CLIP_INT 0 +#define POLY_CLIP_UNION 1 +#define POLY_CLIP_DIFF 2 +#define POLY_CLIP_XOR 3 #include #include @@ -353,23 +346,6 @@ void PolyPolygon::Optimize( ULONG nOptimizeFlags, const PolyOptimizeData* pData // ----------------------------------------------------------------------- -void PolyPolygon::GetSimple( PolyPolygon& rResult ) const -{ - DBG_CHKTHIS( PolyPolygon, NULL ); - - rResult.Clear(); - - Polygon aPolygon; - - for( USHORT i = 0; i < mpImplPolyPolygon->mnCount; i++ ) - { - mpImplPolyPolygon->mpPolyAry[ i ]->GetSimple( aPolygon ); - rResult.Insert( aPolygon ); - } -} - -// ----------------------------------------------------------------------- - void PolyPolygon::AdaptiveSubdivide( PolyPolygon& rResult, const double d ) const { DBG_CHKTHIS( PolyPolygon, NULL ); @@ -389,113 +365,32 @@ void PolyPolygon::AdaptiveSubdivide( PolyPolygon& rResult, const double d ) cons void PolyPolygon::GetIntersection( const PolyPolygon& rPolyPoly, PolyPolygon& rResult ) const { - ImplDoOperation( rPolyPoly, rResult, GPC_INT ); + ImplDoOperation( rPolyPoly, rResult, POLY_CLIP_INT ); } // ----------------------------------------------------------------------- void PolyPolygon::GetUnion( const PolyPolygon& rPolyPoly, PolyPolygon& rResult ) const { - ImplDoOperation( rPolyPoly, rResult, GPC_UNION ); + ImplDoOperation( rPolyPoly, rResult, POLY_CLIP_UNION ); } // ----------------------------------------------------------------------- void PolyPolygon::GetDifference( const PolyPolygon& rPolyPoly, PolyPolygon& rResult ) const { - ImplDoOperation( rPolyPoly, rResult, GPC_DIFF ); + ImplDoOperation( rPolyPoly, rResult, POLY_CLIP_DIFF ); } // ----------------------------------------------------------------------- void PolyPolygon::GetXOR( const PolyPolygon& rPolyPoly, PolyPolygon& rResult ) const { - ImplDoOperation( rPolyPoly, rResult, GPC_XOR ); + ImplDoOperation( rPolyPoly, rResult, POLY_CLIP_XOR ); } // ----------------------------------------------------------------------- -#ifdef HAVE_GPC_H - -void* PolyPolygon::ImplCreateGPCPolygon() const -{ - gpc_polygon* pRet = new gpc_polygon; - - pRet->num_contours = 0; - pRet->hole = NULL; - pRet->contour = NULL; - - for( USHORT i = 0, nCount = Count(); i < nCount; i++ ) - { - const Polygon& rPoly = GetObject( i ); - const USHORT nSize = rPoly.GetSize(); - - if( nSize > 1 ) - { - gpc_vertex_list aVertexList; - gpc_vertex* pVertex; - - aVertexList.num_vertices = nSize; - aVertexList.vertex = pVertex = new gpc_vertex[ nSize ]; - - for( USHORT nPos = 0; nPos < nSize; nPos++, pVertex++ ) - { - const Point& rPoint = rPoly[ nPos ]; - pVertex->x = rPoint.X(); - pVertex->y = rPoint.Y(); - } - - gpc_add_contour( pRet, &aVertexList, 0 ); - delete[] aVertexList.vertex; - } - } - - return pRet; -} - -// ----------------------------------------------------------------------- - -void PolyPolygon::ImplDoOperation( const PolyPolygon& rPolyPoly, PolyPolygon& rResult, ULONG nOperation ) const -{ - gpc_polygon* pGPCPoly1 = (gpc_polygon*) ImplCreateGPCPolygon(); - gpc_polygon* pGPCPoly2 = (gpc_polygon*) rPolyPoly.ImplCreateGPCPolygon(); - gpc_polygon* pResult = new gpc_polygon; - - pResult->num_contours = 0; - pResult->hole = NULL; - pResult->contour = NULL; - - gpc_polygon_clip( (gpc_op) nOperation, pGPCPoly1, pGPCPoly2, pResult ); - - rResult.Clear(); - - for( int i = 0; i < pResult->num_contours; i++ ) - { - gpc_vertex_list& rVertexList = pResult->contour[ i ]; - Polygon aPoly( ::sal::static_int_cast< USHORT >( rVertexList.num_vertices ) ); - - for( int j = 0; j < rVertexList.num_vertices; j++ ) - { - Point& rPt = aPoly[ ::sal::static_int_cast< USHORT >( j ) ]; - rPt.X() = FRound( rVertexList.vertex[ j ].x ); - rPt.Y() = FRound( rVertexList.vertex[ j ].y ); - } - - rResult.Insert( aPoly ); - } - - gpc_free_polygon( pGPCPoly1 ); - delete pGPCPoly1; - - gpc_free_polygon( pGPCPoly2 ); - delete pGPCPoly2; - - gpc_free_polygon( pResult ); - delete pResult; -} - -#else - void PolyPolygon::ImplDoOperation( const PolyPolygon& rPolyPoly, PolyPolygon& rResult, ULONG nOperation ) const { // Convert to B2DPolyPolygon, temporarily. It might be @@ -514,21 +409,21 @@ void PolyPolygon::ImplDoOperation( const PolyPolygon& rPolyPoly, PolyPolygon& rR // All code extracted from svx/source/svdraw/svedtv2.cxx // ----------------------------------------------------- - case GPC_UNION: + case POLY_CLIP_UNION: { // merge A and B (OR) aMergePolyPolygonA = basegfx::tools::solvePolygonOperationOr(aMergePolyPolygonA, aMergePolyPolygonB); break; } - case GPC_DIFF: + case POLY_CLIP_DIFF: { // substract B from A (DIFF) aMergePolyPolygonA = basegfx::tools::solvePolygonOperationDiff(aMergePolyPolygonA, aMergePolyPolygonB); break; } - case GPC_XOR: + case POLY_CLIP_XOR: { // compute XOR between poly A and B aMergePolyPolygonA = basegfx::tools::solvePolygonOperationXor(aMergePolyPolygonA, aMergePolyPolygonB); @@ -536,7 +431,7 @@ void PolyPolygon::ImplDoOperation( const PolyPolygon& rPolyPoly, PolyPolygon& rR } default: - case GPC_INT: + case POLY_CLIP_INT: { // cut poly 1 against polys 2..n (AND) aMergePolyPolygonA = basegfx::tools::solvePolygonOperationAnd(aMergePolyPolygonA, aMergePolyPolygonB); @@ -547,8 +442,6 @@ void PolyPolygon::ImplDoOperation( const PolyPolygon& rPolyPoly, PolyPolygon& rR rResult = PolyPolygon( aMergePolyPolygonA ); } -#endif // HAVE_GPC_H - // ----------------------------------------------------------------------- USHORT PolyPolygon::Count() const diff --git a/tools/source/memtools/table.cxx b/tools/source/memtools/table.cxx index ba0dbb8a90f9..75aafddb6c58 100644 --- a/tools/source/memtools/table.cxx +++ b/tools/source/memtools/table.cxx @@ -125,26 +125,37 @@ BOOL Table::Insert( ULONG nKey, void* p ) { USHORT n = 0; USHORT nTempCount = (USHORT)nCount * 2; - void** pNodes = Container::ImpGetOnlyNodes(); - ULONG nCompareKey = (ULONG)(*pNodes); - while ( nKey > nCompareKey ) + //Modified by PengYunQuan for resolving a NULL pointer access } else { diff --git a/tools/source/misc/makefile.mk b/tools/source/misc/makefile.mk index 7742c471445f..adc098b023b8 100644 --- a/tools/source/misc/makefile.mk +++ b/tools/source/misc/makefile.mk @@ -42,9 +42,10 @@ LIB1TARGET = $(SLB)$/$(TARGET).lib LIB1OBJFILES = \ $(SLO)$/appendunixshellword.obj \ $(SLO)$/extendapplicationenvironment.obj \ + $(SLO)$/solarmutex.obj \ $(SLO)$/getprocessworkingdir.obj OBJFILES = $(OBJ)$/pathutils.obj -SLOFILES = $(SLO)$/pathutils.obj $(LIB1OBJFILES) +SLOFILES = $(SLO)$/pathutils.obj $(LIB1OBJFILES) $(SLO)$/solarmutex.obj .INCLUDE: target.mk diff --git a/svtools/source/misc1/loginerr.cxx b/tools/source/misc/solarmutex.cxx similarity index 67% rename from svtools/source/misc1/loginerr.cxx rename to tools/source/misc/solarmutex.cxx index b9802a8be535..9049c13997a9 100644 --- a/svtools/source/misc1/loginerr.cxx +++ b/tools/source/misc/solarmutex.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: loginerr.cxx,v $ - * $Revision: 1.6 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -29,17 +26,35 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#ifndef GCC -#endif +#include "precompiled_tools.hxx" +#include -#include +namespace tools +{ + static ::vos::IMutex* pSolarMutex = 0; -//============================================================================ -// -// CntLoginErrorHint Implementation. -// -//============================================================================ + ::vos::IMutex* SolarMutex::GetSolarMutex() + { + return pSolarMutex; + } -TYPEINIT1( CntLoginErrorHint, SfxHint ); + void SolarMutex::SetSolarMutex( ::vos::IMutex* pMutex ) + { + pSolarMutex = pMutex; + } + bool SolarMutex::Acquire() + { + if ( pSolarMutex ) + pSolarMutex->acquire(); + else + return false; + return true; + } + + void SolarMutex::Release() + { + if ( pSolarMutex ) + pSolarMutex->release(); + } +} diff --git a/tools/source/stream/strmunx.cxx b/tools/source/stream/strmunx.cxx index 538c02e78fde..d27fe1f7f2c0 100644 --- a/tools/source/stream/strmunx.cxx +++ b/tools/source/stream/strmunx.cxx @@ -745,7 +745,7 @@ void SvFileStream::Open( const String& rFilename, StreamMode nOpenMode ) aFileCopier.Execute(); } } - delete pBuf; + delete [] pBuf; } } } diff --git a/tools/test/makefile.mk b/tools/test/makefile.mk index 63108677829c..22796f47d72f 100644 --- a/tools/test/makefile.mk +++ b/tools/test/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -48,19 +48,20 @@ SHL1OBJS= \ SHL1TARGET= tests SHL1STDLIBS= $(SALLIB) \ $(TOOLSLIB) \ + $(TESTSHL2LIB) \ $(CPPUNITLIB) SHL1IMPLIB= i$(SHL1TARGET) DEF1NAME =$(SHL1TARGET) -SHL1VERSIONMAP = export.map +SHL1VERSIONMAP = export.map #------------------------------- All object files ---------------------------- # do this here, so we get right dependencies -SLOFILES=$(SHL1OBJS) +SLOFILES=$(SHL1OBJS) # --- Targets ------------------------------------------------------ .INCLUDE : target.mk -.INCLUDE : _cppunit.mk +.INCLUDE : _cppunit.mk diff --git a/tools/test/tests.cxx b/tools/test/tests.cxx index 913bd444f145..a2bfb63d4c5f 100644 --- a/tools/test/tests.cxx +++ b/tools/test/tests.cxx @@ -33,7 +33,7 @@ #include "precompiled_tools.hxx" // autogenerated file with codegen.pl -#include +#include #include #include diff --git a/tools/util/makefile.mk b/tools/util/makefile.mk index 546ef29a449a..d9ba720543e3 100644 --- a/tools/util/makefile.mk +++ b/tools/util/makefile.mk @@ -113,13 +113,6 @@ SHL1IMPLIB= itools SHL1USE_EXPORTS=name SHL1STDLIBS+= $(SALLIB) $(VOSLIB) $(BASEGFXLIB) $(I18NISOLANGLIB) $(COMPHELPERLIB) -.IF "$(WITH_LIBART)"=="YES" -SHL1STDLIBS+= $(LIBART_LIBS) -.ELSE -SHL1STDLIBS+= $(GPC3RDLIB) -.ENDIF - - .IF "$(GUI)"=="WNT" SHL1STDLIBS+= $(SHELL32LIB) \ $(MPRLIB) \ diff --git a/tools/workben/solar.c b/tools/workben/solar.c index 91460614fe9b..05e9c103b8b4 100644 --- a/tools/workben/solar.c +++ b/tools/workben/solar.c @@ -352,6 +352,8 @@ void Description_Print( struct Description* pThis, char* name ) fprintf( f, "#define __SIZEOFDOUBLE\t%d\n", sizeof( double ) ); fprintf( f, "#define __IEEEDOUBLE\n" ); fprintf( f, "#define _SOLAR_NODESCRIPTION\n" ); + + fclose(f); } int diff --git a/tools/workben/urltest.cxx b/tools/workben/urltest.cxx index 542297eb4bd6..a232f8ebdd93 100644 --- a/tools/workben/urltest.cxx +++ b/tools/workben/urltest.cxx @@ -799,6 +799,25 @@ main() bSuccess = false; } } + { + bool bWasAbsolute; + if (!rtl::OUString(INetURLObject(rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "file:///"))). + smartRel2Abs( + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM( + "\\\\unc_host\\path")), + bWasAbsolute). + GetMainURL(INetURLObject::NO_DECODE)). + equalsAsciiL( + RTL_CONSTASCII_STRINGPARAM("file://unc_host/path")) + || !bWasAbsolute) + { + printf("BAD smartRel2Abs(\"\\\\unc_host\\path\")\n"); + bSuccess = false; + } + } } if (true) diff --git a/transex3/inc/export.hxx b/transex3/inc/export.hxx index 89c1cf548947..ec5195034e91 100644 --- a/transex3/inc/export.hxx +++ b/transex3/inc/export.hxx @@ -51,6 +51,12 @@ #include /* std::set*/ #include /* std::vector*/ #include +#include + +#include +#ifdef WNT +#include +#endif #define NO_TRANSLATE_ISO "x-no-translate" @@ -326,7 +332,6 @@ public: static bool skipProject( ByteString sPrj ) ; - static ByteString sIsoCode99; static void InitLanguages( bool bMergeMode = false ); static void InitForcedLanguages( bool bMergeMode = false ); static std::vector GetLanguages(); @@ -349,12 +354,12 @@ public: static bool isSourceLanguage( const ByteString &sLanguage ); static bool isAllowed( const ByteString &sLanguage ); - //static bool isMergingGermanAllowed( const ByteString& rPrj ); static bool LanguageAllowed( const ByteString &nLanguage ); static void Languages( std::vector::const_iterator& begin , std::vector::const_iterator& end ); static void getRandomName( const ByteString& sPrefix , ByteString& sRandStr , const ByteString& sPostfix ); static void getRandomName( ByteString& sRandStr ); + static void getCurrentDir( std::string& dir ); static void replaceEncoding( ByteString& rString ); @@ -510,13 +515,13 @@ private: SvFileStream aErrLog; ByteStringSet aLanguageSet; MergeDataHashMap aMap; - std::vector aLanguages; + ByteStringHashMap aLanguageMap; + std::vector aLanguageList; + ByteStringHashMap aFilenames; public: MergeDataFile( const ByteString &rFileName, const ByteString& rFile , BOOL bErrLog, CharSet aCharSet, bool bCaseSensitive = false ); -// MergeDataFile( const ByteString &rFileName, const ByteString& rFile , BOOL bErrLog, CharSet aCharSet -// ); ~MergeDataFile(); @@ -536,7 +541,6 @@ public: static ByteString CreateKey( const ByteString& rTYP , const ByteString& rGID , const ByteString& rLID , const ByteString& rFilename , bool bCaseSensitive = false ); ByteString Dump(); -// void WriteErrorLog( const ByteString &rFileName ); void WriteError( const ByteString &rLine ); }; diff --git a/transex3/source/gsicheck.hxx b/transex3/inc/gsicheck.hxx similarity index 100% rename from transex3/source/gsicheck.hxx rename to transex3/inc/gsicheck.hxx diff --git a/transex3/inc/inireader.hxx b/transex3/inc/inireader.hxx new file mode 100644 index 000000000000..0861290adf9f --- /dev/null +++ b/transex3/inc/inireader.hxx @@ -0,0 +1,52 @@ +#include +#include +#include + +using namespace std; + +namespace transex3 +{ + +struct eqstr +{ + bool operator()( const string s1 , const string s2) const + { + return s1.compare( s2 ) == 0; + } +}; + +typedef std::hash_map< string , string > stringmap; +typedef std::hash_map< string, stringmap* > INImap; + +class INIreader +{ + private: + UErrorCode section_status; + UErrorCode parameter_status; + RegexMatcher* section_match; + RegexMatcher* parameter_match; + + public: + INIreader(): section_status ( U_ZERO_ERROR ) , + parameter_status ( U_ZERO_ERROR ) + { + section_match = new RegexMatcher ( "^\\s*\\[([a-zA-Z0-9]*)\\].*" , 0 , section_status ); + parameter_match = new RegexMatcher ( "^\\s*([a-zA-Z0-9]*)\\s*=\\s*([a-zA-Z0-9 ]*).*" , 0 , parameter_status ) ; + } + ~INIreader() + { + delete section_match; + delete parameter_match; + } + // open "filename", fill hash_map with sections / paramaters + bool read( INImap& myMap , string& filename ); + + private: + bool is_section( string& line , string& section_str ); + bool is_parameter( string& line , string& parameter_key , string& parameter_value ); + inline void check_status( UErrorCode status ); + inline void toStlString ( const UnicodeString& str, string& stl_str ); + inline void trim( string& str ); +}; + +} diff --git a/transex3/inc/treeconfig.hxx b/transex3/inc/treeconfig.hxx new file mode 100644 index 000000000000..96d693b0d376 --- /dev/null +++ b/transex3/inc/treeconfig.hxx @@ -0,0 +1,28 @@ +#include +#include + +#include "inireader.hxx" + +namespace transex3{ + +class Treeconfig +{ + + private: + INIreader inireader; + INImap map; + bool has_config_file; + void getCurrentDir( string& dir ); + bool isConfigFilePresent(); + + public: + + Treeconfig() : has_config_file( false ) { parseConfig(); } + // read the config file, returns true in case a config file had been found + bool parseConfig(); + // returns a string vector containing all active repositories, returns true in case we are deep inside + // of a source tree. This could affect the behavour of the tool + bool getActiveRepositories( vector& active_repos); +}; + +} diff --git a/transex3/inc/xmlparse.hxx b/transex3/inc/xmlparse.hxx index a497355d6201..18b047ef75c1 100644 --- a/transex3/inc/xmlparse.hxx +++ b/transex3/inc/xmlparse.hxx @@ -32,11 +32,7 @@ #define BOOTSTRP_XMLPARSE_HXX #include -#ifdef SYSTEM_EXPAT #include -#else -#include -#endif #include #include #include "tools/string.hxx" diff --git a/transex3/prj/build.lst b/transex3/prj/build.lst index 91a5056acce3..0017471af134 100644 --- a/transex3/prj/build.lst +++ b/transex3/prj/build.lst @@ -1,7 +1,10 @@ -tr transex3 : tools NULL +tr transex3 : tools libxslt berkeleydb LUCENE:lucene NULL tr transex3 usr1 - all tr_mkout NULL tr transex3\inc nmake - all tr_inc NULL tr transex3\source nmake - all tr_src tr_inc NULL tr transex3\layout nmake - all rt_layout tr_src tr_inc NULL tr transex3\java\l10nconv nmake - all tr_conv NULL tr transex3\java\receditor nmake - all tr_rece NULL +tr transex3\source\help nmake - all tr_bla_help NULL +tr transex3\source\filter\utils nmake - all tr_bla_utils NULL +tr transex3\source\filter\merge nmake - all tr_bla_merge tr_bla_utils NULL diff --git a/transex3/prj/d.lst b/transex3/prj/d.lst index 7bd8e7d3e72d..a469837275ed 100644 --- a/transex3/prj/d.lst +++ b/transex3/prj/d.lst @@ -1,4 +1,10 @@ mkdir: %_DEST%\inc%_EXT%\transex3 +mkdir: %_DEST%\bin%_EXT% +mkdir: %_DEST%\bin%_EXT%\help +mkdir: %_DEST%\bin%_EXT%\help\com +mkdir: %_DEST%\bin%_EXT%\help\com\sun +mkdir: %_DEST%\bin%_EXT%\help\com\sun\star +mkdir: %_DEST%\bin%_EXT%\help\com\sun\star\help ..\%__SRC%\bin\cfgex.exe %_DEST%\bin%_EXT%\cfgex.exe ..\%__SRC%\bin\cfgex %_DEST%\bin%_EXT%\cfgex @@ -20,6 +26,14 @@ mkdir: %_DEST%\inc%_EXT%\transex3 ..\%__SRC%\bin\txtconv %_DEST%\bin%_EXT%\txtconv ..\%__SRC%\bin\tralay.exe %_DEST%\bin%_EXT%\tralay.exe ..\%__SRC%\bin\tralay %_DEST%\bin%_EXT%\tralay +..\%__SRC%\bin\ulfconv %_DEST%\bin%_EXT%\ulfconv +..\%__SRC%\class\FCFGMerge.jar %_DEST%\bin%_EXT%\FCFGMerge.jar +..\%__SRC%\class\HelpIndexerTool.jar %_DEST%\bin%_EXT%\HelpIndexerTool.jar +..\%__SRC%\bin\HelpLinker %_DEST%\bin%_EXT%\HelpLinker +..\%__SRC%\bin\HelpCompiler %_DEST%\bin%_EXT%\HelpCompiler +..\%__SRC%\bin\HelpCompiler.exe %_DEST%\bin%_EXT%\HelpCompiler.exe +..\%__SRC%\bin\HelpLinker.exe %_DEST%\bin%_EXT%\HelpLinker.exe +..\%__SRC%\bin\HelpLinker* %_DEST%\bin%_EXT% ..\%__SRC%\class\converter\converter.jar %_DEST%\bin%_EXT%\converter.jar ..\%__SRC%\doc\converter_javadoc.zip %_DEST%\bin%_EXT%\converter_javadoc.zip @@ -27,7 +41,10 @@ mkdir: %_DEST%\inc%_EXT%\transex3 ..\%__SRC%\class\receditor\receditor.jar %_DEST%\bin%_EXT%\receditor.jar ..\scripts\localize.pl %_DEST%\bin%_EXT%\localize.pl +..\scripts\localize_old.pl %_DEST%\bin%_EXT%\localize_old.pl ..\scripts\localize %_DEST%\bin%_EXT%\localize +..\scripts\fast_merge.pl %_DEST%\bin%_EXT%\fast_merge.pl +..\scripts\keyidGen.pl %_DEST%\bin%_EXT%\keyidGen.pl ..\inc\export.hxx %_DEST%\inc%_EXT%\transex3\export.hxx ..\inc\transex3\directory.hxx %_DEST%\inc%_EXT%\transex3\directory.hxx @@ -37,3 +54,8 @@ mkdir: %_DEST%\inc%_EXT%\transex3 ..\inc\utf8conv.hxx %_DEST%\inc%_EXT%\transex3\utf8conv.hxx ..\%__SRC%\lib\transex.lib %_DEST%\lib%_EXT%\transex.lib ..\%__SRC%\lib\libtransex.a %_DEST%\lib%_EXT%\libtransex.a + +..\source\help\compilehelp.hxx %_DEST%\inc%_EXT%\transex3\compilehelp.hxx +#..\source\help\helplinkerdllapi.h %_DEST%\inc%_EXT%\transex3\helplinkerdllapi.h +..\%__SRC%\lib\* %_DEST%\lib%_EXT%\* +..\%__SRC%\class\com\sun\star\help\* %_DEST%\bin%_EXT%\help\com\sun\star\help\* diff --git a/transex3/scripts/fast_merge.pl b/transex3/scripts/fast_merge.pl new file mode 100644 index 000000000000..7321a9a42911 --- /dev/null +++ b/transex3/scripts/fast_merge.pl @@ -0,0 +1,348 @@ +: +eval 'exec perl -wS $0 ${1+"$@"}' + if 0; +#************************************************************************* +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: fast_merge.pl,v $ +# +# $Revision: 1.1.2.2 $ +# +# last change: $Author: ihi $ $Date: 2007/07/20 10:37:53 $ +# +# The Contents of this file are made available subject to +# the terms of GNU Lesser General Public License Version 2.1. +# +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2005 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +#************************************************************************* + +use strict; +use Class::Struct; +use Getopt::Long; +use File::Temp; +use File::Path; + +my @files; +my @file_names; +my $module_name = ''; +my @current; +my @buffer; +my $last_file; +my $last_path; +my $last_localize_file; +my $first_run = "1"; +my $sdf_filename; +my $merge_dir; +my $WIN; +my $state = "none"; + +if ( defined $ENV{USE_SHELL} && $ENV{USE_SHELL} eq '4nt' ) { $WIN = 'TRUE'; } +else { $WIN = ''; } + +$SIG{INT} = 'inthandler'; +$SIG{QUIT} = 'quithandler'; + +struct ( sdf_obj => +{ + module => '$', + file => '$', + dir => '$', + FILEHANDLE => '$', + line => '$', + endoffile => '$' +} +); + +parse_options(); +my $lock_file = $merge_dir."/lock.mk"; +$lock_file =~ s/\//\\/g , if ( $WIN ) ; +acquire_lock(); +read_sdf_file_names(); +init(); +my $reference; +my $path ; +my $localize_file; +while( hasLines() ) +{ + @current = (); + foreach ( @files ) + { + push @current , $_; + } + + $reference = getNextIdentifier( ); + + @current = (); + foreach ( @files ) + { + if( $_->module eq $reference->module && $_->dir eq $reference->dir ) + { + push @current , $_ ; + } + } + write_lines(); +} +if( $#current+1 ne 0 ) +{ + ( $path , $localize_file ) = make_paths(); + add_to_buffer(); + write_buffer( $path , $localize_file ); +} +release_lock(); +exit( 0 ); + +########################################################################################## +sub acquire_lock +{ + if( -e $lock_file ){ + $state = "blocked"; + print "WARNING: Lock file '$lock_file' 'found, waiting ....\n"; + my $cnt = 0; + sleep 10 , while( -e $lock_file && $cnt++ < 180 ); + exit( 0 ); + }else + { + $state = "locked"; + print "Writing lock file '$lock_file'\n"; + open FILE, ">$lock_file" or die "Can't create lock file '$lock_file'"; + print FILE "L10N_LOCK=YES" ; + close ( FILE ); + } +} +sub release_lock +{ + print "Deleting lock file '$lock_file'\n"; + unlink $lock_file, if( -e $lock_file ); + $state = "none"; +} +sub inthandler +{ + release_lock() , if( $state eq "locked" ); + exit( -1 ); +} +sub quithandler +{ + release_lock() , if( $state eq "locked" ); + exit( 0 ); +} + +sub init +{ + foreach my $file ( @file_names ) + { + my $obj = new sdf_obj; + open my $FILEHANDLE , "<$file" or die "Can't open file '$file'"; + $obj->FILEHANDLE ( $FILEHANDLE ) ; + getNextSdfObj( $obj ); + push @files, $obj ; + print "Open file '$file'\n"; + } +} + +# get the next module/file +sub getNextIdentifier +{ + my @sorted = sort { + return $a->module.$a->dir cmp $b->module.$b->dir; + } @current ; + return shift @sorted; +} + +# update the obj with the next line +sub getNextSdfObj +{ + my $obj = shift; + my $line = readline ( $obj->FILEHANDLE ); + if ( $line eq undef ) + { + $obj->endoffile( "true" ); + } + else + { + $line =~ /^(([^\t]*)\t([^\t]*)[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t*)/o ; + if( defined $1 && defined $2 && defined $3 ) + { + $obj->line ( $1 ); + $obj->module( $2 ); + $obj->file ( $3 ); + $obj->dir ( getDir( $3 ) ); + } + else + { + $obj->line ( "" ); + $obj->module( "" ); + $obj->file ( "" ); + $obj->dir ( "" ); + } + } + return $obj; +} +sub getNextSdfObjModule +{ + my $obj = shift; + while( !$obj->endoffile ) + { + my $line = readline ( $obj->FILEHANDLE ); + if ( $line eq undef ) + { + $obj->endoffile( "true" ); + } + else + { + $line =~ /^(([^\t]*)\t([^\t]*).*)/o ; + if( defined $1 && defined $2 && defined $3 ) + { + $obj->line ( $1 ); + $obj->module( $2 ); + $obj->file ( $3 ); + $obj->dir ( getDir( $3 ) ); + } + else + { + $obj->line ( "" ); + $obj->module( "" ); + $obj->file ( "" ); + $obj->dir ( "" ); + } + return $obj , if( $obj->module eq $module_name ) + } + } + #return $obj; +} +sub getDir +{ + my $path = shift ; + $path =~ s/\//\\/g; + my @tmp_path = split /\\/ , $path; + pop @tmp_path; + $path = join '\\' , @tmp_path; + return $path; +} + +sub hasLines +{ + my $hasLines = ""; + my @tmpfiles; + foreach ( @files ) + { + push @tmpfiles , $_, if( !$_->endoffile ); + } + @files = @tmpfiles; + return $#files+1; +} + +sub make_paths +{ + my $localizeFile = $merge_dir."\\".$current[ 0 ]->module."\\".$current[ 0 ]->file; + my $path = getDir( $localizeFile ); + if ( !$WIN ) { $path =~ s/\\/\//g; } + + $localizeFile = $path."\\localize.sdf"; + if ( !$WIN ) { $localizeFile =~ s/\\/\//g; } + + return ( $path , $localizeFile ); +} +sub write_lines +{ + if( $first_run ){ + add_to_buffer(); + my( $path , $localize_file ) = make_paths(); + $last_path = $path; + $last_localize_file = $localize_file; + mkpath $path; + write_buffer( $path , $localize_file ); + $first_run = ''; + } + else + { + return , if ( $#current+1 eq 0 ); + my( $path , $localize_file ) = make_paths(); + if( $path eq $last_path ) + { + add_to_buffer(); + } + else + { + mkpath $path; + write_buffer( $last_path , $last_localize_file ); + add_to_buffer(); + $last_path = $path; + $last_localize_file = $localize_file; + } + } +} +sub add_to_buffer +{ + my $plainline; + my $afile; + my $amodule; + foreach my $elem ( @current ) + { + do { + $amodule=$elem->module; + $afile=$elem->file; + $plainline=$elem->line; + push @buffer, $plainline; + getNextSdfObj( $elem ); + } while ( !$elem->endoffile && $amodule eq $elem->module && $afile eq $elem->file ); + } +} +sub write_buffer +{ + my $path = shift; + my $localize_file = shift; + my $cnt = $#buffer+1; + print "Write to $path $cnt lines\n"; + open FILE , ">>$localize_file" or die "Can't open file '$localize_file'\n"; + foreach ( @buffer ) + { + print FILE $_."\n"; + } + @buffer = (); +} +sub parse_options +{ + my $success = GetOptions( 'sdf_files=s' => \$sdf_filename , 'merge_dir=s' => \$merge_dir ); #, 'module=s' => \$module_name ); + if( ! ( $sdf_filename && $merge_dir && $success ) ) + { + usage(); + exit( -1 ); + } +} + +sub usage +{ + print "Usage: fast_merge -sdf_files -merge_dir \n" ; +} + +sub read_sdf_file_names +{ + open FILE , "<$sdf_filename" or die "Can't open file '$sdf_filename'\n"; + while ( ) + { + push @file_names , split " " , $_ ; + } + close ( FILE ); +} + + diff --git a/transex3/scripts/localize b/transex3/scripts/localize deleted file mode 100755 index 74a75ecc3aee..000000000000 --- a/transex3/scripts/localize +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -if [ x${SOLARENV}x = xx ]; then - echo No environment found, please use 'setsolar' -exit 1 -fi - -# localize.pl calls localize_sl in solver bin directory which depends on dynamic -# libraries in solver lib directory but has no correct RPATH (or equivalent): -if [ "${OS?}" = MACOSX ]; then - export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH+${DYLD_LIBRARY_PATH}:}${SOLARVERSION?}/${INPATH?}/lib${UPDMINOREXT} -else - export LD_LIBRARY_PATH=${LD_LIBRARY_PATH+${LD_LIBRARY_PATH}:}${SOLARVERSION?}/${INPATH?}/lib${UPDMINOREXT} -fi - -if [ x${SOLARVER}x = xx -o x${UPDMINOR}x = xx ]; then - exec perl -w $SOLARVERSION/$INPATH/bin/localize.pl "$@" -else - exec perl -w $SOLARVERSION/$INPATH/bin.$UPDMINOR/localize.pl "$@" -fi - diff --git a/transex3/scripts/localize.pl b/transex3/scripts/localize.pl index b9e478ba66bd..10e8124027b1 100755 --- a/transex3/scripts/localize.pl +++ b/transex3/scripts/localize.pl @@ -13,7 +13,7 @@ eval 'exec perl -wS $0 ${1+"$@"}' # # $RCSfile: localize.pl,v $ # -# $Revision: 1.18 $ +# $Revision: 1.18.6.2 $ # # This file is part of OpenOffice.org. # @@ -39,10 +39,12 @@ use Getopt::Long; use IO::Handle; use File::Find; use File::Temp; +use File::Path; use File::Copy; use File::Glob qw(:glob csh_glob); use Cwd; +my $CVS_BINARY = "/usr/bin/cvs"; # ver 1.1 # #### module lookup @@ -61,16 +63,24 @@ BEGIN { use lib (@lib_dirs); #### globals #### -my $sdffile = ''; -my $no_sort = ''; -my $outputfile = ''; -my $mode = ''; -my $bVerbose="0"; -my $srcpath = ''; +my $sdffile = ''; +my $no_sort = ''; +my $create_dirs = ''; +my $multi_localize_files = ''; +my $module_to_merge = ''; +my $sort_sdf_before = ''; +my $outputfile = ''; +my $no_gsicheck = ''; +my $mode = ''; +my $bVerbose = "0"; +my $srcpath = ''; my $WIN; my $languages; #my %sl_modules; # Contains all modules where en-US and de is source language my $use_default_date = '0'; +my %is_ooo_module; +my %is_so_module; +my $DELIMITER; # ( leftpart ) ( rightpart ) # prj file dummy type gid lid helpid pform width lang text helptext qhelptext title timestamp @@ -82,21 +92,38 @@ my @sdfparticles; #### main #### parse_options(); +check_modules_scm(); if ( defined $ENV{USE_SHELL} && $ENV{USE_SHELL} eq '4nt' ) { $WIN = 'TRUE'; + $DELIMITER = "\\"; } else { $WIN = ''; + $DELIMITER = "/"; +} + +my $binpath = ''; +if( defined $ENV{UPDMINOREXT} ) +{ + $binpath = $ENV{SOLARVER}.$DELIMITER.$ENV{INPATH}.$DELIMITER."bin".$ENV{UPDMINOREXT}.$DELIMITER ; +} +else +{ + $binpath = $ENV{SOLARVER}.$DELIMITER.$ENV{INPATH}.$DELIMITER."bin".$DELIMITER ; } #%sl_modules = fetch_sourcelanguage_dirlist(); if ( $mode eq "merge" ) { - merge_gsicheck(); + if ( ! $no_gsicheck ){ + merge_gsicheck(); + } splitfile( $sdffile ); - unlink $sdffile; # remove temp file! + if ( ! $no_gsicheck ){ + unlink $sdffile; # remove temp file! + } } elsif( $mode eq "extract" ) { collectfiles( $outputfile ); @@ -126,6 +153,12 @@ sub splitfile{ open MYFILE , "< $sdffile" or die "Can't open '$sdffile'\n"; +# my %lang_hash; + my %string_hash_ooo; + my %string_hash_so; + my %so_modules; + $so_modules{ "extras_full" } = "TRUE"; + while( ){ if( /$sdf_regex/ ){ my $line = defined $_ ? $_ : ''; @@ -137,183 +170,187 @@ sub splitfile{ my $lang = defined $12 ? $12 : ''; my $plattform = defined $10 ? $10 : ''; my $helpid = defined $9 ? $9 : ''; - next if( $prj eq "binfilter" ); # Don't merge strings into binfilter module chomp( $line ); - $currentFile = $srcpath . '\\' . $prj . '\\' . $file; - if ( $WIN ) { $currentFile =~ s/\//\\/g; } - else { $currentFile =~ s/\\/\//g; } - $cur_sdffile = $currentFile; - #if( $cur_sdffile =~ /\.$file_types[\s]*$/ ){ - if( $WIN ) { $cur_sdffile =~ s/\\[^\\]*\.$file_types[\s]*$/\\localize.sdf/; } - else { $cur_sdffile =~ s/\/[^\/]*\.$file_types[\s]*$/\/localize.sdf/; } - #} - - # Set default date - if( $line =~ /(.*)\t[^\t\$]*$/ ){ - $line = $1."\t".$default_date; - } - - if( $start ){ - $start=''; - $lastFile = $currentFile; # ? - $last_sdffile = $cur_sdffile; - } - - if( $lang eq "en-US" ){} - elsif( $cur_sdffile eq $last_sdffile ) + if( is_openoffice_module( $prj ) ) { - $block{ "$prj\t$file\t$type\t$gid\t$lid\t$helpid\t$plattform\t$lang" } = $line ; + $string_hash_ooo { $lang }{ "$prj\t$file\t$type\t$gid\t$lid\t$helpid\t$plattform\t$lang" } = $line; } else { - writesdf( $lastFile , \%block ); - $lastFile = $currentFile; #? - $last_sdffile = $cur_sdffile; - %block = (); - #if( ! $lang eq "en-US" ) { - $block{ "$prj\t$file\t$type\t$gid\t$lid\t$helpid\t$plattform\t$lang" } = $line ; - #} - + $string_hash_so{ $lang }{ "$prj\t$file\t$type\t$gid\t$lid\t$helpid\t$plattform\t$lang" } = $line; } - } #else { print STDOUT "splitfile REGEX kaputt\n";} - + } } - writesdf( $lastFile , \%block ); - %block = (); close( MYFILE ); + if( !defined $ENV{SRC_ROOT} ){ + print "Error, no SRC_ROOT in env found.\n"; + exit( -1 ); + } + my $src_root = $ENV{SRC_ROOT}; + #print $WIN eq "TRUE" ? $src_root."\\l10n_so\n" : $src_root."/l10n_so\n"; + my $so_l10n_path = $WIN eq "TRUE" ? $src_root."\\l10n_so\\source" : $src_root."/l10n_so/source"; + my $ooo_l10n_path = $WIN eq "TRUE" ? $src_root."\\l10n\\source" : $src_root."/l10n/source"; + + #print "$so_l10n_path\n"; + #print "$ooo_l10n_path\n"; + + write_sdf( \%string_hash_so , $so_l10n_path ); + write_sdf( \%string_hash_ooo , $ooo_l10n_path ); + } -######################################################### +sub check_modules_scm +{ + #my @ooo_modules; + #my @so_modules; + my $src_path = $ENV{ SRC_ROOT } ; + my $last_dir = getcwd(); + chdir $src_path ; + my @modules = <*/.svn/entries>; -#sub fetch_sourcelanguage_dirlist -#{ -# -# my $working_path = getcwd(); -# my %sl_dirlist; -# -# chdir $srcpath; -# my @all_dirs = csh_glob( "*" ); -# -# foreach my $file ( @all_dirs ) -# { -# if( -d $file ) -# { -# my $module = $file; -# $file .= "/prj/l10n"; -# $file =~ s/\//\\/ , if( $WIN ) ; -# -# if( -f $file ) # Test file /prj/l10n -# { -# $sl_dirlist{ $module } = 1; -# if( $bVerbose eq "1" ) { print STDOUT "$module: de and en-US source language detected\n"; } -# } -# } -# } -# -# chdir $working_path; -# -# return %sl_dirlist; -#} + foreach my $module ( @modules ) + { + #print "$module \n"; + if( open ( FILE , "<$module" ) ) + { + while( ) + { -#sub has_two_sourcelanguages -#{ -# my $module = shift; -# return defined $sl_modules{ $module } ; -#} -sub writesdf{ + my @path = split ( "/" , $module ) ; - my $lastFile = shift; - my $blockhash_ref = shift; - my $localizeFile = $lastFile; - my %index=(); - - if( $localizeFile =~ /\.$file_types[\s]*$/ ){ - if( $WIN ) { $localizeFile =~ s/\\[^\\]*\.$file_types[\s]*$/\\localize.sdf/; } - else { $localizeFile =~ s/\/[^\/]*\.$file_types[\s]*$/\/localize.sdf/; } - }else { - print STDERR "Strange filetype found '$localizeFile'\n"; - return; + if( /svn.services.openoffice.org/ ) + { + my $mod = $path[ 0 ]; + #push @ooo_modules , $mod; + $is_ooo_module{ $mod } = "true"; + # print "$module -> ooo "; + } + elsif ( /jumbo2.germany.sun.com/ ) + { + my $mod = $path[ 0 ]; + #push @so_modules , $mod; + # print "$module -> so "; + #$so_lookup_hash{ $mod } = "true"; + } + #else + #{ + # print "ERROR: Is $module a SO or OOo module? Can not parese the $module/.svn/entries file ... please check mwsfinnish/merge/splitsdf.pl line 280\n"; + # exit -1; + #} + } } - if( $bVerbose ){ print STDOUT "$localizeFile\n"; } - if( open DESTFILE , "< $localizeFile" ){ + } + chdir $last_dir ; + #print "OOO\n"; + #print @ooo_modules; + #print "\nSO\n"; + #print @so_modules; +} - #or die "Can't open/create '\$localizeFile'"; - #### Build hash - while(){ - if( /$sdf_regex/ ){ - my $line = defined $_ ? $_ : ''; - my $prj = defined $3 ? $3 : ''; - my $file = defined $4 ? $4 : ''; - my $type = defined $6 ? $6 : ''; - my $gid = defined $7 ? $7 : ''; - my $lid = defined $8 ? $8 : ''; - my $lang = defined $12 ? $12 : ''; - my $plattform = defined $10 ? $10 : ''; - my $helpid = defined $9 ? $9 : ''; +#sub parse +#{ +# my $command = "$CVS_BINARY -d:pserver:anoncvs\@anoncvs.services.openoffice.org:/cvs co -c"; +# my $output = `$command`; +# my $rc = $? << 8; +# if ( $output eq "" || $rc < 0 ){ +# print STDERR "ERROR: Can not fetch cvs alias list, please login to the cvs server and press at the password prompt just return\ncvs -d:pserver:anoncvs\@anoncvs.services.openoffice.org:/cvs login\n"; +# exit ( -1 ); +# } +# my @list = split /\n/ , $output ; +# foreach my $string( @list ) +# { +# +# # print "Found '$1'\n" , if( $string =~ /^(\w*)/ && $1 ne "" ); +# +# $is_ooo_module{ $1 } = "TRUE", if( $string =~ /^(\w*)/ && $1 ne "" ); +# } +# # foreach my $key( keys( %is_ooo_module ) ) +# #{ +# # print "$key\n"; +# #} +#} +sub is_openoffice_module +{ + my $module = shift; + return "TRUE", if defined $is_ooo_module{ $module }; + return ""; +} - chomp( $line ); - $index{ "$prj\t$file\t$type\t$gid\t$lid\t$helpid\t$plattform\t$lang" } = $line ; +sub write_sdf +{ + my $string_hash = shift; + my $l10n_file = shift; - } #else { print STDOUT "writesdf REGEX kaputt $_\n";} + foreach my $lang( keys( %{ $string_hash } ) ) + { + my @sdf_file; + # mkdir!!!! + my $current_l10n_file = $WIN eq "TRUE" ? $l10n_file."\\$lang\\localize.sdf" : $l10n_file."/$lang/localize.sdf"; + print "Writing '$current_l10n_file'\n"; + if( open DESTFILE , "< $current_l10n_file" ){ + + while(){ + if( /$sdf_regex/ ){ + my $line = defined $_ ? $_ : ''; + my $prj = defined $3 ? $3 : ''; + my $file = defined $4 ? $4 : ''; + my $type = defined $6 ? $6 : ''; + my $gid = defined $7 ? $7 : ''; + my $lid = defined $8 ? $8 : ''; + my $lang = defined $12 ? $12 : ''; + my $plattform = defined $10 ? $10 : ''; + my $helpid = defined $9 ? $9 : ''; + + chomp( $line ); + if ( defined $string_hash->{ $lang }{ "$prj\t$file\t$type\t$gid\t$lid\t$helpid\t$plattform\t$lang" } ) + { + # Changed String! + push @sdf_file , $string_hash->{ $lang }{ "$prj\t$file\t$type\t$gid\t$lid\t$helpid\t$plattform\t$lang" } ; + $string_hash->{ $lang }{ "$prj\t$file\t$type\t$gid\t$lid\t$helpid\t$plattform\t$lang" } = undef; + } + else + { + # No new string + push @sdf_file , $line; + } + } + } } close( DESTFILE ); - } - #### Copy new strings - my @mykeys = keys( %{ $blockhash_ref } ); - my $isDirty = "FALSE"; - foreach my $key( @mykeys ){ - if( ! defined $index{ $key } ){ - # Add new entry - $index{ $key } = $blockhash_ref->{ $key} ; - $isDirty = "TRUE"; - }elsif( $index{ $key } ne $blockhash_ref->{ $key } ){ - # Overwrite old entry - $index{ $key } = $blockhash_ref->{ $key }; - $isDirty = "TRUE"; - }else { + #Now just append the enw strings + #FIXME!!! Implement insertion in the correct order + foreach my $key ( keys ( %{ $string_hash->{ $lang } } ) ) + { + push @sdf_file , $string_hash->{ $lang }{ $key } , if ( defined $string_hash->{ $lang }{ $key } ); + #print "WARNING: Not defined = ".$string_hash->{ $lang }{ $key }."\n", if( ! defined $string_hash->{ $lang }{ $key } ); } - } - #### Write file - - if( !$bVerbose ){ print STDOUT "."; } - if( $isDirty eq "TRUE" ){ - if( open DESTFILE , "+> $localizeFile" ){ + # Write the new file + my ( $TMPFILE , $tmpfile ) = File::Temp::tempfile(); + if( open DESTFILE , "+> $tmpfile " ){ print DESTFILE get_license_header(); - @mykeys = sort keys( %index ); - foreach my $key( @mykeys ){ - print DESTFILE ( $index{ $key } , "\n" ); + foreach my $string( @sdf_file ){ + print DESTFILE "$string\n"; } - close DESTFILE; - }else { - print STDOUT "WARNING: File $localizeFile is not writable , try to merge ...\n"; - my ( $TMPFILE , $tmpfile ) = File::Temp::tempfile(); - if( open DESTFILE , "+> $tmpfile " ){ - @mykeys = keys( %index ); - foreach my $key( @mykeys ){ - print DESTFILE ( $index{ $key } , "\n" ); - } - close DESTFILE; - if( move( $localizeFile , $localizeFile.".backup" ) ){ - if( copy( $tmpfile , $localizeFile ) ){ - unlink $localizeFile.".backup"; - } else { print STDERR "Can't open/create '$localizeFile', original file is renamed to $localizeFile.backup\n"; } - } else { print STDERR "Can't open/create '$localizeFile'\n"; } - }else{ - print STDERR "WARNING: Can't open/create '$localizeFile'\n"; - } - unlink $tmpfile; - } - } -# if( $no_sort eq '' ){ -# sort_outfile( $localizeFile ); -# } + close ( DESTFILE ); + if( move( $current_l10n_file , $current_l10n_file.".backup" ) ){ + if( copy( $tmpfile , $current_l10n_file ) ){ + unlink $l10n_file.".backup"; + } else { print STDERR "Can't open/create '$l10n_file', original file is renamed to $l10n_file.backup\n"; } + } else { print STDERR "Can't open/create '$l10n_file'\n"; } + }else{ + print STDERR "WARNING: Can't open/create '$l10n_file'\n"; + } + unlink $tmpfile; + } } +######################################################### + sub get_license_header{ return "#\n". @@ -398,6 +435,41 @@ sub wanted } } +sub add_paths +{ + my $langhash_ref = shift; + my $root_dir = $ENV{ SRC_ROOT }; + my $ooo_l10n_dir = "$root_dir"."$DELIMITER"."l10n"."$DELIMITER"."source"; + my $so_l10n_dir = "$root_dir"."$DELIMITER"."l10n_so"."$DELIMITER"."source"; + + if( -e $ooo_l10n_dir ) + { + foreach my $lang ( keys( %{ $langhash_ref } ) ) + { + my $loc_file = "$ooo_l10n_dir"."$DELIMITER"."$lang"."$DELIMITER"."localize.sdf"; + if( -e $loc_file ) + { + push @sdfparticles , "$ooo_l10n_dir"."$DELIMITER"."$lang"."$DELIMITER"."localize.sdf"; + } + else { print "WARNING: $loc_file not found ....\n"; } + } + } + else { die "ERROR: Can not find directory $ooo_l10n_dir!!!" } + if( -e $so_l10n_dir ) + { + foreach my $lang ( keys( %{ $langhash_ref } ) ) + { + my $loc_file = "$so_l10n_dir"."$DELIMITER"."$lang"."$DELIMITER"."localize.sdf"; + if( -e $loc_file ) + { + push @sdfparticles , "$ooo_l10n_dir"."$DELIMITER"."$lang"."$DELIMITER"."localize.sdf"; + } + else { #print "WARNING: $loc_file not found ....\n"; + } + } + + } +} sub collectfiles{ print STDOUT "### Localize\n"; my $localizehash_ref; @@ -408,14 +480,14 @@ sub collectfiles{ STDOUT->autoflush( 1 ); ### Search sdf particles - print STDOUT "### Searching sdf particles\n"; + #print STDOUT "### Searching sdf particles\n"; my $working_path = getcwd(); - chdir $srcpath; - find ( { wanted => \&wanted , follow => 1 }, getcwd() ); - chdir $working_path; - - my $nFound = $#sdfparticles +1; - print "\n $nFound files found !\n"; + #chdir $srcpath; + #find ( { wanted => \&wanted , follow => 1 }, getcwd() ); + #chdir $working_path; + add_paths( $langhash_ref ); + #my $nFound = $#sdfparticles +1; + #print "\n $nFound files found !\n"; my ( $LOCALIZEPARTICLE , $localizeSDF ) = File::Temp::tempfile(); close( $LOCALIZEPARTICLE ); @@ -425,18 +497,18 @@ sub collectfiles{ my ( $LOCALIZE_LOG , $my_localize_log ) = File::Temp::tempfile(); close( $LOCALIZE_LOG ); - ## Get the localize de,en-US extract + ## Get the localize en-US extract if( $bAll || $bUseLocalize ){ print "### Fetching source language strings\n"; my $command = ""; my $args = ""; if( $ENV{WRAPCMD} ){ - $command = "$ENV{WRAPCMD} localize_sl"; + $command = $ENV{WRAPCMD}.$binpath."localize_sl"; }else{ - $command = "localize_sl"; + $command = $binpath."localize_sl"; } - + print $command; # -e # if ( -x $command ){ if( $command ){ @@ -480,7 +552,8 @@ sub collectfiles{ } ## Get sdf particles - open ALLPARTICLES_MERGED , "+>> $particleSDF_merged" +#***************** + open ALLPARTICLES_MERGED , "+>> $particleSDF_merged" or die "Can't open $particleSDF_merged"; ## Fill fackback hash @@ -542,7 +615,7 @@ sub collectfiles{ } } close ALLPARTICLES_MERGED; - +#*************** # Hash of array my %output; @@ -1040,7 +1113,8 @@ sub parse_options{ my $merge; my $extract; my $success = GetOptions('f=s' => \$sdffile , 'l=s' => \$languages , 's=s' => \$srcpath , 'h' => \$help , 'v' => \$bVerbose , - 'm' => \$merge , 'e' => \$extract , 'x' => \$no_sort , 'd' => \$use_default_date ); + 'm' => \$merge , 'e' => \$extract , 'x' => \$no_sort , 'd' => \$use_default_date , 'c' => \$create_dirs , + 'n' => \$no_gsicheck ); $outputfile = $sdffile; #print STDOUT "DBG: lang = $languages\n"; @@ -1068,13 +1142,16 @@ sub parse_options{ if( $extract ){ $mode = "extract"; } else { $mode = "merge"; } } +#my $multi_localize_files = ''; h +#my $module_to_merge = ''; i +#my $sort_sdf_before = ''; g ######################################################### sub usage{ print STDERR "Usage: localize.pl\n"; print STDERR "Split or collect SDF files\n"; - print STDERR " merge: -m -f -l l1[=f1][,l2[=f2]][...] [ -s ]\n"; + print STDERR " merge: -m -f -l l1[=f1][,l2[=f2]][...] [ -s ] [ -c ]\n"; print STDERR " extract: -e -f -l [ -s ] [-d]\n"; print STDERR "Options:\n"; print STDERR " -h help\n"; @@ -1085,6 +1162,11 @@ sub usage{ print STDERR " -s Path to the modules, if no \$SRC_ROOT is set\n"; print STDERR " -l ( all | | =fallback ) comma seperated languages\n"; print STDERR " -d Use default date in extracted sdf file\n"; + print STDERR " -c Create needed directories\n"; + print STDERR " -g Sort sdf file before mergeing\n"; + print STDERR " -h File with localize.sdf's\n!"; + print STDERR " -n No gsicheck\n"; + print STDERR " -i Module to merge\n"; print STDERR " -v Verbose\n"; print STDERR "\nExample:\n"; print STDERR "\nlocalize -e -l en-US,pt-BR=en-US -f my.sdf\n( Extract en-US and pt-BR with en-US fallback )\n"; diff --git a/transex3/scripts/localize_old.pl b/transex3/scripts/localize_old.pl new file mode 100755 index 000000000000..151399d22002 --- /dev/null +++ b/transex3/scripts/localize_old.pl @@ -0,0 +1,1130 @@ +: +eval 'exec perl -wS $0 ${1+"$@"}' + if 0; + + +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: localize.pl,v $ +# +# $Revision: 1.18 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +use strict; +use Getopt::Long; +use IO::Handle; +use File::Find; +use File::Temp; +use File::Copy; +use File::Glob qw(:glob csh_glob); +use Cwd; + +# ver 1.1 +# +#### module lookup +#use lib ("$ENV{SOLARENV}/bin/modules", "$ENV{COMMON_ENV_TOOLS}/modules"); + +#### module lookup +# OOo conform +my @lib_dirs; +BEGIN { + if ( !defined($ENV{SOLARENV}) ) { + die "No environment found (environment variable SOLARENV is undefined)"; + } + push(@lib_dirs, "$ENV{SOLARENV}/bin/modules"); + push(@lib_dirs, "$ENV{COMMON_ENV_TOOLS}/modules") if defined($ENV{COMMON_ENV_TOOLS}); +} +use lib (@lib_dirs); + +#### globals #### +my $sdffile = ''; +my $no_sort = ''; +my $outputfile = ''; +my $mode = ''; +my $bVerbose="0"; +my $srcpath = ''; +my $WIN; +my $languages; +#my %sl_modules; # Contains all modules where en-US and de is source language +my $use_default_date = '0'; + + # ( leftpart ) ( rightpart ) + # prj file dummy type gid lid helpid pform width lang text helptext qhelptext title timestamp +my $sdf_regex = "((([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*))\t([^\t]*)\t(([^\t]*)\t([^\t]*)\t([^\t]*)\t([^\t]*)\t)([^\t]*))"; +my $file_types = "(src|hrc|xcs|xcu|lng|ulf|xrm|xhp|xcd|xgf|xxl|xrb)"; +# Always use this date to prevent cvs conflicts +my $default_date = "2002-02-02 02:02:02"; + +#### main #### +parse_options(); + +if ( defined $ENV{USE_SHELL} && $ENV{USE_SHELL} eq '4nt' ) { + $WIN = 'TRUE'; +} + else { + $WIN = ''; +} + +#%sl_modules = fetch_sourcelanguage_dirlist(); + + +if ( $mode eq "merge" ) { + merge_gsicheck(); + splitfile( $sdffile ); + unlink $sdffile; # remove temp file! +} +elsif( $mode eq "extract" ) { + collectfiles( $outputfile ); +} +else { + usage(); +} + +exit(0); + +######################################################### +sub splitfile{ + + my $lastFile = ''; + my $currentFile = ''; + my $cur_sdffile = ''; + my $last_sdffile = ''; + my $delim; + my $badDelim; + my $start = 'TRUE'; + my %index = (); + my %block; + + STDOUT->autoflush( 1 ); + + #print STDOUT "Open File $sdffile\n"; + open MYFILE , "< $sdffile" + or die "Can't open '$sdffile'\n"; + + while( ){ + if( /$sdf_regex/ ){ + my $line = defined $_ ? $_ : ''; + my $prj = defined $3 ? $3 : ''; + my $file = defined $4 ? $4 : ''; + my $type = defined $6 ? $6 : ''; + my $gid = defined $7 ? $7 : ''; + my $lid = defined $8 ? $8 : ''; + my $lang = defined $12 ? $12 : ''; + my $plattform = defined $10 ? $10 : ''; + my $helpid = defined $9 ? $9 : ''; + + next if( $prj eq "binfilter" ); # Don't merge strings into binfilter module + chomp( $line ); + $currentFile = $srcpath . '\\' . $prj . '\\' . $file; + if ( $WIN ) { $currentFile =~ s/\//\\/g; } + else { $currentFile =~ s/\\/\//g; } + + $cur_sdffile = $currentFile; + #if( $cur_sdffile =~ /\.$file_types[\s]*$/ ){ + if( $WIN ) { $cur_sdffile =~ s/\\[^\\]*\.$file_types[\s]*$/\\localize.sdf/; } + else { $cur_sdffile =~ s/\/[^\/]*\.$file_types[\s]*$/\/localize.sdf/; } + #} + + # Set default date + if( $line =~ /(.*)\t[^\t\$]*$/ ){ + $line = $1."\t".$default_date; + } + + if( $start ){ + $start=''; + $lastFile = $currentFile; # ? + $last_sdffile = $cur_sdffile; + } + + if( $lang eq "en-US" ){} + elsif( $cur_sdffile eq $last_sdffile ) + { + $block{ "$prj\t$file\t$type\t$gid\t$lid\t$helpid\t$plattform\t$lang" } = $line ; + } + else + { + writesdf( $lastFile , \%block ); + $lastFile = $currentFile; #? + $last_sdffile = $cur_sdffile; + %block = (); + #if( ! $lang eq "en-US" ) { + $block{ "$prj\t$file\t$type\t$gid\t$lid\t$helpid\t$plattform\t$lang" } = $line ; + #} + + } + } #else { print STDOUT "splitfile REGEX kaputt\n";} + + } + writesdf( $lastFile , \%block ); + %block = (); + close( MYFILE ); + +} +######################################################### + +#sub fetch_sourcelanguage_dirlist +#{ +# +# my $working_path = getcwd(); +# my %sl_dirlist; +# +# chdir $srcpath; +# my @all_dirs = csh_glob( "*" ); +# +# foreach my $file ( @all_dirs ) +# { +# if( -d $file ) +# { +# my $module = $file; +# $file .= "/prj/l10n"; +# $file =~ s/\//\\/ , if( $WIN ) ; +# +# if( -f $file ) # Test file /prj/l10n +# { +# $sl_dirlist{ $module } = 1; +# if( $bVerbose eq "1" ) { print STDOUT "$module: de and en-US source language detected\n"; } +# } +# } +# } +# +# chdir $working_path; +# +# return %sl_dirlist; +#} + +#sub has_two_sourcelanguages +#{ +# my $module = shift; +# return defined $sl_modules{ $module } ; +#} +sub writesdf{ + + my $lastFile = shift; + my $blockhash_ref = shift; + my $localizeFile = $lastFile; + my %index=(); + + if( $localizeFile =~ /\.$file_types[\s]*$/ ){ + if( $WIN ) { $localizeFile =~ s/\\[^\\]*\.$file_types[\s]*$/\\localize.sdf/; } + else { $localizeFile =~ s/\/[^\/]*\.$file_types[\s]*$/\/localize.sdf/; } + }else { + print STDERR "Strange filetype found '$localizeFile'\n"; + return; + } + if( open DESTFILE , "< $localizeFile" ){ + + #or die "Can't open/create '\$localizeFile'"; + + #### Build hash + while(){ + if( /$sdf_regex/ ){ + my $line = defined $_ ? $_ : ''; + my $prj = defined $3 ? $3 : ''; + my $file = defined $4 ? $4 : ''; + my $type = defined $6 ? $6 : ''; + my $gid = defined $7 ? $7 : ''; + my $lid = defined $8 ? $8 : ''; + my $lang = defined $12 ? $12 : ''; + my $plattform = defined $10 ? $10 : ''; + my $helpid = defined $9 ? $9 : ''; + + chomp( $line ); + $index{ "$prj\t$file\t$type\t$gid\t$lid\t$helpid\t$plattform\t$lang" } = $line ; + + } #else { print STDOUT "writesdf REGEX kaputt $_\n";} + + } + close( DESTFILE ); + } + #### Copy new strings + my @mykeys = keys( %{ $blockhash_ref } ); + my $isDirty = "FALSE"; + foreach my $key( @mykeys ){ + if( ! defined $index{ $key } ){ + # Add new entry + $index{ $key } = $blockhash_ref->{ $key} ; + $isDirty = "TRUE"; + }elsif( $index{ $key } ne $blockhash_ref->{ $key } ){ + # Overwrite old entry + $index{ $key } = $blockhash_ref->{ $key }; + $isDirty = "TRUE"; + }else { + } + } + + #### Write file + + if( !$bVerbose ){ print STDOUT "."; } + if( $isDirty eq "TRUE" ){ + if( $bVerbose ){ print STDOUT "$localizeFile\n"; } + if( open DESTFILE , "+> $localizeFile" ){ + print DESTFILE get_license_header(); + @mykeys = sort keys( %index ); + foreach my $key( @mykeys ){ + print DESTFILE ( $index{ $key } , "\n" ); + } + close DESTFILE; + }else { + print STDOUT "WARNING: File $localizeFile is not writable , try to merge ...\n"; + my ( $TMPFILE , $tmpfile ) = File::Temp::tempfile(); + if( open DESTFILE , "+> $tmpfile " ){ + @mykeys = keys( %index ); + foreach my $key( @mykeys ){ + print DESTFILE ( $index{ $key } , "\n" ); + } + close DESTFILE; + if( move( $localizeFile , $localizeFile.".backup" ) ){ + if( copy( $tmpfile , $localizeFile ) ){ + unlink $localizeFile.".backup"; + } else { print STDERR "Can't open/create '$localizeFile', original file is renamed to $localizeFile.backup\n"; } + } else { print STDERR "Can't open/create '$localizeFile'\n"; } + }else{ + print STDERR "WARNING: Can't open/create '$localizeFile'\n"; + } + unlink $tmpfile; + } + } +# if( $no_sort eq '' ){ +# sort_outfile( $localizeFile ); +# } +} + +sub get_license_header{ + return +"#\n". +"# #### ### # # ### ##### ##### #### ##### ##### \n". +"# # # # # ## # # # # # # # # # \n". +"# # # # # # # # # # # ### # # # # \n". +"# # # # # # ## # # # # # # # # \n". +"# #### ### # # ### # ##### #### ##### # \n". +"#\n". +"# DO NOT EDIT! This file will be overwritten by localisation process\n". +"#\n". +"#*************************************************************************\n". +"#\n". +"# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.\n". +"# \n". +"# Copyright 2008 by Sun Microsystems, Inc.\n". +"#\n". +"# OpenOffice.org - a multi-platform office productivity suite\n". +"#\n". +"# \$RCSfile:". +"localize.pl,v \$\n". +"#\n". +"# \$Revision: ". +"1.17.4.1 \$\n". +"#\n". +"# This file is part of OpenOffice.org.\n". +"#\n". +"# OpenOffice.org is free software: you can redistribute it and/or modify\n". +"# it under the terms of the GNU Lesser General Public License version 3\n". +"# only, as published by the Free Software Foundation.\n". +"#\n". +"# OpenOffice.org is distributed in the hope that it will be useful,\n". +"# but WITHOUT ANY WARRANTY; without even the implied warranty of\n". +"# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n". +"# GNU Lesser General Public License version 3 for more details\n". +"# (a copy is included in the LICENSE file that accompanied this code).\n". +"#\n". +"# You should have received a copy of the GNU Lesser General Public License\n". +"# version 3 along with OpenOffice.org. If not, see\n". +"# \n". +"# for a copy of the LGPLv3 License.\n". +"#\n". +"#*************************************************************************\n"; +} +######## Check input sdf file and use only the correct part +sub merge_gsicheck{ + my $command = ''; + my ( $TMPHANDLE , $tmpfile ) = File::Temp::tempfile(); + my ( $TMPHANDLE2 , $tmpfile2 ) = File::Temp::tempfile(); + close ( $TMPHANDLE ); + close ( $TMPHANDLE2 ); + + unlink $tmpfile2; + my $output2 = `cat $sdffile | sort > $tmpfile2`; + my $rc2 = $? << 8; + if( $rc2 ne 0 ){ + printf("ERROR: Failed -> cat $sdffile | sort > $tmpfile2\n$output2\n"); + exit( -1 ); + } + +# if( $ENV{WRAPCMD} ){ +# $command = "$ENV{WRAPCMD} gsicheck"; +# }else{ +# $command = "gsicheck"; +# } +# my $errfile = $tmpfile.".err"; +# $command .= " -k -c -wcf $tmpfile -wef $errfile -l \"\" $tmpfile2"; +# my $output = `$command`; +# my $rc = $? << 8; +# if ( $output ne "" ){ +# print STDOUT "### gsicheck ###\n"; +# print STDOUT "### The file $errfile have been written containing the errors in your sdf file. Those lines will not be merged: ###\n\n"; +# print STDOUT "$output\n"; +# print STDOUT "################\n"; +# +# }else{ +# # Remove the 0 Byte file +# unlink $errfile; +# } + $sdffile = $tmpfile2; +# unlink $tmpfile2; +} +######################################################### +sub collectfiles{ + print STDOUT "### Localize\n"; + my @sdfparticles; + my $localizehash_ref; + my ( $bAll , $bUseLocalize, $langhash_ref , $bHasSourceLanguage , $bFakeEnglish ) = parseLanguages(); + + # Enable autoflush on STDOUT + # $| = 1; + STDOUT->autoflush( 1 ); + + ### Search sdf particles + print STDOUT "### Searching sdf particles\n"; + my $working_path = getcwd(); + chdir $srcpath; + find sub { + my $file = $File::Find::name; + if( -f && $file =~ /.*localize.sdf$/ ) { + push @sdfparticles , $file; + if( $bVerbose eq "1" ) { print STDOUT "$file\n"; } + else { print "."; } + + } + } , getcwd() ;#"."; #$srcpath; + chdir $working_path; + + my $nFound = $#sdfparticles +1; + print "\n $nFound files found !\n"; + + my ( $LOCALIZEPARTICLE , $localizeSDF ) = File::Temp::tempfile(); + close( $LOCALIZEPARTICLE ); + + my ( $ALLPARTICLES_MERGED , $particleSDF_merged ) = File::Temp::tempfile(); + close( $ALLPARTICLES_MERGED ); + my ( $LOCALIZE_LOG , $my_localize_log ) = File::Temp::tempfile(); + close( $LOCALIZE_LOG ); + + ## Get the localize de,en-US extract + if( $bAll || $bUseLocalize ){ + print "### Fetching source language strings\n"; + my $command = ""; + my $args = ""; + + if( $ENV{WRAPCMD} ){ + $command = "$ENV{WRAPCMD} localize_sl"; + }else{ + $command = "localize_sl"; + } + + # -e + # if ( -x $command ){ + if( $command ){ + if( !$bVerbose ){ $args .= " -QQ -skip_links "; } + $args .= " -e -f $localizeSDF -l "; + my $bFlag=""; + if( $bAll ) {$args .= " en-US";} + else{ + my @list; + foreach my $isokey ( keys( %{ $langhash_ref } ) ){ + push @list , $isokey; + if( $langhash_ref->{ $isokey } ne "" ){ + push @list , $langhash_ref->{ $isokey }; + } + } + remove_duplicates( \@list ); + foreach my $isokey ( @list ){ + switch :{ + #( $isokey=~ /^de$/i ) + # && do{ + # if( $bFlag eq "TRUE" ){ $args .= ",de"; } + # else { + # $args .= "de"; $bFlag = "TRUE"; + # } + # }; + ( $isokey=~ /^en-US$/i ) + && do{ + if( $bFlag eq "TRUE" ){ $args .= ",en-US"; } + else { + $args .= "en-US"; $bFlag = "TRUE"; + } + }; + + } #switch + } #foreach + } # if + } # if +# if ( !$bVerbose ){ +# if ( $WIN eq "TRUE" ) { $args .= " > $my_localize_log"; } +# else { $args .= " >& $my_localize_log"; } +# } + if ( $bVerbose ) { print STDOUT $command.$args."\n"; } + + my $rc = system( $command.$args ); + + #my $output = `$command.$args`; + #my $rc = $? << 8; + + if( $rc < 0 ){ print STDERR "ERROR: localize rc = $rc\n"; exit( -1 ); } + ( $localizehash_ref ) = read_file( $localizeSDF , $langhash_ref ); + + } + ## Get sdf particles + open ALLPARTICLES_MERGED , "+>> $particleSDF_merged" + or die "Can't open $particleSDF_merged"; + + ## Fill fackback hash + my( $fallbackhashhash_ref ) = fetch_fallback( \@sdfparticles , $localizeSDF , $langhash_ref ); +# my( $fallbackhashhash_ref ) = fetch_fallback( \@sdfparticles , $localizeSDF , $langhash_ref ); + my %block; + my $cur_fallback; + if( !$bAll) { + foreach my $cur_lang ( keys( %{ $langhash_ref } ) ){ + #print STDOUT "DBG: G1 cur_lang=$cur_lang\n"; + $cur_fallback = $langhash_ref->{ $cur_lang }; + if( $cur_fallback ne "" ){ + # Insert fallback strings + #print STDOUT "DBG: Renaming $cur_fallback to $cur_lang in fallbackhash\n"; + rename_language( $fallbackhashhash_ref , $cur_fallback , $cur_lang ); + } + foreach my $currentfile ( @sdfparticles ){ + if ( open MYFILE , "< $currentfile" ) { + while(){ + if( /$sdf_regex/ ){ + my $line = defined $_ ? $_ : ''; + my $prj = defined $3 ? $3 : ''; + my $file = defined $4 ? $4 : ''; + my $type = defined $6 ? $6 : ''; + my $gid = defined $7 ? $7 : ''; + my $lid = defined $8 ? $8 : ''; + my $lang = defined $12 ? $12 : ''; + my $plattform = defined $10 ? $10 : ''; + my $helpid = defined $9 ? $9 : ''; + + chomp( $line ); + + if ( $lang eq $cur_lang ){ + # Overwrite fallback strings with collected strings + #if( ( !has_two_sourcelanguages( $cur_lang) && $cur_lang eq "de" ) || $cur_lang ne "en-US" ){ + $fallbackhashhash_ref->{ $cur_lang }{ $prj.$gid.$lid.$file.$type.$plattform.$helpid } = $line ; + #} + + } + } + } + }else { print STDERR "WARNING: Can't open file $currentfile"; } + } + + foreach my $line ( keys( %{$fallbackhashhash_ref->{ $cur_lang } } )) { + if( #$cur_lang ne "de" && + $cur_lang ne "en-US" ){ + print ALLPARTICLES_MERGED ( $fallbackhashhash_ref->{ $cur_lang }{ $line }, "\n" ); + } + } + } + } else { + foreach my $currentfile ( @sdfparticles ){ + if ( open MYFILE , "< $currentfile" ) { + while( ){ + print ALLPARTICLES_MERGED ( $_, "\n" ); # recheck de / en-US ! + } + } + else { print STDERR "WARNING: Can't open file $currentfile"; } + } + } + close ALLPARTICLES_MERGED; + + + # Hash of array + my %output; + my @order; + + ## Join both + if( $outputfile ){ + if( open DESTFILE , "+> $outputfile" ){ + if( !open LOCALIZEPARTICLE , "< $localizeSDF" ) { print STDERR "ERROR: Can't open file $localizeSDF\n"; } + if( !open ALLPARTICLES_MERGED , "< $particleSDF_merged" ) { print STDERR "ERROR: Can't open file $particleSDF_merged\n"; } + + # Insert localize + my $extract_date=""; + while ( ){ + if( /$sdf_regex/ ){ + my $leftpart = defined $2 ? $2 : ''; + my $lang = defined $12 ? $12 : ''; + my $rightpart = defined $13 ? $13 : ''; + my $timestamp = defined $18 ? $18 : ''; + + my $prj = defined $3 ? $3 : ''; + my $file = defined $4 ? $4 : ''; + my $type = defined $6 ? $6 : ''; + my $gid = defined $7 ? $7 : ''; + my $lid = defined $8 ? $8 : ''; + #my $lang = defined $12 ? $12 : ''; + my $plattform = defined $10 ? $10 : ''; + my $helpid = defined $9 ? $9 : ''; + + + if( $use_default_date ) + { + $extract_date = "$default_date\n" ; + } + elsif( $extract_date eq "" ) { + $extract_date = $timestamp ; + $extract_date =~ tr/\r\n//d; + $extract_date .= "\n"; + } + + if( $bAll ){ print DESTFILE $leftpart."\t".$lang."\t".$rightpart.$extract_date ; } + else { + foreach my $sLang ( keys( %{ $langhash_ref } ) ){ + if( $sLang=~ /all/i ) { + push @{ $output{ $prj.$gid.$lid.$file.$type.$plattform.$helpid } } , $leftpart."\t".$lang."\t".$rightpart.$extract_date ; + #print DESTFILE $leftpart."\t".$lang."\t".$rightpart.$extract_date; + } + #if( $sLang eq "de" && $lang eq "de" ) { + # push @{ $output{ $prj.$gid.$lid.$file.$type.$plattform.$helpid } } , $leftpart."\t".$lang."\t".$rightpart.$extract_date ; + #print DESTFILE $leftpart."\t".$lang."\t".$rightpart.$extract_date; + #} + if( $sLang eq "en-US" && $lang eq "en-US" ) { + push @order , $prj.$gid.$lid.$file.$type.$plattform.$helpid; + if( !$bFakeEnglish ){ push @{ $output{ $prj.$gid.$lid.$file.$type.$plattform.$helpid } } , $leftpart."\t".$lang."\t".$rightpart.$extract_date ; } + #print DESTFILE $leftpart."\t".$lang."\t".$rightpart.$extract_date; + } + + } + } + } + } + # Insert particles + while ( ){ + if( /$sdf_regex/ ){ + my $leftpart = defined $2 ? $2 : ''; + my $prj = defined $3 ? $3 : ''; + my $lang = defined $12 ? $12 : ''; + my $rightpart = defined $13 ? $13 : ''; + my $timestamp = defined $18 ? $18 : ''; + + #my $prj = defined $3 ? $3 : ''; + my $file = defined $4 ? $4 : ''; + my $type = defined $6 ? $6 : ''; + my $gid = defined $7 ? $7 : ''; + my $lid = defined $8 ? $8 : ''; + #my $lang = defined $12 ? $12 : ''; + my $plattform = defined $10 ? $10 : ''; + my $helpid = defined $9 ? $9 : ''; + + + if( $use_default_date ) + { + $extract_date = "$default_date\n" ; + } + elsif( $extract_date eq "" ) + { + $extract_date = $timestamp; + } + + if( ! ( $prj =~ /binfilter/i ) ) { + push @{ $output{ $prj.$gid.$lid.$file.$type.$plattform.$helpid } } , $leftpart."\t".$lang."\t".$rightpart.$extract_date ; + #print DESTFILE $leftpart."\t".$lang."\t".$rightpart.$extract_date ; + } + } + } + + # Write! + foreach my $curkey ( @order ){ + foreach my $curlist ( $output{ $curkey } ){ + foreach my $line ( @{$curlist} ){ + print DESTFILE $line; + } + } + } + + }else { print STDERR "Can't open $outputfile";} + } + close DESTFILE; + close LOCALIZEPARTICLE; + close ALLPARTICLES_MERGED; + + #print STDOUT "DBG: \$localizeSDF $localizeSDF \$particleSDF_merged $particleSDF_merged\n"; + unlink $localizeSDF , $particleSDF_merged , $my_localize_log; + + #sort_outfile( $outputfile ); + #remove_obsolete( $outputfile ) , if $bHasSourceLanguage ne ""; + } + +######################################################### +sub remove_obsolete{ + my $outfile = shift; + my @lines; + my $enusleftpart; + my @good_lines; + + print STDOUT "### Removing obsolete strings\n"; + + # Kick out all strings without en-US reference + if ( open ( SORTEDFILE , "< $outfile" ) ){ + while( ){ + if( /$sdf_regex/ ){ + my $line = defined $_ ? $_ : ''; + my $language = defined $12 ? $12 : ''; + my $prj = defined $3 ? $3 : ''; + my $file = defined $4 ? $4 : ''; + my $type = defined $6 ? $6 : ''; + my $gid = defined $7 ? $7 : ''; + my $lid = defined $8 ? $8 : ''; + my $plattform = defined $10 ? $10 : ''; + my $helpid = defined $9 ? $9 : ''; + + my $leftpart = $prj.$gid.$lid.$file.$type.$plattform.$helpid; + + if( $language eq "en-US" ){ # source string found, 1. entry + $enusleftpart = $leftpart; + push @good_lines , $line; + }else{ + if( !defined $enusleftpart or !defined $leftpart ){ + print STDERR "BADLINE: $line\n"; + print STDERR "\$enusleftpart = $enusleftpart\n"; + print STDERR "\$leftpart = $leftpart\n"; + } + if( $enusleftpart eq $leftpart ){ # matching language + push @good_lines , $line; + } + #else{ + # print STDERR "OUT: \$enusleftpart=$enusleftpart \$leftpart=$leftpart \$line=$line\n"; + #} + } + } + } + close SORTEDFILE; + } else { print STDERR "ERROR: Can't open file $outfile\n";} + + # Write file + if ( open ( SORTEDFILE , "> $outfile" ) ){ + foreach my $newline ( @good_lines ) { + print SORTEDFILE $newline; + } + close SORTEDFILE; + } else { print STDERR "ERROR: Can't open file $outfile\n";} + +} +######################################################### +sub sort_outfile{ + my $outfile = shift; + print STDOUT "### Sorting ... $outfile ..."; + my @lines; + my @sorted_lines; + + + #if ( open ( SORTEDFILE , "< $outputfile" ) ){ + if ( open ( SORTEDFILE , "< $outfile" ) ){ + my $line; + while ( ){ + $line = $_; + if( $line =~ /^[^\#]/ ){ + push @lines , $line; + } + } + close SORTEDFILE; + @sorted_lines = sort { + my $xa_lang = ""; + my $xa_left_part = ""; + my $xa_right_part = ""; + my $xa_timestamp = ""; + my $xb_lang = ""; + my $xb_left_part = ""; + my $xb_right_part = ""; + my $xb_timestamp = ""; + my $xa = ""; + my $xb = ""; + my @alist; + my @blist; + + if( $a=~ /$sdf_regex/ ){ + $xa_left_part = defined $2 ? $2 : ''; + $xa_lang = defined $12 ? $12 : ''; + $xa_right_part = defined $13 ? $13 : ''; + $xa_left_part = remove_last_column( $xa_left_part ); + + } + if( $b=~ /$sdf_regex/ ){ + $xb_left_part = defined $2 ? $2 : ''; + $xb_lang = defined $12 ? $12 : ''; + $xb_right_part = defined $13 ? $13 : ''; + $xb_left_part = remove_last_column( $xb_left_part ); + + + } + if( ( $xa_left_part cmp $xb_left_part ) == 0 ){ # Left part equal + if( ( $xa_lang cmp $xb_lang ) == 0 ){ # Lang equal + return ( $xa_right_part cmp $xb_right_part ); # Right part compare + } + elsif( $xa_lang eq "en-US" ) { return -1; } # en-US wins + elsif( $xb_lang eq "en-US" ) { return 1; } # en-US wins + else { return $xa_lang cmp $xb_lang; } # lang compare + } + else { + return $xa_left_part cmp $xb_left_part; # Left part compare + } + } @lines; + + if ( open ( SORTEDFILE , "> $outfile" ) ){ + print SORTEDFILE get_license_header(); + foreach my $newline ( @sorted_lines ) { + print SORTEDFILE $newline; + #print STDOUT $newline; + } + } + close SORTEDFILE; + } else { print STDERR "WARNING: Can't open file $outfile\n";} + print "done\n"; + +} +######################################################### +sub remove_last_column{ + my $string = shift; + my @alist = split ( "\t" , $string ); + pop @alist; + return join( "\t" , @alist ); +} + +######################################################### +sub rename_language{ + my $fallbackhashhash_ref = shift; + my $cur_fallback = shift; + my $cur_lang = shift; + my $line; + + foreach my $key( keys ( %{ $fallbackhashhash_ref->{ $cur_fallback } } ) ){ + $line = $fallbackhashhash_ref->{ $cur_fallback }{ $key }; + if( $line =~ /$sdf_regex/ ){ + my $leftpart = defined $2 ? $2 : ''; + my $lang = defined $12 ? $12 : ''; + my $rightpart = defined $13 ? $13 : ''; + + $fallbackhashhash_ref->{ $cur_lang }{ $key } = $leftpart."\t".$cur_lang."\t".$rightpart; + } + } +} + +############################################################ +sub remove_duplicates{ + my $list_ref = shift; + my %tmphash; + foreach my $key ( @{ $list_ref } ){ $tmphash{ $key } = '' ; } + @{$list_ref} = keys( %tmphash ); +} + +############################################################## +sub fetch_fallback{ + my $sdfparticleslist_ref = shift; + my $localizeSDF = shift; + my $langhash_ref = shift; + my %fallbackhashhash; + my $cur_lang; + my @langlist; + + foreach my $key ( keys ( %{ $langhash_ref } ) ){ + $cur_lang = $langhash_ref->{ $key }; + if ( $cur_lang ne "" ) { + push @langlist , $cur_lang; + } + } + remove_duplicates( \@langlist ); + foreach $cur_lang ( @langlist ){ + if( $cur_lang eq "en-US" ){ + read_fallbacks_from_source( $localizeSDF , $cur_lang , \%fallbackhashhash ); + } + } + + # remove de / en-US + my @tmplist; + foreach $cur_lang( @langlist ){ + if( $cur_lang ne "en-US" ){ + push @tmplist , $cur_lang; + + } + } + @langlist = @tmplist; + if ( $#langlist +1 ){ + read_fallbacks_from_particles( $sdfparticleslist_ref , \@langlist , \%fallbackhashhash ); + + } + return (\%fallbackhashhash); +} + +######################################################### +sub write_file{ + + my $localizeFile = shift; + my $index_ref = shift; + + if( open DESTFILE , "+> $localizeFile" ){ + foreach my $key( %{ $index_ref } ){ + print DESTFILE ($index_ref->{ $key }, "\n" ); + } + close DESTFILE; + }else { + print STDERR "Can't open/create '$localizeFile'"; + } +} + +######################################################### +sub read_file{ + + my $sdffile = shift; + my $langhash_ref = shift; + my %block = (); + + open MYFILE , "< $sdffile" + or die "Can't open '$sdffile'\n"; + while( ){ + if( /$sdf_regex/ ){ + my $line = defined $_ ? $_ : ''; + my $prj = defined $3 ? $3 : ''; + my $file = defined $4 ? $4 : ''; + my $type = defined $6 ? $6 : ''; + my $gid = defined $7 ? $7 : ''; + my $lid = defined $8 ? $8 : ''; + my $plattform = defined $10 ? $10 : ''; + my $lang = defined $12 ? $12 : ''; + my $helpid = defined $9 ? $9 : ''; + + foreach my $isolang ( keys ( %{ $langhash_ref } ) ){ + if( $isolang=~ /$lang/i || $isolang=~ /all/i ) { $block{$prj.$gid.$lid.$file.$type.$plattform.$helpid } = $line ; } + } + } + } + return (\%block); +} + +######################################################### +sub read_fallbacks_from_particles{ + + my $sdfparticleslist_ref = shift; + my $isolanglist_ref = shift; + my $fallbackhashhash_ref = shift; + my $block_ref; + foreach my $currentfile ( @{ $sdfparticleslist_ref } ){ + if ( open MYFILE , "< $currentfile" ) { + while(){ + if( /$sdf_regex/ ){ + my $line = defined $_ ? $_ : ''; + my $prj = defined $3 ? $3 : ''; + my $file = defined $4 ? $4 : ''; + my $type = defined $6 ? $6 : ''; + my $gid = defined $7 ? $7 : ''; + my $lid = defined $8 ? $8 : ''; + my $lang = defined $12 ? $12 : ''; + my $plattform = defined $10 ? $10 : ''; + my $helpid = defined $9 ? $9 : ''; + + chomp( $line ); + + foreach my $isolang ( @{$isolanglist_ref} ){ + if( $isolang=~ /$lang/i ) { + $fallbackhashhash_ref->{ $isolang }{ $prj.$gid.$lid.$file.$type.$plattform.$helpid } = $line ; + } + } + } + } + }else { print STDERR "WARNING: Can't open file $currentfile"; } + } +} + +######################################################### +sub read_fallbacks_from_source{ + + my $sdffile = shift; + my $isolang = shift; + my $fallbackhashhash_ref = shift; + my $block_ref; + # read fallback for single file + open MYFILE , "< $sdffile" + or die "Can't open '$sdffile'\n"; + + while( ){ + if( /$sdf_regex/ ){ + my $line = defined $_ ? $_ : ''; + my $prj = defined $3 ? $3 : ''; + my $file = defined $4 ? $4 : ''; + my $type = defined $6 ? $6 : ''; + my $gid = defined $7 ? $7 : ''; + my $lid = defined $8 ? $8 : ''; + my $helpid = defined $9 ? $9 : ''; + my $lang = defined $12 ? $12 : ''; + my $plattform = defined $10 ? $10 : ''; + + chomp( $line ); + if( $isolang=~ /$lang/i ) { $fallbackhashhash_ref->{ $isolang }{ $prj.$gid.$lid.$file.$type.$plattform.$helpid } = $line ; + } + } + } +} + +######################################################### +sub parseLanguages{ + + my $bAll; + my $bUseLocalize; + my $bHasSourceLanguage=""; + my $bFakeEnglish=""; + my %langhash; + my $iso=""; + my $fallback=""; + + #### -l all + if( $languages=~ /all/ ){ + $bAll = "TRUE"; + $bHasSourceLanguage = "TRUE"; + } + ### -l fr=de,de + elsif( $languages=~ /.*,.*/ ){ + my @tmpstr = split "," , $languages; + for my $lang ( @tmpstr ){ + if( $lang=~ /([a-zA-Z]{2,3}(-[a-zA-Z\-]*)*)(=([a-zA-Z]{2,3}(-[a-zA-Z\-]*)*))?/ ){ + $iso = $1; + $fallback = $4; + + if( ( $iso && $iso=~ /(en-US)/i ) || ( $fallback && $fallback=~ /(en-US)/i ) ) { + $bUseLocalize = "TRUE"; + } + if( ( $iso && $iso=~ /(en-US)/i ) ) { + $bHasSourceLanguage = "TRUE"; + } + if( $fallback ) { $langhash{ $iso } = $fallback; } + else { $langhash{ $iso } = ""; } + } + } + } + ### -l de + else{ + if( $languages=~ /([a-zA-Z]{2,3}(-[a-zA-Z\-]*)*)(=([a-zA-Z]{2,3}(-[a-zA-Z\-]*)*))?/ ){ + $iso = $1; + $fallback = $4; + + if( ( $iso && $iso=~ /(en-US)/i ) || ( $fallback && $fallback=~ /(en-US)/i ) ) { + $bUseLocalize = "TRUE"; + + } + if( ( $iso && $iso=~ /(en-US)/i ) ) { + $bHasSourceLanguage = "TRUE"; + } + + if( $fallback ) { $langhash{ $iso } = $fallback; } + else { $langhash{ $iso } = ""; } + } + } + # HACK en-US always needed! + if( !$bHasSourceLanguage ){ + #$bHasSourceLanguage = "TRUE"; + $bUseLocalize = "TRUE"; + $bFakeEnglish = "TRUE"; + $langhash{ "en-US" } = ""; + } + return ( $bAll , $bUseLocalize , \%langhash , $bHasSourceLanguage, $bFakeEnglish); +} + +######################################################### +sub parse_options{ + + my $help; + my $merge; + my $extract; + my $success = GetOptions('f=s' => \$sdffile , 'l=s' => \$languages , 's=s' => \$srcpath , 'h' => \$help , 'v' => \$bVerbose , + 'm' => \$merge , 'e' => \$extract , 'x' => \$no_sort , 'd' => \$use_default_date ); + $outputfile = $sdffile; + + #print STDOUT "DBG: lang = $languages\n"; + if( !$srcpath ){ + #$srcpath = "$ENV{SRC_ROOT}"; + if( !$srcpath ){ + print STDERR "No path to the source root found!\n\n"; + usage(); + exit(1); + } + } + if( $help || !$success || $#ARGV > 1 || ( !$sdffile ) ){ + usage(); + exit(1); + } + if( $merge && $sdffile && ! ( -r $sdffile)){ + print STDERR "Can't open file '$sdffile'\n"; + exit(1); + } + if( !( $languages=~ /[a-zA-Z]{2,3}(-[a-zA-Z\-]*)*(=[a-zA-Z]{2,3}(-[a-zA-Z\-]*)*)?(,[a-zA-Z]{2,3}(-[a-zA-Z\-]*)*(=[a-zA-Z]{2,3}(-[a-zA-Z\-]*)*)?)*/ ) ){ + print STDERR "Please check the -l iso code\n"; + exit(1); + } + if( ( !$merge && !$extract ) || ( $merge && $extract ) ){ usage();exit( -1 );} + if( $extract ){ $mode = "extract"; } + else { $mode = "merge"; } +} + +######################################################### +sub usage{ + + print STDERR "Usage: localize.pl\n"; + print STDERR "Split or collect SDF files\n"; + print STDERR " merge: -m -f -l l1[=f1][,l2[=f2]][...] [ -s ]\n"; + print STDERR " extract: -e -f -l [ -s ] [-d]\n"; + print STDERR "Options:\n"; + print STDERR " -h help\n"; + print STDERR " -m Merge mode\n"; + print STDERR " -e Extract mode\n"; + print STDERR " -f To split a big SDF file into particles\n"; + print STDERR " To collect and join all particles to one big file\n"; + print STDERR " -s Path to the modules, if no \$SRC_ROOT is set\n"; + print STDERR " -l ( all | | =fallback ) comma seperated languages\n"; + print STDERR " -d Use default date in extracted sdf file\n"; + print STDERR " -v Verbose\n"; + print STDERR "\nExample:\n"; + print STDERR "\nlocalize -e -l en-US,pt-BR=en-US -f my.sdf\n( Extract en-US and pt-BR with en-US fallback )\n"; + print STDERR "\nlocalize -m -l cs -f my.sdf\n( Merge cs translation into the sourcecode ) \n"; +} + +# my $line = defined $_ ? $_ : ''; +# my $leftpart = defined $2 ? $2 : ''; +# my $prj = defined $3 ? $3 : ''; +# my $file = defined $4 ? $4 : ''; +# my $dummy = defined $5 ? $5 : ''; +# my $type = defined $6 ? $6 : ''; +# my $gid = defined $7 ? $7 : ''; +# my $lid = defined $8 ? $8 : ''; +# my $helpid = defined $9 ? $9 : ''; +# my $plattform = defined $10 ? $10 : ''; +# my $width = defined $11 ? $11 : ''; +# my $lang = defined $12 ? $12 : ''; +# my $rightpart = defined $13 ? $13 : ''; +# my $text = defined $14 ? $14 : ''; +# my $helptext = defined $15 ? $15 : ''; +# my $quickhelptext = defined $16 ? $16 : ''; +# my $title = defined $17 ? $17 : ''; +# my $timestamp = defined $18 ? $18 : ''; + diff --git a/transex3/source/cfgmerge.cxx b/transex3/source/cfgmerge.cxx index 21b4aeff185d..0607c9e9bb06 100644 --- a/transex3/source/cfgmerge.cxx +++ b/transex3/source/cfgmerge.cxx @@ -172,10 +172,6 @@ extern char *GetOutputFile( int argc, char* argv[]) Export::sLanguages = ByteString( argv[ i ]); } break; - case STATE_ISOCODE99: { - Export::sIsoCode99 = ByteString( argv[ i ]); - } - break; } } } diff --git a/transex3/source/directory.cxx b/transex3/source/directory.cxx index a4a2abc70e0f..ed0fe27d22c2 100644 --- a/transex3/source/directory.cxx +++ b/transex3/source/directory.cxx @@ -174,6 +174,16 @@ void Directory::readDirectory ( const rtl::OUString& sFullpath ) #else +class dirholder +{ +private: + DIR *mpDir; +public: + dirholder(DIR *pDir) : mpDir(pDir) {} + int close() { int nRet = mpDir ? closedir(mpDir) : 0; mpDir = NULL; return nRet; } + ~dirholder() { close(); } +}; + void Directory::readDirectory( const rtl::OUString& sFullpath ) { struct stat statbuf; @@ -195,13 +205,14 @@ void Directory::readDirectory( const rtl::OUString& sFullpath ) if( S_ISDIR(statbuf.st_mode ) == 0 ) { return; }// error } return; // not dir if( (dir = opendir( path ) ) == NULL ) {printf("readerror 2 in %s \n",path); return; } // error } return; // error + dirholder aHolder(dir); sFullpathext += rtl::OString( "/" ); const rtl::OString sDot ( "." ) ; const rtl::OString sDDot( ".." ); - chdir( path ); + if ( chdir( path ) == -1 ) { printf("chdir error in %s \n",path); return; } // error while( ( dirp = readdir( dir ) ) != NULL ) { @@ -253,8 +264,8 @@ void Directory::readDirectory( const rtl::OUString& sFullpath ) } } } - chdir( ".." ); - if( closedir( dir ) < 0 ) return ; // error + if ( chdir( ".." ) == -1 ) { printf("chdir error in .. \n"); return; } // error + if( aHolder.close() < 0 ) return ; // error std::sort( aFileVec.begin() , aFileVec.end() , File::lessFile ); std::sort( aDirVec.begin() , aDirVec.end() , Directory::lessDir ); diff --git a/transex3/source/export2.cxx b/transex3/source/export2.cxx index 5db1067a7afb..7815e80e033f 100644 --- a/transex3/source/export2.cxx +++ b/transex3/source/export2.cxx @@ -42,6 +42,7 @@ #include #include #include +#include using namespace std; // @@ -93,7 +94,7 @@ ResData::~ResData() /*****************************************************************************/ ByteString Export::sLanguages; ByteString Export::sForcedLanguages; -ByteString Export::sIsoCode99; +//ByteString Export::sIsoCode99; /*****************************************************************************/ void Export::DumpExportList( ByteString& sListName , ExportList& aList ){ @@ -648,6 +649,16 @@ int Export::getCurrentDirectory( rtl::OUString& base_fqurl_out, rtl::OUString& b return osl::File::getFileURLFromSystemPath( base_out , base_fqurl_out ); } +void Export::getCurrentDir( string& dir ) +{ + char buffer[64000]; + if( getcwd( buffer , sizeof( buffer ) ) == 0 ){ + cerr << "Error: getcwd failed!\n"; + exit( -1 ); + } + dir = string( buffer ); +} + // Stolen from sal/osl/unx/tempfile.c diff --git a/transex3/source/filter/merge/FCFGMerge.cfg b/transex3/source/filter/merge/FCFGMerge.cfg new file mode 100644 index 000000000000..46fcccafe7e4 --- /dev/null +++ b/transex3/source/filter/merge/FCFGMerge.cfg @@ -0,0 +1,125 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: FCFGMerge.cfg,v $ +# +# $Revision: 1.5 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +#************************************************ +# Specify the verbose mode of this tool. +# 1 = show errors only +# 2 = show errors/warnings (default) +# 3 = show errors/warnings and some generic infos +# 4 = show anything (including detailed infos) +# +# [OPTIONAL] +#************************************************ + +loglevel = 2 + +#************************************************ +# This extension is used for all XML files. It doesnt +# matter if its used for reading fragments or writing +# XML packages. +# Must be given without any additional signes like "." +# or "*."! +# +# [REQUIRED] +#************************************************ + +extension_xcu=xcu + +#************************************************ +# This extension is used for all Package files. It doesnt +# matter if its used for reading such files or writing +# it. +# Must be given without any additional signes like "." +# or "*."! +# +# [REQUIRED] +#************************************************ + +extension_pkg=pkg + +#************************************************ +# These values are used to generate a correct XML +# header. +# Note: The property "xmlpackage" must be specified +# via command line. There exists more then one +# possible value. +# +# [REQUIRED] +#************************************************ + +xmlversion = 1.0 +xmlencoding = UTF-8 +xmlpath = org.openoffice.TypeDetection +#xmlpackage = + +#************************************************ +# These values are used to name the configuration +# sets inside the generated XCM file for different +# item groups like e.g. types, filters etcpp. +# +# [REQUIRED] +#************************************************ + +setname_types = Types +setname_filters = Filters +setname_frameloaders = FrameLoaders +setname_contenthandlers = ContentHandlers + +subdir_types = types +subdir_filters = filters +subdir_frameloaders = frameloaders +subdir_contenthandlers = contenthandlers + +#************************************************ +# This delimiter is used to split every +# item list of the package configuration files +# (which are temp. created by the make proccess) +# into its tokens. +# +# [REQUIRED] +#************************************************ +delimiter=, + +#************************************************ +# Enable/disable removing of leading/trailing withespaces +# during splitting stringlists. +# +# [REQUIRED] +#************************************************ +trim=true + +#************************************************ +# Enable/disable removing of leading/trailing "-signs +# during splitting stringlists. +# +# [REQUIRED] +#************************************************ +decode=false diff --git a/transex3/source/filter/merge/FCFGMerge.java b/transex3/source/filter/merge/FCFGMerge.java new file mode 100644 index 000000000000..7fbfa8a0c986 --- /dev/null +++ b/transex3/source/filter/merge/FCFGMerge.java @@ -0,0 +1,131 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: FCFGMerge.java,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package com.sun.star.filter.config.tools.merge; + +//_______________________________________________ + +import java.lang.*; +import java.util.*; +import java.io.*; +import com.sun.star.filter.config.tools.utils.*; + +//_______________________________________________ + +/** + * Its a simple command line tool, which can merge different XML fragments + * together. Such fragments must exist as files on disk, will be moved into + * one file together on disk. + * + * + */ +public class FCFGMerge +{ + //___________________________________________ + // const + + private static final java.lang.String CFGFILE = "com/sun/star/filter/config/tools/merge/FCFGMerge.cfg"; + private static final java.lang.String PROP_LOGLEVEL = "loglevel"; + + //___________________________________________ + // main + + public static void main(java.lang.String[] sCmdLine) + { + FCFGMerge.printCopyright(); + + // create log object in default mode "WARNINGS" + // If a command line parameter indicates another + // level - change it! + Logger aLog = new Logger(); + + try + { + // merge config file and overwrite properties + // via command line + ConfigHelper aCfg = null; + aCfg = new ConfigHelper(CFGFILE, sCmdLine); + + // update log level + int nLogLevel = aCfg.getInt(PROP_LOGLEVEL, Logger.LEVEL_WARNINGS); + aLog = new Logger(nLogLevel); + + // help requested? + if (aCfg.isHelp()) + { + FCFGMerge.printHelp(); + System.exit(-1); + } + + // create new merge object and start operation + Merger aMerger = new Merger(aCfg, aLog); + aMerger.merge(); + } + catch(java.lang.Throwable ex) + { + aLog.setException(ex); + System.exit(-1); + } + + System.exit(0); + } + + //___________________________________________ + + /** prints out a copyright message on stdout. + */ + private static void printCopyright() + { + java.lang.StringBuffer sOut = new java.lang.StringBuffer(256); + sOut.append("FCFGMerge\n"); + sOut.append("Copyright: 2003 by Sun Microsystems, Inc.\n"); + sOut.append("All Rights Reserved.\n"); + System.out.println(sOut.toString()); + } + + //___________________________________________ + + /** prints out a help message on stdout. + */ + private static void printHelp() + { + java.lang.StringBuffer sOut = new java.lang.StringBuffer(256); + sOut.append("____________________________________________________________\n"); + sOut.append("usage: FCFGMerge cfg=\n" ); + sOut.append("parameters:\n" ); + sOut.append("\tcfg=\n" ); + sOut.append("\t\tmust point to a system file, which contains\n" ); + sOut.append("\t\tall neccessary configuration data for the merge process.\n"); + sOut.append("\n\tFurther cou can specify every parameter allowed in the\n" ); + sOut.append("\n\tconfig file as command line parameter too, to overwrite\n" ); + sOut.append("\n\tthe value from the file.\n" ); + System.out.println(sOut.toString()); + } +} diff --git a/transex3/source/filter/merge/Manifest.mf b/transex3/source/filter/merge/Manifest.mf new file mode 100644 index 000000000000..1337eaf4d39a --- /dev/null +++ b/transex3/source/filter/merge/Manifest.mf @@ -0,0 +1 @@ +Main-Class: com.sun.star.filter.config.tools.merge.FCFGMerge diff --git a/transex3/source/filter/merge/Merger.java b/transex3/source/filter/merge/Merger.java new file mode 100644 index 000000000000..0bf11fc42fbf --- /dev/null +++ b/transex3/source/filter/merge/Merger.java @@ -0,0 +1,364 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: Merger.java,v $ + * $Revision: 1.8 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package com.sun.star.filter.config.tools.merge; + +//_______________________________________________ + +import java.lang.*; +import java.util.*; +import java.io.*; +import com.sun.star.filter.config.tools.utils.*; + +//_______________________________________________ + +/** can merge different xml fragments together. + * + * + */ +public class Merger +{ + //___________________________________________ + // const + + private static final java.lang.String PROP_XMLVERSION = "xmlversion" ; // <= global cfg file + private static final java.lang.String PROP_XMLENCODING = "xmlencoding" ; // <= global cfg file + private static final java.lang.String PROP_XMLPATH = "xmlpath" ; // <= global cfg file + private static final java.lang.String PROP_XMLPACKAGE = "xmlpackage" ; // <= global cfg file + + private static final java.lang.String PROP_SETNAME_TYPES = "setname_types" ; // <= global cfg file + private static final java.lang.String PROP_SETNAME_FILTERS = "setname_filters" ; // <= global cfg file + private static final java.lang.String PROP_SETNAME_LOADERS = "setname_frameloaders" ; // <= global cfg file + private static final java.lang.String PROP_SETNAME_HANDLERS = "setname_contenthandlers" ; // <= global cfg file + + private static final java.lang.String PROP_SUBDIR_TYPES = "subdir_types" ; // <= global cfg file + private static final java.lang.String PROP_SUBDIR_FILTERS = "subdir_filters" ; // <= global cfg file + private static final java.lang.String PROP_SUBDIR_LOADERS = "subdir_frameloaders" ; // <= global cfg file + private static final java.lang.String PROP_SUBDIR_HANDLERS = "subdir_contenthandlers" ; // <= global cfg file + + private static final java.lang.String PROP_EXTENSION_XCU = "extension_xcu" ; // <= global cfg file + private static final java.lang.String PROP_EXTENSION_PKG = "extension_pkg" ; // <= global cfg file + + private static final java.lang.String PROP_DELIMITER = "delimiter" ; // <= global cfg file + private static final java.lang.String PROP_TRIM = "trim" ; // <= global cfg file + private static final java.lang.String PROP_DECODE = "decode" ; // <= global cfg file + + private static final java.lang.String PROP_FRAGMENTSDIR = "fragmentsdir" ; // <= cmdline + private static final java.lang.String PROP_TEMPDIR = "tempdir" ; // <= cmdline + private static final java.lang.String PROP_OUTDIR = "outdir" ; // <= cmdline + private static final java.lang.String PROP_PKG = "pkg" ; // <= cmdline + private static final java.lang.String PROP_DEBUG = "debug" ; // <= cmdline + + private static final java.lang.String PROP_TCFG = "tcfg" ; // <= cmdline + private static final java.lang.String PROP_FCFG = "fcfg" ; // <= cmdline + private static final java.lang.String PROP_LCFG = "lcfg" ; // <= cmdline + private static final java.lang.String PROP_CCFG = "ccfg" ; // <= cmdline + private static final java.lang.String PROP_LANGUAGEPACK = "languagepack" ; // <= cmdline + + private static final java.lang.String PROP_ITEMS = "items" ; // <= pkg cfg files! + + //___________________________________________ + // member + + //------------------------------------------- + /** TODO */ + private ConfigHelper m_aCfg; + + //------------------------------------------- + /** TODO */ + private Logger m_aLog; + + //------------------------------------------- + /** TODO */ + private java.io.File m_aFragmentsDir; + + //------------------------------------------- + /** TODO */ + private java.io.File m_aTempDir; + + //------------------------------------------- + /** TODO */ + private java.io.File m_aOutDir; + + //------------------------------------------- + /** TODO */ + private java.util.Vector m_lTypes; + private java.util.Vector m_lFilters; + private java.util.Vector m_lLoaders; + private java.util.Vector m_lHandlers; + + //___________________________________________ + // interface + + //------------------------------------------- + /** initialize a new instance of this class and + * try to get all needed resources from the config module. + * + * @param aCfg + * provides access to all values of the global + * config file and to the command line. + * + * @param aLog + * can be used to print out log informations. + */ + public Merger(ConfigHelper aCfg, + Logger aLog) + throws java.lang.Exception + { + m_aCfg = aCfg; + m_aLog = aLog; + + m_aFragmentsDir = new java.io.File(m_aCfg.getString(PROP_FRAGMENTSDIR)); + m_aTempDir = new java.io.File(m_aCfg.getString(PROP_TEMPDIR )); +// m_aOutDir = new java.io.File(m_aCfg.getString(PROP_OUTDIR )); + + java.lang.String sDelimiter = m_aCfg.getString(PROP_DELIMITER); + boolean bTrim = m_aCfg.getBoolean(PROP_TRIM); + boolean bDecode = m_aCfg.getBoolean(PROP_DECODE); + + try + { + ConfigHelper aFcfg = new ConfigHelper(m_aCfg.getString(PROP_TCFG), null); + m_lTypes = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode); + } + catch(java.util.NoSuchElementException ex1) + { + m_lTypes = new java.util.Vector(); + //m_aLog.setWarning("Fragment list of types is missing. Parameter \"items\" seems to be invalid."); + } + + try + { + ConfigHelper aFcfg = new ConfigHelper(m_aCfg.getString(PROP_FCFG), null); + m_lFilters = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode); + } + catch(java.util.NoSuchElementException ex1) + { + m_lFilters = new java.util.Vector(); + //m_aLog.setWarning("Fragment list of filters is missing. Parameter \"items\" seems to be invalid."); + } + + try + { + ConfigHelper aFcfg = new ConfigHelper(m_aCfg.getString(PROP_LCFG), null); + m_lLoaders = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode); + } + catch(java.util.NoSuchElementException ex1) + { + m_lLoaders = new java.util.Vector(); + //m_aLog.setWarning("Fragment list of frame loader objects is missing. Parameter \"items\" seems to be invalid."); + } + + try + { + ConfigHelper aFcfg = new ConfigHelper(m_aCfg.getString(PROP_CCFG), null); + m_lHandlers = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode); + } + catch(java.util.NoSuchElementException ex1) + { + m_lHandlers = new java.util.Vector(); + //m_aLog.setWarning("Fragment list of content handler objects is missing. Parameter \"items\" seems to be invalid."); + } + } + + //------------------------------------------- + /** TODO */ + public synchronized void merge() + throws java.lang.Exception + { + java.lang.StringBuffer sBuffer = new java.lang.StringBuffer(1000000); + java.lang.String sPackage = m_aCfg.getString(PROP_PKG); + + m_aLog.setGlobalInfo("create package \""+sPackage+"\" ..."); + m_aLog.setDetailedInfo("generate package header ... "); + + sBuffer.append( + XMLHelper.generateHeader( + m_aCfg.getString (PROP_XMLVERSION ), + m_aCfg.getString (PROP_XMLENCODING ), + m_aCfg.getString (PROP_XMLPATH ), + m_aCfg.getString (PROP_XMLPACKAGE ), + m_aCfg.getBoolean(PROP_LANGUAGEPACK, false))); + + // counts all transfered fragments + // Can be used later to decide, if a generated package file + // contains "nothing"! + int nItemCount = 0; + + for (int i=0; i<4; ++i) + { + java.lang.String sSetName = null; + java.lang.String sSubDir = null; + java.util.Vector lFragments = null; + + try + { + switch(i) + { + case 0: // types + { + m_aLog.setDetailedInfo("generate set for types ... "); + sSetName = m_aCfg.getString(PROP_SETNAME_TYPES); + sSubDir = m_aCfg.getString(PROP_SUBDIR_TYPES ); + lFragments = m_lTypes; + } + break; + + case 1: // filters + { + m_aLog.setDetailedInfo("generate set for filter ... "); + sSetName = m_aCfg.getString(PROP_SETNAME_FILTERS); + sSubDir = m_aCfg.getString(PROP_SUBDIR_FILTERS ); + lFragments = m_lFilters; + } + break; + + case 2: // loaders + { + m_aLog.setDetailedInfo("generate set for frame loader ... "); + sSetName = m_aCfg.getString(PROP_SETNAME_LOADERS); + sSubDir = m_aCfg.getString(PROP_SUBDIR_LOADERS ); + lFragments = m_lLoaders; + } + break; + + case 3: // handlers + { + m_aLog.setDetailedInfo("generate set for content handler ... "); + sSetName = m_aCfg.getString(PROP_SETNAME_HANDLERS); + sSubDir = m_aCfg.getString(PROP_SUBDIR_HANDLERS ); + lFragments = m_lHandlers; + } + break; + } + + nItemCount += lFragments.size(); + + getFragments( + new java.io.File(m_aFragmentsDir, sSubDir), + sSetName, + lFragments, + 1, + sBuffer); + } + catch(java.util.NoSuchElementException exIgnore) + { continue; } + } + + m_aLog.setDetailedInfo("generate package footer ... "); + sBuffer.append(XMLHelper.generateFooter()); + + // Attention! + // If the package seem to be empty, it make no sense to generate a corresponding + // xml file. We should suppress writing of this file on disk completly ... + if (nItemCount < 1) + { + m_aLog.setWarning("Package is empty and will not result into a xml file on disk!? Please check configuration file."); + return; + } + m_aLog.setGlobalInfo("package contains "+nItemCount+" items"); + + java.io.File aPackage = new File(sPackage); + m_aLog.setGlobalInfo("write temp package \""+aPackage.getPath()); // TODO encoding must be readed from the configuration + FileHelper.writeEncodedBufferToFile(aPackage, "UTF-8", false, sBuffer); // check for success is done inside this method! + } + + //------------------------------------------- + /** TODO */ + private void getFragments(java.io.File aDir , + java.lang.String sSetName , + java.util.Vector lFragments , + int nPrettyTabs, + java.lang.StringBuffer sBuffer ) + throws java.lang.Exception + { + if (lFragments.size()<1) + { + m_aLog.setWarning("List of fragments is empty!? Will be ignored ..."); + return; + } + + java.util.Enumeration pFragments = lFragments.elements(); + java.lang.String sExtXcu = m_aCfg.getString(PROP_EXTENSION_XCU); + + for (int tabs=0; tabs\n"); + ++nPrettyTabs; + + // special mode for generating language packs. + // In such case we must live with some missing fragment files. + // Reason behind; Not all filters are realy localized. + // But we dont use a different fragment list. We try to locate + // any fragment file in its language-pack version ... + boolean bHandleLanguagePacks = m_aCfg.getBoolean(PROP_LANGUAGEPACK, false); + boolean bDebug = m_aCfg.getBoolean(PROP_DEBUG , false); + java.lang.String sEncoding = "UTF-8"; + if (bDebug) + sEncoding = "UTF-8Special"; + + while(pFragments.hasMoreElements()) + { + java.lang.String sFragment = (java.lang.String)pFragments.nextElement(); + java.io.File aFragment = new java.io.File(aDir, sFragment+"."+sExtXcu); + + // handle simple files only and check for existence! + if (!aFragment.exists()) + { + if (bHandleLanguagePacks) + { + m_aLog.setWarning("language fragment \""+aFragment.getPath()+"\" does not exist. Will be ignored."); + continue; + } + else + throw new java.io.IOException("fragment \""+aFragment.getPath()+"\" does not exists."); + } + + if (!aFragment.isFile()) + { + m_aLog.setWarning("fragment \""+aFragment.getPath()+"\" seem to be not a valid file."); + continue; + } + + // copy file content of original fragment + // Note: A FileNotFoundException will be thrown automaticly by the + // used reader objects. Let it break this method too. Our calli is interested + // on such errors :-) + m_aLog.setDetailedInfo("merge fragment \""+aFragment.getPath()+"\" ..."); + FileHelper.readEncodedBufferFromFile(aFragment, sEncoding, sBuffer); + + sBuffer.append("\n"); + } + + --nPrettyTabs; + for (int tabs=0; tabs\n"); + } +} diff --git a/transex3/source/filter/merge/makefile.mk b/transex3/source/filter/merge/makefile.mk new file mode 100644 index 000000000000..bf768be851d8 --- /dev/null +++ b/transex3/source/filter/merge/makefile.mk @@ -0,0 +1,96 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.9.102.1 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ = ..$/..$/.. +TARGET = FCFGMerge +PRJNAME = filter +PACKAGE = com$/sun$/star$/filter$/config$/tools$/merge + +# --- Settings ----------------------------------------------------- + +.INCLUDE: settings.mk + +#----- compile .java files ----------------------------------------- +#.IF "$(L10N_framework)"=="" + +OWNCOPY = \ + $(MISC)$/$(TARGET)_copied.done + +#JARFILES = \ +# ridl.jar \ +# unoil.jar \ +# jurt.jar \ +# juh.jar \ +# java_uno.jar + +CFGFILES = \ + FCFGMerge.cfg + +JAVACLASSFILES = \ + $(CLASSDIR)$/$(PACKAGE)$/Merger.class \ + $(CLASSDIR)$/$(PACKAGE)$/FCFGMerge.class + +CUSTOMMANIFESTFILE = \ + Manifest.mf + +MAXLINELENGTH = 100000 + +#----- make a jar from compiled files ------------------------------ + +JARCLASSDIRS = \ + com$/sun$/star$/filter$/config$/tools$/utils \ + com$/sun$/star$/filter$/config$/tools$/merge + +JARTARGET = $(TARGET).jar + +JARCOMPRESS = TRUE + +# --- targets ----------------------------------------------------- + +.INCLUDE : target.mk + +.IF "$(SOLAR_JAVA)" != "" || "$(GUI)"=="OS2" +ALLTAR : $(OWNCOPY) + +.IF "$(JARTARGETN)" != "" +$(JARTARGETN) : $(OWNCOPY) +.ENDIF + +$(OWNCOPY) : $(CFGFILES) + -$(MKDIRHIER) $(CLASSDIR)$/$(PACKAGE) + $(COPY) $? $(CLASSDIR)$/$(PACKAGE) && $(TOUCH) $@ + +.ENDIF # "$(SOLAR_JAVA)" != "" + +#.ELSE +#pseudo: + +#.ENDIF diff --git a/transex3/source/filter/utils/AnalyzeStartupLog.java b/transex3/source/filter/utils/AnalyzeStartupLog.java new file mode 100644 index 000000000000..498528850697 --- /dev/null +++ b/transex3/source/filter/utils/AnalyzeStartupLog.java @@ -0,0 +1,328 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: AnalyzeStartupLog.java,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package com.sun.star.filter.config.tools.utils; + +//_______________________________________________ +// imports +import java.util.*; +import java.lang.*; + +//_______________________________________________ +// implementation +public class AnalyzeStartupLog +{ + private class OperationTime + { + /** name the measured operation. */ + public java.lang.String sOperation; + + /** contains the time value, when this operation was started. */ + public long nStartTime; + + /** contains the time value, when this operation was finished. */ + public long nEndTime; + + /** text inside log file, which identifies the start time value. */ + public java.lang.String sStartMsg; + + /** text inside log file, which identifies the end time value. */ + public java.lang.String sEndMsg; + } + + //_________________________________ + // main + + public static void main(java.lang.String[] lCmdLine) + { + int nExit = 0; + try + { + // analyze command line + ConfigHelper aCmdLine = new ConfigHelper("", lCmdLine); + java.lang.String sLogDir = aCmdLine.getString("logdir" ); + java.lang.String sDataFile = aCmdLine.getString("datafile"); + + if (sLogDir == null || sDataFile == null) + { + System.err.println("AnalyzeStartupLog lodir= datafile="); + System.err.println("E.g.: AnalyzeStartupLog lodir=c:\\temp\\logs datafile=c:\\temp\\data.csv"); + System.exit(--nExit); + } + + // get list of all log files + boolean bRecursive = true; + java.util.Vector lLogs = FileHelper.getSystemFilesFromDir(new java.io.File(sLogDir), bRecursive); + if (lLogs == null || lLogs.isEmpty()) + { + System.err.println("log dir is empty"); + System.exit(--nExit); + } + + // analyze it + java.lang.StringBuffer sOut = new java.lang.StringBuffer(1000); + sOut.append("log;t_cfg_start;t_cfg_end;t_fwk_start;t_fwk_end;t_sfx_start;t_sfx_end;t_types_start;t_types_end;t_filters_start;t_filters_end;"); + sOut.append("t_filters_swriter_start;t_filters_swriter_end;t_filters_sweb_start;t_filters_sweb_end;t_filters_sglobal_start;t_filters_sglobal_end;t_filters_scalc_start;t_filters_scalc_end;t_filters_sdraw_start;t_filters_sdraw_end;t_filters_simpress_start;t_filters_simpress_end;t_filters_schart_start;t_filters_schart_end;t_filters_smath_start;t_filters_smath_end;"); + sOut.append("t_others_start;t_others_end;d_cfg;d_fwk;d_sfx;d_types;d_filters;d_others;d_complete\n"); + + java.util.Enumeration aIt = lLogs.elements(); + while (aIt.hasMoreElements()) + { + java.io.File aLog = (java.io.File)aIt.nextElement(); + java.io.FileReader aReader = new java.io.FileReader(aLog); + java.io.BufferedReader aBuffer = new java.io.BufferedReader(aReader); + + long t_cfg_start = 0; + long t_cfg_end = 0; + + long t_fwk_start = 0; + long t_fwk_end = 0; + + long t_sfx_start = 0; + long t_sfx_end = 0; + + long t_types_start = 0; + long t_types_end = 0; + + long t_filters_start = 0; + long t_filters_end = 0; + + long t_filters_swriter_start = 0; + long t_filters_swriter_end = 0; + + long t_filters_sweb_start = 0; + long t_filters_sweb_end = 0; + + long t_filters_sglobal_start = 0; + long t_filters_sglobal_end = 0; + + long t_filters_scalc_start = 0; + long t_filters_scalc_end = 0; + + long t_filters_sdraw_start = 0; + long t_filters_sdraw_end = 0; + + long t_filters_simpress_start = 0; + long t_filters_simpress_end = 0; + + long t_filters_schart_start = 0; + long t_filters_schart_end = 0; + + long t_filters_smath_start = 0; + long t_filters_smath_end = 0; + + long t_others_start = 0; + long t_others_end = 0; + + while (true) + { + java.lang.String sLine = aBuffer.readLine(); + if (sLine == null) + break; + + if (sLine.endsWith("| framework (as96863) ::FilterCache::FilterCache : { creation ConfigItem [file=standard, version=6, mode=3]")) + t_cfg_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("| framework (as96863) ::FilterCache::FilterCache : } creation ConfigItem")) + t_cfg_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("| framework (as96863) ::FilterCache::FilterCache : { reading TypeDetection.xml")) + t_fwk_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("| framework (as96863) ::FilterCache::FilterCache : } reading TypeDetection.xml")) + t_fwk_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("{ framework (as96863) ::FilterCFGAccess::impl_loadTypes")) + t_types_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} framework (as96863) ::FilterCFGAccess::impl_loadTypes")) + t_types_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("{ framework (as96863) ::FilterCFGAccess::impl_loadFilters")) + t_filters_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} framework (as96863) ::FilterCFGAccess::impl_loadFilters")) + t_filters_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("{ reading FilterGroup [swriter]")) + t_filters_swriter_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} reading FilterGroup [swriter]")) + t_filters_swriter_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("{ reading FilterGroup [sweb]")) + t_filters_sweb_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} reading FilterGroup [sweb]")) + t_filters_sweb_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("{ reading FilterGroup [sglobal]")) + t_filters_sglobal_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} reading FilterGroup [sglobal]")) + t_filters_sglobal_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("{ reading FilterGroup [scalc]")) + t_filters_scalc_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} reading FilterGroup [scalc]")) + t_filters_scalc_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("{ reading FilterGroup [sdraw]")) + t_filters_sdraw_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} reading FilterGroup [sdraw]")) + t_filters_sdraw_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("{ reading FilterGroup [simpress]")) + t_filters_simpress_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} reading FilterGroup [simpress]")) + t_filters_simpress_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("{ reading FilterGroup [schart]")) + t_filters_schart_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} reading FilterGroup [schart]")) + t_filters_schart_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("{ reading FilterGroup [smath]")) + t_filters_smath_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} reading FilterGroup [smath]")) + t_filters_smath_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("{ framework (as96863) ::FilterCFGAccess::impl_loadDetectors")) + t_others_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} framework (as96863) ::FilterCFGAccess::impl_loadContentHandlers")) + t_others_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} framework (as96863) ::FilterCache::FilterCache")) + t_sfx_start = new java.lang.Long(sLine.substring(0, 6)).longValue(); + else + if (sLine.endsWith("} desktop (lo119109) OfficeWrapper::OfficeWrapper")) + t_sfx_end = new java.lang.Long(sLine.substring(0, 6)).longValue(); + } + + sOut.append(aLog.getName() ); + sOut.append(";" ); + sOut.append(t_cfg_start ); + sOut.append(";" ); + sOut.append(t_cfg_end ); + sOut.append(";" ); + sOut.append(t_fwk_start ); + sOut.append(";" ); + sOut.append(t_fwk_end ); + sOut.append(";" ); + sOut.append(t_sfx_start ); + sOut.append(";" ); + sOut.append(t_sfx_end ); + sOut.append(";" ); + sOut.append(t_types_start ); + sOut.append(";" ); + sOut.append(t_types_end ); + sOut.append(";" ); + sOut.append(t_filters_start ); + sOut.append(";" ); + sOut.append(t_filters_end ); + sOut.append(";" ); + + sOut.append(t_filters_swriter_start ); + sOut.append(";" ); + sOut.append(t_filters_swriter_end ); + sOut.append(";" ); + sOut.append(t_filters_sweb_start ); + sOut.append(";" ); + sOut.append(t_filters_sweb_end ); + sOut.append(";" ); + sOut.append(t_filters_sglobal_start ); + sOut.append(";" ); + sOut.append(t_filters_sglobal_end ); + sOut.append(";" ); + sOut.append(t_filters_scalc_start ); + sOut.append(";" ); + sOut.append(t_filters_scalc_end ); + sOut.append(";" ); + sOut.append(t_filters_sdraw_start ); + sOut.append(";" ); + sOut.append(t_filters_sdraw_end ); + sOut.append(";" ); + sOut.append(t_filters_simpress_start ); + sOut.append(";" ); + sOut.append(t_filters_simpress_end ); + sOut.append(";" ); + sOut.append(t_filters_schart_start ); + sOut.append(";" ); + sOut.append(t_filters_schart_end ); + sOut.append(";" ); + sOut.append(t_filters_smath_start ); + sOut.append(";" ); + sOut.append(t_filters_smath_end ); + sOut.append(";" ); + + sOut.append(t_others_start ); + sOut.append(";" ); + sOut.append(t_others_end ); + sOut.append(";" ); + sOut.append(t_cfg_end -t_cfg_start ); + sOut.append(";" ); + sOut.append(t_fwk_end -t_fwk_start ); + sOut.append(";" ); + sOut.append(t_sfx_end -t_sfx_start ); + sOut.append(";" ); + sOut.append(t_types_end -t_types_start ); + sOut.append(";" ); + sOut.append(t_filters_end-t_filters_start); + sOut.append(";" ); + sOut.append(t_others_end -t_others_start ); + sOut.append(";" ); + sOut.append(t_others_end -t_cfg_start ); + sOut.append("\n" ); + + aBuffer.close(); + } + + java.io.FileWriter aCSV = new java.io.FileWriter(sDataFile); + java.lang.String sData = sOut.toString(); + aCSV.write(sData, 0, sData.length()); + aCSV.flush(); + aCSV.close(); + } + catch(java.lang.Throwable exAny) + { + System.err.println(exAny.getMessage()); + exAny.printStackTrace(); + System.exit(--nExit); + } + + System.exit(0); + } +} diff --git a/transex3/source/filter/utils/Cache.java b/transex3/source/filter/utils/Cache.java new file mode 100644 index 000000000000..94c26008ed13 --- /dev/null +++ b/transex3/source/filter/utils/Cache.java @@ -0,0 +1,2449 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: Cache.java,v $ + * $Revision: 1.7 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package com.sun.star.filter.config.tools.utils; + +//_______________________________________________ + +import java.lang.*; +import java.util.*; +import java.io.*; + +//_______________________________________________ + +/** + * It implements a container for all possible entries which are part of the type + * and filter mechanism of an office - means all items of the configuration file + * "TypeDetection". How these entries will be readed or written can be switch + * in different modes. That would make it possible to edit an xml directly or + * to contact a running office instance. + * + * + */ +public class Cache +{ + //___________________________________________ + // public const + + /** identifies a file type item of this cache. */ + public static final int E_TYPE = 0; + + /** identifies a filter item of this cache. */ + public static final int E_FILTER = 1; + + /** identifies a detect service item of this cache. */ + public static final int E_DETECTSERVICE = 2; + + /** identifies a frame loader item of this cache. */ + public static final int E_FRAMELOADER = 3; + + /** identifies a content handler item of this cache. */ + public static final int E_CONTENTHANDLER = 4; + + /** indicates an unsupported xml format => error! */ + public static final int FORMAT_UNSUPPORTED = -1; + + /** identify the configuration format of an office 6.0. + * The own formated data string is used. */ + public static final int FORMAT_60 = 0; + + /** identify the configuration format of an office 6.y. + * Properties are realy xml tags again. */ + public static final int FORMAT_6Y = 1; + + /** identify the configuration format which is used inside + * this tooling project. */ + public static final int FORMAT_INTERNAL = 2; + + /** right value for a command line parameter to define a 6.0 version. */ + public static final java.lang.String CMDVAL_FORMAT_60 = "6.0"; + + /** right value for a command line parameter to define a 6.Y version. */ + public static final java.lang.String CMDVAL_FORMAT_6Y = "6.Y"; + + /** right value for a command line parameter to define an internal xml version! */ + public static final java.lang.String CMDVAL_FORMAT_INTERNAL = "internal"; + + // general + public static final java.lang.String PROPNAME_DATA = "Data"; + public static final java.lang.String PROPNAME_NAME = "Name"; + public static final java.lang.String PROPNAME_UINAME = "UIName"; + public static final java.lang.String PROPNAME_UINAMES = "UINames"; + + // type 6.0 ... + public static final java.lang.String PROPNAME_MEDIATYPE = "MediaType"; + public static final java.lang.String PROPNAME_PREFERRED = "Preferred"; + public static final java.lang.String PROPNAME_CLIPBOARDFORMAT = "ClipboardFormat"; + public static final java.lang.String PROPNAME_DOCUMENTICONID = "DocumentIconID"; + public static final java.lang.String PROPNAME_URLPATTERN = "URLPattern"; + public static final java.lang.String PROPNAME_EXTENSIONS = "Extensions"; + // ... +6.y + public static final java.lang.String PROPNAME_UIORDER = "UIOrder"; + public static final java.lang.String PROPNAME_PREFERREDFILTER = "PreferredFilter"; + public static final java.lang.String PROPNAME_DETECTSERVICE = "DetectService"; + public static final java.lang.String PROPNAME_FRAMELOADER = "FrameLoader"; + public static final java.lang.String PROPNAME_CONTENTHANDLER = "ContentHandler"; + + // filter + public static final java.lang.String PROPNAME_DOCUMENTSERVICE = "DocumentService"; + public static final java.lang.String PROPNAME_FILEFORMATVERSION = "FileFormatVersion"; + public static final java.lang.String PROPNAME_FILTERSERVICE = "FilterService"; + public static final java.lang.String PROPNAME_FLAGS = "Flags"; + public static final java.lang.String PROPNAME_ORDER = "Order"; // -6.y + public static final java.lang.String PROPNAME_TEMPLATENAME = "TemplateName"; + public static final java.lang.String PROPNAME_TYPE = "Type"; + public static final java.lang.String PROPNAME_UICOMPONENT = "UIComponent"; + public static final java.lang.String PROPNAME_USERDATA = "UserData"; + + // frame loader / detect services / content handler + public static final java.lang.String PROPNAME_TYPES = "Types"; + + //___________________________________________ + // private const + + private static final java.lang.String FILTERSERVICE_NATIVEWARPPER = "com.sun.star.filter.NativeFilterWrapper"; + private static final java.lang.String GENERIC_DETECTSERVICE = "com.sun.star.comp.office.FrameLoader"; + + /** its the name of the cfg set, which contains all types. */ + private static final java.lang.String CFGNODE_TYPES = "Types"; + + /** its the name of the cfg set, which contains all filters. */ + private static final java.lang.String CFGNODE_FILTERS = "Filters"; + + /** its the name of the cfg set, which contains all detect services. */ + private static final java.lang.String CFGNODE_DETECTSERVICES = "DetectServices"; + + /** its the name of the cfg set, which contains all frame loaders. */ + private static final java.lang.String CFGNODE_FRAMELOADERS = "FrameLoaders"; + + /** its the name of the cfg set, which contains all content handlers. */ + private static final java.lang.String CFGNODE_CONTENTHANDLERS = "ContentHandlers"; + + // names for filter flags + private static final java.lang.String FLAGNAME_3RDPARTYFILTER = "3RDPARTYFILTER"; + private static final java.lang.String FLAGNAME_ALIEN = "ALIEN"; + private static final java.lang.String FLAGNAME_ASYNCHRON = "ASYNCHRON"; + private static final java.lang.String FLAGNAME_BROWSERPREFERRED = "BROWSERPREFERRED"; + private static final java.lang.String FLAGNAME_CONSULTSERVICE = "CONSULTSERVICE"; + private static final java.lang.String FLAGNAME_DEFAULT = "DEFAULT"; + private static final java.lang.String FLAGNAME_EXPORT = "EXPORT"; + private static final java.lang.String FLAGNAME_IMPORT = "IMPORT"; + private static final java.lang.String FLAGNAME_INTERNAL = "INTERNAL"; + private static final java.lang.String FLAGNAME_NOTINCHOOSER = "NOTINCHOOSER"; + private static final java.lang.String FLAGNAME_NOTINFILEDIALOG = "NOTINFILEDIALOG"; + private static final java.lang.String FLAGNAME_NOTINSTALLED = "NOTINSTALLED"; + private static final java.lang.String FLAGNAME_OWN = "OWN"; + private static final java.lang.String FLAGNAME_PACKED = "PACKED"; + private static final java.lang.String FLAGNAME_PREFERRED = "PREFERRED"; + private static final java.lang.String FLAGNAME_READONLY = "READONLY"; + private static final java.lang.String FLAGNAME_SILENTEXPORT = "SILENTEXPORT"; + private static final java.lang.String FLAGNAME_TEMPLATE = "TEMPLATE"; + private static final java.lang.String FLAGNAME_TEMPLATEPATH = "TEMPLATEPATH"; + private static final java.lang.String FLAGNAME_USESOPTIONS = "USESOPTIONS"; + + private static final java.lang.String FLAGNAME_COMBINED = "COMBINED"; + private static final java.lang.String FLAGNAME_SUPPORTSSELECTION= "SUPPORTSSELECTION"; + + // values for filter flags + private static final int FLAGVAL_3RDPARTYFILTER = 0x00080000; // 524288 + private static final int FLAGVAL_ALIEN = 0x00000040; // 64 + private static final int FLAGVAL_ALL = 0xffffffff; // 4294967295 + private static final int FLAGVAL_ASYNCHRON = 0x00004000; // 16384 + private static final int FLAGVAL_BROWSERPREFERRED = 0x00400000; // 4194304 + private static final int FLAGVAL_CONSULTSERVICE = 0x00040000; // 262144 + private static final int FLAGVAL_DEFAULT = 0x00000100; // 256 + private static final int FLAGVAL_EXPORT = 0x00000002; // 2 + private static final int FLAGVAL_IMPORT = 0x00000001; // 1 + private static final int FLAGVAL_INTERNAL = 0x00000008; // 8 + private static final int FLAGVAL_NOTINCHOOSER = 0x00002000; // 8192 + private static final int FLAGVAL_NOTINFILEDIALOG = 0x00001000; // 4096 + private static final int FLAGVAL_NOTINSTALLED = 0x00020000; // 131072 + private static final int FLAGVAL_OWN = 0x00000020; // 32 + private static final int FLAGVAL_PACKED = 0x00100000; // 1048576 + private static final int FLAGVAL_PREFERRED = 0x10000000; // 268435456 + private static final int FLAGVAL_READONLY = 0x00010000; // 65536 + private static final int FLAGVAL_SILENTEXPORT = 0x00200000; // 2097152 + private static final int FLAGVAL_TEMPLATE = 0x00000004; // 4 + private static final int FLAGVAL_TEMPLATEPATH = 0x00000010; // 16 + private static final int FLAGVAL_USESOPTIONS = 0x00000080; // 128 + + private static final int FLAGVAL_COMBINED = 0x00800000; // ... + private static final int FLAGVAL_SUPPORTSSELECTION = 0x00000400; // 1024 + + //___________________________________________ + // member + + /** list of all located types. + * Format: [string,HashMap] + */ + private java.util.HashMap m_lTypes; + + /** list of all located filters. + * Format: [string,HashMap] + */ + private java.util.HashMap m_lFilters; + + /** list of all located detect services. + * Format: [string,HashMap] + */ + private java.util.HashMap m_lDetectServices; + + /** list of all located frame loader. + * Format: [string,HashMap] + */ + private java.util.HashMap m_lFrameLoaders; + + /** list of all located content handler. + * Format: [string,HashMap] + */ + private java.util.HashMap m_lContentHandlers; + + /** contains all analyzed relations between + * filters and types. The key is an internal + * type name (can be used as reference into the + * list m_lTypes) and the value is a Vector of all + * internal filter names, which are registered for + * this type. + * Format: [string, Vector] + */ + private java.util.HashMap m_lFilterToTypeRegistrations; + + private int m_nDoubleRegisteredFilters; + private int m_nTypesForFilters; + private int m_nTypesForDetectServices; + private int m_nTypesForFrameLoaders; + private int m_nTypesForContentHandlers; + + /** can be used to log different informations. */ + private Logger m_aDebug; + + //___________________________________________ + // interface + + /** standard ctor. + * + * Initialize an empty cache instance. You have to use + * on of the fromXXX() methods to fill it from different + * sources with content. + */ + public Cache(Logger aDebug) + { + reset(); + m_aDebug = aDebug; + } + + //___________________________________________ + + /** free memory and set default values on all members. + */ + public synchronized void reset() + { + m_lTypes = new java.util.HashMap(); + m_lFilters = new java.util.HashMap(); + m_lFrameLoaders = new java.util.HashMap(); + m_lDetectServices = new java.util.HashMap(); + m_lContentHandlers = new java.util.HashMap(); + m_lFilterToTypeRegistrations = new java.util.HashMap(); + m_aDebug = new Logger(); + m_nDoubleRegisteredFilters = 0; + m_nTypesForFilters = 0; + m_nTypesForDetectServices = 0; + m_nTypesForFrameLoaders = 0; + m_nTypesForContentHandlers = 0; + } + + //___________________________________________ + + /** converts a string representation of an xml format + * to its int value, which must be used at some interface + * methods of this cache. + * + * If the given string does not match to any well known format, + * the return value will be FORMAT_UNSUPPORTED. The calli have to + * check that. Otherwhise a called interface method at this cache + * instance will be rejected by an exception! + * + * @param sFormat + * the string representation + * Must be one of our public const values from type CMDVAL_FORMAT_xxx. + * + * @return [int] + * the int representation. + * Will be one of our public const values from type FORMAT_xxx. + */ + public static int mapFormatString2Format(java.lang.String sFormat) + { + int nFormat = FORMAT_UNSUPPORTED; + if (sFormat.equalsIgnoreCase(CMDVAL_FORMAT_60)) + nFormat = FORMAT_60; + else + if (sFormat.equalsIgnoreCase(CMDVAL_FORMAT_6Y)) + nFormat = FORMAT_6Y; + else + if (sFormat.equalsIgnoreCase(CMDVAL_FORMAT_INTERNAL)) + nFormat = FORMAT_INTERNAL; + return nFormat; + } + + //___________________________________________ + + /** return some statistic values. + * + * Such values can be: - count of container items, + * - ... + * + * @return [java.lang.String] + * a formated string, which contains al statistic data. + */ + public synchronized java.lang.String getStatistics() + { + java.lang.StringBuffer sBuffer = new java.lang.StringBuffer(256); + + sBuffer.append("types = "+m_lTypes.size() +"\n"); + sBuffer.append("filters = "+m_lFilters.size() +"\n"); + sBuffer.append("detect services = "+m_lDetectServices.size() +"\n"); + sBuffer.append("frame loaders = "+m_lFrameLoaders.size() +"\n"); + sBuffer.append("content handler = "+m_lContentHandlers.size() +"\n"); + sBuffer.append("double registered filters = "+m_nDoubleRegisteredFilters+"\n"); + sBuffer.append("types used by filters = "+m_nTypesForFilters +"\n"); + sBuffer.append("types used by detect services = "+m_nTypesForDetectServices +"\n"); + sBuffer.append("types used by frame loaders = "+m_nTypesForFrameLoaders +"\n"); + sBuffer.append("types used by content handlers = "+m_nTypesForContentHandlers+"\n"); + + return sBuffer.toString(); + } + + //___________________________________________ + + /** reset this cache and fill it with new values using the given XML file. + * + * @param aXML + * must be a system file of a suitable XML file, which + * include all neccessary type/filter items. + * + * @param nFormat + * identifies the format of the specified xml file, + * which must be interpreted. + */ + public synchronized void fromXML(java.io.File aXML , + int nFormat) + throws java.lang.Exception + { + // clear this cache + reset(); + + // parse it + javax.xml.parsers.DocumentBuilderFactory aFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance(); + /* Attention: + * This call is important. It force right handling of entities during parsing and(!) + * writing. It let all possible signs for entities or it's quoted representations + * untouched. So this class don't change the original signs of the original file. + * Means: + *
    + *
  • (') => (')
  • + *
  • (") => (")
  • + *
  • (>) => (>)
  • + *
  • (<) => (<)
  • + *
  • (>) => (>)
  • + *
  • (&) => (&)
  • + *
  • ...
  • + *
+ */ + + System.out.println("TODO: must be adapted to java 1.3 :-("); + System.exit(-1); +//TODO_JAVA aFactory.setExpandEntityReferences(false); + + javax.xml.parsers.DocumentBuilder aBuilder = aFactory.newDocumentBuilder(); + org.w3c.dom.Document aDOM = aBuilder.parse(aXML); + org.w3c.dom.Element aRoot = aDOM.getDocumentElement(); + + // step over all sets + java.util.Vector lSetNodes = XMLHelper.extractChildNodesByTagName(aRoot, XMLHelper.XMLTAG_NODE); + java.util.Enumeration it1 = lSetNodes.elements(); + while (it1.hasMoreElements()) + { + // try to find out, which set should be read + org.w3c.dom.Node aSetNode = (org.w3c.dom.Node)it1.nextElement(); + java.lang.String sSetName = XMLHelper.extractNodeAttribByName(aSetNode, XMLHelper.XMLATTRIB_OOR_NAME); + if (sSetName == null) + throw new java.io.IOException("unsupported format: could not extract set name on node ...\n"+aSetNode); + + // map some generic interfaces to the right members! + int eType = -1 ; + java.util.HashMap rMap = null; + + if (sSetName.equals(CFGNODE_TYPES)) + { + eType = E_TYPE; + rMap = m_lTypes; + } + else + if (sSetName.equals(CFGNODE_FILTERS)) + { + eType = E_FILTER; + rMap = m_lFilters; + } + else + if (sSetName.equals(CFGNODE_FRAMELOADERS)) + { + eType = E_FRAMELOADER; + rMap = m_lFrameLoaders; + } + else + if (sSetName.equals(CFGNODE_DETECTSERVICES)) + { + eType = E_DETECTSERVICE; + rMap = m_lDetectServices; + } + else + if (sSetName.equals(CFGNODE_CONTENTHANDLERS)) + { + eType = E_CONTENTHANDLER; + rMap = m_lContentHandlers; + } + else + throw new java.io.IOException("unsupported format: unknown set name [\""+sSetName+"\"] detected on node ...\n"+aSetNode); + + // load all set entries + java.util.Vector lChildNodes = XMLHelper.extractChildNodesByTagName(aSetNode, XMLHelper.XMLTAG_NODE); + java.util.Enumeration it2 = lChildNodes.elements(); + while (it2.hasMoreElements()) + { + org.w3c.dom.Node aChildNode = (org.w3c.dom.Node)it2.nextElement(); + java.lang.String sChildName = XMLHelper.extractNodeAttribByName(aChildNode, XMLHelper.XMLATTRIB_OOR_NAME); + if (sChildName == null) + throw new java.io.IOException("unsupported format: could not extract child node name on node ...\n"+aChildNode); + java.util.HashMap aPropSet = null; + + // Note: Our internal format is different from the source format! + java.util.HashMap aTempSet = XMLHelper.convertNodeToPropSet(aChildNode); + switch(eType) + { + case E_TYPE : + { + aPropSet = Cache.convertTypePropsToInternal(aTempSet, nFormat); + m_aDebug.setDetailedInfo("type [\""+sChildName+"\"] converted to internal format"); + } + break; + + case E_FILTER : + { + aPropSet = Cache.convertFilterPropsToInternal(aTempSet, nFormat); + m_aDebug.setDetailedInfo("filter [\""+sChildName+"\"] converted to internal format"); + } + break; + + case E_DETECTSERVICE : + { + aPropSet = Cache.convertDetectServicePropsToInternal(aTempSet, nFormat); + m_aDebug.setDetailedInfo("detect service [\""+sChildName+"\"] converted to internal format"); + } + break; + + case E_FRAMELOADER : + { + aPropSet = Cache.convertFrameLoaderPropsToInternal(aTempSet, nFormat); + m_aDebug.setDetailedInfo("frame loader [\""+sChildName+"\"] converted to internal format"); + } + break; + + case E_CONTENTHANDLER : + { + aPropSet = Cache.convertContentHandlerPropsToInternal(aTempSet, nFormat); + m_aDebug.setDetailedInfo("content handler [\""+sChildName+"\"] converted to internal format"); + } + break; + } + m_aDebug.setDetailedInfo("props = "+aTempSet); + rMap.put(sChildName, aPropSet); + } + } + } + + //___________________________________________ + + /** create some hml views of the current content of this cache. + * + * The given directory is used to create different html files + * there. Every of them show another aspect of this cache. + * E.g.: - all type/filter properties + * - relation ships between types/filters/loaders etc. + * + * @param aDirectory + * points to a system directory, which + * can be used completely(!) to generate + * the results there. + * + * @param nFormat + * specify in which context the cache items should be + * interpreted. + */ + public synchronized void toHTML(java.io.File aDirectory, + int nFormat , + java.lang.String sEncoding ) + throws java.lang.Exception + { + if (nFormat != FORMAT_6Y) + throw new java.lang.Exception("HTML views are supported for the new 6.y format only yet."); + + java.lang.StringBuffer sRelationView = new java.lang.StringBuffer(1000); + sRelationView.append("
Relation View
"); + sRelationView.append(""); + sRelationView.append(""); + + java.util.Iterator aIt = m_lTypes.keySet().iterator(); + while (aIt.hasNext()) + { + java.lang.String sType = (java.lang.String)aIt.next(); + java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sType); + + sRelationView.append(""); + sRelationView.append(""); + + java.lang.String sVal = (java.lang.String)aType.get(PROPNAME_DETECTSERVICE); + if (sVal == null || sVal.length()<1) + sRelationView.append(""); + else + sRelationView.append(""); + + sVal = (java.lang.String)aType.get(PROPNAME_PREFERREDFILTER); + if (sVal == null || sVal.length()<1) + sRelationView.append(""); + else + sRelationView.append(""); + + sVal = (java.lang.String)aType.get(PROPNAME_FRAMELOADER); + if (sVal == null || sVal.length()<1) + sRelationView.append(""); + else + sRelationView.append(""); + + sVal = (java.lang.String)aType.get(PROPNAME_CONTENTHANDLER); + if (sVal == null || sVal.length()<1) + sRelationView.append(""); + else + sRelationView.append(""); + + sRelationView.append(""); + } + + sRelationView.append("
typedetect servicepreferred filterframe loadercontent handler
"+sType+" - "+sVal+" - "+sVal+" - "+sVal+" - "+sVal+"
"); + sRelationView.append(""); + + FileHelper.writeEncodedBufferToFile(new java.io.File(aDirectory, "relation_view.html"), sEncoding, false, sRelationView); + + java.util.HashMap lFilters2TypeRegistration = new java.util.HashMap(); + aIt = m_lFilters.keySet().iterator(); + while (aIt.hasNext()) + { + java.lang.String sFilter = (java.lang.String)aIt.next(); + java.util.HashMap aFilter = (java.util.HashMap)m_lFilters.get(sFilter); + java.lang.String sType = (java.lang.String)aFilter.get(PROPNAME_TYPE); + + java.util.Vector lFilters = (java.util.Vector)lFilters2TypeRegistration.get(sType); + if (lFilters == null) + lFilters = new java.util.Vector(); + lFilters.add(sFilter); + lFilters2TypeRegistration.put(sType, lFilters); + } + + java.lang.StringBuffer sType2FiltersView = new java.lang.StringBuffer(1000); + sType2FiltersView.append("
Type2Filters View
"); + sType2FiltersView.append(""); + sType2FiltersView.append(""); + + aIt = lFilters2TypeRegistration.keySet().iterator(); + while (aIt.hasNext()) + { + java.lang.String sType = (java.lang.String)aIt.next(); + java.util.Vector lFilters = (java.util.Vector)lFilters2TypeRegistration.get(sType); + + sType2FiltersView.append(""); + } + + sType2FiltersView.append("
typefilters
"+sType+""); + java.util.Enumeration aEn = lFilters.elements(); + while(aEn.hasMoreElements()) + sType2FiltersView.append(aEn.nextElement()+"
"); + sType2FiltersView.append("
"); + sType2FiltersView.append(""); + + FileHelper.writeEncodedBufferToFile(new java.io.File(aDirectory, "type2filters_view.html"), sEncoding, false, sType2FiltersView); + } + + //___________________________________________ + + /** converts all items of this cache to its xml representation + * and write it to the given file. + * + * @param aXML + * the target file for output. + * + * @param nFormat + * the requested xml format. + * see const values FORMAT_xxx too. + * + * @param sEncoding + * specify the file encoding for the generated xml file. + * + * @throws [java.lang.Exception] + * if something fail during convertion. + */ + public synchronized void toXML(java.io.File aXML , + int nFormat , + java.lang.String sEncoding) + throws java.lang.Exception + { + java.lang.StringBuffer sXML = new java.lang.StringBuffer(500000); + + for (int i=0; i<5; ++i) + { + // define right sub container + java.lang.String sSetName = null; + java.util.HashMap rMap = null; + int eType = -1; + + switch(i) + { + case 0 : + { + sSetName = CFGNODE_TYPES; + rMap = m_lTypes; + eType = E_TYPE; + } + break; + + case 1 : + { + sSetName = CFGNODE_FILTERS; + rMap = m_lFilters; + eType = E_FILTER; + } + break; + + case 2 : + { + sSetName = CFGNODE_DETECTSERVICES; + rMap = m_lDetectServices; + eType = E_DETECTSERVICE; + } + break; + + case 3 : + { + sSetName = CFGNODE_FRAMELOADERS; + rMap = m_lFrameLoaders; + eType = E_FRAMELOADER; + } + break; + + case 4 : + { + sSetName = CFGNODE_CONTENTHANDLERS; + rMap = m_lContentHandlers; + eType = E_CONTENTHANDLER; + } + break; + } + + // generate set + sXML.append("\n"); + java.util.Iterator it = rMap.keySet().iterator(); + while(it.hasNext()) + { + java.lang.String sItem = (java.lang.String)it.next(); + sXML.append("\n"); + sXML.append(getItemAsXML(eType, sItem, nFormat)); + sXML.append("\n"); + } + sXML.append("\n"); + } + + java.io.FileOutputStream aStream = new java.io.FileOutputStream(aXML.getAbsolutePath(), false); + java.io.OutputStreamWriter aWriter = new java.io.OutputStreamWriter(aStream, sEncoding); + java.lang.String sOut = sXML.toString(); + aWriter.write(sOut, 0, sOut.length()); + aWriter.flush(); + aWriter.close(); + } + + //___________________________________________ + + /** converts a type property set from internal format + * to an external one. + * + * @param aMap + * points to the item, which should be converted. + * + * @param nFormat + * specify the requested output format. + * + * @return [java.util.HashMap] + * contains the properties in the requested format. + * + * @throws [java.lang.Exception + * if something fail during convertion. + */ + private static java.util.HashMap convertTypePropsToExternal(java.util.HashMap aMap , + int nFormat) + throws java.lang.Exception + { + java.util.HashMap aResultMap = new java.util.HashMap(); + // copy Name property ... if it exists! + if (aMap.containsKey(PROPNAME_NAME)) + aResultMap.put(PROPNAME_NAME, aMap.get(PROPNAME_NAME)); + switch(nFormat) + { + //----------------------------------- + case FORMAT_60 : + { + // copy UIName property unchanged + aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME)); + + // ignore properties "UIOrder", "PreferredFilter", "DetectService" + // They are not supported for 6.0 types. + + // pack all other properties to one "Data" string value + java.lang.StringBuffer sData = new java.lang.StringBuffer(256); + + sData.append(aMap.get(PROPNAME_PREFERRED)); + sData.append(","); + sData.append(aMap.get(PROPNAME_MEDIATYPE)); + sData.append(","); + sData.append(aMap.get(PROPNAME_CLIPBOARDFORMAT)); + sData.append(","); + + java.util.Vector lList = (java.util.Vector)aMap.get(PROPNAME_URLPATTERN); + int c = lList.size(); + int i = 0; + for (i=0; i aExpandedMap["UIName"] + * aMap["Data" ] => aExpandedMap["Preferred" ], aExpandedMap["MediaType"] etc. ... + * + * @param aMap + * points to the item, which should be converted. + + * @param nFormat + * specify the external format. + * + * @return [java.util.HashMap] + * The new map in internal format. + */ + private static java.util.HashMap convertTypePropsToInternal(java.util.HashMap aMap , + int nFormat) + throws java.lang.Exception + { + java.util.HashMap aResultMap = new java.util.HashMap(); + // copy Name property ... if it exists! + if (aMap.containsKey(PROPNAME_NAME)) + aResultMap.put(PROPNAME_NAME, aMap.get(PROPNAME_NAME)); + switch(nFormat) + { + //----------------------------------- + case FORMAT_60 : + { + // copy UIName property unchanged! + aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME)); + + // generate new property "UIOrder" + // Its the moved property "Order" of filters for versions >= 6.y! + aResultMap.put(PROPNAME_UIORDER, new java.lang.Integer(0)); + + // generate new property "PreferredFilter" + // Its a the moved filter flag "Preferred" for versions >= 6.y! + aResultMap.put(PROPNAME_PREFERREDFILTER, new java.lang.String()); + + // generate new property "DetectService" + // Every type know its detector diretcly from now. No search + // will be neccessary any longer. + aResultMap.put(PROPNAME_DETECTSERVICE, new java.lang.String()); + + // analyze the Data property of the original map + // and copy its results (means all expanded properties) + // to the result map. + java.lang.String sDataVal = (java.lang.String)aMap.get(PROPNAME_DATA); + java.util.Vector lTokens = Cache.splitTokenString(sDataVal, ","); + + int t = 0; + java.util.Enumeration it = lTokens.elements(); + while (it.hasMoreElements()) + { + java.lang.String sToken = (java.lang.String)it.nextElement(); + switch(t) + { + case 0 : + aResultMap.put(PROPNAME_PREFERRED, new java.lang.Boolean(sToken)); + break; + case 1 : + aResultMap.put(PROPNAME_MEDIATYPE, sToken); + break; + case 2 : + { + /*HACK ersetze %20 mit " " ...*/ + int ni = sToken.indexOf("%20"); + if (ni!=-1) + { + java.lang.String sPatch = sToken.substring(0,ni) + " " + sToken.substring(ni+3); + sToken = sPatch; + } + aResultMap.put(PROPNAME_CLIPBOARDFORMAT, sToken); + } + break; + case 3 : + aResultMap.put(PROPNAME_URLPATTERN, Cache.splitTokenString(sToken, ";")); + break; + case 4 : + aResultMap.put(PROPNAME_EXTENSIONS, Cache.splitTokenString(sToken, ";")); + break; + case 5 : + aResultMap.put(PROPNAME_DOCUMENTICONID, new java.lang.Integer(sToken)); + break; + default : + throw new java.lang.Exception("unsupported format for data value of a type \""+aMap.get(PROPNAME_NAME)+"\" detected."); + } + ++t; + } + } + break; + + //----------------------------------- + case FORMAT_6Y : + { + // copy all supported properties directly + aResultMap.put(PROPNAME_PREFERRED , aMap.get(PROPNAME_PREFERRED )); + aResultMap.put(PROPNAME_MEDIATYPE , aMap.get(PROPNAME_MEDIATYPE )); + aResultMap.put(PROPNAME_CLIPBOARDFORMAT, aMap.get(PROPNAME_CLIPBOARDFORMAT)); + aResultMap.put(PROPNAME_URLPATTERN , aMap.get(PROPNAME_URLPATTERN )); + aResultMap.put(PROPNAME_EXTENSIONS , aMap.get(PROPNAME_EXTENSIONS )); + aResultMap.put(PROPNAME_DOCUMENTICONID , aMap.get(PROPNAME_DOCUMENTICONID )); + aResultMap.put(PROPNAME_UINAME , aMap.get(PROPNAME_UINAME )); + aResultMap.put(PROPNAME_UIORDER , aMap.get(PROPNAME_UIORDER )); + aResultMap.put(PROPNAME_PREFERREDFILTER, aMap.get(PROPNAME_PREFERREDFILTER)); + aResultMap.put(PROPNAME_DETECTSERVICE , aMap.get(PROPNAME_DETECTSERVICE )); + } + break; + + //----------------------------------- + default : + throw new java.lang.Exception("unknown format"); + } + + return aResultMap; + } + + //___________________________________________ + + /** converts a filter property set (using an external format) to + * our internal cache format. + * + * Especialy the data format string will be expanded + * to its real properties. + * + * Schema: + * aMap["UIName"] => aExpandedMap["UIName"] + * aMap["Data" ] => aExpandedMap["Order" ], aExpandedMap["Flags"] etc. ... + * + * @param aMap + * points to the item, which should be converted. + * + * @param nFormat + * specify the external format. + * + * @return [java.util.HashMap] + * The new map in internal format. + */ + private static java.util.HashMap convertFilterPropsToInternal(java.util.HashMap aMap , + int nFormat) + throws java.lang.Exception + { + java.util.HashMap aResultMap = new java.util.HashMap(); + // copy Name property ... if it exists! + if (aMap.containsKey(PROPNAME_NAME)) + aResultMap.put(PROPNAME_NAME, aMap.get(PROPNAME_NAME)); + switch(nFormat) + { + //----------------------------------- + case FORMAT_60 : + { + // copy UIName property + aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME)); + + // analyze the Data property of the original map + // and copy its results (means all expanded properties) + // to the result map. + java.lang.String sDataVal = (java.lang.String)aMap.get(PROPNAME_DATA); + java.util.Vector lTokens = Cache.splitTokenString(sDataVal, ","); + + int t = 0; + java.util.Enumeration it = lTokens.elements(); + while (it.hasMoreElements()) + { + java.lang.String sToken = (java.lang.String)it.nextElement(); + switch(t) + { + case 0 : + aResultMap.put(PROPNAME_ORDER, new java.lang.Integer(sToken)); + break; + case 1 : + aResultMap.put(PROPNAME_TYPE, sToken); + break; + case 2 : + aResultMap.put(PROPNAME_DOCUMENTSERVICE, sToken); + break; + case 3 : + aResultMap.put(PROPNAME_FILTERSERVICE, sToken); + break; + case 4 : + aResultMap.put(PROPNAME_FLAGS, new java.lang.Integer(sToken)); + break; + case 5 : + aResultMap.put(PROPNAME_USERDATA, Cache.splitTokenString(sToken, ";")); + break; + case 6 : + aResultMap.put(PROPNAME_FILEFORMATVERSION, new java.lang.Integer(sToken)); + break; + case 7 : + aResultMap.put(PROPNAME_TEMPLATENAME, sToken); + break; + case 8 : + aResultMap.put(PROPNAME_UICOMPONENT, sToken); + break; + default : + throw new java.lang.Exception("unsupported format for data value of a filter detected."); + } + ++t; + } + + // its an optional property :-) + if (!aResultMap.containsKey(PROPNAME_TEMPLATENAME)) + aResultMap.put(PROPNAME_TEMPLATENAME, new java.lang.String("")); + + // its an optional property :-) + if (!aResultMap.containsKey(PROPNAME_UICOMPONENT)) + aResultMap.put(PROPNAME_UICOMPONENT, new java.lang.String("")); + } + break; + + //----------------------------------- + case FORMAT_6Y : + { + // "Order" does not exist for 6.y versions! Use default. + aResultMap.put(PROPNAME_ORDER, new java.lang.Integer(0)); + + // "UIName" property does not exist for 6.y versions! use default. + /* TODO make it configurable :-) */ + aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME)); + //aResultMap.put(PROPNAME_UINAME, new java.util.HashMap()); + + // "Flags" must be converted from names to its values + java.util.Vector lFlags = (java.util.Vector)aMap.get(PROPNAME_FLAGS); + java.lang.Integer nFlags = Cache.convertFilterFlagNames2Values(lFlags); + aResultMap.put(PROPNAME_FLAGS, nFlags); + + // copy all direct supported properties + aResultMap.put(PROPNAME_TYPE , aMap.get(PROPNAME_TYPE )); + aResultMap.put(PROPNAME_DOCUMENTSERVICE , aMap.get(PROPNAME_DOCUMENTSERVICE )); + aResultMap.put(PROPNAME_FILTERSERVICE , aMap.get(PROPNAME_ORDER )); + aResultMap.put(PROPNAME_USERDATA , aMap.get(PROPNAME_USERDATA )); + aResultMap.put(PROPNAME_FILEFORMATVERSION, aMap.get(PROPNAME_FILEFORMATVERSION)); + aResultMap.put(PROPNAME_TEMPLATENAME , aMap.get(PROPNAME_TEMPLATENAME )); + aResultMap.put(PROPNAME_UICOMPONENT , aMap.get(PROPNAME_UICOMPONENT )); + } + break; + + //----------------------------------- + default : + throw new java.lang.Exception("unknown format"); + } + + return aResultMap; + } + + private static java.util.HashMap convertDetectServicePropsToInternal(java.util.HashMap aMap , + int nFormat) + throws java.lang.Exception + { + /*FIXME*/ + java.util.HashMap aResultMap = aMap; + return aResultMap; + } + + private static java.util.HashMap convertFrameLoaderPropsToInternal(java.util.HashMap aMap , + int nFormat) + throws java.lang.Exception + { + /*FIXME*/ + java.util.HashMap aResultMap = aMap; + return aResultMap; + } + + private static java.util.HashMap convertContentHandlerPropsToInternal(java.util.HashMap aMap , + int nFormat) + throws java.lang.Exception + { + /*FIXME*/ + java.util.HashMap aResultMap = aMap; + return aResultMap; + } + + //___________________________________________ + + /** converts filter flag names to its int representation. + * + * @param lFlags + * a list of flag names. + * + * @return [java.lang.Integer] + * an integer field of all set flags. + * + * @throws [java.lang.Exception] + * for unsupported flags or empty flag fields! + */ + private static java.lang.Integer convertFilterFlagNames2Values(java.util.Vector lFlags) + throws java.lang.Exception + { + int nFlags = 0; + java.util.Enumeration it = lFlags.elements(); + while(it.hasMoreElements()) + { + java.lang.String sFlagName = (java.lang.String)it.nextElement(); + + if (sFlagName.equals(FLAGNAME_3RDPARTYFILTER)) + nFlags |= FLAGVAL_3RDPARTYFILTER; + else + if (sFlagName.equals(FLAGNAME_ALIEN)) + nFlags |= FLAGVAL_ALIEN; + else + if (sFlagName.equals(FLAGNAME_ASYNCHRON)) + nFlags |= FLAGVAL_ASYNCHRON; + else + if (sFlagName.equals(FLAGNAME_BROWSERPREFERRED)) + nFlags |= FLAGVAL_BROWSERPREFERRED; + else + if (sFlagName.equals(FLAGNAME_CONSULTSERVICE)) + nFlags |= FLAGVAL_CONSULTSERVICE; + else + if (sFlagName.equals(FLAGNAME_DEFAULT)) + nFlags |= FLAGVAL_DEFAULT; + else + if (sFlagName.equals(FLAGNAME_EXPORT)) + nFlags |= FLAGVAL_EXPORT; + else + if (sFlagName.equals(FLAGNAME_IMPORT)) + nFlags |= FLAGVAL_IMPORT; + else + if (sFlagName.equals(FLAGNAME_INTERNAL)) + nFlags |= FLAGVAL_INTERNAL; + else + if (sFlagName.equals(FLAGNAME_NOTINCHOOSER)) + nFlags |= FLAGVAL_NOTINCHOOSER; + else + if (sFlagName.equals(FLAGNAME_NOTINFILEDIALOG)) + nFlags |= FLAGVAL_NOTINFILEDIALOG; + else + if (sFlagName.equals(FLAGNAME_NOTINSTALLED)) + nFlags |= FLAGVAL_NOTINSTALLED; + else + if (sFlagName.equals(FLAGNAME_OWN)) + nFlags |= FLAGVAL_OWN; + else + if (sFlagName.equals(FLAGNAME_PACKED)) + nFlags |= FLAGVAL_PACKED; + else + if (sFlagName.equals(FLAGNAME_PREFERRED)) + nFlags |= FLAGVAL_PREFERRED; + else + if (sFlagName.equals(FLAGNAME_READONLY)) + nFlags |= FLAGVAL_READONLY; + else + if (sFlagName.equals(FLAGNAME_SILENTEXPORT)) + nFlags |= FLAGVAL_SILENTEXPORT; + else + if (sFlagName.equals(FLAGNAME_TEMPLATE)) + nFlags |= FLAGVAL_TEMPLATE; + else + if (sFlagName.equals(FLAGNAME_TEMPLATEPATH)) + nFlags |= FLAGVAL_TEMPLATEPATH; + else + if (sFlagName.equals(FLAGNAME_USESOPTIONS)) + nFlags |= FLAGVAL_USESOPTIONS; + else + if (sFlagName.equals(FLAGNAME_COMBINED)) + nFlags |= FLAGVAL_COMBINED; + else + throw new java.lang.Exception("unsupported filter flag detected: \""+sFlagName+"\""); + } + + if (nFlags == 0) + throw new java.lang.Exception("no filter flags?"); + + return new java.lang.Integer(nFlags); + } + + //___________________________________________ + + /** converts filter flag values to its string representation. + * + * @param nFlags + * the flag field as int value. + * + * @return [java.util.Vector] + * a list of flag names. + * + * @throws [java.lang.Exception] + * for unsupported flags or empty flag fields! + */ + private static java.util.Vector convertFilterFlagValues2Names(java.lang.Integer nFlags) + throws java.lang.Exception + { + java.util.Vector lFlags = new java.util.Vector(); + int field = nFlags.intValue(); + + if (field == 0) + throw new java.lang.Exception("no filter flags?"); + + if((field & FLAGVAL_IMPORT) == FLAGVAL_IMPORT) + lFlags.add(FLAGNAME_IMPORT); + + if((field & FLAGVAL_EXPORT) == FLAGVAL_EXPORT) + lFlags.add(FLAGNAME_EXPORT); + + if((field & FLAGVAL_TEMPLATE) == FLAGVAL_TEMPLATE) + lFlags.add(FLAGNAME_TEMPLATE); + + if((field & FLAGVAL_INTERNAL) == FLAGVAL_INTERNAL) + lFlags.add(FLAGNAME_INTERNAL); + + if((field & FLAGVAL_TEMPLATEPATH) == FLAGVAL_TEMPLATEPATH) + lFlags.add(FLAGNAME_TEMPLATEPATH); + + if((field & FLAGVAL_OWN) == FLAGVAL_OWN) + lFlags.add(FLAGNAME_OWN); + + if((field & FLAGVAL_ALIEN) == FLAGVAL_ALIEN) + lFlags.add(FLAGNAME_ALIEN); + + if((field & FLAGVAL_USESOPTIONS) == FLAGVAL_USESOPTIONS) + lFlags.add(FLAGNAME_USESOPTIONS); + + if((field & FLAGVAL_DEFAULT) == FLAGVAL_DEFAULT) + lFlags.add(FLAGNAME_DEFAULT); + + if((field & FLAGVAL_NOTINFILEDIALOG) == FLAGVAL_NOTINFILEDIALOG) + lFlags.add(FLAGNAME_NOTINFILEDIALOG); + + if((field & FLAGVAL_NOTINCHOOSER) == FLAGVAL_NOTINCHOOSER) + lFlags.add(FLAGNAME_NOTINCHOOSER); + + if((field & FLAGVAL_ASYNCHRON) == FLAGVAL_ASYNCHRON) + lFlags.add(FLAGNAME_ASYNCHRON); + + if((field & FLAGVAL_READONLY) == FLAGVAL_READONLY) + lFlags.add(FLAGNAME_READONLY); + + if((field & FLAGVAL_NOTINSTALLED) == FLAGVAL_NOTINSTALLED) + lFlags.add(FLAGNAME_NOTINSTALLED); + + if((field & FLAGVAL_CONSULTSERVICE) == FLAGVAL_CONSULTSERVICE) + lFlags.add(FLAGNAME_CONSULTSERVICE); + + if((field & FLAGVAL_3RDPARTYFILTER) == FLAGVAL_3RDPARTYFILTER) + lFlags.add(FLAGNAME_3RDPARTYFILTER); + + if((field & FLAGVAL_PACKED) == FLAGVAL_PACKED) + lFlags.add(FLAGNAME_PACKED); + + if((field & FLAGVAL_SILENTEXPORT) == FLAGVAL_SILENTEXPORT) + lFlags.add(FLAGNAME_SILENTEXPORT); + + if((field & FLAGVAL_BROWSERPREFERRED) == FLAGVAL_BROWSERPREFERRED) + lFlags.add(FLAGNAME_BROWSERPREFERRED); + + if((field & FLAGVAL_PREFERRED) == FLAGVAL_PREFERRED) + lFlags.add(FLAGNAME_PREFERRED); + + if((field & FLAGVAL_COMBINED) == FLAGVAL_COMBINED) + lFlags.add(FLAGNAME_COMBINED); + + if((field & FLAGVAL_COMBINED) == FLAGVAL_SUPPORTSSELECTION) + lFlags.add(FLAGNAME_SUPPORTSSELECTION); + + return lFlags; + } + + //___________________________________________ + + /** return a reference to one of our member + * lists for types/filters etc ... + * + * @param eItemType + * specify, which item map is required. + * + * @return [java.util.HashMap] + * a reference(!) to the right member. + * + * @throws [java.lang.Exception] + * if the specified map does not exist. + */ + private java.util.HashMap getItemMap(int eItemType) + throws java.lang.Exception + { + java.util.HashMap rMap = null; + switch(eItemType) + { + case E_TYPE : + rMap = m_lTypes; + break; + + case E_FILTER : + rMap = m_lFilters; + break; + + case E_DETECTSERVICE : + rMap = m_lDetectServices; + break; + + case E_FRAMELOADER : + rMap = m_lFrameLoaders; + break; + + case E_CONTENTHANDLER : + rMap = m_lContentHandlers; + break; + + default: + throw new java.lang.Exception("Invalid item map specified."); + } + return rMap; + } + + //___________________________________________ + + /** return the count of items inside a sub container + * of this cache. + * + * @param eItemType + * specify, which item map is required. + * + * @throws [java.lang.Exception] + * if the specified map does not exist. + */ + public synchronized int getItemCount(int eItemType) + throws java.lang.Exception + { + java.util.HashMap rMap = getItemMap(eItemType); + return rMap.size(); + } + + //___________________________________________ + + /** get a list of all item names of the specified + * sub container. + * + * @param eItemType + * specify, which item map is required. + * + * @throws [java.lang.Exception] + * if the specified map does not exist. + */ + public synchronized java.util.Vector getItemNames(int eItemType) + throws java.lang.Exception + { + java.util.Vector lNames = new java.util.Vector(); + java.util.HashMap rMap = getItemMap(eItemType); + java.util.Iterator it = rMap.keySet().iterator(); + while(it.hasNext()) + lNames.add(it.next()); + return lNames; + } + + //___________________________________________ + + /** get a list of all item names of the specified + * sub coontainer, where items match to given property set. + * + * Note: The given property set must exist at all + * returned items as minimum and every checked property + * value must be equals! Using of reg expressions or + * similar mechanism will not be supported here. + * + * @param eItemType + * specify, which item map is required. + * + * @param aPropSet + * the set of properties, which must + * exist at the returned item as minimum. + * + * @throws [java.lang.Exception] + * if the specified map does not exist. + */ + public synchronized java.util.Vector getMatchedItemNames(int eItemType, + java.util.HashMap aPropSet ) + throws java.lang.Exception + { + java.util.Vector lNames = new java.util.Vector(); + java.util.HashMap rMap = getItemMap(eItemType); + java.util.Iterator it = rMap.keySet().iterator(); + while(it.hasNext()) + { + java.lang.String sItemName = (java.lang.String)it.next(); + java.util.HashMap rItemProps = (java.util.HashMap)rMap.get(sItemName); + + boolean bMatch = Cache.matchPropSet(rItemProps, aPropSet); + if (bMatch) + lNames.add(sItemName); + else + { + java.lang.StringBuffer sBuffer = new java.lang.StringBuffer(1000); + sBuffer.append("entry ["+eItemType+"] \""+sItemName+"\" does not match.\n"); + sBuffer.append("\torg items = {"+rItemProps+"}\n"); + sBuffer.append("\treq items = {"+aPropSet+"}\n"); + + m_aDebug.setDetailedInfo(sBuffer.toString()); + } + } + return lNames; + } + + //___________________________________________ + + /** check if two property sets are equals in its + * shared properties. + * + * Note: Only set properties of the match set will be searched + * inside the original set. And its values must be equals. + * Using of reg expressions or similar mechanism will not + * be supported here. + * + * @param rOrgProps + * the original property set, which should be checked. + * + * @param rMatchProps + * contains the properties, which must be searched + * inside rOrgProps. + * + * @return TRUE if all properties of rMatchProps could be located + * inside rOrgProps. + */ + private static boolean matchPropSet(java.util.HashMap rOrgProps , + java.util.HashMap rMatchProps) + { + java.util.Iterator it = rMatchProps.keySet().iterator(); + while(it.hasNext()) + { + java.lang.String sMatchName = (java.lang.String)it.next(); + java.lang.Object aMatchValue = rMatchProps.get(sMatchName); + + if ( + (!rOrgProps.containsKey(sMatchName) ) || + (!rOrgProps.get(sMatchName).equals(aMatchValue)) + ) + { + return false; + } + } + return true; + } + + //___________________________________________ + + /** return a property set for the queried container item. + * + * @param eItemType + * specify, which item map is required. + * + * @param sItemName + * must be a valid item name of the specified item map. + * + * @return [java.util.HashMap] + * the property set of the queried item. + * Always different from null! + * + * @throws [java.lang.Exception] + * if the specified item does not exists or + * seems to be invalid in general (means null!). + */ + public synchronized java.util.HashMap getItem(int eItemType, + java.lang.String sItemName) + throws java.lang.Exception + { + java.util.HashMap rMap = getItemMap(eItemType); + java.util.HashMap rItem = (java.util.HashMap)rMap.get(sItemName); + if (rItem == null) + throw new java.lang.Exception("Queried item \""+sItemName+"\" does not exist inside this cache."); + return rItem; + } + + //___________________________________________ + + /** return a requested item in XML format. + * + * @param eItemType + * identify the right sub set of this cache + * inside which the requested item should exist. + * e.g. E_TYPE, E_FILTER, ... + * + * @param sItemName + * the name of the request item + * + * @param nXMLFormat + * means the format of the generated xml source. + * + * @return [java.lang.String] + * a xml formated string, which contains all properties + * for this container item. + */ + public synchronized java.lang.String getItemAsXML(int eItemType , + java.lang.String sItemName , + int nXMLFormat) + throws java.lang.Exception + { + // Note: Our internal format must be converted to the target format! + java.util.HashMap rItem = getItem(eItemType, sItemName); + java.util.HashMap rFormatedItem = null; + switch(eItemType) + { + case E_TYPE : + { + rFormatedItem = Cache.convertTypePropsToExternal(rItem, nXMLFormat); + m_aDebug.setGlobalInfo("type to external \""+sItemName+"\""); + } + break; + + case E_FILTER : + { + rFormatedItem = Cache.convertFilterPropsToExternal(rItem, nXMLFormat); + m_aDebug.setGlobalInfo("filter to external \""+sItemName+"\""); + } + break; + + case E_DETECTSERVICE : + { + rFormatedItem = Cache.convertDetectServicePropsToExternal(rItem, nXMLFormat); + m_aDebug.setGlobalInfo("detect service to external \""+sItemName+"\""); + } + break; + + case E_FRAMELOADER : + { + rFormatedItem = Cache.convertFrameLoaderPropsToExternal(rItem, nXMLFormat); + m_aDebug.setGlobalInfo("frame loader to external \""+sItemName+"\""); + } + break; + + case E_CONTENTHANDLER : + { + rFormatedItem = Cache.convertContentHandlerPropsToExternal(rItem, nXMLFormat); + m_aDebug.setGlobalInfo("content handler to external \""+sItemName+"\""); + } + break; + } + + java.lang.StringBuffer sXML = new java.lang.StringBuffer(1000); + int nPrettyTabs = 1; + for (int t=0; t\n"); + sXML.append(XMLHelper.convertPropSetToXML(rFormatedItem, nPrettyTabs+1)); + for (int t=0; t\n"); + + return sXML.toString(); + } + + //___________________________________________ + + /** split the given string (using the specified delimiter) + * and return alist of found string tokens. + * + * Note: Against the normal behaviour of the StringTokenizer class + * this method returns empty tokens too. + * E.g: "0,,1" will return "0" - "" - "1" + * + * @param sTokenString + * the string value, which should be analyzed. + * + * @param sDelim + * the delimiter, which will be used to differe between tokens. + * + * @return [java.util.Vector] + * a list of string tokens. Can be empty - but not null! + */ + private static java.util.Vector splitTokenString(java.lang.String sTokenString, + java.lang.String sDelim ) + { + java.util.Vector lTokens = new java.util.Vector(); + java.util.StringTokenizer aTokenizer = new java.util.StringTokenizer(sTokenString, sDelim, true); + boolean bLastWasDelim = false; + + while (aTokenizer.hasMoreTokens()) + { + java.lang.String sToken = aTokenizer.nextToken(); + if (sToken.equals(sDelim)) + { + if (bLastWasDelim) + { + // last token was a delimiter - new one too + // => an empty token must be placed between these + // two delimiters! Add this empty value to the return list. + lTokens.add(""); + } + else + { + // last token was not a delimiter - new one is such delim + // => ignore this delimiter - but save the information, that + // it occured + bLastWasDelim = true; + } + } + else + { + // new token is no delim + // => Add it to the return list. + lTokens.add(sToken); + // Dont forget to reset this information - so next loop + // will do the right things! + bLastWasDelim = false; + } + } + + return lTokens; + } + + //___________________________________________ + + /** + */ + public synchronized void analyze() + { + m_nDoubleRegisteredFilters = 0; + m_nTypesForFilters = 0; + m_nTypesForDetectServices = 0; + m_nTypesForFrameLoaders = 0; + m_nTypesForContentHandlers = 0; + + // create table of types and all registered filters for such types + // By the way: count all double registrations, where a filter + // uses the same type then another filter. + m_lFilterToTypeRegistrations = new java.util.HashMap(); + java.util.Iterator aIt1 = m_lFilters.keySet().iterator(); + while (aIt1.hasNext()) + { + java.lang.String sFilter = (java.lang.String)aIt1.next(); + java.util.HashMap aFilter = (java.util.HashMap)m_lFilters.get(sFilter); + java.lang.String sType = (java.lang.String)aFilter.get(PROPNAME_TYPE); + + java.util.Vector lFilters = (java.util.Vector)m_lFilterToTypeRegistrations.get(sType); + if (lFilters == null) + lFilters = new java.util.Vector(); + else + ++m_nDoubleRegisteredFilters; + lFilters.add(sFilter); + m_lFilterToTypeRegistrations.put(sType, lFilters); + } + + // count, how many types are used by filters, frame loaders or content handlers + aIt1 = m_lTypes.keySet().iterator(); + while (aIt1.hasNext()) + { + java.lang.String sType = (java.lang.String)aIt1.next(); + + java.util.Iterator aIt2 = m_lFilters.keySet().iterator(); + while (aIt2.hasNext()) + { + java.lang.String sItem = (java.lang.String)aIt2.next(); + java.util.HashMap aItem = (java.util.HashMap)m_lFilters.get(sItem); + java.lang.String sTypeReg = (java.lang.String)aItem.get(PROPNAME_TYPE); + + if (sTypeReg.equals(sType)) + { + ++m_nTypesForFilters; + break; + } + } + + aIt2 = m_lDetectServices.keySet().iterator(); + while (aIt2.hasNext()) + { + java.lang.String sItem = (java.lang.String)aIt2.next(); + java.util.HashMap aItem = (java.util.HashMap)m_lDetectServices.get(sItem); + java.util.Vector lTypeReg = (java.util.Vector)aItem.get(PROPNAME_TYPES); + + if (lTypeReg.contains(sType)) + { + ++m_nTypesForDetectServices; + break; + } + } + + aIt2 = m_lFrameLoaders.keySet().iterator(); + while (aIt2.hasNext()) + { + java.lang.String sItem = (java.lang.String)aIt2.next(); + java.util.HashMap aItem = (java.util.HashMap)m_lFrameLoaders.get(sItem); + java.util.Vector lTypeReg = (java.util.Vector)aItem.get(PROPNAME_TYPES); + + if (lTypeReg.contains(sType)) + { + ++m_nTypesForFrameLoaders; + break; + } + } + + aIt2 = m_lContentHandlers.keySet().iterator(); + while (aIt2.hasNext()) + { + java.lang.String sItem = (java.lang.String)aIt2.next(); + java.util.HashMap aItem = (java.util.HashMap)m_lContentHandlers.get(sItem); + java.util.Vector lTypeReg = (java.util.Vector)aItem.get(PROPNAME_TYPES); + + if (lTypeReg.contains(sType)) + { + ++m_nTypesForContentHandlers; + break; + } + } + } + } + + //___________________________________________ + + /** validate all cache entries. + * + * It checks if all made registrations are valid; + * try to repair some simple problems; + * create missing informations on demand ... + * + * @param nFormat + * specify, which configuration format + * must be checked. + * + * @throws [java.lang.Exception] + * if an unrecoverable problem occure. + */ + public synchronized void validate(int nFormat) + throws java.lang.Exception + { + validateTypes(nFormat); + validateFilters(nFormat); + } + + //___________________________________________ + + /** validate all type entries of this cache. + * + * @param nFormat + * specify, which configuration format + * must be checked. + * + * @throws [java.lang.Exception] + * if an unrecoverable problem occure. + */ + private void validateTypes(int nFormat) + throws java.lang.Exception + { + java.util.Iterator aIt1 = m_lTypes.keySet().iterator(); + while(aIt1.hasNext()) + { + java.lang.String sType = (java.lang.String)aIt1.next(); + java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sType); + if (aType == null) + throw new java.lang.Exception("type ["+sType+"] dos not exist realy?!"); + + if ( + (!aType.containsKey(PROPNAME_MEDIATYPE )) || + (!aType.containsKey(PROPNAME_PREFERRED )) || + (!aType.containsKey(PROPNAME_CLIPBOARDFORMAT)) || + (!aType.containsKey(PROPNAME_DOCUMENTICONID )) || + (!aType.containsKey(PROPNAME_URLPATTERN )) || + (!aType.containsKey(PROPNAME_EXTENSIONS )) || + (!aType.containsKey(PROPNAME_UINAME )) + ) + { + throw new java.lang.Exception("Type \""+sType+"\" does not contain all neccessary properties for a 6.0/6.Y format."); + } + + if ( + (((java.util.Vector)aType.get(PROPNAME_EXTENSIONS)).isEmpty()) && + (((java.util.Vector)aType.get(PROPNAME_URLPATTERN)).isEmpty()) + ) + { + throw new java.lang.Exception("Type \""+sType+"\" does not contain any extension nor an url pattern."); + } + + if (((java.util.HashMap)aType.get(PROPNAME_UINAME)).isEmpty()) + throw new java.lang.Exception("Type \""+sType+"\" is not localized."); + + if (nFormat == FORMAT_6Y) + { + if ( + (!aType.containsKey(PROPNAME_UIORDER )) || + (!aType.containsKey(PROPNAME_PREFERREDFILTER)) || + (!aType.containsKey(PROPNAME_DETECTSERVICE )) + ) + { + throw new java.lang.Exception("Type \""+sType+"\" does not contain all neccessary properties for a 6.Y format."); + } + + if (((java.lang.Integer)aType.get(PROPNAME_UIORDER)).intValue() < 0) + throw new java.lang.Exception("Type \""+sType+"\" has invalid value for prop UIOrder."); + + if (((java.lang.String)aType.get(PROPNAME_DETECTSERVICE)).length() < 1) + m_aDebug.setWarning("Type \""+sType+"\" has no detect service registered."); + + java.lang.String sPreferredReg = (java.lang.String)aType.get(PROPNAME_PREFERREDFILTER); + if ( + (sPreferredReg == null) || + (sPreferredReg.length() < 1 ) + ) + { + m_aDebug.setWarning("Type \""+sType+"\" has no preferred filter ..."); + /*FIXME + * OK - not every type has a filter registered .. but the + * a frame loader MUST(!) exist! Check it. + */ + } + else + { + if (!m_lFilters.containsKey(sPreferredReg)) + throw new java.lang.Exception("Type \""+sType+"\" has no valid preferred filter registration [\""+sPreferredReg+"\"]."); + } + } + } + } + + //___________________________________________ + + /** validate all filter entries of this cache. + * + * @param nFormat + * specify, which configuration format + * must be checked. + * + * @throws [java.lang.Exception] + * if an unrecoverable problem occure. + */ + public synchronized void validateFilters(int nFormat) + throws java.lang.Exception + { + java.util.Iterator aIt1 = m_lFilters.keySet().iterator(); + while(aIt1.hasNext()) + { + java.lang.String sFilter = (java.lang.String)aIt1.next(); + java.util.HashMap aFilter = (java.util.HashMap)m_lFilters.get(sFilter); + if (aFilter == null) + throw new java.lang.Exception("filter ["+sFilter+"] dos not exist realy?!"); + + if ( + (!aFilter.containsKey(PROPNAME_DOCUMENTSERVICE )) || + (!aFilter.containsKey(PROPNAME_FILEFORMATVERSION)) || + (!aFilter.containsKey(PROPNAME_FILTERSERVICE )) || + (!aFilter.containsKey(PROPNAME_FLAGS )) || + (!aFilter.containsKey(PROPNAME_TEMPLATENAME )) || + (!aFilter.containsKey(PROPNAME_TYPE )) || + (!aFilter.containsKey(PROPNAME_UICOMPONENT )) || + (!aFilter.containsKey(PROPNAME_USERDATA )) + ) + { + throw new java.lang.Exception("Filter \""+sFilter+"\" does not contain all neccessary properties for a 6.0/6.Y format."); + } + + if (((java.lang.Integer)aFilter.get(PROPNAME_FLAGS)).intValue() < 1) + throw new java.lang.Exception("Filter \""+sFilter+"\" does not have a valid flag field."); + + if (!m_lTypes.containsKey(aFilter.get(PROPNAME_TYPE))) + throw new java.lang.Exception("Filter \""+sFilter+"\" is not registered for a well known type."); + + if (nFormat == FORMAT_60) + { + if ( + (!aFilter.containsKey(PROPNAME_ORDER )) || + (!aFilter.containsKey(PROPNAME_UINAME)) + ) + { + throw new java.lang.Exception("Filter \""+sFilter+"\" does not contain all neccessary properties for a 6.0 format."); + } + + if (((java.lang.Integer)aFilter.get(PROPNAME_ORDER)).intValue() < 0) + throw new java.lang.Exception("Filter \""+sFilter+"\" does not have a valid Order value."); + + if (((java.util.HashMap)aFilter.get(PROPNAME_UINAME)).isEmpty()) + throw new java.lang.Exception("Filter \""+sFilter+"\" is not localized."); + } +/*TODO + depends from the configuration item "remove_filter_flag_preferred" ... + + if (nFormat == FORMAT_6Y) + { + int flags = ((java.lang.Integer)aFilter.get(PROPNAME_FLAGS)).intValue(); + if ((flags & FLAGVAL_PREFERRED) == FLAGVAL_PREFERRED) + throw new java.lang.Exception("Filter \""+sFilter+"\" has superflous Preferred flag set. Please remove this flag. ["+flags+"]"); + } +*/ + } + } + + /*TODO + * - remove graphic filters! + * - move detect services to types + */ + + public synchronized void transform60to6Y(boolean bCreateCombineFilterFlag , + boolean bRemoveFilterFlagBrowserPreferred, + boolean bRemoveFilterFlagPreferred , + boolean bRemoveFilterFlag3rdparty , + boolean bRemoveFilterUINames , + boolean bRemoveGraphicFilters , + boolean bSetDefaultDetector ) + throws java.lang.Exception + { + // remove some superflous cache entries ... + // everything related to "load macros" + // Macros should be dispatched instead of loaded! + if (m_lTypes.containsKey("macro")) + { + m_lTypes.remove("macro"); + m_aDebug.setDetailedInfo("superflous type \"macro\" was removed"); + } + if (m_lFrameLoaders.containsKey("com.sun.star.comp.sfx2.SfxMacroLoader")) + { + m_lFrameLoaders.remove("com.sun.star.comp.sfx2.SfxMacroLoader"); + m_aDebug.setDetailedInfo("superflous frame loader \"com.sun.star.comp.sfx2.SfxMacroLoader\" was removed"); + } + + // step over all filters and check her properties and references + java.util.Vector lPreferredFilters = new java.util.Vector(); + java.util.Vector lNoRealFilters = new java.util.Vector(); + java.util.Iterator aIt1 = m_lFilters.keySet().iterator(); + while(aIt1.hasNext()) + { + java.lang.String sFilter = (java.lang.String)aIt1.next(); + java.util.HashMap aFilter = (java.util.HashMap)m_lFilters.get(sFilter); + + // remove the "graphic helper filters" used by draw and impress + // They dont have any valid document service name set and cant be handled + // by our generic FrameLoader! + // They must be moved to her own configuration ... + + if ( + (bRemoveGraphicFilters ) && + (((java.lang.String)aFilter.get(PROPNAME_DOCUMENTSERVICE)).length() < 1) + ) + { + lNoRealFilters.add(sFilter); + continue; + } + + java.lang.String sTypeReg = (java.lang.String)aFilter.get(PROPNAME_TYPE); + java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sTypeReg); + + // move UINames of filters to types + java.util.HashMap lFilterUINames = (java.util.HashMap)aFilter.get(PROPNAME_UINAME); + java.util.HashMap lTypeUINames = (java.util.HashMap)aType.get(PROPNAME_UINAME); + java.util.HashMap lPatchUINames = new java.util.HashMap(); + + java.util.Iterator pUINames = lTypeUINames.keySet().iterator(); + while(pUINames.hasNext()) + { + java.lang.String sLocale = (java.lang.String)pUINames.next(); + java.lang.String sValue = (java.lang.String)lTypeUINames.get(sLocale); + lPatchUINames.put(sLocale, sValue); + } + + pUINames = lFilterUINames.keySet().iterator(); + while(pUINames.hasNext()) + { + java.lang.String sLocale = (java.lang.String)pUINames.next(); + java.lang.String sValue = (java.lang.String)lFilterUINames.get(sLocale); + lPatchUINames.put(sFilter+":"+sLocale, sValue); + } + aType.put(PROPNAME_UINAME, lPatchUINames); + + // set generic filter service wrapper for our own native filters! + // By the way: The format types of such filters can be detected by our + // generic detector too. + if ( + (bSetDefaultDetector ) && + (((java.lang.String)aFilter.get(PROPNAME_FILTERSERVICE)).length() < 1) + ) + { + /*ME_THINKING aFilter.put(PROPNAME_FILTERSERVICE, FILTERSERVICE_NATIVEWARPPER);*/ + aType.put(PROPNAME_DETECTSERVICE, GENERIC_DETECTSERVICE); + } + + // move the preferred filter information to any type + // Set the filter name to the type for which the filter is registered. + // If this type already have a set PreferredFilter value, check if the current filter + // has the preferred flag set. If not ignore it - otherwhise overwrite the + // current information at the type. But look for multiple preferred filter relations ... + // means: look if more the one filter has set the preferred flag for the same type! + + /* Attention! + * + * Dont remove the preferred flag from any filter! ... not here. + * Otherwhise next loop can't detect ambigous preferred registrations! + * Add filter to a temp. list, which can be used later to remove the preferred + * flag ... + */ + + int flags1 = ((java.lang.Integer)aFilter.get(PROPNAME_FLAGS)).intValue(); + java.lang.String sDocSrv = (java.lang.String)aFilter.get(PROPNAME_DOCUMENTSERVICE); + if (sDocSrv.length()>0)// without a doc service its not a real filter - its a graphic filter! + { + boolean preferred1 = ((flags1 & FLAGVAL_PREFERRED) == FLAGVAL_PREFERRED); + if (preferred1) + lPreferredFilters.add(aFilter); + + java.lang.String sAlreadyRegisteredFilter = (java.lang.String)aType.get(PROPNAME_PREFERREDFILTER); + // no registration => set this filter as "any possible one"! + if (sAlreadyRegisteredFilter.length() < 1) + aType.put(PROPNAME_PREFERREDFILTER, sFilter); + else + { + java.util.HashMap aAlreadyRegisteredFilter = (java.util.HashMap)m_lFilters.get(sAlreadyRegisteredFilter); + int flags2 = ((java.lang.Integer)aAlreadyRegisteredFilter.get(PROPNAME_FLAGS)).intValue(); + boolean preferred2 = ((flags2 & FLAGVAL_PREFERRED) == FLAGVAL_PREFERRED); + + // two preferred filters for the same type! => error + if (preferred1 && preferred2) + { + java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256); + sMsg.append("More the one preferred filter detected for the same type.\n"); + sMsg.append("\ttype = \""+sTypeReg+"\"\n"); + sMsg.append("\tfilter[1] = \""+sAlreadyRegisteredFilter+"\"\n"); + sMsg.append("\tfilter[2] = \""+sFilter+"\"\n"); + throw new java.lang.Exception(sMsg.toString()); + } + else + // overwrite the "any possible" filter with a real preferred one + if (preferred1 && !preferred2) + aType.put(PROPNAME_PREFERREDFILTER, sFilter); + } + } + + // create the new combined filter flag if required + if (bCreateCombineFilterFlag) + { + if ( + ((flags1 & FLAGVAL_IMPORT) == FLAGVAL_IMPORT) && + ((flags1 & FLAGVAL_EXPORT) == FLAGVAL_EXPORT) + ) + { + flags1 |= FLAGVAL_COMBINED; + flags1 &= ~FLAGVAL_IMPORT ; + flags1 &= ~FLAGVAL_EXPORT ; + aFilter.put(PROPNAME_FLAGS, new java.lang.Integer(flags1)); + } + } + + // remove some obsolete filter flags + if (bRemoveFilterFlagBrowserPreferred) + { + flags1 &= ~FLAGVAL_BROWSERPREFERRED; + aFilter.put(PROPNAME_FLAGS, new java.lang.Integer(flags1)); + } + + if (bRemoveFilterFlag3rdparty) + { + flags1 &= ~FLAGVAL_3RDPARTYFILTER; + aFilter.put(PROPNAME_FLAGS, new java.lang.Integer(flags1)); + } + + // if its a filter with an UI order ... + // move this information to the registered type. + // Note: Because more then one filter can be registered for the same type. + // Handle it as an error ... till we find a better transformation! + java.lang.Integer nOrder = (java.lang.Integer)aFilter.get(PROPNAME_ORDER); + java.lang.Integer nUIOrder = (java.lang.Integer)aType.get(PROPNAME_UIORDER); + int order = nOrder.intValue(); + int uiorder = nUIOrder.intValue(); + + if (order > 0) + { + if ( + (uiorder < 1 ) || + (uiorder > order) + ) + { + aType.put(PROPNAME_UIORDER, nOrder); + m_aDebug.setDetailedInfo("moved order value "+nOrder+" from filter \""+sFilter+"\" to type \""+sTypeReg+"\""); + } + else + m_aDebug.setDetailedInfo("ignore order value [order="+nOrder+",uiorder="+nUIOrder+"] for filter \""+sFilter+"\" and type \""+sTypeReg+"\""); + } + } + + // NOW ... remove the preferred flags from every filter, which it has set. + java.util.Enumeration aIt2 = null; + if (bRemoveFilterFlagPreferred) + { + aIt2 = lPreferredFilters.elements(); + while (aIt2.hasMoreElements()) + { + java.util.HashMap aFilter = (java.util.HashMap)aIt2.nextElement(); + int flags = ((java.lang.Integer)aFilter.get(PROPNAME_FLAGS)).intValue(); + flags &= ~FLAGVAL_PREFERRED; + aFilter.put(PROPNAME_FLAGS, new java.lang.Integer(flags)); + } + } + + // NOW ... remove all "no real filters" like the graphich helper filters of + // draw and impress! + aIt2 = lNoRealFilters.elements(); + while (aIt2.hasMoreElements()) + m_lFilters.remove(aIt2.nextElement()); + + // step over all detect services and move this information directly to + // the corresponding types + // Overwrite possibel default registrations with a real existing one! + aIt1 = m_lDetectServices.keySet().iterator(); + while(aIt1.hasNext()) + { + java.lang.String sDetector = (java.lang.String)aIt1.next(); + java.util.HashMap aDetector = (java.util.HashMap)m_lDetectServices.get(sDetector); + java.util.Vector lTypeReg = (java.util.Vector)aDetector.get(PROPNAME_TYPES); + aIt2 = lTypeReg.elements(); + while(aIt2.hasMoreElements()) + { + java.lang.String sTypeReg = (java.lang.String)aIt2.nextElement(); + java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sTypeReg); + + if (aType == null) + { + m_aDebug.setWarning("Detector \""+sDetector+"\" seem to be registered for unknown type \""+sTypeReg+"\""); + continue; + } + + java.lang.Object aAlreadyRegisteredDetector = aType.get(PROPNAME_DETECTSERVICE); + if (aAlreadyRegisteredDetector != null && ((java.lang.String)aAlreadyRegisteredDetector).length() > 0) + { + java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256); + sMsg.append("type \""+sTypeReg+"\" has ambigous registrations of a detect service\n"); + sMsg.append("\tdetect service[1] = \""+(java.lang.String)aAlreadyRegisteredDetector+"\"\n"); + sMsg.append("\tdetect service[2] = \""+sDetector+"\"\n"); + m_aDebug.setWarning(sMsg.toString()); + } + aType.put(PROPNAME_DETECTSERVICE, sDetector); + m_aDebug.setGlobalInfo("move detector \""+sDetector+"\" to type \""+sTypeReg+"\""); + } + } + + // because all detect service was registered as type properties directly ... + // remove all detect service objects of this cache! + m_lDetectServices.clear(); + + // step over all frame loader and move this information directly to + // the corresponding types + // Overwrite possibel default registrations with a real existing one! + aIt1 = m_lFrameLoaders.keySet().iterator(); + while(aIt1.hasNext()) + { + java.lang.String sLoader = (java.lang.String)aIt1.next(); + java.util.HashMap aLoader = (java.util.HashMap)m_lFrameLoaders.get(sLoader); + java.util.Vector lTypeReg = (java.util.Vector)aLoader.get(PROPNAME_TYPES); + aIt2 = lTypeReg.elements(); + while(aIt2.hasMoreElements()) + { + java.lang.String sTypeReg = (java.lang.String)aIt2.nextElement(); + java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sTypeReg); + java.lang.String sAlreadyRegisteredLoader = (java.lang.String)aType.get(PROPNAME_FRAMELOADER); + if (sAlreadyRegisteredLoader != null && sAlreadyRegisteredLoader.length() > 0) + { + java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256); + sMsg.append("type \""+sTypeReg+"\" has ambigous registrations of a frame loader\n"); + sMsg.append("\tframe loader[1] = \""+sAlreadyRegisteredLoader+"\"\n"); + sMsg.append("\tframe loader[2] = \""+sLoader+"\"\n"); + m_aDebug.setWarning(sMsg.toString()); + } + aType.put(PROPNAME_FRAMELOADER, sLoader); + System.out.println("move loader \""+sLoader+"\" to type \""+sTypeReg+"\""); + } + } + + m_lFrameLoaders.clear(); + + // step over all content handler and move this information directly to + // the corresponding types + // Overwrite possibel default registrations with a real existing one! + aIt1 = m_lContentHandlers.keySet().iterator(); + while(aIt1.hasNext()) + { + java.lang.String sHandler = (java.lang.String)aIt1.next(); + java.util.HashMap aHandler = (java.util.HashMap)m_lContentHandlers.get(sHandler); + java.util.Vector lTypeReg = (java.util.Vector)aHandler.get(PROPNAME_TYPES); + aIt2 = lTypeReg.elements(); + while(aIt2.hasMoreElements()) + { + java.lang.String sTypeReg = (java.lang.String)aIt2.nextElement(); + java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sTypeReg); + java.lang.String sAlreadyRegisteredHandler = (java.lang.String)aType.get(PROPNAME_CONTENTHANDLER); + if (sAlreadyRegisteredHandler != null && sAlreadyRegisteredHandler.length() > 0) + { + java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256); + sMsg.append("type \""+sTypeReg+"\" has ambigous registrations of a content handler\n"); + sMsg.append("\tcontent handler[1] = \""+sAlreadyRegisteredHandler+"\"\n"); + sMsg.append("\tcontent handler[2] = \""+sHandler+"\"\n"); + m_aDebug.setWarning(sMsg.toString()); + } + aType.put(PROPNAME_CONTENTHANDLER, sHandler); + System.out.println("move handler \""+sHandler+"\" to type \""+sTypeReg+"\""); + } + } + + m_lContentHandlers.clear(); + +/* + int c = m_lTypes.size(); + java.lang.String[] lT1 = new java.lang.String[c]; + java.lang.String[] lT2 = new java.lang.String[c]; + long nUPS = 0; + + int i = 0; + aIt1 = m_lTypes.keySet().iterator(); + while(aIt1.hasNext()) + { + lT1[i] = (java.lang.String)aIt1.next(); + lT2[i] = lT1[i]; + ++i; + } + + for (int i1=0; i1 search from left to right + int len = lCommandLineArgs[arg].length(); + int pos = lCommandLineArgs[arg].indexOf('='); + if (pos != -1) + { + java.lang.String sArg = lCommandLineArgs[arg].substring(0,pos); + java.lang.String sValue = lCommandLineArgs[arg].substring(pos+1); + setProperty(sArg, sValue); + continue; + } + + // is it a boolean argument? + // Note: Because "--" and "-" will be interpreted as the same + // we search from right to left! + pos = lCommandLineArgs[arg].lastIndexOf('-'); + if (pos == -1) + pos = lCommandLineArgs[arg].lastIndexOf('/'); + if (pos != -1) + { + java.lang.String sArg = lCommandLineArgs[arg].substring(pos+1); + setProperty(sArg, java.lang.String.valueOf(true)); + continue; + } + + // There is an unknown format used by this argument ... + throw new MalformedCommandLineException("Invalid command line detected. The argument \""+lCommandLineArgs[arg]+"\" use an unsupported format."); + } + } + + //------------------------------------------- + /** indicates if the given command line includes + * a help request. + * + * @return True if there was an explicit help request. + */ + public synchronized boolean isHelp() + { + return ( + (containsKey("help")) || + (containsKey("?") ) || + (containsKey("h") ) + ); + } + + //------------------------------------------- + /** indicates if the gioven command line was empty. + * + * @return True if there was an empty command line. + */ + public synchronized boolean isEmpty() + { + return m_bEmpty; + } + + //------------------------------------------- + /** returns the value of sProp as boolean value. + * + * @param sProp + * the name of the parameter. + * + * @return The boolean value of the requested property. + * + * @throw [NoSuchElementException] + * if the requested property does not exists. + */ + public synchronized boolean getBoolean(java.lang.String sProp) + throws java.util.NoSuchElementException + { + java.lang.String sValue = getProperty(sProp); + if (sValue == null) + throw new java.util.NoSuchElementException("The requested config value \""+sProp+"\" does not exists!"); + return new java.lang.Boolean(sValue).booleanValue(); + } + + public synchronized boolean getBoolean(java.lang.String sProp , + boolean bDefault) + { + java.lang.String sDefault = java.lang.String.valueOf(bDefault); + java.lang.String sValue = getProperty(sProp, sDefault); + return new java.lang.Boolean(sValue).booleanValue(); + } + + //------------------------------------------- + /** returns the value of sProp as int value. + * + * @param sProp + * the name of the parameter. + * + * @return The int value of the requested property. + * + * @throw [NoSuchElementException] + * if the requested property does not exists. + */ + public synchronized int getInt(java.lang.String sProp) + throws java.util.NoSuchElementException + { + java.lang.String sValue = getProperty(sProp); + if (sValue == null) + throw new java.util.NoSuchElementException("The requested config value \""+sProp+"\" does not exists!"); + return new java.lang.Integer(sValue).intValue(); + } + + public synchronized int getInt(java.lang.String sProp , + int nDefault) + { + java.lang.String sDefault = java.lang.String.valueOf(nDefault); + java.lang.String sValue = getProperty(sProp, sDefault); + return new java.lang.Integer(sValue).intValue(); + } + + //------------------------------------------- + /** returns the value of sProp as string value. + * + * @param sProp + * the name of the parameter. + * + * @return The string value of the requested property. + * + * @throw [NoSuchElementException] + * if the requested property does not exists. + */ + public synchronized java.lang.String getString(java.lang.String sProp) + throws java.util.NoSuchElementException + { + java.lang.String sValue = getProperty(sProp); + if (sValue == null) + throw new java.util.NoSuchElementException("The requested config value \""+sProp+"\" does not exists!"); + return sValue; + } + + //------------------------------------------- + /** returns the value of sProp as string list value! + * + * @descr The delimiter must be well known and + * it must be clear if trailing/leading + * whitespaces must be ignored or not. + * + * @param sProp + * the name of the parameter. + * + * @param sDelim + * the delimiter, which must be used to split + * the config string value into an array. + * + * @param bTrim + * if its set to true, trailing and leading whitespace + * characters will be ommited. + * + * @param bDecode + * if its set to TRUE all liste items will be + * interpreted as "" and converted to ! + * + * @return The string list value of the requested property. + * + * @throw [NoSuchElementException] + * if the requested property does not exists. + */ + public synchronized java.util.Vector getStringList(java.lang.String sProp , + java.lang.String sDelimiter, + boolean bTrim , + boolean bDecode ) + throws java.util.NoSuchElementException + { + java.lang.String sValue = getProperty(sProp); + if (sValue == null) + throw new java.util.NoSuchElementException("The requested config value \""+sProp+"\" does not exists!"); + + java.util.Vector lValue = new java.util.Vector(); + try + { + java.util.StringTokenizer lTokens = new java.util.StringTokenizer(sValue, sDelimiter); + while(lTokens.hasMoreTokens()) + { + java.lang.String sToken = lTokens.nextToken(); + // remove trailing/leading whitespaces + if (bTrim) + sToken = sToken.trim(); + // remove "" + if ( + (bDecode ) && + (sToken.indexOf("\"") == 0 ) && + (sToken.lastIndexOf("\"") == sToken.length()-1) + ) + { + sToken = sToken.substring(1, sToken.length()-1); + } + lValue.add(sToken); + } + } + catch(java.lang.Throwable ex) + { lValue.clear(); } + + return lValue; + } +} diff --git a/transex3/source/filter/utils/FileHelper.java b/transex3/source/filter/utils/FileHelper.java new file mode 100644 index 000000000000..71f51cf36bf6 --- /dev/null +++ b/transex3/source/filter/utils/FileHelper.java @@ -0,0 +1,766 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: FileHelper.java,v $ + * $Revision: 1.13 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package com.sun.star.filter.config.tools.utils; + +// __________ Imports __________ + +import java.io.*; +import java.lang.*; +import java.net.*; +import java.util.*; + +// __________ Implementation __________ + +/** + * It collects some static helper functons to handle file system specific problems. + * Sometimes it's neccessary to convert URL from/to system pathes; + * or from string notation to structural versions (e.g. com.sun.star.util.URL). + * And sometimes java had another notation then the office it has. + * Further it provides functionality to work easiear with the java.io.File class of java. + * + * + */ +public class FileHelper +{ + // ____________________ + + /** + * Because the office need URLs for loading/saving documents + * we must convert used system pathes. + * And java use another notation for file URLs ... correct it. + * + * @param aSystemPath + * represent the file in system notation + * + * @return [String] + * a file url which represent the given system path + */ + public static java.lang.String getFileURLFromSystemPath(java.io.File aSystemPath) + { + System.out.println("TODO: must be adapted to java 1.3 :-("); + System.exit(-1); +/*TODO_JAVA + try + { + sFileURL = aSystemPath.toURI().toURL().toString(); + } + catch( MalformedURLException exWrong ) + { + sFileURL = null; + } +*/ + java.lang.String sFileURL = null; + + // problem of java: file URL's are coded with 1 slash instead of 2 or 3 ones! + // => correct this problem first, otherwise office can't use these URL's + if( + (sFileURL != null ) && + (sFileURL.startsWith("file:/") == true ) && + (sFileURL.startsWith("file://") == false) + ) + { + java.lang.StringBuffer sWorkBuffer = new java.lang.StringBuffer(sFileURL); + sWorkBuffer.insert(6,"//"); + sFileURL = sWorkBuffer.toString(); + } + + return sFileURL; + } + + // ____________________ + + /** + * The same as getFileURLFromSystemPath() before but uses string parameter instead + * of a java.io.File type. It exist to supress converting of neccessary parameters in the + * outside code. But of course getFileURLFromSystemPath(File) will be a little bit faster + * then this method ... + * + * @param sSystemPath + * represent the file in system notation + * + * @return [String] + * a file url which represent the given system path + */ + public static java.lang.String getFileURLFromSystemPath(java.lang.String sSystemPath) + { + return getFileURLFromSystemPath(new java.io.File(sSystemPath)); + } + + // ____________________ + + /** + * Does the same as getFileURLFromSystemPath() before ... but uses + * the given protocol string (e.g."http://") insted of "file:///". + * + * @param aSystemPath + * represent the file in system notation + * + * @param aBasePath + * define the base path of the aSystemPath value, + * which must be replaced with the value of "sServerPath". + * + * @param sServerURL + * Will be used to replace sBasePath. + * + * @example + * System Path = "d:\test\file.txt" + * Base Path = "d:\test" + * Server Path = "http://alaska:8000" + * => "http://alaska:8000/file.txt" + * + * @return [String] + * an url which represent the given system path + * and uses the given protocol + */ + public static java.lang.String getURLWithProtocolFromSystemPath(java.io.File aSystemPath, + java.io.File aBasePath , + java.lang.String sServerURL ) + { + System.out.println("TODO: must be adapted to java 1.3 :-("); + System.exit(-1); + + java.lang.String sFileURL = FileHelper.getFileURLFromSystemPath(aSystemPath); + java.lang.String sBaseURL = FileHelper.getFileURLFromSystemPath(aBasePath ); + + // cut last '/'! + if (sBaseURL.lastIndexOf('/')==(sBaseURL.length()-1)) + sBaseURL = sBaseURL.substring(0,sBaseURL.length()-1); + + // cut last '/'! + if (sServerURL.lastIndexOf('/')==(sServerURL.length()-1)) + sServerURL = sServerURL.substring(0,sServerURL.length()-1); + +//TODO_JAVA java.lang.String sURL = sFileURL.replaceFirst(sBaseURL,sServerURL); + java.lang.String sURL = null; + return sURL; + } + + // ____________________ + + /** + * The same as getURLWithProtocolFromSystemPath() before but uses string parameter instead + * of a java.io.File types. It exist to supress converting of neccessary parameters in the + * outside code. But of course getURLWithProtocolFromSystemPath(File,File,String) will be + * a little bit faster then this method ... + * + * @param sSystemPath + * represent the file in system notation + * + * @param sBasePath + * define the base path of the aSystemPath value, + * which must be replaced with the value of "sServerPath". + * + * @param sServerPath + * Will be used to replace sBasePath. + * + * @example + * System Path = "d:\test\file.txt" + * Base Path = "d:\test" + * Server Path = "http://alaska:8000" + * => "http://alaska:8000/file.txt" + * + * @return [String] + * an url which represent the given system path + * and uses the given protocol + */ + public static java.lang.String getURLWithProtocolFromSystemPath(java.lang.String sSystemPath, + java.lang.String sBasePath , + java.lang.String sServerPath) + { + return getURLWithProtocolFromSystemPath(new java.io.File(sSystemPath), new java.io.File(sBasePath), sServerPath); + } + + //_________________________________ + + /** + * Return a list of all available files of a directory. + * We filter sub directories. All other files + * are returned. So they can be used for further purposes. + * One parameter define the start directory, + * another one enable/disable recursive search into sub directories. + * + * @param aRoot + * the start directory, which should be analyzed. + * + * @param bRecursive + * enable/disable search in sub directories. + * + * @return [Vector] + * a filtered list of java java.io.File objects of all available files + * of the start dir (and may of its sub directories). + */ + public static java.util.Vector getSystemFilesFromDir(java.io.File aRoot , + boolean bRecursive) + { + java.io.File[] lAllFiles = aRoot.listFiles(); + if (lAllFiles == null) + return null; + + int c = lAllFiles.length; + java.util.Vector lFilteredFiles = new java.util.Vector(c); + for (int i=0; i=48 && c<=57 // 0-9 + && + c>=97 && c<=122 // a-z + && + c>=65 && c<=90 // A-Z + ) + { + sNewName.append(c); + } + else + { + sNewName.append("_"); + } + } + + return sNewName.toString(); + } + + //___________________________________________ + + /** it removes all child nodes of a file system directory. + * + * @param aDirectory + * points to the directory, which should be made empty. + * + * @param bFilesOnly + * force deletion of files only. If its set to TRUE, + * no subdirectory will be removed. + * + * @throw [java.io.IOException] + * if some of the child nodes couldn't be removed. + */ + public static void makeDirectoryEmpty(java.io.File aDirectory, + boolean bFilesOnly) + throws java.io.IOException + { + if (!aDirectory.isDirectory()) + throw new java.io.FileNotFoundException("\""+aDirectory.toString()+"\" is not a directory."); + + java.io.File[] lChilds = aDirectory.listFiles(); + for (int f=0; f0) + sBuffer.append(aEncodedBuffer, 0, nReadCount); + + aEncodedReader.close(); + } + + //___________________________________________ + private static void logEncodingData(java.lang.StringBuffer sLog , + int nUTF8 , + int nByteOrg1 , + int nByteOrg2 , + int nByteOrg3 , + int nByteOrg4 , + int nByte1 , + int nByte2 , + int nByte3 , + int nByte4 , + int nEncodingType) + { + sLog.append("["+nEncodingType+"]\t"); + sLog.append((int)nUTF8+"\t="); + sLog.append("\t"+nByteOrg1+"/"+nByte1); + sLog.append("\t"+nByteOrg2+"/"+nByte2); + sLog.append("\t"+nByteOrg3+"/"+nByte3); + sLog.append("\t"+nByteOrg4+"/"+nByte4); + sLog.append("\n"); + } + + //___________________________________________ + private static char impl_convertBytesToChar(int nByte1, int nByte2, int nByte3, int nByte4) + { + return (char)((nByte1*0x40000)+(nByte2*0x1000)+(nByte3*0x40)+nByte4); + } + + //___________________________________________ + private static int impl_readAndCheckNextByte(byte[] aBuffer , + int nBufPos , + int nBufLength , + int nMinRange , + int nMaxRange ) + throws java.lang.Exception + { + if (nBufPos>=nBufLength) + throw new java.lang.Exception("impl_readAndCheckNextByte()\nEnd of buffer reached."); + + int nByte = aBuffer[nBufPos] & 0xFF; + if ( + (nByte < nMinRange) || + (nByte > nMaxRange) + ) + { + throw new java.lang.Exception("impl_readAndCheckNextByte()\nByte does not fit the specified range."); + } + + return nByte; + } + + //___________________________________________ + public static void readAndCheckUTF8File(java.io.File aFile , + java.lang.StringBuffer sBuffer) + throws java.io.IOException + { + java.io.FileInputStream aByteStream = new java.io.FileInputStream(aFile.getAbsolutePath()); + byte[] aBuffer = new byte[4096]; + int nReadCount = 0; + int nByteOrg_1 = 0; + int nByteOrg_2 = 0; + int nByteOrg_3 = 0; + int nByteOrg_4 = 0; + int nByte_1 = 0; + int nByte_2 = 0; + int nByte_3 = 0; + int nByte_4 = 0; + char nUTF8 = 0; + int i = 0; + int nEncodingType = 0; + java.lang.StringBuffer sLog = new java.lang.StringBuffer(); + + try + { + + while((nReadCount=aByteStream.read(aBuffer))>0) + { + i=0; + while (i= 0x00) && + (nByteOrg_1 <= 0x7F) + ) + { + nEncodingType = 1; + nUTF8 = (char)nByte_1; + } + // ------------------------------------------------------------ + // 02 + // 1 byte: 110xxxxx + // 2 byte: 101xxxxx + // ------------------------------------------------------------ + else + if ( + (nByteOrg_1 >= 0xC2) && + (nByteOrg_1 <= 0xDF) + ) + { + nEncodingType = 2; + nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByte_1 = nByteOrg_1-0xC2; + nByte_2 = nByteOrg_2-0x80; + nUTF8 = FileHelper.impl_convertBytesToChar(0,0,nByte_1, nByte_2); + } + // ------------------------------------------------------------ + // 03 + // 1 byte: 11100000 + // 2 byte: 101xxxxx + // 3 byte: 10xxxxxx + // ------------------------------------------------------------ + else + if (nByteOrg_1 == 0xE0) + { + nEncodingType = 3; + nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0xA0, 0xBF); + nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByte_2 = nByteOrg_2-0xA0; + nByte_3 = nByteOrg_3-0x80; + nUTF8 = FileHelper.impl_convertBytesToChar(0,0,nByte_2, nByte_3); + } + // ------------------------------------------------------------ + // 04 + // 1 byte: 111xxxxx + // 2 byte: 10xxxxxx + // 3 byte: 10xxxxxx + // ------------------------------------------------------------ + else + if ( + (nByteOrg_1 >= 0xE1) && + (nByteOrg_1 <= 0xEC) + ) + { + nEncodingType = 4; + nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByte_1 = nByteOrg_1-0xE1; + nByte_2 = nByteOrg_2-0x80; + nByte_3 = nByteOrg_3-0x80; + nUTF8 = FileHelper.impl_convertBytesToChar(0,nByte_1, nByte_2, nByte_3); + } + // ------------------------------------------------------------ + // 05 + // 1 byte: 11101101 + // 2 byte: 10xxxxxx + // 3 byte: 10xxxxxx + // ------------------------------------------------------------ + else + if (nByteOrg_1 == 0xED) + { + nEncodingType = 5; + nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0x9F); + nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByte_2 = nByteOrg_2-0x80; + nByte_3 = nByteOrg_3-0x80; + nUTF8 = FileHelper.impl_convertBytesToChar(0,0, nByte_2, nByte_3); + } + // ------------------------------------------------------------ + // 06 + // 1 byte: 1110111x + // 2 byte: 10xxxxxx + // 3 byte: 10xxxxxx + // ------------------------------------------------------------ + else + if ( + (nByteOrg_1 >= 0xEE) && + (nByteOrg_1 <= 0xEF) + ) + { + nEncodingType = 6; + nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByte_1 = nByteOrg_1-0xEE; + nByte_2 = nByteOrg_2-0x80; + nByte_3 = nByteOrg_3-0x80; + nUTF8 = FileHelper.impl_convertBytesToChar(0,nByte_1, nByte_2, nByte_3); + } + // ------------------------------------------------------------ + // 07 + // 1 byte: 11110000 + // 2 byte: 1001xxxx + // 3 byte: 10xxxxxx + // 4 byte: 10xxxxxx + // ------------------------------------------------------------ + else + if (nByteOrg_1 == 0xF0) + { + nEncodingType = 7; + nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x90, 0xBF); + nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByteOrg_4 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByte_2 = nByteOrg_2-0x90; + nByte_3 = nByteOrg_3-0x80; + nByte_4 = nByteOrg_4-0x80; + nUTF8 = FileHelper.impl_convertBytesToChar(0, nByte_2, nByte_3, nByte_4); + } + // ------------------------------------------------------------ + // 08 + // 1 byte: 111100xx + // 2 byte: 10xxxxxx + // 3 byte: 10xxxxxx + // 3 byte: 10xxxxxx + // ------------------------------------------------------------ + else + if ( + (nByteOrg_1 >= 0xF1) && + (nByteOrg_1 <= 0xF3) + ) + { + nEncodingType = 8; + nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByteOrg_4 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByte_1 = nByteOrg_1-0xF1; + nByte_2 = nByteOrg_2-0x80; + nByte_3 = nByteOrg_3-0x80; + nByte_4 = nByteOrg_4-0x80; + nUTF8 = FileHelper.impl_convertBytesToChar(nByte_1, nByte_2, nByte_3, nByte_4); + } + // ------------------------------------------------------------ + // 09 + // 1 byte: 11110100 + // 2 byte: 10xxxxxx + // 3 byte: 10xxxxxx + // 4 byte: 10xxxxxx + // ------------------------------------------------------------ + else + if (nByteOrg_1 == 0xF0) + { + nEncodingType = 9; + nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByteOrg_4 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF); + nByte_2 = nByteOrg_2-0x80; + nByte_3 = nByteOrg_3-0x80; + nByte_4 = nByteOrg_4-0x80; + nUTF8 = FileHelper.impl_convertBytesToChar(0, nByte_2, nByte_3, nByte_4); + } + // wrong encoding ? + else + { + throw new java.lang.Exception("Non well formed UTF-8 encoding."); + } + + sBuffer.append(nUTF8); + // -> DEBUG ! + FileHelper.logEncodingData(sLog, nUTF8, nByteOrg_1, nByteOrg_2, nByteOrg_3, nByteOrg_4, nByte_1, nByte_2, nByte_3, nByte_4, nEncodingType); + // <- DEBUG ! + } + } + + } + catch(java.lang.Throwable ex) + { + // -> DEBUG ! + FileHelper.logEncodingData(sLog, nUTF8, nByteOrg_1, nByteOrg_2, nByteOrg_3, nByteOrg_4, nByte_1, nByte_2, nByte_3, nByte_4, nEncodingType); + + java.io.File aDir = new java.io.File(aFile.getParent()); + java.lang.String sDump = aFile.getName(); + java.io.File aDump = FileHelper.createUniqueFile(aDir, sDump, "dump"); + FileHelper.writeEncodedBufferToFile(aDump, "UTF-8", false, sLog); + // <- DEBUG ! + + java.lang.String sMsg = "File '"+aFile.getPath()+"' is not encoded right as UTF-8."; + throw new java.io.IOException(sMsg); + } + + aByteStream.close(); + } + + //___________________________________________ + + /** writes the given string buffer into the specified file + * using the specified encoding. + * + * Further it can be set, if the file should be expanded + * or replaced by this new string buffer. + * + * @param aFile + * must point to a system file. It can already exist! + * e.g.: "c:\temp\test.txt" + * "/tmp/test.txt" + * + * @param sEncoding + * will be used to encode the string content inside the file. + * e.g.: "UTF8" + * + * @param bAppend + * specify if an already existing file will be + * expanded or replaced. + * + * @param sBuffer + * the new string content for this file. + */ + public static void writeEncodedBufferToFile(java.io.File aFile , + java.lang.String sEncoding, + boolean bAppend , + java.lang.StringBuffer sBuffer ) + throws java.io.IOException + { + java.io.FileOutputStream aByteStream = new java.io.FileOutputStream(aFile.getAbsolutePath(), bAppend); + java.io.OutputStreamWriter aEncodedWriter = new java.io.OutputStreamWriter(aByteStream, sEncoding); + + java.lang.String sTemp = sBuffer.toString(); + aEncodedWriter.write(sTemp, 0, sTemp.length()); + + aEncodedWriter.flush(); + aEncodedWriter.close(); + + if (!aFile.exists()) + throw new java.io.IOException("File \""+aFile.getAbsolutePath()+"\" not written correctly."); + } +} diff --git a/transex3/source/filter/utils/Logger.java b/transex3/source/filter/utils/Logger.java new file mode 100644 index 000000000000..7657eba5f426 --- /dev/null +++ b/transex3/source/filter/utils/Logger.java @@ -0,0 +1,177 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: Logger.java,v $ + * $Revision: 1.8 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package com.sun.star.filter.config.tools.utils; + +//_______________________________________________ +// imports + +import java.lang.*; +import java.util.*; + +//_______________________________________________ +// definition + +/** can be used to print out some debug messages + * and group it into warnings/errors or info statements. + * + * + */ +public class Logger +{ + //___________________________________________ + // const + + /** only error message will be shown. */ + public static final int LEVEL_ERRORS = 1; + + /** only errors and warnings will be shown. */ + public static final int LEVEL_WARNINGS = 2; + + /** enable errors/warnings and some global info + * message. */ + public static final int LEVEL_GLOBALINFOS = 3; + + /** enable anything! */ + public static final int LEVEL_DETAILEDINFOS = 4; + + //___________________________________________ + // member + + /** enable/disable different output level. + * e.g. warnings/errors/infos */ + private int m_nLevel; + + //___________________________________________ + // ctor + + /** initialize new debug object with the specified + * debug level. + * + * @param nLevel + * the new debug level. + * See const values LEVEL_xxx too. + */ + public Logger(int nLevel) + { + m_nLevel = nLevel; + } + + //___________________________________________ + // interface + + /** initialize new debug object with a default + * debug level. + */ + public Logger() + { + m_nLevel = LEVEL_DETAILEDINFOS; + } + + //___________________________________________ + // interface + + /** prints out an exception ... if the right level is set. + * + * @param ex + * the exception object + */ + public synchronized void setException(java.lang.Throwable ex) + { + if (m_nLevel >= LEVEL_ERRORS) + { + System.err.println("Exception:\n"); + ex.printStackTrace(); + } + } + + //___________________________________________ + // interface + + /** prints out an error ... if the right level is set. + * + * @param sError + * the error message. + */ + public synchronized void setError(java.lang.String sError) + { + if (m_nLevel >= LEVEL_ERRORS) + System.err.println("Error :\t\""+sError+"\""); + } + + //___________________________________________ + // interface + + /** prints out a warning ... if the right level is set. + * + * @param sWarning + * the warning message. + */ + public synchronized void setWarning(java.lang.String sWarning) + { + if (m_nLevel >= LEVEL_WARNINGS) + System.err.println("Warning :\t\""+sWarning+"\""); + } + + //___________________________________________ + // interface + + /** prints out a global info message ... if the right level is set. + * + * Global infos should be used to describe a complex operation. + * E.g.: loading of a document. + * But not for every sub operation like e.g. analyzing lines + * during loading the document! + * + * @param sInfo + * the info message. + */ + public synchronized void setGlobalInfo(java.lang.String sInfo) + { + if (m_nLevel >= LEVEL_GLOBALINFOS) + System.out.println("Info :\t\""+sInfo+"\""); + } + + //___________________________________________ + // interface + + /** prints out a mode detailed info message ... if the right level is set. + * + * Such detailed message are e.g. "analyze line [n] of file ...". + * + * @param sInfo + * the info message. + */ + public synchronized void setDetailedInfo(java.lang.String sInfo) + { + if (m_nLevel >= LEVEL_DETAILEDINFOS) + System.out.println("Detail :\t\""+sInfo+"\""); + } +} diff --git a/svtools/inc/svtools/options.hxx b/transex3/source/filter/utils/MalformedCommandLineException.java similarity index 60% rename from svtools/inc/svtools/options.hxx rename to transex3/source/filter/utils/MalformedCommandLineException.java index 33ba515af67d..e073dcb9adcc 100644 --- a/svtools/inc/svtools/options.hxx +++ b/transex3/source/filter/utils/MalformedCommandLineException.java @@ -1,4 +1,4 @@ -/************************************************************************* +/*_*********************************************************************** * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -6,8 +6,8 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: options.hxx,v $ - * $Revision: 1.3 $ + * $RCSfile: MalformedCommandLineException.java,v $ + * $Revision: 1.4 $ * * This file is part of OpenOffice.org. * @@ -26,30 +26,25 @@ * * for a copy of the LGPLv3 License. * - ************************************************************************/ + **********************************************************************_*/ -#ifndef INCLUDED_SVTOOLS_OPTIONS_HXX -#define INCLUDED_SVTOOLS_OPTIONS_HXX +package com.sun.star.filter.config.tools.utils; -#include "sal/config.h" -#include "svtools/svldllapi.h" +//_______________________________________________ +// imports -namespace svt { namespace detail { +import java.lang.*; -// A base class for the various option classes supported by -// svtools/source/config/itemholderbase.hxx (which must be public, as it is -// shared between svl and svt): -class SVL_DLLPUBLIC Options { -public: - Options(); +//___________________________________________ +// types - virtual ~Options() = 0; - -private: - SVL_DLLPRIVATE Options(Options &); // not defined - SVL_DLLPRIVATE void operator =(Options &); // not defined -}; - -} } - -#endif +/** indicates a malformed command line. + * + * E.g. it must be thrown if the command line contains one item more then once, + * or use unsupported format. + */ +public class MalformedCommandLineException extends java.lang.Exception +{ + public MalformedCommandLineException() {} + public MalformedCommandLineException(java.lang.String sMsg) { super(sMsg); } +} diff --git a/transex3/source/filter/utils/XMLHelper.java b/transex3/source/filter/utils/XMLHelper.java new file mode 100644 index 000000000000..0f912cac8e25 --- /dev/null +++ b/transex3/source/filter/utils/XMLHelper.java @@ -0,0 +1,825 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: XMLHelper.java,v $ + * $Revision: 1.7 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package com.sun.star.filter.config.tools.utils; + +//_______________________________________________ + +import java.lang.*; +import java.util.*; +import java.io.*; + +//_______________________________________________ + +/** + * It provides some constant values and some static helper routines + * which are neccessary to work with a xml file - especialy + * the filter configuration. + * + * + */ +public class XMLHelper +{ + //___________________________________________ + // public const + + /** its a possible value of the xml attribute "oor:type" and identify an integer type. */ + public static final java.lang.String XMLTYPE_INTEGER = "xs:int"; + + /** its a possible value of the xml attribute "oor:type" and identify an boolean type. */ + public static final java.lang.String XMLTYPE_BOOLEAN = "xs:boolean"; + + /** its a possible value of the xml attribute "oor:type" and identify an string type. */ + public static final java.lang.String XMLTYPE_STRING = "xs:string"; + + /** its a possible value of the xml attribute "oor:type" and identify an string list type. */ + public static final java.lang.String XMLTYPE_STRINGLIST = "oor:string-list"; + + /** its a xml attribute, which specify a property name. */ + public static final java.lang.String XMLATTRIB_OOR_NAME = "oor:name"; + + /** its a xml attribute, which specify a property type. */ + public static final java.lang.String XMLATTRIB_OOR_TYPE = "oor:type"; + + /** its a xml attribute, which specify a list separator. */ + public static final java.lang.String XMLATTRIB_OOR_SEPARATOR = "oor:separator"; + + /** its a xml attribute, which specify a localized value. */ + public static final java.lang.String XMLATTRIB_OOR_LOCALIZED = "oor:localized"; + + /** its a xml attribute, which specify a merge operation for cfg layering. */ + public static final java.lang.String XMLATTRIB_OOR_OP = "oor:op"; + + /** can be used as value for XMLATTRIB_OOR_OP. */ + public static final java.lang.String XMLATTRIB_OP_REPLACE = "replace"; + + /** its a xml attribute, which specify a locale value. */ + public static final java.lang.String XMLATTRIB_XML_LANG = "xml:lang"; + + /** its the tag name of a entry. */ + public static final java.lang.String XMLTAG_VALUE = "value"; + + /** its the tag name of a entry. */ + public static final java.lang.String XMLTAG_PROP = "prop"; + + /** its the tag name of a entry. */ + public static final java.lang.String XMLTAG_NODE = "node"; + + //___________________________________________ + // private const + + /** a static list of all possible separators, which can be used for configuration type string-list. */ + private static final java.lang.String[] DELIMS = {" ", ",", ";", ".", ":", "-", "_", "#", "'", "+", "*", "~", "=", "?"}; + + /** index of the default separator inside list DELIMS. + * Its neccessary to know such default separator; because it can + * be supressed as xml attribute of the corresponding value tag. */ + private static final int DEFAULT_SEPARATOR = 0; + + //___________________________________________ + + /** analyze the structures of the given XML node and + * return a property set of all found sub nodes. + * + * Such properties are organized as [name, value] pairs. + * The type of a xml node will be detected automaticly. + * Following types are supported: + * xs:int => java.lang.Integer + * xs:bool => java.lang.Boolean + * xs:string => java.lang.String + * oor:string-list => java.util.LinkedList[java.lang.String] + * oor:set => java.util.Vector[java.lang.Object] + * oor:localized => java.util.HashMap[java.lang.Object] + * + * @param aNode + * points directly to the xml node, where we should analyze + * the children nodes. + * + * @return [java.util.HashMap] + * contains every node name as key and its string(!) as value. + */ + public static java.util.HashMap convertNodeToPropSet(org.w3c.dom.Node aNode) + throws java.lang.Exception + { + java.util.HashMap aPropSet = new java.util.HashMap(); + + // get all child nodes, which seems to be properties + java.util.Vector lChildNodes = XMLHelper.extractChildNodesByTagName(aNode, XMLTAG_PROP); + java.util.Enumeration en1 = lChildNodes.elements(); + while(en1.hasMoreElements()) + { + org.w3c.dom.Node aChildNode = (org.w3c.dom.Node)en1.nextElement(); + + // read its name + java.lang.String sChildName = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_NAME); + if (sChildName == null) + throw new java.io.IOException("unsupported format: could not extract child node name"); + + // read its type info + java.lang.String sChildType = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_TYPE); + if (sChildType == null) + { + /** Special patch: + * If an xml tag has no type information set ... we can restore it + * by analyzing the already readed tag name :-) + * Not very nice - but it can help to read stripped xml files too. */ + sChildType = XMLHelper.getTypeForTag(sChildName); + if (sChildType == null) + throw new java.io.IOException("unsupported format: could not extract child node type"); + } + + // read its value(s?) + java.util.Vector lChildValues = XMLHelper.extractChildNodesByTagName(aChildNode, XMLTAG_VALUE); + java.util.Enumeration en2 = lChildValues.elements(); + int nValue = 0; + java.lang.Object aValue = null; + while(en2.hasMoreElements()) + { + org.w3c.dom.Node aValueNode = (org.w3c.dom.Node)en2.nextElement(); + java.lang.String sChildLocale = XMLHelper.extractNodeAttribByName(aValueNode, XMLATTRIB_XML_LANG); + boolean bLocalized = (sChildLocale != null); + + ++nValue; + + if (sChildType.equals(XMLTYPE_INTEGER)) + { + if (!bLocalized && nValue > 1) + throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected"); + java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData(); + aValue = new java.lang.Integer(sData); + } + else + if (sChildType.equals(XMLTYPE_BOOLEAN)) + { + if (!bLocalized && nValue > 1) + throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected"); + java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData(); + aValue = new java.lang.Boolean(sData); + } + else + if (sChildType.equals(XMLTYPE_STRING)) + { + if (!bLocalized && nValue > 1) + throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected"); + + java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData(); + + java.util.HashMap lLocalized = null; + if (bLocalized) + { + if (aValue == null) + aValue = new java.util.HashMap(); + lLocalized = (java.util.HashMap)aValue; + lLocalized.put(sChildLocale, sData); + } + else + aValue = sData; + } + else + if (sChildType.equals(XMLTYPE_STRINGLIST)) + { + if (!bLocalized && nValue > 1) + throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected"); + + java.lang.String sSeparator = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_SEPARATOR); + if (sSeparator == null) + sSeparator = " "; + + java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData(); + sData = sData.replace('\t', ' '); + sData = sData.replace('\n', ' '); + java.util.StringTokenizer aTokenizer = new java.util.StringTokenizer(sData, sSeparator); + java.util.Vector lList = new java.util.Vector(); + while(aTokenizer.hasMoreTokens()) + { + java.lang.String sToken = (java.lang.String)aTokenizer.nextToken(); + sToken.trim(); + if (sToken.length() < 1) + continue; + lList.add(sToken); + } + aValue = lList; + } + + aPropSet.put(sChildName, aValue); + } + } + + return aPropSet; + } + + //___________________________________________ + + private static java.lang.String getTypeForTag(java.lang.String sTag) + { + java.lang.String sType = null; + + if ( + (sTag.equals(Cache.PROPNAME_DATA )) || + (sTag.equals(Cache.PROPNAME_NAME )) || + (sTag.equals(Cache.PROPNAME_UINAME )) || + (sTag.equals(Cache.PROPNAME_MEDIATYPE )) || + (sTag.equals(Cache.PROPNAME_CLIPBOARDFORMAT )) || + (sTag.equals(Cache.PROPNAME_PREFERREDFILTER )) || + (sTag.equals(Cache.PROPNAME_DETECTSERVICE )) || + (sTag.equals(Cache.PROPNAME_FRAMELOADER )) || + (sTag.equals(Cache.PROPNAME_CONTENTHANDLER )) || + (sTag.equals(Cache.PROPNAME_DOCUMENTSERVICE )) || + (sTag.equals(Cache.PROPNAME_FILTERSERVICE )) || + (sTag.equals(Cache.PROPNAME_TEMPLATENAME )) || + (sTag.equals(Cache.PROPNAME_TYPE )) || + (sTag.equals(Cache.PROPNAME_UICOMPONENT )) + ) + sType = XMLTYPE_STRING; + else + if ( + (sTag.equals(Cache.PROPNAME_PREFERRED )) || + (sTag.equals("Installed" )) + ) + sType = XMLTYPE_BOOLEAN; + else + if ( + (sTag.equals(Cache.PROPNAME_UIORDER )) || + (sTag.equals(Cache.PROPNAME_DOCUMENTICONID )) || + (sTag.equals(Cache.PROPNAME_FILEFORMATVERSION)) + ) + sType = XMLTYPE_INTEGER; + else + if ( + (sTag.equals(Cache.PROPNAME_URLPATTERN )) || + (sTag.equals(Cache.PROPNAME_EXTENSIONS )) || + (sTag.equals(Cache.PROPNAME_USERDATA )) || + (sTag.equals(Cache.PROPNAME_FLAGS )) || + (sTag.equals(Cache.PROPNAME_TYPES )) + ) + sType = XMLTYPE_STRINGLIST; + + if (sType == null) + System.err.println("getTypeForTag("+sTag+") = "+sType); + + return sType; + } + + //___________________________________________ + + /** return a xml representation of the given property set. + * + * @param aPropSet + * a set of pairs, which should be translated to xml + * + * @return [java.lang.String] + * the xml string representation. + * + * @throws [java.lang.Exception] + * if anything during convertion fill fail. + */ + public static java.lang.String convertPropSetToXML(java.util.HashMap aPropSet , + int nPrettyTabs) + throws java.lang.Exception + { + java.lang.StringBuffer sXML = new java.lang.StringBuffer(256); + + java.util.Iterator it1 = aPropSet.keySet().iterator(); + while(it1.hasNext()) + { + java.lang.String sProp = (java.lang.String)it1.next(); + java.lang.Object aVal = aPropSet.get(sProp); + + sProp = encodeHTMLSigns(sProp); + + // is it a simple type? + if ( + (aVal instanceof java.lang.Integer) || + (aVal instanceof java.lang.Boolean) || + (aVal instanceof java.lang.String ) + ) + { + sXML.append(XMLHelper.convertSimpleObjectToXML(sProp, aVal, nPrettyTabs)); + continue; + } + + // no! + // is it a list value? + if (aVal instanceof java.util.Vector) + { + java.util.Vector lVal = (java.util.Vector)aVal; + sXML.append(XMLHelper.convertListToXML(sProp, lVal, nPrettyTabs)); + continue; + } + + // its a localized value? + if (aVal instanceof java.util.HashMap) + { + java.util.HashMap lVal = (java.util.HashMap)aVal; + sXML.append(XMLHelper.convertLocalizedValueToXML(sProp, lVal, nPrettyTabs)); + continue; + } + + // unknown type! + java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256); + sMsg.append("unsupported object type detected."); + sMsg.append("\ttype ? : \""+sProp+"\" = "+aVal); + sMsg.append("\tprop set: \""+aPropSet ); + throw new java.lang.Exception(sMsg.toString()); + } + + return sXML.toString(); + } + + public static java.lang.String encodeHTMLSigns(java.lang.String sValue) + { + java.lang.StringBuffer sSource = new java.lang.StringBuffer(sValue); + java.lang.StringBuffer sDestination = new java.lang.StringBuffer(1000 ); + + for (int i=0; i \""+sReturn+"\""); + + return sReturn; + } + + //___________________________________________ + + /** return a xml representation of an atomic property. + * + * Atomic property types are e.g. Integer, Boolean, String. + * + * @param sName + * the name of the property. + + * @param aValue + * the value of the property. + * + * @param nPrettyTabs + * count of tab signs for pretty format the xml code :-) + * + * @return [java.lang.String] + * the xml string representation. + * + * @throws [java.lang.Exception] + * if anything during convertion fill fail. + */ + private static java.lang.String convertSimpleObjectToXML(java.lang.String sName , + java.lang.Object aValue , + int nPrettyTabs) + throws java.lang.Exception + { + java.lang.StringBuffer sXML = new java.lang.StringBuffer(256); + for (int t=0; t"); + sXML.append(""+aValue.toString()+""); + sXML.append("\n"); + } + else + if (aValue instanceof java.lang.Boolean) + { + sXML.append(""); + sXML.append(""+aValue.toString()+""); + sXML.append("\n"); + } + else + if (aValue instanceof java.lang.String) + { + sXML.append("\n"); + else + { + sXML.append(">"+sValue+""); + sXML.append("\n"); + } + } + else + { + System.err.println("name = "+sName); + System.err.println("value = "+aValue); + // ! can be used outside to detect - that it was not a simple type :-) + throw new java.lang.Exception("not an atomic type."); + } + + return sXML.toString(); + } + + //___________________________________________ + + /** return a xml representation of a string-list property. + * + * @param sName + * the name of the property. + + * @param aValue + * the value of the property. + * + * @param nPrettyTabs + * count of tab signs for pretty format the xml code :-) + * + * @return [java.lang.String] + * the xml string representation. + * + * @throws [java.lang.Exception] + * if anything during convertion fill fail. + */ + private static java.lang.String convertListToXML(java.lang.String sName , + java.util.Vector aValue , + int nPrettyTabs) + throws java.lang.Exception + { + java.lang.StringBuffer sXML = new java.lang.StringBuffer(256); + + for (int t=0; t\n"); + return sXML.toString(); + } + + // step over all list items and add it to a string buffer + // Every item will be separated by a default separator "\n" first. + // Because "\n" is not a valid separator at all and can`t occure inside + // our list items. During we step over all items, we check if our current separator + // (we use a list of possible ones!) clash with an item. + // If it clash - we step to the next possible separator. + // If our list of possible separator values runs out of range we throw + // an exception :-) Its better then generating of wrong values + // If we found a valid seperator - we use it to replace our "\n" place holder + // at the end of the following loop ... + + int d = 0; + java.lang.StringBuffer sValBuff = new java.lang.StringBuffer(256); + for (int i=0; i= DELIMS.length) + throw new java.lang.Exception("No valid separator found for a string list item."); + if (sValue.length() < 1 && DELIMS[d].equals(" ")) + { + ++d; + continue; + } + if (sValue.indexOf(DELIMS[d]) != -1) + { + ++d; + continue; + } + break; + } + } + + // replace default separator with right one + System.out.println("TODO: must be adapted to java 1.3 :-("); + System.exit(-1); +//TODO_JAVA java.lang.String sListVal = sValBuff.toString().replaceAll("\n", DELIMS[d]); + java.lang.String sListVal = null; + + sXML.append(""); + if (d == DEFAULT_SEPARATOR) + sXML.append(""); + else + sXML.append(""); + sXML.append(sListVal); + sXML.append(""); + sXML.append("\n"); + + return sXML.toString(); + } + + //___________________________________________ + + /** return a xml representation of a localized property. + * + * @param sName + * the name of the property. + + * @param aValue + * the value of the property. + * + * @param nPrettyTabs + * count of tab signs for pretty format the xml code :-) + * + * @return [java.lang.String] + * the xml string representation. + * + * @throws [java.lang.Exception] + * if anything during convertion fill fail. + */ + private static java.lang.String convertLocalizedValueToXML(java.lang.String sName , + java.util.HashMap aValue , + int nPrettyTabs) + throws java.lang.Exception + { + java.lang.StringBuffer sXML = new java.lang.StringBuffer(256); + + int c = aValue.size(); + if (c < 1) + throw new java.lang.Exception("Cant detect type of localized values. Because the given list is empty."); + + for (int t=0; t\n"); + java.util.Iterator it = aValue.keySet().iterator(); +// boolean bTypeKnown = false; + while(it.hasNext()) + { + java.lang.String sLocale = (java.lang.String)it.next(); + java.lang.Object aLocalizedValue = aValue.get(sLocale); +/* + if (!bTypeKnown) + { + bTypeKnown = true; + if (aLocalizedValue instanceof java.lang.Integer) + sXML.append(" "+XMLATTRIB_OOR_TYPE+"=\""+XMLTYPE_INTEGER+"\">\n"); + else + if (aLocalizedValue instanceof java.lang.Boolean) + sXML.append(" "+XMLATTRIB_OOR_TYPE+"=\""+XMLTYPE_BOOLEAN+"\">\n"); + else + if (aLocalizedValue instanceof java.lang.String) + sXML.append(" "+XMLATTRIB_OOR_TYPE+"=\""+XMLTYPE_STRING+"\">\n"); + else + throw new java.lang.Exception("Unsupported type for localized value detected."); + } +*/ + java.lang.String sLocValue = aLocalizedValue.toString(); + java.lang.String sValue = encodeHTMLSigns(sLocValue); + + for (int t=0; t"+sValue+"\n"); + } + --nPrettyTabs; + for (int t=0; t\n"); + + return sXML.toString(); + } + + //___________________________________________ + + /** returns the value of an attribute of the given node. + * + * If the given node represent an lement node, may it supports some attributes. + * Then this method search for an attribute with the specified name and return it's value. + * If nothing could be found ... or the given node isn't a suitable node ... it returns null. + * + * @param aNode + * the node, which should be analyzed. + * + * @param sAttrib + * name of the attribute, which should be searched. + * + * @return The value of the specified attribute if it could be found at the given node. + * Can be null if node doesn't support attributes or the searched one does not exist there. + */ + public static java.lang.String extractNodeAttribByName(org.w3c.dom.Node aNode , + java.lang.String sAttrib) + throws java.lang.Exception + { + // We can get valid attributes for element nodes only! + if (aNode.getNodeType() != org.w3c.dom.Node.ELEMENT_NODE) + { +// System.err.println("not an element node"); + return null; + } + + // may it supports attributes in general ... but doesn't have anyone realy. + org.w3c.dom.NamedNodeMap lAttribs = aNode.getAttributes(); + if (lAttribs==null) + { +// System.err.println("no attributes at all"); + return null; + } + + // step over the attribute list and search for the requested one + for (int i=0; i\n"); + sHeader.append("\n"); + } + else + { + sHeader.append("\n\n"); + sHeader.append("\n"); + } + + return sHeader.toString(); + } + + public static java.lang.String generateFooter() + { + return "\n"; + } +} diff --git a/transex3/source/filter/utils/makefile.mk b/transex3/source/filter/utils/makefile.mk new file mode 100644 index 000000000000..d41d8ba9a825 --- /dev/null +++ b/transex3/source/filter/utils/makefile.mk @@ -0,0 +1,57 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.9.98.2 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ = ..$/..$/.. +TARGET = FCFGUtils +PRJNAME = filter +PACKAGE = com$/sun$/star$/filter$/config$/tools$/utils + +# --- Settings ----------------------------------------------------- + +.INCLUDE: settings.mk + +#----- compile .java files ----------------------------------------- + + +JAVACLASSFILES = \ + $(CLASSDIR)$/$(PACKAGE)$/AnalyzeStartupLog.class \ + $(CLASSDIR)$/$(PACKAGE)$/ConfigHelper.class \ + $(CLASSDIR)$/$(PACKAGE)$/Logger.class \ + $(CLASSDIR)$/$(PACKAGE)$/FileHelper.class \ + $(CLASSDIR)$/$(PACKAGE)$/MalformedCommandLineException.class \ + $(CLASSDIR)$/$(PACKAGE)$/Cache.class \ + $(CLASSDIR)$/$(PACKAGE)$/XMLHelper.class + +MAXLINELENGTH = 100000 + +# --- targets ----------------------------------------------------- + +.INCLUDE : target.mk diff --git a/transex3/source/help/HelpCompiler.cxx b/transex3/source/help/HelpCompiler.cxx new file mode 100644 index 000000000000..5001d0907972 --- /dev/null +++ b/transex3/source/help/HelpCompiler.cxx @@ -0,0 +1,593 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: HelpCompiler.cxx,v $ + * $Revision: 1.9 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + + +#include "HelpCompiler.hxx" +#include +#include +#include +#include +#include +#include +#include +#ifdef __MINGW32__ +#include +#include +#endif +#include + +static void impl_sleep( sal_uInt32 nSec ) +{ + TimeValue aTime; + aTime.Seconds = nSec; + aTime.Nanosec = 0; + + osl::Thread::wait( aTime ); +} + +HelpCompiler::HelpCompiler(StreamTable &in_streamTable, const fs::path &in_inputFile, + const fs::path &in_src, const fs::path &in_resEmbStylesheet, + const std::string &in_module, const std::string &in_lang, bool in_bExtensionMode) + : streamTable(in_streamTable), inputFile(in_inputFile), + src(in_src), module(in_module), lang(in_lang), resEmbStylesheet(in_resEmbStylesheet), + bExtensionMode( in_bExtensionMode ) +{ + xmlKeepBlanksDefaultValue = 0; +} + +xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath) +{ + static const char *params[4 + 1]; + static xsltStylesheetPtr cur = NULL; + + xmlDocPtr res; + if( bExtensionMode ) + { + res = xmlParseFile(filePath.native_file_string().c_str()); + if( !res ){ + impl_sleep( 3 ); + res = xmlParseFile(filePath.native_file_string().c_str()); + } + } + else + { + if (!cur) + { + static std::string fsroot('\'' + src.toUTF8() + '\''); + static std::string esclang('\'' + lang + '\''); + + xmlSubstituteEntitiesDefault(1); + xmlLoadExtDtdDefaultValue = 1; + cur = xsltParseStylesheetFile((const xmlChar *)resEmbStylesheet.native_file_string().c_str()); + + int nbparams = 0; + params[nbparams++] = "Language"; + params[nbparams++] = esclang.c_str(); + params[nbparams++] = "fsroot"; + params[nbparams++] = fsroot.c_str(); + params[nbparams] = NULL; + } + xmlDocPtr doc = xmlParseFile(filePath.native_file_string().c_str()); + if( !doc ) + { + impl_sleep( 3 ); + doc = xmlParseFile(filePath.native_file_string().c_str()); + } + + //???res = xmlParseFile(filePath.native_file_string().c_str()); + + res = xsltApplyStylesheet(cur, doc, params); + xmlFreeDoc(doc); + } + return res; +} + +HashSet HelpCompiler::switchFind(xmlDocPtr doc) +{ + HashSet hs; + xmlChar *xpath = (xmlChar*)"//switchinline"; + + xmlXPathContextPtr context = xmlXPathNewContext(doc); + xmlXPathObjectPtr result = xmlXPathEvalExpression(xpath, context); + xmlXPathFreeContext(context); + if (result) + { + xmlNodeSetPtr nodeset = result->nodesetval; + for (int i = 0; i < nodeset->nodeNr; i++) + { + xmlNodePtr el = nodeset->nodeTab[i]; + xmlChar *select = xmlGetProp(el, (xmlChar*)"select"); + if (select) + { + if (!strcmp((const char*)select, "appl")) + { + xmlNodePtr n1 = el->xmlChildrenNode; + while (n1) + { + if ((!xmlStrcmp(n1->name, (const xmlChar*)"caseinline"))) + { + xmlChar *appl = xmlGetProp(n1, (xmlChar*)"select"); + hs.push_back(std::string((const char*)appl)); + xmlFree(appl); + } + else if ((!xmlStrcmp(n1->name, (const xmlChar*)"defaultinline"))) + hs.push_back(std::string("DEFAULT")); + n1 = n1->next; + } + } + xmlFree(select); + } + } + xmlXPathFreeObject(result); + } + hs.push_back(std::string("DEFAULT")); + return hs; +} + +// returns a node representing the whole stuff compiled for the current +// application. +xmlNodePtr HelpCompiler::clone(xmlNodePtr node, const std::string& appl) +{ + xmlNodePtr parent = xmlCopyNode(node, 2); + xmlNodePtr n = node->xmlChildrenNode; + while (n != NULL) + { + bool isappl = false; + if ( (!strcmp((const char*)n->name, "switchinline")) || + (!strcmp((const char*)n->name, "switch")) ) + { + xmlChar *select = xmlGetProp(n, (xmlChar*)"select"); + if (select) + { + if (!strcmp((const char*)select, "appl")) + isappl = true; + xmlFree(select); + } + } + if (isappl) + { + xmlNodePtr caseNode = n->xmlChildrenNode; + if (appl == "DEFAULT") + { + while (caseNode) + { + if (!strcmp((const char*)caseNode->name, "defaultinline")) + { + xmlNodePtr cnl = caseNode->xmlChildrenNode; + while (cnl) + { + xmlAddChild(parent, clone(cnl, appl)); + cnl = cnl->next; + } + break; + } + caseNode = caseNode->next; + } + } + else + { + while (caseNode) + { + isappl=false; + if (!strcmp((const char*)caseNode->name, "caseinline")) + { + xmlChar *select = xmlGetProp(n, (xmlChar*)"select"); + if (select) + { + if (!strcmp((const char*)select, appl.c_str())) + isappl = true; + xmlFree(select); + } + if (isappl) + { + xmlNodePtr cnl = caseNode->xmlChildrenNode; + while (cnl) + { + xmlAddChild(parent, clone(cnl, appl)); + cnl = cnl->next; + } + break; + } + + } + caseNode = caseNode->next; + } + } + + } + else + xmlAddChild(parent, clone(n, appl)); + + n = n->next; + } + return parent; +} + +class myparser +{ +public: + std::string documentId; + std::string fileName; + std::string title; + HashSet *hidlist; + Hashtable *keywords; + Stringtable *helptexts; +private: + HashSet extendedHelpText; +public: + myparser(const std::string &indocumentId, const std::string &infileName, + const std::string &intitle) : documentId(indocumentId), fileName(infileName), + title(intitle) + { + hidlist = new HashSet; + keywords = new Hashtable; + helptexts = new Stringtable; + } + void traverse( xmlNodePtr parentNode ); +private: + std::string dump(xmlNodePtr node); +}; + +std::string myparser::dump(xmlNodePtr node) +{ + std::string app; + if (node->xmlChildrenNode) + { + xmlNodePtr list = node->xmlChildrenNode; + while (list) + { + app += dump(list); + list = list->next; + } + } + if (xmlNodeIsText(node)) + { + xmlChar *pContent = xmlNodeGetContent(node); + app += std::string((const char*)pContent); + xmlFree(pContent); + // std::cout << app << std::endl; + } + return app; +} + +void trim(std::string& str) +{ + std::string::size_type pos = str.find_last_not_of(' '); + if(pos != std::string::npos) + { + str.erase(pos + 1); + pos = str.find_first_not_of(' '); + if(pos != std::string::npos) + str.erase(0, pos); + } + else + str.erase(str.begin(), str.end()); +} + +void myparser::traverse( xmlNodePtr parentNode ) +{ + // traverse all nodes that belong to the parent + xmlNodePtr test ; + for (test = parentNode->xmlChildrenNode; test; test = test->next) + { + if (fileName.empty() && !strcmp((const char*)test->name, "filename")) + { + xmlNodePtr node = test->xmlChildrenNode; + if (xmlNodeIsText(node)) + { + xmlChar *pContent = xmlNodeGetContent(node); + fileName = std::string((const char*)pContent); + xmlFree(pContent); + } + } + else if (title.empty() && !strcmp((const char*)test->name, "title")) + { + title = dump(test); + if (title.empty()) + title = ""; + } + else if (!strcmp((const char*)test->name, "bookmark")) + { + xmlChar *branchxml = xmlGetProp(test, (const xmlChar*)"branch"); + xmlChar *idxml = xmlGetProp(test, (const xmlChar*)"id"); + std::string branch((const char*)branchxml); + std::string anchor((const char*)idxml); + xmlFree (branchxml); + xmlFree (idxml); + + std::string hid; + + if (branch.find("hid") == 0) + { + size_t index = branch.find('/'); + if (index != std::string::npos) + { + hid = branch.substr(1 + index); + // one shall serve as a documentId + if (documentId.empty()) + documentId = hid; + extendedHelpText.push_back(hid); + std::string foo = anchor.empty() ? hid : hid + "#" + anchor; + HCDBG(std::cerr << "hid pushback" << foo << std::endl); + hidlist->push_back( anchor.empty() ? hid : hid + "#" + anchor); + } + else + continue; + } + else if (branch.compare("index") == 0) + { + LinkedList ll; + + for (xmlNodePtr nd = test->xmlChildrenNode; nd; nd = nd->next) + { + if (strcmp((const char*)nd->name, "bookmark_value")) + continue; + + std::string embedded; + xmlChar *embeddedxml = xmlGetProp(nd, (const xmlChar*)"embedded"); + if (embeddedxml) + { + embedded = std::string((const char*)embeddedxml); + xmlFree (embeddedxml); + std::transform (embedded.begin(), embedded.end(), + embedded.begin(), tolower); + } + + bool isEmbedded = !embedded.empty() && embedded.compare("true") == 0; + if (isEmbedded) + continue; + + std::string keyword = dump(nd); + size_t keywordSem = keyword.find(';'); + if (keywordSem != std::string::npos) + { + std::string tmppre = + keyword.substr(0,keywordSem); + trim(tmppre); + std::string tmppos = + keyword.substr(1+keywordSem); + trim(tmppos); + keyword = tmppre + ";" + tmppos; + } + ll.push_back(keyword); + } + if (!ll.empty()) + (*keywords)[anchor] = ll; + } + else if (branch.compare("contents") == 0) + { + // currently not used + } + } + else if (!strcmp((const char*)test->name, "ahelp")) + { + std::string text = dump(test); + trim(text); + std::string name; + + HashSet::const_iterator aEnd = extendedHelpText.end(); + for (HashSet::const_iterator iter = extendedHelpText.begin(); iter != aEnd; + ++iter) + { + name = *iter; + (*helptexts)[name] = text; + } + extendedHelpText.clear(); + } + + // traverse children + traverse(test); + } +} + +bool HelpCompiler::compile( void ) throw( HelpProcessingException ) +{ + // we now have the jaroutputstream, which will contain the document. + // now determine the document as a dom tree in variable docResolved + + xmlDocPtr docResolvedOrg = getSourceDocument(inputFile); + + // now add path to the document + // resolve the dom + if (!docResolvedOrg) + { + impl_sleep( 3 ); + docResolvedOrg = getSourceDocument(inputFile); + if( !docResolvedOrg ) + { + std::stringstream aStrStream; + aStrStream << "ERROR: file not existing: " << inputFile.native_file_string().c_str() << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + } + + // now find all applications for which one has to compile + std::string documentId; + std::string fileName; + std::string title; + // returns all applications for which one has to compile + HashSet applications = switchFind(docResolvedOrg); + + HashSet::const_iterator aEnd = applications.end(); + for (HashSet::const_iterator aI = applications.begin(); aI != aEnd; ++aI) + { + std::string appl = *aI; + std::string modulename = appl; + if (modulename[0] == 'S') + { + modulename = modulename.substr(1); + std::transform(modulename.begin(), modulename.end(), modulename.begin(), tolower); + } + if (modulename != "DEFAULT" && modulename != module) + continue; + + // returns a clone of the document with swich-cases resolved + xmlNodePtr docResolved = clone(xmlDocGetRootElement(docResolvedOrg), appl); + myparser aparser(documentId, fileName, title); + aparser.traverse(docResolved); + + documentId = aparser.documentId; + fileName = aparser.fileName; + title = aparser.title; + + HCDBG(std::cerr << documentId << " : " << fileName << " : " << title << std::endl); + + xmlDocPtr docResolvedDoc = xmlCopyDoc(docResolvedOrg, false); + xmlDocSetRootElement(docResolvedDoc, docResolved); + + if (modulename == "DEFAULT") + { + streamTable.dropdefault(); + streamTable.default_doc = docResolvedDoc; + streamTable.default_hidlist = aparser.hidlist; + streamTable.default_helptexts = aparser.helptexts; + streamTable.default_keywords = aparser.keywords; + } + else if (modulename == module) + { + streamTable.dropappl(); + streamTable.appl_doc = docResolvedDoc; + streamTable.appl_hidlist = aparser.hidlist; + streamTable.appl_helptexts = aparser.helptexts; + streamTable.appl_keywords = aparser.keywords; + } + else + { + std::stringstream aStrStream; + aStrStream << "ERROR: Found unexpected module name \"" << modulename + << "\" in file" << src.native_file_string().c_str() << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + } // end iteration over all applications + + streamTable.document_id = documentId; + streamTable.document_path = fileName; + streamTable.document_title = title; + std::string actMod = module; + if ( !bExtensionMode && !fileName.empty()) + { + if (fileName.find("/text/") == 0) + { + int len = strlen("/text/"); + actMod = fileName.substr(len); + actMod = actMod.substr(0, actMod.find('/')); + } + } + streamTable.document_module = actMod; + + xmlFreeDoc(docResolvedOrg); + return true; +} + +namespace fs +{ + rtl_TextEncoding getThreadTextEncoding( void ) + { + static bool bNeedsInit = true; + static rtl_TextEncoding nThreadTextEncoding; + if( bNeedsInit ) + { + bNeedsInit = false; + nThreadTextEncoding = osl_getThreadTextEncoding(); + } + return nThreadTextEncoding; + } + + void create_directory(const fs::path indexDirName) + { + HCDBG( + std::cerr << "creating " << + rtl::OUStringToOString(indexDirName.data, RTL_TEXTENCODING_UTF8).getStr() + << std::endl + ); + osl::Directory::createPath(indexDirName.data); + } + + void rename(const fs::path &src, const fs::path &dest) + { + osl::File::move(src.data, dest.data); + } + + void copy(const fs::path &src, const fs::path &dest) + { + osl::File::copy(src.data, dest.data); + } + + bool exists(const fs::path &in) + { + osl::File tmp(in.data); + return (tmp.open(osl_File_OpenFlag_Read) == osl::FileBase::E_None); + } + + void remove(const fs::path &in) + { + osl::File::remove(in.data); + } + + void removeRecursive(rtl::OUString const& _suDirURL) + { + { + osl::Directory aDir(_suDirURL); + aDir.open(); + if (aDir.isOpen()) + { + osl::DirectoryItem aItem; + osl::FileStatus aStatus(osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_Attributes); + while (aDir.getNextItem(aItem) == ::osl::FileBase::E_None) + { + if (osl::FileBase::E_None == aItem.getFileStatus(aStatus) && + aStatus.isValid(osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_Attributes)) + { + rtl::OUString suFilename = aStatus.getFileName(); + rtl::OUString suFullFileURL; + suFullFileURL += _suDirURL; + suFullFileURL += rtl::OUString::createFromAscii("/"); + suFullFileURL += suFilename; + + if (aStatus.getFileType() == osl::FileStatus::Directory) + removeRecursive(suFullFileURL); + else + osl::File::remove(suFullFileURL); + } + } + aDir.close(); + } + } + osl::Directory::remove(_suDirURL); + } + + void remove_all(const fs::path &in) + { + removeRecursive(in.data); + } +} + +/* vi:set tabstop=4 shiftwidth=4 expandtab: */ diff --git a/transex3/source/help/HelpCompiler.hxx b/transex3/source/help/HelpCompiler.hxx new file mode 100644 index 000000000000..7ffb096bd635 --- /dev/null +++ b/transex3/source/help/HelpCompiler.hxx @@ -0,0 +1,320 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: HelpCompiler.hxx,v $ + * $Revision: 1.8 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef HELPCOMPILER_HXX +#define HELPCOMPILER_HXX + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef SYSTEM_DB +#include +#else +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#define EMULATEORIGINAL 1 + +#ifdef CMCDEBUG + #define HCDBG(foo) do { if (1) foo; } while(0) +#else + #define HCDBG(foo) do { if (0) foo; } while(0) +#endif + +namespace fs +{ + rtl_TextEncoding getThreadTextEncoding( void ); + + enum convert { native }; + class path + { + public: + ::rtl::OUString data; + public: + path() {} + path(const path &rOther) : data(rOther.data) {} + path(const std::string &in, convert) + { + rtl::OUString sWorkingDir; + osl_getProcessWorkingDir(&sWorkingDir.pData); + + rtl::OString tmp(in.c_str()); + rtl::OUString ustrSystemPath(rtl::OStringToOUString(tmp, getThreadTextEncoding())); + osl::File::getFileURLFromSystemPath(ustrSystemPath, data); + osl::File::getAbsoluteFileURL(sWorkingDir, data, data); + } + path(const std::string &FileURL) + { + rtl::OString tmp(FileURL.c_str()); + data = rtl::OStringToOUString(tmp, getThreadTextEncoding()); + } + std::string native_file_string() const + { + ::rtl::OUString ustrSystemPath; + osl::File::getSystemPathFromFileURL(data, ustrSystemPath); + rtl::OString tmp(rtl::OUStringToOString(ustrSystemPath, getThreadTextEncoding())); + HCDBG(std::cerr << "native_file_string is " << tmp.getStr() << std::endl); + return std::string(tmp.getStr()); + } + std::string native_directory_string() const { return native_file_string(); } + std::string toUTF8() const + { + rtl::OString tmp(rtl::OUStringToOString(data, RTL_TEXTENCODING_UTF8)); + return std::string(tmp.getStr()); + } + bool empty() const { return data.getLength() == 0; } + path operator/(const std::string &in) const + { + path ret(*this); + HCDBG(std::cerr << "orig was " << + rtl::OUStringToOString(ret.data, RTL_TEXTENCODING_UTF8).getStr() << std::endl); + rtl::OString tmp(in.c_str()); + rtl::OUString ustrSystemPath(rtl::OStringToOUString(tmp, getThreadTextEncoding())); + ret.data += rtl::OUString(sal_Unicode('/')); + ret.data += ustrSystemPath; + HCDBG(std::cerr << "final is " << + rtl::OUStringToOString(ret.data, RTL_TEXTENCODING_UTF8).getStr() << std::endl); + return ret; + } + void append(const char *in) + { + rtl::OString tmp(in); + rtl::OUString ustrSystemPath(rtl::OStringToOUString(tmp, getThreadTextEncoding())); + data = data + ustrSystemPath; + } + void append(const std::string &in) { append(in.c_str()); } + }; + + void create_directory(const fs::path indexDirName); + void rename(const fs::path &src, const fs::path &dest); + void copy(const fs::path &src, const fs::path &dest); + bool exists(const fs::path &in); + void remove_all(const fs::path &in); + void remove(const fs::path &in); +} + +struct joaat_hash +{ + size_t operator()(const std::string &str) const + { + size_t hash = 0; + const char *key = str.data(); + for (size_t i = 0; i < str.size(); i++) + { + hash += key[i]; + hash += (hash << 10); + hash ^= (hash >> 6); + } + hash += (hash << 3); + hash ^= (hash >> 11); + hash += (hash << 15); + return hash; + } +}; + +#define get16bits(d) ((((sal_uInt32)(((const sal_uInt8 *)(d))[1])) << 8)\ + +(sal_uInt32)(((const sal_uInt8 *)(d))[0]) ) + +struct SuperFastHash +{ + size_t operator()(const std::string &str) const + { + const char * data = str.data(); + int len = str.size(); + size_t hash = len, tmp; + if (len <= 0 || data == NULL) return 0; + + int rem = len & 3; + len >>= 2; + + /* Main loop */ + for (;len > 0; len--) + { + hash += get16bits (data); + tmp = (get16bits (data+2) << 11) ^ hash; + hash = (hash << 16) ^ tmp; + data += 2*sizeof (sal_uInt16); + hash += hash >> 11; + } + + /* Handle end cases */ + switch (rem) + { + case 3: hash += get16bits (data); + hash ^= hash << 16; + hash ^= data[sizeof (sal_uInt16)] << 18; + hash += hash >> 11; + break; + case 2: hash += get16bits (data); + hash ^= hash << 11; + hash += hash >> 17; + break; + case 1: hash += *data; + hash ^= hash << 10; + hash += hash >> 1; + } + + /* Force "avalanching" of final 127 bits */ + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + + return hash; + } +}; + +#define pref_hash joaat_hash + +typedef std::hash_map Stringtable; +typedef std::list LinkedList; +typedef std::vector HashSet; + +typedef std::hash_map Hashtable; + +class StreamTable +{ +public: + std::string document_id; + std::string document_path; + std::string document_module; + std::string document_title; + + HashSet *appl_hidlist; + Hashtable *appl_keywords; + Stringtable *appl_helptexts; + xmlDocPtr appl_doc; + + HashSet *default_hidlist; + Hashtable *default_keywords; + Stringtable *default_helptexts; + xmlDocPtr default_doc; + + StreamTable() : + appl_hidlist(NULL), appl_keywords(NULL), appl_helptexts(NULL), appl_doc(NULL), + default_hidlist(NULL), default_keywords(NULL), default_helptexts(NULL), default_doc(NULL) + {} + void dropdefault() + { + delete default_hidlist; + delete default_keywords; + delete default_helptexts; + if (default_doc) xmlFreeDoc(default_doc); + } + void dropappl() + { + delete appl_hidlist; + delete appl_keywords; + delete appl_helptexts; + if (appl_doc) xmlFreeDoc(appl_doc); + } + ~StreamTable() + { + dropappl(); + dropdefault(); + } +}; + +struct HelpProcessingException +{ + HelpProcessingErrorClass m_eErrorClass; + std::string m_aErrorMsg; + std::string m_aXMLParsingFile; + int m_nXMLParsingLine; + + HelpProcessingException( HelpProcessingErrorClass eErrorClass, const std::string& aErrorMsg ) + : m_eErrorClass( eErrorClass ) + , m_aErrorMsg( aErrorMsg ) + {} + HelpProcessingException( const std::string& aErrorMsg, const std::string& aXMLParsingFile, int nXMLParsingLine ) + : m_eErrorClass( HELPPROCESSING_XMLPARSING_ERROR ) + , m_aErrorMsg( aErrorMsg ) + , m_aXMLParsingFile( aXMLParsingFile ) + , m_nXMLParsingLine( nXMLParsingLine ) + {} +}; + +class HelpCompiler +{ +public: + HelpCompiler(StreamTable &streamTable, + const fs::path &in_inputFile, + const fs::path &in_src, + const fs::path &in_resEmbStylesheet, + const std::string &in_module, + const std::string &in_lang, + bool in_bExtensionMode); + bool compile( void ) throw (HelpProcessingException); + void addEntryToJarFile(const std::string &prefix, + const std::string &entryName, const std::string &bytesToAdd); + void addEntryToJarFile(const std::string &prefix, + const std::string &entryName, const HashSet &bytesToAdd); + void addEntryToJarFile(const std::string &prefix, + const std::string &entryName, const Stringtable &bytesToAdd); + void addEntryToJarFile(const std::string &prefix, + const std::string &entryName, const Hashtable &bytesToAdd); +private: + xmlDocPtr getSourceDocument(const fs::path &filePath); + HashSet switchFind(xmlDocPtr doc); + xmlNodePtr clone(xmlNodePtr node, const std::string& appl); + StreamTable &streamTable; + const fs::path inputFile, src; + const std::string module, lang; + const fs::path resEmbStylesheet; + bool bExtensionMode; +}; + +#endif + +/* vi:set tabstop=4 shiftwidth=4 expandtab: */ diff --git a/transex3/source/help/HelpFileDocument.java b/transex3/source/help/HelpFileDocument.java new file mode 100644 index 000000000000..2212db27f251 --- /dev/null +++ b/transex3/source/help/HelpFileDocument.java @@ -0,0 +1,89 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: HelpFileDocument.java,v $ + * $Revision: 1.2 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package com.sun.star.help; + +import java.io.File; +import java.io.Reader; +import java.io.FileInputStream; +import java.io.InputStreamReader; +//import java.io.FileReader; +import java.io.StringReader; + +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; + +/** Lucene Document for help files */ +public class HelpFileDocument +{ + /** Creates reader for UTF-8 files + */ + private static Reader getReaderForFile( File aFile ) + throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException { + Reader aReader; + if( aFile != null ) { + FileInputStream fis = new FileInputStream( aFile ); + aReader = new InputStreamReader( fis, "UTF-8" ); + } + else { + aReader = new StringReader( "" ); + } + return aReader; + } + + /** Makes a document for a File. + */ + public static Document Document( String aModule, File aCaptionFile, File aContentFile ) + throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException { + Document doc = new Document(); + + // Add the path of the file as a field named "path". Use a field that is + // indexed (i.e. searchable), but don't tokenize the field into words. + File aFile = aCaptionFile != null ? aCaptionFile : aContentFile; + if( aFile != null ) + { + String aPath = "#HLP#" + aModule + "/" + aFile.getName(); + doc.add(new Field("path", aPath, Field.Store.YES, Field.Index.UN_TOKENIZED)); + } + + // Add the caption of the file to a field named "caption". Specify a Reader, + // so that the text of the file is tokenized and indexed, but not stored. + doc.add( new Field( "caption", getReaderForFile( aCaptionFile ) ) ); + + // Add the contents of the file to a field named "content". Specify a Reader, + // so that the text of the file is tokenized and indexed, but not stored. + doc.add( new Field( "content", getReaderForFile( aContentFile ) ) ); + + // return the document + return doc; + } + + private HelpFileDocument() {} +} diff --git a/transex3/source/help/HelpIndexerTool.java b/transex3/source/help/HelpIndexerTool.java new file mode 100644 index 000000000000..6bf22d1ac344 --- /dev/null +++ b/transex3/source/help/HelpIndexerTool.java @@ -0,0 +1,372 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: HelpIndexer.java,v $ + * $Revision: 1.21 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +package com.sun.star.help; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; +import java.util.zip.CRC32; +import org.apache.lucene.analysis.standard.StandardAnalyzer; +import org.apache.lucene.analysis.cjk.CJKAnalyzer; +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.index.IndexWriter; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Date; + +public class HelpIndexerTool +{ + public HelpIndexerTool() + { + } + + + /** + * @param args the command line arguments + */ + public static void main( String[] args ) + { + boolean bExtensionMode = false; + mainImpl( args, bExtensionMode ); + } + + public static void mainImpl( String[] args, boolean bExtensionMode ) + { + String aDirToZipStr = ""; + String aSrcDirStr = ""; + String aLanguageStr = ""; + String aModule = ""; + String aTargetZipFileStr = ""; + String aCfsName = ""; + + // Scan arguments + boolean bLang = false; + boolean bMod = false; + boolean bZipDir = false; + boolean bSrcDir = false; + boolean bOutput = false; + boolean bCfsName = false; + + int nArgCount = args.length; + for( int i = 0 ; i < nArgCount ; i++ ) + { + if( "-lang".equals(args[i]) ) + { + if( i + 1 < nArgCount ) + { + aLanguageStr = args[i + 1]; + bLang = true; + } + i++; + } + else if( "-mod".equals(args[i]) ) + { + if( i + 1 < nArgCount ) + { + aModule = args[i + 1]; + bMod = true; + } + i++; + } + else if( "-zipdir".equals(args[i]) ) + { + if( i + 1 < nArgCount ) + { + aDirToZipStr = args[i + 1]; + bZipDir = true; + } + i++; + } + else if( "-srcdir".equals(args[i]) ) + { + if( i + 1 < nArgCount ) + { + aSrcDirStr = args[i + 1]; + bSrcDir = true; + } + i++; + } + else if( "-o".equals(args[i]) ) + { + if( i + 1 < nArgCount ) + { + aTargetZipFileStr = args[i + 1]; + bOutput = true; + } + i++; + } + else if( "-checkcfsname".equals(args[i]) ) + { + if( i + 1 < nArgCount ) + { + aCfsName = args[i + 1] + ".cfs"; + bCfsName = true; + } + i++; + } + } + + if( !bLang || !bMod || !bZipDir || (!bOutput && !bExtensionMode) ) + { + if( bExtensionMode ) + return; + + System.out.println("Usage: HelpIndexer -lang ISOLangCode -mod HelpModule -zipdir TempZipDir -o OutputZipFile"); + System.exit( -1 ); + } + + String aIndexDirName = aModule + ".idxl"; + File aIndexDir = new File( aDirToZipStr + File.separator + aIndexDirName ); + if( !bSrcDir ) + aSrcDirStr = aDirToZipStr; + File aCaptionFilesDir = new File( aSrcDirStr + File.separator + "caption" ); + File aContentFilesDir = new File( aSrcDirStr + File.separator + "content" ); + + try + { + Date start = new Date(); + Analyzer analyzer = aLanguageStr.equals("ja") ? (Analyzer)new CJKAnalyzer() : (Analyzer)new StandardAnalyzer(); + IndexWriter writer = new IndexWriter( aIndexDir, analyzer, true ); + if( !bExtensionMode ) + System.out.println( "Lucene: Indexing to directory '" + aIndexDir + "'..." ); + int nRet = indexDocs( writer, aModule, bExtensionMode, aCaptionFilesDir, aContentFilesDir ); + if( nRet != -1 ) + { + if( !bExtensionMode ) + { + System.out.println(); + System.out.println( "Optimizing ..." ); + } + writer.optimize(); + } + writer.close(); + + boolean bCfsFileOk = true; + if( bCfsName && !bExtensionMode && nRet != -1 ) + { + String aCompleteCfsFileName = aDirToZipStr + File.separator + aIndexDirName + File.separator + aCfsName; + File aCfsFile = new File( aCompleteCfsFileName ); + bCfsFileOk = aCfsFile.exists(); + System.out.println( "Checking cfs file " + aCfsName+ ": " + (bCfsFileOk ? "Found" : "Not found") ); + } + + if( bExtensionMode ) + { + if( !bSrcDir ) + { + deleteRecursively( aCaptionFilesDir ); + deleteRecursively( aContentFilesDir ); + } + } + else + { + if( nRet == -1 ) + deleteRecursively( aIndexDir ); + + if( bCfsFileOk ) + System.out.println( "Zipping ..." ); + File aDirToZipFile = new File( aDirToZipStr ); + createZipFile( aDirToZipFile, aTargetZipFileStr ); + deleteRecursively( aDirToZipFile ); + } + + if( !bCfsFileOk ) + { + System.out.println( "cfs file check failed, terminating..." ); + System.exit( -1 ); + } + + Date end = new Date(); + if( !bExtensionMode ) + System.out.println(end.getTime() - start.getTime() + " total milliseconds"); + } + catch (IOException e) + { + if( bExtensionMode ) + return; + + System.out.println(" caught a " + e.getClass() + + "\n with message: " + e.getMessage()); + System.exit( -1 ); + } + } + + private static int indexDocs(IndexWriter writer, String aModule, boolean bExtensionMode, + File aCaptionFilesDir, File aContentFilesDir) throws IOException + { + if( !aCaptionFilesDir.canRead() || !aCaptionFilesDir.isDirectory() ) + { + if( !bExtensionMode ) + System.out.println( "Not found: " + aCaptionFilesDir ); + return -1; + } + if( !aContentFilesDir.canRead() || !aContentFilesDir.isDirectory() ) + { + if( !bExtensionMode ) + System.out.println( "Not found: " + aContentFilesDir ); + return -1; + } + + String[] aCaptionFiles = aCaptionFilesDir.list(); + List aCaptionFilesList = Arrays.asList( aCaptionFiles ); + HashSet aCaptionFilesHashSet = new HashSet( aCaptionFilesList ); + + String[] aContentFiles = aContentFilesDir.list(); + List aContentFilesList = Arrays.asList( aContentFiles ); + HashSet aContentFilesHashSet = new HashSet( aContentFilesList ); + + // Loop over caption files and find corresponding content file + if( !bExtensionMode ) + System.out.println( "Indexing, adding files" ); + int nCaptionFilesLen = aCaptionFiles.length; + for( int i = 0 ; i < nCaptionFilesLen ; i++ ) + { + String aCaptionFileStr = aCaptionFiles[i]; + File aCaptionFile = new File( aCaptionFilesDir, aCaptionFileStr ); + File aContentFile = null; + if( aContentFilesHashSet.contains( aCaptionFileStr ) ) + aContentFile = new File( aContentFilesDir, aCaptionFileStr ); + + if( !bExtensionMode ) + System.out.print( "." ); + writer.addDocument( HelpFileDocument.Document( aModule, aCaptionFile, aContentFile ) ); + } + + // Loop over content files to find remaining files not mapped to caption files + int nContentFilesLen = aContentFiles.length; + for( int i = 0 ; i < nContentFilesLen ; i++ ) + { + String aContentFileStr = aContentFiles[i]; + if( !aCaptionFilesHashSet.contains( aContentFileStr ) ) + { + // Not already handled in caption files loop + File aCaptionFile = null; + File aContentFile = new File( aContentFilesDir, aContentFileStr ); + if( !bExtensionMode ) + System.out.print( "." ); + writer.addDocument( HelpFileDocument.Document( aModule, aCaptionFile, aContentFile ) ); + } + } + return 0; + } + + public static void createZipFile( File aDirToZip, String aTargetZipFileStr ) + throws FileNotFoundException, IOException + { + FileOutputStream fos = new FileOutputStream( aTargetZipFileStr ); + ZipOutputStream zos = new ZipOutputStream( fos ); + + File[] aChildrenFiles = aDirToZip.listFiles(); + int nFileCount = aChildrenFiles.length; + for( int i = 0 ; i < nFileCount ; i++ ) + addToZipRecursively( zos, aChildrenFiles[i], null ); + + zos.close(); + } + + public static void addToZipRecursively( ZipOutputStream zos, File aFile, String aBasePath ) + throws FileNotFoundException, IOException + { + if( aFile.isDirectory() ) + { + String aDirName = aFile.getName(); + if( aDirName.equalsIgnoreCase( "caption" ) || aDirName.equalsIgnoreCase( "content" ) ) + return; + + File[] aChildrenFiles = aFile.listFiles(); + String aNewBasePath = ""; + if( aBasePath != null ) + aNewBasePath += aBasePath + File.separator; + aNewBasePath += aDirName; + + int nFileCount = aChildrenFiles.length; + for( int i = 0 ; i < nFileCount ; i++ ) + addToZipRecursively( zos, aChildrenFiles[i], aNewBasePath ); + + return; + } + + // No directory + // read contents of file we are going to put in the zip + int fileLength = (int) aFile.length(); + FileInputStream fis = new FileInputStream( aFile ); + byte[] wholeFile = new byte[fileLength]; + int bytesRead = fis.read( wholeFile, 0, fileLength ); + fis.close(); + + String aFileName = aFile.getName(); + String aEntryName = ""; + if( aBasePath != null ) + aEntryName += aBasePath + "/"; + aEntryName += aFileName; + ZipEntry aZipEntry = new ZipEntry( aEntryName ); + aZipEntry.setTime( aFile.lastModified() ); + aZipEntry.setSize( fileLength ); + + int nMethod = ( aFileName.toLowerCase().endsWith( ".jar" ) ) + ? ZipEntry.STORED : ZipEntry.DEFLATED; + aZipEntry.setMethod( nMethod ); + + CRC32 tempCRC = new CRC32(); + tempCRC.update( wholeFile, 0, wholeFile.length ); + aZipEntry.setCrc( tempCRC.getValue() ); + + // write the contents into the zip element + zos.putNextEntry( aZipEntry ); + zos.write( wholeFile, 0, fileLength ); + zos.closeEntry(); + } + + static public boolean deleteRecursively( File aFile ) + { + if( aFile.isDirectory() ) + { + File[] aChildrenFiles = aFile.listFiles(); + int nFileCount = aChildrenFiles.length; + for( int i = 0 ; i < nFileCount ; i++ ) + { + File aChildrenFile = aChildrenFiles[i]; + boolean bSuccess = deleteRecursively( aChildrenFile ); + if( !bSuccess ) + return false; + } + } + + return aFile.delete(); + } +} + diff --git a/transex3/source/help/HelpLinker.cxx b/transex3/source/help/HelpLinker.cxx new file mode 100644 index 000000000000..7dfe4ee4a2a2 --- /dev/null +++ b/transex3/source/help/HelpLinker.cxx @@ -0,0 +1,1173 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: HelpLinker.cxx,v $ + * $Revision: 1.16 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "HelpCompiler.hxx" + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +#define DBHELP_ONLY + + +class IndexerPreProcessor +{ +private: + std::string m_aModuleName; + fs::path m_fsIndexBaseDir; + fs::path m_fsCaptionFilesDirName; + fs::path m_fsContentFilesDirName; + + xsltStylesheetPtr m_xsltStylesheetPtrCaption; + xsltStylesheetPtr m_xsltStylesheetPtrContent; + +public: + IndexerPreProcessor( const std::string& aModuleName, const fs::path& fsIndexBaseDir, + const fs::path& idxCaptionStylesheet, const fs::path& idxContentStylesheet ); + ~IndexerPreProcessor(); + + void processDocument( xmlDocPtr doc, const std::string& EncodedDocPath ); +}; + +IndexerPreProcessor::IndexerPreProcessor + ( const std::string& aModuleName, const fs::path& fsIndexBaseDir, + const fs::path& idxCaptionStylesheet, const fs::path& idxContentStylesheet ) + : m_aModuleName( aModuleName ) + , m_fsIndexBaseDir( fsIndexBaseDir ) +{ + m_fsCaptionFilesDirName = fsIndexBaseDir / "caption"; + fs::create_directory( m_fsCaptionFilesDirName ); + + m_fsContentFilesDirName = fsIndexBaseDir / "content"; + fs::create_directory( m_fsContentFilesDirName ); + + m_xsltStylesheetPtrCaption = xsltParseStylesheetFile + ((const xmlChar *)idxCaptionStylesheet.native_file_string().c_str()); + m_xsltStylesheetPtrContent = xsltParseStylesheetFile + ((const xmlChar *)idxContentStylesheet.native_file_string().c_str()); +} + +IndexerPreProcessor::~IndexerPreProcessor() +{ + if( m_xsltStylesheetPtrCaption ) + xsltFreeStylesheet( m_xsltStylesheetPtrCaption ); + if( m_xsltStylesheetPtrContent ) + xsltFreeStylesheet( m_xsltStylesheetPtrContent ); +} + + +std::string getEncodedPath( const std::string& Path ) +{ + rtl::OString aOStr_Path( Path.c_str() ); + rtl::OUString aOUStr_Path( rtl::OStringToOUString + ( aOStr_Path, fs::getThreadTextEncoding() ) ); + rtl::OUString aPathURL; + osl::File::getFileURLFromSystemPath( aOUStr_Path, aPathURL ); + rtl::OString aOStr_PathURL( rtl::OUStringToOString + ( aPathURL, fs::getThreadTextEncoding() ) ); + std::string aStdStr_PathURL( aOStr_PathURL.getStr() ); + return aStdStr_PathURL; +} + +void IndexerPreProcessor::processDocument + ( xmlDocPtr doc, const std::string &EncodedDocPath ) +{ + std::string aStdStr_EncodedDocPathURL = getEncodedPath( EncodedDocPath ); + + if( m_xsltStylesheetPtrCaption ) + { + xmlDocPtr resCaption = xsltApplyStylesheet( m_xsltStylesheetPtrCaption, doc, NULL ); + xmlNodePtr pResNodeCaption = resCaption->xmlChildrenNode; + if( pResNodeCaption ) + { + fs::path fsCaptionPureTextFile_docURL = m_fsCaptionFilesDirName / aStdStr_EncodedDocPathURL; + std::string aCaptionPureTextFileStr_docURL = fsCaptionPureTextFile_docURL.native_file_string(); + FILE* pFile_docURL = fopen( aCaptionPureTextFileStr_docURL.c_str(), "w" ); + if( pFile_docURL ) + { + fprintf( pFile_docURL, "%s\n", pResNodeCaption->content ); + fclose( pFile_docURL ); + } + } + xmlFreeDoc(resCaption); + } + + if( m_xsltStylesheetPtrContent ) + { + xmlDocPtr resContent = xsltApplyStylesheet( m_xsltStylesheetPtrContent, doc, NULL ); + xmlNodePtr pResNodeContent = resContent->xmlChildrenNode; + if( pResNodeContent ) + { + fs::path fsContentPureTextFile_docURL = m_fsContentFilesDirName / aStdStr_EncodedDocPathURL; + std::string aContentPureTextFileStr_docURL = fsContentPureTextFile_docURL.native_file_string(); + FILE* pFile_docURL = fopen( aContentPureTextFileStr_docURL.c_str(), "w" ); + if( pFile_docURL ) + { + fprintf( pFile_docURL, "%s\n", pResNodeContent->content ); + fclose( pFile_docURL ); + } + } + xmlFreeDoc(resContent); + } +} + +struct Data +{ + std::vector _idList; + typedef std::vector::const_iterator cIter; + + void append(const std::string &id) + { + _idList.push_back(id); + } + + std::string getString() const + { + std::string ret; + cIter aEnd = _idList.end(); + for (cIter aIter = _idList.begin(); aIter != aEnd; ++aIter) + ret += *aIter + ";"; + return ret; + } +}; + +void writeKeyValue_DBHelp( FILE* pFile, const std::string& aKeyStr, const std::string& aValueStr ) +{ + if( pFile == NULL ) + return; + char cLF = 10; + unsigned int nKeyLen = aKeyStr.length(); + unsigned int nValueLen = aValueStr.length(); + fprintf( pFile, "%x ", nKeyLen ); + if( nKeyLen > 0 ) + { + if (fwrite( aKeyStr.c_str(), 1, nKeyLen, pFile ) != nKeyLen) + fprintf(stderr, "fwrite to db failed\n"); + } + if (fprintf( pFile, " %x ", nValueLen ) < 0) + fprintf(stderr, "fwrite to db failed\n"); + if( nValueLen > 0 ) + { + if (fwrite( aValueStr.c_str(), 1, nValueLen, pFile ) != nValueLen) + fprintf(stderr, "fwrite to db failed\n"); + } + if (fprintf( pFile, "%c", cLF ) < 0) + fprintf(stderr, "fwrite to db failed\n"); +} + +class HelpKeyword +{ +private: + typedef std::hash_map DataHashtable; + DataHashtable _hash; + +public: + void insert(const std::string &key, const std::string &id) + { + Data &data = _hash[key]; + data.append(id); + } + + void dump(DB* table) + { + DataHashtable::const_iterator aEnd = _hash.end(); + for (DataHashtable::const_iterator aIter = _hash.begin(); aIter != aEnd; ++aIter) + { + const std::string &keystr = aIter->first; + DBT key; + memset(&key, 0, sizeof(key)); + key.data = const_cast(keystr.c_str()); + key.size = keystr.length(); + + const Data &data = aIter->second; + std::string str = data.getString(); + DBT value; + memset(&value, 0, sizeof(value)); + value.data = const_cast(str.c_str()); + value.size = str.length(); + + table->put(table, NULL, &key, &value, 0); + } + } + + void dump_DBHelp( const std::string& rFileName ) + { + FILE* pFile = fopen( rFileName.c_str(), "wb" ); + if( pFile == NULL ) + return; + + DataHashtable::const_iterator aEnd = _hash.end(); + for (DataHashtable::const_iterator aIter = _hash.begin(); aIter != aEnd; ++aIter) + writeKeyValue_DBHelp( pFile, aIter->first, aIter->second.getString() ); + + fclose( pFile ); + } +}; + +class HelpLinker +{ +public: + void main(std::vector &args, + std::string* pExtensionPath = NULL, const rtl::OUString* pOfficeHelpPath = NULL ) + throw( HelpProcessingException ); + + HelpLinker() + : init(true) + , m_pIndexerPreProcessor(NULL) + {} + ~HelpLinker() + { delete m_pIndexerPreProcessor; } + +private: + int locCount, totCount; + Stringtable additionalFiles; + HashSet helpFiles; + fs::path sourceRoot; + fs::path embeddStylesheet; + fs::path idxCaptionStylesheet; + fs::path idxContentStylesheet; + fs::path zipdir; + fs::path outputFile; + std::string module; + std::string lang; + std::string hid; + std::string extensionPath; + bool bExtensionMode; + fs::path indexDirName; + Stringtable hidlistTranslation; + fs::path indexDirParentName; + bool init; + IndexerPreProcessor* m_pIndexerPreProcessor; + void initIndexerPreProcessor(); + void link() throw( HelpProcessingException ); + void addBookmark( DB* dbBase, FILE* pFile_DBHelp, std::string thishid, + const std::string& fileB, const std::string& anchorB, + const std::string& jarfileB, const std::string& titleB ); +#if 0 + /** + * @param outputFile + * @param module + * @param lang + * @param hid + * @param helpFiles + * @param additionalFiles + */ + + private HelpURLStreamHandlerFactory urlHandler = null; +#endif +}; + +namespace URLEncoder +{ + static std::string encode(const std::string &rIn) + { + const char *good = "!$&'()*+,-.=@_"; + static const char hex[17] = "0123456789ABCDEF"; + + std::string result; + for (size_t i=0; i < rIn.length(); ++i) + { + unsigned char c = rIn[i]; + if (isalnum (c) || strchr (good, c)) + result += c; + else { + result += '%'; + result += hex[c >> 4]; + result += hex[c & 0xf]; + } + } + return result; + } +} + +void HelpLinker::addBookmark( DB* dbBase, FILE* pFile_DBHelp, std::string thishid, + const std::string& fileB, const std::string& anchorB, + const std::string& jarfileB, const std::string& titleB) +{ + HCDBG(std::cerr << "HelpLinker::addBookmark " << thishid << " " << + fileB << " " << anchorB << " " << jarfileB << " " << titleB << std::endl); + + std::string temp = thishid; + std::transform (temp.begin(), temp.end(), temp.begin(), toupper); + std::replace(temp.begin(), temp.end(), ':', '_'); + const std::string& translatedHid = hidlistTranslation[temp]; + if (!translatedHid.empty()) + thishid = translatedHid; + + thishid = URLEncoder::encode(thishid); + + DBT key; + memset(&key, 0, sizeof(key)); + key.data = const_cast(thishid.c_str()); + key.size = thishid.length(); + + int fileLen = fileB.length(); + if (!anchorB.empty()) + fileLen += (1 + anchorB.length()); + int dataLen = 1 + fileLen + 1 + jarfileB.length() + 1 + titleB.length(); + + std::vector dataB(dataLen); + size_t i = 0; + dataB[i++] = static_cast(fileLen); + for (size_t j = 0; j < fileB.length(); ++j) + dataB[i++] = fileB[j]; + if (!anchorB.empty()) + { + dataB[i++] = '#'; + for (size_t j = 0; j < anchorB.length(); ++j) + dataB[i++] = anchorB[j]; + } + dataB[i++] = static_cast(jarfileB.length()); + for (size_t j = 0; j < jarfileB.length(); ++j) + dataB[i++] = jarfileB[j]; + + dataB[i++] = static_cast(titleB.length()); + for (size_t j = 0; j < titleB.length(); ++j) + dataB[i++] = titleB[j]; + + DBT data; + memset(&data, 0, sizeof(data)); + data.data = &dataB[0]; + data.size = dataB.size(); + + if( dbBase != NULL ) + dbBase->put(dbBase, NULL, &key, &data, 0); + + if( pFile_DBHelp != NULL ) + { + std::string aValueStr( dataB.begin(), dataB.end() ); + writeKeyValue_DBHelp( pFile_DBHelp, thishid, aValueStr ); + } +} + +void HelpLinker::initIndexerPreProcessor() +{ + if( m_pIndexerPreProcessor ) + delete m_pIndexerPreProcessor; + std::string mod = module; + std::transform (mod.begin(), mod.end(), mod.begin(), tolower); + m_pIndexerPreProcessor = new IndexerPreProcessor( mod, indexDirParentName, + idxCaptionStylesheet, idxContentStylesheet ); +} + +/** +* +*/ +void HelpLinker::link() throw( HelpProcessingException ) +{ + bool bIndexForExtension = true; + + if( bExtensionMode ) + { + indexDirParentName = sourceRoot; + } + else + { + indexDirParentName = zipdir; + fs::create_directory(indexDirParentName); + } + +#ifdef CMC_DEBUG + std::cerr << "will not delete tmpdir of " << indexDirParentName.native_file_string().c_str() << std::endl; +#endif + + std::string mod = module; + std::transform (mod.begin(), mod.end(), mod.begin(), tolower); + + // do the work here + // continue with introduction of the overall process thing into the + // here all hzip files will be worked on + std::string appl = mod; + if (appl[0] == 's') + appl = appl.substr(1); + + bool bUse_ = true; +#ifdef DBHELP_ONLY + if( !bExtensionMode ) + bUse_ = false; +#endif + + DB* helpText(0); +#ifndef DBHELP_ONLY + fs::path helpTextFileName(indexDirParentName / (mod + ".ht")); + db_create(&helpText,0,0); + helpText->open(helpText, NULL, helpTextFileName.native_file_string().c_str(), NULL, DB_BTREE, + DB_CREATE | DB_TRUNCATE, 0644); +#endif + + fs::path helpTextFileName_DBHelp(indexDirParentName / (mod + (bUse_ ? ".ht_" : ".ht"))); + FILE* pFileHelpText_DBHelp = fopen + ( helpTextFileName_DBHelp.native_file_string().c_str(), "wb" ); + + DB* dbBase(0); +#ifndef DBHELP_ONLY + fs::path dbBaseFileName(indexDirParentName / (mod + ".db")); + db_create(&dbBase,0,0); + dbBase->open(dbBase, NULL, dbBaseFileName.native_file_string().c_str(), NULL, DB_BTREE, + DB_CREATE | DB_TRUNCATE, 0644); +#endif + + fs::path dbBaseFileName_DBHelp(indexDirParentName / (mod + (bUse_ ? ".db_" : ".db"))); + FILE* pFileDbBase_DBHelp = fopen + ( dbBaseFileName_DBHelp.native_file_string().c_str(), "wb" ); + +#ifndef DBHELP_ONLY + DB* keyWord(0); + fs::path keyWordFileName(indexDirParentName / (mod + ".key")); + db_create(&keyWord,0,0); + keyWord->open(keyWord, NULL, keyWordFileName.native_file_string().c_str(), NULL, DB_BTREE, + DB_CREATE | DB_TRUNCATE, 0644); +#endif + + fs::path keyWordFileName_DBHelp(indexDirParentName / (mod + (bUse_ ? ".key_" : ".key"))); + + HelpKeyword helpKeyword; + + // catch HelpProcessingException to avoid locking data bases + try + { + + std::ifstream fileReader(hid.c_str()); + while (fileReader) + { + std::string key; + fileReader >> key; + std::transform (key.begin(), key.end(), key.begin(), toupper); + std::replace(key.begin(), key.end(), ':', '_'); + std::string data; + fileReader >> data; + if (!key.empty() && !data.empty()) + hidlistTranslation[key] = data; + } + fileReader.close(); + + // lastly, initialize the indexBuilder + if ( (!bExtensionMode || bIndexForExtension) && !helpFiles.empty()) + initIndexerPreProcessor(); + + if( !bExtensionMode ) + { +#ifndef OS2 // YD @TODO@ crashes libc runtime :-( + std::cout << "Making " << outputFile.native_file_string() << + " from " << helpFiles.size() << " input files" << std::endl; +#endif + } + + // here we start our loop over the hzip files. + HashSet::iterator end = helpFiles.end(); + for (HashSet::iterator iter = helpFiles.begin(); iter != end; ++iter) + { + if( !bExtensionMode ) + { + std::cout << "."; + std::cout.flush(); + } + + // process one file + // streamTable contains the streams in the hzip file + StreamTable streamTable; + const std::string &xhpFileName = *iter; + + if (!bExtensionMode && xhpFileName.rfind(".xhp") != xhpFileName.length()-4) + { + // only work on .xhp - files + std::cerr << + "ERROR: input list entry '" + << xhpFileName + << "' has the wrong extension (only files with extension .xhp " + << "are accepted)"; + continue; + } + + fs::path langsourceRoot(sourceRoot); + fs::path xhpFile; + + if( bExtensionMode ) + { + // langsourceRoot == sourceRoot for extensions + std::string xhpFileNameComplete( extensionPath ); + xhpFileNameComplete.append( '/' + xhpFileName ); + xhpFile = fs::path( xhpFileNameComplete ); + } + else + { + langsourceRoot.append('/' + lang + '/'); + xhpFile = fs::path(xhpFileName, fs::native); + } + + HelpCompiler hc( streamTable, xhpFile, langsourceRoot, + embeddStylesheet, module, lang, bExtensionMode ); + + HCDBG(std::cerr << "before compile of " << xhpFileName << std::endl); + bool success = hc.compile(); + HCDBG(std::cerr << "after compile of " << xhpFileName << std::endl); + + if (!success && !bExtensionMode) + { + std::stringstream aStrStream; + aStrStream << + "\nERROR: compiling help particle '" + << xhpFileName + << "' for language '" + << lang + << "' failed!"; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + const std::string documentBaseId = streamTable.document_id; + std::string documentPath = streamTable.document_path; + if (documentPath.find("/") == 0) + documentPath = documentPath.substr(1); + + std::string documentJarfile = streamTable.document_module + ".jar"; + + std::string documentTitle = streamTable.document_title; + if (documentTitle.empty()) + documentTitle = ""; + +#if 0 + std::cout << "for " << xhpFileName << " documentBaseId is " << documentBaseId << "\n"; + std::cout << "for " << xhpFileName << " documentPath is " << documentPath << "\n"; + std::cout << "for " << xhpFileName << " documentJarfile is " << documentJarfile << "\n"; + std::cout << "for " << xhpFileName << " documentPath is " << documentTitle << "\n"; +#endif + + const std::string& fileB = documentPath; + const std::string& jarfileB = documentJarfile; + std::string& titleB = documentTitle; + + // add once this as its own id. + addBookmark(dbBase, pFileDbBase_DBHelp, documentPath, fileB, std::string(), jarfileB, titleB); + + // first the database *.db + // ByteArrayInputStream bais = null; + // ObjectInputStream ois = null; + + const HashSet *hidlist = streamTable.appl_hidlist; + if (!hidlist) + hidlist = streamTable.default_hidlist; + if (hidlist && !hidlist->empty()) + { + // now iterate over all elements of the hidlist + HashSet::const_iterator aEnd = hidlist->end(); + for (HashSet::const_iterator hidListIter = hidlist->begin(); + hidListIter != aEnd; ++hidListIter) + { + std::string thishid = *hidListIter; + + std::string anchorB; + size_t index = thishid.rfind('#'); + if (index != std::string::npos) + { + anchorB = thishid.substr(1 + index); + thishid = thishid.substr(0, index); + } + addBookmark(dbBase, pFileDbBase_DBHelp, thishid, fileB, anchorB, jarfileB, titleB); + } + } + + // now the keywords + const Hashtable *anchorToLL = streamTable.appl_keywords; + if (!anchorToLL) + anchorToLL = streamTable.default_keywords; + if (anchorToLL && !anchorToLL->empty()) + { + std::string fakedHid = URLEncoder::encode(documentPath); + Hashtable::const_iterator aEnd = anchorToLL->end(); + for (Hashtable::const_iterator enumer = anchorToLL->begin(); + enumer != aEnd; ++enumer) + { + const std::string &anchor = enumer->first; + addBookmark(dbBase, pFileDbBase_DBHelp, documentPath, fileB, + anchor, jarfileB, titleB); + std::string totalId = fakedHid + "#" + anchor; + // std::cerr << hzipFileName << std::endl; + const LinkedList& ll = enumer->second; + LinkedList::const_iterator aOtherEnd = ll.end(); + for (LinkedList::const_iterator llIter = ll.begin(); + llIter != aOtherEnd; ++llIter) + { + helpKeyword.insert(*llIter, totalId); + } + } + + } + + // and last the helptexts + const Stringtable *helpTextHash = streamTable.appl_helptexts; + if (!helpTextHash) + helpTextHash = streamTable.default_helptexts; + if (helpTextHash && !helpTextHash->empty()) + { + Stringtable::const_iterator aEnd = helpTextHash->end(); + for (Stringtable::const_iterator helpTextIter = helpTextHash->begin(); + helpTextIter != aEnd; ++helpTextIter) + { + std::string helpTextId = helpTextIter->first; + const std::string& helpTextText = helpTextIter->second; + + std::string temp = helpTextId; + std::transform (temp.begin(), temp.end(), temp.begin(), toupper); + std::replace(temp.begin(), temp.end(), ':', '_'); + + const std::string& tHid = hidlistTranslation[temp]; + if (!tHid.empty()) + helpTextId = tHid; + helpTextId = URLEncoder::encode(helpTextId); + + DBT keyDbt; + memset(&keyDbt, 0, sizeof(keyDbt)); + keyDbt.data = const_cast(helpTextId.c_str()); + keyDbt.size = helpTextId.length(); + + DBT textDbt; + memset(&textDbt, 0, sizeof(textDbt)); + textDbt.data = const_cast(helpTextText.c_str()); + textDbt.size = helpTextText.length(); + + if( helpText != NULL ) + helpText->put(helpText, NULL, &keyDbt, &textDbt, 0); + + if( pFileHelpText_DBHelp != NULL ) + writeKeyValue_DBHelp( pFileHelpText_DBHelp, helpTextId, helpTextText ); + } + } + + //IndexerPreProcessor + if( !bExtensionMode || bIndexForExtension ) + { + // now the indexing + xmlDocPtr document = streamTable.appl_doc; + if (!document) + document = streamTable.default_doc; + if (document) + { + std::string temp = module; + std::transform (temp.begin(), temp.end(), temp.begin(), tolower); + m_pIndexerPreProcessor->processDocument(document, URLEncoder::encode(documentPath) ); + } + } + + } // while loop over hzip files ending + if( !bExtensionMode ) + std::cout << std::endl; + + } // try + catch( HelpProcessingException& ) + { + // catch HelpProcessingException to avoid locking data bases +#ifndef DBHELP_ONLY + helpText->close(helpText, 0); + dbBase->close(dbBase, 0); + keyWord->close(keyWord, 0); +#endif + if( pFileHelpText_DBHelp != NULL ) + fclose( pFileHelpText_DBHelp ); + if( pFileDbBase_DBHelp != NULL ) + fclose( pFileDbBase_DBHelp ); + throw; + } + +#ifndef DBHELP_ONLY + helpText->close(helpText, 0); + dbBase->close(dbBase, 0); + helpKeyword.dump(keyWord); + keyWord->close(keyWord, 0); +#endif + if( pFileHelpText_DBHelp != NULL ) + fclose( pFileHelpText_DBHelp ); + if( pFileDbBase_DBHelp != NULL ) + fclose( pFileDbBase_DBHelp ); + + helpKeyword.dump_DBHelp( keyWordFileName_DBHelp.native_file_string() ); + + if( !bExtensionMode ) + { + // New index + Stringtable::iterator aEnd = additionalFiles.end(); + for (Stringtable::iterator enumer = additionalFiles.begin(); enumer != aEnd; + ++enumer) + { + const std::string &additionalFileName = enumer->second; + const std::string &additionalFileKey = enumer->first; + + fs::path fsAdditionalFileName( additionalFileName, fs::native ); + std::string aNativeStr = fsAdditionalFileName.native_file_string(); + const char* pStr = aNativeStr.c_str(); + std::cerr << pStr; + + fs::path fsTargetName( indexDirParentName / additionalFileKey ); + + fs::copy( fsAdditionalFileName, fsTargetName ); + } + } + +/* + ///////////////////////////////////////////////////////////////////////// + /// remove temprary directory for index creation + ///////////////////////////////////////////////////////////////////////// +#ifndef CMC_DEBUG + if( !bExtensionMode ) + fs::remove_all( indexDirParentName ); +#endif +*/ +} + + +void HelpLinker::main( std::vector &args, + std::string* pExtensionPath, const rtl::OUString* pOfficeHelpPath ) + throw( HelpProcessingException ) +{ + rtl::OUString aOfficeHelpPath; + + bExtensionMode = false; + if( pExtensionPath && pExtensionPath->length() > 0 && pOfficeHelpPath ) + { + helpFiles.clear(); + bExtensionMode = true; + extensionPath = *pExtensionPath; + sourceRoot = fs::path(extensionPath); + + aOfficeHelpPath = *pOfficeHelpPath; + } + if (args.size() > 0 && args[0][0] == '@') + { + std::vector stringList; + std::string strBuf; + std::ifstream fileReader(args[0].substr(1).c_str()); + + while (fileReader) + { + std::string token; + fileReader >> token; + if (!token.empty()) + stringList.push_back(token); + } + fileReader.close(); + + args = stringList; + } + + size_t i = 0; + + while (i < args.size()) + { + if (args[i].compare("-src") == 0) + { + ++i; + if (i >= args.size()) + { + std::stringstream aStrStream; + aStrStream << "sourceroot missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + if( !bExtensionMode ) + sourceRoot = fs::path(args[i], fs::native); + } + else if (args[i].compare("-sty") == 0) + { + ++i; + if (i >= args.size()) + { + std::stringstream aStrStream; + aStrStream << "embeddingStylesheet missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + embeddStylesheet = fs::path(args[i], fs::native); + } + else if (args[i].compare("-zipdir") == 0) + { + ++i; + if (i >= args.size()) + { + std::stringstream aStrStream; + aStrStream << "idxtemp missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + zipdir = fs::path(args[i], fs::native); + } + else if (args[i].compare("-idxcaption") == 0) + { + ++i; + if (i >= args.size()) + { + std::stringstream aStrStream; + aStrStream << "idxcaption stylesheet missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + idxCaptionStylesheet = fs::path(args[i], fs::native); + } + else if (args[i].compare("-idxcontent") == 0) + { + ++i; + if (i >= args.size()) + { + std::stringstream aStrStream; + aStrStream << "idxcontent stylesheet missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + idxContentStylesheet = fs::path(args[i], fs::native); + } + else if (args[i].compare("-o") == 0) + { + ++i; + if (i >= args.size()) + { + std::stringstream aStrStream; + aStrStream << "outputfilename missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + outputFile = fs::path(args[i], fs::native); + } + else if (args[i].compare("-mod") == 0) + { + ++i; + if (i >= args.size()) + { + std::stringstream aStrStream; + aStrStream << "module name missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + module = args[i]; + } + else if (args[i].compare("-lang") == 0) + { + ++i; + if (i >= args.size()) + { + std::stringstream aStrStream; + aStrStream << "language name missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + lang = args[i]; + } + else if (args[i].compare("-hid") == 0) + { + ++i; + if (i >= args.size()) + { + std::stringstream aStrStream; + aStrStream << "hid list missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + hid = args[i]; + } + else if (args[i].compare("-add") == 0) + { + std::string addFile, addFileUnderPath; + ++i; + if (i >= args.size()) + { + std::stringstream aStrStream; + aStrStream << "pathname missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + addFileUnderPath = args[i]; + ++i; + if (i >= args.size()) + { + std::stringstream aStrStream; + aStrStream << "pathname missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + addFile = args[i]; + if (!addFileUnderPath.empty() && !addFile.empty()) + additionalFiles[addFileUnderPath] = addFile; + } + else + helpFiles.push_back(args[i]); + ++i; + } + + if (!bExtensionMode && zipdir.empty()) + { + std::stringstream aStrStream; + aStrStream << "no index dir given" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + if (!bExtensionMode && idxCaptionStylesheet.empty()) + { + std::stringstream aStrStream; + aStrStream << "no index caption stylesheet given" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + else if ( bExtensionMode ) + { + rtl::OUString aIdxCaptionPathFileURL( aOfficeHelpPath ); + aIdxCaptionPathFileURL += rtl::OUString::createFromAscii( "/idxcaption.xsl" ); + + rtl::OString aOStr_IdxCaptionPathFileURL( rtl::OUStringToOString + ( aIdxCaptionPathFileURL, fs::getThreadTextEncoding() ) ); + std::string aStdStr_IdxCaptionPathFileURL( aOStr_IdxCaptionPathFileURL.getStr() ); + + idxCaptionStylesheet = fs::path( aStdStr_IdxCaptionPathFileURL ); + } + if (!bExtensionMode && idxContentStylesheet.empty()) + { + std::stringstream aStrStream; + aStrStream << "no index content stylesheet given" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + else if ( bExtensionMode ) + { + rtl::OUString aIdxContentPathFileURL( aOfficeHelpPath ); + aIdxContentPathFileURL += rtl::OUString::createFromAscii( "/idxcontent.xsl" ); + + rtl::OString aOStr_IdxContentPathFileURL( rtl::OUStringToOString + ( aIdxContentPathFileURL, fs::getThreadTextEncoding() ) ); + std::string aStdStr_IdxContentPathFileURL( aOStr_IdxContentPathFileURL.getStr() ); + + idxContentStylesheet = fs::path( aStdStr_IdxContentPathFileURL ); + } + if (!bExtensionMode && embeddStylesheet.empty()) + { + std::stringstream aStrStream; + aStrStream << "no embedding resolving file given" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + if (sourceRoot.empty()) + { + std::stringstream aStrStream; + aStrStream << "no sourceroot given" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + if (!bExtensionMode && outputFile.empty()) + { + std::stringstream aStrStream; + aStrStream << "no output file given" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + if (module.empty()) + { + std::stringstream aStrStream; + aStrStream << "module missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + if (!bExtensionMode && lang.empty()) + { + std::stringstream aStrStream; + aStrStream << "language missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + if (!bExtensionMode && hid.empty()) + { + std::stringstream aStrStream; + aStrStream << "hid list missing" << std::endl; + throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() ); + } + + link(); +} + +int main(int argc, char**argv) +{ + sal_uInt32 starttime = osl_getGlobalTimer(); + std::vector args; + for (int i = 1; i < argc; ++i) + args.push_back(std::string(argv[i])); + try + { + HelpLinker* pHelpLinker = new HelpLinker(); + pHelpLinker->main( args ); + delete pHelpLinker; + } + catch( const HelpProcessingException& e ) + { + std::cerr << e.m_aErrorMsg; + exit(1); + } + sal_uInt32 endtime = osl_getGlobalTimer(); +#ifndef OS2 // YD @TODO@ crashes libc runtime :-( + std::cout << "time taken was " << (endtime-starttime)/1000.0 << " seconds" << std::endl; +#endif + return 0; +} + +// Variable to set an exception in "C" StructuredXMLErrorFunction +static const HelpProcessingException* GpXMLParsingException = NULL; + +extern "C" void StructuredXMLErrorFunction(void *userData, xmlErrorPtr error) +{ + (void)userData; + (void)error; + + std::string aErrorMsg = error->message; + std::string aXMLParsingFile; + if( error->file != NULL ) + aXMLParsingFile = error->file; + int nXMLParsingLine = error->line; + HelpProcessingException* pException = new HelpProcessingException( aErrorMsg, aXMLParsingFile, nXMLParsingLine ); + GpXMLParsingException = pException; + + // Reset error handler + xmlSetStructuredErrorFunc( NULL, NULL ); +} + +HelpProcessingErrorInfo& HelpProcessingErrorInfo::operator=( const struct HelpProcessingException& e ) +{ + m_eErrorClass = e.m_eErrorClass; + rtl::OString tmpErrorMsg( e.m_aErrorMsg.c_str() ); + m_aErrorMsg = rtl::OStringToOUString( tmpErrorMsg, fs::getThreadTextEncoding() ); + rtl::OString tmpXMLParsingFile( e.m_aXMLParsingFile.c_str() ); + m_aXMLParsingFile = rtl::OStringToOUString( tmpXMLParsingFile, fs::getThreadTextEncoding() ); + m_nXMLParsingLine = e.m_nXMLParsingLine; + return *this; +} + + +// Returns true in case of success, false in case of error +HELPLINKER_DLLPUBLIC bool compileExtensionHelp +( + const rtl::OUString& aOfficeHelpPath, + const rtl::OUString& aExtensionName, + const rtl::OUString& aExtensionLanguageRoot, + sal_Int32 nXhpFileCount, const rtl::OUString* pXhpFiles, + HelpProcessingErrorInfo& o_rHelpProcessingErrorInfo +) +{ + bool bSuccess = true; + + sal_Int32 argc = nXhpFileCount + 3; + const char** argv = new const char*[argc]; + argv[0] = ""; + argv[1] = "-mod"; + rtl::OString aOExtensionName = rtl::OUStringToOString( aExtensionName, fs::getThreadTextEncoding() ); + argv[2] = aOExtensionName.getStr(); + + for( sal_Int32 iXhp = 0 ; iXhp < nXhpFileCount ; ++iXhp ) + { + rtl::OUString aXhpFile = pXhpFiles[iXhp]; + + rtl::OString aOXhpFile = rtl::OUStringToOString( aXhpFile, fs::getThreadTextEncoding() ); + char* pArgStr = new char[aOXhpFile.getLength() + 1]; + strcpy( pArgStr, aOXhpFile.getStr() ); + argv[iXhp + 3] = pArgStr; + } + + std::vector args; + for( sal_Int32 i = 1; i < argc; ++i ) + args.push_back(std::string( argv[i]) ); + + for( sal_Int32 iXhp = 0 ; iXhp < nXhpFileCount ; ++iXhp ) + delete argv[iXhp + 3]; + delete[] argv; + + rtl::OString aOExtensionLanguageRoot = rtl::OUStringToOString( aExtensionLanguageRoot, fs::getThreadTextEncoding() ); + const char* pExtensionPath = aOExtensionLanguageRoot.getStr(); + std::string aStdStrExtensionPath = pExtensionPath; + + // Set error handler + xmlSetStructuredErrorFunc( NULL, (xmlStructuredErrorFunc)StructuredXMLErrorFunction ); + try + { + HelpLinker* pHelpLinker = new HelpLinker(); + pHelpLinker->main( args, &aStdStrExtensionPath, &aOfficeHelpPath ); + delete pHelpLinker; + } + catch( const HelpProcessingException& e ) + { + if( GpXMLParsingException != NULL ) + { + o_rHelpProcessingErrorInfo = *GpXMLParsingException; + delete GpXMLParsingException; + GpXMLParsingException = NULL; + } + else + { + o_rHelpProcessingErrorInfo = e; + } + bSuccess = false; + } + // Reset error handler + xmlSetStructuredErrorFunc( NULL, NULL ); + + // i83624: Tree files + ::rtl::OUString aTreeFileURL = aExtensionLanguageRoot; + aTreeFileURL += rtl::OUString::createFromAscii( "/help.tree" ); + osl::DirectoryItem aTreeFileItem; + osl::FileBase::RC rcGet = osl::DirectoryItem::get( aTreeFileURL, aTreeFileItem ); + osl::FileStatus aFileStatus( FileStatusMask_FileSize ); + if( rcGet == osl::FileBase::E_None && + aTreeFileItem.getFileStatus( aFileStatus ) == osl::FileBase::E_None && + aFileStatus.isValid( FileStatusMask_FileSize ) ) + { + sal_uInt64 ret, len = aFileStatus.getFileSize(); + char* s = new char[ int(len) ]; // the buffer to hold the installed files + osl::File aFile( aTreeFileURL ); + aFile.open( OpenFlag_Read ); + aFile.read( s, len, ret ); + aFile.close(); + + XML_Parser parser = XML_ParserCreate( 0 ); + int parsed = XML_Parse( parser, s, int( len ), true ); + + if( parsed == 0 ) + { + XML_Error nError = XML_GetErrorCode( parser ); + o_rHelpProcessingErrorInfo.m_eErrorClass = HELPPROCESSING_XMLPARSING_ERROR; + o_rHelpProcessingErrorInfo.m_aErrorMsg = rtl::OUString::createFromAscii( XML_ErrorString( nError ) );; + o_rHelpProcessingErrorInfo.m_aXMLParsingFile = aTreeFileURL; + // CRAHSES!!! o_rHelpProcessingErrorInfo.m_nXMLParsingLine = XML_GetCurrentLineNumber( parser ); + bSuccess = false; + } + + XML_ParserFree( parser ); + delete[] s; + } + + return bSuccess; +} + +// vnd.sun.star.help://swriter/52821?Language=en-US&System=UNIX +/* vi:set tabstop=4 shiftwidth=4 expandtab: */ + diff --git a/transex3/source/help/compilehelp.hxx b/transex3/source/help/compilehelp.hxx new file mode 100644 index 000000000000..d123d628be27 --- /dev/null +++ b/transex3/source/help/compilehelp.hxx @@ -0,0 +1,81 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: compilehelp.hxx,v $ + * $Revision: 1.3 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef COMPILE_HXX +#define COMPILE_HXX + +#include "sal/types.h" + +#if defined(HELPLINKER_DLLIMPLEMENTATION) +#define HELPLINKER_DLLPUBLIC SAL_DLLPUBLIC_EXPORT +#else +#define HELPLINKER_DLLPUBLIC SAL_DLLPUBLIC_IMPORT +#endif +#define HELPLINKER_DLLPRIVATE SAL_DLLPRIVATE + + +//#include +#include + +enum HelpProcessingErrorClass +{ + HELPPROCESSING_NO_ERROR, + HELPPROCESSING_GENERAL_ERROR, // Missing files, options etc. + HELPPROCESSING_INTERNAL_ERROR, // Unexpected problems + HELPPROCESSING_XMLPARSING_ERROR // Errors thrown by libxml +}; + +struct HelpProcessingErrorInfo +{ + HelpProcessingErrorClass m_eErrorClass; + rtl::OUString m_aErrorMsg; + rtl::OUString m_aXMLParsingFile; + sal_Int32 m_nXMLParsingLine; + + HelpProcessingErrorInfo( void ) + : m_eErrorClass( HELPPROCESSING_NO_ERROR ) + , m_nXMLParsingLine( -1 ) + {} + + HelpProcessingErrorInfo& operator=( const struct HelpProcessingException& e ); +}; + + +// Returns true in case of success, false in case of error +HELPLINKER_DLLPUBLIC bool compileExtensionHelp +( + const rtl::OUString& aOfficeHelpPath, + const rtl::OUString& aExtensionName, + const rtl::OUString& aExtensionLanguageRoot, + sal_Int32 nXhpFileCount, const rtl::OUString* pXhpFiles, + HelpProcessingErrorInfo& o_rHelpProcessingErrorInfo +); + +#endif diff --git a/svtools/win/res/makefile.mk b/transex3/source/help/helplinker.pmk similarity index 85% rename from svtools/win/res/makefile.mk rename to transex3/source/help/helplinker.pmk index 3c33d006edf9..569c5f4dbdee 100644 --- a/svtools/win/res/makefile.mk +++ b/transex3/source/help/helplinker.pmk @@ -6,9 +6,9 @@ # # OpenOffice.org - a multi-platform office productivity suite # -# $RCSfile: makefile.mk,v $ +# $RCSfile: helplinker.pmk,v $ # -# $Revision: 1.3 $ +# $Revision: 1.4 $ # # This file is part of OpenOffice.org. # @@ -28,3 +28,8 @@ # for a copy of the LGPLv3 License. # #************************************************************************* + +# define HELPLINKER_DLLIMPLEMENTATION (see @ inc/xmlhelp/helplinkerdllapi.h) +CDEFS += -DHELPLINKER_DLLIMPLEMENTATION + +VISIBILITY_HIDDEN=TRUE diff --git a/transex3/source/help/makefile.mk b/transex3/source/help/makefile.mk new file mode 100644 index 000000000000..6fc823a1b59a --- /dev/null +++ b/transex3/source/help/makefile.mk @@ -0,0 +1,120 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.38 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ = ..$/.. +PRJNAME = xmlhelp +TARGET = HelpLinker +LIBBASENAME = helplinker +PACKAGE = com$/sun$/star$/help +TARGETTYPE=CUI + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE : helplinker.pmk + +.IF "$(SYSTEM_LIBXSLT)" == "YES" +CFLAGS+= $(LIBXSLT_CFLAGS) +.ELSE +LIBXSLTINCDIR=external$/libxslt +CFLAGS+= -I$(SOLARINCDIR)$/$(LIBXSLTINCDIR) +.ENDIF + +.IF "$(SYSTEM_DB)" == "YES" +CFLAGS+=-DSYSTEM_DB -I$(DB_INCLUDES) +.ENDIF + +.IF "$(SYSTEM_EXPAT)" == "YES" +CFLAGS+=-DSYSTEM_EXPAT +.ENDIF + +OBJFILES=\ + $(OBJ)$/HelpLinker.obj \ + $(OBJ)$/HelpCompiler.obj +SLOFILES=\ + $(SLO)$/HelpLinker.obj \ + $(SLO)$/HelpCompiler.obj + +EXCEPTIONSFILES=\ + $(OBJ)$/HelpLinker.obj \ + $(OBJ)$/HelpCompiler.obj \ + $(SLO)$/HelpLinker.obj \ + $(SLO)$/HelpCompiler.obj +.IF "$(OS)" == "MACOSX" && "$(CPU)" == "P" && "$(COM)" == "GCC" +# There appears to be a GCC 4.0.1 optimization error causing _file:good() to +# report true right before the call to writeOut at HelpLinker.cxx:1.12 l. 954 +# but out.good() to report false right at the start of writeOut at +# HelpLinker.cxx:1.12 l. 537: +NOOPTFILES=\ + $(OBJ)$/HelpLinker.obj \ + $(SLO)$/HelpLinker.obj +.ENDIF + +APP1TARGET= $(TARGET) +APP1OBJS=\ + $(OBJ)$/HelpLinker.obj \ + $(OBJ)$/HelpCompiler.obj + +APP1STDLIBS+=$(SALLIB) $(BERKELEYLIB) $(XSLTLIB) $(EXPATASCII3RDLIB) + +SHL1TARGET =$(LIBBASENAME)$(DLLPOSTFIX) +SHL1LIBS= $(SLB)$/$(TARGET).lib +SHL1IMPLIB =i$(LIBBASENAME) +SHL1DEF =$(MISC)$/$(SHL1TARGET).def +SHL1STDLIBS =$(SALLIB) $(BERKELEYLIB) $(XSLTLIB) $(EXPATASCII3RDLIB) +SHL1USE_EXPORTS =ordinal + +DEF1NAME =$(SHL1TARGET) +DEFLIB1NAME =$(TARGET) + +JAVAFILES = \ + HelpIndexerTool.java \ + HelpFileDocument.java + + +JAVACLASSFILES = \ + $(CLASSDIR)$/$(PACKAGE)$/HelpIndexerTool.class \ + $(CLASSDIR)$/$(PACKAGE)$/HelpFileDocument.class + +.IF "$(SYSTEM_LUCENE)" == "YES" +CLASSPATH!:=$(CLASSPATH)$(PATH_SEPERATOR)$(LUCENE_CORE_JAR)$(PATH_SEPERATOR)$(LUCENE_ANALYZERS_JAR) +.ELSE +JARFILES += lucene-core-2.3.jar lucene-analyzers-2.3.jar +.ENDIF +JAVAFILES = $(subst,$(CLASSDIR)$/$(PACKAGE)$/, $(subst,.class,.java $(JAVACLASSFILES))) + +JARCLASSDIRS = $(PACKAGE)/* +JARTARGET = HelpIndexerTool.jar +JARCOMPRESS = TRUE + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk diff --git a/transex3/source/hw2fw.cxx b/transex3/source/hw2fw.cxx deleted file mode 100644 index dd77b8d9210c..000000000000 --- a/transex3/source/hw2fw.cxx +++ /dev/null @@ -1,202 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: hw2fw.cxx,v $ - * $Revision: 1.4 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_transex3.hxx" -#include - -struct hw_pair -{ - sal_Unicode nFrom; - sal_Unicode nTo; -}; - -#define MAKE_PAIR(a,b) { a, b } - -static struct hw_pair aHWPairs[] = -{ - MAKE_PAIR( 0xFF65, 0x30FB ), // HALFWIDTH KATAKANA MIDDLE DOT --> KATAKANA MIDDLE DOT - MAKE_PAIR( 0xFF66, 0x30F2 ), // HALFWIDTH KATAKANA LETTER WO --> KATAKANA LETTER WO - MAKE_PAIR( 0xFF67, 0x30A1 ), // HALFWIDTH KATAKANA LETTER SMALL A --> KATAKANA LETTER SMALL A - MAKE_PAIR( 0xFF68, 0x30A3 ), // HALFWIDTH KATAKANA LETTER SMALL I --> KATAKANA LETTER SMALL I - MAKE_PAIR( 0xFF69, 0x30A5 ), // HALFWIDTH KATAKANA LETTER SMALL U --> KATAKANA LETTER SMALL U - MAKE_PAIR( 0xFF6A, 0x30A7 ), // HALFWIDTH KATAKANA LETTER SMALL E --> KATAKANA LETTER SMALL E - MAKE_PAIR( 0xFF6B, 0x30A9 ), // HALFWIDTH KATAKANA LETTER SMALL O --> KATAKANA LETTER SMALL O - MAKE_PAIR( 0xFF6C, 0x30E3 ), // HALFWIDTH KATAKANA LETTER SMALL YA --> KATAKANA LETTER SMALL YA - MAKE_PAIR( 0xFF6D, 0x30E5 ), // HALFWIDTH KATAKANA LETTER SMALL YU --> KATAKANA LETTER SMALL YU - MAKE_PAIR( 0xFF6E, 0x30E7 ), // HALFWIDTH KATAKANA LETTER SMALL YO --> KATAKANA LETTER SMALL YO - MAKE_PAIR( 0xFF6F, 0x30C3 ), // HALFWIDTH KATAKANA LETTER SMALL TU --> KATAKANA LETTER SMALL TU - MAKE_PAIR( 0xFF70, 0x30FC ), // HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK --> KATAKANA-HIRAGANA PROLONGED SOUND MARK - MAKE_PAIR( 0xFF71, 0x30A2 ), // HALFWIDTH KATAKANA LETTER A --> KATAKANA LETTER A - MAKE_PAIR( 0xFF72, 0x30A4 ), // HALFWIDTH KATAKANA LETTER I --> KATAKANA LETTER I - MAKE_PAIR( 0xFF73, 0x30A6 ), // HALFWIDTH KATAKANA LETTER U --> KATAKANA LETTER U - MAKE_PAIR( 0xFF74, 0x30A8 ), // HALFWIDTH KATAKANA LETTER E --> KATAKANA LETTER E - MAKE_PAIR( 0xFF75, 0x30AA ), // HALFWIDTH KATAKANA LETTER O --> KATAKANA LETTER O - MAKE_PAIR( 0xFF76, 0x30AB ), // HALFWIDTH KATAKANA LETTER KA --> KATAKANA LETTER KA - MAKE_PAIR( 0xFF77, 0x30AD ), // HALFWIDTH KATAKANA LETTER KI --> KATAKANA LETTER KI - MAKE_PAIR( 0xFF78, 0x30AF ), // HALFWIDTH KATAKANA LETTER KU --> KATAKANA LETTER KU - MAKE_PAIR( 0xFF79, 0x30B1 ), // HALFWIDTH KATAKANA LETTER KE --> KATAKANA LETTER KE - MAKE_PAIR( 0xFF7A, 0x30B3 ), // HALFWIDTH KATAKANA LETTER KO --> KATAKANA LETTER KO - MAKE_PAIR( 0xFF7B, 0x30B5 ), // HALFWIDTH KATAKANA LETTER SA --> KATAKANA LETTER SA - MAKE_PAIR( 0xFF7C, 0x30B7 ), // HALFWIDTH KATAKANA LETTER SI --> KATAKANA LETTER SI - MAKE_PAIR( 0xFF7D, 0x30B9 ), // HALFWIDTH KATAKANA LETTER SU --> KATAKANA LETTER SU - MAKE_PAIR( 0xFF7E, 0x30BB ), // HALFWIDTH KATAKANA LETTER SE --> KATAKANA LETTER SE - MAKE_PAIR( 0xFF7F, 0x30BD ), // HALFWIDTH KATAKANA LETTER SO --> KATAKANA LETTER SO - MAKE_PAIR( 0xFF80, 0x30BF ), // HALFWIDTH KATAKANA LETTER TA --> KATAKANA LETTER TA - MAKE_PAIR( 0xFF81, 0x30C1 ), // HALFWIDTH KATAKANA LETTER TI --> KATAKANA LETTER TI - MAKE_PAIR( 0xFF82, 0x30C4 ), // HALFWIDTH KATAKANA LETTER TU --> KATAKANA LETTER TU - MAKE_PAIR( 0xFF83, 0x30C6 ), // HALFWIDTH KATAKANA LETTER TE --> KATAKANA LETTER TE - MAKE_PAIR( 0xFF84, 0x30C8 ), // HALFWIDTH KATAKANA LETTER TO --> KATAKANA LETTER TO - MAKE_PAIR( 0xFF85, 0x30CA ), // HALFWIDTH KATAKANA LETTER NA --> KATAKANA LETTER NA - MAKE_PAIR( 0xFF86, 0x30CB ), // HALFWIDTH KATAKANA LETTER NI --> KATAKANA LETTER NI - MAKE_PAIR( 0xFF87, 0x30CC ), // HALFWIDTH KATAKANA LETTER NU --> KATAKANA LETTER NU - MAKE_PAIR( 0xFF88, 0x30CD ), // HALFWIDTH KATAKANA LETTER NE --> KATAKANA LETTER NE - MAKE_PAIR( 0xFF89, 0x30CE ), // HALFWIDTH KATAKANA LETTER NO --> KATAKANA LETTER NO - MAKE_PAIR( 0xFF8A, 0x30CF ), // HALFWIDTH KATAKANA LETTER HA --> KATAKANA LETTER HA - MAKE_PAIR( 0xFF8B, 0x30D2 ), // HALFWIDTH KATAKANA LETTER HI --> KATAKANA LETTER HI - MAKE_PAIR( 0xFF8C, 0x30D5 ), // HALFWIDTH KATAKANA LETTER HU --> KATAKANA LETTER HU - MAKE_PAIR( 0xFF8D, 0x30D8 ), // HALFWIDTH KATAKANA LETTER HE --> KATAKANA LETTER HE - MAKE_PAIR( 0xFF8E, 0x30DB ), // HALFWIDTH KATAKANA LETTER HO --> KATAKANA LETTER HO - MAKE_PAIR( 0xFF8F, 0x30DE ), // HALFWIDTH KATAKANA LETTER MA --> KATAKANA LETTER MA - MAKE_PAIR( 0xFF90, 0x30DF ), // HALFWIDTH KATAKANA LETTER MI --> KATAKANA LETTER MI - MAKE_PAIR( 0xFF91, 0x30E0 ), // HALFWIDTH KATAKANA LETTER MU --> KATAKANA LETTER MU - MAKE_PAIR( 0xFF92, 0x30E1 ), // HALFWIDTH KATAKANA LETTER ME --> KATAKANA LETTER ME - MAKE_PAIR( 0xFF93, 0x30E2 ), // HALFWIDTH KATAKANA LETTER MO --> KATAKANA LETTER MO - MAKE_PAIR( 0xFF94, 0x30E4 ), // HALFWIDTH KATAKANA LETTER YA --> KATAKANA LETTER YA - MAKE_PAIR( 0xFF95, 0x30E6 ), // HALFWIDTH KATAKANA LETTER YU --> KATAKANA LETTER YU - MAKE_PAIR( 0xFF96, 0x30E8 ), // HALFWIDTH KATAKANA LETTER YO --> KATAKANA LETTER YO - MAKE_PAIR( 0xFF97, 0x30E9 ), // HALFWIDTH KATAKANA LETTER RA --> KATAKANA LETTER RA - MAKE_PAIR( 0xFF98, 0x30EA ), // HALFWIDTH KATAKANA LETTER RI --> KATAKANA LETTER RI - MAKE_PAIR( 0xFF99, 0x30EB ), // HALFWIDTH KATAKANA LETTER RU --> KATAKANA LETTER RU - MAKE_PAIR( 0xFF9A, 0x30EC ), // HALFWIDTH KATAKANA LETTER RE --> KATAKANA LETTER RE - MAKE_PAIR( 0xFF9B, 0x30ED ), // HALFWIDTH KATAKANA LETTER RO --> KATAKANA LETTER RO - MAKE_PAIR( 0xFF9C, 0x30EF ), // HALFWIDTH KATAKANA LETTER WA --> KATAKANA LETTER WA - MAKE_PAIR( 0xFF9D, 0x30F3 ), // HALFWIDTH KATAKANA LETTER N --> KATAKANA LETTER N - MAKE_PAIR( 0xFF9E, 0x3099 ), // HALFWIDTH KATAKANA VOICED SOUND MARK --> COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK - MAKE_PAIR( 0xFF9F, 0x309A ) // HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK --> COMBINING KATAKANA- -}; - - -static struct hw_pair aCombine3099[] = -{ - { 0x30a6, 0x30f4 }, - { 0x30ab, 0x30ac }, - { 0x30ad, 0x30ae }, - { 0x30af, 0x30b0 }, - { 0x30b1, 0x30b2 }, - { 0x30b3, 0x30b4 }, - { 0x30b5, 0x30b6 }, - { 0x30b7, 0x30b8 }, - { 0x30b9, 0x30ba }, - { 0x30bb, 0x30bc }, - { 0x30bd, 0x30be }, - { 0x30bf, 0x30c0 }, - { 0x30c1, 0x30c2 }, - { 0x30c4, 0x30c5 }, - { 0x30c6, 0x30c7 }, - { 0x30c8, 0x30c9 }, - { 0x30cf, 0x30d0 }, - { 0x30d2, 0x30d3 }, - { 0x30d5, 0x30d6 }, - { 0x30d8, 0x30d9 }, - { 0x30db, 0x30dc }, - { 0x30ef, 0x30f7 }, - { 0x30f0, 0x30f8 }, - { 0x30f1, 0x30f9 }, - { 0x30f2, 0x30fa }, - { 0x30fd, 0x30fe } -}; - -static struct hw_pair aCombine309A[] = -{ - { 0x30cf, 0x30d1 }, - { 0x30d2, 0x30d4 }, - { 0x30d5, 0x30d7 }, - { 0x30d8, 0x30da }, - { 0x30db, 0x30dd } -}; - -USHORT ImplReplaceFullWidth( sal_Unicode* pString, USHORT nLen ) -{ - sal_Unicode* pRead = pString; - sal_Unicode* pWrite = pRead; - USHORT nNewLen = nLen; - - while( (pRead - pString) < nLen ) - { - if( pWrite != pRead ) - *pWrite = *pRead; - - if( *pRead >= 0xff65 && *pRead <= 0xff9f ) - { - *pWrite = aHWPairs[ *pRead - 0xff65 ].nTo; - - struct hw_pair* pTable = NULL; - int nTableEntries = 0; - if( *pWrite == 0x3099 ) - { - // replace 0x3099 combinations - pTable = aCombine3099; - nTableEntries = sizeof(aCombine3099)/sizeof(aCombine3099[0]); - } - else if( *pWrite == 0x309a ) - { - // replace 0x309a combinations - pTable = aCombine309A; - nTableEntries = sizeof(aCombine309A)/sizeof(aCombine309A[0]); - } - if( pTable ) - { - sal_Unicode c = pWrite[-1]; - for( int i = 0; i < nTableEntries; i++ ) - if( c == pTable[i].nFrom ) - { - pWrite--; - *pWrite = pTable[i].nTo; - nNewLen--; - break; - } - } - } - pRead++; - pWrite++; - } - if( pWrite < pRead ) - *pWrite = 0; - - return nNewLen; -} - -void ConvertHalfwitdhToFullwidth( String& rString ) -{ - USHORT nNewLen = ImplReplaceFullWidth( rString.GetBufferAccess(), rString.Len() ); - rString.ReleaseBufferAccess( nNewLen ); -} diff --git a/transex3/source/inireader.cxx b/transex3/source/inireader.cxx new file mode 100644 index 000000000000..0985e788452d --- /dev/null +++ b/transex3/source/inireader.cxx @@ -0,0 +1,132 @@ +#include +#include +#include +#include +#include +#include "inireader.hxx" + +using namespace std; +namespace transex3 +{ + +bool INIreader::read( INImap& myMap , string& filename ) +{ + ifstream aFStream( filename.c_str() ); + if( aFStream && aFStream.is_open()) + { + string line; + string section; + string param_key; + string param_value; + stringmap* myvalues = 0; + + while( std::getline( aFStream , line ) ) + { + trim( line ); + if( line.empty() ){ + } + else if( is_section( line , section ) ) + { + //cerr << "[" << section << "]\n"; + myvalues = new stringmap(); + myMap[ section ] = myvalues ; + } + else if ( is_parameter( line , param_key , param_value ) ) + { + //cerr << "" << param_key << " = " << param_value << "\n"; + if( myvalues ) + { + (*myvalues)[ param_key ] = param_value ; + } + else + { + cerr << "ERROR: The INI file " << filename << " appears to be broken ... parameters without a section?!?\n"; + if( aFStream.is_open() ) aFStream.close(); + return false; + } + } + } + + if( aFStream.is_open() ) + aFStream.close(); + + return true; + } + else + { + cerr << "ERROR: Can't open file '" << filename << "'\n"; + } + return false; +} + +bool INIreader::is_section( string& line , string& section_str ) +{ + // Error in regex ? + check_status( section_status ); + UnicodeString target( line.c_str() , line.length() ); + + section_match->reset( target ); + check_status( section_status ); + + if( section_match->find() ) + { + check_status( section_status ); + UnicodeString result( section_match->group( 1 , section_status) ); + check_status( section_status ); + toStlString( result , section_str ); + + return true; + } + return false; +} + +bool INIreader::is_parameter( string& line , string& parameter_key , string& parameter_value ) +{ + // Error in regex ? + check_status( parameter_status ); + UnicodeString target( line.c_str() , line.length() ); + + parameter_match->reset( target ); + check_status( parameter_status ); + + if( parameter_match->find() ) + { + check_status( parameter_status ); + + UnicodeString result1( parameter_match->group( 1 , parameter_status) ); + check_status( parameter_status ); + toStlString( result1 , parameter_key ); + UnicodeString result2( parameter_match->group( 2 , parameter_status) ); + check_status( parameter_status ); + toStlString( result2 , parameter_value ); + + return true; + } + return false; +} + +void INIreader::check_status( UErrorCode status ) +{ + if( U_FAILURE( status) ) + { + cerr << "Error in or while using regex: " << u_errorName( status ) << "\n"; + exit(-1); + } +} + +void INIreader::toStlString( const UnicodeString& str , string& stl_str) +{ + // convert to string + char* buffer = new char[ str.length()*3 ]; + str.extract( 0 , str.length() , buffer ); + stl_str = string( buffer ); + delete buffer; +} + +void INIreader::trim( string& str ) +{ + string str1 = str.substr( 0 , str.find_last_not_of(' ') + 1 ); + str = str1.empty() ? str1 : str1.substr( str1.find_first_not_of(' ') ); +} + +} diff --git a/transex3/source/localize.cxx b/transex3/source/localize.cxx index 31420cc58eeb..c82d152cac7e 100644 --- a/transex3/source/localize.cxx +++ b/transex3/source/localize.cxx @@ -33,7 +33,11 @@ #include "srciter.hxx" #include "export.hxx" +#include "treeconfig.hxx" +#include +#include #include +#include #include "tools/errcode.hxx" #include "tools/fsys.hxx" @@ -42,6 +46,8 @@ #include #endif +namespace transex3 +{ // // SourceTreeLocalizer @@ -131,7 +137,6 @@ private: ByteString sLanguageRestriction; - ByteString sIsoCode99; ByteString sOutputFile; bool bQuiet2; @@ -147,8 +152,7 @@ private: void WorkOnFile( const ByteString &rFileName, const ByteString &rExecutable, - const ByteString &rParameter, - const ByteString &rIso + const ByteString &rParameter ); void WorkOnFileType( @@ -156,8 +160,7 @@ private: const ByteString &rExtension, const ByteString &rExecutable, const ByteString &rParameter, - const ByteString &rCollectMode, - const ByteString &rIso + const ByteString &rCollectMode ); void WorkOnDirectory( const ByteString &rDirectory ); BOOL ExecuteMerge(); @@ -175,8 +178,6 @@ public: void SetLanguageRestriction( const ByteString& rRestrictions ) { sLanguageRestriction = rRestrictions; } - void SetIsoCode99( const ByteString& rIsoCode ) - { sIsoCode99 = rIsoCode; } int getFileCnt(); BOOL Extract( const ByteString &rDestinationFile ); BOOL Merge( const ByteString &rSourceFile , const ByteString &rOutput ); @@ -215,16 +216,6 @@ const ByteString SourceTreeLocalizer::GetProjectName( BOOL bAbs ) DirEntry aTest = aCur + DirEntry(PRJ_DIR_NAME) + DirEntry(DLIST_NAME); if ( aTest.Exists() ) { - // HACK !!!!!!!!!!!!!!!!!!!!!!!!!!!!! - if (( ByteString( aCur.GetName(), RTL_TEXTENCODING_ASCII_US ).Equals("webinstall") ) || - ( ByteString( aCur.GetName(), RTL_TEXTENCODING_ASCII_US ).Equals("portal") ) || - ( ByteString( aCur.GetName(), RTL_TEXTENCODING_ASCII_US ).Equals("xulclient") ) || - ( ByteString( aCur.GetName(), RTL_TEXTENCODING_ASCII_US ).Search( "wdk_" ) == 0 )) - return ""; - // end HACK !!!!!!!!!!!!!!!!!!!!!!!!! - - - if ( bAbs ) return ByteString( aCur.GetFull(), RTL_TEXTENCODING_ASCII_US ); else @@ -280,7 +271,7 @@ bool skipProject( ByteString sPrj ) /*****************************************************************************/ void SourceTreeLocalizer::WorkOnFile( const ByteString &rFileName, const ByteString &rExecutable, - const ByteString &rParameter, const ByteString &rIso ) + const ByteString &rParameter ) /*****************************************************************************/ { String sFull( rFileName, RTL_TEXTENCODING_ASCII_US ); @@ -293,52 +284,55 @@ void SourceTreeLocalizer::WorkOnFile( aPath.SetCWD(); ByteString sPrj( GetProjectName()); - //printf ("prj = %s , exe = %s\n", sPrj.GetBuffer() , rExecutable.GetBuffer() ); -// printf("Skip %s = %d \n",sPrj.GetBuffer() , skipProject( sPrj ) ); - //printf("prj = %s\n",sPrj.GetBuffer()); if ( sPrj.Len() && !skipProject( sPrj ) ) { ByteString sRoot( GetProjectRootRel()); - // get temp file DirEntry aTemp( Export::GetTempFile()); ByteString sTempFile( aTemp.GetFull(), RTL_TEXTENCODING_ASCII_US ); - ByteString sExecutable( rExecutable ); + ByteString sDel; #if defined(WNT) || defined(OS2) - sExecutable += ".exe"; - String sPath( Export::GetEnv( "PATH" ), RTL_TEXTENCODING_ASCII_US ); + sDel=ByteString("\\"); #else - String sPath( Export::GetEnv( "LD_LIBRARY_PATH" ), RTL_TEXTENCODING_ASCII_US ); + sDel=ByteString("/"); #endif + ByteString sPath1( Export::GetEnv("SOLARVER") ); + ByteString sPath2( Export::GetEnv("INPATH") ); + ByteString sPath3( "bin" ); + ByteString sPath4( Export::GetEnv("UPDMINOREXT") ); + ByteString sExecutable( sPath1 ); + sExecutable += sDel ; + sExecutable += sPath2 ; + sExecutable += sDel; + sExecutable += sPath3 ; + sExecutable += sPath4 ; + sExecutable += sDel ; + sExecutable += rExecutable ; - DirEntry aExecutable( String( sExecutable, RTL_TEXTENCODING_ASCII_US )); - aExecutable.Find( sPath ); - ByteString sCommand( aExecutable.GetFull(), RTL_TEXTENCODING_ASCII_US ); - sCommand += " "; - sCommand += rParameter; - sCommand += " -p "; - sCommand += sPrj; - sCommand += " -r "; - sCommand += sRoot; - sCommand += " -i "; - sCommand += sFileName; - sCommand += " -o "; - sCommand += sTempFile; - if ( sLanguageRestriction.Len()) { - sCommand += " -l "; - sCommand += getSourceLanguages( sLanguageRestriction , sCommand ); - } - if ( rIso.Equals("iso") && sIsoCode99.Len()) { - sCommand += " -ISO99 "; - sCommand += sIsoCode99; - } - if( bQuiet2 ){ + ByteString sCommand( sExecutable ); + sCommand += " "; + sCommand += rParameter; + sCommand += " -p "; + sCommand += sPrj; + sCommand += " -r "; + sCommand += sRoot; + sCommand += " -i "; + sCommand += sFileName; + sCommand += " -o "; + sCommand += sTempFile; + if ( sLanguageRestriction.Len()) { + sCommand += " -l "; + sCommand += getSourceLanguages( sLanguageRestriction , sCommand ); + } + + if( bQuiet2 ){ sCommand +=" -QQ "; } //printf("DBG: %s\n",sCommand.GetBuffer()); - system( sCommand.GetBuffer()); + if (system(sCommand.GetBuffer()) == -1) + fprintf(stderr, "%s failed\n", sCommand.GetBuffer()); nFileCnt++; printf("."); fflush( stdout ); @@ -434,7 +428,7 @@ BOOL SourceTreeLocalizer::CheckPositiveList( const ByteString &rFileName ) void SourceTreeLocalizer::WorkOnFileType( const ByteString &rDirectory, const ByteString &rExtension, const ByteString &rExecutable, const ByteString &rParameter, - const ByteString &rCollectMode, const ByteString &rIso + const ByteString &rCollectMode ) /*****************************************************************************/ { @@ -458,7 +452,7 @@ void SourceTreeLocalizer::WorkOnFileType( bAllowed = CheckPositiveList( sFile ); if ( bAllowed ) - WorkOnFile( sFile, rExecutable, rParameter, rIso ); + WorkOnFile( sFile, rExecutable, rParameter ); } } @@ -472,7 +466,6 @@ void SourceTreeLocalizer::WorkOnDirectory( const ByteString &rDirectory ) ByteString sExecutable( ExeTable[ nIndex ][ 1 ] ); ByteString sParameter( ExeTable[ nIndex ][ 2 ] ); ByteString sCollectMode( ExeTable[ nIndex ][ 3 ] ); - ByteString sIso( ExeTable[ nIndex ][ 4 ] ); while( !sExtension.Equals( "NULL" )) { WorkOnFileType( @@ -480,8 +473,7 @@ void SourceTreeLocalizer::WorkOnDirectory( const ByteString &rDirectory ) sExtension, sExecutable, sParameter, - sCollectMode, - sIso + sCollectMode ); nIndex++; @@ -490,7 +482,6 @@ void SourceTreeLocalizer::WorkOnDirectory( const ByteString &rDirectory ) sExecutable = ExeTable[ nIndex ][ 1 ]; sParameter = ExeTable[ nIndex ][ 2 ]; sCollectMode = ExeTable[ nIndex ][ 3 ]; - sIso = ExeTable[ nIndex ][ 4 ]; } } @@ -509,12 +500,13 @@ BOOL SourceTreeLocalizer::Extract( const ByteString &rDestinationFile ) /*****************************************************************************/ { nMode = LOCALIZE_EXTRACT; - aSDF.Open( String( rDestinationFile, RTL_TEXTENCODING_ASCII_US ), - STREAM_STD_WRITE | STREAM_TRUNC ); + + aSDF.Open( String( rDestinationFile , RTL_TEXTENCODING_ASCII_US ) , STREAM_STD_WRITE ); aSDF.SetLineDelimiter( LINEEND_CRLF ); BOOL bReturn = aSDF.IsOpen(); if ( bReturn ) { + aSDF.Seek( STREAM_SEEK_TO_END ); bReturn = StartExecute(); aSDF.Close(); } @@ -522,6 +514,7 @@ BOOL SourceTreeLocalizer::Extract( const ByteString &rDestinationFile ) printf("ERROR: Can't create file %s\n", rDestinationFile.GetBuffer() ); } nMode = LOCALIZE_NONE; + aSDF.Close(); return bReturn; } @@ -561,8 +554,6 @@ BOOL SourceTreeLocalizer::MergeSingleFile( while( !sCandidate.Equals ("NULL") && !sCandidate.Equals(sExtension) ) sCandidate = ExeTable[ ++nIndex ][ 0 ]; - ByteString sIso( ExeTable[ nIndex ][ 4 ] ); - if ( !sCandidate.Equals( "NULL" ) ) { if( !aEntry.Exists()) { DirEntryKind theDir=FSYS_KIND_FILE; @@ -598,10 +589,6 @@ BOOL SourceTreeLocalizer::MergeSingleFile( sCommand += sOutput; sCommand += " "; sCommand += ByteString( ExeTable[ nIndex ][ 2 ] ); - if ( sIso.Equals( "iso" ) && sIsoCode99.Len()) { - sCommand += " -ISO99 "; - sCommand += sIsoCode99; - } if ( sLanguageRestriction.Len()) { sCommand += " -l "; sCommand += sLanguageRestriction; @@ -614,7 +601,8 @@ BOOL SourceTreeLocalizer::MergeSingleFile( DirEntry aOldCWD; aPath.SetCWD(); - system( sCommand.GetBuffer()); + if (system(sCommand.GetBuffer()) == -1) + fprintf(stderr, "%s failed\n", sCommand.GetBuffer()); nFileCnt++; printf("."); //if( bQuiet2 ){ printf("."); } @@ -698,7 +686,6 @@ BOOL SourceTreeLocalizer::ExecuteMerge( ) ByteString sBDel( sDel.GetBuffer() , sDel.Len() , RTL_TEXTENCODING_UTF8 ); if( bLocal ){ xub_StrLen nPos = sOutputFileName.SearchBackward( sBDel.GetChar(0) ); - //if( nPos >= 0 ) sOutputFileName = sOutputFileName.Copy( nPos+1 , sOutputFileName.Len()-nPos-1 ); } ByteStringBoolHashMap aFileHM; @@ -711,7 +698,6 @@ BOOL SourceTreeLocalizer::ExecuteMerge( ) aFileHM[sFileName]=true; } - // RECODE THIS !!!!!!!!!!!!!!!!!!!!! for( ByteStringBoolHashMap::iterator iter = aFileHM.begin(); iter != aFileHM.end(); ++iter ){ sFileKey = iter->first; aSDF.Seek( 0 ); @@ -748,7 +734,6 @@ BOOL SourceTreeLocalizer::ExecuteMerge( ) bMerged = true; if ( !MergeSingleFile( sPrj, sFile, sSDFFile )) bReturn = FALSE; - //} }else{ bMerged = true; //printf("MergeSingleFile('%s','%s','%s')\n",sPrj.GetBuffer(),sFile.GetBuffer(),sSDFFile.GetBuffer()); @@ -757,7 +742,6 @@ BOOL SourceTreeLocalizer::ExecuteMerge( ) } } } - //} aEntry.Kill(); // If Outputfile not included in the SDF file copy it without merge @@ -784,13 +768,15 @@ BOOL SourceTreeLocalizer::Merge( const ByteString &rSourceFile , const ByteStrin BOOL bReturn = aSDF.IsOpen(); if ( bReturn ) { bReturn = ExecuteMerge(); - aSDF.Close(); +// aSDF.Close(); } - + aSDF.Close(); nMode = LOCALIZE_NONE; return bReturn; } +} +using namespace transex3; #define STATE_NONE 0x0000 #define STATE_EXPORT 0x0001 @@ -810,13 +796,11 @@ void Help() fprintf( stdout, "As part of the L10N framework, localize extracts and merges translations\n" "out of and into the whole source tree.\n\n" - "Syntax: localize -e|-m -l l1[=f1][,l2[=f2]][...] -f FileName [-QQ][-skip_links]\n" + "Syntax: localize -e -l en-US -f FileName [-QQ]\n" "Parameter:\n" "\t-e: Extract mode\n" - "\t-m: Merge mode\n" "\tFileName: Output file when extract mode, input file when merge mode\n" "\tl1...ln: supported languages (\"all\" for all languages).\n" - "\tf1...fn: fallback languages for supported languages\n" "\tQQ: quiet output)" ); @@ -825,16 +809,9 @@ void Help() fprintf( stdout, "\nExample 1:\n" "==========\n" - "localize -e -l en-US,de -f MyFile\n\n" + "localize -e -l en-US -f MyFile\n\n" "All strings will be extracted for language de and language en-US.\n" ); - fprintf( stdout, - "\nExample 2:\n" - "==========\n" - "localize -m -l es -f MyFile\n\n" - "All strings in MyFile will be merged into language es in the\n" - "source code.\n" - ); } /*****************************************************************************/ @@ -871,11 +848,13 @@ int _cdecl main( int argc, char *argv[] ) bool bQuiet2 = false; bool bSkipLinks = false; - ByteString sIsoCode; ByteString sLanguages; ByteString sFileName; ByteString sOutput; + bQuiet2 = true; + bExport = TRUE; + for( int i = 1; i < argc; i++ ) { ByteString sSwitch( argv[ i ] ); sSwitch.ToUpperAscii(); @@ -886,12 +865,6 @@ int _cdecl main( int argc, char *argv[] ) return Error(); bExport = TRUE; } - else if ( sSwitch.Equals( "-M" )) { - nState = STATE_MERGE; - if ( bExport ) - return Error(); - bMerge = TRUE; - } else if( sSwitch.Equals( "-Q" )) { bQuiet = true; } @@ -903,20 +876,12 @@ int _cdecl main( int argc, char *argv[] ) nState = STATE_FILENAME; else if ( sSwitch.Equals( "-QQ" )) bQuiet2 = true; - // else if ( ByteString( argv[ i ]).ToUpperAscii().Equals( "-SKIP_LINKS" )) - // bSkipLinks = true; else if ( ByteString( argv[ i ]).ToUpperAscii().Equals( "-O" ) ) nState = STATE_OUTPUT; else { switch ( nState ) { case STATE_NONE: return Error(); - case STATE_ISOCODE: - if ( sIsoCode.Len()) - return Error(); - sIsoCode = ByteString( argv[ i ] ); - nState = STATE_NONE; - break; case STATE_OUTPUT: if ( sOutput.Len()) return Error(); @@ -945,12 +910,10 @@ int _cdecl main( int argc, char *argv[] ) return 1; } - ByteString sRoot( Export::GetEnv( "SRC_ROOT" )); - DirEntry aRoot( String( sRoot, RTL_TEXTENCODING_ASCII_US )); - sRoot = ByteString( aRoot.GetFull(), RTL_TEXTENCODING_ASCII_US ); + ByteString sSolarVer( Export::GetEnv( "WORK_STAMP" )); ByteString sVersion( Export::GetEnv( "WORK_STAMP" )); - if ( !sRoot.Len() || !sVersion.Len()) { + if ( !sSolarVer.Len() || !sVersion.Len()) { fprintf( stderr, "ERROR: No environment set!\n" ); return 1; } @@ -963,55 +926,46 @@ int _cdecl main( int argc, char *argv[] ) return 3; } - ByteString sMode( "merge" ); - if ( bExport ) - sMode = "extract"; + DirEntry aEntry( String( sFileName , RTL_TEXTENCODING_ASCII_US )); + aEntry.ToAbs(); + String sFullEntry = aEntry.GetFull(); + ByteString sFileABS( aEntry.GetFull(), gsl_getSystemTextEncoding()); + //printf("B %s\nA %s\n",rDestinationFile.GetBuffer(), sFile.GetBuffer()); + sFileName = sFileABS; - ByteString sICode( sIsoCode ); - if ( !sICode.Len()) - sICode = "not given, support for language 99 disabled"; - if(!bQuiet && !bQuiet2 ){ - fprintf( stdout, - "\n" - "============================================================\n" - "Current settings:\n" - "============================================================\n" - "Mode: %s\n" - "Workspace: %s\n" - "Source tree: %s\n" - "Languages: %s\n" - "ISO code (99): %s\n" - "Filename: %s\n" - "Outputfile %s\n" - "============================================================\n" - "\n" - , - sMode.GetBuffer(), - sVersion.GetBuffer(), - sRoot.GetBuffer(), - sLanguages.GetBuffer(), - sICode.GetBuffer(), - sFileName.GetBuffer(), - sOutput.GetBuffer() - ); + Treeconfig treeconfig; + vector repos; + bool hasPwd = treeconfig.getActiveRepositories( repos ); + if( hasPwd ) cout << "Found special path!\n"; + + // localize through all repositories + for( vector::iterator iter = repos.begin(); iter != repos.end() ; ++iter ) + { + string curRepository = string( Export::GetEnv("SOURCE_ROOT_DIR") ) + "/" + *iter; + cout << "Localizing repository " << curRepository << "\n"; + SourceTreeLocalizer aIter( ByteString( curRepository.c_str() ) , sVersion , (sOutput.Len() > 0) , bQuiet2 , bSkipLinks ); + aIter.SetLanguageRestriction( sLanguages ); + if ( bExport ){ + if( bQuiet2 ){ /*printf("");*/fflush( stdout );} + aIter.Extract( sFileName ); + if( bQuiet2 ){ printf("\n %d files found!\n",aIter.GetFileCnt());} + } } - SourceTreeLocalizer aIter( sRoot, sVersion , (sOutput.Len() > 0) , bQuiet2 , bSkipLinks ); + if( hasPwd ) + { + string pwd; + Export::getCurrentDir( pwd ); + cout << "Localizing repository " << pwd << "\n"; + SourceTreeLocalizer aIter( ByteString( pwd.c_str() ) , sVersion , (sOutput.Len() > 0) , bQuiet2 , bSkipLinks ); + aIter.SetLanguageRestriction( sLanguages ); + if ( bExport ){ + if( bQuiet2 ){ /*printf("");*/fflush( stdout );} + aIter.Extract( sFileName ); + if( bQuiet2 ){ printf("\n %d files found!\n",aIter.GetFileCnt());} + } - aIter.SetLanguageRestriction( sLanguages ); - aIter.SetIsoCode99( sIsoCode ); - if ( bExport ){ - if( bQuiet2 ){ /*printf("");*/fflush( stdout );} - aIter.Extract( sFileName ); - if( bQuiet2 ){ printf("\n %d files found!\n",aIter.GetFileCnt());} - } - else { - - DirEntry aEntry( String( sFileName, RTL_TEXTENCODING_ASCII_US )); - if ( !aEntry.Exists()) - return FALSE; - printf("%s\n",sFileName.GetBuffer()); - aIter.Merge( sFileName , sOutput ); } return 0; } + diff --git a/transex3/source/makefile.mk b/transex3/source/makefile.mk index 68b94a5b58fa..a557b210aad0 100644 --- a/transex3/source/makefile.mk +++ b/transex3/source/makefile.mk @@ -61,8 +61,8 @@ OBJFILES= \ $(OBJ)$/helpmerge.obj \ $(OBJ)$/helpex.obj \ $(OBJ)$/file.obj \ - $(OBJ)$/directory.obj \ - $(OBJ)$/hw2fw.obj + $(OBJ)$/directory.obj + LIB1TARGET= $(LB)$/$(TARGET).lib LIB1ARCHIV= $(LB)$/libtransex.a @@ -73,8 +73,8 @@ LIB1OBJFILES= $(OBJ)$/export.obj \ $(OBJ)$/srciter.obj \ $(OBJ)$/file.obj \ $(OBJ)$/directory.obj \ - $(OBJ)$/utf8conv.obj \ - $(OBJ)$/hw2fw.obj + $(OBJ)$/utf8conv.obj + APP1VERSIONMAP=exports.map @@ -96,7 +96,7 @@ APP1LIBS+= $(LB)$/$(TARGET).lib APP1DEPN= $(OBJ)$/src_yy_wrapper.obj $(LB)$/$(TARGET).lib APP2TARGET= helpex -APP2OBJS= $(OBJ)$/helpmerge.obj $(OBJ)$/xmlparse.obj $(OBJ)$/export2.obj $(OBJ)$/utf8conv.obj $(OBJ)$/merge.obj $(OBJ)$/helpex.obj $(OBJ)$/hw2fw.obj +APP2OBJS= $(OBJ)$/helpmerge.obj $(OBJ)$/xmlparse.obj $(OBJ)$/export2.obj $(OBJ)$/utf8conv.obj $(OBJ)$/merge.obj $(OBJ)$/helpex.obj APP2RPATH= NONE .IF "$(OS)"!="MACOSX" @@ -110,7 +110,7 @@ APP2STDLIBS+=$(SALLIB) $(EXPATASCII3RDLIB) $(TOOLSLIB) $(VOSLIB) # extractor and merger for *.lng and *.lng APP3TARGET= ulfex -APP3OBJS= $(OBJ)$/lngmerge.obj $(OBJ)$/hw2fw.obj $(OBJ)$/merge.obj $(OBJ)$/export2.obj $(OBJ)$/lngex.obj $(OBJ)$/utf8conv.obj +APP3OBJS= $(OBJ)$/lngmerge.obj $(OBJ)$/merge.obj $(OBJ)$/export2.obj $(OBJ)$/lngex.obj $(OBJ)$/utf8conv.obj APP3RPATH= NONE .IF "$(OS)"!="MACOSX" @@ -142,7 +142,7 @@ APP5STDLIBS+= \ # extractor and merger for *.cfg APP6TARGET= cfgex -APP6OBJS= $(OBJ)$/cfgmerge.obj $(OBJ)$/cfg_yy_wrapper.obj $(OBJ)$/hw2fw.obj $(OBJ)$/merge.obj $(OBJ)$/export2.obj $(OBJ)$/utf8conv.obj +APP6OBJS= $(OBJ)$/cfgmerge.obj $(OBJ)$/cfg_yy_wrapper.obj $(OBJ)$/merge.obj $(OBJ)$/export2.obj $(OBJ)$/utf8conv.obj .IF "$(OS)"!="MACOSX" #APP6STDLIBS+= $(BTSTRPLIB) @@ -159,7 +159,7 @@ APP6STDLIBS+= \ # extractor and merger for *.xrm APP7TARGET= xrmex -APP7OBJS= $(OBJ)$/xrmmerge.obj $(OBJ)$/xrm_yy_wrapper.obj $(OBJ)$/hw2fw.obj $(OBJ)$/merge.obj $(OBJ)$/export2.obj $(OBJ)$/utf8conv.obj +APP7OBJS= $(OBJ)$/xrmmerge.obj $(OBJ)$/xrm_yy_wrapper.obj $(OBJ)$/merge.obj $(OBJ)$/export2.obj $(OBJ)$/utf8conv.obj APP7RPATH= NONE .IF "$(OS)"!="MACOSX" @@ -174,21 +174,23 @@ APP7STDLIBS+= \ # static libs at end for OS X .ENDIF -# encoding converter for text files -APP8TARGET= txtconv -#APP8STACK= 16000 -APP8OBJS= $(OBJ)$/utf8conv.obj $(OBJ)$/txtconv.obj $(OBJ)$/hw2fw.obj -APP8STDLIBS=$(TOOLSLIB) $(SALLIB) +# +#APP8TARGET= treeconfig +#APP8OBJS= $(OBJ)$/treeconfig.obj $(OBJ)$/inireader.obj $(OBJ)$/export2.obj +#APP8STDLIBS=$(TOOLSLIB) $(SALLIB) $(VOSLIB) $(ICUINLIB) $(STLPORT) # localizer for l10n framework APP9TARGET= localize_sl EXCEPTIONSFILES= \ $(OBJ)$/localize.obj -APP9OBJS= $(OBJ)$/localize.obj $(OBJ)$/utf8conv.obj $(OBJ)$/srciter.obj $(OBJ)$/export2.obj $(OBJ)$/file.obj $(OBJ)$/directory.obj +APP9OBJS= $(OBJ)$/localize.obj $(OBJ)$/utf8conv.obj $(OBJ)$/srciter.obj $(OBJ)$/export2.obj $(OBJ)$/file.obj $(OBJ)$/directory.obj $(OBJ)$/treeconfig.obj $(OBJ)$/inireader.obj APP9STDLIBS+= \ $(TOOLSLIB) \ $(VOSLIB) \ + $(ICUINLIB) \ + $(ICUUCLIB) \ + $(STLPORTLIB) \ $(SALLIB) DEPOBJFILES=$(APP1OBJS) $(APP2OBJS) $(APP3OBJS) $(APP4OBJS) $(APP5OBJS) $(APP6OBJS) $(APP7OBJS) $(APP8OBJS) $(APP9OBJS) diff --git a/transex3/source/merge.cxx b/transex3/source/merge.cxx index 3546d7e3accd..ee0f6f459655 100644 --- a/transex3/source/merge.cxx +++ b/transex3/source/merge.cxx @@ -7,7 +7,7 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: merge.cxx,v $ - * $Revision: 1.29 $ + * $Revision: 1.27.36.3 $ * * This file is part of OpenOffice.org. * @@ -210,38 +210,39 @@ MergeDataFile::MergeDataFile( const ByteString &rFileName, const ByteString& sFi ByteString sTEXT; ByteString sQHTEXT; ByteString sTITLE; + ByteString sHACK("HACK"); const ByteString sEmpty(""); if( !aInputStream.IsOpen() ) { - printf("ERROR : Can't open %s\n", rFileName.GetBuffer()); - exit( -1 ); + printf("Warning : Can't open %s\n", rFileName.GetBuffer()); + //exit( -1 ); + return; } while ( !aInputStream.IsEof()) { + xub_StrLen nToks; aInputStream.ReadLine( sLine ); sLine = sLine.Convert( RTL_TEXTENCODING_MS_1252, aCharSet ); - if ( sLine.GetTokenCount( '\t' ) == 15 ) { + nToks = sLine.GetTokenCount( '\t' ); + if ( nToks == 15 ) { // Skip all wrong filenames ByteString filename = sLine.GetToken( 1 , '\t' ); filename = filename.Copy( filename.SearchCharBackward( "\\" )+1 , filename.Len() ); if( sFile.Equals( sEmpty ) || ( !sFile.Equals( sEmpty ) && filename.Equals( sFile ) ) ) { - sTYP = sLine.GetToken( 3, '\t' ); - sGID = sLine.GetToken( 4, '\t' ); - sLID = sLine.GetToken( 5, '\t' ); - sPFO = sLine.GetToken( 7, '\t' ); - sPFO = ByteString("HACK"); - nLANG = sLine.GetToken( 9, '\t' ); + xub_StrLen rIdx = 0; + sTYP = sLine.GetToken( 3, '\t', rIdx ); + sGID = sLine.GetToken( 0, '\t', rIdx ); // 4 + sLID = sLine.GetToken( 0, '\t', rIdx ); // 5 + sPFO = sLine.GetToken( 1, '\t', rIdx ); // 7 + sPFO = sHACK; + nLANG = sLine.GetToken( 1, '\t', rIdx ); // 9 + sTEXT = sLine.GetToken( 0, '\t', rIdx ); // 10 - sTEXT = sLine.GetToken( 10, '\t' ); - // printf("%s\n",sTEXT.GetBuffer()); - // Quote( sTEXT ); - // printf("%s\n",sTEXT.GetBuffer()); - - sQHTEXT = sLine.GetToken( 12, '\t' ); - sTITLE = sLine.GetToken( 13, '\t' ); + sQHTEXT = sLine.GetToken( 1, '\t', rIdx ); // 12 + sTITLE = sLine.GetToken( 0, '\t', rIdx ); // 13 nLANG.EraseLeadingAndTrailingChars(); @@ -250,20 +251,22 @@ MergeDataFile::MergeDataFile( const ByteString &rFileName, const ByteString& sFi #else if ( !nLANG.EqualsIgnoreCaseAscii("en-US") ){ #endif - InsertEntry( sTYP, sGID, sLID, sPFO, nLANG, sTEXT, sQHTEXT, sTITLE , filename , bCaseSensitive ); - if( nLANG.Len() > 0 ){ - bool bFound = false; - for( unsigned int x = 0; x < aLanguages.size(); x++ ){ - if( aLanguages[ x ].Equals( nLANG ) ) - bFound = true; - } + ByteStringHashMap::const_iterator lit; + lit = aLanguageMap.find (nLANG); + ByteString aLANG; + if (lit == aLanguageMap.end()) { + aLANG = nLANG; + aLanguageMap.insert( ByteStringHashMap::value_type( aLANG, aLANG ) ); // Remember read languages for -l all switch - if( !bFound ) aLanguages.push_back( nLANG ); - } + aLanguageList.push_back( nLANG ); + } else + aLANG = lit->first; + + InsertEntry( sTYP, sGID, sLID, sPFO, aLANG, sTEXT, sQHTEXT, sTITLE , filename , bCaseSensitive ); } } } - else if ( sLine.GetTokenCount( '\t' ) == 10 ){ + else if ( nToks == 10 ) { printf("ERROR: File format is obsolete and no longer supported!\n"); } } @@ -286,7 +289,7 @@ ByteString MergeDataFile::Dump(){ ByteString sRet( "MergeDataFile\n" ); //sRet.Append( Export::DumpMap( "aLanguageSet" , aLanguageSet ) ); - //sRet.Append( Export::DumpMap( "aLanguages" , aLanguages ) ); + //sRet.Append( Export::DumpMap( "aLanguageList" , aLanguageList ) ); printf("MergeDataFile\n"); MergeDataHashMap::const_iterator idbg; for( idbg = aMap.begin() ; idbg != aMap.end(); ++idbg ){ @@ -318,7 +321,7 @@ void MergeDataFile::WriteError( const ByteString &rLine ) fprintf( stderr, "%s\n", rLine.GetBuffer()); } std::vector MergeDataFile::GetLanguages(){ - return aLanguages; + return aLanguageList; } /*****************************************************************************/ @@ -379,23 +382,32 @@ void MergeDataFile::InsertEntry( const ByteString &rLID, const ByteString &rPFO, const ByteString &nLANG, const ByteString &rTEXT, const ByteString &rQHTEXT, const ByteString &rTITLE , - const ByteString &rFilename , bool bCaseSensitive + const ByteString &rInFilename , bool bCaseSensitive ) /*****************************************************************************/ { MergeData *pData; BOOL bFound = FALSE; + // uniquify the filename to save memory. + ByteStringHashMap::const_iterator fit = aFilenames.find (rInFilename); + ByteString aFilename; + if (fit == aFilenames.end()) { + aFilename = rInFilename; + aFilenames.insert (ByteStringHashMap::value_type (aFilename, aFilename)); + } else + aFilename = fit->first; + // search for MergeData - ByteString sKey = CreateKey( rTYP , rGID , rLID , rFilename , bCaseSensitive ); - ByteString sKey2; - - if( aMap.find( sKey ) != aMap.end() ){ - pData = aMap[ sKey ]; + ByteString sKey = CreateKey( rTYP , rGID , rLID , aFilename , bCaseSensitive ); + MergeDataHashMap::const_iterator mit; + mit = aMap.find( sKey ); + if( mit != aMap.end() ){ + pData = mit->second; }else{ - pData = new MergeData( rTYP, rGID, rLID , rFilename ); - aMap.insert( MergeDataHashMap::value_type( CreateKey( rTYP , rGID , rLID , rFilename , bCaseSensitive ) , pData ) ); + pData = new MergeData( rTYP, rGID, rLID, aFilename ); + aMap.insert( MergeDataHashMap::value_type( sKey, pData ) ); } bFound = FALSE; diff --git a/transex3/source/treeconfig.cxx b/transex3/source/treeconfig.cxx new file mode 100644 index 000000000000..137492c39a50 --- /dev/null +++ b/transex3/source/treeconfig.cxx @@ -0,0 +1,128 @@ +#include +#include +#include +#include "treeconfig.hxx" +#include "export.hxx" +#ifdef WNT +#include +#include +#else +#include +#endif +#include +#include +#include +#include + +using namespace std; + +namespace transex3 +{ + +bool Treeconfig::parseConfig(){ + + string source_config_file = string( static_cast( Export::GetEnv("SOURCE_ROOT_DIR") ).GetBuffer() ); + if( source_config_file.empty() ) + { + cerr << "Error: no suitable environment set?!?"; + exit( -1 ); + } + source_config_file += string("/source_config"); + if( isConfigFilePresent() ) + { + inireader.read( map , source_config_file ); + return true; + } + else return false; +} + +// ALWAYS add all repositories from source_config file to the container active_repos +// if a config_file is present ALWAYS return false +// if you are in the root of a repository also add it to the container active_repos +// if you are far inside a repository /my/path/ooo/sw/source then don't add it to the container but return true +// if you are in some misc place like /tmp then return true +// => the application can decide what to do in case the function returns true thus how to handle pwd() path +bool Treeconfig::getActiveRepositories( vector& active_repos ){ + + bool isPresent = isConfigFilePresent(); + bool hasPath = false; + string pwd; + string guessedRepo; + Export::getCurrentDir( pwd ); + string source_root = Export::GetEnv( "SOURCE_ROOT_DIR" ); + string solarsrc = Export::GetEnv( "SOLARSRC" ); + string partial; + + // if we are inside of a repository root then active it otherwise let the app handle the return! + string::size_type pos = pwd.find_first_of( source_root ); + if( pos != string::npos && ( pos + source_root.length() +1 ) < pwd.length()){ // I am within SOURCE_ROOT_DIR + partial = pwd.substr( pos + source_root.length() +1 , pwd.length()); + string::size_type nextPart = partial.find_first_of( "/" ); + if( nextPart != string::npos ) + hasPath = true; + else + guessedRepo = partial; + } + else // I am NOT within SOURCE_ROOT_DIR + hasPath = true; + + if( isPresent ) + { + hasPath = false; // if config_file is present don't care about pwd + stringmap* repos = static_cast( map[ string("repositories") ] ); + if( repos != 0 ) + { + for( stringmap::iterator iter = repos->begin() ; iter != repos->end() ; ++iter ) + { + if( static_cast( iter->second ) == string( "active" ) ) + { + active_repos.push_back( iter->first ); + if( static_cast( iter->first ) == guessedRepo ) + { + guessedRepo.clear(); // don't add double in case it is present in config_file + } + } + } + } + else + { + cerr << "Error: source_config files doesn't contain a 'repositories' section ?!?"; + exit( -1 ); + } + } + if( !guessedRepo.empty() ){ + active_repos.push_back( guessedRepo ); // add myrepo + } + return hasPath; // are we deep inside of a source tree or outside of SOURCE_ROOT_DIR? +} + +void Treeconfig::getCurrentDir( string& dir ) +{ + char buffer[64000]; + if( getcwd( buffer , sizeof( buffer ) ) == 0 ){ + cerr << "Error: getcwd failed!\n"; + exit( -1 ); + } + dir = string( buffer ); +} + +bool Treeconfig::isConfigFilePresent() +{ + string config_file = Export::GetEnv( "SOURCE_ROOT_DIR" ); + config_file += "/source_config"; + + struct stat status; + if( stat( config_file.c_str() , &status ) < 0 ) + { + return false; + } +#ifdef WNT + return ( status.st_mode & _S_IFREG ) && ( _access( config_file.c_str() , 4 ) >= 0 ) ; +#else + return ( status.st_mode & S_IFREG ) && ( access( config_file.c_str() , R_OK ) >= 0 ) ; +#endif +} + + + +} diff --git a/transex3/source/txtconv.cxx b/transex3/source/txtconv.cxx deleted file mode 100644 index 2f442b80a83d..000000000000 --- a/transex3/source/txtconv.cxx +++ /dev/null @@ -1,168 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: txtconv.cxx,v $ - * $Revision: 1.8 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_transex3.hxx" -#include -#include -#include - -// local includes -#include "utf8conv.hxx" - -extern void ConvertHalfwitdhToFullwidth( String& rString ); - -/*****************************************************************************/ -void Help() -/*****************************************************************************/ -{ - fprintf( stdout, "\n" ); - fprintf( stdout, "txtconv (c)2001 by StarOffice Entwicklungs GmbH\n" ); - fprintf( stdout, "===============================================\n" ); - fprintf( stdout, "\n" ); - fprintf( stdout, "txtconv converts textfiles from or to UTF-8\n" ); - fprintf( stdout, "\n" ); - fprintf( stdout, "Syntax: txtconv -t|-f charset filename (destinationfile)\n" ); - fprintf( stdout, "Switches: -t => conversion from charset to UTF-8\n" ); - fprintf( stdout, " -f => conversion from UTF-8 to charset\n" ); - fprintf( stdout, "\n" ); - fprintf( stdout, "Allowed charsets:\n" ); - fprintf( stdout, " MS_932 => Japanese\n" ); - fprintf( stdout, " MS_936 => Chinese Simplified\n" ); - fprintf( stdout, " MS_949 => Korean\n" ); - fprintf( stdout, " MS_950 => Chinese Traditional\n" ); - fprintf( stdout, " MS_1250 => East Europe\n" ); - fprintf( stdout, " MS_1251 => Cyrillic\n" ); - fprintf( stdout, " MS_1252 => West Europe\n" ); - fprintf( stdout, " MS_1253 => Greek\n" ); - fprintf( stdout, " MS_1254 => Turkish\n" ); - fprintf( stdout, " MS_1255 => Hebrew\n" ); - fprintf( stdout, " MS_1256 => Arabic\n" ); - fprintf( stdout, " HW2FW => Only with -t, converts half to full width katakana" ); - fprintf( stdout, "\n" ); -} - -/*****************************************************************************/ -#if defined(UNX) || defined(OS2) -int main( int argc, char *argv[] ) -#else -int _cdecl main( int argc, char *argv[] ) -#endif -/*****************************************************************************/ -{ - if (( argc != 4 ) && ( argc != 5 )) { - Help(); - exit ( 0 ); - } - - if ( ByteString( argv[ 1 ] ) == "-t" || ByteString( argv[ 1 ] ) == "-f" ) { - rtl_TextEncoding nEncoding = RTL_TEXTENCODING_MS_1252; - - BOOL bHW2FW = FALSE; - - ByteString sCharset( argv[ 2 ] ); - sCharset.ToUpperAscii(); - - if ( sCharset == "MS_932" ) nEncoding = RTL_TEXTENCODING_MS_932; - else if ( sCharset == "MS_936" ) nEncoding = RTL_TEXTENCODING_MS_936; - else if ( sCharset == "MS_949" ) nEncoding = RTL_TEXTENCODING_MS_949; - else if ( sCharset == "MS_950" ) nEncoding = RTL_TEXTENCODING_MS_950; - else if ( sCharset == "MS_1250" ) nEncoding = RTL_TEXTENCODING_MS_1250; - else if ( sCharset == "MS_1251" ) nEncoding = RTL_TEXTENCODING_MS_1251; - else if ( sCharset == "MS_1252" ) nEncoding = RTL_TEXTENCODING_MS_1252; - else if ( sCharset == "MS_1253" ) nEncoding = RTL_TEXTENCODING_MS_1253; - else if ( sCharset == "MS_1254" ) nEncoding = RTL_TEXTENCODING_MS_1254; - else if ( sCharset == "MS_1255" ) nEncoding = RTL_TEXTENCODING_MS_1255; - else if ( sCharset == "MS_1256" ) nEncoding = RTL_TEXTENCODING_MS_1256; - else if ( sCharset == "MS_1257" ) nEncoding = RTL_TEXTENCODING_MS_1257; - else if (( sCharset == "HW2FW" ) && ( ByteString( argv[ 1 ] ) == "-t" )) bHW2FW = TRUE; - - else { - Help(); - exit ( 1 ); - } - - DirEntry aSource = DirEntry( String( argv[ 3 ], RTL_TEXTENCODING_ASCII_US )); - if ( !aSource.Exists()) { - fprintf( stderr, "\nERROR: File %s not found!\n\n", ByteString( argv[ 3 ] ).GetBuffer()); - exit ( 2 ); - } - - String sOutput; - SvFileStream aOutput; - if ( argc == 5 ) { - sOutput= String( argv[ 4 ], RTL_TEXTENCODING_ASCII_US ); - aOutput.Open( sOutput, STREAM_STD_WRITE | STREAM_TRUNC ); - if ( !aOutput.IsOpen()) { - fprintf( stderr, "\nERROR: Could not open output file %s!\n\n", argv[ 4 ]); - exit ( 3 ); - } - } - - String sGSI( argv[ 3 ], RTL_TEXTENCODING_ASCII_US ); - SvFileStream aGSI( sGSI, STREAM_STD_READ ); - if ( !aGSI.IsOpen()) { - fprintf( stderr, "\nERROR: Could not open input file %s!\n\n", argv[ 3 ]); - exit ( 3 ); - } - - ByteString sGSILine; - while ( !aGSI.IsEof()) { - - aGSI.ReadLine( sGSILine ); - if ( bHW2FW ) { - String sConverter( sGSILine, RTL_TEXTENCODING_UTF8 ); - ConvertHalfwitdhToFullwidth( sConverter ); - sGSILine = ByteString( sConverter, RTL_TEXTENCODING_UTF8 ); - } - else { - if ( ByteString( argv[ 1 ] ) == "-t" ) - sGSILine = UTF8Converter::ConvertToUTF8( sGSILine, nEncoding ); - else - sGSILine = UTF8Converter::ConvertFromUTF8( sGSILine, nEncoding ); - } - - if ( aOutput.IsOpen()) - aOutput.WriteLine( sGSILine ); - else - fprintf( stdout, "%s\n", sGSILine.GetBuffer()); - } - - aGSI.Close(); - if ( aOutput.IsOpen()) - aOutput.Close(); - } - else { - Help(); - exit( 1 ); - } - - return 0; -} diff --git a/transex3/source/xrmmerge.cxx b/transex3/source/xrmmerge.cxx index 4daf94e2357a..f1b3d4d6cb5a 100644 --- a/transex3/source/xrmmerge.cxx +++ b/transex3/source/xrmmerge.cxx @@ -163,10 +163,6 @@ extern char *GetOutputFile( int argc, char* argv[]) Export::sLanguages = ByteString( argv[ i ]); } break; - case STATE_ISOCODE99: { - Export::sIsoCode99 = ByteString( argv[ i ]); - } - break; } } } diff --git a/ucbhelper/inc/ucbhelper/interactionrequest.hxx b/ucbhelper/inc/ucbhelper/interactionrequest.hxx index b66a07caceb7..f23041d0caa2 100644 --- a/ucbhelper/inc/ucbhelper/interactionrequest.hxx +++ b/ucbhelper/inc/ucbhelper/interactionrequest.hxx @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include #include #include @@ -342,7 +342,7 @@ public: class UCBHELPER_DLLPUBLIC InteractionSupplyAuthentication : public InteractionContinuation, public com::sun::star::lang::XTypeProvider, - public com::sun::star::ucb::XInteractionSupplyAuthentication + public com::sun::star::ucb::XInteractionSupplyAuthentication2 { com::sun::star::uno::Sequence< com::sun::star::ucb::RememberAuthentication > m_aRememberPasswordModes; @@ -360,6 +360,9 @@ class UCBHELPER_DLLPUBLIC InteractionSupplyAuthentication : unsigned m_bCanSetUserName : 1; unsigned m_bCanSetPassword : 1; unsigned m_bCanSetAccount : 1; + unsigned m_bCanUseSystemCredentials : 1; + unsigned m_bDefaultUseSystemCredentials : 1; + unsigned m_bUseSystemCredentials : 1; public: /** @@ -382,7 +385,7 @@ public: sal_Bool bCanSetRealm, sal_Bool bCanSetUserName, sal_Bool bCanSetPassword, - sal_Bool bCanSetAccount ); + sal_Bool bCanSetAccount); /** * Constructor. * @@ -408,6 +411,11 @@ public: * @param eDefaultRememberAccountMode specifies the default * authentication-remember-mode for accounts preferred by the * requesting client. + * @param bCanUseSystemCredentials indicates whether issuer of the + * authetication request can obtain and use system credentials + * for authentication. + * @param bDefaultUseSystemCredentials specifies the default system + * credentials usage preferred by the requesting client * * @see com::sun::star::ucb::AuthenticationRequest * @see com::sun::star::ucb::RememberAuthentication @@ -427,7 +435,9 @@ public: com::sun::star::ucb::RememberAuthentication > & rRememberAccountModes, const com::sun::star::ucb::RememberAuthentication - eDefaultRememberAccountMode ); + eDefaultRememberAccountMode, + sal_Bool bCanUseSystemCredentials, + sal_Bool bDefaultUseSystemCredentials ); // XInterface virtual com::sun::star::uno::Any SAL_CALL @@ -497,6 +507,12 @@ public: setRememberAccount( com::sun::star::ucb::RememberAuthentication Remember ) throw( com::sun::star::uno::RuntimeException ); + // XInteractionSupplyAuthentication2 + virtual ::sal_Bool SAL_CALL canUseSystemCredentials( ::sal_Bool& Default ) + throw ( ::com::sun::star::uno::RuntimeException ); + virtual void SAL_CALL setUseSystemCredentials( ::sal_Bool UseSystemCredentials ) + throw ( ::com::sun::star::uno::RuntimeException ); + // Non-interface methods. /** @@ -548,6 +564,8 @@ public: */ const com::sun::star::ucb::RememberAuthentication & getRememberAccountMode() const { return m_eRememberAccountMode; } + + sal_Bool getUseSystemCredentials() const { return m_bUseSystemCredentials; } }; //============================================================================ @@ -571,7 +589,10 @@ inline InteractionSupplyAuthentication::InteractionSupplyAuthentication( m_bCanSetRealm( bCanSetRealm ), m_bCanSetUserName( bCanSetUserName ), m_bCanSetPassword( bCanSetPassword ), - m_bCanSetAccount( bCanSetAccount ) + m_bCanSetAccount( bCanSetAccount ), + m_bCanUseSystemCredentials( sal_False ), + m_bDefaultUseSystemCredentials( sal_False ), + m_bUseSystemCredentials( sal_False ) { m_aRememberPasswordModes[ 0 ] = com::sun::star::ucb::RememberAuthentication_NO; @@ -593,7 +614,9 @@ inline InteractionSupplyAuthentication::InteractionSupplyAuthentication( const com::sun::star::uno::Sequence< com::sun::star::ucb::RememberAuthentication > & rRememberAccountModes, const com::sun::star::ucb::RememberAuthentication - eDefaultRememberAccountMode ) + eDefaultRememberAccountMode, + sal_Bool bCanUseSystemCredentials, + sal_Bool bDefaultUseSystemCredentials ) : InteractionContinuation( pRequest ), m_aRememberPasswordModes( rRememberPasswordModes ), m_aRememberAccountModes( rRememberAccountModes ), @@ -604,7 +627,10 @@ inline InteractionSupplyAuthentication::InteractionSupplyAuthentication( m_bCanSetRealm( bCanSetRealm ), m_bCanSetUserName( bCanSetUserName ), m_bCanSetPassword( bCanSetPassword ), - m_bCanSetAccount( bCanSetAccount ) + m_bCanSetAccount( bCanSetAccount ), + m_bCanUseSystemCredentials( bCanUseSystemCredentials ), + m_bDefaultUseSystemCredentials( bDefaultUseSystemCredentials ), + m_bUseSystemCredentials( bDefaultUseSystemCredentials & bCanUseSystemCredentials ) { } diff --git a/ucbhelper/inc/ucbhelper/simpleauthenticationrequest.hxx b/ucbhelper/inc/ucbhelper/simpleauthenticationrequest.hxx index ddb2e655de8b..13061ca0238f 100644 --- a/ucbhelper/inc/ucbhelper/simpleauthenticationrequest.hxx +++ b/ucbhelper/inc/ucbhelper/simpleauthenticationrequest.hxx @@ -33,9 +33,12 @@ #include #include -#include #include "ucbhelper/ucbhelperdllapi.h" +namespace com { namespace sun { namespace star { namespace ucb { + class URLAuthenticationRequest; +} } } } + namespace ucbhelper { /** @@ -63,12 +66,13 @@ class UCBHELPER_DLLPUBLIC SimpleAuthenticationRequest : public ucbhelper::Intera ucbhelper::InteractionSupplyAuthentication > m_xAuthSupplier; private: - void initialize( ::com::sun::star::ucb::AuthenticationRequest aRequest, - const sal_Bool & bCanSetRealm, - const sal_Bool & bCanSetUserName, - const sal_Bool & bCanSetPassword, - const sal_Bool & bCanSetAccount, - const sal_Bool & bAllowPersistentStoring ); + void initialize( const ::com::sun::star::ucb::URLAuthenticationRequest & rRequest, + sal_Bool bCanSetRealm, + sal_Bool bCanSetUserName, + sal_Bool bCanSetPassword, + sal_Bool bCanSetAccount, + sal_Bool bAllowPersistentStoring, + sal_Bool bAllowUseSystemCredentials ); public: /** Specification whether some entity (realm, username, password, account) @@ -84,6 +88,7 @@ public: /** * Constructor. * + * @param rURL contains a URL for which authentication is requested. * @param rServerName contains a server name. * @param rRealm contains a realm, if applicable. * @param rUserName contains a username, if available (for instance from @@ -92,7 +97,8 @@ public: * a previous try). * @param rAccount contains an account, if applicable. */ - SimpleAuthenticationRequest( const rtl::OUString & rServerName, + SimpleAuthenticationRequest( const rtl::OUString & rURL, + const rtl::OUString & rServerName, const rtl::OUString & rRealm, const rtl::OUString & rUserName, const rtl::OUString & rPassword, @@ -102,6 +108,7 @@ public: /** * Constructor. * + * @param rURL contains a URL for which authentication is requested. * @param rServerName contains a server name. * @param rRealm contains a realm, if applicable. * @param rUserName contains a username, if available (for instance from @@ -109,14 +116,19 @@ public: * @param rPassword contains a password, if available (for instance from * a previous try). * @param rAccount contains an account, if applicable. - * @param bAllowPersistentStoring specifies if the credentials should stored in the passowrd container persistently + * @param bAllowPersistentStoring specifies if the credentials should + * be stored in the passowrd container persistently + * @param bAllowUseSystemCredntials specifies if requesting client is + * able to obtain and use system credentials for authentication */ - SimpleAuthenticationRequest( const rtl::OUString & rServerName, + SimpleAuthenticationRequest( const rtl::OUString & rURL, + const rtl::OUString & rServerName, const rtl::OUString & rRealm, const rtl::OUString & rUserName, const rtl::OUString & rPassword, const rtl::OUString & rAccount, - const sal_Bool & bAllowPersistentStoring); + sal_Bool bAllowPersistentStoring, + sal_Bool bAllowUseSystemCredentials ); /** @@ -138,7 +150,8 @@ public: modifiable. * @param rAccount contains an account, if applicable. */ - SimpleAuthenticationRequest( const rtl::OUString & rServerName, + SimpleAuthenticationRequest( const rtl::OUString & rURL, + const rtl::OUString & rServerName, EntityType eRealmType, const rtl::OUString & rRealm, EntityType eUserNameType, @@ -152,6 +165,7 @@ public: /** * Constructor. * + * @param rURL contains a URL for which authentication is requested. * @param rServerName contains a server name. * @param eRealmType specifies whether a realm is applicable and modifiable. @@ -167,9 +181,13 @@ public: * @param eAccountType specifies whether an account is applicable and modifiable. * @param rAccount contains an account, if applicable. - * @param bAllowPersistentStoring specifies if the credentials should stored in the passowrd container persistently + * @param bAllowPersistentStoring specifies if the credentials should + * be stored in the passowrd container persistently + * @param bAllowUseSystemCredntials specifies if requesting client is + * able to obtain and use system credentials for authentication */ - SimpleAuthenticationRequest( const rtl::OUString & rServerName, + SimpleAuthenticationRequest( const rtl::OUString & rURL, + const rtl::OUString & rServerName, EntityType eRealmType, const rtl::OUString & rRealm, EntityType eUserNameType, @@ -178,7 +196,8 @@ public: const rtl::OUString & rPassword, EntityType eAccountType, const rtl::OUString & rAccount, - const sal_Bool & bAllowPersistentStoring); + sal_Bool bAllowPersistentStoring, + sal_Bool bAllowUseSystemCredentials ); /** * This method returns the supplier for the missing authentication data, diff --git a/ucbhelper/prj/build.lst b/ucbhelper/prj/build.lst index fb9e7d7ab45f..3f49d69c987f 100644 --- a/ucbhelper/prj/build.lst +++ b/ucbhelper/prj/build.lst @@ -1,4 +1,4 @@ -uh ucbhelper : offuh sal cppu cppuhelper salhelper NULL +uh ucbhelper : offuh sal cppu cppuhelper salhelper NULL uh ucbhelper usr1 - all uh_mkout NULL uh ucbhelper\inc nmake - all uh_inc NULL uh ucbhelper\source\client nmake - all uh_client uh_inc NULL diff --git a/ucbhelper/source/provider/interactionrequest.cxx b/ucbhelper/source/provider/interactionrequest.cxx index 8bfb4461d6f3..df91c47dc8fe 100644 --- a/ucbhelper/source/provider/interactionrequest.cxx +++ b/ucbhelper/source/provider/interactionrequest.cxx @@ -704,7 +704,8 @@ InteractionSupplyAuthentication::queryInterface( const uno::Type & rType ) uno::Any aRet = cppu::queryInterface( rType, static_cast< lang::XTypeProvider * >( this ), static_cast< task::XInteractionContinuation * >( this ), - static_cast< ucb::XInteractionSupplyAuthentication * >( this ) ); + static_cast< ucb::XInteractionSupplyAuthentication * >( this ), + static_cast< ucb::XInteractionSupplyAuthentication2 * >( this )); return aRet.hasValue() ? aRet : InteractionContinuation::queryInterface( rType ); @@ -750,7 +751,7 @@ uno::Sequence< uno::Type > SAL_CALL InteractionSupplyAuthentication::getTypes() uno::Reference< lang::XTypeProvider > * >( 0 ) ), getCppuType( static_cast< uno::Reference< - ucb::XInteractionSupplyAuthentication > * >( 0 ) ) ); + ucb::XInteractionSupplyAuthentication2 > * >( 0 ) ) ); pCollection = &collection; } } @@ -904,6 +905,33 @@ void SAL_CALL InteractionSupplyAuthentication::setRememberAccount( m_eRememberAccountMode = Remember; } +//========================================================================= +// +// XInteractionSupplyAuthentication2 methods. +// +//========================================================================= + +// virtual +::sal_Bool SAL_CALL +InteractionSupplyAuthentication::canUseSystemCredentials( + ::sal_Bool& Default ) + throw ( uno::RuntimeException ) +{ + Default = m_bDefaultUseSystemCredentials; + return m_bCanUseSystemCredentials; +} + +//========================================================================= +// virtual +void SAL_CALL InteractionSupplyAuthentication::setUseSystemCredentials( + ::sal_Bool UseSystemCredentials ) + throw ( uno::RuntimeException ) +{ + if ( m_bCanUseSystemCredentials ) + m_bUseSystemCredentials = UseSystemCredentials; +} + + //========================================================================= //========================================================================= // diff --git a/ucbhelper/source/provider/simpleauthenticationrequest.cxx b/ucbhelper/source/provider/simpleauthenticationrequest.cxx index 16570f7f012d..c5d7448fa29b 100644 --- a/ucbhelper/source/provider/simpleauthenticationrequest.cxx +++ b/ucbhelper/source/provider/simpleauthenticationrequest.cxx @@ -31,6 +31,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_ucbhelper.hxx" #include +#include #include using namespace com::sun::star; @@ -38,14 +39,15 @@ using namespace ucbhelper; //========================================================================= SimpleAuthenticationRequest::SimpleAuthenticationRequest( + const rtl::OUString & rURL, const rtl::OUString & rServerName, const rtl::OUString & rRealm, const rtl::OUString & rUserName, const rtl::OUString & rPassword, const rtl::OUString & rAccount ) { - // Fill request... - ucb::AuthenticationRequest aRequest; + // Fill request... + ucb::URLAuthenticationRequest aRequest; // aRequest.Message = // OUString // aRequest.Context = // XInterface aRequest.Classification = task::InteractionClassification_ERROR; @@ -61,26 +63,30 @@ SimpleAuthenticationRequest::SimpleAuthenticationRequest( aRequest.HasAccount = ( rAccount.getLength() > 0 ); if ( aRequest.HasAccount ) aRequest.Account = rAccount; + aRequest.URL = rURL; - initialize(aRequest, + initialize(aRequest, sal_False, sal_True, sal_True, aRequest.HasAccount, - sal_False); + sal_False, + sal_False ); } //========================================================================= SimpleAuthenticationRequest::SimpleAuthenticationRequest( + const rtl::OUString & rURL, const rtl::OUString & rServerName, const rtl::OUString & rRealm, const rtl::OUString & rUserName, const rtl::OUString & rPassword, const rtl::OUString & rAccount, - const sal_Bool & bAllowPersistentStoring ) + sal_Bool bAllowPersistentStoring, + sal_Bool bAllowUseSystemCredentials ) { - // Fill request... - ucb::AuthenticationRequest aRequest; + // Fill request... + ucb::URLAuthenticationRequest aRequest; // aRequest.Message = // OUString // aRequest.Context = // XInterface aRequest.Classification = task::InteractionClassification_ERROR; @@ -96,24 +102,116 @@ SimpleAuthenticationRequest::SimpleAuthenticationRequest( aRequest.HasAccount = ( rAccount.getLength() > 0 ); if ( aRequest.HasAccount ) aRequest.Account = rAccount; + aRequest.URL = rURL; - initialize(aRequest, + initialize(aRequest, sal_False, sal_True, sal_True, aRequest.HasAccount, - bAllowPersistentStoring); + bAllowPersistentStoring, + bAllowUseSystemCredentials ); } -void SimpleAuthenticationRequest::initialize( - ucb::AuthenticationRequest aRequest, - const sal_Bool & bCanSetRealm, - const sal_Bool & bCanSetUserName, - const sal_Bool & bCanSetPassword, - const sal_Bool & bCanSetAccount, - const sal_Bool & bAllowPersistentStoring ) +//========================================================================= +SimpleAuthenticationRequest::SimpleAuthenticationRequest( + const rtl::OUString & rURL, + const rtl::OUString & rServerName, + EntityType eRealmType, + const rtl::OUString & rRealm, + EntityType eUserNameType, + const rtl::OUString & rUserName, + EntityType ePasswordType, + const rtl::OUString & rPassword, + EntityType eAccountType, + const rtl::OUString & rAccount ) { - setRequest( uno::makeAny( aRequest ) ); + // Fill request... + ucb::URLAuthenticationRequest aRequest; +// aRequest.Message = // OUString +// aRequest.Context = // XInterface + aRequest.Classification = task::InteractionClassification_ERROR; + aRequest.ServerName = rServerName; +// aRequest.Diagnostic = // OUString + aRequest.HasRealm = eRealmType != ENTITY_NA; + if ( aRequest.HasRealm ) + aRequest.Realm = rRealm; + aRequest.HasUserName = eUserNameType != ENTITY_NA; + if ( aRequest.HasUserName ) + aRequest.UserName = rUserName; + aRequest.HasPassword = ePasswordType != ENTITY_NA; + if ( aRequest.HasPassword ) + aRequest.Password = rPassword; + aRequest.HasAccount = eAccountType != ENTITY_NA; + if ( aRequest.HasAccount ) + aRequest.Account = rAccount; + aRequest.URL = rURL; + + initialize(aRequest, + eRealmType == ENTITY_MODIFY, + eUserNameType == ENTITY_MODIFY, + ePasswordType == ENTITY_MODIFY, + eAccountType == ENTITY_MODIFY, + sal_False, + sal_False ); +} + +//========================================================================= +SimpleAuthenticationRequest::SimpleAuthenticationRequest( + const rtl::OUString & rURL, + const rtl::OUString & rServerName, + EntityType eRealmType, + const rtl::OUString & rRealm, + EntityType eUserNameType, + const rtl::OUString & rUserName, + EntityType ePasswordType, + const rtl::OUString & rPassword, + EntityType eAccountType, + const rtl::OUString & rAccount, + sal_Bool bAllowPersistentStoring, + sal_Bool bAllowUseSystemCredentials ) +{ + // Fill request... + ucb::URLAuthenticationRequest aRequest; +// aRequest.Message = // OUString +// aRequest.Context = // XInterface + aRequest.Classification = task::InteractionClassification_ERROR; + aRequest.ServerName = rServerName; +// aRequest.Diagnostic = // OUString + aRequest.HasRealm = eRealmType != ENTITY_NA; + if ( aRequest.HasRealm ) + aRequest.Realm = rRealm; + aRequest.HasUserName = eUserNameType != ENTITY_NA; + if ( aRequest.HasUserName ) + aRequest.UserName = rUserName; + aRequest.HasPassword = ePasswordType != ENTITY_NA; + if ( aRequest.HasPassword ) + aRequest.Password = rPassword; + aRequest.HasAccount = eAccountType != ENTITY_NA; + if ( aRequest.HasAccount ) + aRequest.Account = rAccount; + aRequest.URL = rURL; + + initialize(aRequest, + eRealmType == ENTITY_MODIFY, + eUserNameType == ENTITY_MODIFY, + ePasswordType == ENTITY_MODIFY, + eAccountType == ENTITY_MODIFY, + bAllowPersistentStoring, + bAllowUseSystemCredentials ); +} + +//========================================================================= +void SimpleAuthenticationRequest::initialize( + const ucb::URLAuthenticationRequest & rRequest, + sal_Bool bCanSetRealm, + sal_Bool bCanSetUserName, + sal_Bool bCanSetPassword, + sal_Bool bCanSetAccount, + sal_Bool bAllowPersistentStoring, + sal_Bool bAllowUseSystemCredentials ) +{ + setRequest( uno::makeAny( rRequest ) ); // Fill continuations... uno::Sequence< ucb::RememberAuthentication > aRememberModes( bAllowPersistentStoring ? 3 : 2 ); @@ -132,7 +230,9 @@ void SimpleAuthenticationRequest::initialize( aRememberModes, // rRememberPasswordModes ucb::RememberAuthentication_SESSION, // eDefaultRememberPasswordMode aRememberModes, // rRememberAccountModes - ucb::RememberAuthentication_SESSION // eDefaultRememberAccountMode + ucb::RememberAuthentication_SESSION, // eDefaultRememberAccountMode + bAllowUseSystemCredentials, // bCanUseSystemCredentials, + false // bDefaultUseSystemCredentials ); uno::Sequence< @@ -143,84 +243,3 @@ void SimpleAuthenticationRequest::initialize( setContinuations( aContinuations ); } - -//========================================================================= -SimpleAuthenticationRequest::SimpleAuthenticationRequest( - const rtl::OUString & rServerName, - EntityType eRealmType, - const rtl::OUString & rRealm, - EntityType eUserNameType, - const rtl::OUString & rUserName, - EntityType ePasswordType, - const rtl::OUString & rPassword, - EntityType eAccountType, - const rtl::OUString & rAccount ) -{ - // Fill request... - ucb::AuthenticationRequest aRequest; -// aRequest.Message = // OUString -// aRequest.Context = // XInterface - aRequest.Classification = task::InteractionClassification_ERROR; - aRequest.ServerName = rServerName; -// aRequest.Diagnostic = // OUString - aRequest.HasRealm = eRealmType != ENTITY_NA; - if ( aRequest.HasRealm ) - aRequest.Realm = rRealm; - aRequest.HasUserName = eUserNameType != ENTITY_NA; - if ( aRequest.HasUserName ) - aRequest.UserName = rUserName; - aRequest.HasPassword = ePasswordType != ENTITY_NA; - if ( aRequest.HasPassword ) - aRequest.Password = rPassword; - aRequest.HasAccount = eAccountType != ENTITY_NA; - if ( aRequest.HasAccount ) - aRequest.Account = rAccount; - - initialize(aRequest, - eRealmType == ENTITY_MODIFY, - eUserNameType == ENTITY_MODIFY, - ePasswordType == ENTITY_MODIFY, - eAccountType == ENTITY_MODIFY, - sal_False); -} - -//========================================================================= -SimpleAuthenticationRequest::SimpleAuthenticationRequest( - const rtl::OUString & rServerName, - EntityType eRealmType, - const rtl::OUString & rRealm, - EntityType eUserNameType, - const rtl::OUString & rUserName, - EntityType ePasswordType, - const rtl::OUString & rPassword, - EntityType eAccountType, - const rtl::OUString & rAccount, - const sal_Bool & bAllowPersistentStoring ) -{ - // Fill request... - ucb::AuthenticationRequest aRequest; -// aRequest.Message = // OUString -// aRequest.Context = // XInterface - aRequest.Classification = task::InteractionClassification_ERROR; - aRequest.ServerName = rServerName; -// aRequest.Diagnostic = // OUString - aRequest.HasRealm = eRealmType != ENTITY_NA; - if ( aRequest.HasRealm ) - aRequest.Realm = rRealm; - aRequest.HasUserName = eUserNameType != ENTITY_NA; - if ( aRequest.HasUserName ) - aRequest.UserName = rUserName; - aRequest.HasPassword = ePasswordType != ENTITY_NA; - if ( aRequest.HasPassword ) - aRequest.Password = rPassword; - aRequest.HasAccount = eAccountType != ENTITY_NA; - if ( aRequest.HasAccount ) - aRequest.Account = rAccount; - - initialize(aRequest, - eRealmType == ENTITY_MODIFY, - eUserNameType == ENTITY_MODIFY, - ePasswordType == ENTITY_MODIFY, - eAccountType == ENTITY_MODIFY, - bAllowPersistentStoring); -} diff --git a/svtools/inc/svtools/accelcfg.hxx b/unotools/inc/unotools/accelcfg.hxx similarity index 94% rename from svtools/inc/svtools/accelcfg.hxx rename to unotools/inc/unotools/accelcfg.hxx index 24894c46c535..70a0d26545f5 100644 --- a/svtools/inc/svtools/accelcfg.hxx +++ b/unotools/inc/unotools/accelcfg.hxx @@ -27,11 +27,11 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_ACCELCFG_HXX -#define INCLUDED_SVTOOLS_ACCELCFG_HXX +#ifndef INCLUDED_unotools_ACCELCFG_HXX +#define INCLUDED_unotools_ACCELCFG_HXX #include -#include +#include #include #include @@ -51,7 +51,7 @@ class KeyEvent; class String; class SvtAcceleratorConfig_Impl; -class SvtAcceleratorConfiguration: public svt::detail::Options +class SvtAcceleratorConfiguration: public utl::detail::Options { SvtAcceleratorConfig_Impl* pImp; diff --git a/svtools/inc/cacheoptions.hxx b/unotools/inc/unotools/cacheoptions.hxx similarity index 96% rename from svtools/inc/cacheoptions.hxx rename to unotools/inc/unotools/cacheoptions.hxx index 0dd1d2eaaf6d..a9adf9a14467 100644 --- a/svtools/inc/cacheoptions.hxx +++ b/unotools/inc/unotools/cacheoptions.hxx @@ -28,14 +28,14 @@ * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_CACHEOPTIONS_HXX -#define INCLUDED_SVTOOLS_CACHEOPTIONS_HXX +#ifndef INCLUDED_unotools_CACHEOPTIONS_HXX +#define INCLUDED_unotools_CACHEOPTIONS_HXX //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include @@ -67,7 +67,7 @@ class SvtCacheOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtCacheOptions +class UNOTOOLS_DLLPUBLIC SvtCacheOptions { //------------------------------------------------------------------------------------------------------------- // public methods @@ -152,7 +152,7 @@ class SVL_DLLPUBLIC SvtCacheOptions @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member @@ -173,4 +173,4 @@ class SVL_DLLPUBLIC SvtCacheOptions }; -#endif // #ifndef INCLUDED_SVTOOLS_CACHEOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_CACHEOPTIONS_HXX diff --git a/svtools/inc/svtools/cmdoptions.hxx b/unotools/inc/unotools/cmdoptions.hxx similarity index 97% rename from svtools/inc/svtools/cmdoptions.hxx rename to unotools/inc/unotools/cmdoptions.hxx index 9feb2508982b..85d8a0725f3c 100644 --- a/svtools/inc/svtools/cmdoptions.hxx +++ b/unotools/inc/unotools/cmdoptions.hxx @@ -27,20 +27,20 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_CMDOPTIONS_HXX -#define INCLUDED_SVTOOLS_CMDOPTIONS_HXX +#ifndef INCLUDED_unotools_CMDOPTIONS_HXX +#define INCLUDED_unotools_CMDOPTIONS_HXX //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // types, enums, ... @@ -79,7 +79,7 @@ class SvtCommandOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtCommandOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtCommandOptions: public utl::detail::Options { friend class SvtCommandOptions_Impl; @@ -234,7 +234,7 @@ class SVL_DLLPUBLIC SvtCommandOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member @@ -255,4 +255,4 @@ class SVL_DLLPUBLIC SvtCommandOptions: public svt::detail::Options }; // class SvtCmdOptions -#endif // #ifndef INCLUDED_SVTOOLS_CMDOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_CMDOPTIONS_HXX diff --git a/svtools/inc/svtools/compatibility.hxx b/unotools/inc/unotools/compatibility.hxx similarity index 97% rename from svtools/inc/svtools/compatibility.hxx rename to unotools/inc/unotools/compatibility.hxx index 2337980d3707..0c7c41882c09 100644 --- a/svtools/inc/svtools/compatibility.hxx +++ b/unotools/inc/unotools/compatibility.hxx @@ -27,19 +27,19 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_COMPATIBILITY_HXX -#define INCLUDED_SVTOOLS_COMPATIBILITY_HXX +#ifndef INCLUDED_unotools_COMPATIBILITY_HXX +#define INCLUDED_unotools_COMPATIBILITY_HXX //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // types, enums, ... @@ -107,7 +107,7 @@ class SvtCompatibilityOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtCompatibilityOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtCompatibilityOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public methods @@ -231,7 +231,7 @@ class SVL_DLLPUBLIC SvtCompatibilityOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member @@ -252,5 +252,5 @@ class SVL_DLLPUBLIC SvtCompatibilityOptions: public svt::detail::Options }; // class SvtCompatibilityOptions -#endif // #ifndef INCLUDED_SVTOOLS_COMPATIBILITY_HXX +#endif // #ifndef INCLUDED_unotools_COMPATIBILITY_HXX diff --git a/unotools/inc/unotools/configitem.hxx b/unotools/inc/unotools/configitem.hxx index f3b9db2da452..3cc0dc1b079e 100644 --- a/unotools/inc/unotools/configitem.hxx +++ b/unotools/inc/unotools/configitem.hxx @@ -36,6 +36,7 @@ #include #include #include "unotools/unotoolsdllapi.h" +#include "unotools/options.hxx" //----------------------------------------------------------------------------- namespace com{ namespace sun{ namespace star{ @@ -76,7 +77,7 @@ namespace utl class ConfigManager; struct ConfigItem_Impl; - class UNOTOOLS_DLLPUBLIC ConfigItem + class UNOTOOLS_DLLPUBLIC ConfigItem : public ConfigurationBroadcaster { friend class ConfigChangeListener_Impl; friend class ConfigManager; @@ -185,7 +186,7 @@ namespace utl /** is called from the ConfigManager before application ends of from the PropertyChangeListener if the sub tree broadcasts changes. */ - virtual void Notify( const com::sun::star::uno::Sequence& aPropertyNames); + virtual void Notify( const com::sun::star::uno::Sequence& aPropertyNames)=0; /** is called from the ConfigManager if it is destroyed before the ConfigItem. */ void ReleaseConfigMgr(); @@ -200,7 +201,7 @@ namespace utl sal_Bool IsModified() const; /** writes the changed values into the sub tree. Always called in the Dtor of the derived class. */ - virtual void Commit(); + virtual void Commit()=0; sal_Bool IsInValueChange() const; diff --git a/unotools/inc/unotools/confignode.hxx b/unotools/inc/unotools/confignode.hxx index a50025a6ab50..580274004e1a 100644 --- a/unotools/inc/unotools/confignode.hxx +++ b/unotools/inc/unotools/confignode.hxx @@ -86,7 +86,7 @@ namespace utl const OConfigurationNode& operator=(const OConfigurationNode& _rSource); /// dtor - ~OConfigurationNode(); + ~OConfigurationNode() {} /** open a sub node @param _rPath access path of the to-be-opened sub node. May be a hierarchical path. diff --git a/svtools/inc/svtools/defaultoptions.hxx b/unotools/inc/unotools/defaultoptions.hxx similarity index 84% rename from svtools/inc/svtools/defaultoptions.hxx rename to unotools/inc/unotools/defaultoptions.hxx index 03408ac1ed35..603d7fd6d22a 100644 --- a/svtools/inc/svtools/defaultoptions.hxx +++ b/unotools/inc/unotools/defaultoptions.hxx @@ -27,12 +27,12 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_DEFAULTOPTIONS_HXX -#define INCLUDED_SVTOOLS_DEFAULTOPTIONS_HXX +#ifndef INCLUDED_unotools_DEFAULTOPTIONS_HXX +#define INCLUDED_unotools_DEFAULTOPTIONS_HXX -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include "tools/solar.h" -#include +#include class String; class SvtDefaultOptions_Impl; @@ -40,7 +40,7 @@ class SvtDefaultOptions_Impl; // class SvtDefaultOptions ----------------------------------------------- class SvtDefaultOptions_Impl; -class SVL_DLLPUBLIC SvtDefaultOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtDefaultOptions: public utl::detail::Options { private: SvtDefaultOptions_Impl* pImp; @@ -53,5 +53,5 @@ public: String GetDefaultPath( USHORT nId ) const; }; -#endif // #ifndef INCLUDED_SVTOOLS_DEFAULTOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_DEFAULTOPTIONS_HXX diff --git a/svtools/inc/svtools/dynamicmenuoptions.hxx b/unotools/inc/unotools/dynamicmenuoptions.hxx similarity index 96% rename from svtools/inc/svtools/dynamicmenuoptions.hxx rename to unotools/inc/unotools/dynamicmenuoptions.hxx index 4a6b7a44d13f..2841970c5a84 100644 --- a/svtools/inc/svtools/dynamicmenuoptions.hxx +++ b/unotools/inc/unotools/dynamicmenuoptions.hxx @@ -27,19 +27,19 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_DYNAMICMENUOPTIONS_HXX -#define INCLUDED_SVTOOLS_DYNAMICMENUOPTIONS_HXX +#ifndef INCLUDED_unotools_DYNAMICMENUOPTIONS_HXX +#define INCLUDED_unotools_DYNAMICMENUOPTIONS_HXX //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // types, enums, ... @@ -90,7 +90,7 @@ class SvtDynamicMenuOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtDynamicMenuOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtDynamicMenuOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public methods @@ -198,7 +198,7 @@ class SVL_DLLPUBLIC SvtDynamicMenuOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member @@ -219,4 +219,4 @@ class SVL_DLLPUBLIC SvtDynamicMenuOptions: public svt::detail::Options }; // class SvtDynamicMenuOptions -#endif // #ifndef INCLUDED_SVTOOLS_DYNAMICMENUOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_DYNAMICMENUOPTIONS_HXX diff --git a/svtools/inc/eventcfg.hxx b/unotools/inc/unotools/eventcfg.hxx similarity index 77% rename from svtools/inc/eventcfg.hxx rename to unotools/inc/unotools/eventcfg.hxx index 4478d3f48028..0cee43e59dc5 100644 --- a/svtools/inc/eventcfg.hxx +++ b/unotools/inc/unotools/eventcfg.hxx @@ -30,7 +30,7 @@ #ifndef _EVENTCFG_HXX #define _EVENTCFG_HXX -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include @@ -40,6 +40,35 @@ #include #include +#define STR_EVENT_STARTAPP 0 +#define STR_EVENT_CLOSEAPP 1 +#define STR_EVENT_DOCCREATED 2 +#define STR_EVENT_CREATEDOC 3 +#define STR_EVENT_LOADFINISHED 4 +#define STR_EVENT_OPENDOC 5 +#define STR_EVENT_PREPARECLOSEDOC 6 +#define STR_EVENT_CLOSEDOC 7 +#define STR_EVENT_SAVEDOC 8 +#define STR_EVENT_SAVEDOCDONE 9 +#define STR_EVENT_SAVEDOCFAILED 10 +#define STR_EVENT_SAVEASDOC 11 +#define STR_EVENT_SAVEASDOCDONE 12 +#define STR_EVENT_SAVEASDOCFAILED 13 +#define STR_EVENT_SAVETODOC 14 +#define STR_EVENT_SAVETODOCDONE 15 +#define STR_EVENT_SAVETODOCFAILED 16 +#define STR_EVENT_ACTIVATEDOC 17 +#define STR_EVENT_DEACTIVATEDOC 18 +#define STR_EVENT_PRINTDOC 19 +#define STR_EVENT_VIEWCREATED 20 +#define STR_EVENT_PREPARECLOSEVIEW 21 +#define STR_EVENT_CLOSEVIEW 22 +#define STR_EVENT_MODIFYCHANGED 23 +#define STR_EVENT_TITLECHANGED 24 +#define STR_EVENT_VISAREACHANGED 25 +#define STR_EVENT_MODECHANGED 26 +#define STR_EVENT_STORAGECHANGED 27 + typedef ::std::hash_map< ::rtl::OUString, ::rtl::OUString, ::rtl::OUStringHash, ::std::equal_to< ::rtl::OUString > > EventBindingHash; typedef ::std::vector< ::com::sun::star::uno::WeakReference< ::com::sun::star::frame::XFrame > > FrameVector; typedef ::std::vector< ::rtl::OUString > SupportedEventsVector; @@ -67,10 +96,10 @@ public: ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw (::com::sun::star::uno::RuntimeException); ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw (::com::sun::star::uno::RuntimeException); ::sal_Bool SAL_CALL hasElements( ) throw (::com::sun::star::uno::RuntimeException); - + ::rtl::OUString GetEventName( sal_Int32 nID ); }; -class SVL_DLLPUBLIC GlobalEventConfig: +class UNOTOOLS_DLLPUBLIC GlobalEventConfig: public ::cppu::WeakImplHelper2 < ::com::sun::star::document::XEventsSupplier, ::com::sun::star::container::XNameReplace > { public: @@ -86,7 +115,7 @@ class SVL_DLLPUBLIC GlobalEventConfig: ::sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw (::com::sun::star::uno::RuntimeException); ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw (::com::sun::star::uno::RuntimeException); ::sal_Bool SAL_CALL hasElements( ) throw (::com::sun::star::uno::RuntimeException); - + static ::rtl::OUString GetEventName( sal_Int32 nID ); private: static GlobalEventConfig_Impl* m_pImpl; diff --git a/svtools/inc/svtools/extendedsecurityoptions.hxx b/unotools/inc/unotools/extendedsecurityoptions.hxx similarity index 94% rename from svtools/inc/svtools/extendedsecurityoptions.hxx rename to unotools/inc/unotools/extendedsecurityoptions.hxx index 700f707c00fe..114cf81d6ced 100644 --- a/svtools/inc/svtools/extendedsecurityoptions.hxx +++ b/unotools/inc/unotools/extendedsecurityoptions.hxx @@ -27,19 +27,19 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_EXTENDEDSECURITYOPTIONS_HXX -#define INCLUDED_SVTOOLS_EXTENDEDSECURITYOPTIONS_HXX +#ifndef INCLUDED_unotools_EXTENDEDSECURITYOPTIONS_HXX +#define INCLUDED_unotools_EXTENDEDSECURITYOPTIONS_HXX //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // forward declarations @@ -70,7 +70,7 @@ class SvtExtendedSecurityOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtExtendedSecurityOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtExtendedSecurityOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public methods @@ -139,7 +139,7 @@ class SVL_DLLPUBLIC SvtExtendedSecurityOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetInitMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetInitMutex(); //------------------------------------------------------------------------------------------------------------- // private member @@ -160,4 +160,4 @@ class SVL_DLLPUBLIC SvtExtendedSecurityOptions: public svt::detail::Options }; // class SvtExtendedSecurityOptions -#endif // #ifndef INCLUDED_SVTOOLS_EXTENDEDSECURITYOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_EXTENDEDSECURITYOPTIONS_HXX diff --git a/svtools/inc/fltrcfg.hxx b/unotools/inc/unotools/fltrcfg.hxx similarity index 97% rename from svtools/inc/fltrcfg.hxx rename to unotools/inc/unotools/fltrcfg.hxx index 480ebc28b29f..1422ba1a7a8f 100644 --- a/svtools/inc/fltrcfg.hxx +++ b/unotools/inc/unotools/fltrcfg.hxx @@ -32,11 +32,11 @@ // ----------------------------------------------------------------------- -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include struct SvtFilterOptions_Impl; -class SVL_DLLPUBLIC SvtFilterOptions : public utl::ConfigItem +class UNOTOOLS_DLLPUBLIC SvtFilterOptions : public utl::ConfigItem { SvtFilterOptions_Impl* pImp; diff --git a/vcl/inc/vcl/fontcfg.hxx b/unotools/inc/unotools/fontcfg.hxx similarity index 95% rename from vcl/inc/vcl/fontcfg.hxx rename to unotools/inc/unotools/fontcfg.hxx index 76864f0cb40a..4d0ed4036328 100644 --- a/vcl/inc/vcl/fontcfg.hxx +++ b/unotools/inc/unotools/fontcfg.hxx @@ -27,14 +27,12 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef _VCL_FONTCFG_HXX -#define _VCL_FONTCFG_HXX +#ifndef _UNOTOOLS_FONTCFG_HXX +#define _UNOTOOLS_FONTCFG_HXX -#include "dllapi.h" +#include #include -#ifndef _VCL_ENUM_HXX -#include -#endif +#include #include #include #include @@ -60,7 +58,7 @@ inline bool operator==( const com::sun::star::lang::Locale& rLeft, const com::su } }}}} -namespace vcl +namespace utl { struct LocaleHash @@ -74,7 +72,7 @@ struct LocaleHash } }; -class DefaultFontConfiguration +class UNOTOOLS_DLLPUBLIC DefaultFontConfiguration { com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > m_xConfigProvider; @@ -92,7 +90,7 @@ class DefaultFontConfiguration std::hash_map< com::sun::star::lang::Locale, LocaleAccess, - vcl::LocaleHash > + utl::LocaleHash > m_aConfig; rtl::OUString tryLocale( const com::sun::star::lang::Locale& rLocale, const rtl::OUString& rType ) const; @@ -165,7 +163,7 @@ class DefaultFontConfiguration IMPL_FONT_ATTR_GOTHIC | IMPL_FONT_ATTR_SCHOOLBOOK |\ IMPL_FONT_ATTR_SHADOW | IMPL_FONT_ATTR_OUTLINE) -struct FontNameAttr +struct UNOTOOLS_DLLPUBLIC FontNameAttr { String Name; ::std::vector< String > Substitutions; @@ -177,7 +175,7 @@ struct FontNameAttr unsigned long Type; // bitfield of IMPL_FONT_ATTR_* }; -class VCL_DLLPUBLIC FontSubstConfiguration +class UNOTOOLS_DLLPUBLIC FontSubstConfiguration { private: com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > @@ -196,7 +194,7 @@ private: LocaleSubst() : bConfigRead( false ) {} }; - std::hash_map< com::sun::star::lang::Locale, LocaleSubst, vcl::LocaleHash > m_aSubst; + std::hash_map< com::sun::star::lang::Locale, LocaleSubst, utl::LocaleHash > m_aSubst; typedef std::hash_set< rtl::OUString, rtl::OUStringHash > UniqueSubstHash; mutable UniqueSubstHash maSubstHash; @@ -227,6 +225,6 @@ public: static void getMapName( const String& rOrgName, String& rShortName, String& rFamilyName, FontWeight& rWeight, FontWidth& rWidth, ULONG& rType ); }; -} // namespace vcl +} // namespace utl -#endif // _VCL_FONTCFG_HXX +#endif // _UNOTOOLS_FONTCFG_HXX diff --git a/vcl/inc/vcl/fontcvt.hxx b/unotools/inc/unotools/fontcvt.hxx similarity index 69% rename from vcl/inc/vcl/fontcvt.hxx rename to unotools/inc/unotools/fontcvt.hxx index 8269928dc730..679a2dc5a6d9 100644 --- a/vcl/inc/vcl/fontcvt.hxx +++ b/unotools/inc/unotools/fontcvt.hxx @@ -28,10 +28,10 @@ * ************************************************************************/ -#ifndef _SV_FONTCVT_HXX -#define _SV_FONTCVT_HXX +#ifndef _UNOTOOLS_FONTCVT_HXX +#define _UNOTOOLS_FONTCVT_HXX -#include +#include #include // ------------------ @@ -43,37 +43,16 @@ #define FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS ((ULONG)0x00000004) typedef void* FontToSubsFontConverter; -VCL_DLLPUBLIC FontToSubsFontConverter CreateFontToSubsFontConverter( const String& rFontName, ULONG nFlags ); -VCL_DLLPUBLIC void DestroyFontToSubsFontConverter( FontToSubsFontConverter hConverter ); -VCL_DLLPUBLIC sal_Unicode ConvertFontToSubsFontChar( FontToSubsFontConverter hConverter, sal_Unicode c ); -VCL_DLLPUBLIC String GetFontToSubsFontName( FontToSubsFontConverter hConverter ); - -// ---------------- -// - SubsFontName - -// ---------------- - -#define SUBSFONT_ONLYONE ((ULONG)0x00000001) -#define SUBSFONT_MS ((ULONG)0x00000002) -#define SUBSFONT_PS ((ULONG)0x00000004) -#define SUBSFONT_HTML ((ULONG)0x00000008) -VCL_DLLPUBLIC String GetSubsFontName( const String& rName, ULONG nFlags ); - -// ----------------- -// - FontTokenName - -// ----------------- - -VCL_DLLPUBLIC String GetFontToken( const String& rName, xub_StrLen nToken, xub_StrLen& rIndex ); -inline String GetFontToken( const String& rName, xub_StrLen nToken ) -{ - xub_StrLen nTempIndex = 0; - return GetFontToken( rName, nToken, nTempIndex ); -} +UNOTOOLS_DLLPUBLIC FontToSubsFontConverter CreateFontToSubsFontConverter( const String& rFontName, ULONG nFlags ); +UNOTOOLS_DLLPUBLIC void DestroyFontToSubsFontConverter( FontToSubsFontConverter hConverter ); +UNOTOOLS_DLLPUBLIC sal_Unicode ConvertFontToSubsFontChar( FontToSubsFontConverter hConverter, sal_Unicode c ); +UNOTOOLS_DLLPUBLIC String GetFontToSubsFontName( FontToSubsFontConverter hConverter ); // --------------------------- // - StarSymbolToMSMultiFont - // --------------------------- -class VCL_DLLPUBLIC StarSymbolToMSMultiFont +class UNOTOOLS_DLLPUBLIC StarSymbolToMSMultiFont { public: //Returns the name of the best windows symbol font which this char can be @@ -99,5 +78,5 @@ public: //recognizably similiar. Even in this mode there will be characters that fail. //The users of this might want to make a distinction between failed characters //which were inside and those outside the unicode private area. -VCL_DLLPUBLIC StarSymbolToMSMultiFont *CreateStarSymbolToMSMultiFont(bool bPerfectOnly=false); -#endif // _SV_FONTCVT_HXX +UNOTOOLS_DLLPUBLIC StarSymbolToMSMultiFont *CreateStarSymbolToMSMultiFont(bool bPerfectOnly=false); +#endif // _UNOTOOLS_FONTCVT_HXX diff --git a/unotools/inc/unotools/fontdefs.hxx b/unotools/inc/unotools/fontdefs.hxx new file mode 100644 index 000000000000..ef4f68bb9e8a --- /dev/null +++ b/unotools/inc/unotools/fontdefs.hxx @@ -0,0 +1,110 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef _UNOTOOLS_FONTDEFS_HXX +#define _UNOTOOLS_FONTDEFS_HXX + +#include +#include +#include + +namespace utl { + class FontSubstConfiguration; + struct FontNameAttr; +} + +// ---------------- +// - SubsFontName - +// ---------------- + +#define SUBSFONT_ONLYONE ((ULONG)0x00000001) +#define SUBSFONT_MS ((ULONG)0x00000002) +#define SUBSFONT_PS ((ULONG)0x00000004) +#define SUBSFONT_HTML ((ULONG)0x00000008) + +UNOTOOLS_DLLPUBLIC String GetSubsFontName( const String& rName, ULONG nFlags ); + +// ----------------- +// - FontTokenName - +// ----------------- + +UNOTOOLS_DLLPUBLIC String GetFontToken( const String& rName, xub_StrLen nToken, xub_StrLen& rIndex ); +inline String GetFontToken( const String& rName, xub_StrLen nToken ) +{ + xub_StrLen nTempIndex = 0; + return GetFontToken( rName, nToken, nTempIndex ); +} + +UNOTOOLS_DLLPUBLIC void AddTokenFontName( String& rName, const String& rNewToken ); + +struct UNOTOOLS_DLLPUBLIC FontNameHash { int operator()(const String&) const; }; + +// --------------- +// - ConvertChar - +// --------------- + +class UNOTOOLS_DLLPUBLIC ConvertChar +{ +public: + const sal_Unicode* mpCvtTab; + const char* mpSubsFontName; + sal_Unicode (*mpCvtFunc)( sal_Unicode ); + sal_Unicode RecodeChar( sal_Unicode c ) const; + void RecodeString( String& rStra, xub_StrLen nIndex, xub_StrLen nLen ) const; + static const ConvertChar* GetRecodeData( const String& rOrgFontName, const String& rMapFontName ); +}; + + +// Default-Font +#define DEFAULTFONT_SANS_UNICODE ((USHORT)1) +#define DEFAULTFONT_SANS ((USHORT)2) +#define DEFAULTFONT_SERIF ((USHORT)3) +#define DEFAULTFONT_FIXED ((USHORT)4) +#define DEFAULTFONT_SYMBOL ((USHORT)5) +#define DEFAULTFONT_UI_SANS ((USHORT)1000) +#define DEFAULTFONT_UI_FIXED ((USHORT)1001) +#define DEFAULTFONT_LATIN_TEXT ((USHORT)2000) +#define DEFAULTFONT_LATIN_PRESENTATION ((USHORT)2001) +#define DEFAULTFONT_LATIN_SPREADSHEET ((USHORT)2002) +#define DEFAULTFONT_LATIN_HEADING ((USHORT)2003) +#define DEFAULTFONT_LATIN_DISPLAY ((USHORT)2004) +#define DEFAULTFONT_LATIN_FIXED ((USHORT)2005) +#define DEFAULTFONT_CJK_TEXT ((USHORT)3000) +#define DEFAULTFONT_CJK_PRESENTATION ((USHORT)3001) +#define DEFAULTFONT_CJK_SPREADSHEET ((USHORT)3002) +#define DEFAULTFONT_CJK_HEADING ((USHORT)3003) +#define DEFAULTFONT_CJK_DISPLAY ((USHORT)3004) +#define DEFAULTFONT_CTL_TEXT ((USHORT)4000) +#define DEFAULTFONT_CTL_PRESENTATION ((USHORT)4001) +#define DEFAULTFONT_CTL_SPREADSHEET ((USHORT)4002) +#define DEFAULTFONT_CTL_HEADING ((USHORT)4003) +#define DEFAULTFONT_CTL_DISPLAY ((USHORT)4004) + +UNOTOOLS_DLLPUBLIC String GetNextFontToken( const String& rTokenStr, xub_StrLen& rIndex ); + +UNOTOOLS_DLLPUBLIC void GetEnglishSearchFontName( String& rName ); + +#endif diff --git a/svtools/inc/svtools/fontoptions.hxx b/unotools/inc/unotools/fontoptions.hxx similarity index 95% rename from svtools/inc/svtools/fontoptions.hxx rename to unotools/inc/unotools/fontoptions.hxx index 4689cb6ad91b..644670711595 100644 --- a/svtools/inc/svtools/fontoptions.hxx +++ b/unotools/inc/unotools/fontoptions.hxx @@ -27,18 +27,18 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_FONTOPTIONS_HXX -#define INCLUDED_SVTOOLS_FONTOPTIONS_HXX +#ifndef INCLUDED_unotools_FONTOPTIONS_HXX +#define INCLUDED_unotools_FONTOPTIONS_HXX //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // forward declarations @@ -67,7 +67,7 @@ class SvtFontOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtFontOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtFontOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public methods @@ -152,7 +152,7 @@ class SVL_DLLPUBLIC SvtFontOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& impl_GetOwnStaticMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& impl_GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member @@ -173,4 +173,4 @@ class SVL_DLLPUBLIC SvtFontOptions: public svt::detail::Options }; // class SvtFontOptions -#endif // #ifndef INCLUDED_SVTOOLS_FONTOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_FONTOPTIONS_HXX diff --git a/svtools/inc/svtools/historyoptions.hxx b/unotools/inc/unotools/historyoptions.hxx similarity index 98% rename from svtools/inc/svtools/historyoptions.hxx rename to unotools/inc/unotools/historyoptions.hxx index d688da08ae76..c1bd8f62fca1 100644 --- a/svtools/inc/svtools/historyoptions.hxx +++ b/unotools/inc/unotools/historyoptions.hxx @@ -34,13 +34,13 @@ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // types, enums, ... @@ -94,7 +94,7 @@ class SvtHistoryOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtHistoryOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtHistoryOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public methods @@ -227,7 +227,7 @@ class SVL_DLLPUBLIC SvtHistoryOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member diff --git a/svtools/source/inc/configitems/historyoptions_const.hxx b/unotools/inc/unotools/historyoptions_const.hxx similarity index 98% rename from svtools/source/inc/configitems/historyoptions_const.hxx rename to unotools/inc/unotools/historyoptions_const.hxx index c9148aeb26f8..48632b66b018 100644 --- a/svtools/source/inc/configitems/historyoptions_const.hxx +++ b/unotools/inc/unotools/historyoptions_const.hxx @@ -34,7 +34,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef INCLUDE_CONFIGITEMS_HISTORYOPTIONS_CONST_HXX #define INCLUDE_CONFIGITEMS_HISTORYOPTIONS_CONST_HXX diff --git a/unotools/inc/unotools/idhelper.hxx b/unotools/inc/unotools/idhelper.hxx index 2fcac8550af5..a2aa28d26c1b 100644 --- a/unotools/inc/unotools/idhelper.hxx +++ b/unotools/inc/unotools/idhelper.hxx @@ -124,9 +124,6 @@ public: \ static void acquire(); \ static void release(); \ \ - static ::com::sun::star::uno::Sequence< sal_Int8 > getImplementationId( \ - const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XTypeProvider >& _rxProvider); \ - \ static ::com::sun::star::uno::Sequence< sal_Int8 > getImplementationId( \ const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >& _rTypes); \ \ @@ -181,16 +178,6 @@ void classname::release() \ } \ \ /*-----------------------------------------------------------------------*/ \ -::com::sun::star::uno::Sequence< sal_Int8 > classname::getImplementationId( \ - const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XTypeProvider >& _rxProvider) \ -{ \ - ::osl::MutexGuard aGuard(s_aMutex); \ - if (_rxProvider.is()) \ - return getImplementationId(_rxProvider->getTypes()); \ - return ::com::sun::star::uno::Sequence< sal_Int8 >(); \ -} \ - \ -/*-----------------------------------------------------------------------*/ \ ::com::sun::star::uno::Sequence< sal_Int8 > classname::getImplementationId( \ const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type >& _rTypes) \ { \ diff --git a/svtools/inc/svtools/inetoptions.hxx b/unotools/inc/unotools/inetoptions.hxx similarity index 95% rename from svtools/inc/svtools/inetoptions.hxx rename to unotools/inc/unotools/inetoptions.hxx index 367ea9bb3f52..42f01f40b7c2 100644 --- a/svtools/inc/svtools/inetoptions.hxx +++ b/unotools/inc/unotools/inetoptions.hxx @@ -28,14 +28,14 @@ * ************************************************************************/ -#ifndef _SVTOOLS_INETOPTIONS_HXX_ -#define _SVTOOLS_INETOPTIONS_HXX_ +#ifndef _unotools_INETOPTIONS_HXX_ +#define _unotools_INETOPTIONS_HXX_ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include -#include +#include namespace com { namespace sun { namespace star { namespace beans { class XPropertiesChangeListener; @@ -68,7 +68,7 @@ namespace rtl { class OUString; } true is passed, the new value is instantly written back to the configuration database. */ -class SVL_DLLPUBLIC SvtInetOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtInetOptions: public utl::detail::Options { public: SvtInetOptions(); @@ -143,4 +143,4 @@ private: static Impl * m_pImpl; }; -#endif // _SVTOOLS_INETOPTIONS_HXX_ +#endif // _unotools_INETOPTIONS_HXX_ diff --git a/svtools/inc/svtools/internaloptions.hxx b/unotools/inc/unotools/internaloptions.hxx similarity index 96% rename from svtools/inc/svtools/internaloptions.hxx rename to unotools/inc/unotools/internaloptions.hxx index 6a491480c143..d5c9adaa7b92 100644 --- a/svtools/inc/svtools/internaloptions.hxx +++ b/unotools/inc/unotools/internaloptions.hxx @@ -27,18 +27,18 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_INTERNALOPTIONS_HXX -#define INCLUDED_SVTOOLS_INTERNALOPTIONS_HXX +#ifndef INCLUDED_unotools_INTERNALOPTIONS_HXX +#define INCLUDED_unotools_INTERNALOPTIONS_HXX //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // namespaces! @@ -76,7 +76,7 @@ class SvtInternalOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtInternalOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtInternalOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public methods @@ -159,7 +159,7 @@ class SVL_DLLPUBLIC SvtInternalOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static MUTEX& GetOwnStaticMutex(); + UNOTOOLS_DLLPRIVATE static MUTEX& GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member @@ -180,4 +180,4 @@ class SVL_DLLPUBLIC SvtInternalOptions: public svt::detail::Options }; // class SvtInternalOptions -#endif // #ifndef INCLUDED_SVTOOLS_INTERNALOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_INTERNALOPTIONS_HXX diff --git a/svtools/source/config/itemholderbase.hxx b/unotools/inc/unotools/itemholderbase.hxx similarity index 94% rename from svtools/source/config/itemholderbase.hxx rename to unotools/inc/unotools/itemholderbase.hxx index b5c1dd5d57d0..3b8bbccb3549 100644 --- a/svtools/source/config/itemholderbase.hxx +++ b/unotools/inc/unotools/itemholderbase.hxx @@ -28,8 +28,8 @@ * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_ITEMHOLDERBASE_HXX_ -#define INCLUDED_SVTOOLS_ITEMHOLDERBASE_HXX_ +#ifndef INCLUDED_unotools_ITEMHOLDERBASE_HXX_ +#define INCLUDED_unotools_ITEMHOLDERBASE_HXX_ //----------------------------------------------- // includes @@ -37,7 +37,7 @@ #include #include -namespace svt { namespace detail { class Options; } } +namespace utl { namespace detail { class Options; } } //----------------------------------------------- // definitions @@ -122,10 +122,10 @@ struct TItemInfo : pItem(0) {} - svt::detail::Options * pItem; + utl::detail::Options * pItem; EItem eItem; }; typedef ::std::vector< TItemInfo > TItems; -#endif // INCLUDED_SVTOOLS_ITEMHOLDERBASE_HXX_ +#endif // INCLUDED_unotools_ITEMHOLDERBASE_HXX_ diff --git a/svtools/inc/javaoptions.hxx b/unotools/inc/unotools/javaoptions.hxx similarity index 92% rename from svtools/inc/javaoptions.hxx rename to unotools/inc/unotools/javaoptions.hxx index 4e1f23376407..9996a496bf31 100644 --- a/svtools/inc/javaoptions.hxx +++ b/unotools/inc/unotools/javaoptions.hxx @@ -27,10 +27,10 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef _SVTOOLS_JAVAOPTIONS_HXX -#define _SVTOOLS_JAVAOPTIONS_HXX +#ifndef _unotools_JAVAOPTIONS_HXX +#define _unotools_JAVAOPTIONS_HXX -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include @@ -39,7 +39,7 @@ struct SvtJavaOptions_Impl; -class SVL_DLLPUBLIC SvtJavaOptions : public utl::ConfigItem +class UNOTOOLS_DLLPUBLIC SvtJavaOptions : public utl::ConfigItem { SvtJavaOptions_Impl* pImpl; public: diff --git a/svtools/inc/svtools/lingucfg.hxx b/unotools/inc/unotools/lingucfg.hxx similarity index 96% rename from svtools/inc/svtools/lingucfg.hxx rename to unotools/inc/unotools/lingucfg.hxx index dd3dbdef811f..49500db964c2 100644 --- a/svtools/inc/svtools/lingucfg.hxx +++ b/unotools/inc/unotools/lingucfg.hxx @@ -28,10 +28,10 @@ * ************************************************************************/ -#ifndef _SVTOOLS_LINGUCFG_HXX_ -#define _SVTOOLS_LINGUCFG_HXX_ +#ifndef _unotools_LINGUCFG_HXX_ +#define _unotools_LINGUCFG_HXX_ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include @@ -41,7 +41,7 @@ #include #include #include -#include +#include #include #include @@ -50,7 +50,7 @@ class SvtLinguConfigItem; ////////////////////////////////////////////////////////////////////// -struct SVL_DLLPUBLIC SvtLinguOptions +struct UNOTOOLS_DLLPUBLIC SvtLinguOptions { ::com::sun::star::uno::Sequence< rtl::OUString > aActiveDics; ::com::sun::star::uno::Sequence< rtl::OUString > aActiveConvDics; @@ -144,7 +144,7 @@ struct SVL_DLLPUBLIC SvtLinguOptions ////////////////////////////////////////////////////////////////////// -struct SVL_DLLPUBLIC SvtLinguConfigDictionaryEntry +struct UNOTOOLS_DLLPUBLIC SvtLinguConfigDictionaryEntry { // the URL's pointing to the location of the files the dictionary consists of com::sun::star::uno::Sequence< rtl::OUString > aLocations; @@ -156,10 +156,10 @@ struct SVL_DLLPUBLIC SvtLinguConfigDictionaryEntry ////////////////////////////////////////////////////////////////////// -class SVL_DLLPUBLIC SvtLinguConfig: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtLinguConfig: public utl::detail::Options { // returns static object - SVL_DLLPRIVATE SvtLinguConfigItem & GetConfigItem(); + UNOTOOLS_DLLPRIVATE SvtLinguConfigItem & GetConfigItem(); SvtLinguConfigItem & GetConfigItem() const { return const_cast< SvtLinguConfig * >( this )->GetConfigItem(); } diff --git a/svtools/inc/linguprops.hxx b/unotools/inc/unotools/linguprops.hxx similarity index 98% rename from svtools/inc/linguprops.hxx rename to unotools/inc/unotools/linguprops.hxx index 883d5069f7a8..3edd1004bec0 100644 --- a/svtools/inc/linguprops.hxx +++ b/unotools/inc/unotools/linguprops.hxx @@ -28,8 +28,8 @@ * ************************************************************************/ -#ifndef _SVTOOLS_LINGUPROPS_HXX_ -#define _SVTOOLS_LINGUPROPS_HXX_ +#ifndef _unotools_LINGUPROPS_HXX_ +#define _unotools_LINGUPROPS_HXX_ // UNO property names for general options diff --git a/svtools/inc/svtools/localisationoptions.hxx b/unotools/inc/unotools/localisationoptions.hxx similarity index 95% rename from svtools/inc/svtools/localisationoptions.hxx rename to unotools/inc/unotools/localisationoptions.hxx index c19bf0e9fbba..d401eccee51a 100644 --- a/svtools/inc/svtools/localisationoptions.hxx +++ b/unotools/inc/unotools/localisationoptions.hxx @@ -27,17 +27,17 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_LOCALISATIONOPTIONS_HXX -#define INCLUDED_SVTOOLS_LOCALISATIONOPTIONS_HXX +#ifndef INCLUDED_unotools_LOCALISATIONOPTIONS_HXX +#define INCLUDED_unotools_LOCALISATIONOPTIONS_HXX //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ #include -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include -#include +#include //_________________________________________________________________________________________________________________ // forward declarations @@ -66,7 +66,7 @@ class SvtLocalisationOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtLocalisationOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtLocalisationOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public methods @@ -157,7 +157,7 @@ class SVL_DLLPUBLIC SvtLocalisationOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member @@ -178,4 +178,4 @@ class SVL_DLLPUBLIC SvtLocalisationOptions: public svt::detail::Options }; // class SvtLocalisationOptions -#endif // #ifndef INCLUDED_SVTOOLS_LOCALISATIONOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_LOCALISATIONOPTIONS_HXX diff --git a/svtools/source/config/loghelper.hxx b/unotools/inc/unotools/loghelper.hxx similarity index 100% rename from svtools/source/config/loghelper.hxx rename to unotools/inc/unotools/loghelper.hxx diff --git a/svtools/inc/misccfg.hxx b/unotools/inc/unotools/misccfg.hxx similarity index 63% rename from svtools/inc/misccfg.hxx rename to unotools/inc/unotools/misccfg.hxx index 3f897e1cecc3..14ecb12b388a 100644 --- a/svtools/inc/misccfg.hxx +++ b/unotools/inc/unotools/misccfg.hxx @@ -27,49 +27,44 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef _SFX_MISCCFG_HXX -#define _SFX_MISCCFG_HXX +#ifndef _UTL_MISCCFG_HXX +#define _UTL_MISCCFG_HXX -#include "svtools/svtdllapi.h" +#include "unotools/unotoolsdllapi.h" #include "tools/solar.h" -#include "unotools/configitem.hxx" +#include "unotools/options.hxx" /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ - -class SVT_DLLPUBLIC SfxMiscCfg : public utl::ConfigItem +namespace utl { - BOOL bPaperSize; // printer warnings - BOOL bPaperOrientation; - BOOL bNotFound; - sal_Int32 nYear2000; // two digit year representation + class SfxMiscCfg; - const com::sun::star::uno::Sequence& GetPropertyNames(); - void Load(); +class UNOTOOLS_DLLPUBLIC MiscCfg : public detail::Options +{ + SfxMiscCfg* pImpl; public: - SfxMiscCfg( ); - ~SfxMiscCfg( ); + MiscCfg( ); + virtual ~MiscCfg( ); - virtual void Notify( const com::sun::star::uno::Sequence& aPropertyNames); - virtual void Commit(); - - BOOL IsNotFoundWarning() const {return bNotFound;} + BOOL IsNotFoundWarning() const; void SetNotFoundWarning( BOOL bSet); - BOOL IsPaperSizeWarning() const {return bPaperSize;} + BOOL IsPaperSizeWarning() const; void SetPaperSizeWarning(BOOL bSet); - BOOL IsPaperOrientationWarning() const {return bPaperOrientation;} + BOOL IsPaperOrientationWarning() const; void SetPaperOrientationWarning( BOOL bSet); // 0 ... 99 - sal_Int32 GetYear2000() const { return nYear2000; } + sal_Int32 GetYear2000() const; void SetYear2000( sal_Int32 nSet ); - }; +} + #endif // _MISCCFG_HXX diff --git a/svtools/inc/svtools/moduleoptions.hxx b/unotools/inc/unotools/moduleoptions.hxx similarity index 98% rename from svtools/inc/svtools/moduleoptions.hxx rename to unotools/inc/unotools/moduleoptions.hxx index fc28ce1f399e..8b759a0834cf 100644 --- a/svtools/inc/svtools/moduleoptions.hxx +++ b/unotools/inc/unotools/moduleoptions.hxx @@ -35,14 +35,14 @@ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // const @@ -85,7 +85,7 @@ class SvtModuleOptions_Impl; @devstatus ready to use @threadsafe yes *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtModuleOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtModuleOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public const declarations! @@ -237,7 +237,7 @@ class SVL_DLLPUBLIC SvtModuleOptions: public svt::detail::Options // private methods //------------------------------------------------------------------------------------------------------------- private: - SVL_DLLPRIVATE static ::osl::Mutex& impl_GetOwnStaticMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& impl_GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member diff --git a/unotools/inc/unotools/options.hxx b/unotools/inc/unotools/options.hxx new file mode 100755 index 000000000000..b5664edac2d1 --- /dev/null +++ b/unotools/inc/unotools/options.hxx @@ -0,0 +1,100 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: options.hxx,v $ + * $Revision: 1.3 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef INCLUDED_unotools_OPTIONS_HXX +#define INCLUDED_unotools_OPTIONS_HXX + +#include "sal/config.h" +#include "unotools/unotoolsdllapi.h" + +/* + The class utl::detail::Options provides a kind of multiplexer. It implements a ConfigurationListener + that is usually registered at a ConfigItem class. At the same time it implements a ConfigurationBroadcaster + that allows further ("external") listeners to register. + Once the class deriving from Options is notified about + configuration changes by the ConfigItem if its content has been changed by calling some of its methods, + a call of the Options::NotifyListeners() method will send out notifications to all external listeners. +*/ + +namespace utl { + + class ConfigurationBroadcaster; + class IMPL_ConfigurationListenerList; + + // interface for configuration listener + class UNOTOOLS_DLLPUBLIC ConfigurationListener + { + public: + virtual void ConfigurationChanged( ConfigurationBroadcaster* p, sal_uInt32 nHint=0 ) = 0; + }; + + // complete broadcasting implementation + class UNOTOOLS_DLLPUBLIC ConfigurationBroadcaster + { + IMPL_ConfigurationListenerList* mpList; + sal_Int32 m_nBroadcastBlocked; // broadcast only if this is 0 + sal_uInt32 m_nBlockedHint; + + public: + void AddListener( utl::ConfigurationListener* pListener ); + void RemoveListener( utl::ConfigurationListener* pListener ); + + // notify listeners; nHint is an implementation detail of the particular class deriving from ConfigurationBroadcaster + void NotifyListeners( sal_uInt32 nHint ); + ConfigurationBroadcaster(); + virtual ~ConfigurationBroadcaster(); + virtual void BlockBroadcasts( bool bBlock ); + }; + +namespace detail { + +// A base class for the various option classes supported by +// unotools/source/config/itemholderbase.hxx (which must be public, as it is +// shared between unotools, svl and svt) +// It also provides an implementation for a Configuration Listener and inherits a broadcaster implementation + +class UNOTOOLS_DLLPUBLIC Options : public utl::ConfigurationBroadcaster, public utl::ConfigurationListener +{ +public: + Options(); + + virtual ~Options() = 0; + +private: + UNOTOOLS_DLLPRIVATE Options(Options &); // not defined + UNOTOOLS_DLLPRIVATE void operator =(Options &); // not defined + +protected: + virtual void ConfigurationChanged( ::utl::ConfigurationBroadcaster* p, sal_uInt32 nHint=0 ); +}; + +} } + +#endif diff --git a/svtools/inc/svtools/optionsdlg.hxx b/unotools/inc/unotools/optionsdlg.hxx similarity index 87% rename from svtools/inc/svtools/optionsdlg.hxx rename to unotools/inc/unotools/optionsdlg.hxx index 0ebfd1ab357d..87649a82358c 100644 --- a/svtools/inc/svtools/optionsdlg.hxx +++ b/unotools/inc/unotools/optionsdlg.hxx @@ -27,18 +27,18 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_OPTIONSDLG_HXX -#define INCLUDED_SVTOOLS_OPTIONSDLG_HXX +#ifndef INCLUDED_unotools_OPTIONSDLG_HXX +#define INCLUDED_unotools_OPTIONSDLG_HXX -#ifndef INCLUDED_SVTDLLAPI_H -#include "svtools/svldllapi.h" +#ifndef INCLUDED_unotoolsdllapi_H +#include "unotools/unotoolsdllapi.h" #endif #include -#include +#include class SvtOptionsDlgOptions_Impl; -class SVL_DLLPUBLIC SvtOptionsDialogOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtOptionsDialogOptions: public utl::detail::Options { private: SvtOptionsDlgOptions_Impl* m_pImp; diff --git a/svtools/inc/svtools/pathoptions.hxx b/unotools/inc/unotools/pathoptions.hxx similarity index 94% rename from svtools/inc/svtools/pathoptions.hxx rename to unotools/inc/unotools/pathoptions.hxx index 20185e79c886..e606180c25de 100644 --- a/svtools/inc/svtools/pathoptions.hxx +++ b/unotools/inc/unotools/pathoptions.hxx @@ -27,20 +27,20 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_PATHOPTIONS_HXX -#define INCLUDED_SVTOOLS_PATHOPTIONS_HXX +#ifndef INCLUDED_unotools_PATHOPTIONS_HXX +#define INCLUDED_unotools_PATHOPTIONS_HXX -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include -#include +#include #define SVT_SEARCHPATH_DELIMITER ';' // class SvtPathOptions -------------------------------------------------- class SvtPathOptions_Impl; -class SVL_DLLPUBLIC SvtPathOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtPathOptions: public utl::detail::Options { private: SvtPathOptions_Impl* pImp; @@ -139,5 +139,5 @@ public: sal_Bool IsReadonly() const; }; -#endif // #ifndef INCLUDED_SVTOOLS_PATHOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_PATHOPTIONS_HXX diff --git a/svtools/inc/svtools/printwarningoptions.hxx b/unotools/inc/unotools/printwarningoptions.hxx similarity index 95% rename from svtools/inc/svtools/printwarningoptions.hxx rename to unotools/inc/unotools/printwarningoptions.hxx index 863d407f221e..3663fb8c63d0 100644 --- a/svtools/inc/svtools/printwarningoptions.hxx +++ b/unotools/inc/unotools/printwarningoptions.hxx @@ -28,18 +28,18 @@ * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_PRINTWARNINGOPTIONS_HXX -#define INCLUDED_SVTOOLS_PRINTWARNINGOPTIONS_HXX +#ifndef INCLUDED_unotools_PRINTWARNINGOPTIONS_HXX +#define INCLUDED_unotools_PRINTWARNINGOPTIONS_HXX //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // forward declarations @@ -68,7 +68,7 @@ class SvtPrintWarningOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtPrintWarningOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtPrintWarningOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public methods @@ -141,7 +141,7 @@ class SVL_DLLPUBLIC SvtPrintWarningOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member @@ -161,4 +161,4 @@ class SVL_DLLPUBLIC SvtPrintWarningOptions: public svt::detail::Options }; // class SvtPrintWarningOptions -#endif // #ifndef INCLUDED_SVTOOLS_PRINTWARNINGOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_PRINTWARNINGOPTIONS_HXX diff --git a/svtools/inc/regoptions.hxx b/unotools/inc/unotools/regoptions.hxx similarity index 95% rename from svtools/inc/regoptions.hxx rename to unotools/inc/unotools/regoptions.hxx index 109cc6dd7754..3b0f6c760b1f 100644 --- a/svtools/inc/regoptions.hxx +++ b/unotools/inc/unotools/regoptions.hxx @@ -28,14 +28,14 @@ * ************************************************************************/ -#ifndef SVTOOLS_REGOPTIONS_HXX -#define SVTOOLS_REGOPTIONS_HXX +#ifndef unotools_REGOPTIONS_HXX +#define unotools_REGOPTIONS_HXX -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include //........................................................................ -namespace svt +namespace utl { //........................................................................ @@ -45,13 +45,13 @@ namespace svt class RegOptionsImpl; /** encapsulates access to the configuration settings for registering the product */ - class SVL_DLLPUBLIC RegOptions + class UNOTOOLS_DLLPUBLIC RegOptions { private: RegOptionsImpl* m_pImpl; // the impl class is constructed upon need only (as this is expensive) - SVL_DLLPRIVATE void ensureImpl( ); + UNOTOOLS_DLLPRIVATE void ensureImpl( ); public: RegOptions( ); @@ -122,8 +122,8 @@ namespace svt }; //........................................................................ -} // namespace svt +} // namespace utl //........................................................................ -#endif // SVTOOLS_REGOPTIONS_HXX +#endif // unotools_REGOPTIONS_HXX diff --git a/svtools/inc/svtools/saveopt.hxx b/unotools/inc/unotools/saveopt.hxx similarity index 85% rename from svtools/inc/svtools/saveopt.hxx rename to unotools/inc/unotools/saveopt.hxx index 6dfd083a3ca2..bb50cadafb1d 100644 --- a/svtools/inc/svtools/saveopt.hxx +++ b/unotools/inc/unotools/saveopt.hxx @@ -27,14 +27,14 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_SAVEOPT_HXX -#define INCLUDED_SVTOOLS_SAVEOPT_HXX +#ifndef INCLUDED_unotools_SAVEOPT_HXX +#define INCLUDED_unotools_SAVEOPT_HXX -#include "svtools/svldllapi.h" -#include +#include "unotools/unotoolsdllapi.h" +#include struct SvtLoadSaveOptions_Impl; -class SVL_DLLPUBLIC SvtSaveOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtSaveOptions: public utl::detail::Options { SvtLoadSaveOptions_Impl* pImp; @@ -60,12 +60,16 @@ public: E_ODFDEFAULTVERSION }; + // keep enum values sorted that a less or greater compare maps to older and newer versions! enum ODFDefaultVersion { ODFVER_UNKNOWN = 0, // unknown - ODFVER_010, // ODF 1.0 - ODFVER_011, // ODF 1.1 - ODFVER_012 // ODF 1.2 + ODFVER_010 = 1, // ODF 1.0 + ODFVER_011 = 2, // ODF 1.1 + DO_NOT_USE = 3, // Do not use this, only here for compatibility with pre OOo 3.2 configuration + ODFVER_012 = 4, // ODF 1.2 + + ODFVER_LATEST = SAL_MAX_ENUM, // ODF latest version with enhancements }; SvtSaveOptions(); diff --git a/svtools/inc/searchopt.hxx b/unotools/inc/unotools/searchopt.hxx similarity index 98% rename from svtools/inc/searchopt.hxx rename to unotools/inc/unotools/searchopt.hxx index 4475f406805d..4f53a1e050b0 100644 --- a/svtools/inc/searchopt.hxx +++ b/unotools/inc/unotools/searchopt.hxx @@ -31,12 +31,12 @@ #ifndef _SVT_SEARCHOPT_HXX_ #define _SVT_SEARCHOPT_HXX_ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include "tools/solar.h" class SvtSearchOptions_Impl; -class SVL_DLLPUBLIC SvtSearchOptions +class UNOTOOLS_DLLPUBLIC SvtSearchOptions { SvtSearchOptions_Impl *pImpl; diff --git a/svtools/inc/svtools/securityoptions.hxx b/unotools/inc/unotools/securityoptions.hxx similarity index 97% rename from svtools/inc/svtools/securityoptions.hxx rename to unotools/inc/unotools/securityoptions.hxx index 36ba2af9668a..bbca1770b836 100644 --- a/svtools/inc/svtools/securityoptions.hxx +++ b/unotools/inc/unotools/securityoptions.hxx @@ -27,19 +27,19 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_SECURITYOPTIONS_HXX -#define INCLUDED_SVTOOLS_SECURITYOPTIONS_HXX +#ifndef INCLUDED_unotools_SECURITYOPTIONS_HXX +#define INCLUDED_unotools_SECURITYOPTIONS_HXX //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // forward declarations @@ -82,7 +82,7 @@ enum EBasicSecurityMode @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtSecurityOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtSecurityOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public types @@ -275,7 +275,7 @@ class SVL_DLLPUBLIC SvtSecurityOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetInitMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetInitMutex(); //------------------------------------------------------------------------------------------------------------- // private member @@ -296,4 +296,4 @@ class SVL_DLLPUBLIC SvtSecurityOptions: public svt::detail::Options }; // class SvtSecurityOptions -#endif // #ifndef INCLUDED_SVTOOLS_SECURITYOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_SECURITYOPTIONS_HXX diff --git a/svtools/inc/svtools/sourceviewconfig.hxx b/unotools/inc/unotools/sourceviewconfig.hxx similarity index 82% rename from svtools/inc/svtools/sourceviewconfig.hxx rename to unotools/inc/unotools/sourceviewconfig.hxx index 0e3f6a34e3c1..cc28bd3dae61 100644 --- a/svtools/inc/svtools/sourceviewconfig.hxx +++ b/unotools/inc/unotools/sourceviewconfig.hxx @@ -27,26 +27,23 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef _SVTOOLS_SOURCEVIEWCONFIG_HXX -#define _SVTOOLS_SOURCEVIEWCONFIG_HXX +#ifndef _unotools_SOURCEVIEWCONFIG_HXX +#define _unotools_SOURCEVIEWCONFIG_HXX // include --------------------------------------------------------------- -#include "svtools/svldllapi.h" -#include -#include +#include "unotools/unotoolsdllapi.h" #include #include -#include +#include /* -----------------------------12.10.00 11:40-------------------------------- ---------------------------------------------------------------------------*/ -namespace svt +namespace utl { class SourceViewConfig_Impl; - class SVL_DLLPUBLIC SourceViewConfig: - public svt::detail::Options, public SfxBroadcaster, private SfxListener + class UNOTOOLS_DLLPUBLIC SourceViewConfig: public utl::detail::Options { static SourceViewConfig_Impl* m_pImplConfig; static sal_Int32 m_nRefCount; @@ -63,9 +60,6 @@ namespace svt sal_Bool IsShowProportionalFontsOnly() const; void SetShowProportionalFontsOnly(sal_Bool bSet); - - //SfxListener: - virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); }; } #endif diff --git a/svtools/inc/svtools/startoptions.hxx b/unotools/inc/unotools/startoptions.hxx similarity index 95% rename from svtools/inc/svtools/startoptions.hxx rename to unotools/inc/unotools/startoptions.hxx index 82a3c761965e..a23fb08fce6b 100644 --- a/svtools/inc/svtools/startoptions.hxx +++ b/unotools/inc/unotools/startoptions.hxx @@ -27,18 +27,18 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_STARTOPTIONS_HXX -#define INCLUDED_SVTOOLS_STARTOPTIONS_HXX +#ifndef INCLUDED_unotools_STARTOPTIONS_HXX +#define INCLUDED_unotools_STARTOPTIONS_HXX //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // forward declarations @@ -67,7 +67,7 @@ class SvtStartOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtStartOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtStartOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public methods @@ -149,7 +149,7 @@ class SVL_DLLPUBLIC SvtStartOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member @@ -170,4 +170,4 @@ class SVL_DLLPUBLIC SvtStartOptions: public svt::detail::Options }; // class SvtStartOptions -#endif // #ifndef INCLUDED_SVTOOLS_STARTOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_STARTOPTIONS_HXX diff --git a/svtools/inc/svtools/syslocale.hxx b/unotools/inc/unotools/syslocale.hxx similarity index 81% rename from svtools/inc/svtools/syslocale.hxx rename to unotools/inc/unotools/syslocale.hxx index bd853d0d4eeb..adce66b7e84a 100644 --- a/svtools/inc/svtools/syslocale.hxx +++ b/unotools/inc/unotools/syslocale.hxx @@ -28,16 +28,18 @@ * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_SYSLOCALE_HXX -#define INCLUDED_SVTOOLS_SYSLOCALE_HXX +#ifndef INCLUDED_UNOTOOLS_SYSLOCALE_HXX +#define INCLUDED_UNOTOOLS_SYSLOCALE_HXX -#include "svtools/svtdllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include - +#include class SvtSysLocale_Impl; +class SvtSysLocaleOptions; + namespace osl { class Mutex; } class LocaleDataWrapper; @@ -50,14 +52,14 @@ class LocaleDataWrapper; SvtSysLocale is not expensive as long as there is at least one instance left. */ -class SVT_DLLPUBLIC SvtSysLocale +class UNOTOOLS_DLLPUBLIC SvtSysLocale { friend class SvtSysLocale_Impl; // access to mutex static SvtSysLocale_Impl* pImpl; static sal_Int32 nRefCount; - SVT_DLLPRIVATE static ::osl::Mutex& GetMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetMutex(); public: SvtSysLocale(); @@ -72,7 +74,11 @@ public: */ const LocaleDataWrapper* GetLocaleDataPtr() const; const CharClass* GetCharClassPtr() const; - + SvtSysLocaleOptions& GetOptions() const; + com::sun::star::lang::Locale GetLocale() const; + LanguageType GetLanguage() const; + com::sun::star::lang::Locale GetUILocale() const; + LanguageType GetUILanguage() const; }; #endif // INCLUDED_SVTOOLS_SYSLOCALE_HXX diff --git a/svtools/inc/svtools/syslocaleoptions.hxx b/unotools/inc/unotools/syslocaleoptions.hxx old mode 100644 new mode 100755 similarity index 85% rename from svtools/inc/svtools/syslocaleoptions.hxx rename to unotools/inc/unotools/syslocaleoptions.hxx index 19e130fea45b..b417e00eec12 --- a/svtools/inc/svtools/syslocaleoptions.hxx +++ b/unotools/inc/unotools/syslocaleoptions.hxx @@ -31,35 +31,39 @@ #ifndef INCLUDED_SVTOOLS_SYSLOCALEOPTIONS_HXX #define INCLUDED_SVTOOLS_SYSLOCALEOPTIONS_HXX -#include "svtools/svtdllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include #include #include #include -#include +#include // bits for broadcasting hints of changes in a SfxSimpleHint, may be combined const ULONG SYSLOCALEOPTIONS_HINT_LOCALE = 0x00000001; const ULONG SYSLOCALEOPTIONS_HINT_CURRENCY = 0x00000002; +const ULONG SYSLOCALEOPTIONS_HINT_UILOCALE = 0x00000004; +const ULONG SYSLOCALEOPTIONS_HINT_DECSEP = 0x00000008; class SvtSysLocaleOptions_Impl; class SvtListener; namespace osl { class Mutex; } -class SVT_DLLPUBLIC SvtSysLocaleOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtSysLocaleOptions: public utl::detail::Options { static SvtSysLocaleOptions_Impl* pOptions; static sal_Int32 nRefCount; - SVT_DLLPRIVATE static ::osl::Mutex& GetMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetMutex(); + virtual void ConfigurationChanged( utl::ConfigurationBroadcaster* p, sal_uInt32 nHint ); public: enum EOption { E_LOCALE, + E_UILOCALE, E_CURRENCY }; SvtSysLocaleOptions(); @@ -76,8 +80,6 @@ public: if added if not added */ - BOOL AddListener( SvtListener& ); - BOOL RemoveListener( SvtListener& ); /** Block broadcasts and accumulate hints. This may be useful if, for example, the locale and currency are changed and the currency was @@ -97,13 +99,23 @@ public: BlockBroadcasts(FALSE) or otherwise pending hints would never be broadcasted again. */ - void BlockBroadcasts( BOOL bBlock ); + virtual void BlockBroadcasts( bool bBlock ); // config value access methods /// The config string may be empty to denote the SYSTEM locale const ::rtl::OUString& GetLocaleConfigString() const; void SetLocaleConfigString( const ::rtl::OUString& rStr ); + com::sun::star::lang::Locale GetLocale() const; + com::sun::star::lang::Locale GetRealLocale() const; + LanguageType GetRealLanguage() const; + + /// The config string may be empty to denote the SYSTEM locale + const ::rtl::OUString& GetUILocaleConfigString() const; + void SetUILocaleConfigString( const ::rtl::OUString& rStr ); + com::sun::star::lang::Locale GetUILocale() const; + com::sun::star::lang::Locale GetRealUILocale() const; + LanguageType GetRealUILanguage() const; /// The config string may be empty to denote the default currency of the locale const ::rtl::OUString& GetCurrencyConfigString() const; @@ -115,11 +127,6 @@ public: // convenience methods - /** Get the LanguageType of the current locale, may be LANGUAGE_SYSTEM if - LocaleConfigString is empty. If you need the real locale used in the - application, call Application::GetSettings().GetLanguage() instead */ - LanguageType GetLocaleLanguageType() const; - /// Get currency abbreviation and locale from an USD-en-US or EUR-de-DE string static void GetCurrencyAbbrevAndLanguage( String& rAbbrev, diff --git a/svtools/inc/svtools/undoopt.hxx b/unotools/inc/unotools/undoopt.hxx similarity index 79% rename from svtools/inc/svtools/undoopt.hxx rename to unotools/inc/unotools/undoopt.hxx index 7fa63c104eec..288ec3c6b5de 100644 --- a/svtools/inc/svtools/undoopt.hxx +++ b/unotools/inc/unotools/undoopt.hxx @@ -27,19 +27,16 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_UNDOOPT_HXX -#define INCLUDED_SVTOOLS_UNDOOPT_HXX +#ifndef INCLUDED_unotools_UNDOOPT_HXX +#define INCLUDED_unotools_UNDOOPT_HXX -#include "svtools/svtdllapi.h" +#include "unotools/unotoolsdllapi.h" #include -#include -#include -#include +#include class SvtUndoOptions_Impl; -class SVT_DLLPUBLIC SvtUndoOptions: - public svt::detail::Options, public SfxBroadcaster, public SfxListener +class UNOTOOLS_DLLPUBLIC SvtUndoOptions: public utl::detail::Options { SvtUndoOptions_Impl* pImp; @@ -47,8 +44,6 @@ public: SvtUndoOptions(); virtual ~SvtUndoOptions(); - virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); - void SetUndoCount( sal_Int32 n ); sal_Int32 GetUndoCount() const; }; diff --git a/svtools/inc/svtools/useroptions.hxx b/unotools/inc/unotools/useroptions.hxx similarity index 91% rename from svtools/inc/svtools/useroptions.hxx rename to unotools/inc/unotools/useroptions.hxx index f5a07a2e4e79..67fd3e5bbf35 100644 --- a/svtools/inc/svtools/useroptions.hxx +++ b/unotools/inc/unotools/useroptions.hxx @@ -27,16 +27,14 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_USEROPTIONS_HXX -#define INCLUDED_SVTOOLS_USEROPTIONS_HXX +#ifndef INCLUDED_unotools_USEROPTIONS_HXX +#define INCLUDED_unotools_USEROPTIONS_HXX -#include "svtools/svtdllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include -#include -#include -#include +#include // define ---------------------------------------------------------------- @@ -62,8 +60,7 @@ class SvtUserOptions_Impl; -class SVT_DLLPUBLIC SvtUserOptions: - public svt::detail::Options, public SfxBroadcaster, public SfxListener +class UNOTOOLS_DLLPUBLIC SvtUserOptions: public utl::detail::Options { private: SvtUserOptions_Impl* pImp; @@ -74,8 +71,6 @@ public: static ::osl::Mutex& GetInitMutex(); - virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); - // get the address token ::rtl::OUString GetCompany() const; ::rtl::OUString GetFirstName() const; @@ -123,4 +118,4 @@ public: ::rtl::OUString GetToken(USHORT nToken) const; }; -#endif // #ifndef INCLUDED_SVTOOLS_USEROPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_USEROPTIONS_HXX diff --git a/svtools/source/inc/configitems/useroptions_const.hxx b/unotools/inc/unotools/useroptions_const.hxx similarity index 100% rename from svtools/source/inc/configitems/useroptions_const.hxx rename to unotools/inc/unotools/useroptions_const.hxx diff --git a/svtools/inc/svtools/viewoptions.hxx b/unotools/inc/unotools/viewoptions.hxx similarity index 98% rename from svtools/inc/svtools/viewoptions.hxx rename to unotools/inc/unotools/viewoptions.hxx index e95af38cb322..07f4da9e3159 100644 --- a/svtools/inc/svtools/viewoptions.hxx +++ b/unotools/inc/unotools/viewoptions.hxx @@ -27,14 +27,14 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_VIEWOPTIONS_HXX -#define INCLUDED_SVTOOLS_VIEWOPTIONS_HXX +#ifndef INCLUDED_unotools_VIEWOPTIONS_HXX +#define INCLUDED_unotools_VIEWOPTIONS_HXX //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include "svtools/svldllapi.h" +#include "unotools/unotoolsdllapi.h" #include #include #include @@ -42,7 +42,7 @@ #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // forward declarations @@ -122,7 +122,7 @@ enum EViewType @devstatus ready to use *//*-*************************************************************************************************************/ -class SVL_DLLPUBLIC SvtViewOptions: public svt::detail::Options +class UNOTOOLS_DLLPUBLIC SvtViewOptions: public utl::detail::Options { /* #ifdef TF_OLDVIEW @@ -318,7 +318,7 @@ class SVL_DLLPUBLIC SvtViewOptions: public svt::detail::Options @onerror - *//*-*****************************************************************************************************/ - SVL_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); + UNOTOOLS_DLLPRIVATE static ::osl::Mutex& GetOwnStaticMutex(); //------------------------------------------------------------------------------------------------------------- // private member @@ -353,4 +353,4 @@ class SVL_DLLPUBLIC SvtViewOptions: public svt::detail::Options }; // class SvtViewOptions -#endif // #ifndef INCLUDED_SVTOOLS_VIEWOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_VIEWOPTIONS_HXX diff --git a/svtools/inc/svtools/workingsetoptions.hxx b/unotools/inc/unotools/workingsetoptions.hxx similarity index 96% rename from svtools/inc/svtools/workingsetoptions.hxx rename to unotools/inc/unotools/workingsetoptions.hxx index b66f71512e7e..9a422e25cc32 100644 --- a/svtools/inc/svtools/workingsetoptions.hxx +++ b/unotools/inc/unotools/workingsetoptions.hxx @@ -27,8 +27,8 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_WORKINGSETOPTIONS_HXX -#define INCLUDED_SVTOOLS_WORKINGSETOPTIONS_HXX +#ifndef INCLUDED_unotools_WORKINGSETOPTIONS_HXX +#define INCLUDED_unotools_WORKINGSETOPTIONS_HXX //_________________________________________________________________________________________________________________ // includes @@ -38,7 +38,7 @@ #include #include #include -#include +#include //_________________________________________________________________________________________________________________ // forward declarations @@ -67,7 +67,7 @@ class SvtWorkingSetOptions_Impl; @devstatus ready to use *//*-*************************************************************************************************************/ -class SvtWorkingSetOptions: public svt::detail::Options +class SvtWorkingSetOptions: public utl::detail::Options { //------------------------------------------------------------------------------------------------------------- // public methods @@ -156,4 +156,4 @@ class SvtWorkingSetOptions: public svt::detail::Options }; // class SvtWorkingSetOptions -#endif // #ifndef INCLUDED_SVTOOLS_WORKINGSETOPTIONS_HXX +#endif // #ifndef INCLUDED_unotools_WORKINGSETOPTIONS_HXX diff --git a/svtools/inc/xmlaccelcfg.hxx b/unotools/inc/unotools/xmlaccelcfg.hxx similarity index 97% rename from svtools/inc/xmlaccelcfg.hxx rename to unotools/inc/unotools/xmlaccelcfg.hxx index 00967b234111..8b975f2a26ff 100644 --- a/svtools/inc/xmlaccelcfg.hxx +++ b/unotools/inc/unotools/xmlaccelcfg.hxx @@ -28,15 +28,15 @@ * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_XMLACCELCFG_HXX -#define INCLUDED_SVTOOLS_XMLACCELCFG_HXX +#ifndef INCLUDED_unotools_XMLACCELCFG_HXX +#define INCLUDED_unotools_XMLACCELCFG_HXX #ifndef __COM_SUN_STAR_XML_SAX_XDOCUMENTHANDLER_HPP_ #include #endif #include -#include +#include class OReadAccelatorDocumentHandler : public ::com::sun::star::xml::sax::XDocumentHandler, public ::cppu::OWeakObject @@ -109,4 +109,4 @@ class OWriteAccelatorDocumentHandler const SvtAcceleratorItemList& m_aWriteAcceleratorList; }; -#endif // INCLUDED_SVTOOLS_XMLACCELCFG_HXX +#endif // INCLUDED_unotools_XMLACCELCFG_HXX diff --git a/svtools/source/config/accelcfg.cxx b/unotools/source/config/accelcfg.cxx similarity index 98% rename from svtools/source/config/accelcfg.cxx rename to unotools/source/config/accelcfg.cxx index 6daa1a9491a2..f911b36e83fe 100644 --- a/svtools/source/config/accelcfg.cxx +++ b/unotools/source/config/accelcfg.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif #include "rtl/instance.hxx" @@ -50,9 +50,9 @@ #include #include -#include -#include "xmlaccelcfg.hxx" -#include +#include +#include +#include #include "itemholder1.hxx" diff --git a/svtools/source/config/cacheoptions.cxx b/unotools/source/config/cacheoptions.cxx similarity index 98% rename from svtools/source/config/cacheoptions.cxx rename to unotools/source/config/cacheoptions.cxx index 39b2b2c74085..dc8031ea0078 100644 --- a/svtools/source/config/cacheoptions.cxx +++ b/unotools/source/config/cacheoptions.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif @@ -37,7 +37,7 @@ // includes //_________________________________________________________________________________________________________________ -#include "cacheoptions.hxx" +#include #include #include #include @@ -94,6 +94,7 @@ public: //--------------------------------------------------------------------------------------------------------- virtual void Commit(); + virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames ); //--------------------------------------------------------------------------------------------------------- // public interface @@ -247,6 +248,10 @@ void SvtCacheOptions_Impl::Commit() PutProperties( aSeqNames, aSeqValues ); } +void SvtCacheOptions_Impl::Notify( const Sequence< rtl::OUString >& ) +{ +} + //***************************************************************************************************************** // public method //***************************************************************************************************************** diff --git a/svtools/source/config/cmdoptions.cxx b/unotools/source/config/cmdoptions.cxx similarity index 99% rename from svtools/source/config/cmdoptions.cxx rename to unotools/source/config/cmdoptions.cxx index 356b6782b892..421b201d98c0 100644 --- a/svtools/source/config/cmdoptions.cxx +++ b/unotools/source/config/cmdoptions.cxx @@ -29,13 +29,13 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include +#include #include #include #include diff --git a/svtools/source/config/compatibility.cxx b/unotools/source/config/compatibility.cxx similarity index 99% rename from svtools/source/config/compatibility.cxx rename to unotools/source/config/compatibility.cxx index a55aff0c90f8..46967eb7b43d 100644 --- a/svtools/source/config/compatibility.cxx +++ b/unotools/source/config/compatibility.cxx @@ -29,13 +29,13 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include +#include #include #include #include diff --git a/unotools/source/config/configitem.cxx b/unotools/source/config/configitem.cxx index a6b3bbaa1e2f..3d70f99f4ec0 100644 --- a/unotools/source/config/configitem.cxx +++ b/unotools/source/config/configitem.cxx @@ -33,6 +33,7 @@ #include "unotools/configitem.hxx" #include "unotools/configmgr.hxx" #include "unotools/configpathes.hxx" +#include #include #include #include @@ -43,12 +44,13 @@ #include #include #include +#include #include #include #include #include #include - +#include #include using namespace utl; @@ -81,15 +83,22 @@ catch(Exception& rEx) \ #define CATCH_INFO(a) catch(Exception& ){} #endif +/* + The ConfigChangeListener_Impl receives notifications from the configuration about changes that + have happened. It forwards this notification to the ConfigItem it knows a pParent by calling its + "CallNotify" method. As ConfigItems are most probably not thread safe, the SolarMutex is acquired + before doing so. +*/ + namespace utl{ class ConfigChangeListener_Impl : public cppu::WeakImplHelper1 < com::sun::star::util::XChangesListener > { + public: ConfigItem* pParent; const Sequence< OUString > aPropertyNames; - public: ConfigChangeListener_Impl(ConfigItem& rItem, const Sequence< OUString >& rNames); ~ConfigChangeListener_Impl(); @@ -98,7 +107,6 @@ namespace utl{ //XEventListener virtual void SAL_CALL disposing( const EventObject& Source ) throw(RuntimeException); - }; /* -----------------------------12.02.01 11:38-------------------------------- @@ -208,12 +216,17 @@ void ConfigChangeListener_Impl::changesOccurred( const ChangesEvent& rEvent ) th if(lcl_Find(sTemp, pCheckPropertyNames, aPropertyNames.getLength())) pNames[nNotify++] = sTemp; } - if(nNotify) + if( nNotify ) { - aChangedNames.realloc(nNotify); - pParent->CallNotify(aChangedNames); + if ( ::tools::SolarMutex::Acquire() ) + { + aChangedNames.realloc(nNotify); + pParent->CallNotify(aChangedNames); + ::tools::SolarMutex::Release(); + } } } + /* -----------------------------29.08.00 16:34-------------------------------- ---------------------------------------------------------------------------*/ @@ -271,13 +284,6 @@ ConfigItem::~ConfigItem() } delete pImpl; } -/* -----------------------------29.08.00 12:52-------------------------------- - - ---------------------------------------------------------------------------*/ -void ConfigItem::Commit() -{ - OSL_ENSURE(sal_False, "Base class called"); -} /* -----------------------------29.08.00 12:52-------------------------------- ---------------------------------------------------------------------------*/ @@ -302,16 +308,13 @@ void ConfigItem::ReleaseConfigMgr() ---------------------------------------------------------------------------*/ void ConfigItem::CallNotify( const com::sun::star::uno::Sequence& rPropertyNames ) { + // the call is forwarded to the virtual Notify() method + // it is pure virtual, so all classes deriving from ConfigItem have to decide how they + // want to notify listeners if(!IsInValueChange() || pImpl->bEnableInternalNotification) Notify(rPropertyNames); } -/* -----------------------------29.08.00 12:52-------------------------------- - ---------------------------------------------------------------------------*/ -void ConfigItem::Notify( const com::sun::star::uno::Sequence& /*rPropertyNames*/) -{ - OSL_ENSURE(sal_False, "Base class called"); -} /* -----------------------------12.12.00 17:09-------------------------------- ---------------------------------------------------------------------------*/ @@ -1420,4 +1423,3 @@ void ConfigItem::UnlockTree() } - diff --git a/unotools/source/config/confignode.cxx b/unotools/source/config/confignode.cxx index 56d0b1b06118..4b1b9fe272db 100644 --- a/unotools/source/config/confignode.cxx +++ b/unotools/source/config/confignode.cxx @@ -129,11 +129,6 @@ namespace utl return *this; } - //------------------------------------------------------------------------ - OConfigurationNode::~OConfigurationNode() - { - } - //------------------------------------------------------------------------ void OConfigurationNode::_disposing( const EventObject& _rSource ) { diff --git a/svtools/source/config/defaultoptions.cxx b/unotools/source/config/defaultoptions.cxx similarity index 97% rename from svtools/source/config/defaultoptions.cxx rename to unotools/source/config/defaultoptions.cxx index fbbcf60a11a6..baaa4a220a93 100644 --- a/svtools/source/config/defaultoptions.cxx +++ b/unotools/source/config/defaultoptions.cxx @@ -29,10 +29,10 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" -#include -#include +#include +#include #include #include #include @@ -111,6 +111,8 @@ public: SvtDefaultOptions_Impl(); String GetDefaultPath( USHORT nId ) const; + virtual void Commit(); + virtual void Notify( const com::sun::star::uno::Sequence& aPropertyNames); }; // global ---------------------------------------------------------------- @@ -189,6 +191,16 @@ Sequence< OUString > GetDefaultPropertyNames() return aNames; } +void SvtDefaultOptions_Impl::Notify( const Sequence< rtl::OUString >& ) +{ + // no notification, will never be changed +} + +void SvtDefaultOptions_Impl::Commit() +{ + // will never be changed +} + // class SvtDefaultOptions_Impl ------------------------------------------ String SvtDefaultOptions_Impl::GetDefaultPath( USHORT nId ) const diff --git a/svtools/source/config/dynamicmenuoptions.cxx b/unotools/source/config/dynamicmenuoptions.cxx similarity index 99% rename from svtools/source/config/dynamicmenuoptions.cxx rename to unotools/source/config/dynamicmenuoptions.cxx index 7b60a1c3716c..d3fca4350a67 100644 --- a/svtools/source/config/dynamicmenuoptions.cxx +++ b/unotools/source/config/dynamicmenuoptions.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif @@ -37,8 +37,8 @@ // includes //_________________________________________________________________________________________________________________ -#include -#include +#include +#include #include #include #include diff --git a/svtools/source/config/eventcfg.cxx b/unotools/source/config/eventcfg.cxx similarity index 83% rename from svtools/source/config/eventcfg.cxx rename to unotools/source/config/eventcfg.cxx index ae2041356fd3..3155f4ac2fa7 100644 --- a/svtools/source/config/eventcfg.cxx +++ b/unotools/source/config/eventcfg.cxx @@ -29,9 +29,9 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" -#include "eventcfg.hxx" +#include #include #include #include @@ -62,24 +62,70 @@ using namespace ::com::sun::star; #define SETNODE_BINDINGS OUString(RTL_CONSTASCII_USTRINGPARAM("Bindings" )) #define PROPERTYNAME_BINDINGURL OUString(RTL_CONSTASCII_USTRINGPARAM("BindingURL")) +const char* pEventAsciiNames[] = +{ +"OnStartApp", +"OnCloseApp", +"OnCreate", +"OnNew", +"OnLoadFinished", +"OnLoad", +"OnPrepareUnload", +"OnUnload", +"OnSave", +"OnSaveDone", +"OnSaveFailed", +"OnSaveAs", +"OnSaveAsDone", +"OnSaveAsFailed", +"OnCopyTo", +"OnCopyToDone", +"OnCopyToFailed", +"OnFocus", +"OnUnfocus", +"OnPrint", +"OnViewCreated", +"OnPrepareViewClosing", +"OnViewClosed", +"OnModifyChanged", +"OnTitleChanged", +"OnVisAreaChanged", +"OnModeChanged", +"OnStorageChanged" +}; + GlobalEventConfig_Impl::GlobalEventConfig_Impl() : ConfigItem( ROOTNODE_EVENTS, CONFIG_MODE_IMMEDIATE_UPDATE ) { // the supported event names - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnStartApp")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnCloseApp")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnNew")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnUnload")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnPrepareUnload")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnLoad")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnSave")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnSaveAs")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnSaveDone")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnSaveAsDone")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnFocus")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnUnfocus")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnPrint")); - m_supportedEvents.push_back(::rtl::OUString::createFromAscii("OnModifyChanged")); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_STARTAPP] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_CLOSEAPP] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_DOCCREATED] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_CREATEDOC] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_LOADFINISHED] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_OPENDOC] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_PREPARECLOSEDOC] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_CLOSEDOC] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_SAVEDOC] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_SAVEDOCDONE] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_SAVEDOCFAILED] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_SAVEASDOC] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_SAVEASDOCDONE] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_SAVEASDOCFAILED] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_SAVETODOC] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_SAVETODOCDONE] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_SAVETODOCFAILED] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_ACTIVATEDOC] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_DEACTIVATEDOC] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_PRINTDOC] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_VIEWCREATED] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_PREPARECLOSEVIEW] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_CLOSEVIEW] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_MODIFYCHANGED] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_TITLECHANGED] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_VISAREACHANGED] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_MODECHANGED] ) ); + m_supportedEvents.push_back(::rtl::OUString::createFromAscii( pEventAsciiNames[STR_EVENT_STORAGECHANGED] ) ); initBindingInfo(); @@ -103,6 +149,14 @@ GlobalEventConfig_Impl::~GlobalEventConfig_Impl() } } +::rtl::OUString GlobalEventConfig_Impl::GetEventName( sal_Int32 nIndex ) +{ + if ( nIndex < (sal_Int32) m_supportedEvents.size() ) + return m_supportedEvents[nIndex]; + else + return rtl::OUString(); +} + //***************************************************************************************************************** // public method //***************************************************************************************************************** @@ -396,3 +450,9 @@ Mutex& GlobalEventConfig::GetOwnStaticMutex() // Return new created or already existing mutex object. return *pMutex; } + +::rtl::OUString GlobalEventConfig::GetEventName( sal_Int32 nIndex ) +{ + return GlobalEventConfig().m_pImpl->GetEventName( nIndex ); +} + diff --git a/svtools/source/config/extendedsecurityoptions.cxx b/unotools/source/config/extendedsecurityoptions.cxx similarity index 99% rename from svtools/source/config/extendedsecurityoptions.cxx rename to unotools/source/config/extendedsecurityoptions.cxx index 2f3c57ea4748..b4d21f79246b 100644 --- a/svtools/source/config/extendedsecurityoptions.cxx +++ b/unotools/source/config/extendedsecurityoptions.cxx @@ -29,13 +29,13 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include +#include #include #include #include @@ -45,7 +45,7 @@ #include #include -#include +#include #include @@ -447,7 +447,7 @@ SvtExtendedSecurityOptions::SvtExtendedSecurityOptions() // ... and initialize ouer data container only if it not already exist! if( m_pDataContainer == NULL ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtExtendedSecurityOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtExtendedSecurityOptions_Impl::ctor()"); m_pDataContainer = new SvtExtendedSecurityOptions_Impl; ItemHolder1::holdConfigItem(E_EXTENDEDSECURITYOPTIONS); diff --git a/svtools/source/config/fltrcfg.cxx b/unotools/source/config/fltrcfg.cxx similarity index 98% rename from svtools/source/config/fltrcfg.cxx rename to unotools/source/config/fltrcfg.cxx index 056826bf62ba..a0870ff6a8a5 100644 --- a/svtools/source/config/fltrcfg.cxx +++ b/unotools/source/config/fltrcfg.cxx @@ -29,9 +29,9 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" -#include "fltrcfg.hxx" +#include #include #include @@ -81,6 +81,7 @@ public: bSaveVBA(sal_False) {} ~SvtAppFilterOptions_Impl(); virtual void Commit(); + virtual void Notify( const com::sun::star::uno::Sequence& aPropertyNames); void Load(); sal_Bool IsLoad() const {return bLoadVBA;} @@ -125,6 +126,13 @@ void SvtAppFilterOptions_Impl::Commit() PutProperties(aNames, aValues); } + +void SvtAppFilterOptions_Impl::Notify( const Sequence< rtl::OUString >& ) +{ + // no listeners supported yet +} + + /* -----------------------------22.01.01 10:38-------------------------------- ---------------------------------------------------------------------------*/ @@ -280,7 +288,7 @@ SvtFilterOptions::SvtFilterOptions() : ConfigItem( C2U("Office.Common/Filter/Microsoft") ), pImp(new SvtFilterOptions_Impl) { - RTL_LOGFILE_CONTEXT(aLog, "svtools SvtFilterOptions::SvtFilterOptions()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools SvtFilterOptions::SvtFilterOptions()"); EnableNotification(GetPropertyNames()); Load(); } diff --git a/vcl/source/gdi/fontcfg.cxx b/unotools/source/config/fontcfg.cxx similarity index 88% rename from vcl/source/gdi/fontcfg.cxx rename to unotools/source/config/fontcfg.cxx index 68d3b499341d..3ee556f372c7 100644 --- a/vcl/source/gdi/fontcfg.cxx +++ b/unotools/source/config/fontcfg.cxx @@ -29,18 +29,17 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_vcl.hxx" -#include -#include -#include -#include -#include -#include +#include "precompiled_unotools.hxx" +#include +#include +#include #include #include #include #include +#include #include +#include #if OSL_DEBUG_LEVEL > 1 #include @@ -52,9 +51,7 @@ #define DEFAULTFONT_CONFIGNODE "VCL/DefaultFonts" #define SUBSTFONT_CONFIGNODE "VCL/FontSubstitutions" -#define SETTINGS_CONFIGNODE "VCL/Settings" -using namespace vcl; using namespace rtl; using namespace utl; using namespace com::sun::star::uno; @@ -62,6 +59,9 @@ using namespace com::sun::star::lang; using namespace com::sun::star::beans; using namespace com::sun::star::container; +static DefaultFontConfiguration* mpDefaultFontConfiguration = 0; + +static FontSubstConfiguration* mpFontSubstConfiguration = 0; /* * DefaultFontConfiguration @@ -102,10 +102,9 @@ static const char* getKeyType( int nKeyType ) DefaultFontConfiguration* DefaultFontConfiguration::get() { - ImplSVData* pSVData = ImplGetSVData(); - if( ! pSVData->maGDIData.mpDefaultFontConfiguration ) - pSVData->maGDIData.mpDefaultFontConfiguration = new DefaultFontConfiguration(); - return pSVData->maGDIData.mpDefaultFontConfiguration; + if( !mpDefaultFontConfiguration ) + mpDefaultFontConfiguration = new DefaultFontConfiguration(); + return mpDefaultFontConfiguration; } DefaultFontConfiguration::DefaultFontConfiguration() @@ -113,7 +112,7 @@ DefaultFontConfiguration::DefaultFontConfiguration() try { // get service provider - Reference< XMultiServiceFactory > xSMgr( unohelper::GetMultiServiceFactory() ); + Reference< XMultiServiceFactory > xSMgr( comphelper::getProcessServiceFactory() ); // create configuration hierachical access name if( xSMgr.is() ) { @@ -271,7 +270,7 @@ OUString DefaultFontConfiguration::getUserInterfaceFont( const Locale& rLocale ) { Locale aLocale = rLocale; if( ! aLocale.Language.getLength() ) - aLocale = Application::GetSettings().GetUILocale(); + aLocale = SvtSysLocale().GetUILocale(); OUString aUIFont = getDefaultFont( aLocale, DEFAULTFONT_UI_SANS ); @@ -378,10 +377,9 @@ OUString DefaultFontConfiguration::getUserInterfaceFont( const Locale& rLocale ) FontSubstConfiguration* FontSubstConfiguration::get() { - ImplSVData* pSVData = ImplGetSVData(); - if( ! pSVData->maGDIData.mpFontSubstConfiguration ) - pSVData->maGDIData.mpFontSubstConfiguration = new FontSubstConfiguration(); - return pSVData->maGDIData.mpFontSubstConfiguration; + if( !mpFontSubstConfiguration ) + mpFontSubstConfiguration = new FontSubstConfiguration(); + return mpFontSubstConfiguration; } /* @@ -394,7 +392,7 @@ FontSubstConfiguration::FontSubstConfiguration() : try { // get service provider - Reference< XMultiServiceFactory > xSMgr( unohelper::GetMultiServiceFactory() ); + Reference< XMultiServiceFactory > xSMgr( comphelper::getProcessServiceFactory() ); // create configuration hierachical access name if( xSMgr.is() ) { @@ -1192,7 +1190,7 @@ const FontNameAttr* FontSubstConfiguration::getSubstInfo( const String& rFontNam aLocale.Variant = rLocale.Variant.toAsciiUpperCase(); if( ! aLocale.Language.getLength() ) - aLocale = Application::GetSettings().GetUILocale(); + aLocale = SvtSysLocale().GetUILocale(); while( aLocale.Language.getLength() ) { @@ -1220,162 +1218,3 @@ const FontNameAttr* FontSubstConfiguration::getSubstInfo( const String& rFontNam return NULL; } -/* - * SettingsConfigItem::get - */ - -SettingsConfigItem* SettingsConfigItem::get() -{ - ImplSVData* pSVData = ImplGetSVData(); - if( ! pSVData->mpSettingsConfigItem ) - pSVData->mpSettingsConfigItem = new SettingsConfigItem(); - return pSVData->mpSettingsConfigItem; -} - -/* - * SettignsConfigItem constructor - */ - -SettingsConfigItem::SettingsConfigItem() - : - ConfigItem( OUString( RTL_CONSTASCII_USTRINGPARAM( SETTINGS_CONFIGNODE ) ), - CONFIG_MODE_DELAYED_UPDATE ), - m_aSettings( 0 ) -{ - getValues(); -} - -/* - * SettingsConfigItem destructor - */ - -SettingsConfigItem::~SettingsConfigItem() -{ - if( IsModified() ) - Commit(); -} - -/* - * SettingsConfigItem::Commit - */ - -void SettingsConfigItem::Commit() -{ - if( ! IsValidConfigMgr() ) - return; - - std::hash_map< OUString, SmallOUStrMap, rtl::OUStringHash >::const_iterator group; - - for( group = m_aSettings.begin(); group != m_aSettings.end(); ++group ) - { - String aKeyName( group->first ); - /*sal_Bool bAdded =*/ AddNode( OUString(), aKeyName ); - Sequence< PropertyValue > aValues( group->second.size() ); - PropertyValue* pValues = aValues.getArray(); - int nIndex = 0; - SmallOUStrMap::const_iterator it; - for( it = group->second.begin(); it != group->second.end(); ++it ) - { - String aName( aKeyName ); - aName.Append( '/' ); - aName.Append( String( it->first ) ); - pValues[nIndex].Name = aName; - pValues[nIndex].Handle = 0; - pValues[nIndex].Value <<= it->second; - pValues[nIndex].State = PropertyState_DIRECT_VALUE; - nIndex++; - } - ReplaceSetProperties( aKeyName, aValues ); - } -} - -/* - * SettingsConfigItem::Notify - */ - -void SettingsConfigItem::Notify( const Sequence< OUString >& ) -{ - getValues(); -} - -/* - * SettingsConfigItem::getValues - */ -void SettingsConfigItem::getValues() -{ - if( ! IsValidConfigMgr() ) - return; - - m_aSettings.clear(); - - Sequence< OUString > aNames( GetNodeNames( OUString() ) ); - m_aSettings.resize( aNames.getLength() ); - - for( int j = 0; j < aNames.getLength(); j++ ) - { -#if OSL_DEBUG_LEVEL > 2 - fprintf( stderr, "found settings data for \"%s\"\n", - OUStringToOString( aNames.getConstArray()[j], RTL_TEXTENCODING_ASCII_US ).getStr() - ); -#endif - String aKeyName( aNames.getConstArray()[j] ); - Sequence< OUString > aKeys( GetNodeNames( aKeyName ) ); - Sequence< OUString > aSettingsKeys( aKeys.getLength() ); - const OUString* pFrom = aKeys.getConstArray(); - OUString* pTo = aSettingsKeys.getArray(); - for( int m = 0; m < aKeys.getLength(); m++ ) - { - String aName( aKeyName ); - aName.Append( '/' ); - aName.Append( String( pFrom[m] ) ); - pTo[m] = aName; - } - Sequence< Any > aValues( GetProperties( aSettingsKeys ) ); - const Any* pValue = aValues.getConstArray(); - for( int i = 0; i < aValues.getLength(); i++, pValue++ ) - { - if( pValue->getValueTypeClass() == TypeClass_STRING ) - { - const OUString* pLine = (const OUString*)pValue->getValue(); - if( pLine->getLength() ) - m_aSettings[ aKeyName ][ pFrom[i] ] = *pLine; -#if OSL_DEBUG_LEVEL > 2 - fprintf( stderr, " \"%s\"=\"%.30s\"\n", - OUStringToOString( aKeys.getConstArray()[i], RTL_TEXTENCODING_ASCII_US ).getStr(), - OUStringToOString( *pLine, RTL_TEXTENCODING_ASCII_US ).getStr() - ); -#endif - } - } - } -} - -/* - * SettingsConfigItem::getDefaultFont - */ - -const OUString& SettingsConfigItem::getValue( const OUString& rGroup, const OUString& rKey ) const -{ - ::std::hash_map< OUString, SmallOUStrMap, rtl::OUStringHash >::const_iterator group = m_aSettings.find( rGroup ); - if( group == m_aSettings.end() || group->second.find( rKey ) == group->second.end() ) - { - static OUString aEmpty; - return aEmpty; - } - return group->second.find(rKey)->second; -} - -/* - * SettingsConfigItem::setDefaultFont - */ - -void SettingsConfigItem::setValue( const OUString& rGroup, const OUString& rKey, const OUString& rValue ) -{ - bool bModified = m_aSettings[ rGroup ][ rKey ] != rValue; - if( bModified ) - { - m_aSettings[ rGroup ][ rKey ] = rValue; - SetModified(); - } -} - diff --git a/svtools/source/config/fontoptions.cxx b/unotools/source/config/fontoptions.cxx similarity index 99% rename from svtools/source/config/fontoptions.cxx rename to unotools/source/config/fontoptions.cxx index 1044344ff567..ac7fd2a94b62 100644 --- a/svtools/source/config/fontoptions.cxx +++ b/unotools/source/config/fontoptions.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif @@ -37,7 +37,7 @@ // includes //_________________________________________________________________________________________________________________ -#include +#include #include #include #include @@ -409,7 +409,7 @@ SvtFontOptions::SvtFontOptions() // ... and initialize ouer data container only if it not already exist! if( m_pDataContainer == NULL ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtFontOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtFontOptions_Impl::ctor()"); m_pDataContainer = new SvtFontOptions_Impl; ItemHolder1::holdConfigItem(E_FONTOPTIONS); diff --git a/svtools/source/config/historyoptions.cxx b/unotools/source/config/historyoptions.cxx similarity index 99% rename from svtools/source/config/historyoptions.cxx rename to unotools/source/config/historyoptions.cxx index 758753df0e4e..0a28884e24c2 100644 --- a/svtools/source/config/historyoptions.cxx +++ b/unotools/source/config/historyoptions.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif @@ -37,8 +37,8 @@ // includes //_________________________________________________________________________________________________________________ -#include -#include "configitems/historyoptions_const.hxx" +#include +#include #include #include #include @@ -81,7 +81,7 @@ #endif #ifndef _SVT_LOGHELPER_HXX -#include "loghelper.hxx" +#include #endif //_________________________________________________________________________________________________________________ @@ -648,7 +648,7 @@ SvtHistoryOptions::SvtHistoryOptions() // ... and initialize ouer data container only if it not already exist! if( m_pDataContainer == NULL ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtHistoryOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtHistoryOptions_Impl::ctor()"); m_pDataContainer = new SvtHistoryOptions_Impl; ItemHolder1::holdConfigItem(E_HISTORYOPTIONS); diff --git a/svtools/source/config/inetoptions.cxx b/unotools/source/config/inetoptions.cxx similarity index 99% rename from svtools/source/config/inetoptions.cxx rename to unotools/source/config/inetoptions.cxx index 109c2d94ada7..13c72d73152d 100644 --- a/svtools/source/config/inetoptions.cxx +++ b/unotools/source/config/inetoptions.cxx @@ -29,8 +29,8 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include +#include "precompiled_unotools.hxx" +#include #include "rtl/instance.hxx" #include #ifndef _WILDCARD_HXX @@ -419,7 +419,7 @@ SvtInetOptions::SvtInetOptions() osl::MutexGuard aGuard(LocalSingleton::get()); if (!m_pImpl) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtInetOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtInetOptions_Impl::ctor()"); m_pImpl = new Impl; ItemHolder1::holdConfigItem(E_INETOPTIONS); diff --git a/svtools/source/config/internaloptions.cxx b/unotools/source/config/internaloptions.cxx similarity index 99% rename from svtools/source/config/internaloptions.cxx rename to unotools/source/config/internaloptions.cxx index dc8cc7c34772..54dce3d7094b 100644 --- a/svtools/source/config/internaloptions.cxx +++ b/unotools/source/config/internaloptions.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif @@ -39,7 +39,7 @@ #include -#include +#include #include #include #include @@ -514,7 +514,7 @@ SvtInternalOptions::SvtInternalOptions() // ... and initialize ouer data container only if it not already! if( m_pDataContainer == NULL ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtInternalOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtInternalOptions_Impl::ctor()"); m_pDataContainer = new SvtInternalOptions_Impl(); ItemHolder1::holdConfigItem(E_INTERNALOPTIONS); diff --git a/svtools/source/config/itemholder1.cxx b/unotools/source/config/itemholder1.cxx similarity index 82% rename from svtools/source/config/itemholder1.cxx rename to unotools/source/config/itemholder1.cxx index 37a57259c807..214b5a9b4276 100644 --- a/svtools/source/config/itemholder1.cxx +++ b/unotools/source/config/itemholder1.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #include "itemholder1.hxx" @@ -38,38 +38,40 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include //----------------------------------------------- // namespaces @@ -180,10 +182,6 @@ void ItemHolder1::impl_newItem(TItemInfo& rItem) rItem.pItem = new SvtAcceleratorConfiguration(); break; - case E_ADDXMLTOSTORAGEOPTIONS : - rItem.pItem = new SvtAddXMLToStorageOptions(); - break; - case E_CMDOPTIONS : rItem.pItem = new SvtCommandOptions(); break; @@ -240,10 +238,6 @@ void ItemHolder1::impl_newItem(TItemInfo& rItem) rItem.pItem = new SvtLocalisationOptions(); break; - case E_MENUOPTIONS : - rItem.pItem = new SvtMenuOptions(); - break; - case E_MODULEOPTIONS : rItem.pItem = new SvtModuleOptions(); break; @@ -260,8 +254,8 @@ void ItemHolder1::impl_newItem(TItemInfo& rItem) rItem.pItem = new SvtPrintWarningOptions(); break; - case E_REGOPTIONS : -// no ref count rItem.pItem = new ::svt::RegOptions(); + case E_MISCCFG : + rItem.pItem = new ::utl::MiscCfg(); break; case E_SAVEOPTIONS : @@ -277,7 +271,7 @@ void ItemHolder1::impl_newItem(TItemInfo& rItem) break; case E_SOURCEVIEWCONFIG : - rItem.pItem = new ::svt::SourceViewConfig(); + rItem.pItem = new ::utl::SourceViewConfig(); break; case E_STARTOPTIONS : @@ -307,6 +301,19 @@ void ItemHolder1::impl_newItem(TItemInfo& rItem) case E_XMLACCELCFG : // ??? TODO break; + + case E_UNDOOPTIONS : + rItem.pItem = new SvtUndoOptions(); + break; + + case E_USEROPTIONS : + rItem.pItem = new SvtUserOptions(); + break; + + case E_SYSLOCALEOPTIONS : + rItem.pItem = new SvtSysLocaleOptions(); + break; + default: OSL_ASSERT( "unknown item type" ); break; diff --git a/svtools/source/config/itemholder1.hxx b/unotools/source/config/itemholder1.hxx similarity index 93% rename from svtools/source/config/itemholder1.hxx rename to unotools/source/config/itemholder1.hxx index b040292ab5c6..89a5bc3da299 100644 --- a/svtools/source/config/itemholder1.hxx +++ b/unotools/source/config/itemholder1.hxx @@ -28,13 +28,13 @@ * ************************************************************************/ -#ifndef INCLUDED_SVTOOLS_ITEMHOLDER1_HXX_ -#define INCLUDED_SVTOOLS_ITEMHOLDER1_HXX_ +#ifndef INCLUDED_unotools_ITEMHOLDER1_HXX_ +#define INCLUDED_unotools_ITEMHOLDER1_HXX_ //----------------------------------------------- // includes -#include "itemholderbase.hxx" +#include #include #include @@ -89,4 +89,4 @@ class ItemHolder1 : private ItemHolderMutexBase #undef css -#endif // INCLUDED_SVTOOLS_ITEMHOLDER1_HXX_ +#endif // INCLUDED_unotools_ITEMHOLDER1_HXX_ diff --git a/svtools/source/config/javaoptions.cxx b/unotools/source/config/javaoptions.cxx similarity index 96% rename from svtools/source/config/javaoptions.cxx rename to unotools/source/config/javaoptions.cxx index 7915f0042614..0eec89a31782 100644 --- a/svtools/source/config/javaoptions.cxx +++ b/unotools/source/config/javaoptions.cxx @@ -29,12 +29,12 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif -#ifndef _SVTOOLS_JAVAPTIONS_HXX -#include +#ifndef _unotools_JAVAPTIONS_HXX +#include #endif #include #include @@ -57,6 +57,7 @@ public: SvtExecAppletsItem_Impl(); virtual void Commit(); + void Notify( const Sequence< rtl::OUString >& ); sal_Bool IsExecuteApplets() const {return bExecute;} void SetExecuteApplets(sal_Bool bSet); @@ -82,7 +83,7 @@ SvtExecAppletsItem_Impl::SvtExecAppletsItem_Impl() : bExecute (sal_False ), bRO (CFG_READONLY_DEFAULT ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools SvtExecAppletsItem_Impl::SvtExecAppletsItem_Impl()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools SvtExecAppletsItem_Impl::SvtExecAppletsItem_Impl()"); Sequence< OUString > aNames(1); aNames.getArray()[0] = C2U("Enable"); @@ -108,6 +109,10 @@ void SvtExecAppletsItem_Impl::Commit() PutProperties(aNames, aValues); } +void SvtExecAppletsItem_Impl::Notify( const Sequence< rtl::OUString >& ) +{ + // no listeners supported yet +} struct SvtJavaOptions_Impl { @@ -147,7 +152,7 @@ SvtJavaOptions::SvtJavaOptions() : utl::ConfigItem(C2U("Office.Java/VirtualMachine")), pImpl(new SvtJavaOptions_Impl) { - RTL_LOGFILE_CONTEXT(aLog, "svtools SvtJavaOptions::SvtJavaOptions()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools SvtJavaOptions::SvtJavaOptions()"); Sequence< Any > aValues = GetProperties(pImpl->aPropertyNames); Sequence< sal_Bool > aROStates = GetReadOnlyStates(pImpl->aPropertyNames); diff --git a/svtools/source/config/lingucfg.cxx b/unotools/source/config/lingucfg.cxx similarity index 97% rename from svtools/source/config/lingucfg.cxx rename to unotools/source/config/lingucfg.cxx index 263ced16cd50..d4eff83efec6 100644 --- a/svtools/source/config/lingucfg.cxx +++ b/unotools/source/config/lingucfg.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #include @@ -44,9 +44,9 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include @@ -72,27 +72,6 @@ static osl::Mutex & GetOwnMutex() /////////////////////////////////////////////////////////////////////////// -static lang::Locale lcl_CreateLocale( LanguageType eLang ) -{ - lang::Locale aLocale; - if ( eLang != LANGUAGE_NONE ) - MsLangId::convertLanguageToLocale( eLang, aLocale ); - - return aLocale; -} - - -static INT16 lcl_LocaleToLanguage( const lang::Locale& rLocale ) -{ - // empty Locale -> LANGUAGE_NONE - if ( rLocale.Language.getLength() == 0 ) - return LANGUAGE_NONE; - - // Variant of Locale is ignored - return MsLangId::convertLocaleToLanguage( rLocale ); -} - - static BOOL lcl_SetLocale( INT16 &rLanguage, const uno::Any &rVal ) { BOOL bSucc = FALSE; @@ -100,41 +79,31 @@ static BOOL lcl_SetLocale( INT16 &rLanguage, const uno::Any &rVal ) lang::Locale aNew; if (rVal >>= aNew) // conversion successful? { - INT16 nNew = lcl_LocaleToLanguage( aNew ); + INT16 nNew = MsLangId::convertLocaleToLanguage( aNew ); if (nNew != rLanguage) { rLanguage = nNew; bSucc = TRUE; } } - return bSucc; } -static inline INT16 lcl_CfgLocaleStrToLanguage( const OUString &rCfgLocaleStr ) -{ - INT16 nRes = LANGUAGE_NONE; - if (0 != rCfgLocaleStr.getLength()) - nRes = MsLangId::convertIsoStringToLanguage( rCfgLocaleStr ); - return nRes; -} - - static inline const OUString lcl_LanguageToCfgLocaleStr( INT16 nLanguage ) { OUString aRes; - if (LANGUAGE_NONE != nLanguage) + if (LANGUAGE_SYSTEM != nLanguage) aRes = MsLangId::convertLanguageToIsoString( nLanguage ); return aRes; } -static void lcl_CfgAnyToLanguage( const uno::Any &rVal, INT16& rLanguage ) +static INT16 lcl_CfgAnyToLanguage( const uno::Any &rVal ) { OUString aTmp; - if ((rVal >>= aTmp) && 0 != aTmp.getLength()) - rLanguage = MsLangId::convertIsoStringToLanguage( aTmp ); + rVal >>= aTmp; + return (aTmp.getLength() == 0) ? LANGUAGE_SYSTEM : MsLangId::convertIsoStringToLanguage( aTmp ); } @@ -143,7 +112,6 @@ static void lcl_CfgAnyToLanguage( const uno::Any &rVal, INT16& rLanguage ) SvtLinguOptions::SvtLinguOptions() { nDefaultLanguage = LANGUAGE_NONE; - nDefaultLanguage_CJK = LANGUAGE_NONE; nDefaultLanguage_CTL = LANGUAGE_NONE; @@ -261,6 +229,7 @@ SvtLinguConfigItem::~SvtLinguConfigItem() void SvtLinguConfigItem::Notify( const uno::Sequence< OUString > &rPropertyNames ) { LoadOptions( rPropertyNames ); + NotifyListeners(0); } @@ -428,19 +397,19 @@ uno::Any SvtLinguConfigItem::GetProperty( INT32 nPropertyHandle ) const } case UPH_DEFAULT_LOCALE : { - lang::Locale aLocale( lcl_CreateLocale( rOpt.nDefaultLanguage ) ); + lang::Locale aLocale( MsLangId::convertLanguageToLocale( rOpt.nDefaultLanguage, false ) ); aRes.setValue( &aLocale, ::getCppuType((lang::Locale*)0 )); break; } case UPH_DEFAULT_LOCALE_CJK : { - lang::Locale aLocale( lcl_CreateLocale( rOpt.nDefaultLanguage_CJK ) ); + lang::Locale aLocale( MsLangId::convertLanguageToLocale( rOpt.nDefaultLanguage_CJK, false ) ); aRes.setValue( &aLocale, ::getCppuType((lang::Locale*)0 )); break; } case UPH_DEFAULT_LOCALE_CTL : { - lang::Locale aLocale( lcl_CreateLocale( rOpt.nDefaultLanguage_CTL ) ); + lang::Locale aLocale( MsLangId::convertLanguageToLocale( rOpt.nDefaultLanguage_CTL, false ) ); aRes.setValue( &aLocale, ::getCppuType((lang::Locale*)0 )); break; } @@ -605,6 +574,7 @@ BOOL SvtLinguConfigItem::SetProperty( INT32 nPropertyHandle, const uno::Any &rVa if (bMod) SetModified(); + NotifyListeners(0); return bSucc; } @@ -624,6 +594,7 @@ BOOL SvtLinguConfigItem::SetOptions( const SvtLinguOptions &rOptions ) aOpt = rOptions; SetModified(); + NotifyListeners(0); return TRUE; } @@ -654,7 +625,7 @@ BOOL SvtLinguConfigItem::LoadOptions( const uno::Sequence< OUString > &rProperyN switch ( nPropertyHandle ) { case UPH_DEFAULT_LOCALE : - { rOpt.bRODefaultLanguage = pROStates[i]; lcl_CfgAnyToLanguage( rVal, rOpt.nDefaultLanguage ); } break; + { rOpt.bRODefaultLanguage = pROStates[i]; rOpt.nDefaultLanguage = lcl_CfgAnyToLanguage( rVal ); } break; case UPH_ACTIVE_DICTIONARIES : { rOpt.bROActiveDics = pROStates[i]; rVal >>= rOpt.aActiveDics; } break; case UPH_IS_USE_DICTIONARY_LIST : @@ -662,9 +633,9 @@ BOOL SvtLinguConfigItem::LoadOptions( const uno::Sequence< OUString > &rProperyN case UPH_IS_IGNORE_CONTROL_CHARACTERS : { rOpt.bROIsIgnoreControlCharacters = pROStates[i]; rVal >>= rOpt.bIsIgnoreControlCharacters; } break; case UPH_DEFAULT_LOCALE_CJK : - { rOpt.bRODefaultLanguage_CJK = pROStates[i]; lcl_CfgAnyToLanguage( rVal, rOpt.nDefaultLanguage_CJK ); } break; + { rOpt.bRODefaultLanguage_CJK = pROStates[i]; rOpt.nDefaultLanguage_CJK = lcl_CfgAnyToLanguage( rVal ); } break; case UPH_DEFAULT_LOCALE_CTL : - { rOpt.bRODefaultLanguage_CTL = pROStates[i]; lcl_CfgAnyToLanguage( rVal, rOpt.nDefaultLanguage_CTL ); } break; + { rOpt.bRODefaultLanguage_CTL = pROStates[i]; rOpt.nDefaultLanguage_CTL = lcl_CfgAnyToLanguage( rVal ); } break; case UPH_IS_SPELL_UPPER_CASE : { rOpt.bROIsSpellUpperCase = pROStates[i]; rVal >>= rOpt.bIsSpellUpperCase; } break; @@ -1087,8 +1058,6 @@ static uno::Reference< util::XMacroExpander > lcl_GetMacroExpander() uno::Reference< util::XMacroExpander > xMacroExpander( aG_xMacroExpander ); if ( !xMacroExpander.is() ) { - vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); - if ( !xMacroExpander.is() ) { uno::Reference< uno::XComponentContext > xContext; diff --git a/svtools/source/config/localisationoptions.cxx b/unotools/source/config/localisationoptions.cxx similarity index 99% rename from svtools/source/config/localisationoptions.cxx rename to unotools/source/config/localisationoptions.cxx index aab7ab17b1ea..2ac2524e7d08 100644 --- a/svtools/source/config/localisationoptions.cxx +++ b/unotools/source/config/localisationoptions.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif @@ -37,7 +37,7 @@ // includes //_________________________________________________________________________________________________________________ -#include +#include #include #include #include @@ -271,6 +271,8 @@ void SvtLocalisationOptions_Impl::Notify( const Sequence< OUString >& seqPropert else DBG_ASSERT( sal_False, "SvtLocalisationOptions_Impl::Notify()\nUnkown property detected ... I can't handle these!\n" ); #endif } + + NotifyListeners(0); } //***************************************************************************************************************** @@ -372,7 +374,7 @@ SvtLocalisationOptions::SvtLocalisationOptions() // ... and initialize ouer data container only if it not already exist! if( m_pDataContainer == NULL ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtLocalisationOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtLocalisationOptions_Impl::ctor()"); m_pDataContainer = new SvtLocalisationOptions_Impl; ItemHolder1::holdConfigItem(E_LOCALISATIONOPTIONS); diff --git a/unotools/source/config/makefile.mk b/unotools/source/config/makefile.mk index bd5a1b16512f..de87d9503339 100644 --- a/unotools/source/config/makefile.mk +++ b/unotools/source/config/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -45,13 +45,49 @@ ENABLE_EXCEPTIONS=TRUE # --- Files ------------------------------------- SLOFILES=\ + $(SLO)$/syslocaleoptions.obj \ $(SLO)$/configvaluecontainer.obj \ $(SLO)$/confignode.obj \ $(SLO)$/configitem.obj \ $(SLO)$/configmgr.obj \ $(SLO)$/configpathes.obj \ $(SLO)$/docinfohelper.obj \ - $(SLO)$/bootstrap.obj + $(SLO)$/bootstrap.obj \ + $(SLO)$/accelcfg.obj \ + $(SLO)$/cacheoptions.obj \ + $(SLO)$/cmdoptions.obj \ + $(SLO)$/compatibility.obj \ + $(SLO)$/defaultoptions.obj \ + $(SLO)$/dynamicmenuoptions.obj \ + $(SLO)$/eventcfg.obj \ + $(SLO)$/extendedsecurityoptions.obj \ + $(SLO)$/fltrcfg.obj \ + $(SLO)$/fontcfg.obj \ + $(SLO)$/fontoptions.obj \ + $(SLO)$/historyoptions.obj \ + $(SLO)$/inetoptions.obj \ + $(SLO)$/internaloptions.obj \ + $(SLO)$/itemholder1.obj \ + $(SLO)$/javaoptions.obj \ + $(SLO)$/lingucfg.obj \ + $(SLO)$/localisationoptions.obj \ + $(SLO)$/misccfg.obj \ + $(SLO)$/moduleoptions.obj \ + $(SLO)$/options.obj \ + $(SLO)$/optionsdlg.obj \ + $(SLO)$/pathoptions.obj \ + $(SLO)$/printwarningoptions.obj \ + $(SLO)$/regoptions.obj \ + $(SLO)$/saveopt.obj \ + $(SLO)$/searchopt.obj \ + $(SLO)$/securityoptions.obj \ + $(SLO)$/sourceviewconfig.obj \ + $(SLO)$/startoptions.obj \ + $(SLO)$/undoopt.obj \ + $(SLO)$/useroptions.obj \ + $(SLO)$/viewoptions.obj \ + $(SLO)$/workingsetoptions.obj \ + $(SLO)$/xmlaccelcfg.obj # --- Targets ---------------------------------- diff --git a/unotools/source/config/menuoptions.cxx b/unotools/source/config/menuoptions.cxx new file mode 100644 index 000000000000..c885d5a1e81c --- /dev/null +++ b/unotools/source/config/menuoptions.cxx @@ -0,0 +1,564 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: menuoptions.cxx,v $ + * $Revision: 1.14 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_unotools.hxx" +#ifndef GCC +#endif + +//_________________________________________________________________________________________________________________ +// includes +//_________________________________________________________________________________________________________________ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include "itemholder1.hxx" + +//_________________________________________________________________________________________________________________ +// namespaces +//_________________________________________________________________________________________________________________ + +using namespace ::utl ; +using namespace ::rtl ; +using namespace ::osl ; +using namespace ::com::sun::star::uno ; + +//_________________________________________________________________________________________________________________ +// const +//_________________________________________________________________________________________________________________ + +#define ROOTNODE_MENU OUString(RTL_CONSTASCII_USTRINGPARAM("Office.Common/View/Menu" )) +#define DEFAULT_DONTHIDEDISABLEDENTRIES sal_False +#define DEFAULT_FOLLOWMOUSE sal_True +#define DEFAULT_MENUICONS 2 + +#define PROPERTYNAME_DONTHIDEDISABLEDENTRIES OUString(RTL_CONSTASCII_USTRINGPARAM("DontHideDisabledEntry" )) +#define PROPERTYNAME_FOLLOWMOUSE OUString(RTL_CONSTASCII_USTRINGPARAM("FollowMouse" )) +#define PROPERTYNAME_SHOWICONSINMENUES OUString(RTL_CONSTASCII_USTRINGPARAM("ShowIconsInMenues" )) +#define PROPERTYNAME_SYSTEMICONSINMENUES OUString(RTL_CONSTASCII_USTRINGPARAM("IsSystemIconsInMenus" )) + +#define PROPERTYHANDLE_DONTHIDEDISABLEDENTRIES 0 +#define PROPERTYHANDLE_FOLLOWMOUSE 1 +#define PROPERTYHANDLE_SHOWICONSINMENUES 2 +#define PROPERTYHANDLE_SYSTEMICONSINMENUES 3 + +#define PROPERTYCOUNT 4 + +#include +#include +DECLARE_LIST( LinkList, Link * ) + +//_________________________________________________________________________________________________________________ +// private declarations! +//_________________________________________________________________________________________________________________ + +class SvtMenuOptions_Impl : public ConfigItem +{ + //------------------------------------------------------------------------------------------------------------- + // private member + //------------------------------------------------------------------------------------------------------------- + + private: + LinkList aList; + sal_Bool m_bDontHideDisabledEntries ; /// cache "DontHideDisabledEntries" of Menu section + sal_Bool m_bFollowMouse ; /// cache "FollowMouse" of Menu section + sal_Int16 m_nMenuIcons ; /// cache "MenuIcons" of Menu section + + //------------------------------------------------------------------------------------------------------------- + // public methods + //------------------------------------------------------------------------------------------------------------- + + public: + + //--------------------------------------------------------------------------------------------------------- + // constructor / destructor + //--------------------------------------------------------------------------------------------------------- + + SvtMenuOptions_Impl(); + ~SvtMenuOptions_Impl(); + + void AddListener( const Link& rLink ); + void RemoveListener( const Link& rLink ); + + //--------------------------------------------------------------------------------------------------------- + // overloaded methods of baseclass + //--------------------------------------------------------------------------------------------------------- + + /*-****************************************************************************************************//** + @short called for notify of configmanager + @descr These method is called from the ConfigManager before application ends or from the + PropertyChangeListener if the sub tree broadcasts changes. You must update your + internal values. + + @seealso baseclass ConfigItem + + @param "seqPropertyNames" is the list of properties which should be updated. + @return - + + @onerror - + *//*-*****************************************************************************************************/ + + virtual void Notify( const Sequence< OUString >& seqPropertyNames ); + + /*-****************************************************************************************************//** + @short write changes to configuration + @descr These method writes the changed values into the sub tree + and should always called in our destructor to guarantee consistency of config data. + + @seealso baseclass ConfigItem + + @param - + @return - + + @onerror - + *//*-*****************************************************************************************************/ + + virtual void Commit(); + + //--------------------------------------------------------------------------------------------------------- + // public interface + //--------------------------------------------------------------------------------------------------------- + + /*-****************************************************************************************************//** + @short access method to get internal values + @descr These method give us a chance to regulate acces to ouer internal values. + It's not used in the moment - but it's possible for the feature! + + @seealso - + + @param - + @return - + + @onerror - + *//*-*****************************************************************************************************/ + + sal_Bool IsEntryHidingEnabled() const + { return m_bDontHideDisabledEntries; } + + sal_Bool IsFollowMouseEnabled() const + { return m_bFollowMouse; } + + sal_Int16 GetMenuIconsState() const + { return m_nMenuIcons; } + + void SetEntryHidingState ( sal_Bool bState ) + { + m_bDontHideDisabledEntries = bState; + SetModified(); + for ( USHORT n=0; nCall( this ); + Commit(); + } + + void SetFollowMouseState ( sal_Bool bState ) + { + m_bFollowMouse = bState; + SetModified(); + for ( USHORT n=0; nCall( this ); + Commit(); + } + + void SetMenuIconsState ( sal_Int16 bState ) + { + m_nMenuIcons = bState; + SetModified(); + for ( USHORT n=0; nCall( this ); + Commit(); + } + + //------------------------------------------------------------------------------------------------------------- + // private methods + //------------------------------------------------------------------------------------------------------------- + + private: + + /*-****************************************************************************************************//** + @short return list of fix key names of ouer configuration management which represent oue module tree + @descr These methods return a static const list of key names. We need it to get needed values from our + configuration management. + + @seealso - + + @param - + @return A list of needed configuration keys is returned. + + @onerror - + *//*-*****************************************************************************************************/ + + static Sequence< OUString > impl_GetPropertyNames(); +}; + +//_________________________________________________________________________________________________________________ +// definitions +//_________________________________________________________________________________________________________________ + +//***************************************************************************************************************** +// constructor +//***************************************************************************************************************** +SvtMenuOptions_Impl::SvtMenuOptions_Impl() + // Init baseclasses first + : ConfigItem ( ROOTNODE_MENU ) + // Init member then. + , m_bDontHideDisabledEntries ( DEFAULT_DONTHIDEDISABLEDENTRIES ) + , m_bFollowMouse ( DEFAULT_FOLLOWMOUSE ) + , m_nMenuIcons ( DEFAULT_MENUICONS ) +{ + // Use our static list of configuration keys to get his values. + Sequence< OUString > seqNames = impl_GetPropertyNames(); + Sequence< Any > seqValues = GetProperties( seqNames ) ; + + // Safe impossible cases. + // We need values from ALL configuration keys. + // Follow assignment use order of values in relation to our list of key names! + DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nI miss some values of configuration keys!\n" ); + + sal_Bool bMenuIcons = true; + sal_Bool bSystemMenuIcons = true; + + // Copy values from list in right order to ouer internal member. + sal_Int32 nPropertyCount = seqValues.getLength() ; + sal_Int32 nProperty = 0 ; + for( nProperty=0; nProperty>= m_bDontHideDisabledEntries; + } + break; + + case PROPERTYHANDLE_FOLLOWMOUSE : { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\FollowMouse\"?" ); + seqValues[nProperty] >>= m_bFollowMouse; + } + break; + case PROPERTYHANDLE_SHOWICONSINMENUES : { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\ShowIconsInMenues\"?" ); + seqValues[nProperty] >>= bMenuIcons; + } + break; + case PROPERTYHANDLE_SYSTEMICONSINMENUES : { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\IsSystemIconsInMenus\"?" ); + seqValues[nProperty] >>= bSystemMenuIcons; + } + break; + } + } + + m_nMenuIcons = bSystemMenuIcons ? 2 : bMenuIcons; + + EnableNotification( seqNames ); +} + +//***************************************************************************************************************** +// destructor +//***************************************************************************************************************** +SvtMenuOptions_Impl::~SvtMenuOptions_Impl() +{ + // Flush data to configuration! + // User has no chance to do that. + if( IsModified() == sal_True ) + { + Commit(); + } + + for ( USHORT n=0; n& seqPropertyNames ) +{ + // Use given list of updated properties to get his values from configuration directly! + Sequence< Any > seqValues = GetProperties( seqPropertyNames ); + // Safe impossible cases. + // We need values from ALL notified configuration keys. + DBG_ASSERT( !(seqPropertyNames.getLength()!=seqValues.getLength()), "SvtMenuOptions_Impl::Notify()\nI miss some values of configuration keys!\n" ); + + sal_Bool bMenuIcons = true; + sal_Bool bSystemMenuIcons = true; + + // Step over list of property names and get right value from coreesponding value list to set it on internal members! + sal_Int32 nCount = seqPropertyNames.getLength(); + for( sal_Int32 nProperty=0; nProperty>= m_bDontHideDisabledEntries; + } + else if( seqPropertyNames[nProperty] == PROPERTYNAME_FOLLOWMOUSE ) + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::Notify()\nWho has changed the value type of \"Office.Common\\View\\Menu\\FollowMouse\"?" ); + seqValues[nProperty] >>= m_bFollowMouse; + } + else if( seqPropertyNames[nProperty] == PROPERTYNAME_SHOWICONSINMENUES ) + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\ShowIconsInMenues\"?" ); + seqValues[nProperty] >>= bMenuIcons; + } + else if( seqPropertyNames[nProperty] == PROPERTYNAME_SYSTEMICONSINMENUES ) + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtMenuOptions_Impl::SvtMenuOptions_Impl()\nWho has changed the value type of \"Office.Common\\View\\Menu\\IsSystemIconsInMenus\"?" ); + seqValues[nProperty] >>= bSystemMenuIcons; + } + + #if OSL_DEBUG_LEVEL > 1 + else DBG_ASSERT( sal_False, "SvtMenuOptions_Impl::Notify()\nUnkown property detected ... I can't handle these!\n" ); + #endif + } + + m_nMenuIcons = bSystemMenuIcons ? 2 : bMenuIcons; + + for ( USHORT n=0; nCall( this ); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtMenuOptions_Impl::Commit() +{ + // Get names of supported properties, create a list for values and copy current values to it. + Sequence< OUString > seqNames = impl_GetPropertyNames(); + sal_Int32 nCount = seqNames.getLength(); + Sequence< Any > seqValues ( nCount ); + for( sal_Int32 nProperty=0; nProperty SvtMenuOptions_Impl::impl_GetPropertyNames() +{ + // Build static list of configuration key names. + static const OUString pProperties[] = + { + PROPERTYNAME_DONTHIDEDISABLEDENTRIES , + PROPERTYNAME_FOLLOWMOUSE , + PROPERTYNAME_SHOWICONSINMENUES , + PROPERTYNAME_SYSTEMICONSINMENUES + }; + // Initialize return sequence with these list ... + static const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT ); + // ... and return it. + return seqPropertyNames; +} + +void SvtMenuOptions_Impl::AddListener( const Link& rLink ) +{ + aList.Insert( new Link( rLink ) ); +} + +void SvtMenuOptions_Impl::RemoveListener( const Link& rLink ) +{ + for ( USHORT n=0; nIsEntryHidingEnabled(); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +sal_Bool SvtMenuOptions::IsFollowMouseEnabled() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsFollowMouseEnabled(); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtMenuOptions::SetEntryHidingState( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetEntryHidingState( bState ); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtMenuOptions::SetFollowMouseState( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetFollowMouseState( bState ); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +sal_Int16 SvtMenuOptions::GetMenuIconsState() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->GetMenuIconsState(); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtMenuOptions::SetMenuIconsState( sal_Int16 bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetMenuIconsState( bState ); +} + +//***************************************************************************************************************** +// private method +//***************************************************************************************************************** +Mutex& SvtMenuOptions::GetOwnStaticMutex() +{ + // Initialize static mutex only for one time! + static Mutex* pMutex = NULL; + // If these method first called (Mutex not already exist!) ... + if( pMutex == NULL ) + { + // ... we must create a new one. Protect follow code with the global mutex - + // It must be - we create a static variable! + MutexGuard aGuard( Mutex::getGlobalMutex() ); + // We must check our pointer again - because it can be that another instance of ouer class will be fastr then these! + if( pMutex == NULL ) + { + // Create the new mutex and set it for return on static variable. + static Mutex aMutex; + pMutex = &aMutex; + } + } + // Return new created or already existing mutex object. + return *pMutex; +} + +void SvtMenuOptions::AddListener( const Link& rLink ) +{ + m_pDataContainer->AddListener( rLink ); +} + +void SvtMenuOptions::RemoveListener( const Link& rLink ) +{ + m_pDataContainer->RemoveListener( rLink ); +} diff --git a/svtools/source/config/misccfg.cxx b/unotools/source/config/misccfg.cxx similarity index 67% rename from svtools/source/config/misccfg.cxx rename to unotools/source/config/misccfg.cxx index 06cc9b7446c0..a1c905d292f3 100644 --- a/svtools/source/config/misccfg.cxx +++ b/unotools/source/config/misccfg.cxx @@ -29,19 +29,19 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION - -#include "misccfg.hxx" -#include +#include +#include "rtl/instance.hxx" +#include +#include #include - +#include +#include +#include +#include #include - +#include "itemholder1.hxx" #define DEFAULT_TAB 2000 @@ -52,6 +52,45 @@ using namespace rtl; using namespace com::sun::star::uno; #define C2U(cChar) OUString::createFromAscii(cChar) + +namespace utl +{ + +static SfxMiscCfg* pOptions = NULL; +static sal_Int32 nRefCount = 0; + +class SfxMiscCfg : public utl::ConfigItem +{ + BOOL bPaperSize; // printer warnings + BOOL bPaperOrientation; + BOOL bNotFound; + sal_Int32 nYear2000; // two digit year representation + + const com::sun::star::uno::Sequence& GetPropertyNames(); + void Load(); + +public: + SfxMiscCfg( ); + ~SfxMiscCfg( ); + + virtual void Notify( const com::sun::star::uno::Sequence& aPropertyNames); + virtual void Commit(); + + BOOL IsNotFoundWarning() const {return bNotFound;} + void SetNotFoundWarning( BOOL bSet); + + BOOL IsPaperSizeWarning() const {return bPaperSize;} + void SetPaperSizeWarning(BOOL bSet); + + BOOL IsPaperOrientationWarning() const {return bPaperOrientation;} + void SetPaperOrientationWarning( BOOL bSet); + + // 0 ... 99 + sal_Int32 GetYear2000() const { return nYear2000; } + void SetYear2000( sal_Int32 nSet ); + +}; + /*-------------------------------------------------------------------- Beschreibung: --------------------------------------------------------------------*/ @@ -60,9 +99,9 @@ SfxMiscCfg::SfxMiscCfg() : bPaperSize(FALSE), bPaperOrientation (FALSE), bNotFound (FALSE), - nYear2000( SvNumberFormatter::GetYear2000Default() ) + nYear2000( 1930 ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools SfxMiscCfg::SfxMiscCfg()"); + RTL_LOGFILE_CONTEXT(aLog, "svl SfxMiscCfg::SfxMiscCfg()"); Load(); } @@ -192,4 +231,83 @@ void SfxMiscCfg::Commit() } PutProperties(aNames, aValues); } +// ----------------------------------------------------------------------- +namespace +{ + class LocalSingleton : public rtl::Static< osl::Mutex, LocalSingleton > + { + }; +} + +MiscCfg::MiscCfg( ) +{ + // Global access, must be guarded (multithreading) + ::osl::MutexGuard aGuard( LocalSingleton::get() ); + if ( !pOptions ) + { + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) SfxMiscCfg::ctor()"); + pOptions = new SfxMiscCfg; + + ItemHolder1::holdConfigItem(E_MISCCFG); + } + + ++nRefCount; + pImpl = pOptions; + pImpl->AddListener(this); +} + +MiscCfg::~MiscCfg( ) +{ + // Global access, must be guarded (multithreading) + ::osl::MutexGuard aGuard( LocalSingleton::get() ); + pImpl->RemoveListener(this); + if ( !--nRefCount ) + { + if ( pOptions->IsModified() ) + pOptions->Commit(); + DELETEZ( pOptions ); + } +} + +BOOL MiscCfg::IsNotFoundWarning() const +{ + return pImpl->IsNotFoundWarning(); +} + +void MiscCfg::SetNotFoundWarning( BOOL bSet) +{ + pImpl->SetNotFoundWarning( bSet ); +} + +BOOL MiscCfg::IsPaperSizeWarning() const +{ + return pImpl->IsPaperSizeWarning(); +} + +void MiscCfg::SetPaperSizeWarning(BOOL bSet) +{ + pImpl->SetPaperSizeWarning( bSet ); +} + +BOOL MiscCfg::IsPaperOrientationWarning() const +{ + return pImpl->IsPaperOrientationWarning(); +} + +void MiscCfg::SetPaperOrientationWarning( BOOL bSet) +{ + pImpl->SetPaperOrientationWarning( bSet ); +} + +sal_Int32 MiscCfg::GetYear2000() const +{ + return pImpl->GetYear2000(); +} + +void MiscCfg::SetYear2000( sal_Int32 nSet ) +{ + pImpl->SetYear2000( nSet ); +} + +} diff --git a/svtools/source/config/moduleoptions.cxx b/unotools/source/config/moduleoptions.cxx similarity index 99% rename from svtools/source/config/moduleoptions.cxx rename to unotools/source/config/moduleoptions.cxx index fda0967d65ed..f966d4415558 100644 --- a/svtools/source/config/moduleoptions.cxx +++ b/unotools/source/config/moduleoptions.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif @@ -37,7 +37,7 @@ // includes //_________________________________________________________________________________________________________________ -#include +#include #include #include #include @@ -1120,7 +1120,7 @@ SvtModuleOptions::SvtModuleOptions() ++m_nRefCount; if( m_nRefCount == 1 ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtModuleOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtModuleOptions_Impl::ctor()"); m_pDataContainer = new SvtModuleOptions_Impl(this); ItemHolder1::holdConfigItem(E_MODULEOPTIONS); diff --git a/unotools/source/config/options.cxx b/unotools/source/config/options.cxx new file mode 100755 index 000000000000..7c004e1475a6 --- /dev/null +++ b/unotools/source/config/options.cxx @@ -0,0 +1,109 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: options.cxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_unotools.hxx" + +#include "sal/config.h" +#include +#include + +namespace utl +{ + DECLARE_LIST( IMPL_ConfigurationListenerList, ConfigurationListener* ) +} + +using utl::detail::Options; +using utl::ConfigurationBroadcaster; + +ConfigurationBroadcaster::ConfigurationBroadcaster() +: mpList(0) +, m_nBroadcastBlocked( 0 ) +, m_nBlockedHint( 0 ) +{ +} + +ConfigurationBroadcaster::~ConfigurationBroadcaster() +{ + delete mpList; +} + +void ConfigurationBroadcaster::AddListener( utl::ConfigurationListener* pListener ) +{ + if ( !mpList ) + mpList = new IMPL_ConfigurationListenerList; + mpList->Insert( pListener ); +} + +void ConfigurationBroadcaster::RemoveListener( utl::ConfigurationListener* pListener ) +{ + if ( mpList ) + mpList->Remove( pListener ); +} + +void ConfigurationBroadcaster::NotifyListeners( sal_uInt32 nHint ) +{ + if ( m_nBroadcastBlocked ) + m_nBlockedHint |= nHint; + else + { + nHint |= m_nBlockedHint; + m_nBlockedHint = 0; + if ( mpList ) + for ( sal_uInt32 n=0; nCount(); n++ ) + mpList->GetObject(n)->ConfigurationChanged( this, nHint ); + } +} + +void ConfigurationBroadcaster::BlockBroadcasts( bool bBlock ) +{ + if ( bBlock ) + ++m_nBroadcastBlocked; + else if ( m_nBroadcastBlocked ) + { + if ( --m_nBroadcastBlocked == 0 ) + NotifyListeners( 0 ); + } +} + +Options::Options() +{ +} + +Options::~Options() +{ +} + +void Options::ConfigurationChanged( ConfigurationBroadcaster*, sal_uInt32 nHint ) +{ + NotifyListeners( nHint ); +} + + diff --git a/svtools/source/config/optionsdlg.cxx b/unotools/source/config/optionsdlg.cxx similarity index 99% rename from svtools/source/config/optionsdlg.cxx rename to unotools/source/config/optionsdlg.cxx index 87878b0302bc..5ac76af8efd7 100644 --- a/svtools/source/config/optionsdlg.cxx +++ b/unotools/source/config/optionsdlg.cxx @@ -29,9 +29,9 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" -#include +#include #include #include #include diff --git a/unotools/source/config/optionsdrawinglayer.cxx b/unotools/source/config/optionsdrawinglayer.cxx new file mode 100644 index 000000000000..7bfefdcbef09 --- /dev/null +++ b/unotools/source/config/optionsdrawinglayer.cxx @@ -0,0 +1,1708 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: optionsdrawinglayer.cxx,v $ + * $Revision: 1.12 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifdef _MSC_VER +#pragma hdrstop +#endif + +//_________________________________________________________________________________________________________________ +// includes +//_________________________________________________________________________________________________________________ + +#include +#include +#include +#include +#include +#include +#include +#include + +//_________________________________________________________________________________________________________________ +// namespaces +//_________________________________________________________________________________________________________________ + +using namespace ::utl ; +using namespace ::rtl ; +using namespace ::osl ; +using namespace ::com::sun::star::uno ; + +//_________________________________________________________________________________________________________________ +// const +//_________________________________________________________________________________________________________________ + +#define ROOTNODE_START OUString(RTL_CONSTASCII_USTRINGPARAM("Office.Common/Drawinglayer" )) +#define DEFAULT_OVERLAYBUFFER sal_True +#define DEFAULT_PAINTBUFFER sal_True +#define DEFAULT_STRIPE_COLOR_A 0 +#define DEFAULT_STRIPE_COLOR_B 16581375 +#define DEFAULT_STRIPE_LENGTH 4 + +// #i73602# +// #i74769#, #i75172# : Change default for Calc and Writer to True +#define DEFAULT_OVERLAYBUFFER_CALC sal_True +#define DEFAULT_OVERLAYBUFFER_WRITER sal_True +#define DEFAULT_OVERLAYBUFFER_DRAWIMPRESS sal_True + +// #i74769#, #i75172# +#define DEFAULT_PAINTBUFFER_CALC sal_True +#define DEFAULT_PAINTBUFFER_WRITER sal_True +#define DEFAULT_PAINTBUFFER_DRAWIMPRESS sal_True + +// #i4219# +#define DEFAULT_MAXIMUMPAPERWIDTH 300 +#define DEFAULT_MAXIMUMPAPERHEIGHT 300 +#define DEFAULT_MAXIMUMPAPERLEFTMARGIN 9999 +#define DEFAULT_MAXIMUMPAPERRIGHTMARGIN 9999 +#define DEFAULT_MAXIMUMPAPERTOPMARGIN 9999 +#define DEFAULT_MAXIMUMPAPERBOTTOMMARGIN 9999 + +// primitives +#define DEFAULT_ANTIALIASING sal_True +#define DEFAULT_SNAPHORVERLINESTODISCRETE sal_True +#define DEFAULT_SOLIDDRAGCREATE sal_True +#define DEFAULT_RENDERDECORATEDTEXTDIRECT sal_True +#define DEFAULT_RENDERSIMPLETEXTDIRECT sal_True +#define DEFAULT_QUADRATIC3DRENDERLIMIT 1000000 +#define DEFAULT_QUADRATICFORMCONTROLRENDERLIMIT 45000 + +// #i97672# selection settings +#define DEFAULT_TRANSPARENTSELECTION sal_True +#define DEFAULT_TRANSPARENTSELECTIONPERCENT 75 +#define DEFAULT_SELECTIONMAXIMUMLUMINANCEPERCENT 70 + +#define PROPERTYNAME_OVERLAYBUFFER OUString(RTL_CONSTASCII_USTRINGPARAM("OverlayBuffer" )) +#define PROPERTYNAME_PAINTBUFFER OUString(RTL_CONSTASCII_USTRINGPARAM("PaintBuffer" )) +#define PROPERTYNAME_STRIPE_COLOR_A OUString(RTL_CONSTASCII_USTRINGPARAM("StripeColorA" )) +#define PROPERTYNAME_STRIPE_COLOR_B OUString(RTL_CONSTASCII_USTRINGPARAM("StripeColorB" )) +#define PROPERTYNAME_STRIPE_LENGTH OUString(RTL_CONSTASCII_USTRINGPARAM("StripeLength" )) + +// #i73602# +#define PROPERTYNAME_OVERLAYBUFFER_CALC OUString(RTL_CONSTASCII_USTRINGPARAM("OverlayBuffer_Calc")) +#define PROPERTYNAME_OVERLAYBUFFER_WRITER OUString(RTL_CONSTASCII_USTRINGPARAM("OverlayBuffer_Writer")) +#define PROPERTYNAME_OVERLAYBUFFER_DRAWIMPRESS OUString(RTL_CONSTASCII_USTRINGPARAM("OverlayBuffer_DrawImpress")) + +// #i74769#, #i75172# +#define PROPERTYNAME_PAINTBUFFER_CALC OUString(RTL_CONSTASCII_USTRINGPARAM("PaintBuffer_Calc")) +#define PROPERTYNAME_PAINTBUFFER_WRITER OUString(RTL_CONSTASCII_USTRINGPARAM("PaintBuffer_Writer")) +#define PROPERTYNAME_PAINTBUFFER_DRAWIMPRESS OUString(RTL_CONSTASCII_USTRINGPARAM("PaintBuffer_DrawImpress")) + +// #i4219# +#define PROPERTYNAME_MAXIMUMPAPERWIDTH OUString(RTL_CONSTASCII_USTRINGPARAM("MaximumPaperWidth")) +#define PROPERTYNAME_MAXIMUMPAPERHEIGHT OUString(RTL_CONSTASCII_USTRINGPARAM("MaximumPaperHeight")) +#define PROPERTYNAME_MAXIMUMPAPERLEFTMARGIN OUString(RTL_CONSTASCII_USTRINGPARAM("MaximumPaperLeftMargin")) +#define PROPERTYNAME_MAXIMUMPAPERRIGHTMARGIN OUString(RTL_CONSTASCII_USTRINGPARAM("MaximumPaperRightMargin")) +#define PROPERTYNAME_MAXIMUMPAPERTOPMARGIN OUString(RTL_CONSTASCII_USTRINGPARAM("MaximumPaperTopMargin")) +#define PROPERTYNAME_MAXIMUMPAPERBOTTOMMARGIN OUString(RTL_CONSTASCII_USTRINGPARAM("MaximumPaperBottomMargin")) + +// primitives +#define PROPERTYNAME_ANTIALIASING OUString(RTL_CONSTASCII_USTRINGPARAM("AntiAliasing")) +#define PROPERTYNAME_SNAPHORVERLINESTODISCRETE OUString(RTL_CONSTASCII_USTRINGPARAM("SnapHorVerLinesToDiscrete")) +#define PROPERTYNAME_SOLIDDRAGCREATE OUString(RTL_CONSTASCII_USTRINGPARAM("SolidDragCreate")) +#define PROPERTYNAME_RENDERDECORATEDTEXTDIRECT OUString(RTL_CONSTASCII_USTRINGPARAM("RenderDecoratedTextDirect")) +#define PROPERTYNAME_RENDERSIMPLETEXTDIRECT OUString(RTL_CONSTASCII_USTRINGPARAM("RenderSimpleTextDirect")) +#define PROPERTYNAME_QUADRATIC3DRENDERLIMIT OUString(RTL_CONSTASCII_USTRINGPARAM("Quadratic3DRenderLimit")) +#define PROPERTYNAME_QUADRATICFORMCONTROLRENDERLIMIT OUString(RTL_CONSTASCII_USTRINGPARAM("QuadraticFormControlRenderLimit")) + +// #i97672# selection settings +#define PROPERTYNAME_TRANSPARENTSELECTION OUString(RTL_CONSTASCII_USTRINGPARAM("TransparentSelection")) +#define PROPERTYNAME_TRANSPARENTSELECTIONPERCENT OUString(RTL_CONSTASCII_USTRINGPARAM("TransparentSelectionPercent")) +#define PROPERTYNAME_SELECTIONMAXIMUMLUMINANCEPERCENT OUString(RTL_CONSTASCII_USTRINGPARAM("SelectionMaximumLuminancePercent")) + +#define PROPERTYHANDLE_OVERLAYBUFFER 0 +#define PROPERTYHANDLE_PAINTBUFFER 1 +#define PROPERTYHANDLE_STRIPE_COLOR_A 2 +#define PROPERTYHANDLE_STRIPE_COLOR_B 3 +#define PROPERTYHANDLE_STRIPE_LENGTH 4 + +// #i73602# +#define PROPERTYHANDLE_OVERLAYBUFFER_CALC 5 +#define PROPERTYHANDLE_OVERLAYBUFFER_WRITER 6 +#define PROPERTYHANDLE_OVERLAYBUFFER_DRAWIMPRESS 7 + +// #i74769#, #i75172# +#define PROPERTYHANDLE_PAINTBUFFER_CALC 8 +#define PROPERTYHANDLE_PAINTBUFFER_WRITER 9 +#define PROPERTYHANDLE_PAINTBUFFER_DRAWIMPRESS 10 + +// #i4219# +#define PROPERTYHANDLE_MAXIMUMPAPERWIDTH 11 +#define PROPERTYHANDLE_MAXIMUMPAPERHEIGHT 12 +#define PROPERTYHANDLE_MAXIMUMPAPERLEFTMARGIN 13 +#define PROPERTYHANDLE_MAXIMUMPAPERRIGHTMARGIN 14 +#define PROPERTYHANDLE_MAXIMUMPAPERTOPMARGIN 15 +#define PROPERTYHANDLE_MAXIMUMPAPERBOTTOMMARGIN 16 + +// primitives +#define PROPERTYHANDLE_ANTIALIASING 17 +#define PROPERTYHANDLE_SNAPHORVERLINESTODISCRETE 18 +#define PROPERTYHANDLE_SOLIDDRAGCREATE 19 +#define PROPERTYHANDLE_RENDERDECORATEDTEXTDIRECT 20 +#define PROPERTYHANDLE_RENDERSIMPLETEXTDIRECT 21 +#define PROPERTYHANDLE_QUADRATIC3DRENDERLIMIT 22 +#define PROPERTYHANDLE_QUADRATICFORMCONTROLRENDERLIMIT 23 + +// #i97672# selection settings +#define PROPERTYHANDLE_TRANSPARENTSELECTION 24 +#define PROPERTYHANDLE_TRANSPARENTSELECTIONPERCENT 25 +#define PROPERTYHANDLE_SELECTIONMAXIMUMLUMINANCEPERCENT 26 + +#define PROPERTYCOUNT 27 + +class SvtOptionsDrawinglayer_Impl : public ConfigItem +{ +public: + +//--------------------------------------------------------------------------------------------------------- +// constructor / destructor +//--------------------------------------------------------------------------------------------------------- + + SvtOptionsDrawinglayer_Impl(); + ~SvtOptionsDrawinglayer_Impl(); + +//--------------------------------------------------------------------------------------------------------- +// overloaded methods of baseclass +//--------------------------------------------------------------------------------------------------------- + + virtual void Commit(); + +//--------------------------------------------------------------------------------------------------------- +// public interface +//--------------------------------------------------------------------------------------------------------- + + sal_Bool IsOverlayBuffer() const; + sal_Bool IsPaintBuffer() const; + Color GetStripeColorA() const; + Color GetStripeColorB() const; + sal_uInt16 GetStripeLength() const; + + // #i73602# + sal_Bool IsOverlayBuffer_Calc() const; + sal_Bool IsOverlayBuffer_Writer() const; + sal_Bool IsOverlayBuffer_DrawImpress() const; + + // #i74769#, #i75172# + sal_Bool IsPaintBuffer_Calc() const; + sal_Bool IsPaintBuffer_Writer() const; + sal_Bool IsPaintBuffer_DrawImpress() const; + + void SetOverlayBuffer( sal_Bool bState ); + void SetPaintBuffer( sal_Bool bState ); + void SetStripeColorA( Color aColor ); + void SetStripeColorB( Color aColor ); + void SetStripeLength( sal_uInt16 nLength ); + + // #i73602# + void SetOverlayBuffer_Calc( sal_Bool bState ); + void SetOverlayBuffer_Writer( sal_Bool bState ); + void SetOverlayBuffer_DrawImpress( sal_Bool bState ); + + // #i74769#, #i75172# + void SetPaintBuffer_Calc( sal_Bool bState ); + void SetPaintBuffer_Writer( sal_Bool bState ); + void SetPaintBuffer_DrawImpress( sal_Bool bState ); + + // #i4219# + sal_uInt32 GetMaximumPaperWidth() const; + sal_uInt32 GetMaximumPaperHeight() const; + sal_uInt32 GetMaximumPaperLeftMargin() const; + sal_uInt32 GetMaximumPaperRightMargin() const; + sal_uInt32 GetMaximumPaperTopMargin() const; + sal_uInt32 GetMaximumPaperBottomMargin() const; + + void SetMaximumPaperWidth(sal_uInt32 nNew); + void SetMaximumPaperHeight(sal_uInt32 nNew); + void SetMaximumPaperLeftMargin(sal_uInt32 nNew); + void SetMaximumPaperRightMargin(sal_uInt32 nNew); + void SetMaximumPaperTopMargin(sal_uInt32 nNew); + void SetMaximumPaperBottomMargin(sal_uInt32 nNew); + + // helper + sal_Bool IsAAPossibleOnThisSystem() const; + + // primitives + sal_Bool IsAntiAliasing() const; + sal_Bool IsSnapHorVerLinesToDiscrete() const; + sal_Bool IsSolidDragCreate() const; + sal_Bool IsRenderDecoratedTextDirect() const; + sal_Bool IsRenderSimpleTextDirect() const; + sal_uInt32 GetQuadratic3DRenderLimit() const; + sal_uInt32 GetQuadraticFormControlRenderLimit() const; + + void SetAntiAliasing( sal_Bool bState ); + void SetSnapHorVerLinesToDiscrete( sal_Bool bState ); + void SetSolidDragCreate( sal_Bool bState ); + void SetRenderDecoratedTextDirect( sal_Bool bState ); + void SetRenderSimpleTextDirect( sal_Bool bState ); + void SetQuadratic3DRenderLimit(sal_uInt32 nNew); + void SetQuadraticFormControlRenderLimit(sal_uInt32 nNew); + + // #i97672# selection settings + sal_Bool IsTransparentSelection() const; + sal_uInt16 GetTransparentSelectionPercent() const; + sal_uInt16 GetSelectionMaximumLuminancePercent() const; + + void SetTransparentSelection( sal_Bool bState ); + void SetTransparentSelectionPercent( sal_uInt16 nPercent ); + void SetSelectionMaximumLuminancePercent( sal_uInt16 nPercent ); + +//------------------------------------------------------------------------------------------------------------- +// private methods +//------------------------------------------------------------------------------------------------------------- + +private: + + static Sequence< OUString > impl_GetPropertyNames(); + +//------------------------------------------------------------------------------------------------------------- +// private member +//------------------------------------------------------------------------------------------------------------- + +private: + + sal_Bool m_bOverlayBuffer; + sal_Bool m_bPaintBuffer; + Color m_bStripeColorA; + Color m_bStripeColorB; + sal_uInt16 m_nStripeLength; + + // #i73602# + sal_Bool m_bOverlayBuffer_Calc; + sal_Bool m_bOverlayBuffer_Writer; + sal_Bool m_bOverlayBuffer_DrawImpress; + + // #i74769#, #i75172# + sal_Bool m_bPaintBuffer_Calc; + sal_Bool m_bPaintBuffer_Writer; + sal_Bool m_bPaintBuffer_DrawImpress; + + // #i4219# + sal_uInt32 m_nMaximumPaperWidth; + sal_uInt32 m_nMaximumPaperHeight; + sal_uInt32 m_nMaximumPaperLeftMargin; + sal_uInt32 m_nMaximumPaperRightMargin; + sal_uInt32 m_nMaximumPaperTopMargin; + sal_uInt32 m_nMaximumPaperBottomMargin; + + // primitives + sal_Bool m_bAntiAliasing; + sal_Bool m_bSnapHorVerLinesToDiscrete; + sal_Bool m_bSolidDragCreate; + sal_Bool m_bRenderDecoratedTextDirect; + sal_Bool m_bRenderSimpleTextDirect; + sal_uInt32 m_nQuadratic3DRenderLimit; + sal_uInt32 m_nQuadraticFormControlRenderLimit; + + // #i97672# selection settings + sal_uInt16 m_nTransparentSelectionPercent; + sal_uInt16 m_nSelectionMaximumLuminancePercent; + sal_Bool m_bTransparentSelection; + + // local values + bool m_bAllowAA : 1; + bool m_bAllowAAChecked : 1; +}; + +//_________________________________________________________________________________________________________________ +// definitions +//_________________________________________________________________________________________________________________ + +//***************************************************************************************************************** +// constructor +//***************************************************************************************************************** +SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl() : + ConfigItem( ROOTNODE_START ), + m_bOverlayBuffer( DEFAULT_OVERLAYBUFFER ), + m_bPaintBuffer( DEFAULT_PAINTBUFFER ), + m_bStripeColorA(Color(DEFAULT_STRIPE_COLOR_A)), + m_bStripeColorB(Color(DEFAULT_STRIPE_COLOR_B)), + m_nStripeLength(DEFAULT_STRIPE_LENGTH), + + // #i73602# + m_bOverlayBuffer_Calc( DEFAULT_OVERLAYBUFFER_CALC ), + m_bOverlayBuffer_Writer( DEFAULT_OVERLAYBUFFER_WRITER ), + m_bOverlayBuffer_DrawImpress( DEFAULT_OVERLAYBUFFER_DRAWIMPRESS ), + + // #i74769#, #i75172# + m_bPaintBuffer_Calc( DEFAULT_PAINTBUFFER_CALC ), + m_bPaintBuffer_Writer( DEFAULT_PAINTBUFFER_WRITER ), + m_bPaintBuffer_DrawImpress( DEFAULT_PAINTBUFFER_DRAWIMPRESS ), + + // #i4219# + m_nMaximumPaperWidth(DEFAULT_MAXIMUMPAPERWIDTH), + m_nMaximumPaperHeight(DEFAULT_MAXIMUMPAPERHEIGHT), + m_nMaximumPaperLeftMargin(DEFAULT_MAXIMUMPAPERLEFTMARGIN), + m_nMaximumPaperRightMargin(DEFAULT_MAXIMUMPAPERRIGHTMARGIN), + m_nMaximumPaperTopMargin(DEFAULT_MAXIMUMPAPERTOPMARGIN), + m_nMaximumPaperBottomMargin(DEFAULT_MAXIMUMPAPERBOTTOMMARGIN), + + // primitives + m_bAntiAliasing(DEFAULT_ANTIALIASING), + m_bSnapHorVerLinesToDiscrete(DEFAULT_SNAPHORVERLINESTODISCRETE), + m_bSolidDragCreate(DEFAULT_SOLIDDRAGCREATE), + m_bRenderDecoratedTextDirect(DEFAULT_RENDERDECORATEDTEXTDIRECT), + m_bRenderSimpleTextDirect(DEFAULT_RENDERSIMPLETEXTDIRECT), + m_nQuadratic3DRenderLimit(DEFAULT_QUADRATIC3DRENDERLIMIT), + m_nQuadraticFormControlRenderLimit(DEFAULT_QUADRATICFORMCONTROLRENDERLIMIT), + + // #i97672# selection settings + m_nTransparentSelectionPercent(DEFAULT_TRANSPARENTSELECTIONPERCENT), + m_nSelectionMaximumLuminancePercent(DEFAULT_SELECTIONMAXIMUMLUMINANCEPERCENT), + m_bTransparentSelection(DEFAULT_TRANSPARENTSELECTION), + + // local values + m_bAllowAA(true), + m_bAllowAAChecked(false) +{ + Sequence< OUString > seqNames( impl_GetPropertyNames() ); + Sequence< Any > seqValues = GetProperties( seqNames ) ; + + DBG_ASSERT( !(seqNames.getLength()!=seqValues.getLength()), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nI miss some values of configuration keys!\n" ); + + // Copy values from list in right order to ouer internal member. + sal_Int32 nPropertyCount = seqValues.getLength(); + sal_Int32 nProperty = 0; + + for( nProperty=0; nProperty>= m_bOverlayBuffer; + } + break; + + case PROPERTYHANDLE_PAINTBUFFER: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\PaintBuffer\"?" ); + seqValues[nProperty] >>= m_bPaintBuffer; + } + break; + + case PROPERTYHANDLE_STRIPE_COLOR_A: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\StripeColorA\"?" ); + sal_Int32 nValue = 0; + seqValues[nProperty] >>= nValue; + m_bStripeColorA = nValue; + } + break; + + case PROPERTYHANDLE_STRIPE_COLOR_B: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\StripeColorB\"?" ); + sal_Int32 nValue = 0; + seqValues[nProperty] >>= nValue; + m_bStripeColorB = nValue; + } + break; + + case PROPERTYHANDLE_STRIPE_LENGTH: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_SHORT), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\StripeLength\"?" ); + seqValues[nProperty] >>= m_nStripeLength; + } + break; + + // #i73602# + case PROPERTYHANDLE_OVERLAYBUFFER_CALC: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\OverlayBuffer_Calc\"?" ); + seqValues[nProperty] >>= m_bOverlayBuffer_Calc; + } + break; + + case PROPERTYHANDLE_OVERLAYBUFFER_WRITER: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\OverlayBuffer_Writer\"?" ); + seqValues[nProperty] >>= m_bOverlayBuffer_Writer; + } + break; + + case PROPERTYHANDLE_OVERLAYBUFFER_DRAWIMPRESS: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\OverlayBuffer_DrawImpress\"?" ); + seqValues[nProperty] >>= m_bOverlayBuffer_DrawImpress; + } + break; + + // #i74769#, #i75172# + case PROPERTYHANDLE_PAINTBUFFER_CALC: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\PaintBuffer_Calc\"?" ); + seqValues[nProperty] >>= m_bPaintBuffer_Calc; + } + break; + + case PROPERTYHANDLE_PAINTBUFFER_WRITER: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\PaintBuffer_Writer\"?" ); + seqValues[nProperty] >>= m_bPaintBuffer_Writer; + } + break; + + case PROPERTYHANDLE_PAINTBUFFER_DRAWIMPRESS: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\PaintBuffer_DrawImpress\"?" ); + seqValues[nProperty] >>= m_bPaintBuffer_DrawImpress; + } + break; + + // #i4219# + case PROPERTYHANDLE_MAXIMUMPAPERWIDTH: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\MaximumPaperWidth\"?" ); + seqValues[nProperty] >>= m_nMaximumPaperWidth; + } + break; + + case PROPERTYHANDLE_MAXIMUMPAPERHEIGHT: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\MaximumPaperHeight\"?" ); + seqValues[nProperty] >>= m_nMaximumPaperHeight; + } + break; + + case PROPERTYHANDLE_MAXIMUMPAPERLEFTMARGIN: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\MaximumPaperLeftMargin\"?" ); + seqValues[nProperty] >>= m_nMaximumPaperLeftMargin; + } + break; + + case PROPERTYHANDLE_MAXIMUMPAPERRIGHTMARGIN: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\MaximumPaperRightMargin\"?" ); + seqValues[nProperty] >>= m_nMaximumPaperRightMargin; + } + break; + + case PROPERTYHANDLE_MAXIMUMPAPERTOPMARGIN: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\MaximumPaperTopMargin\"?" ); + seqValues[nProperty] >>= m_nMaximumPaperTopMargin; + } + break; + + case PROPERTYHANDLE_MAXIMUMPAPERBOTTOMMARGIN: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\MaximumPaperBottomMargin\"?" ); + seqValues[nProperty] >>= m_nMaximumPaperBottomMargin; + } + break; + + // primitives + case PROPERTYHANDLE_ANTIALIASING: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\AntiAliasing\"?" ); + seqValues[nProperty] >>= m_bAntiAliasing; + } + break; + + // primitives + case PROPERTYHANDLE_SNAPHORVERLINESTODISCRETE: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\SnapHorVerLinesToDiscrete\"?" ); + seqValues[nProperty] >>= m_bSnapHorVerLinesToDiscrete; + } + break; + + case PROPERTYHANDLE_SOLIDDRAGCREATE: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\SolidDragCreate\"?" ); + seqValues[nProperty] >>= m_bSolidDragCreate; + } + break; + + case PROPERTYHANDLE_RENDERDECORATEDTEXTDIRECT: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\RenderDecoratedTextDirect\"?" ); + seqValues[nProperty] >>= m_bRenderDecoratedTextDirect; + } + break; + + case PROPERTYHANDLE_RENDERSIMPLETEXTDIRECT: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\RenderSimpleTextDirect\"?" ); + seqValues[nProperty] >>= m_bRenderSimpleTextDirect; + } + break; + + case PROPERTYHANDLE_QUADRATIC3DRENDERLIMIT: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\Quadratic3DRenderLimit\"?" ); + seqValues[nProperty] >>= m_nQuadratic3DRenderLimit; + } + break; + + case PROPERTYHANDLE_QUADRATICFORMCONTROLRENDERLIMIT: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_LONG), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\QuadraticFormControlRenderLimit\"?" ); + seqValues[nProperty] >>= m_nQuadraticFormControlRenderLimit; + } + break; + + // #i97672# selection settings + case PROPERTYHANDLE_TRANSPARENTSELECTION: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_BOOLEAN), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\TransparentSelection\"?" ); + seqValues[nProperty] >>= m_bTransparentSelection; + } + break; + + case PROPERTYHANDLE_TRANSPARENTSELECTIONPERCENT: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_SHORT), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\TransparentSelectionPercent\"?" ); + seqValues[nProperty] >>= m_nTransparentSelectionPercent; + } + + case PROPERTYHANDLE_SELECTIONMAXIMUMLUMINANCEPERCENT: + { + DBG_ASSERT(!(seqValues[nProperty].getValueTypeClass()!=TypeClass_SHORT), "SvtOptionsDrawinglayer_Impl::SvtOptionsDrawinglayer_Impl()\nWho has changed the value type of \"Office.Common\\Drawinglayer\\SelectionMaximumLuminancePercent\"?" ); + seqValues[nProperty] >>= m_nSelectionMaximumLuminancePercent; + } + break; + } + } +} + +//***************************************************************************************************************** +// destructor +//***************************************************************************************************************** +SvtOptionsDrawinglayer_Impl::~SvtOptionsDrawinglayer_Impl() +{ + if( IsModified() ) + Commit(); +} + +//***************************************************************************************************************** +// Commit +//***************************************************************************************************************** +void SvtOptionsDrawinglayer_Impl::Commit() +{ + Sequence< OUString > aSeqNames( impl_GetPropertyNames() ); + Sequence< Any > aSeqValues( aSeqNames.getLength() ); + + for( sal_Int32 nProperty = 0, nCount = aSeqNames.getLength(); nProperty < nCount; ++nProperty ) + { + switch( nProperty ) + { + case PROPERTYHANDLE_OVERLAYBUFFER: + aSeqValues[nProperty] <<= m_bOverlayBuffer; + break; + + case PROPERTYHANDLE_PAINTBUFFER: + aSeqValues[nProperty] <<= m_bPaintBuffer; + break; + + case PROPERTYHANDLE_STRIPE_COLOR_A: + aSeqValues[nProperty] <<= m_bStripeColorA.GetColor(); + break; + + case PROPERTYHANDLE_STRIPE_COLOR_B: + aSeqValues[nProperty] <<= m_bStripeColorB.GetColor(); + break; + + case PROPERTYHANDLE_STRIPE_LENGTH: + aSeqValues[nProperty] <<= m_nStripeLength; + break; + + // #i73602# + case PROPERTYHANDLE_OVERLAYBUFFER_CALC: + aSeqValues[nProperty] <<= m_bOverlayBuffer_Calc; + break; + + case PROPERTYHANDLE_OVERLAYBUFFER_WRITER: + aSeqValues[nProperty] <<= m_bOverlayBuffer_Writer; + break; + + case PROPERTYHANDLE_OVERLAYBUFFER_DRAWIMPRESS: + aSeqValues[nProperty] <<= m_bOverlayBuffer_DrawImpress; + break; + + // #i74769#, #i75172# + case PROPERTYHANDLE_PAINTBUFFER_CALC: + aSeqValues[nProperty] <<= m_bPaintBuffer_Calc; + break; + + case PROPERTYHANDLE_PAINTBUFFER_WRITER: + aSeqValues[nProperty] <<= m_bPaintBuffer_Writer; + break; + + case PROPERTYHANDLE_PAINTBUFFER_DRAWIMPRESS: + aSeqValues[nProperty] <<= m_bPaintBuffer_DrawImpress; + break; + + // #i4219# + case PROPERTYHANDLE_MAXIMUMPAPERWIDTH: + aSeqValues[nProperty] <<= m_nMaximumPaperWidth; + break; + + case PROPERTYHANDLE_MAXIMUMPAPERHEIGHT: + aSeqValues[nProperty] <<= m_nMaximumPaperHeight; + break; + + case PROPERTYHANDLE_MAXIMUMPAPERLEFTMARGIN: + aSeqValues[nProperty] <<= m_nMaximumPaperLeftMargin; + break; + + case PROPERTYHANDLE_MAXIMUMPAPERRIGHTMARGIN: + aSeqValues[nProperty] <<= m_nMaximumPaperRightMargin; + break; + + case PROPERTYHANDLE_MAXIMUMPAPERTOPMARGIN: + aSeqValues[nProperty] <<= m_nMaximumPaperTopMargin; + break; + + case PROPERTYHANDLE_MAXIMUMPAPERBOTTOMMARGIN: + aSeqValues[nProperty] <<= m_nMaximumPaperBottomMargin; + break; + + // primitives + case PROPERTYHANDLE_ANTIALIASING: + aSeqValues[nProperty] <<= m_bAntiAliasing; + break; + + case PROPERTYHANDLE_SNAPHORVERLINESTODISCRETE: + aSeqValues[nProperty] <<= m_bSnapHorVerLinesToDiscrete; + break; + + case PROPERTYHANDLE_SOLIDDRAGCREATE: + aSeqValues[nProperty] <<= m_bSolidDragCreate; + break; + + case PROPERTYHANDLE_RENDERDECORATEDTEXTDIRECT: + aSeqValues[nProperty] <<= m_bRenderDecoratedTextDirect; + break; + + case PROPERTYHANDLE_RENDERSIMPLETEXTDIRECT: + aSeqValues[nProperty] <<= m_bRenderSimpleTextDirect; + break; + + case PROPERTYHANDLE_QUADRATIC3DRENDERLIMIT: + aSeqValues[nProperty] <<= m_nQuadratic3DRenderLimit; + break; + + case PROPERTYHANDLE_QUADRATICFORMCONTROLRENDERLIMIT: + aSeqValues[nProperty] <<= m_nQuadraticFormControlRenderLimit; + break; + + // #i97672# selection settings + case PROPERTYHANDLE_TRANSPARENTSELECTION: + aSeqValues[nProperty] <<= m_bTransparentSelection; + break; + + case PROPERTYHANDLE_TRANSPARENTSELECTIONPERCENT: + aSeqValues[nProperty] <<= m_nTransparentSelectionPercent; + break; + + case PROPERTYHANDLE_SELECTIONMAXIMUMLUMINANCEPERCENT: + aSeqValues[nProperty] <<= m_nSelectionMaximumLuminancePercent; + break; + } + } + + PutProperties( aSeqNames, aSeqValues ); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +sal_Bool SvtOptionsDrawinglayer_Impl::IsOverlayBuffer() const +{ + return m_bOverlayBuffer; +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +sal_Bool SvtOptionsDrawinglayer_Impl::IsPaintBuffer() const +{ + return m_bPaintBuffer; +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +Color SvtOptionsDrawinglayer_Impl::GetStripeColorA() const +{ + return m_bStripeColorA; +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +Color SvtOptionsDrawinglayer_Impl::GetStripeColorB() const +{ + return m_bStripeColorB; +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +sal_uInt16 SvtOptionsDrawinglayer_Impl::GetStripeLength() const +{ + return m_nStripeLength; +} + +// #i73602# +sal_Bool SvtOptionsDrawinglayer_Impl::IsOverlayBuffer_Calc() const +{ + return m_bOverlayBuffer_Calc; +} + +sal_Bool SvtOptionsDrawinglayer_Impl::IsOverlayBuffer_Writer() const +{ + return m_bOverlayBuffer_Writer; +} + +sal_Bool SvtOptionsDrawinglayer_Impl::IsOverlayBuffer_DrawImpress() const +{ + return m_bOverlayBuffer_DrawImpress; +} + +// #i74769#, #i75172# +sal_Bool SvtOptionsDrawinglayer_Impl::IsPaintBuffer_Calc() const +{ + return m_bPaintBuffer_Calc; +} + +sal_Bool SvtOptionsDrawinglayer_Impl::IsPaintBuffer_Writer() const +{ + return m_bPaintBuffer_Writer; +} + +sal_Bool SvtOptionsDrawinglayer_Impl::IsPaintBuffer_DrawImpress() const +{ + return m_bPaintBuffer_DrawImpress; +} + +// #i4219# +sal_uInt32 SvtOptionsDrawinglayer_Impl::GetMaximumPaperWidth() const +{ + return m_nMaximumPaperWidth; +} + +sal_uInt32 SvtOptionsDrawinglayer_Impl::GetMaximumPaperHeight() const +{ + return m_nMaximumPaperHeight; +} + +sal_uInt32 SvtOptionsDrawinglayer_Impl::GetMaximumPaperLeftMargin() const +{ + return m_nMaximumPaperLeftMargin; +} + +sal_uInt32 SvtOptionsDrawinglayer_Impl::GetMaximumPaperRightMargin() const +{ + return m_nMaximumPaperRightMargin; +} + +sal_uInt32 SvtOptionsDrawinglayer_Impl::GetMaximumPaperTopMargin() const +{ + return m_nMaximumPaperTopMargin; +} + +sal_uInt32 SvtOptionsDrawinglayer_Impl::GetMaximumPaperBottomMargin() const +{ + return m_nMaximumPaperBottomMargin; +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtOptionsDrawinglayer_Impl::SetOverlayBuffer( sal_Bool bState ) +{ + if(m_bOverlayBuffer != bState) + { + m_bOverlayBuffer = bState; + SetModified(); + } +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtOptionsDrawinglayer_Impl::SetPaintBuffer( sal_Bool bState ) +{ + if(m_bPaintBuffer != bState) + { + m_bPaintBuffer = bState; + SetModified(); + } +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtOptionsDrawinglayer_Impl::SetStripeColorA( Color aColor ) +{ + if(m_bStripeColorA != aColor) + { + m_bStripeColorA = aColor; + SetModified(); + } +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtOptionsDrawinglayer_Impl::SetStripeColorB( Color aColor ) +{ + if(m_bStripeColorB != aColor) + { + m_bStripeColorB = aColor; + SetModified(); + } +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtOptionsDrawinglayer_Impl::SetStripeLength( sal_uInt16 nLength ) +{ + if(m_nStripeLength != nLength) + { + m_nStripeLength = nLength; + SetModified(); + } +} + +// #i73602# +void SvtOptionsDrawinglayer_Impl::SetOverlayBuffer_Calc( sal_Bool bState ) +{ + if(m_bOverlayBuffer_Calc != bState) + { + m_bOverlayBuffer_Calc = bState; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetOverlayBuffer_Writer( sal_Bool bState ) +{ + if(m_bOverlayBuffer_Writer != bState) + { + m_bOverlayBuffer_Writer = bState; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetOverlayBuffer_DrawImpress( sal_Bool bState ) +{ + if(m_bOverlayBuffer_DrawImpress != bState) + { + m_bOverlayBuffer_DrawImpress = bState; + SetModified(); + } +} + +// #i74769#, #i75172# +void SvtOptionsDrawinglayer_Impl::SetPaintBuffer_Calc( sal_Bool bState ) +{ + if(m_bPaintBuffer_Calc != bState) + { + m_bPaintBuffer_Calc = bState; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetPaintBuffer_Writer( sal_Bool bState ) +{ + if(m_bPaintBuffer_Writer != bState) + { + m_bPaintBuffer_Writer = bState; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetPaintBuffer_DrawImpress( sal_Bool bState ) +{ + if(m_bPaintBuffer_DrawImpress != bState) + { + m_bPaintBuffer_DrawImpress = bState; + SetModified(); + } +} + +// #i4219# +void SvtOptionsDrawinglayer_Impl::SetMaximumPaperWidth( sal_uInt32 nNew ) +{ + if(m_nMaximumPaperWidth != nNew) + { + m_nMaximumPaperWidth = nNew; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetMaximumPaperHeight( sal_uInt32 nNew ) +{ + if(m_nMaximumPaperHeight != nNew) + { + m_nMaximumPaperHeight = nNew; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetMaximumPaperLeftMargin( sal_uInt32 nNew ) +{ + if(m_nMaximumPaperLeftMargin != nNew) + { + m_nMaximumPaperLeftMargin = nNew; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetMaximumPaperRightMargin( sal_uInt32 nNew ) +{ + if(m_nMaximumPaperRightMargin != nNew) + { + m_nMaximumPaperRightMargin = nNew; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetMaximumPaperTopMargin( sal_uInt32 nNew ) +{ + if(m_nMaximumPaperTopMargin != nNew) + { + m_nMaximumPaperTopMargin = nNew; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetMaximumPaperBottomMargin( sal_uInt32 nNew ) +{ + if(m_nMaximumPaperBottomMargin != nNew) + { + m_nMaximumPaperBottomMargin = nNew; + SetModified(); + } +} + +// helper +sal_Bool SvtOptionsDrawinglayer_Impl::IsAAPossibleOnThisSystem() const +{ + if(!m_bAllowAAChecked) + { + SvtOptionsDrawinglayer_Impl* pThat = const_cast< SvtOptionsDrawinglayer_Impl* >(this); + pThat->m_bAllowAAChecked = true; + +#ifdef WIN32 + // WIN32 uses GDIPlus with VCL forthe first incarnation; this will be enhanced + // in the future to use canvases and the canvas renderer, thus a AA-abled + // canvas needs to be checked here in the future. + // Currently, just allow AA for WIN32 +#endif + + // check XRenderExtension + if(m_bAllowAA && !Application::GetDefaultDevice()->supportsOperation( OutDevSupport_TransparentRect )) + { + pThat->m_bAllowAA = false; + } + } + + return m_bAllowAA; +} + +// primitives +sal_Bool SvtOptionsDrawinglayer_Impl::IsAntiAliasing() const +{ + return m_bAntiAliasing; +} + +sal_Bool SvtOptionsDrawinglayer_Impl::IsSnapHorVerLinesToDiscrete() const +{ + return m_bSnapHorVerLinesToDiscrete; +} + +sal_Bool SvtOptionsDrawinglayer_Impl::IsSolidDragCreate() const +{ + return m_bSolidDragCreate; +} + +sal_Bool SvtOptionsDrawinglayer_Impl::IsRenderDecoratedTextDirect() const +{ + return m_bRenderDecoratedTextDirect; +} + +sal_Bool SvtOptionsDrawinglayer_Impl::IsRenderSimpleTextDirect() const +{ + return m_bRenderSimpleTextDirect; +} + +sal_uInt32 SvtOptionsDrawinglayer_Impl::GetQuadratic3DRenderLimit() const +{ + return m_nQuadratic3DRenderLimit; +} + +sal_uInt32 SvtOptionsDrawinglayer_Impl::GetQuadraticFormControlRenderLimit() const +{ + return m_nQuadraticFormControlRenderLimit; +} + +void SvtOptionsDrawinglayer_Impl::SetAntiAliasing( sal_Bool bState ) +{ + if(m_bAntiAliasing != bState) + { + m_bAntiAliasing = bState; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetSnapHorVerLinesToDiscrete( sal_Bool bState ) +{ + if(m_bSnapHorVerLinesToDiscrete != bState) + { + m_bSnapHorVerLinesToDiscrete = bState; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetSolidDragCreate( sal_Bool bState ) +{ + if(m_bSolidDragCreate != bState) + { + m_bSolidDragCreate = bState; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetRenderDecoratedTextDirect( sal_Bool bState ) +{ + if(m_bRenderDecoratedTextDirect != bState) + { + m_bRenderDecoratedTextDirect = bState; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetRenderSimpleTextDirect( sal_Bool bState ) +{ + if(m_bRenderSimpleTextDirect != bState) + { + m_bRenderSimpleTextDirect = bState; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetQuadratic3DRenderLimit(sal_uInt32 nNew) +{ + if(m_nQuadratic3DRenderLimit != nNew) + { + m_nQuadratic3DRenderLimit = nNew; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetQuadraticFormControlRenderLimit(sal_uInt32 nNew) +{ + if(m_nQuadraticFormControlRenderLimit != nNew) + { + m_nQuadraticFormControlRenderLimit = nNew; + SetModified(); + } +} + +// #i97672# selection settings +sal_Bool SvtOptionsDrawinglayer_Impl::IsTransparentSelection() const +{ + return m_bTransparentSelection; +} + +void SvtOptionsDrawinglayer_Impl::SetTransparentSelection( sal_Bool bState ) +{ + if(m_bTransparentSelection != bState) + { + m_bTransparentSelection = bState; + SetModified(); + } +} + +void SvtOptionsDrawinglayer_Impl::SetTransparentSelectionPercent( sal_uInt16 nPercent ) +{ + if(m_nTransparentSelectionPercent != nPercent) + { + m_nTransparentSelectionPercent = nPercent; + SetModified(); + } +} + +sal_uInt16 SvtOptionsDrawinglayer_Impl::GetTransparentSelectionPercent() const +{ + return m_nTransparentSelectionPercent; +} + +void SvtOptionsDrawinglayer_Impl::SetSelectionMaximumLuminancePercent( sal_uInt16 nPercent ) +{ + if(m_nSelectionMaximumLuminancePercent != nPercent) + { + m_nSelectionMaximumLuminancePercent = nPercent; + SetModified(); + } +} + +sal_uInt16 SvtOptionsDrawinglayer_Impl::GetSelectionMaximumLuminancePercent() const +{ + return m_nSelectionMaximumLuminancePercent; +} + +//***************************************************************************************************************** +// private method +//***************************************************************************************************************** +Sequence< OUString > SvtOptionsDrawinglayer_Impl::impl_GetPropertyNames() +{ + // Build static list of configuration key names. + static const OUString pProperties[] = + { + PROPERTYNAME_OVERLAYBUFFER , + PROPERTYNAME_PAINTBUFFER , + PROPERTYNAME_STRIPE_COLOR_A , + PROPERTYNAME_STRIPE_COLOR_B , + PROPERTYNAME_STRIPE_LENGTH , + + // #i73602# + PROPERTYNAME_OVERLAYBUFFER_CALC, + PROPERTYNAME_OVERLAYBUFFER_WRITER, + PROPERTYNAME_OVERLAYBUFFER_DRAWIMPRESS, + + // #i74769#, #i75172# + PROPERTYNAME_PAINTBUFFER_CALC, + PROPERTYNAME_PAINTBUFFER_WRITER, + PROPERTYNAME_PAINTBUFFER_DRAWIMPRESS, + + // #i4219# + PROPERTYNAME_MAXIMUMPAPERWIDTH, + PROPERTYNAME_MAXIMUMPAPERHEIGHT, + PROPERTYNAME_MAXIMUMPAPERLEFTMARGIN, + PROPERTYNAME_MAXIMUMPAPERRIGHTMARGIN, + PROPERTYNAME_MAXIMUMPAPERTOPMARGIN, + PROPERTYNAME_MAXIMUMPAPERBOTTOMMARGIN, + + // primitives + PROPERTYNAME_ANTIALIASING, + PROPERTYNAME_SNAPHORVERLINESTODISCRETE, + PROPERTYNAME_SOLIDDRAGCREATE, + PROPERTYNAME_RENDERDECORATEDTEXTDIRECT, + PROPERTYNAME_RENDERSIMPLETEXTDIRECT, + PROPERTYNAME_QUADRATIC3DRENDERLIMIT, + PROPERTYNAME_QUADRATICFORMCONTROLRENDERLIMIT, + + // #i97672# selection settings + PROPERTYNAME_TRANSPARENTSELECTION, + PROPERTYNAME_TRANSPARENTSELECTIONPERCENT, + PROPERTYNAME_SELECTIONMAXIMUMLUMINANCEPERCENT + }; + + // Initialize return sequence with these list ... + static const Sequence< OUString > seqPropertyNames( pProperties, PROPERTYCOUNT ); + // ... and return it. + return seqPropertyNames; +} + +//***************************************************************************************************************** +// initialize static member +// DON'T DO IT IN YOUR HEADER! +// see definition for further informations +//***************************************************************************************************************** +SvtOptionsDrawinglayer_Impl* SvtOptionsDrawinglayer::m_pDataContainer = NULL; +sal_Int32 SvtOptionsDrawinglayer::m_nRefCount = 0; + +//***************************************************************************************************************** +// constructor +//***************************************************************************************************************** +SvtOptionsDrawinglayer::SvtOptionsDrawinglayer() +{ + // Global access, must be guarded (multithreading!). + MutexGuard aGuard( GetOwnStaticMutex() ); + // Increase ouer refcount ... + ++m_nRefCount; + // ... and initialize ouer data container only if it not already! + if( m_pDataContainer == NULL ) + { + m_pDataContainer = new SvtOptionsDrawinglayer_Impl(); + } +} + +//***************************************************************************************************************** +// destructor +//***************************************************************************************************************** +SvtOptionsDrawinglayer::~SvtOptionsDrawinglayer() +{ + // Global access, must be guarded (multithreading!) + MutexGuard aGuard( GetOwnStaticMutex() ); + // Decrease ouer refcount. + --m_nRefCount; + // If last instance was deleted ... + // we must destroy ouer static data container! + if( m_nRefCount <= 0 ) + { + delete m_pDataContainer; + m_pDataContainer = NULL; + } +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +sal_Bool SvtOptionsDrawinglayer::IsOverlayBuffer() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsOverlayBuffer(); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +sal_Bool SvtOptionsDrawinglayer::IsPaintBuffer() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsPaintBuffer(); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +Color SvtOptionsDrawinglayer::GetStripeColorA() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->GetStripeColorA(); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +Color SvtOptionsDrawinglayer::GetStripeColorB() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->GetStripeColorB(); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +sal_uInt16 SvtOptionsDrawinglayer::GetStripeLength() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->GetStripeLength(); +} + +// #i73602# +sal_Bool SvtOptionsDrawinglayer::IsOverlayBuffer_Calc() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsOverlayBuffer_Calc(); +} + +sal_Bool SvtOptionsDrawinglayer::IsOverlayBuffer_Writer() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsOverlayBuffer_Writer(); +} + +sal_Bool SvtOptionsDrawinglayer::IsOverlayBuffer_DrawImpress() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsOverlayBuffer_DrawImpress(); +} + +// #i74769#, #i75172# +sal_Bool SvtOptionsDrawinglayer::IsPaintBuffer_Calc() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsPaintBuffer_Calc(); +} + +sal_Bool SvtOptionsDrawinglayer::IsPaintBuffer_Writer() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsPaintBuffer_Writer(); +} + +sal_Bool SvtOptionsDrawinglayer::IsPaintBuffer_DrawImpress() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsPaintBuffer_DrawImpress(); +} + +// #i4219# +sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperWidth() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->GetMaximumPaperWidth(); +} + +sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperHeight() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->GetMaximumPaperHeight(); +} + +sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperLeftMargin() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->GetMaximumPaperLeftMargin(); +} + +sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperRightMargin() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->GetMaximumPaperRightMargin(); +} + +sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperTopMargin() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->GetMaximumPaperTopMargin(); +} + +sal_uInt32 SvtOptionsDrawinglayer::GetMaximumPaperBottomMargin() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->GetMaximumPaperBottomMargin(); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtOptionsDrawinglayer::SetOverlayBuffer( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetOverlayBuffer( bState ); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtOptionsDrawinglayer::SetPaintBuffer( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetPaintBuffer( bState ); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtOptionsDrawinglayer::SetStripeColorA( Color aColor ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetStripeColorA( aColor ); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtOptionsDrawinglayer::SetStripeColorB( Color aColor ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetStripeColorB( aColor ); +} + +//***************************************************************************************************************** +// public method +//***************************************************************************************************************** +void SvtOptionsDrawinglayer::SetStripeLength( sal_uInt16 nLength ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetStripeLength( nLength ); +} + +// #i73602# +void SvtOptionsDrawinglayer::SetOverlayBuffer_Calc( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetOverlayBuffer_Calc( bState ); +} + +void SvtOptionsDrawinglayer::SetOverlayBuffer_Writer( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetOverlayBuffer_Writer( bState ); +} + +void SvtOptionsDrawinglayer::SetOverlayBuffer_DrawImpress( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetOverlayBuffer_DrawImpress( bState ); +} + +// #i74769#, #i75172# +void SvtOptionsDrawinglayer::SetPaintBuffer_Calc( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetPaintBuffer_Calc( bState ); +} + +void SvtOptionsDrawinglayer::SetPaintBuffer_Writer( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetPaintBuffer_Writer( bState ); +} + +void SvtOptionsDrawinglayer::SetPaintBuffer_DrawImpress( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetPaintBuffer_DrawImpress( bState ); +} + +// #i4219# +void SvtOptionsDrawinglayer::SetMaximumPaperWidth( sal_uInt32 nNew ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetMaximumPaperWidth( nNew ); +} + +void SvtOptionsDrawinglayer::SetMaximumPaperHeight( sal_uInt32 nNew ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetMaximumPaperHeight( nNew ); +} + +void SvtOptionsDrawinglayer::SetMaximumPaperLeftMargin( sal_uInt32 nNew ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetMaximumPaperLeftMargin( nNew ); +} + +void SvtOptionsDrawinglayer::SetMaximumPaperRightMargin( sal_uInt32 nNew ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetMaximumPaperRightMargin( nNew ); +} + +void SvtOptionsDrawinglayer::SetMaximumPaperTopMargin( sal_uInt32 nNew ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetMaximumPaperTopMargin( nNew ); +} + +void SvtOptionsDrawinglayer::SetMaximumPaperBottomMargin( sal_uInt32 nNew ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetMaximumPaperBottomMargin( nNew ); +} + +// helper +sal_Bool SvtOptionsDrawinglayer::IsAAPossibleOnThisSystem() const +{ + return m_pDataContainer->IsAAPossibleOnThisSystem(); +} + +// primitives +sal_Bool SvtOptionsDrawinglayer::IsAntiAliasing() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsAntiAliasing() && IsAAPossibleOnThisSystem(); +} + +sal_Bool SvtOptionsDrawinglayer::IsSnapHorVerLinesToDiscrete() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsAntiAliasing() && m_pDataContainer->IsSnapHorVerLinesToDiscrete(); +} + +sal_Bool SvtOptionsDrawinglayer::IsSolidDragCreate() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsSolidDragCreate(); +} + +sal_Bool SvtOptionsDrawinglayer::IsRenderDecoratedTextDirect() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsRenderDecoratedTextDirect(); +} + +sal_Bool SvtOptionsDrawinglayer::IsRenderSimpleTextDirect() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsRenderSimpleTextDirect(); +} + +sal_uInt32 SvtOptionsDrawinglayer::GetQuadratic3DRenderLimit() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->GetQuadratic3DRenderLimit(); +} + +sal_uInt32 SvtOptionsDrawinglayer::GetQuadraticFormControlRenderLimit() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->GetQuadraticFormControlRenderLimit(); +} + +void SvtOptionsDrawinglayer::SetAntiAliasing( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetAntiAliasing( bState ); +} + +void SvtOptionsDrawinglayer::SetSnapHorVerLinesToDiscrete( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetSnapHorVerLinesToDiscrete( bState ); +} + +void SvtOptionsDrawinglayer::SetSolidDragCreate( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetSolidDragCreate( bState ); +} + +void SvtOptionsDrawinglayer::SetRenderDecoratedTextDirect( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetRenderDecoratedTextDirect( bState ); +} + +void SvtOptionsDrawinglayer::SetRenderSimpleTextDirect( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetRenderSimpleTextDirect( bState ); +} + +void SvtOptionsDrawinglayer::SetQuadratic3DRenderLimit(sal_uInt32 nNew) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetQuadratic3DRenderLimit( nNew ); +} + +void SvtOptionsDrawinglayer::SetQuadraticFormControlRenderLimit(sal_uInt32 nNew) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetQuadraticFormControlRenderLimit( nNew ); +} + +// #i97672# selection settings +sal_Bool SvtOptionsDrawinglayer::IsTransparentSelection() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + return m_pDataContainer->IsTransparentSelection(); +} + +void SvtOptionsDrawinglayer::SetTransparentSelection( sal_Bool bState ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + m_pDataContainer->SetTransparentSelection( bState ); +} + +sal_uInt16 SvtOptionsDrawinglayer::GetTransparentSelectionPercent() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + sal_uInt16 aRetval(m_pDataContainer->GetTransparentSelectionPercent()); + + // crop to range [10% .. 90%] + if(aRetval < 10) + { + aRetval = 10; + } + + if(aRetval > 90) + { + aRetval = 90; + } + + return aRetval; +} + +void SvtOptionsDrawinglayer::SetTransparentSelectionPercent( sal_uInt16 nPercent ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + + // crop to range [10% .. 90%] + if(nPercent < 10) + { + nPercent = 10; + } + + if(nPercent > 90) + { + nPercent = 90; + } + + m_pDataContainer->SetTransparentSelectionPercent( nPercent ); +} + +sal_uInt16 SvtOptionsDrawinglayer::GetSelectionMaximumLuminancePercent() const +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + sal_uInt16 aRetval(m_pDataContainer->GetSelectionMaximumLuminancePercent()); + + // crop to range [0% .. 100%] + if(aRetval > 90) + { + aRetval = 90; + } + + return aRetval; +} + +void SvtOptionsDrawinglayer::SetSelectionMaximumLuminancePercent( sal_uInt16 nPercent ) +{ + MutexGuard aGuard( GetOwnStaticMutex() ); + + // crop to range [0% .. 100%] + if(nPercent > 90) + { + nPercent = 90; + } + + m_pDataContainer->SetSelectionMaximumLuminancePercent( nPercent ); +} + +//***************************************************************************************************************** +// private method +//***************************************************************************************************************** +Mutex& SvtOptionsDrawinglayer::GetOwnStaticMutex() +{ + // Initialize static mutex only for one time! + static Mutex* pMutex = NULL; + // If these method first called (Mutex not already exist!) ... + if( pMutex == NULL ) + { + // ... we must create a new one. Protect follow code with the global mutex - + // It must be - we create a static variable! + MutexGuard aGuard( Mutex::getGlobalMutex() ); + // We must check our pointer again - because it can be that another instance of ouer class will be fastr then these! + if( pMutex == NULL ) + { + // Create the new mutex and set it for return on static variable. + static Mutex aMutex; + pMutex = &aMutex; + } + } + // Return new created or already existing mutex object. + return *pMutex; +} + +// eof + diff --git a/svtools/source/config/pathoptions.cxx b/unotools/source/config/pathoptions.cxx similarity index 99% rename from svtools/source/config/pathoptions.cxx rename to unotools/source/config/pathoptions.cxx index 8c561b299d46..5b74ec1db879 100644 --- a/svtools/source/config/pathoptions.cxx +++ b/unotools/source/config/pathoptions.cxx @@ -29,11 +29,11 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif -#include +#include #include #include #include @@ -1075,7 +1075,7 @@ void SAL_CALL PathService::flush( ) throw(::com::sun::star::uno::RuntimeExcepti ::rtl::OUString SAL_CALL PathService::getImplementationName( ) throw(::com::sun::star::uno::RuntimeException) { - return OUString::createFromAscii("com.sun.star.comp.svtools.PathService"); + return OUString::createFromAscii("com.sun.star.comp.unotools.PathService"); } sal_Bool SAL_CALL PathService::supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException) diff --git a/svtools/source/config/printwarningoptions.cxx b/unotools/source/config/printwarningoptions.cxx similarity index 98% rename from svtools/source/config/printwarningoptions.cxx rename to unotools/source/config/printwarningoptions.cxx index c2dfe94b0a2b..29dfabd45ea7 100644 --- a/svtools/source/config/printwarningoptions.cxx +++ b/unotools/source/config/printwarningoptions.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif @@ -37,7 +37,7 @@ // includes //_________________________________________________________________________________________________________________ -#include +#include #include #include #include @@ -91,6 +91,7 @@ public: //--------------------------------------------------------------------------------------------------------- virtual void Commit(); + virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames ); //--------------------------------------------------------------------------------------------------------- // public interface @@ -242,6 +243,10 @@ void SvtPrintWarningOptions_Impl::Commit() PutProperties( aSeqNames, aSeqValues ); } +void SvtPrintWarningOptions_Impl::Notify( const Sequence< rtl::OUString >& ) +{ +} + //***************************************************************************************************************** // private method //***************************************************************************************************************** diff --git a/svtools/source/config/regoptions.cxx b/unotools/source/config/regoptions.cxx similarity index 99% rename from svtools/source/config/regoptions.cxx rename to unotools/source/config/regoptions.cxx index 7c94807f2c25..b0f41602da2e 100644 --- a/svtools/source/config/regoptions.cxx +++ b/unotools/source/config/regoptions.cxx @@ -29,8 +29,8 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include "regoptions.hxx" +#include "precompiled_unotools.hxx" +#include #include #include #include @@ -39,11 +39,10 @@ #include //........................................................................ -namespace svt +namespace utl { //........................................................................ - using namespace ::utl; using namespace ::com::sun::star::uno; //==================================================================== @@ -549,6 +548,6 @@ namespace svt } //........................................................................ -} // namespace svt +} // namespace utl //........................................................................ diff --git a/svtools/source/config/saveopt.cxx b/unotools/source/config/saveopt.cxx similarity index 97% rename from svtools/source/config/saveopt.cxx rename to unotools/source/config/saveopt.cxx index 6ce1be8441a4..49e01c0457e9 100644 --- a/svtools/source/config/saveopt.cxx +++ b/unotools/source/config/saveopt.cxx @@ -29,12 +29,12 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif -#include +#include #include "rtl/instance.hxx" #include #include @@ -437,7 +437,7 @@ SvtSaveOptions_Impl::SvtSaveOptions_Impl() , bRODoPrettyPrinting( CFG_READONLY_DEFAULT ) , bROLoadDocPrinter( CFG_READONLY_DEFAULT ) , bROODFDefaultVersion( CFG_READONLY_DEFAULT ) - , eODFDefaultVersion( SvtSaveOptions::ODFVER_012 ) + , eODFDefaultVersion( SvtSaveOptions::ODFVER_LATEST ) { Sequence< OUString > aNames = GetPropertyNames(); Sequence< Any > aValues = GetProperties( aNames ); @@ -474,11 +474,16 @@ SvtSaveOptions_Impl::SvtSaveOptions_Impl() { sal_Int16 nTmp = 0; if ( pValues[nProp] >>= nTmp ) - eODFDefaultVersion = SvtSaveOptions::ODFDefaultVersion( nTmp ); + { + if( nTmp == 3 ) + eODFDefaultVersion = SvtSaveOptions::ODFVER_LATEST; + else + eODFDefaultVersion = SvtSaveOptions::ODFDefaultVersion( nTmp ); + } else { DBG_ERRORFILE( "SvtSaveOptions_Impl::SvtSaveOptions_Impl(): Wrong Type!" ); }; - bROAutoSaveTime = pROStates[nProp]; + bROODFDefaultVersion = pROStates[nProp]; break; } @@ -729,7 +734,7 @@ void SvtSaveOptions_Impl::Commit() case ODFDEFAULTVERSION: if (!bROODFDefaultVersion) { - pValues[nRealCount] <<= sal_Int16( eODFDefaultVersion ); + pValues[nRealCount] <<= (eODFDefaultVersion == SvtSaveOptions::ODFVER_LATEST) ? sal_Int16( 3 ) : sal_Int16( eODFDefaultVersion ); pNames[nRealCount] = pOrgNames[i]; ++nRealCount; } @@ -835,7 +840,7 @@ SvtSaveOptions::SvtSaveOptions() ::osl::MutexGuard aGuard( LocalSingleton::get() ); if ( !pOptions ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtSaveOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtSaveOptions_Impl::ctor()"); pOptions = new SvtLoadSaveOptions_Impl; pOptions->pSaveOpt = new SvtSaveOptions_Impl; pOptions->pLoadOpt = new SvtLoadOptions_Impl; diff --git a/svtools/source/config/searchopt.cxx b/unotools/source/config/searchopt.cxx similarity index 97% rename from svtools/source/config/searchopt.cxx rename to unotools/source/config/searchopt.cxx index 261edf4d0f1e..01fbd9a3216d 100644 --- a/svtools/source/config/searchopt.cxx +++ b/unotools/source/config/searchopt.cxx @@ -29,9 +29,9 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" -#include "searchopt.hxx" +#include #include #include #include @@ -75,6 +75,7 @@ public: // ConfigItem virtual void Commit(); + virtual void Notify( const com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames ); BOOL GetFlag( USHORT nOffset ) const; void SetFlag( USHORT nOffset, BOOL bVal ); @@ -85,7 +86,7 @@ public: SvtSearchOptions_Impl::SvtSearchOptions_Impl() : ConfigItem( OUString::createFromAscii( "Office.Common/SearchOptions" ) ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools SvtSearchOptions_Impl::SvtSearchOptions_Impl()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools SvtSearchOptions_Impl::SvtSearchOptions_Impl()"); nFlags = 0x0003FFFF; // set all options values to 'true' Load(); SetModified( FALSE ); @@ -104,6 +105,10 @@ void SvtSearchOptions_Impl::Commit() Save(); } +void SvtSearchOptions_Impl::Notify( const Sequence< rtl::OUString >& ) +{ +} + BOOL SvtSearchOptions_Impl::GetFlag( USHORT nOffset ) const { diff --git a/svtools/source/config/securityoptions.cxx b/unotools/source/config/securityoptions.cxx similarity index 99% rename from svtools/source/config/securityoptions.cxx rename to unotools/source/config/securityoptions.cxx index 8fbc9008d51e..ca2968d3a807 100644 --- a/svtools/source/config/securityoptions.cxx +++ b/unotools/source/config/securityoptions.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif @@ -37,7 +37,7 @@ // includes //_________________________________________________________________________________________________________________ -#include +#include #include #include #include @@ -48,7 +48,7 @@ #include #include -#include +#include #include #include "itemholder1.hxx" @@ -1073,7 +1073,7 @@ SvtSecurityOptions::SvtSecurityOptions() // ... and initialize ouer data container only if it not already exist! if( m_pDataContainer == NULL ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtSecurityOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtSecurityOptions_Impl::ctor()"); m_pDataContainer = new SvtSecurityOptions_Impl; ItemHolder1::holdConfigItem(E_SECURITYOPTIONS); diff --git a/svtools/source/config/sourceviewconfig.cxx b/unotools/source/config/sourceviewconfig.cxx similarity index 93% rename from svtools/source/config/sourceviewconfig.cxx rename to unotools/source/config/sourceviewconfig.cxx index 40b41d571751..3de0276643bf 100644 --- a/svtools/source/config/sourceviewconfig.cxx +++ b/unotools/source/config/sourceviewconfig.cxx @@ -29,23 +29,22 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#include +#include "precompiled_unotools.hxx" +#include #include #include #include #include #include -#include #include using namespace utl; using namespace rtl; using namespace com::sun::star::uno; -namespace svt +namespace utl { -class SourceViewConfig_Impl : public utl::ConfigItem, public SfxBroadcaster +class SourceViewConfig_Impl : public utl::ConfigItem { private: OUString m_sFontName; @@ -192,11 +191,7 @@ void SourceViewConfig_Impl::Commit() } PutProperties( aNames, aValues ); - //notify SfxListener - { - SfxSimpleHint aHint = SfxSimpleHint( SFX_HINT_DATACHANGED ); - Broadcast(aHint); - } + NotifyListeners(0); } /*-- 28.08.2002 16:32:19--------------------------------------------------- @@ -213,14 +208,15 @@ SourceViewConfig::SourceViewConfig() ++m_nRefCount; } - StartListening( *m_pImplConfig, TRUE ); + + m_pImplConfig->AddListener( this ); } /*-- 28.08.2002 16:32:19--------------------------------------------------- -----------------------------------------------------------------------*/ SourceViewConfig::~SourceViewConfig() { - EndListening( *m_pImplConfig, TRUE ); + m_pImplConfig->RemoveListener( this ); ::osl::MutexGuard aGuard( lclMutex::get() ); if( !--m_nRefCount ) { @@ -271,11 +267,5 @@ void SourceViewConfig::SetShowProportionalFontsOnly(sal_Bool bSet) { m_pImplConfig->SetShowProportionalFontsOnly(bSet); } -/* -----------------------------30.08.2002 10:40------------------------------ - - ---------------------------------------------------------------------------*/ -void SourceViewConfig::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - Broadcast( rHint ); } -}//namespace svt +// namespace utl diff --git a/svtools/source/config/startoptions.cxx b/unotools/source/config/startoptions.cxx similarity index 99% rename from svtools/source/config/startoptions.cxx rename to unotools/source/config/startoptions.cxx index 08f4a7e0500e..172a931231fe 100644 --- a/svtools/source/config/startoptions.cxx +++ b/unotools/source/config/startoptions.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif @@ -37,7 +37,7 @@ // includes //_________________________________________________________________________________________________________________ -#include +#include #include #include #include @@ -374,7 +374,7 @@ SvtStartOptions::SvtStartOptions() // ... and initialize ouer data container only if it not already! if( m_pDataContainer == NULL ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtStartOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtStartOptions_Impl::ctor()"); m_pDataContainer = new SvtStartOptions_Impl(); ItemHolder1::holdConfigItem(E_STARTOPTIONS); diff --git a/svtools/source/config/syslocaleoptions.cxx b/unotools/source/config/syslocaleoptions.cxx old mode 100644 new mode 100755 similarity index 67% rename from svtools/source/config/syslocaleoptions.cxx rename to unotools/source/config/syslocaleoptions.cxx index a75c63e34af0..7b14c9cb8c2f --- a/svtools/source/config/syslocaleoptions.cxx +++ b/unotools/source/config/syslocaleoptions.cxx @@ -29,33 +29,21 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION - -#include -#include -#include -#include -#include -#include +#include #include #include +#include +#include +#include +#include +#include #include #include -#include #include -#include -#include -#include - -#include - -#include "itemholder2.hxx" +#include "itemholder1.hxx" #define CFG_READONLY_DEFAULT sal_False @@ -74,27 +62,46 @@ namespace : public rtl::Static {}; } +com::sun::star::lang::Locale lcl_str_to_locale( const ::rtl::OUString rStr ) +{ + com::sun::star::lang::Locale aRet; + if ( rStr.getLength() ) + { + aRet = com::sun::star::lang::Locale(); + sal_Int32 nSep = rStr.indexOf('-'); + if (nSep < 0) + aRet.Language = rStr; + else + { + aRet.Language = rStr.copy(0, nSep); + if (nSep < rStr.getLength()) + aRet.Country = rStr.copy(nSep+1, rStr.getLength() - (nSep+1)); + } + } + + return aRet; +} + class SvtSysLocaleOptions_Impl : public utl::ConfigItem { + Locale m_aRealLocale; + Locale m_aRealUILocale; + LanguageType m_eRealLanguage; + LanguageType m_eRealUILanguage; OUString m_aLocaleString; // en-US or de-DE or empty for SYSTEM - LanguageType m_eLocaleLanguageType; // same for convenience access + OUString m_aUILocaleString; // en-US or de-DE or empty for SYSTEM OUString m_aCurrencyString; // USD-en-US or EUR-de-DE - SvtBroadcaster m_aBroadcaster; ULONG m_nBlockedHint; // pending hints - sal_Int32 m_nBroadcastBlocked; // broadcast only if this is 0 sal_Bool m_bDecimalSeparator; //use decimal separator same as locale - sal_Bool m_bROLocale; + sal_Bool m_bROUILocale; sal_Bool m_bROCurrency; sal_Bool m_bRODecimalSeparator; - static const Sequence< /* const */ OUString > GetPropertyNames(); - - void UpdateMiscSettings_Impl(); - ULONG ChangeLocaleSettings(); - void ChangeDefaultCurrency() const; - void Broadcast( ULONG nHint ); + static const Sequence< /* const */ OUString > GetPropertyNames(); + void MakeRealLocale(); + void MakeRealUILocale(); public: SvtSysLocaleOptions_Impl(); @@ -106,8 +113,10 @@ public: const OUString& GetLocaleString() const { return m_aLocaleString; } void SetLocaleString( const OUString& rStr ); - LanguageType GetLocaleLanguageType() const - { return m_eLocaleLanguageType; } + + const OUString& GetUILocaleString() const + { return m_aUILocaleString; } + void SetUILocaleString( const OUString& rStr ); const OUString& GetCurrencyString() const { return m_aCurrencyString; } @@ -116,30 +125,34 @@ public: sal_Bool IsDecimalSeparatorAsLocale() const { return m_bDecimalSeparator;} void SetDecimalSeparatorAsLocale( sal_Bool bSet); - SvtBroadcaster& GetBroadcaster() - { return m_aBroadcaster; } - void BlockBroadcasts( BOOL bBlock ); sal_Bool IsReadOnly( SvtSysLocaleOptions::EOption eOption ) const; + const Locale& GetRealLocale() { return m_aRealLocale; } + const Locale& GetRealUILocale() { return m_aRealUILocale; } + LanguageType GetRealLanguage() { return m_eRealLanguage; } + LanguageType GetRealUILanguage() { return m_eRealUILanguage; } }; -#define ROOTNODE_SYSLOCALE OUString(RTL_CONSTASCII_USTRINGPARAM("Setup/L10N")) +#define ROOTNODE_SYSLOCALE OUString(RTL_CONSTASCII_USTRINGPARAM("Setup/L10N")) -#define PROPERTYNAME_LOCALE OUString(RTL_CONSTASCII_USTRINGPARAM("ooSetupSystemLocale")) -#define PROPERTYNAME_CURRENCY OUString(RTL_CONSTASCII_USTRINGPARAM("ooSetupCurrency")) -#define PROPERTYNAME_DECIMALSEPARATOR OUString(RTL_CONSTASCII_USTRINGPARAM("DecimalSeparatorAsLocale")) +#define PROPERTYNAME_LOCALE OUString(RTL_CONSTASCII_USTRINGPARAM("ooSetupSystemLocale")) +#define PROPERTYNAME_UILOCALE OUString(RTL_CONSTASCII_USTRINGPARAM("ooLocale")) +#define PROPERTYNAME_CURRENCY OUString(RTL_CONSTASCII_USTRINGPARAM("ooSetupCurrency")) +#define PROPERTYNAME_DECIMALSEPARATOR OUString(RTL_CONSTASCII_USTRINGPARAM("DecimalSeparatorAsLocale")) -#define PROPERTYHANDLE_LOCALE 0 -#define PROPERTYHANDLE_CURRENCY 1 -#define PROPERTYHANDLE_DECIMALSEPARATOR 2 +#define PROPERTYHANDLE_LOCALE 0 +#define PROPERTYHANDLE_UILOCALE 1 +#define PROPERTYHANDLE_CURRENCY 2 +#define PROPERTYHANDLE_DECIMALSEPARATOR 3 -#define PROPERTYCOUNT 3 +#define PROPERTYCOUNT 4 const Sequence< OUString > SvtSysLocaleOptions_Impl::GetPropertyNames() { static const OUString pProperties[] = { PROPERTYNAME_LOCALE, + PROPERTYNAME_UILOCALE, PROPERTYNAME_CURRENCY, PROPERTYNAME_DECIMALSEPARATOR }; @@ -147,22 +160,19 @@ const Sequence< OUString > SvtSysLocaleOptions_Impl::GetPropertyNames() return seqPropertyNames; } - // ----------------------------------------------------------------------- SvtSysLocaleOptions_Impl::SvtSysLocaleOptions_Impl() : ConfigItem( ROOTNODE_SYSLOCALE ) , m_nBlockedHint( 0 ) - , m_nBroadcastBlocked( 0 ) , m_bDecimalSeparator( sal_True ) , m_bROLocale(CFG_READONLY_DEFAULT) + , m_bROUILocale(CFG_READONLY_DEFAULT) , m_bROCurrency(CFG_READONLY_DEFAULT) , m_bRODecimalSeparator(sal_False) { - if ( !IsValidConfigMgr() ) - ChangeLocaleSettings(); // assume SYSTEM defaults during Setup - else + if ( IsValidConfigMgr() ) { const Sequence< OUString > aNames = GetPropertyNames(); Sequence< Any > aValues = GetProperties( aNames ); @@ -192,6 +202,18 @@ SvtSysLocaleOptions_Impl::SvtSysLocaleOptions_Impl() m_bROLocale = pROStates[nProp]; } break; + case PROPERTYHANDLE_UILOCALE : + { + OUString aStr; + if ( pValues[nProp] >>= aStr ) + m_aUILocaleString = aStr; + else + { + DBG_ERRORFILE( "Wrong property type!" ); + } + m_bROUILocale = pROStates[nProp]; + } + break; case PROPERTYHANDLE_CURRENCY : { OUString aStr; @@ -222,10 +244,12 @@ SvtSysLocaleOptions_Impl::SvtSysLocaleOptions_Impl() } } } - UpdateMiscSettings_Impl(); - ChangeLocaleSettings(); +// UpdateMiscSettings_Impl(); EnableNotification( aNames ); } + + MakeRealLocale(); + MakeRealUILocale(); } @@ -235,15 +259,35 @@ SvtSysLocaleOptions_Impl::~SvtSysLocaleOptions_Impl() Commit(); } - -void SvtSysLocaleOptions_Impl::BlockBroadcasts( BOOL bBlock ) +void SvtSysLocaleOptions_Impl::MakeRealLocale() { - if ( bBlock ) - ++m_nBroadcastBlocked; - else if ( m_nBroadcastBlocked ) + m_aRealLocale = lcl_str_to_locale( m_aLocaleString ); + if ( m_aRealLocale.Language.getLength() ) { - if ( --m_nBroadcastBlocked == 0 ) - Broadcast( 0 ); + m_eRealLanguage = MsLangId::convertLocaleToLanguage( m_aRealLocale ); + } + else + { + m_eRealLanguage = MsLangId::getSystemLanguage(); + MsLangId::convertLanguageToLocale( m_eRealLanguage, m_aRealLocale ); + } +} + +void SvtSysLocaleOptions_Impl::MakeRealUILocale() +{ + if ( !m_aRealUILocale.Language.getLength() ) + { + // as we can't switch UILocale at runtime, we only store changes in the configuration + m_aRealUILocale = lcl_str_to_locale( m_aUILocaleString ); + if ( m_aRealUILocale.Language.getLength() ) + { + m_eRealUILanguage = MsLangId::convertLocaleToLanguage( m_aRealUILocale ); + } + else + { + m_eRealUILanguage = MsLangId::getSystemUILanguage(); + MsLangId::convertLanguageToLocale( m_eRealUILanguage, m_aRealUILocale ); + } } } @@ -257,6 +301,11 @@ sal_Bool SvtSysLocaleOptions_Impl::IsReadOnly( SvtSysLocaleOptions::EOption eOpt bReadOnly = m_bROLocale; break; } + case SvtSysLocaleOptions::E_UILOCALE : + { + bReadOnly = m_bROUILocale; + break; + } case SvtSysLocaleOptions::E_CURRENCY : { bReadOnly = m_bROCurrency; @@ -267,25 +316,6 @@ sal_Bool SvtSysLocaleOptions_Impl::IsReadOnly( SvtSysLocaleOptions::EOption eOpt } -void SvtSysLocaleOptions_Impl::Broadcast( ULONG nHint ) -{ - if ( m_nBroadcastBlocked ) - m_nBlockedHint |= nHint; - else - { - nHint |= m_nBlockedHint; - m_nBlockedHint = 0; - if ( nHint ) - { - if ( nHint & SYSLOCALEOPTIONS_HINT_CURRENCY ) - ChangeDefaultCurrency(); - SfxSimpleHint aHint( nHint ); - GetBroadcaster().Broadcast( aHint ); - } - } -} - - void SvtSysLocaleOptions_Impl::Commit() { const Sequence< OUString > aOrgNames = GetPropertyNames(); @@ -312,9 +342,19 @@ void SvtSysLocaleOptions_Impl::Commit() } } break; + case PROPERTYHANDLE_UILOCALE : + { + if (!m_bROUILocale) + { + pNames[nRealCount] = aOrgNames[nProp]; + pValues[nRealCount] <<= m_aUILocaleString; + ++nRealCount; + } + } + break; case PROPERTYHANDLE_CURRENCY : { - if (!m_bROLocale) + if (!m_bROCurrency) { pNames[nRealCount] = aOrgNames[nProp]; pValues[nRealCount] <<= m_aCurrencyString; @@ -346,36 +386,38 @@ void SvtSysLocaleOptions_Impl::SetLocaleString( const OUString& rStr ) if (!m_bROLocale && rStr != m_aLocaleString ) { m_aLocaleString = rStr; + MakeRealLocale(); + MsLangId::setConfiguredSystemLanguage( m_eRealLanguage ); SetModified(); ULONG nHint = SYSLOCALEOPTIONS_HINT_LOCALE; - nHint |= ChangeLocaleSettings(); - Broadcast( nHint ); + if ( !m_aCurrencyString.getLength() ) + nHint |= SYSLOCALEOPTIONS_HINT_CURRENCY; + NotifyListeners( nHint ); } } - -ULONG SvtSysLocaleOptions_Impl::ChangeLocaleSettings() +void SvtSysLocaleOptions_Impl::SetUILocaleString( const OUString& rStr ) { - // An empty config value denotes SYSTEM locale - if ( m_aLocaleString.getLength() ) - m_eLocaleLanguageType = MsLangId::convertIsoStringToLanguage( m_aLocaleString ); - else - m_eLocaleLanguageType = LANGUAGE_SYSTEM; - ULONG nHint = 0; - // new locale and no fixed currency => locale default currency might change - if ( !m_aCurrencyString.getLength() ) - nHint |= SYSLOCALEOPTIONS_HINT_CURRENCY; - return nHint; + if (!m_bROUILocale && rStr != m_aUILocaleString ) + { + m_aUILocaleString = rStr; +/* + // as we can't switch UILocale at runtime, we only store changes in the configuration + MakeRealUILocale(); + MsLangId::setConfiguredSystemLanguage( m_eRealUILanguage ); + SetModified(); + NotifyListeners( SYSLOCALEOPTIONS_HINT_UILOCALE ); +*/ + } } - void SvtSysLocaleOptions_Impl::SetCurrencyString( const OUString& rStr ) { if (!m_bROCurrency && rStr != m_aCurrencyString ) { m_aCurrencyString = rStr; SetModified(); - Broadcast( SYSLOCALEOPTIONS_HINT_CURRENCY ); + NotifyListeners( SYSLOCALEOPTIONS_HINT_CURRENCY ); } } @@ -385,19 +427,10 @@ void SvtSysLocaleOptions_Impl::SetDecimalSeparatorAsLocale( sal_Bool bSet) { m_bDecimalSeparator = bSet; SetModified(); - UpdateMiscSettings_Impl(); + NotifyListeners( SYSLOCALEOPTIONS_HINT_DECSEP ); } } - -void SvtSysLocaleOptions_Impl::ChangeDefaultCurrency() const -{ - const Link& rLink = SvtSysLocaleOptions::GetCurrencyChangeLink(); - if ( rLink.IsSet() ) - rLink.Call( NULL ); -} - - void SvtSysLocaleOptions_Impl::Notify( const Sequence< rtl::OUString >& seqPropertyNames ) { ULONG nHint = 0; @@ -412,7 +445,17 @@ void SvtSysLocaleOptions_Impl::Notify( const Sequence< rtl::OUString >& seqPrope seqValues[nProp] >>= m_aLocaleString; m_bROLocale = seqROStates[nProp]; nHint |= SYSLOCALEOPTIONS_HINT_LOCALE; - nHint |= ChangeLocaleSettings(); + if ( !m_aCurrencyString.getLength() ) + nHint |= SYSLOCALEOPTIONS_HINT_CURRENCY; + MakeRealLocale(); + } + if( seqPropertyNames[nProp] == PROPERTYNAME_UILOCALE ) + { + DBG_ASSERT( seqValues[nProp].getValueTypeClass() == TypeClass_STRING, "Locale property type" ); + seqValues[nProp] >>= m_aUILocaleString; + m_bROUILocale = seqROStates[nProp]; + nHint |= SYSLOCALEOPTIONS_HINT_UILOCALE; + MakeRealUILocale(); } else if( seqPropertyNames[nProp] == PROPERTYNAME_CURRENCY ) { @@ -425,22 +468,10 @@ void SvtSysLocaleOptions_Impl::Notify( const Sequence< rtl::OUString >& seqPrope { seqValues[nProp] >>= m_bDecimalSeparator; m_bRODecimalSeparator = seqROStates[nProp]; - UpdateMiscSettings_Impl(); } } if ( nHint ) - Broadcast( nHint ); -} -/* -----------------10.02.2004 15:25----------------- - - --------------------------------------------------*/ -void SvtSysLocaleOptions_Impl::UpdateMiscSettings_Impl() -{ - AllSettings aAllSettings( Application::GetSettings() ); - MiscSettings aMiscSettings = aAllSettings.GetMiscSettings(); - aMiscSettings.SetEnableLocalizedDecimalSep(m_bDecimalSeparator); - aAllSettings.SetMiscSettings( aMiscSettings ); - Application::SetSettings( aAllSettings ); + NotifyListeners( nHint ); } // ==================================================================== @@ -450,18 +481,20 @@ SvtSysLocaleOptions::SvtSysLocaleOptions() MutexGuard aGuard( GetMutex() ); if ( !pOptions ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtSysLocaleOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "svl ( ??? ) ::SvtSysLocaleOptions_Impl::ctor()"); pOptions = new SvtSysLocaleOptions_Impl; - ItemHolder2::holdConfigItem(E_SYSLOCALEOPTIONS); + ItemHolder1::holdConfigItem(E_SYSLOCALEOPTIONS); } ++nRefCount; + pOptions->AddListener(this); } SvtSysLocaleOptions::~SvtSysLocaleOptions() { MutexGuard aGuard( GetMutex() ); + pOptions->RemoveListener(this); if ( !--nRefCount ) { delete pOptions; @@ -480,7 +513,7 @@ Mutex& SvtSysLocaleOptions::GetMutex() if( !pMutex ) { // #i77768# Due to a static reference in the toolkit lib - // we need a mutex that lives longer than the svtools library. + // we need a mutex that lives longer than the svl library. // Otherwise the dtor would use a destructed mutex!! pMutex = new Mutex; } @@ -503,21 +536,7 @@ void SvtSysLocaleOptions::Commit() } -BOOL SvtSysLocaleOptions::AddListener( SvtListener& rLst ) -{ - MutexGuard aGuard( GetMutex() ); - return rLst.StartListening( pOptions->GetBroadcaster() ); -} - - -BOOL SvtSysLocaleOptions::RemoveListener( SvtListener& rLst ) -{ - MutexGuard aGuard( GetMutex() ); - return rLst.EndListening( pOptions->GetBroadcaster() ); -} - - -void SvtSysLocaleOptions::BlockBroadcasts( BOOL bBlock ) +void SvtSysLocaleOptions::BlockBroadcasts( bool bBlock ) { MutexGuard aGuard( GetMutex() ); pOptions->BlockBroadcasts( bBlock ); @@ -530,13 +549,23 @@ const OUString& SvtSysLocaleOptions::GetLocaleConfigString() const return pOptions->GetLocaleString(); } - void SvtSysLocaleOptions::SetLocaleConfigString( const OUString& rStr ) { MutexGuard aGuard( GetMutex() ); pOptions->SetLocaleString( rStr ); } +const OUString& SvtSysLocaleOptions::GetUILocaleConfigString() const +{ + MutexGuard aGuard( GetMutex() ); + return pOptions->GetUILocaleString(); +} + +void SvtSysLocaleOptions::SetUILocaleConfigString( const OUString& rStr ) +{ + MutexGuard aGuard( GetMutex() ); + pOptions->SetUILocaleString( rStr ); +} const OUString& SvtSysLocaleOptions::GetCurrencyConfigString() const { @@ -552,11 +581,6 @@ void SvtSysLocaleOptions::SetCurrencyConfigString( const OUString& rStr ) } -LanguageType SvtSysLocaleOptions::GetLocaleLanguageType() const -{ - MutexGuard aGuard( GetMutex() ); - return pOptions->GetLocaleLanguageType(); -} /*-- 11.02.2004 13:31:41--------------------------------------------------- @@ -635,3 +659,47 @@ const Link& SvtSysLocaleOptions::GetCurrencyChangeLink() return CurrencyChangeLink::get(); } + +void SvtSysLocaleOptions::ConfigurationChanged( utl::ConfigurationBroadcaster* p, sal_uInt32 nHint ) +{ + if ( nHint & SYSLOCALEOPTIONS_HINT_CURRENCY ) + { + const Link& rLink = GetCurrencyChangeLink(); + if ( rLink.IsSet() ) + rLink.Call( NULL ); + } + + ::utl::detail::Options::ConfigurationChanged( p, nHint ); +} + +com::sun::star::lang::Locale SvtSysLocaleOptions::GetLocale() const +{ + return lcl_str_to_locale( GetLocaleConfigString() ); +} + +com::sun::star::lang::Locale SvtSysLocaleOptions::GetUILocale() const +{ + return lcl_str_to_locale( GetUILocaleConfigString() ); +} + +com::sun::star::lang::Locale SvtSysLocaleOptions::GetRealLocale() const +{ + return pOptions->GetRealLocale(); +} + +com::sun::star::lang::Locale SvtSysLocaleOptions::GetRealUILocale() const +{ + return pOptions->GetRealUILocale(); +} + +LanguageType SvtSysLocaleOptions::GetRealLanguage() const +{ + return pOptions->GetRealLanguage(); +} + +LanguageType SvtSysLocaleOptions::GetRealUILanguage() const +{ + return pOptions->GetRealUILanguage(); +} + + diff --git a/svtools/source/config/undoopt.cxx b/unotools/source/config/undoopt.cxx similarity index 87% rename from svtools/source/config/undoopt.cxx rename to unotools/source/config/undoopt.cxx index a0c74ef84aac..c2c79120995f 100644 --- a/svtools/source/config/undoopt.cxx +++ b/unotools/source/config/undoopt.cxx @@ -29,13 +29,9 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION +#include "precompiled_unotools.hxx" -#include +#include #include "rtl/instance.hxx" #include #include @@ -43,11 +39,9 @@ #include #include #include -#include -#include #include #include -#include "itemholder2.hxx" +#include "itemholder1.hxx" using namespace utl; using namespace rtl; @@ -58,7 +52,7 @@ static sal_Int32 nRefCount = 0; #define STEPS 0 -class SvtUndoOptions_Impl : public utl::ConfigItem, public SfxBroadcaster +class SvtUndoOptions_Impl : public utl::ConfigItem { sal_Int32 nUndoCount; Sequence< rtl::OUString > m_aPropertyNames; @@ -100,8 +94,7 @@ void SvtUndoOptions_Impl::Commit() } PutProperties( m_aPropertyNames, aValues ); - //broadcast changes - Broadcast(SfxSimpleHint(SFX_HINT_UNDO_OPTIONS_CHANGED)); + NotifyListeners(0); } // ----------------------------------------------------------------------- @@ -158,8 +151,6 @@ void SvtUndoOptions_Impl::Load() void SvtUndoOptions_Impl::Notify( const Sequence& ) { Load(); - //broadcast changes - Broadcast(SfxSimpleHint(SFX_HINT_UNDO_OPTIONS_CHANGED)); } // ----------------------------------------------------------------------- @@ -177,14 +168,14 @@ SvtUndoOptions::SvtUndoOptions() ::osl::MutexGuard aGuard( LocalSingleton::get() ); if ( !pOptions ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtUndoOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtUndoOptions_Impl::ctor()"); pOptions = new SvtUndoOptions_Impl; - ItemHolder2::holdConfigItem(E_UNDOOPTIONS); + ItemHolder1::holdConfigItem(E_UNDOOPTIONS); } ++nRefCount; pImp = pOptions; - StartListening(*pImp); + pImp->AddListener(this); } // ----------------------------------------------------------------------- @@ -193,7 +184,7 @@ SvtUndoOptions::~SvtUndoOptions() { // Global access, must be guarded (multithreading) ::osl::MutexGuard aGuard( LocalSingleton::get() ); - EndListening(*pImp); + pImp->RemoveListener(this); if ( !--nRefCount ) { if ( pOptions->IsModified() ) @@ -211,10 +202,3 @@ sal_Int32 SvtUndoOptions::GetUndoCount() const { return pImp->GetUndoCount(); } - -void SvtUndoOptions::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - vos::OGuard aVclGuard( Application::GetSolarMutex() ); - Broadcast( rHint ); -} - diff --git a/svtools/source/config/useroptions.cxx b/unotools/source/config/useroptions.cxx similarity index 91% rename from svtools/source/config/useroptions.cxx rename to unotools/source/config/useroptions.cxx index aad000a235f1..e06d6a794e20 100644 --- a/svtools/source/config/useroptions.cxx +++ b/unotools/source/config/useroptions.cxx @@ -29,71 +29,59 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" -#ifdef SVL_DLLIMPLEMENTATION -#undef SVL_DLLIMPLEMENTATION -#endif -#define SVT_DLLIMPLEMENTATION +#include "precompiled_unotools.hxx" -#include -#include "configitems/useroptions_const.hxx" +#include +#include #include #include #include #include -#include #include -#include #include #include -#include "itemholder2.hxx" +#include "itemholder1.hxx" -#ifndef _COM_SUN_STAR_BEANS_PROPERTY_HPP_ #include -#endif - -#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_ #include -#endif - -#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_ #include -#endif - -#ifndef _COM_SUN_STAR_CONTAINER_XNAMEACCESS_HPP_ #include -#endif - -#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_ #include -#endif - -#ifndef _COM_SUN_STAR_LANG_XSINGLESERVICEFACTORY_HPP_ #include -#endif - -#ifndef _COMPHELPER_CONFIGURATIONHELPER_HXX_ +#include +#include +#include #include -#endif - -#ifndef _UNOTOOLS_PROCESSFACTORY_HXX_ #include -#endif - -#ifndef _SVT_LOGHELPER_HXX -#include "loghelper.hxx" -#endif +#include using namespace utl; using namespace rtl; +using namespace com::sun::star; using namespace com::sun::star::uno; namespace css = ::com::sun::star; // class SvtUserOptions_Impl --------------------------------------------- +class SvtUserOptions_Impl; +class SvtUserConfigChangeListener_Impl : public cppu::WeakImplHelper1 +< + com::sun::star::util::XChangesListener +> +{ + SvtUserOptions_Impl& m_rParent; + public: + SvtUserConfigChangeListener_Impl(SvtUserOptions_Impl& rParent); + ~SvtUserConfigChangeListener_Impl(); -class SvtUserOptions_Impl + //XChangesListener + virtual void SAL_CALL changesOccurred( const util::ChangesEvent& Event ) throw(RuntimeException); + //XEventListener + virtual void SAL_CALL disposing( const lang::EventObject& Source ) throw(RuntimeException); +}; + +class SvtUserOptions_Impl : public utl::ConfigurationBroadcaster { public: SvtUserOptions_Impl(); @@ -144,8 +132,10 @@ public: sal_Bool IsTokenReadonly( USHORT nToken ) const; ::rtl::OUString GetToken(USHORT nToken) const; + void Notify(); private: + uno::Reference< util::XChangesListener > m_xChangeListener; css::uno::Reference< css::container::XNameAccess > m_xCfg; css::uno::Reference< css::beans::XPropertySet > m_xData; ::rtl::OUString m_aLocale; @@ -158,18 +148,47 @@ static sal_Int32 nRefCount = 0; #define READONLY_DEFAULT sal_False -// functions ------------------------------------------------------------- +/*-- 16.06.2009 14:22:56--------------------------------------------------- -namespace + -----------------------------------------------------------------------*/ +SvtUserConfigChangeListener_Impl::SvtUserConfigChangeListener_Impl(SvtUserOptions_Impl& rParent) : + m_rParent( rParent ) { - struct PropertyNames - : public rtl::Static< Sequence< rtl::OUString >, PropertyNames> {}; +} +/*-- 16.06.2009 14:22:56--------------------------------------------------- + + -----------------------------------------------------------------------*/ +SvtUserConfigChangeListener_Impl::~SvtUserConfigChangeListener_Impl() +{ +} +/*-- 16.06.2009 14:22:56--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SvtUserConfigChangeListener_Impl::changesOccurred( const util::ChangesEvent& rEvent ) throw(RuntimeException) +{ + if(rEvent.Changes.getLength()) + m_rParent.Notify(); +} +/*-- 16.06.2009 14:22:56--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SvtUserConfigChangeListener_Impl::disposing( const lang::EventObject& rSource ) throw(RuntimeException) +{ + try + { + uno::Reference< util::XChangesNotifier > xChgNot( rSource.Source, UNO_QUERY_THROW); + xChgNot->removeChangesListener(this); + } + catch(Exception& ) + { + } } // class SvtUserOptions_Impl --------------------------------------------- // ----------------------------------------------------------------------- -SvtUserOptions_Impl::SvtUserOptions_Impl() +SvtUserOptions_Impl::SvtUserOptions_Impl() : + m_xChangeListener( new SvtUserConfigChangeListener_Impl(*this) ) { try { @@ -181,6 +200,14 @@ SvtUserOptions_Impl::SvtUserOptions_Impl() css::uno::UNO_QUERY ); m_xData = css::uno::Reference< css::beans::XPropertySet >(m_xCfg, css::uno::UNO_QUERY); + uno::Reference< util::XChangesNotifier > xChgNot( m_xCfg, UNO_QUERY); + try + { + xChgNot->addChangesListener( m_xChangeListener ); + } + catch(RuntimeException& ) + { + } } catch(const css::uno::Exception& ex) { @@ -743,6 +770,13 @@ void SvtUserOptions_Impl::SetApartment( const ::rtl::OUString& sApartment ) // ----------------------------------------------------------------------- +void SvtUserOptions_Impl::Notify() +{ + NotifyListeners(0); +} + +// ----------------------------------------------------------------------- + sal_Bool SvtUserOptions_Impl::IsTokenReadonly( USHORT nToken ) const { css::uno::Reference< css::beans::XPropertySet > xData(m_xCfg, css::uno::UNO_QUERY); @@ -899,14 +933,14 @@ SvtUserOptions::SvtUserOptions() if ( !pOptions ) { - RTL_LOGFILE_CONTEXT(aLog, "svtools ( ??? ) ::SvtUserOptions_Impl::ctor()"); + RTL_LOGFILE_CONTEXT(aLog, "unotools ( ??? ) ::SvtUserOptions_Impl::ctor()"); pOptions = new SvtUserOptions_Impl; - ItemHolder2::holdConfigItem(E_USEROPTIONS); + ItemHolder1::holdConfigItem(E_USEROPTIONS); } ++nRefCount; pImp = pOptions; - //StartListening( *pImp); + pImp->AddListener(this); } // ----------------------------------------------------------------------- @@ -915,7 +949,7 @@ SvtUserOptions::~SvtUserOptions() { // Global access, must be guarded (multithreading) ::osl::MutexGuard aGuard( GetInitMutex() ); - + pImp->RemoveListener(this); if ( !--nRefCount ) { //if ( pOptions->IsModified() ) @@ -1264,11 +1298,3 @@ sal_Bool SvtUserOptions::IsTokenReadonly( USHORT nToken ) const ::osl::MutexGuard aGuard( GetInitMutex() ); return pImp->GetToken( nToken ); } -/* -----------------07.07.2003 09:30----------------- - - --------------------------------------------------*/ -void SvtUserOptions::Notify( SfxBroadcaster&, const SfxHint& rHint ) -{ - vos::OGuard aVclGuard( Application::GetSolarMutex() ); - Broadcast( rHint ); -} diff --git a/svtools/source/config/viewoptions.cxx b/unotools/source/config/viewoptions.cxx similarity index 99% rename from svtools/source/config/viewoptions.cxx rename to unotools/source/config/viewoptions.cxx index d4c8d65dbe04..9ef8fc45d570 100644 --- a/svtools/source/config/viewoptions.cxx +++ b/unotools/source/config/viewoptions.cxx @@ -29,12 +29,12 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" //_________________________________________________________________________________________________________________ // includes //_________________________________________________________________________________________________________________ -#include +#include #include #include diff --git a/svtools/source/config/workingsetoptions.cxx b/unotools/source/config/workingsetoptions.cxx similarity index 99% rename from svtools/source/config/workingsetoptions.cxx rename to unotools/source/config/workingsetoptions.cxx index d2c1007a70de..6b17a63dad4d 100644 --- a/svtools/source/config/workingsetoptions.cxx +++ b/unotools/source/config/workingsetoptions.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif @@ -37,7 +37,7 @@ // includes //_________________________________________________________________________________________________________________ -#include +#include #include #include #include diff --git a/svtools/source/config/xmlaccelcfg.cxx b/unotools/source/config/xmlaccelcfg.cxx similarity index 98% rename from svtools/source/config/xmlaccelcfg.cxx rename to unotools/source/config/xmlaccelcfg.cxx index 36886a533413..b1c3f1e31e2d 100644 --- a/svtools/source/config/xmlaccelcfg.cxx +++ b/unotools/source/config/xmlaccelcfg.cxx @@ -29,17 +29,11 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" -#include "xmlaccelcfg.hxx" +#include #include -#if OSL_DEBUG_LEVEL == 0 -# ifndef NDEBUG -# define NDEBUG -# endif -#endif -#include #include #include @@ -200,7 +194,7 @@ void AttributeListImpl::clear() ::std::vector dummy; m_pImpl->vecAttribute.swap( dummy ); - assert( ! getLength() ); + OSL_ASSERT( ! getLength() ); } // ------------------------------------------------------------------ diff --git a/unotools/source/i18n/calendarwrapper.cxx b/unotools/source/i18n/calendarwrapper.cxx index 1d83761b5cea..b56175af7e41 100644 --- a/unotools/source/i18n/calendarwrapper.cxx +++ b/unotools/source/i18n/calendarwrapper.cxx @@ -71,7 +71,7 @@ CalendarWrapper::CalendarWrapper( } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "CalendarWrapper ctor: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -96,7 +96,7 @@ CalendarWrapper::CalendarWrapper( } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getComponentInstance: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -122,7 +122,7 @@ void CalendarWrapper::loadDefaultCalendar( const ::com::sun::star::lang::Locale& } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "loadDefaultCalendar: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -142,7 +142,7 @@ void CalendarWrapper::loadCalendar( const ::rtl::OUString& rUniqueID, const ::co } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "loadCalendar: Exception caught\nrequested: " ); aMsg += ByteString( String( rUniqueID ), RTL_TEXTENCODING_UTF8 ); aMsg += " Locale: "; @@ -167,7 +167,7 @@ void CalendarWrapper::loadCalendar( const ::rtl::OUString& rUniqueID, const ::co } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getLoadedCalendar: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -188,7 +188,7 @@ void CalendarWrapper::loadCalendar( const ::rtl::OUString& rUniqueID, const ::co } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getAllCalendars: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -209,7 +209,7 @@ void CalendarWrapper::loadCalendar( const ::rtl::OUString& rUniqueID, const ::co } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getUniqueID: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -230,7 +230,7 @@ void CalendarWrapper::setDateTime( double nTimeInDays ) } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "setDateTime: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -250,7 +250,7 @@ double CalendarWrapper::getDateTime() const } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getDateTime: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -280,7 +280,7 @@ sal_Int32 CalendarWrapper::getCombinedOffsetInMillis( } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "setLocalDateTime: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -352,7 +352,7 @@ void CalendarWrapper::setLocalDateTime( double nTimeInDays ) } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "setLocalDateTime: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -378,7 +378,7 @@ double CalendarWrapper::getLocalDateTime() const } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getLocalDateTime: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -399,7 +399,7 @@ void CalendarWrapper::setValue( sal_Int16 nFieldIndex, sal_Int16 nValue ) } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "setValue: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -419,7 +419,7 @@ sal_Bool CalendarWrapper::isValid() const } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "isValid: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -440,7 +440,7 @@ sal_Int16 CalendarWrapper::getValue( sal_Int16 nFieldIndex ) const } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getValue: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -461,7 +461,7 @@ void CalendarWrapper::addValue( sal_Int16 nFieldIndex, sal_Int32 nAmount ) } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "addValue: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -481,7 +481,7 @@ sal_Int16 CalendarWrapper::getFirstDayOfWeek() const } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getFirstDayOfWeek: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -502,7 +502,7 @@ void CalendarWrapper::setFirstDayOfWeek( sal_Int16 nDay ) } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "setFirstDayOfWeek: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -522,7 +522,7 @@ void CalendarWrapper::setMinimumNumberOfDaysForFirstWeek( sal_Int16 nDays ) } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "setMinimumNumberOfDaysForFirstWeek: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -542,7 +542,7 @@ sal_Int16 CalendarWrapper::getMinimumNumberOfDaysForFirstWeek() const } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getMinimumNumberOfDaysForFirstWeek: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -563,7 +563,7 @@ sal_Int16 CalendarWrapper::getNumberOfMonthsInYear() const } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getNumberOfMonthsInYear: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -584,7 +584,7 @@ sal_Int16 CalendarWrapper::getNumberOfDaysInWeek() const } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getNumberOfDaysInWeek: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -605,7 +605,7 @@ sal_Int16 CalendarWrapper::getNumberOfDaysInWeek() const } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getMonths: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -626,7 +626,7 @@ sal_Int16 CalendarWrapper::getNumberOfDaysInWeek() const } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getDays: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -647,7 +647,7 @@ String CalendarWrapper::getDisplayName( sal_Int16 nCalendarDisplayIndex, sal_Int } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getDisplayName: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -670,7 +670,7 @@ String CalendarWrapper::getDisplayString( sal_Int32 nCalendarDisplayCode, sal_In } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "getDisplayString: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); diff --git a/unotools/source/i18n/charclass.cxx b/unotools/source/i18n/charclass.cxx index c1b6b4bc155c..5b411d1bb519 100644 --- a/unotools/source/i18n/charclass.cxx +++ b/unotools/source/i18n/charclass.cxx @@ -538,7 +538,7 @@ sal_Int32 CharClass::getStringType( const String& rStr, xub_StrLen nPos, xub_Str } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "parseAnyToken: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -570,7 +570,7 @@ sal_Int32 CharClass::getStringType( const String& rStr, xub_StrLen nPos, xub_Str } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "parsePredefinedToken: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); diff --git a/unotools/source/i18n/localedatawrapper.cxx b/unotools/source/i18n/localedatawrapper.cxx index 074ff7af716a..fa70cc3dda81 100644 --- a/unotools/source/i18n/localedatawrapper.cxx +++ b/unotools/source/i18n/localedatawrapper.cxx @@ -1991,7 +1991,7 @@ void LocaleDataWrapper::evaluateLocaleDataChecking() nCheck = nLocaleDataChecking; if (!nCheck) { -#ifndef PRODUCT +#ifdef DBG_UTIL nCheck = 1; #else const char* pEnv = getenv( "OOO_ENABLE_LOCALE_DATA_CHECKS"); diff --git a/unotools/source/i18n/transliterationwrapper.cxx b/unotools/source/i18n/transliterationwrapper.cxx index bd33e447471f..7647a6abc345 100644 --- a/unotools/source/i18n/transliterationwrapper.cxx +++ b/unotools/source/i18n/transliterationwrapper.cxx @@ -191,7 +191,7 @@ void TransliterationWrapper::loadModuleImpl() const } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "loadModuleImpl: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -218,7 +218,7 @@ void TransliterationWrapper::loadModuleByImplName( } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "loadModuleByImplName: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -244,7 +244,7 @@ sal_Bool TransliterationWrapper::equals( } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "equals: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -269,7 +269,7 @@ sal_Int32 TransliterationWrapper::compareSubstring( } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "compareSubstring: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); @@ -292,7 +292,7 @@ sal_Int32 TransliterationWrapper::compareString( const String& rStr1, const Stri } catch ( Exception& e ) { -#ifndef PRODUCT +#ifdef DBG_UTIL ByteString aMsg( "compareString: Exception caught\n" ); aMsg += ByteString( String( e.Message ), RTL_TEXTENCODING_UTF8 ); DBG_ERRORFILE( aMsg.GetBuffer() ); diff --git a/vcl/source/gdi/fontcvt.cxx b/unotools/source/misc/fontcvt.cxx similarity index 97% rename from vcl/source/gdi/fontcvt.cxx rename to unotools/source/misc/fontcvt.cxx index 565c92740dad..5c4f902fbd55 100644 --- a/vcl/source/gdi/fontcvt.cxx +++ b/unotools/source/misc/fontcvt.cxx @@ -29,9 +29,9 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_vcl.hxx" -#include -#include +#include "precompiled_unotools.hxx" +#include +#include #ifndef _STLP_MAP #include @@ -1350,13 +1350,13 @@ StarSymbolToMSMultiFont *CreateStarSymbolToMSMultiFont(bool bPerfectOnly) //======================================================================= -sal_Unicode ImplRecodeChar( const ImplCvtChar* pConversion, sal_Unicode cChar ) +sal_Unicode ConvertChar::RecodeChar( sal_Unicode cChar ) const { sal_Unicode cRetVal = 0; - if( pConversion->mpCvtFunc ) + if( mpCvtFunc ) { // use a conversion function for recoding - cRetVal = pConversion->mpCvtFunc( cChar ); + cRetVal = mpCvtFunc( cChar ); } else { @@ -1367,7 +1367,7 @@ sal_Unicode ImplRecodeChar( const ImplCvtChar* pConversion, sal_Unicode cChar ) cIndex -= 0xF000; // recode the symbol if( cIndex>=0x0020 && cIndex<=0x00FF ) - cRetVal = pConversion->mpCvtTab[ cIndex - 0x0020 ]; + cRetVal = mpCvtTab[ cIndex - 0x0020 ]; } return cRetVal ? cRetVal : cChar; @@ -1377,8 +1377,7 @@ sal_Unicode ImplRecodeChar( const ImplCvtChar* pConversion, sal_Unicode cChar ) // recode the string assuming the character codes are symbol codes // from an traditional symbol font (i.e. U+F020..U+F0FF) -void ImplRecodeString( const ImplCvtChar* pConversion, String& rStr, - xub_StrLen nIndex, xub_StrLen nLen ) +void ConvertChar::RecodeString( String& rStr, xub_StrLen nIndex, xub_StrLen nLen ) const { ULONG nLastIndex = (ULONG)nIndex + nLen; if( nLastIndex > rStr.Len() ) @@ -1393,7 +1392,7 @@ void ImplRecodeString( const ImplCvtChar* pConversion, String& rStr, continue; // recode a symbol - sal_Unicode cNew = ImplRecodeChar( pConversion, cOrig ); + sal_Unicode cNew = RecodeChar( cOrig ); if( cOrig != cNew ) rStr.SetChar( nIndex, cNew ); } @@ -1401,7 +1400,7 @@ void ImplRecodeString( const ImplCvtChar* pConversion, String& rStr, //======================================================================= -struct RecodeTable { const char* pOrgName; ImplCvtChar aCvt;}; +struct RecodeTable { const char* pOrgName; ConvertChar aCvt;}; static RecodeTable aRecodeTable[] = { @@ -1427,22 +1426,17 @@ static RecodeTable aRecodeTable[] = {"mtextra", {aMTExtraTab, "StarSymbol", NULL}} }; -static ImplCvtChar aImplStarSymbolCvt = { NULL, "StarBats", ImplStarSymbolToStarBats }; -#if 0 -// not used -static ImplCvtChar aImplDingBatsCvt = { aMonotypeSortsTab, "StarSymbol", NULL }; -#endif +static ConvertChar aImplStarSymbolCvt = { NULL, "StarBats", ImplStarSymbolToStarBats }; // ----------------------------------------------------------------------- -const ImplCvtChar* ImplGetRecodeData( const String& rOrgFontName, - const String& rMapFontName ) +const ConvertChar* ConvertChar::GetRecodeData( const String& rOrgFontName, const String& rMapFontName ) { - const ImplCvtChar* pCvt = NULL; + const ConvertChar* pCvt = NULL; String aOrgName( rOrgFontName ); - ImplGetEnglishSearchFontName( aOrgName ); + GetEnglishSearchFontName( aOrgName ); String aMapName( rMapFontName ); - ImplGetEnglishSearchFontName( aMapName ); + GetEnglishSearchFontName( aMapName ); if( aMapName.EqualsAscii( "starsymbol" ) || aMapName.EqualsAscii( "opensymbol" ) ) @@ -1471,10 +1465,10 @@ const ImplCvtChar* ImplGetRecodeData( const String& rOrgFontName, FontToSubsFontConverter CreateFontToSubsFontConverter( const String& rOrgName, ULONG nFlags ) { - const ImplCvtChar* pCvt = NULL; + const ConvertChar* pCvt = NULL; String aName = rOrgName; - ImplGetEnglishSearchFontName( aName ); + GetEnglishSearchFontName( aName ); if ( nFlags & FONTTOSUBSFONT_IMPORT ) { @@ -1511,7 +1505,7 @@ sal_Unicode ConvertFontToSubsFontChar( FontToSubsFontConverter hConverter, sal_Unicode cChar ) { if ( hConverter ) - return ImplRecodeChar( (ImplCvtChar*)hConverter, cChar ); + return ((ConvertChar*)hConverter)->RecodeChar( cChar ); else return cChar; } @@ -1523,6 +1517,7 @@ String GetFontToSubsFontName( FontToSubsFontConverter hConverter ) if ( !hConverter ) return String(); - const char* pName = ((ImplCvtChar*)hConverter)->mpSubsFontName; + const char* pName = ((ConvertChar*)hConverter)->mpSubsFontName; return String::CreateFromAscii( pName ); } + diff --git a/unotools/source/misc/fontdefs.cxx b/unotools/source/misc/fontdefs.cxx new file mode 100644 index 000000000000..15e67c44f001 --- /dev/null +++ b/unotools/source/misc/fontdefs.cxx @@ -0,0 +1,596 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_unotools.hxx" +#include +#include +#include + +struct ImplLocalizedFontName +{ + const char* mpEnglishName; + const sal_Unicode* mpLocalizedNames; +}; + +static sal_Unicode const aBatang[] = { 0xBC14, 0xD0D5, 0, 0 }; +static sal_Unicode const aBatangChe[] = { 0xBC14, 0xD0D5, 0xCCB4, 0, 0 }; +static sal_Unicode const aGungsuh[] = { 0xAD81, 0xC11C, 0, 0 }; +static sal_Unicode const aGungsuhChe[] = { 0xAD81, 0xC11C, 0xCCB4, 0, 0 }; +static sal_Unicode const aGulim[] = { 0xAD74, 0xB9BC, 0, 0 }; +static sal_Unicode const aGulimChe[] = { 0xAD74, 0xB9BC, 0xCCB4, 0, 0 }; +static sal_Unicode const aDotum[] = { 0xB3CB, 0xC6C0, 0, 0 }; +static sal_Unicode const aDotumChe[] = { 0xB3CB, 0xC6C0, 0xCCB4, 0, 0 }; +static sal_Unicode const aSimSun[] = { 0x5B8B, 0x4F53, 0, 0 }; +static sal_Unicode const aNSimSun[] = { 0x65B0, 0x5B8B, 0x4F53, 0, 0 }; +static sal_Unicode const aSimHei[] = { 0x9ED1, 0x4F53, 0, 0 }; +static sal_Unicode const aSimKai[] = { 0x6977, 0x4F53, 0, 0 }; +static sal_Unicode const azycjkSun[] = { 0x4E2D, 0x6613, 0x5B8B, 0x4F53, 0, 0 }; +static sal_Unicode const azycjkHei[] = { 0x4E2D, 0x6613, 0x9ED1, 0x4F53, 0, 0 }; +static sal_Unicode const azycjkKai[] = { 0x4E2D, 0x6613, 0x6977, 0x4F53, 0, 0 }; +static sal_Unicode const aFZHei[] = { 0x65B9, 0x6B63, 0x9ED1, 0x4F53, 0, 0 }; +static sal_Unicode const aFZKai[] = { 0x65B9, 0x6B63, 0x6977, 0x4F53, 0, 0 }; +static sal_Unicode const aFZSongYI[] = { 0x65B9, 0x6B63, 0x5B8B, 0x4E00, 0, 0 }; +static sal_Unicode const aFZShuSong[] = { 0x65B9, 0x6B63, 0x4E66, 0x5B8B, 0, 0 }; +static sal_Unicode const aFZFangSong[] = { 0x65B9, 0x6B63, 0x4EFF, 0x5B8B, 0, 0 }; +// Attention: this fonts includes the wrong encoding vector - so we double the names with correct and wrong encoding +// First one is the GB-Encoding (we think the correct one), second is the big5 encoded name +static sal_Unicode const aMHei[] = { 'm', 0x7B80, 0x9ED1, 0, 'm', 0x6F60, 0x7AAA, 0, 0 }; +static sal_Unicode const aMKai[] = { 'm', 0x7B80, 0x6977, 0x566C, 0, 'm', 0x6F60, 0x7FF1, 0x628E, 0, 0 }; +static sal_Unicode const aMSong[] = { 'm', 0x7B80, 0x5B8B, 0, 'm', 0x6F60, 0x51BC, 0, 0 }; +static sal_Unicode const aCFangSong[] = { 'm', 0x7B80, 0x592B, 0x5B8B, 0, 'm', 0x6F60, 0x6E98, 0x51BC, 0, 0 }; +static sal_Unicode const aMingLiU[] = { 0x7D30, 0x660E, 0x9AD4, 0, 0 }; +static sal_Unicode const aPMingLiU[] = { 0x65B0, 0x7D30, 0x660E, 0x9AD4, 0, 0 }; +static sal_Unicode const aHei[] = { 0x6865, 0, 0 }; +static sal_Unicode const aKai[] = { 0x6B61, 0, 0 }; +static sal_Unicode const aMing[] = { 0x6D69, 0x6E67, 0, 0 }; +static sal_Unicode const aMSGothic[] = { 'm','s', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0, 0 }; +static sal_Unicode const aMSPGothic[] = { 'm','s','p', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0, 0 }; +static sal_Unicode const aMSMincho[] = { 'm', 's', 0x660E, 0x671D, 0 }; +static sal_Unicode const aMSPMincho[] = { 'm','s','p', 0x660E, 0x671D, 0 }; +static sal_Unicode const aMeiryo[] = { 0x30e1, 0x30a4, 0x30ea, 0x30aa, 0 }; +static sal_Unicode const aHGMinchoL[] = { 'h','g', 0x660E, 0x671D, 'l', 0, 0 }; +static sal_Unicode const aHGGothicB[] = { 'h','g', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 'b', 0 }; +static sal_Unicode const aHGPMinchoL[] = { 'h','g','p', 0x660E, 0x671D, 'l', 0 }; +static sal_Unicode const aHGPGothicB[] = { 'h','g','p', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 'b', 0 }; +static sal_Unicode const aHGMinchoLSun[] = { 'h','g', 0x660E, 0x671D, 'l', 's', 'u', 'n', 0 }; +static sal_Unicode const aHGPMinchoLSun[] = { 'h','g','p', 0x660E, 0x671D, 'l', 's', 'u', 'n', 0 }; +static sal_Unicode const aHGGothicBSun[] = { 'h', 'g', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 'b', 's', 'u', 'n', 0 }; +static sal_Unicode const aHGPGothicBSun[] = { 'h', 'g', 'p', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 'b', 's', 'u', 'n', 0 }; +static sal_Unicode const aHGHeiseiMin[] = { 'h', 'g', 0x5E73, 0x6210, 0x660E, 0x671D, 0x4F53, 0, 'h', 'g', 0x5E73, 0x6210, 0x660E, 0x671D, 0x4F53, 'w', '3', 'x', '1', '2', 0, 0 }; +static sal_Unicode const aIPAMincho[] = { 'i', 'p', 'a', 0x660E, 0x671D, 0 }; +static sal_Unicode const aIPAPMincho[] = { 'i', 'p', 'a', 'p', 0x660E, 0x671D, 0 }; +static sal_Unicode const aIPAGothic[] = { 'i', 'p', 'a', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0 }; +static sal_Unicode const aIPAPGothic[] = { 'i', 'p', 'a', 'p', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0 }; +static sal_Unicode const aIPAUIGothic[] = { 'i', 'p', 'a', 'u', 'i', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0 }; +static sal_Unicode const aSazanamiMincho[] = { 0x3055, 0x3056, 0x306A, 0x307F, 0x660E, 0x671D, 0, 0 }; +static sal_Unicode const aSazanamiGothic[] = { 0x3055, 0x3056, 0x306A, 0x307F, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0, 0 }; +static sal_Unicode const aKochiMincho[] = { 0x6771, 0x98A8, 0x660E, 0x671D, 0, 0 }; +static sal_Unicode const aKochiGothic[] = { 0x6771, 0x98A8, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0, 0 }; +static sal_Unicode const aSunDotum[] = { 0xC36C, 0xB3CB, 0xC6C0, 0, 0 }; +static sal_Unicode const aSunGulim[] = { 0xC36C, 0xAD74, 0xB9BC, 0, 0 }; +static sal_Unicode const aSunBatang[] = { 0xC36C, 0xBC14, 0xD0D5, 0, 0 }; +static sal_Unicode const aBaekmukDotum[] = { 0xBC31, 0xBB35, 0xB3CB, 0xC6C0, 0, 0 }; +static sal_Unicode const aBaekmukGulim[] = { 0xBC31, 0xBB35, 0xAD74, 0xB9BC, 0, 0 }; +static sal_Unicode const aBaekmukBatang[] = { 0xBC31, 0xBB35, 0xBC14, 0xD0D5, 0, 0 }; +static sal_Unicode const aFzMingTi[] = { 0x65B9, 0x6B63, 0x660E, 0x9AD4, 0, 0 }; +static sal_Unicode const aFzHeiTiTW[]= { 0x65B9, 0x6B63, 0x9ED1, 0x9AD4, 0, 0 }; +static sal_Unicode const aFzKaiTiTW[]= { 0x65B9, 0x6B63, 0x6977, 0x9AD4, 0, 0 }; +static sal_Unicode const aFzHeiTiCN[]= { 0x65B9, 0x6B63, 0x9ED1, 0x4F53, 0, 0 }; +static sal_Unicode const aFzKaiTiCN[]= { 0x65B9, 0x6B63, 0x6977, 0x4F53, 0, 0 }; +static sal_Unicode const aFzSongTi[] = { 0x65B9, 0x6B63, 0x5B8B, 0x4F53, 0, 0 }; +static sal_Unicode const aHYMyeongJoExtra[] = { 'h', 'y', 0xACAC, 0xBA85, 0xC870, 0, 0 }; +static sal_Unicode const aHYSinMyeongJoMedium[] = { 'h', 'y', 0xC2E0, 0xBA85, 0xC870, 0, 0 }; +static sal_Unicode const aHYGothicMedium[] = { 'h', 'y', 0xC911, 0xACE0, 0xB515, 0, 0 }; +static sal_Unicode const aHYGraphicMedium[] = { 'h', 'y', 0xADF8, 0xB798, 0xD53D, 'm', 0, 0 }; +static sal_Unicode const aHYGraphic[] = { 'h', 'y', 0xADF8, 0xB798, 0xD53D, 0, 0 }; +static sal_Unicode const aNewGulim[] = { 0xC0C8, 0xAD74, 0xB9BC, 0, 0 }; +static sal_Unicode const aSunGungseo[] = { 0xC36C, 0xAD81, 0xC11C, 0, 0 }; +static sal_Unicode const aHYGungSoBold[] = { 'h','y', 0xAD81, 0xC11C, 'b', 0, 0 }; +static sal_Unicode const aHYGungSo[] = { 'h','y', 0xAD81, 0xC11C, 0, 0 }; +static sal_Unicode const aSunHeadLine[] = { 0xC36C, 0xD5E4, 0xB4DC, 0xB77C, 0xC778, 0, 0 }; +static sal_Unicode const aHYHeadLineMedium[] = { 'h', 'y', 0xD5E4, 0xB4DC, 0xB77C, 0xC778, 'm', 0, 0 }; +static sal_Unicode const aHYHeadLine[] = { 'h', 'y', 0xD5E4, 0xB4DC, 0xB77C, 0xC778, 0, 0 }; +static sal_Unicode const aYetR[] = { 0xD734, 0xBA3C, 0xC61B, 0xCCB4, 0, 0 }; +static sal_Unicode const aHYGothicExtra[] = { 'h', 'y', 0xACAC, 0xACE0, 0xB515, 0, 0 }; +static sal_Unicode const aSunMokPan[] = { 0xC36C, 0xBAA9, 0xD310, 0, 0 }; +static sal_Unicode const aSunYeopseo[] = { 0xC36C, 0xC5FD, 0xC11C, 0, 0 }; +static sal_Unicode const aSunBaekSong[] = { 0xC36C, 0xBC31, 0xC1A1, 0, 0 }; +static sal_Unicode const aHYPostLight[] = { 'h', 'y', 0xC5FD, 0xC11C, 'l', 0, 0 }; +static sal_Unicode const aHYPost[] = { 'h', 'y', 0xC5FD, 0xC11C, 0, 0 }; +static sal_Unicode const aMagicR[] = { 0xD734, 0xBA3C, 0xB9E4, 0xC9C1, 0xCCB4, 0, 0 }; +static sal_Unicode const aSunCrystal[] = { 0xC36C, 0xD06C, 0xB9AC, 0xC2A4, 0xD0C8, 0, 0 }; +static sal_Unicode const aSunSaemmul[] = { 0xC36C, 0xC0D8, 0xBB3C, 0, 0 }; +static sal_Unicode const aHaansoftBatang[] = { 0xD55C, 0xCEF4, 0xBC14, 0xD0D5, 0, 0 }; +static sal_Unicode const aHaansoftDotum[] = { 0xD55C, 0xCEF4, 0xB3CB, 0xC6C0, 0, 0 }; +static sal_Unicode const aHyhaeseo[] = { 0xD55C, 0xC591, 0xD574, 0xC11C, 0, 0 }; +static sal_Unicode const aMDSol[] = { 'm', 'd', 0xC194, 0xCCB4, 0, 0 }; +static sal_Unicode const aMDGaesung[] = { 'm', 'd', 0xAC1C, 0xC131, 0xCCB4, 0, 0 }; +static sal_Unicode const aMDArt[] = { 'm', 'd', 0xC544, 0xD2B8, 0xCCB4, 0, 0 }; +static sal_Unicode const aMDAlong[] = { 'm', 'd', 0xC544, 0xB871, 0xCCB4, 0, 0 }; +static sal_Unicode const aMDEasop[] = { 'm', 'd', 0xC774, 0xC19D, 0xCCB4, 0, 0 }; +static sal_Unicode const aHYShortSamulMedium[] = { 'h', 'y', 0xC595, 0xC740, 0xC0D8, 0xBB3C, 'm', 0 }; +static sal_Unicode const aHYShortSamul[] = { 'h', 'y', 0xC595, 0xC740, 0xC0D8, 0xBB3C, 0 }; +static sal_Unicode const aHGGothicE[] = { 'h','g', 0xFF7A, 0xFF9E, 0xFF7C, 0xFF6F, 0xFF78, 'e', 0 }; +static sal_Unicode const aHGPGothicE[] = { 'h','g','p', 0xFF7A, 0xFF9E, 0xFF7C, 0xFF6F, 0xFF78, 'e', 0 }; +static sal_Unicode const aHGSGothicE[] = { 'h','g','s', 0xFF7A, 0xFF9E, 0xFF7C, 0xFF6F, 0xFF78, 'e', 0 }; +static sal_Unicode const aHGGothicM[] = { 'h','g', 0xFF7A, 0xFF9E, 0xFF7C, 0xFF6F, 0xFF78, 'm', 0 }; +static sal_Unicode const aHGPGothicM[] = { 'h','g','p', 0xFF7A, 0xFF9E, 0xFF7C, 0xFF6F, 0xFF78, 'm', 0 }; +static sal_Unicode const aHGSGothicM[] = { 'h','g','s', 0xFF7A, 0xFF9E, 0xFF7C, 0xFF6F, 0xFF78, 'm', 0 }; +static sal_Unicode const aHGGyoshotai[] = { 'h','g', 0x884C, 0x66F8, 0x4F53, 0 }; +static sal_Unicode const aHGPGyoshotai[] = { 'h','g','p', 0x884C, 0x66F8, 0x4F53, 0 }; +static sal_Unicode const aHGSGyoshotai[] = { 'h','g','s', 0x884C, 0x66F8, 0x4F53, 0 }; +static sal_Unicode const aHGKyokashotai[] = { 'h','g', 0x6559, 0x79D1, 0x66F8, 0x4F53, 0 }; +static sal_Unicode const aHGPKyokashotai[] = { 'h','g','p', 0x6559, 0x79D1, 0x66F8, 0x4F53, 0 }; +static sal_Unicode const aHGSKyokashotai[] = { 'h','g','s', 0x6559, 0x79D1, 0x66F8, 0x4F53, 0 }; +static sal_Unicode const aHGMinchoB[] = { 'h','g', 0x660E, 0x671D, 'b', 0 }; +static sal_Unicode const aHGPMinchoB[] = { 'h','g','p', 0x660E, 0x671D, 'b', 0 }; +static sal_Unicode const aHGSMinchoB[] = { 'h','g','s', 0x660E, 0x671D, 'b', 0 }; +static sal_Unicode const aHGMinchoE[] = { 'h','g', 0x660E, 0x671D, 'e', 0 }; +static sal_Unicode const aHGPMinchoE[] = { 'h','g','p', 0x660E, 0x671D, 'e', 0 }; +static sal_Unicode const aHGSMinchoE[] = { 'h','g','s', 0x660E, 0x671D, 'e', 0 }; +static sal_Unicode const aHGSoeiKakupoptai[] = { 'h','g', 0x5275,0x82F1,0x89D2,0xFF8E, + 0xFF9F,0xFF6F,0xFF8C,0xFF9F,0x4F53,0}; +static sal_Unicode const aHGPSoeiKakupoptai[] = { 'h','g', 'p', 0x5275,0x82F1,0x89D2,0xFF8E, + 0xFF9F,0xFF6F,0xFF8C,0xFF9F,0x4F53,0}; +static sal_Unicode const aHGSSoeiKakupoptai[] = { 'h','g', 's', 0x5275,0x82F1,0x89D2,0xFF8E, + 0xFF9F,0xFF6F,0xFF8C,0xFF9F,0x4F53,0}; +static sal_Unicode const aHGSoeiPresenceEB[] = { 'h','g', 0x5275,0x82F1,0xFF8C,0xFF9F, + 0xFF9A,0xFF7E,0xFF9E,0xFF9D,0xFF7D, 'e','b',0}; +static sal_Unicode const aHGPSoeiPresenceEB[] = { 'h','g','p', 0x5275,0x82F1,0xFF8C,0xFF9F, + 0xFF9A,0xFF7E,0xFF9E,0xFF9D,0xFF7D, 'e','b',0}; +static sal_Unicode const aHGSSoeiPresenceEB[] = { 'h','g','s', 0x5275,0x82F1,0xFF8C,0xFF9F, + 0xFF9A,0xFF7E,0xFF9E,0xFF9D,0xFF7D, 'e','b',0}; +static sal_Unicode const aHGSoeiKakugothicUB[] = { 'h','g', 0x5275,0x82F1,0x89D2,0xFF7A, + 0xFF9E,0xFF7C,0xFF6F,0xFF78,'u','b',0}; +static sal_Unicode const aHGPSoeiKakugothicUB[] = { 'h','g','p', 0x5275,0x82F1,0x89D2,0xFF7A, + 0xFF9E,0xFF7C,0xFF6F,0xFF78,'u','b',0}; +static sal_Unicode const aHGSSoeiKakugothicUB[] = { 'h','g','s', 0x5275,0x82F1,0x89D2,0xFF7A, + 0xFF9E,0xFF7C,0xFF6F,0xFF78,'u','b',0}; +static sal_Unicode const aHGSeikaishotaiPRO[] = { 'h','g', 0x6B63,0x6977,0x66F8,0x4F53, '-','p','r','o',0}; +static sal_Unicode const aHGMaruGothicMPRO[] = { 'h','g', 0x4E38,0xFF7A,0xFF9E,0xFF7C,0xFF6F,0xFF78, '-','p','r','o',0}; +static sal_Unicode const aHiraginoMinchoPro[] = { 0x30D2, 0x30E9, 0x30AE, 0x30CE, 0x660E, 0x671D, 'p','r','o',0}; +static sal_Unicode const aHiraginoMinchoProN[] = { 0x30D2, 0x30E9, 0x30AE, 0x30CE, 0x660E, 0x671D, 'p','r','o','n',0}; +static sal_Unicode const aHiraginoKakuGothicPro[] = { 0x30D2, 0x30E9, 0x30AE, 0x30CE, 0x89D2, 0x30B4, 'p','r','o',0}; +static sal_Unicode const aHiraginoKakuGothicProN[] = { 0x30D2, 0x30E9, 0x30AE, 0x30CE, 0x89D2, 0x30B4, 'p','r','o','n',0}; +static sal_Unicode const aHiraginoMaruGothicPro[] = { 0x30D2, 0x30E9, 0x30AE, 0x30CE, 0x4E38, 0x30B4, 'p','r','o',0}; +static sal_Unicode const aHiraginoMaruGothicProN[] = { 0x30D2, 0x30E9, 0x30AE, 0x30CE, 0x4E38, 0x30B4, 'p','r','o','n',0}; + + +static ImplLocalizedFontName aImplLocalizedNamesList[] = +{ +{ "batang", aBatang }, +{ "batangche", aBatangChe }, +{ "gungshu", aGungsuh }, +{ "gungshuche", aGungsuhChe }, +{ "gulim", aGulim }, +{ "gulimche", aGulimChe }, +{ "dotum", aDotum }, +{ "dotumche", aDotumChe }, +{ "simsun", aSimSun }, +{ "nsimsun", aNSimSun }, +{ "simhei", aSimHei }, +{ "simkai", aSimKai }, +{ "zycjksun", azycjkSun }, +{ "zycjkhei", azycjkHei }, +{ "zycjkkai", azycjkKai }, +{ "fzhei", aFZHei }, +{ "fzkai", aFZKai }, +{ "fzsong", aFZSongYI }, +{ "fzshusong", aFZShuSong }, +{ "fzfangsong", aFZFangSong }, +{ "mhei", aMHei }, +{ "mkai", aMKai }, +{ "msong", aMSong }, +{ "cfangsong", aCFangSong }, +{ "mingliu", aMingLiU }, +{ "pmingliu", aPMingLiU }, +{ "hei", aHei }, +{ "kai", aKai }, +{ "ming", aMing }, +{ "msgothic", aMSGothic }, +{ "mspgothic", aMSPGothic }, +{ "msmincho", aMSMincho }, +{ "mspmincho", aMSPMincho }, +{ "meiryo", aMeiryo }, +{ "hgminchol", aHGMinchoL }, +{ "hggothicb", aHGGothicB }, +{ "hgpminchol", aHGPMinchoL }, +{ "hgpgothicb", aHGPGothicB }, +{ "hgmincholsun", aHGMinchoLSun }, +{ "hggothicbsun", aHGGothicBSun }, +{ "hgpmincholsun", aHGPMinchoLSun }, +{ "hgpgothicbsun", aHGPGothicBSun }, +{ "hgheiseimin", aHGHeiseiMin }, +{ "ipamincho", aIPAMincho }, +{ "ipapmincho", aIPAPMincho }, +{ "ipagothic", aIPAGothic }, +{ "ipapgothic", aIPAPGothic }, +{ "ipauigothic", aIPAUIGothic }, +{ "sazanamimincho", aSazanamiMincho }, +{ "sazanamigothic", aSazanamiGothic }, +{ "kochimincho", aKochiMincho }, +{ "kochigothic", aKochiGothic }, +{ "sundotum", aSunDotum }, +{ "sungulim", aSunGulim }, +{ "sunbatang", aSunBatang }, +{ "baekmukdotum", aBaekmukDotum }, +{ "baekmukgulim", aBaekmukGulim }, +{ "baekmukbatang", aBaekmukBatang }, +{ "fzheiti", aFzHeiTiCN }, +{ "fzheiti", aFzHeiTiTW }, +{ "fzkaiti", aFzKaiTiCN }, +{ "fzkaitib", aFzKaiTiTW }, +{ "fzmingtib", aFzMingTi }, +{ "fzsongti", aFzSongTi }, +{ "hymyeongjoextra", aHYMyeongJoExtra }, +{ "hysinmyeongjomedium", aHYSinMyeongJoMedium }, +{ "hygothicmedium", aHYGothicMedium }, +{ "hygraphicmedium", aHYGraphicMedium }, +{ "hygraphic", aHYGraphic }, +{ "newgulim", aNewGulim }, +{ "sungungseo", aSunGungseo }, +{ "hygungsobold", aHYGungSoBold }, +{ "hygungso", aHYGungSo }, +{ "sunheadline", aSunHeadLine }, +{ "hyheadlinemedium", aHYHeadLineMedium }, +{ "hyheadline", aHYHeadLine }, +{ "yetr", aYetR }, +{ "hygothicextra", aHYGothicExtra }, +{ "sunmokpan", aSunMokPan }, +{ "sunyeopseo", aSunYeopseo }, +{ "sunbaeksong", aSunBaekSong }, +{ "hypostlight", aHYPostLight }, +{ "hypost", aHYPost }, +{ "magicr", aMagicR }, +{ "suncrystal", aSunCrystal }, +{ "sunsaemmul", aSunSaemmul }, +{ "hyshortsamulmedium", aHYShortSamulMedium }, +{ "hyshortsamul", aHYShortSamul }, +{ "haansoftbatang", aHaansoftBatang }, +{ "haansoftdotum", aHaansoftDotum }, +{ "hyhaeseo", aHyhaeseo }, +{ "mdsol", aMDSol }, +{ "mdgaesung", aMDGaesung }, +{ "mdart", aMDArt }, +{ "mdalong", aMDAlong }, +{ "mdeasop", aMDEasop }, +{ "hggothice", aHGGothicE }, +{ "hgpgothice", aHGPGothicE }, +{ "hgpothice", aHGSGothicE }, +{ "hggothicm", aHGGothicM }, +{ "hgpgothicm", aHGPGothicM }, +{ "hgpgothicm", aHGSGothicM }, +{ "hggyoshotai", aHGGyoshotai }, +{ "hgpgyoshotai", aHGPGyoshotai }, +{ "hgsgyoshotai", aHGSGyoshotai }, +{ "hgkyokashotai", aHGKyokashotai }, +{ "hgpkyokashotai", aHGPKyokashotai }, +{ "hgskyokashotai", aHGSKyokashotai }, +{ "hgminchob", aHGMinchoB }, +{ "hgpminchob", aHGPMinchoB }, +{ "hgsminchob", aHGSMinchoB }, +{ "hgminchoe", aHGMinchoE }, +{ "hgpminchoe", aHGPMinchoE }, +{ "hgsminchoe", aHGSMinchoE }, +{ "hgsoeikakupoptai", aHGSoeiKakupoptai }, +{ "hgpsoeikakupopta", aHGPSoeiKakupoptai }, +{ "hgssoeikakupopta", aHGSSoeiKakupoptai }, +{ "hgsoeipresenceeb", aHGSoeiPresenceEB }, +{ "hgpsoeipresenceeb", aHGPSoeiPresenceEB }, +{ "hgssoeipresenceeb", aHGSSoeiPresenceEB }, +{ "hgsoeikakugothicub", aHGSoeiKakugothicUB }, +{ "hgpsoeikakugothicub", aHGPSoeiKakugothicUB }, +{ "hgssoeikakugothicub", aHGSSoeiKakugothicUB }, +{ "hgseikaishotaipro", aHGSeikaishotaiPRO }, +{ "hgmarugothicmpro", aHGMaruGothicMPRO }, +{ "hiraginominchopro", aHiraginoMinchoPro }, +{ "hiraginominchopron", aHiraginoMinchoProN }, +{ "hiraginokakugothicpro", aHiraginoKakuGothicPro }, +{ "hiraginokakugothicpron", aHiraginoKakuGothicProN }, +{ "hiraginomarugothicpro", aHiraginoMaruGothicPro }, +{ "hiraginomarugothicpron", aHiraginoMaruGothicProN }, +{ NULL, NULL }, +}; + +// ----------------------------------------------------------------------- + +void GetEnglishSearchFontName( String& rName ) +{ + bool bNeedTranslation = false; + xub_StrLen nLen = rName.Len(); + + // Remove trailing whitespaces + xub_StrLen i = nLen; + while ( i && (rName.GetChar( i-1 ) < 32) ) + i--; + if ( i != nLen ) + rName.Erase( i ); + + // Remove Script at the end + // Scriptname must be the last part of the fontname and + // looks like "fontname (scriptname)". So there can only be a + // script name at the and of the fontname, when the last char is ')' + if ( (nLen >= 3) && rName.GetChar( nLen-1 ) == ')' ) + { + int nOpen = 1; + xub_StrLen nTempLen = nLen-2; + while ( nTempLen ) + { + if ( rName.GetChar( nTempLen ) == '(' ) + { + nOpen--; + if ( !nOpen ) + { + // Remove Space at the end + if ( nTempLen && (rName.GetChar( nTempLen-1 ) == ' ') ) + nTempLen--; + rName.Erase( nTempLen ); + nLen = nTempLen; + break; + } + } + if ( rName.GetChar( nTempLen ) == ')' ) + nOpen++; + nTempLen--; + } + } + + // remove all whitespaces and converts to lower case ASCII + // TODO: better transliteration to ASCII e.g. all digits + i = 0; + while ( i < nLen ) + { + sal_Unicode c = rName.GetChar( i ); + if ( c > 127 ) + { + // Translate to Lowercase-ASCII + // FullWidth-ASCII to half ASCII + if ( (c >= 0xFF00) && (c <= 0xFF5E) ) + { + c -= 0xFF00-0x0020; + // Upper to Lower + if ( (c >= 'A') && (c <= 'Z') ) + c += 'a' - 'A'; + rName.SetChar( i, c ); + } + else + { + // Only Fontnames with None-Ascii-Characters must be translated + bNeedTranslation = true; + } + } + // not lowercase Ascii + else if ( !((c >= 'a') && (c <= 'z')) ) + { + // To Lowercase-Ascii + if ( (c >= 'A') && (c <= 'Z') ) + { + c += 'a' - 'A'; + rName.SetChar( i, c ); + } + else if( ((c < '0') || (c > '9')) && (c != ';') ) // not 0-9 or semicolon + { + // Remove white spaces and special characters + rName.Erase( i, 1 ); + nLen--; + continue; + } + } + + i++; + } + + // translate normalized localized name to its normalized English ASCII name + if( bNeedTranslation ) + { + typedef std::hash_map FontNameDictionary; + static FontNameDictionary aDictionary( sizeof(aImplLocalizedNamesList) / sizeof(*aImplLocalizedNamesList) ); + // the font name dictionary needs to be intialized once + if( aDictionary.empty() ) + { + // TODO: check if all dictionary entries are already normalized? + const ImplLocalizedFontName* pList = aImplLocalizedNamesList; + for(; pList->mpEnglishName; ++pList ) + aDictionary[ pList->mpLocalizedNames ] = pList->mpEnglishName; + } + + FontNameDictionary::const_iterator it = aDictionary.find( rName ); + if( it != aDictionary.end() ) + rName.AssignAscii( it->second ); + } +} + +// ----------------------------------------------------------------------- + +String GetNextFontToken( const String& rTokenStr, xub_StrLen& rIndex ) +{ + // check for valid start index + int nStringLen = rTokenStr.Len(); + if( rIndex >= nStringLen ) + { + rIndex = STRING_NOTFOUND; + return String(); + } + + // find the next token delimiter and return the token substring + const sal_Unicode* pStr = rTokenStr.GetBuffer() + rIndex; + const sal_Unicode* pEnd = rTokenStr.GetBuffer() + nStringLen; + for(; pStr < pEnd; ++pStr ) + if( (*pStr == ';') || (*pStr == ',') ) + break; + + xub_StrLen nTokenStart = rIndex; + xub_StrLen nTokenLen; + if( pStr < pEnd ) + { + rIndex = sal::static_int_cast(pStr - rTokenStr.GetBuffer()); + nTokenLen = rIndex - nTokenStart; + ++rIndex; // skip over token separator + } + else + { + // no token delimiter found => handle last token + rIndex = STRING_NOTFOUND; + nTokenLen = STRING_LEN; + + // optimize if the token string consists of just one token + if( !nTokenStart ) + return rTokenStr; + } + + return String( rTokenStr, nTokenStart, nTokenLen ); +} + +// TODO: get rid of this in another incompatible build with SW project. +// SW's WW8 and RTF filters still use this (from fontcvt.hxx) +String GetFontToken( const String& rTokenStr, xub_StrLen nToken, xub_StrLen& rIndex ) +{ + // skip nToken Tokens + for( xub_StrLen i = 0; (i < nToken) && (rIndex != STRING_NOTFOUND); ++i ) + GetNextFontToken( rTokenStr, rIndex ); + + return GetNextFontToken( rTokenStr, rIndex ); +} + +// ======================================================================= + +static bool ImplIsFontToken( const String& rName, const String& rToken ) +{ + String aTempName; + xub_StrLen nIndex = 0; + do + { + aTempName = GetNextFontToken( rName, nIndex ); + if ( rToken == aTempName ) + return true; + } + while ( nIndex != STRING_NOTFOUND ); + + return false; +} + +// ----------------------------------------------------------------------- + +static void ImplAppendFontToken( String& rName, const String& rNewToken ) +{ + if ( rName.Len() ) + { + rName.Append( ';' ); + rName.Append( rNewToken ); + } + else + rName = rNewToken; +} + +void AddTokenFontName( String& rName, const String& rNewToken ) +{ + if ( !ImplIsFontToken( rName, rNewToken ) ) + ImplAppendFontToken( rName, rNewToken ); +} + + + +// ======================================================================= + +String GetSubsFontName( const String& rName, ULONG nFlags ) +{ + String aName; + + xub_StrLen nIndex = 0; + String aOrgName = GetNextFontToken( rName, nIndex ); + GetEnglishSearchFontName( aOrgName ); + + // #93662# do not try to replace StarSymbol with MS only font + if( nFlags == (SUBSFONT_MS|SUBSFONT_ONLYONE) + && ( aOrgName.EqualsAscii( "starsymbol" ) + || aOrgName.EqualsAscii( "opensymbol" ) ) ) + return aName; + + const utl::FontNameAttr* pAttr = utl::FontSubstConfiguration::get()->getSubstInfo( aOrgName ); + if ( pAttr ) + { + for( int i = 0; i < 3; i++ ) + { + const ::std::vector< String >* pVector = NULL; + switch( i ) + { + case 0: + if( nFlags & SUBSFONT_MS && pAttr->MSSubstitutions.size() ) + pVector = &pAttr->MSSubstitutions; + break; + case 1: + if( nFlags & SUBSFONT_PS && pAttr->PSSubstitutions.size() ) + pVector = &pAttr->PSSubstitutions; + break; + case 2: + if( nFlags & SUBSFONT_HTML && pAttr->HTMLSubstitutions.size() ) + pVector = &pAttr->HTMLSubstitutions; + break; + } + if( ! pVector ) + continue; + for( ::std::vector< String >::const_iterator it = pVector->begin(); it != pVector->end(); ++it ) + if( ! ImplIsFontToken( rName, *it ) ) + { + ImplAppendFontToken( aName, *it ); + if( nFlags & SUBSFONT_ONLYONE ) + { + i = 4; + break; + } + } + } + } + + return aName; +} + +// ----------------------------------------------------------------------- + +// TODO: use a more generic String hash +int FontNameHash::operator()( const String& rStr ) const +{ + // this simple hash just has to be good enough for font names + int nHash = 0; + const int nLen = rStr.Len(); + const sal_Unicode* p = rStr.GetBuffer(); + switch( nLen ) + { + default: nHash = (p[0]<<16) - (p[1]<<8) + p[2]; + nHash += nLen; + p += nLen - 3; + // fall through + case 3: nHash += (p[2]<<16); // fall through + case 2: nHash += (p[1]<<8); // fall through + case 1: nHash += p[0]; // fall through + case 0: break; + }; + + return nHash; +} + diff --git a/unotools/source/misc/makefile.mk b/unotools/source/misc/makefile.mk index 8e505e41aaac..d588a216c159 100644 --- a/unotools/source/misc/makefile.mk +++ b/unotools/source/misc/makefile.mk @@ -45,7 +45,10 @@ ENABLE_EXCEPTIONS=TRUE SLOFILES= $(SLO)$/atom.obj \ $(SLO)$/datetime.obj \ + $(SLO)$/syslocale.obj \ $(SLO)$/eventlisteneradapter.obj \ + $(SLO)$/fontcvt.obj \ + $(SLO)$/fontdefs.obj \ $(SLO)$/desktopterminationobserver.obj \ $(SLO)$/sharedunocomponent.obj \ $(SLO)$/componentresmodule.obj diff --git a/svtools/source/syslocale/syslocale.cxx b/unotools/source/misc/syslocale.cxx similarity index 59% rename from svtools/source/syslocale/syslocale.cxx rename to unotools/source/misc/syslocale.cxx index abe236bb46d0..8e9d75c6ce0c 100644 --- a/svtools/source/syslocale/syslocale.cxx +++ b/unotools/source/misc/syslocale.cxx @@ -29,20 +29,16 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "precompiled_unotools.hxx" #ifndef GCC #endif -#include -#include -#include -#include -#include +#include #include -#include +#include #include #include - +#include using namespace osl; using namespace com::sun::star; @@ -52,56 +48,55 @@ SvtSysLocale_Impl* SvtSysLocale::pImpl = NULL; sal_Int32 SvtSysLocale::nRefCount = 0; -class SvtSysLocale_Impl : public SvtListener +class SvtSysLocale_Impl : public utl::ConfigurationListener { - friend class SvtSysLocale; - +public: SvtSysLocaleOptions aSysLocaleOptions; LocaleDataWrapper* pLocaleData; CharClass* pCharClass; -public: - SvtSysLocale_Impl(); - virtual ~SvtSysLocale_Impl(); - - virtual void Notify( SvtBroadcaster& rBC, const SfxHint& rHint ); + SvtSysLocale_Impl(); + virtual ~SvtSysLocale_Impl(); + CharClass* GetCharClass(); + virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ); }; - // ----------------------------------------------------------------------- -SvtSysLocale_Impl::SvtSysLocale_Impl() +SvtSysLocale_Impl::SvtSysLocale_Impl() : pCharClass(NULL) { - const lang::Locale& rLocale = Application::GetSettings().GetLocale(); - pLocaleData = new LocaleDataWrapper( - ::comphelper::getProcessServiceFactory(), rLocale ); - pCharClass = new CharClass( - ::comphelper::getProcessServiceFactory(), rLocale ); - aSysLocaleOptions.AddListener( *this ); + pLocaleData = new LocaleDataWrapper( ::comphelper::getProcessServiceFactory(), aSysLocaleOptions.GetRealLocale() ); + + // listen for further changes + aSysLocaleOptions.AddListener( this ); } SvtSysLocale_Impl::~SvtSysLocale_Impl() { - aSysLocaleOptions.RemoveListener( *this ); + aSysLocaleOptions.RemoveListener( this ); delete pCharClass; delete pLocaleData; } - -void SvtSysLocale_Impl::Notify( SvtBroadcaster&, const SfxHint& rHint ) +CharClass* SvtSysLocale_Impl::GetCharClass() { - const SfxSimpleHint* p = PTR_CAST( SfxSimpleHint, &rHint ); - if( p && (p->GetId() & SYSLOCALEOPTIONS_HINT_LOCALE) ) - { - MutexGuard aGuard( SvtSysLocale::GetMutex() ); - const lang::Locale& rLocale = Application::GetSettings().GetLocale(); - pLocaleData->setLocale( rLocale ); - pCharClass->setLocale( rLocale ); - } + if ( !pCharClass ) + pCharClass = new CharClass(::comphelper::getProcessServiceFactory(), aSysLocaleOptions.GetRealLocale() ); + return pCharClass; } +void SvtSysLocale_Impl::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 nHint ) +{ + MutexGuard aGuard( SvtSysLocale::GetMutex() ); + if ( nHint & SYSLOCALEOPTIONS_HINT_LOCALE ) + { + com::sun::star::lang::Locale aLocale( aSysLocaleOptions.GetRealLocale() ); + pLocaleData->setLocale( aLocale ); + GetCharClass()->setLocale( aLocale ); + } +} // ==================================================================== @@ -135,7 +130,7 @@ Mutex& SvtSysLocale::GetMutex() if( !pMutex ) { // #i77768# Due to a static reference in the toolkit lib - // we need a mutex that lives longer than the svtools library. + // we need a mutex that lives longer than the svl library. // Otherwise the dtor would use a destructed mutex!! pMutex = new Mutex; } @@ -158,11 +153,38 @@ const LocaleDataWrapper* SvtSysLocale::GetLocaleDataPtr() const const CharClass& SvtSysLocale::GetCharClass() const { - return *(pImpl->pCharClass); + return *(pImpl->GetCharClass()); } const CharClass* SvtSysLocale::GetCharClassPtr() const { - return pImpl->pCharClass; + return pImpl->GetCharClass(); } + +SvtSysLocaleOptions& SvtSysLocale::GetOptions() const +{ + return pImpl->aSysLocaleOptions; +} + +com::sun::star::lang::Locale SvtSysLocale::GetLocale() const +{ + return pImpl->aSysLocaleOptions.GetRealLocale(); +} + +LanguageType SvtSysLocale::GetLanguage() const +{ + return pImpl->aSysLocaleOptions.GetRealLanguage(); +} + +com::sun::star::lang::Locale SvtSysLocale::GetUILocale() const +{ + return pImpl->aSysLocaleOptions.GetRealUILocale(); +} + +LanguageType SvtSysLocale::GetUILanguage() const +{ + return pImpl->aSysLocaleOptions.GetRealUILanguage(); +} + + diff --git a/unotools/source/property/propertysetinfo.cxx b/unotools/source/property/propertysetinfo.cxx index b8b5f8bb5125..ced5ae10a9d7 100644 --- a/unotools/source/property/propertysetinfo.cxx +++ b/unotools/source/property/propertysetinfo.cxx @@ -79,7 +79,7 @@ void PropertyMapImpl::add( PropertyMapEntry* pMap ) throw() { OUString aName( pMap->mpName, pMap->mnNameLen, RTL_TEXTENCODING_ASCII_US ); -#ifndef PRODUCT +#ifdef DBG_UTIL PropertyMap::iterator aIter = maPropertyMap.find( aName ); if( aIter != maPropertyMap.end() ) { diff --git a/vcl/aqua/inc/saldata.hxx b/vcl/aqua/inc/saldata.hxx index dc629b9a3b8c..a84be1fc2c25 100644 --- a/vcl/aqua/inc/saldata.hxx +++ b/vcl/aqua/inc/saldata.hxx @@ -35,6 +35,8 @@ #include #include "postmac.h" +#include "com/sun/star/uno/Reference.hxx" + #include "vcl/sv.h" #include "vcl/svdata.hxx" #include "vcl/salwtype.hxx" @@ -112,6 +114,9 @@ struct SalData long mnDPIX; // #i100617# read DPI only once per office life long mnDPIY; // #i100617# read DPI only once per office life + com::sun::star::uno::Reference< com::sun::star::uno::XInterface > + mxClipboard; + SalData(); ~SalData(); diff --git a/vcl/aqua/inc/salframe.h b/vcl/aqua/inc/salframe.h index aeabdefc72a5..5ddd96dae34d 100644 --- a/vcl/aqua/inc/salframe.h +++ b/vcl/aqua/inc/salframe.h @@ -44,6 +44,8 @@ #include #include +#include + class AquaSalGraphics; class AquaSalFrame; class AquaSalTimer; @@ -60,47 +62,49 @@ typedef struct SalFrame::SalPointerState SalPointerState; class AquaSalFrame : public SalFrame { public: - NSWindow* mpWindow; // Cocoa window - NSView* mpView; // Cocoa view (actually a custom view, see below - NSMenuItem* mpDockMenuEntry; // entry in the dynamic dock menu - NSRect maScreenRect; // for mirroring purposes - AquaSalGraphics* mpGraphics; // current frame graphics - AquaSalFrame* mpParent; // pointer to parent frame - SystemEnvData maSysData; // system data - int mnMinWidth; // min. client width in pixels - int mnMinHeight; // min. client height in pixels - int mnMaxWidth; // max. client width in pixels - int mnMaxHeight; // max. client height in pixels - NSRect maFullScreenRect; // old window size when in FullScreen - bool mbGraphics:1; // is Graphics used? - bool mbFullScreen:1; // is Window in FullScreen? - bool mbShown:1; - bool mbInitShow:1; - bool mbPositioned:1; - bool mbSized:1; - bool mbPresentation:1; + NSWindow* mpWindow; // Cocoa window + NSView* mpView; // Cocoa view (actually a custom view, see below + NSMenuItem* mpDockMenuEntry; // entry in the dynamic dock menu + NSRect maScreenRect; // for mirroring purposes + AquaSalGraphics* mpGraphics; // current frame graphics + AquaSalFrame* mpParent; // pointer to parent frame + SystemEnvData maSysData; // system data + int mnMinWidth; // min. client width in pixels + int mnMinHeight; // min. client height in pixels + int mnMaxWidth; // max. client width in pixels + int mnMaxHeight; // max. client height in pixels + NSRect maFullScreenRect; // old window size when in FullScreen + bool mbGraphics:1; // is Graphics used? + bool mbFullScreen:1; // is Window in FullScreen? + bool mbShown:1; + bool mbInitShow:1; + bool mbPositioned:1; + bool mbSized:1; + bool mbPresentation:1; - ULONG mnStyle; - unsigned int mnStyleMask; // our style mask from NSWindow creation + ULONG mnStyle; + unsigned int mnStyleMask; // our style mask from NSWindow creation - ULONG mnLastEventTime; - unsigned int mnLastModifierFlags; - AquaSalMenu* mpMenu; + ULONG mnLastEventTime; + unsigned int mnLastModifierFlags; + AquaSalMenu* mpMenu; - SalExtStyle mnExtStyle; // currently document frames are marked this way + SalExtStyle mnExtStyle; // currently document frames are marked this way - PointerStyle mePointerStyle; // currently active pointer style + PointerStyle mePointerStyle; // currently active pointer style - NSTrackingRectTag mnTrackingRectTag; // used to get enter/leave messages + NSTrackingRectTag mnTrackingRectTag; // used to get enter/leave messages - CGMutablePathRef mrClippingPath; // used for "shaping" - std::vector< CGRect > maClippingRects; + CGMutablePathRef mrClippingPath; // used for "shaping" + std::vector< CGRect > maClippingRects; - std::list maBlinkers; + std::list maBlinkers; - Rectangle maInvalidRect; + Rectangle maInvalidRect; - ULONG mnICOptions; + ULONG mnICOptions; + + boost::shared_ptr< Timer > mpActivityTimer; // Timer to prevent system sleep during presentation public: /** Constructor @@ -117,6 +121,7 @@ public: virtual BOOL PostEvent( void* pData ); virtual void SetTitle( const XubString& rTitle ); virtual void SetIcon( USHORT nIcon ); + virtual void SetRepresentedURL( const rtl::OUString& ); virtual void SetMenu( SalMenu* pSalMenu ); virtual void DrawMenuBar(); virtual void Show( BOOL bVisible, BOOL bNoActivate = FALSE ); @@ -136,7 +141,7 @@ public: virtual void SetPointer( PointerStyle ePointerStyle ); virtual void CaptureMouse( BOOL bMouse ); virtual void SetPointerPos( long nX, long nY ); - virtual void Flush( void); + virtual void Flush( void ); virtual void Flush( const Rectangle& ); virtual void Sync(); virtual void SetInputContext( SalInputContext* pContext ); diff --git a/vcl/aqua/inc/salframeview.h b/vcl/aqua/inc/salframeview.h index e969cc8509a1..e823837e7af6 100755 --- a/vcl/aqua/inc/salframeview.h +++ b/vcl/aqua/inc/salframeview.h @@ -108,6 +108,7 @@ -(void)sendMouseEventToFrame:(NSEvent*)pEvent button:(USHORT)nButton eventtype:(USHORT)nEvent; -(MacOSBOOL)sendKeyInputAndReleaseToFrame: (USHORT)nKeyCode character: (sal_Unicode)aChar; -(MacOSBOOL)sendKeyInputAndReleaseToFrame: (USHORT)nKeyCode character: (sal_Unicode)aChar modifiers: (unsigned int)nMod; +-(MacOSBOOL)sendKeyToFrameDirect: (USHORT)nKeyCode character: (sal_Unicode)aChar modifiers: (unsigned int)nMod; -(MacOSBOOL)sendSingleCharacter:(NSEvent*)pEvent; -(MacOSBOOL)handleKeyDownException:(NSEvent*)pEvent; /* @@ -131,7 +132,11 @@ -(void)moveWordForwardAndModifySelection: (id)aSender; -(void)moveWordRightAndModifySelection: (id)aSender; -(void)moveToEndOfLine: (id)aSender; +-(void)moveToRightEndOfLine: (id)aSender; +-(void)moveToLeftEndOfLine: (id)aSender; -(void)moveToEndOfLineAndModifySelection: (id)aSender; +-(void)moveToRightEndOfLineAndModifySelection: (id)aSender; +-(void)moveToLeftEndOfLineAndModifySelection: (id)aSender; -(void)moveToBeginningOfLine: (id)aSender; -(void)moveToBeginningOfLineAndModifySelection: (id)aSender; -(void)moveToEndOfParagraph: (id)aSender; @@ -143,8 +148,10 @@ -(void)moveParagraphBackward: (id)aSender; -(void)moveParagraphBackwardAndModifySelection: (id)aSender; -(void)moveToEndOfDocument: (id)aSender; +-(void)scrollToEndOfDocument: (id)aSender; -(void)moveToEndOfDocumentAndModifySelection: (id)aSender; -(void)moveToBeginningOfDocument: (id)aSender; +-(void)scrollToBeginningOfDocument: (id)aSender; -(void)moveToBeginningOfDocumentAndModifySelection: (id)aSender; -(void)insertNewline: (id)aSender; -(void)deleteBackward: (id)aSender; diff --git a/vcl/aqua/inc/salgdi.h b/vcl/aqua/inc/salgdi.h index 11abd6086ce7..4933dbc48586 100644 --- a/vcl/aqua/inc/salgdi.h +++ b/vcl/aqua/inc/salgdi.h @@ -358,6 +358,7 @@ private: void ApplyXorContext(); void Pattern50Fill(); + UInt32 getState( ControlState nState ); }; class XorEmulation diff --git a/vcl/aqua/inc/salinst.h b/vcl/aqua/inc/salinst.h index b2cbc83d9f79..5b1cf0d84562 100644 --- a/vcl/aqua/inc/salinst.h +++ b/vcl/aqua/inc/salinst.h @@ -143,9 +143,16 @@ public: virtual void DestroyMenuItem( SalMenuItem* ); virtual SalSession* CreateSalSession(); virtual void* GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes ); + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); virtual void SetEventCallback( void* pInstance, bool(*pCallback)(void*,void*,int) ); virtual void SetErrorEventCallback( void* pInstance, bool(*pCallback)(void*,void*,int) ); + // dtrans implementation + virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > + CreateClipboard( const com::sun::star::uno::Sequence< com::sun::star::uno::Any >& i_rArguments ); + virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > CreateDragSource(); + virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > CreateDropTarget(); + static void handleAppDefinedEvent( NSEvent* pEvent ); // check whether a particular string is passed on the command line diff --git a/vcl/aqua/inc/vclnsapp.h b/vcl/aqua/inc/vclnsapp.h index a5c339c238bd..622f1bfd6bcd 100755 --- a/vcl/aqua/inc/vclnsapp.h +++ b/vcl/aqua/inc/vclnsapp.h @@ -35,6 +35,8 @@ #include "Cocoa/Cocoa.h" #include "postmac.h" +class AquaSalFrame; + @interface CocoaThreadEnabler : NSObject { } @@ -59,12 +61,13 @@ -(void)scrollbarSettingsChanged: (NSNotification*) pNotification; -(void)addFallbackMenuItem: (NSMenuItem*)pNewItem; -(void)removeFallbackMenuItem: (NSMenuItem*)pOldItem; --(void)getSystemVersionMajor:(unsigned *)major minor:(unsigned *)minor bugFix:(unsigned *)bugFix; -(void)addDockMenuItem: (NSMenuItem*)pNewItem; -(void)applicationWillBecomeActive: (NSNotification *)pNotification; -(void)applicationWillResignActive: (NSNotification *)pNotification; -(MacOSBOOL)applicationShouldHandleReopen: (NSApplication*)pApp hasVisibleWindows: (MacOSBOOL)bWinVisible; -(void)setDockIconClickHandler: (NSObject*)pHandler; +-(void)cycleFrameForward: (AquaSalFrame*)pCurFrame; +-(void)cycleFrameBackward: (AquaSalFrame*)pCurFrame; @end #endif diff --git a/vcl/aqua/source/a11y/aqua11yfactory.mm b/vcl/aqua/source/a11y/aqua11yfactory.mm index b660472d9bbe..a49bce957b3b 100644 --- a/vcl/aqua/source/a11y/aqua11yfactory.mm +++ b/vcl/aqua/source/a11y/aqua11yfactory.mm @@ -151,7 +151,18 @@ static bool enabled = false; } [ nativeRole release ]; [ aWrapper setActsAsRadioGroup: asRadioGroup ]; - if ( ! rxAccessibleContext -> getAccessibleStateSet() -> contains ( AccessibleStateType::TRANSIENT ) ) { + #if 0 + /* #i102033# NSAccessibility does not seemt to know an equivalent for transient children. + That means we need to cache this, else e.g. tree list boxes are not accessible (moreover + it crashes by notifying dead objects - which would seemt o be another bug) + + FIXME: + Unfortunately this can increase memory consumption drastically until the non transient parent + is destroyed an finally all the transients are released. + */ + if ( ! rxAccessibleContext -> getAccessibleStateSet() -> contains ( AccessibleStateType::TRANSIENT ) ) + #endif + { [ dAllWrapper setObject: aWrapper forKey: nKey ]; } } diff --git a/vcl/aqua/source/a11y/aqua11ytextattributeswrapper.mm b/vcl/aqua/source/a11y/aqua11ytextattributeswrapper.mm index 53472e6ae34d..e521e7362323 100644 --- a/vcl/aqua/source/a11y/aqua11ytextattributeswrapper.mm +++ b/vcl/aqua/source/a11y/aqua11ytextattributeswrapper.mm @@ -249,6 +249,8 @@ using namespace ::rtl; // empty } catch ( IndexOutOfBoundsException & e ) { // empty + } catch ( RuntimeException& ) { + // at least don't crash } return string; } diff --git a/vcl/aqua/source/a11y/aqua11yutil.mm b/vcl/aqua/source/a11y/aqua11yutil.mm index 6d12fbee7a91..44f95169ca68 100644 --- a/vcl/aqua/source/a11y/aqua11yutil.mm +++ b/vcl/aqua/source/a11y/aqua11yutil.mm @@ -51,7 +51,7 @@ using namespace ::com::sun::star::awt; +(Point)nsPointToVclPoint:(NSValue *)nsPoint { // VCL coordinates are in upper-left-notation, Cocoa likes it the Cartesian way (lower-left) NSRect screenRect = [ [ NSScreen mainScreen ] frame ]; - return Point ( [ nsPoint pointValue ].x, screenRect.size.height - [ nsPoint pointValue ].y ); + return Point ( static_cast([ nsPoint pointValue ].x), static_cast(screenRect.size.height - [ nsPoint pointValue ].y) ); } @end diff --git a/vcl/aqua/source/a11y/aqua11ywrapper.mm b/vcl/aqua/source/a11y/aqua11ywrapper.mm index d6f99c7020d6..64e0e9ef0308 100644 --- a/vcl/aqua/source/a11y/aqua11ywrapper.mm +++ b/vcl/aqua/source/a11y/aqua11ywrapper.mm @@ -109,7 +109,18 @@ static MacOSBOOL isPopupMenuOpen = NO; // XAccessibleMultiLineText mpReferenceWrapper -> rAccessibleMultiLineText = Reference < XAccessibleMultiLineText > ( rxAccessibleContext, UNO_QUERY ); // XAccessibleEventBroadcaster - if ( ! rxAccessibleContext -> getAccessibleStateSet() -> contains ( AccessibleStateType::TRANSIENT ) ) { + #if 0 + /* #i102033# NSAccessibility does not seemt to know an equivalent for transient children. + That means we need to cache this, else e.g. tree list boxes are not accessible (moreover + it crashes by notifying dead objects - which would seemt o be another bug) + + FIXME: + Unfortunately this can increase memory consumption drastically until the non transient parent + is destroyed an finally all the transients are released. + */ + if ( ! rxAccessibleContext -> getAccessibleStateSet() -> contains ( AccessibleStateType::TRANSIENT ) ) + #endif + { Reference< XAccessibleEventBroadcaster > xBroadcaster(rxAccessibleContext, UNO_QUERY); if( xBroadcaster.is() ) { /* @@ -728,9 +739,15 @@ static MacOSBOOL isPopupMenuOpen = NO; if ( nativeSubrole != nil && ! [ nativeSubrole isEqualToString: @"" ] ) { [ attributeNames addObject: NSAccessibilitySubroleAttribute ]; } + try + { if ( [ self accessibleContext ] -> getAccessibleChildCount() > 0 ) { [ attributeNames addObject: NSAccessibilityChildrenAttribute ]; } + } + catch( DisposedException& ) {} + catch( RuntimeException& ) {} + if ( title != nil && ! [ title isEqualToString: @"" ] ) { [ attributeNames addObject: NSAccessibilityTitleAttribute ]; } @@ -986,7 +1003,7 @@ Reference < XAccessibleContext > hitTestRunner ( Point point, Reference < XAcces } Reference < XAccessibleContext > hitChild; NSRect screenRect = [ [ NSScreen mainScreen ] frame ]; - Point hitPoint ( point.x , screenRect.size.height - point.y ); + Point hitPoint ( static_cast(point.x) , static_cast(screenRect.size.height - point.y) ); // check child windows first NSWindow * window = (NSWindow *) [ self accessibilityAttributeValue: NSAccessibilityWindowAttribute ]; NSArray * childWindows = [ window childWindows ]; diff --git a/vcl/aqua/source/a11y/documentfocuslistener.cxx b/vcl/aqua/source/a11y/documentfocuslistener.cxx index 2bb1429bc9fe..f20a67a85f29 100644 --- a/vcl/aqua/source/a11y/documentfocuslistener.cxx +++ b/vcl/aqua/source/a11y/documentfocuslistener.cxx @@ -102,12 +102,12 @@ DocumentFocusListener::notifyEvent( const AccessibleEventObject& aEvent ) break; case AccessibleEventId::INVALIDATE_ALL_CHILDREN: -/* { + { Reference< XAccessible > xAccessible( getAccessible(aEvent) ); detachRecursive(xAccessible); attachRecursive(xAccessible); } -*/ + OSL_TRACE( "Invalidate all children called\n" ); break; default: diff --git a/vcl/aqua/source/app/makefile.mk b/vcl/aqua/source/app/makefile.mk index 2bf3641898f1..a90c95c74a6e 100644 --- a/vcl/aqua/source/app/makefile.mk +++ b/vcl/aqua/source/app/makefile.mk @@ -50,8 +50,6 @@ dummy: .ELSE # "$(GUIBASE)"!="aqua" -#CFLAGS+=-x objective-c++ - SLOFILES= $(SLO)$/salinst.obj \ $(SLO)$/saldata.obj \ $(SLO)$/vclnsapp.obj \ diff --git a/vcl/aqua/source/app/saldata.cxx b/vcl/aqua/source/app/saldata.cxx index a70854306122..180f6a106459 100644 --- a/vcl/aqua/source/app/saldata.cxx +++ b/vcl/aqua/source/app/saldata.cxx @@ -93,7 +93,7 @@ SalData::~SalData() } osl_destroyThreadKey( s_aAutoReleaseKey ); - s_aAutoReleaseKey = NULL; + s_aAutoReleaseKey = 0; } if ( mpMainController ) [mpMainController release]; diff --git a/vcl/aqua/source/app/salinst.cxx b/vcl/aqua/source/app/salinst.cxx index b9d66d1e02d3..4ec3339d5372 100644 --- a/vcl/aqua/source/app/salinst.cxx +++ b/vcl/aqua/source/app/salinst.cxx @@ -55,15 +55,24 @@ #include "saltimer.h" #include "vclnsapp.h" +#include + +#include +#include +#include +#include +#include + #include "premac.h" #include #include #import "apple_remote/RemoteMainController.h" #include "apple_remote/RemoteControl.h" #include "postmac.h" - +#include using namespace std; +using namespace ::com::sun::star; extern BOOL ImplSVMain(); @@ -140,10 +149,6 @@ bool AquaSalInstance::isOnCommandLine( const rtl::OUString& rArg ) // returns an NSAutoreleasePool that must be released when the event loop begins static void initNSApp() { - SInt32 major = NULL; - SInt32 minor = NULL; - SInt32 bugFix = NULL; - // create our cocoa NSApplication [VCL_NSApplication sharedApplication]; @@ -176,7 +181,17 @@ static void initNSApp() object: nil ]; // get System Version and store the value in GetSalData()->mnSystemVersion - [NSApp getSystemVersionMajor: (unsigned int *)major minor:(unsigned int *)minor bugFix:(unsigned int *)bugFix ]; + OSErr err = noErr; + SInt32 systemVersion = VER_TIGER; // Initialize with minimal requirement + if( (err = Gestalt(gestaltSystemVersion, &systemVersion)) == noErr ) + { + GetSalData()->mnSystemVersion = systemVersion; +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "System Version %x\n", (unsigned int)systemVersion); +#endif + } + else + NSLog(@"Unable to obtain system version: %ld", (long)err); // Initialize Apple Remote GetSalData()->mpMainController = [[MainController alloc] init]; @@ -457,6 +472,7 @@ AquaSalInstance::AquaSalInstance() { mpSalYieldMutex = new SalYieldMutex; mpSalYieldMutex->acquire(); + ::tools::SolarMutex::SetSolarMutex( mpSalYieldMutex ); maMainThread = vos::OThread::getCurrentIdentifier(); mbWaitingYield = false; maUserEventListMutex = osl_createMutex(); @@ -467,6 +483,7 @@ AquaSalInstance::AquaSalInstance() AquaSalInstance::~AquaSalInstance() { + ::tools::SolarMutex::SetSolarMutex( 0 ); mpSalYieldMutex->release(); delete mpSalYieldMutex; osl_destroyMutex( maUserEventListMutex ); @@ -809,6 +826,18 @@ bool AquaSalInstance::AnyInput( USHORT nType ) return false; } + if( nType & INPUT_TIMER ) + { + if( AquaSalTimer::pRunningTimer ) + { + NSDate* pDt = [AquaSalTimer::pRunningTimer fireDate]; + if( pDt && [pDt timeIntervalSinceNow] < 0 ) + { + return true; + } + } + } + unsigned/*NSUInteger*/ nEventMask = 0; if( nType & INPUT_MOUSE) nEventMask |= @@ -822,7 +851,7 @@ bool AquaSalInstance::AnyInput( USHORT nType ) nEventMask |= NSKeyDownMask | NSKeyUpMask | NSFlagsChangedMask; if( nType & INPUT_OTHER) nEventMask |= NSTabletPoint; - // TODO: INPUT_PAINT / INPUT_TIMER / more INPUT_OTHER + // TODO: INPUT_PAINT / more INPUT_OTHER if( !nType) return false; @@ -1011,6 +1040,83 @@ void* AquaSalInstance::GetConnectionIdentifier( ConnectionIdentifierType& rRetur return (void*)""; } +// We need to re-encode file urls because osl_getFileURLFromSystemPath converts +// to UTF-8 before encoding non ascii characters, which is not what other apps expect. +static rtl::OUString translateToExternalUrl(const rtl::OUString& internalUrl) +{ + rtl::OUString extUrl; + + uno::Reference< lang::XMultiServiceFactory > sm = comphelper::getProcessServiceFactory(); + if (sm.is()) + { + uno::Reference< beans::XPropertySet > pset; + sm->queryInterface( getCppuType( &pset )) >>= pset; + if (pset.is()) + { + uno::Reference< uno::XComponentContext > context; + static const rtl::OUString DEFAULT_CONTEXT( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ); + pset->getPropertyValue(DEFAULT_CONTEXT) >>= context; + if (context.is()) + extUrl = uri::ExternalUriReferenceTranslator::create(context)->translateToExternal(internalUrl); + } + } + return extUrl; +} + +// #i104525# many versions of OSX have problems with some URLs: +// when an app requests OSX to add one of these URLs to the "Recent Items" list +// then this app gets killed (TextEdit, Preview, etc. and also OOo) +static bool isDangerousUrl( const rtl::OUString& rUrl ) +{ + // use a heuristic that detects all known cases since there is no official comment + // on the exact impact and root cause of the OSX bug + const int nLen = rUrl.getLength(); + const sal_Unicode* p = rUrl.getStr(); + for( int i = 0; i < nLen-3; ++i, ++p ) { + if( p[0] != '%' ) + continue; + // escaped percent? + if( (p[1] == '2') && (p[2] == '5') ) + return true; + // escapes are considered to be UTF-8 encoded + // => check for invalid UTF-8 leading byte + if( (p[1] != 'f') && (p[1] != 'F') ) + continue; + int cLowNibble = p[2]; + if( (cLowNibble >= '0' ) && (cLowNibble <= '9')) + return false; + if( cLowNibble >= 'a' ) + cLowNibble -= 'a' - 'A'; + if( (cLowNibble < 'A') || (cLowNibble >= 'C')) + return true; + } + + return false; +} + +void AquaSalInstance::AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& /*rMimeType*/) +{ + // Convert file URL for external use (see above) + rtl::OUString externalUrl = translateToExternalUrl(rFileUrl); + if( 0 == externalUrl.getLength() ) + externalUrl = rFileUrl; + + if( externalUrl.getLength() && !isDangerousUrl( externalUrl ) ) + { + NSString* pString = CreateNSString( externalUrl ); + NSURL* pURL = [NSURL URLWithString: pString]; + + if( pURL ) + { + NSDocumentController* pCtrl = [NSDocumentController sharedDocumentController]; + [pCtrl noteNewRecentDocumentURL: pURL]; + } + if( pString ) + [pString release]; + } +} + + // ----------------------------------------------------------------------- SalTimer* AquaSalInstance::CreateSalTimer() diff --git a/vcl/aqua/source/app/salsys.cxx b/vcl/aqua/source/app/salsys.cxx index 28acb47ccade..78b5defe6dd9 100644 --- a/vcl/aqua/source/app/salsys.cxx +++ b/vcl/aqua/source/app/salsys.cxx @@ -75,8 +75,8 @@ Rectangle AquaSalSystem::GetDisplayScreenPosSizePixel( unsigned int nScreen ) if( pScreen ) { NSRect aFrame = [pScreen frame]; - aRet = Rectangle( Point( aFrame.origin.x, aFrame.origin.y ), - Size( aFrame.size.width, aFrame.size.height ) ); + aRet = Rectangle( Point( static_cast(aFrame.origin.x), static_cast(aFrame.origin.y) ), + Size( static_cast(aFrame.size.width), static_cast(aFrame.size.height) ) ); } return aRet; } @@ -94,8 +94,8 @@ Rectangle AquaSalSystem::GetDisplayWorkAreaPosSizePixel( unsigned int nScreen ) if( pScreen ) { NSRect aFrame = [pScreen visibleFrame]; - aRet = Rectangle( Point( aFrame.origin.x, aFrame.origin.y ), - Size( aFrame.size.width, aFrame.size.height ) ); + aRet = Rectangle( Point( static_cast(aFrame.origin.x), static_cast(aFrame.origin.y) ), + Size( static_cast(aFrame.size.width), static_cast(aFrame.size.height) ) ); } return aRet; } diff --git a/vcl/aqua/source/app/vclnsapp.mm b/vcl/aqua/source/app/vclnsapp.mm index 4ad5e7ff9271..5a295b5e1171 100755 --- a/vcl/aqua/source/app/vclnsapp.mm +++ b/vcl/aqua/source/app/vclnsapp.mm @@ -104,45 +104,52 @@ return; } } + + // #i90083# handle frame switching + // FIXME: lousy workaround + if( (nModMask & (NSControlKeyMask|NSAlternateKeyMask)) == 0 ) + { + if( [[pEvent characters] isEqualToString: @"<"] || + [[pEvent characters] isEqualToString: @"~"] ) + { + [self cycleFrameForward: pFrame]; + return; + } + else if( [[pEvent characters] isEqualToString: @">"] || + [[pEvent characters] isEqualToString: @"`"] ) + { + [self cycleFrameBackward: pFrame]; + return; + } + } - /* #i89611# - Cmd-Option-Space is for some reason not consumed by the menubar, - but also not by the input method (like e.g. Cmd-Space) and stays - without function. - - However MOD1 + MOD2 combinations are not used throughout OOo code - since they tend to clash with system shortcuts on all platforms so - we can skip this case here. - */ // get information whether the event was handled; keyDown returns nothing GetSalData()->maKeyEventAnswer[ pEvent ] = false; bool bHandled = false; - if( nModMask != (NSCommandKeyMask | NSAlternateKeyMask) ) + // dispatch to view directly to avoid the key event being consumed by the menubar + // popup windows do not get the focus, so they don't get these either + // simplest would be dispatch this to the key window always if it is without parent + // however e.g. in document we want the menu shortcut if e.g. the stylist has focus + if( pFrame->mpParent && (pFrame->mnStyle & SAL_FRAME_STYLE_FLOAT) == 0 ) { - // dispatch to view directly to avoid the key event being consumed by the menubar - // popup windows do not get the focus, so they don't get these either - // simplest would be dispatch this to the key window always if it is without parent - // however e.g. in document we want the menu shortcut if e.g. the stylist has focus - if( pFrame->mpParent && (pFrame->mnStyle & SAL_FRAME_STYLE_FLOAT) == 0 ) - { - [[pKeyWin contentView] keyDown: pEvent]; - bHandled = GetSalData()->maKeyEventAnswer[ pEvent ]; - } - - // see whether the main menu consumes this event - // if not, we want to dispatch it ourselves. Unless we do this "trick" - // the main menu just beeps for an unknown or disabled key equivalent - // and swallows the event wholesale - NSMenu* pMainMenu = [NSApp mainMenu]; - if( ! bHandled && (pMainMenu == 0 || ! [pMainMenu performKeyEquivalent: pEvent]) ) - { - [[pKeyWin contentView] keyDown: pEvent]; - bHandled = GetSalData()->maKeyEventAnswer[ pEvent ]; - } - else - bHandled = true; // event handled already or main menu just handled it + [[pKeyWin contentView] keyDown: pEvent]; + bHandled = GetSalData()->maKeyEventAnswer[ pEvent ]; } + + // see whether the main menu consumes this event + // if not, we want to dispatch it ourselves. Unless we do this "trick" + // the main menu just beeps for an unknown or disabled key equivalent + // and swallows the event wholesale + NSMenu* pMainMenu = [NSApp mainMenu]; + if( ! bHandled && (pMainMenu == 0 || ! [pMainMenu performKeyEquivalent: pEvent]) ) + { + [[pKeyWin contentView] keyDown: pEvent]; + bHandled = GetSalData()->maKeyEventAnswer[ pEvent ]; + } + else + bHandled = true; // event handled already or main menu just handled it + GetSalData()->maKeyEventAnswer.erase( pEvent ); if( bHandled ) return; @@ -197,6 +204,84 @@ { [super sendEvent: pEvent]; } + +-(void)cycleFrameForward: (AquaSalFrame*)pCurFrame +{ + // find current frame in list + std::list< AquaSalFrame* >& rFrames( GetSalData()->maFrames ); + std::list< AquaSalFrame* >::iterator it = rFrames.begin(); + for( ; it != rFrames.end() && *it != pCurFrame; ++it ) + ; + if( it != rFrames.end() ) + { + // now find the next frame (or end) + do + { + ++it; + if( it != rFrames.end() ) + { + if( (*it)->mpDockMenuEntry != NULL && + (*it)->mbShown ) + { + [(*it)->getWindow() makeKeyAndOrderFront: NSApp]; + return; + } + } + } while( it != rFrames.end() ); + // cycle around, find the next up to pCurFrame + it = rFrames.begin(); + while( *it != pCurFrame ) + { + if( (*it)->mpDockMenuEntry != NULL && + (*it)->mbShown ) + { + [(*it)->getWindow() makeKeyAndOrderFront: NSApp]; + return; + } + ++it; + } + } +} + +-(void)cycleFrameBackward: (AquaSalFrame*)pCurFrame +{ + // do the same as cycleFrameForward only with a reverse iterator + + // find current frame in list + std::list< AquaSalFrame* >& rFrames( GetSalData()->maFrames ); + std::list< AquaSalFrame* >::reverse_iterator it = rFrames.rbegin(); + for( ; it != rFrames.rend() && *it != pCurFrame; ++it ) + ; + if( it != rFrames.rend() ) + { + // now find the next frame (or end) + do + { + ++it; + if( it != rFrames.rend() ) + { + if( (*it)->mpDockMenuEntry != NULL && + (*it)->mbShown ) + { + [(*it)->getWindow() makeKeyAndOrderFront: NSApp]; + return; + } + } + } while( it != rFrames.rend() ); + // cycle around, find the next up to pCurFrame + it = rFrames.rbegin(); + while( *it != pCurFrame ) + { + if( (*it)->mpDockMenuEntry != NULL && + (*it)->mbShown ) + { + [(*it)->getWindow() makeKeyAndOrderFront: NSApp]; + return; + } + ++it; + } + } +} -(NSMenu*)applicationDockMenu:(NSApplication *)sender { @@ -374,26 +459,6 @@ AquaSalMenu::removeFallbackMenuItem( pItem ); } -- (void)getSystemVersionMajor:(unsigned *)major - minor:(unsigned *)minor - bugFix:(unsigned *)bugFix -{ - OSErr err; - SInt32 systemVersion = VER_TIGER; // Initialize with minimal requirement - if ((err = Gestalt(gestaltSystemVersion, &systemVersion)) == noErr) - { - GetSalData()->mnSystemVersion = systemVersion; -#if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "System Version %x\n", (unsigned int)systemVersion); - fprintf( stderr, "Stored System Version %x\n", (unsigned int)GetSalData()->mnSystemVersion); -#endif - } - else - NSLog(@"Unable to obtain system version: %ld", (long)err); - - return; -} - -(void)addDockMenuItem: (NSMenuItem*)pNewItem { NSMenu* pDock = AquaSalInstance::GetDynamicDockMenu(); diff --git a/dtrans/source/aqua/DataFlavorMapping.cxx b/vcl/aqua/source/dtrans/DataFlavorMapping.cxx similarity index 97% rename from dtrans/source/aqua/DataFlavorMapping.cxx rename to vcl/aqua/source/dtrans/DataFlavorMapping.cxx index ce042e15b4d8..af05f084a97e 100644 --- a/dtrans/source/aqua/DataFlavorMapping.cxx +++ b/vcl/aqua/source/dtrans/DataFlavorMapping.cxx @@ -28,11 +28,13 @@ * ************************************************************************/ +#include "vcl/unohelp.hxx" #include #include "HtmlFmtFlt.hxx" #include "PictToBmpFlt.hxx" -#include -#include +#include "com/sun/star/datatransfer/UnsupportedFlavorException.hpp" +#include "com/sun/star/datatransfer/XMimeContentType.hpp" +#include "com/sun/star/lang/XMultiServiceFactory.hpp" #include "com/sun/star/uno/Sequence.hxx" #include @@ -513,12 +515,11 @@ Any FileListDataProvider::getOOoData() //########################### -DataFlavorMapper::DataFlavorMapper(const Reference& context) : - mXComponentContext(context) +DataFlavorMapper::DataFlavorMapper() { - Reference mrServiceManager = mXComponentContext->getServiceManager(); - mrXMimeCntFactory = Reference(mrServiceManager->createInstanceWithContext( - OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.datatransfer.MimeContentTypeFactory")), mXComponentContext), UNO_QUERY); + Reference mrServiceManager = vcl::unohelper::GetMultiServiceFactory(); + mrXMimeCntFactory = Reference(mrServiceManager->createInstance( + OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.datatransfer.MimeContentTypeFactory"))), UNO_QUERY); if (!mrXMimeCntFactory.is()) throw RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM("AquaClipboard: Cannot create com.sun.star.datatransfer.MimeContentTypeFactory")), NULL); diff --git a/dtrans/source/aqua/DataFlavorMapping.hxx b/vcl/aqua/source/dtrans/DataFlavorMapping.hxx similarity index 95% rename from dtrans/source/aqua/DataFlavorMapping.hxx rename to vcl/aqua/source/dtrans/DataFlavorMapping.hxx index 6243032d5051..03cb77e319f7 100644 --- a/dtrans/source/aqua/DataFlavorMapping.hxx +++ b/vcl/aqua/source/dtrans/DataFlavorMapping.hxx @@ -75,7 +75,7 @@ public: /* Initialialize a DataFavorMapper instance. Throws a RuntimeException in case the XMimeContentTypeFactory service cannot be created. */ - DataFlavorMapper(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& context); + DataFlavorMapper(); /* Map a system data flavor to an OpenOffice data flavor. @@ -133,7 +133,6 @@ private: bool isValidMimeContentType(const rtl::OUString& contentType) const; private: - const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext> mXComponentContext; ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XMimeContentTypeFactory> mrXMimeCntFactory; }; diff --git a/dtrans/source/aqua/DragActionConversion.cxx b/vcl/aqua/source/dtrans/DragActionConversion.cxx similarity index 100% rename from dtrans/source/aqua/DragActionConversion.cxx rename to vcl/aqua/source/dtrans/DragActionConversion.cxx diff --git a/dtrans/source/aqua/DragActionConversion.hxx b/vcl/aqua/source/dtrans/DragActionConversion.hxx similarity index 100% rename from dtrans/source/aqua/DragActionConversion.hxx rename to vcl/aqua/source/dtrans/DragActionConversion.hxx diff --git a/dtrans/source/aqua/DragSource.cxx b/vcl/aqua/source/dtrans/DragSource.cxx similarity index 96% rename from dtrans/source/aqua/DragSource.cxx rename to vcl/aqua/source/dtrans/DragSource.cxx index c0e7bd6ece94..074ce5c6c318 100644 --- a/dtrans/source/aqua/DragSource.cxx +++ b/vcl/aqua/source/dtrans/DragSource.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include #include #include @@ -61,9 +61,6 @@ using namespace comphelper; using namespace std; -extern rtl_StandardModuleCount g_moduleCount; - - // For OOo internal D&D we provide the Transferable without NSDragPboard // interference as a shortcut Reference DragSource::g_XTransferable = Reference(); @@ -161,14 +158,12 @@ Sequence dragSource_getSupportedServiceNames() @end -DragSource::DragSource( const Reference& context): +DragSource::DragSource(): WeakComponentImplHelper3(m_aMutex), - mXComponentContext(context), mView(NULL), mLastMouseEventBeforeStartDrag(nil), m_MouseButton(0) { - g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt); } @@ -176,7 +171,6 @@ DragSource::~DragSource() { [(id )mView unregisterMouseEventListener: mDragSourceHelper]; [mDragSourceHelper release]; - g_moduleCount.modCnt.release( &g_moduleCount.modCnt ); } @@ -254,7 +248,7 @@ void SAL_CALL DragSource::startDrag(const DragGestureEvent& trigger, m_MouseButton= mMouseEvent.Buttons; mXDragSrcListener = listener; mXCurrentContext = static_cast(new DragSourceContext(this)); - auto_ptr clipb(new AquaClipboard(this->mXComponentContext, NULL, false)); + auto_ptr clipb(new AquaClipboard(NULL, false)); g_XTransferable = transferable; clipb->setContents(g_XTransferable, Reference()); mDragSourceActions = sourceActions; diff --git a/dtrans/source/aqua/DragSource.hxx b/vcl/aqua/source/dtrans/DragSource.hxx similarity index 96% rename from dtrans/source/aqua/DragSource.hxx rename to vcl/aqua/source/dtrans/DragSource.hxx index 252b63fee41d..1268a466adf3 100644 --- a/dtrans/source/aqua/DragSource.hxx +++ b/vcl/aqua/source/dtrans/DragSource.hxx @@ -89,7 +89,7 @@ class DragSource : public ::cppu::BaseMutex, private ::boost::noncopyable { public: - DragSource(const com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext>& context); + DragSource(); virtual ~DragSource(); // XInitialization @@ -119,8 +119,6 @@ public: virtual unsigned int getSupportedDragOperations(bool isLocal) const; public: - com::sun::star::uno::Reference mXComponentContext; - // The context notifies the XDragSourceListeners com::sun::star::uno::Reference< com::sun::star::datatransfer::dnd::XDragSourceContext > mXCurrentContext; diff --git a/dtrans/source/aqua/DragSourceContext.cxx b/vcl/aqua/source/dtrans/DragSourceContext.cxx similarity index 91% rename from dtrans/source/aqua/DragSourceContext.cxx rename to vcl/aqua/source/dtrans/DragSourceContext.cxx index f0496a297052..cd657a6147e9 100644 --- a/dtrans/source/aqua/DragSourceContext.cxx +++ b/vcl/aqua/source/dtrans/DragSourceContext.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include @@ -43,20 +43,14 @@ using namespace com::sun::star::datatransfer::dnd::DNDConstants; using namespace com::sun::star::uno; using namespace cppu; - -extern rtl_StandardModuleCount g_moduleCount; - - DragSourceContext::DragSourceContext( DragSource* pSource) : WeakComponentImplHelper1(m_aMutex), m_pDragSource( pSource) { - g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt ); } DragSourceContext::~DragSourceContext() { - g_moduleCount.modCnt.release( &g_moduleCount.modCnt ); } sal_Int32 SAL_CALL DragSourceContext::getCurrentCursor( ) diff --git a/dtrans/source/aqua/DragSourceContext.hxx b/vcl/aqua/source/dtrans/DragSourceContext.hxx similarity index 100% rename from dtrans/source/aqua/DragSourceContext.hxx rename to vcl/aqua/source/dtrans/DragSourceContext.hxx diff --git a/dtrans/source/aqua/DropTarget.cxx b/vcl/aqua/source/dtrans/DropTarget.cxx similarity index 96% rename from dtrans/source/aqua/DropTarget.cxx rename to vcl/aqua/source/dtrans/DropTarget.cxx index bb45742732e7..88ffc1e51d02 100644 --- a/dtrans/source/aqua/DropTarget.cxx +++ b/vcl/aqua/source/dtrans/DropTarget.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include #include #include @@ -65,8 +65,6 @@ using namespace com::sun::star::lang; using namespace com::sun::star::uno; using namespace comphelper; -extern rtl_StandardModuleCount g_moduleCount; - OUString dropTarget_getImplementationName() { return OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.datatransfer.dnd.OleDropTarget_V1")); @@ -152,17 +150,15 @@ namespace /* private */ @end -DropTarget::DropTarget( const Reference& context) : +DropTarget::DropTarget() : WeakComponentImplHelper5(m_aMutex), - mXComponentContext(context), mDropTargetHelper(nil), mbActive(false), mDragSourceSupportedActions(DNDConstants::ACTION_NONE), mSelectedDropAction(DNDConstants::ACTION_NONE), mDefaultActions(DNDConstants::ACTION_COPY_OR_MOVE | DNDConstants::ACTION_LINK | DNDConstants::ACTION_DEFAULT) { - g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt ); - mDataFlavorMapper = DataFlavorMapperPtr_t(new DataFlavorMapper(mXComponentContext)); + mDataFlavorMapper = DataFlavorMapperPtr_t(new DataFlavorMapper()); } @@ -170,7 +166,6 @@ DropTarget::~DropTarget() { [(id )mView unregisterDraggingDestinationHandler:mDropTargetHelper]; [mDropTargetHelper release]; - g_moduleCount.modCnt.release( &g_moduleCount.modCnt ); } @@ -245,11 +240,11 @@ NSDragOperation DropTarget::draggingEntered(id sender) CocoaToVCL(dragLocation, bounds); - sal_Int32 posX = dragLocation.x; - sal_Int32 posY = dragLocation.y; + sal_Int32 posX = static_cast(dragLocation.x); + sal_Int32 posY = static_cast(dragLocation.y); NSPasteboard* dragPboard = [sender draggingPasteboard]; - mXCurrentDragClipboard = new AquaClipboard(mXComponentContext, dragPboard, false); + mXCurrentDragClipboard = new AquaClipboard(dragPboard, false); Reference xTransferable = DragSource::g_XTransferable.is() ? DragSource::g_XTransferable : mXCurrentDragClipboard->getContents(); @@ -284,8 +279,8 @@ NSDragOperation DropTarget::draggingUpdated(id sender) CocoaToVCL(dragLocation, bounds); - sal_Int32 posX = dragLocation.x; - sal_Int32 posY = dragLocation.y; + sal_Int32 posX = static_cast(dragLocation.x); + sal_Int32 posY = static_cast(dragLocation.y); DropTargetDragEvent dtde(static_cast(this), 0, @@ -297,6 +292,9 @@ NSDragOperation DropTarget::draggingUpdated(id sender) fire_dragOver(dtde); + // drag over callbacks likely have rendered something + [mView setNeedsDisplay: TRUE]; + dragOp = OfficeToSystemDragActions(mSelectedDropAction); //NSLog(@"Drag update: Source actions: %x proposed action %x selected action %x", mDragSourceSupportedActions, currentAction, mSelectedDropAction); @@ -350,8 +348,8 @@ MacOSBOOL DropTarget::performDragOperation(id sender) CocoaToVCL(dragLocation, bounds); - sal_Int32 posX = dragLocation.x; - sal_Int32 posY = dragLocation.y; + sal_Int32 posX = static_cast(dragLocation.x); + sal_Int32 posY = static_cast(dragLocation.y); DropTargetDropEvent dtde(static_cast(this), 0, diff --git a/dtrans/source/aqua/DropTarget.hxx b/vcl/aqua/source/dtrans/DropTarget.hxx similarity index 97% rename from dtrans/source/aqua/DropTarget.hxx rename to vcl/aqua/source/dtrans/DropTarget.hxx index f65de4ff164e..91b50c041916 100644 --- a/dtrans/source/aqua/DropTarget.hxx +++ b/vcl/aqua/source/dtrans/DropTarget.hxx @@ -95,7 +95,7 @@ class DropTarget: public cppu::BaseMutex, private boost::noncopyable { public: - DropTarget(const com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext >& context); + DropTarget(); virtual ~DropTarget(); // Overrides WeakComponentImplHelper::disposing which is called by @@ -157,7 +157,6 @@ private: void fire_dropActionChanged(const com::sun::star::datatransfer::dnd::DropTargetDragEvent& dtde); private: - com::sun::star::uno::Reference< com::sun::star::uno::XComponentContext > mXComponentContext; com::sun::star::uno::Reference< com::sun::star::datatransfer::dnd::XDropTargetDragContext > mXCurrentDragContext; com::sun::star::uno::Reference< com::sun::star::datatransfer::dnd::XDropTargetDropContext > mXCurrentDropContext; com::sun::star::uno::Reference< com::sun::star::datatransfer::clipboard::XClipboard > mXCurrentDragClipboard; diff --git a/dtrans/source/aqua/HtmlFmtFlt.cxx b/vcl/aqua/source/dtrans/HtmlFmtFlt.cxx similarity index 100% rename from dtrans/source/aqua/HtmlFmtFlt.cxx rename to vcl/aqua/source/dtrans/HtmlFmtFlt.cxx diff --git a/dtrans/source/aqua/HtmlFmtFlt.hxx b/vcl/aqua/source/dtrans/HtmlFmtFlt.hxx similarity index 100% rename from dtrans/source/aqua/HtmlFmtFlt.hxx rename to vcl/aqua/source/dtrans/HtmlFmtFlt.hxx diff --git a/dtrans/source/aqua/OSXTransferable.cxx b/vcl/aqua/source/dtrans/OSXTransferable.cxx similarity index 96% rename from dtrans/source/aqua/OSXTransferable.cxx rename to vcl/aqua/source/dtrans/OSXTransferable.cxx index a4f5b7807935..a893f09d89cc 100644 --- a/dtrans/source/aqua/OSXTransferable.cxx +++ b/vcl/aqua/source/dtrans/OSXTransferable.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include #ifndef _TRANSFERABLE_HXX_ @@ -63,11 +63,9 @@ namespace // private } // namespace private -OSXTransferable::OSXTransferable(const Reference< XComponentContext >& context, - const Reference rXMimeCntFactory, +OSXTransferable::OSXTransferable(const Reference rXMimeCntFactory, DataFlavorMapperPtr_t pDataFlavorMapper, NSPasteboard* pasteboard) : - mXComponentContext(context), mrXMimeCntFactory(rXMimeCntFactory), mDataFlavorMapper(pDataFlavorMapper), mPasteboard(pasteboard) diff --git a/dtrans/source/aqua/OSXTransferable.hxx b/vcl/aqua/source/dtrans/OSXTransferable.hxx similarity index 91% rename from dtrans/source/aqua/OSXTransferable.hxx rename to vcl/aqua/source/dtrans/OSXTransferable.hxx index d231611f0aaf..9b371523c440 100644 --- a/dtrans/source/aqua/OSXTransferable.hxx +++ b/vcl/aqua/source/dtrans/OSXTransferable.hxx @@ -58,8 +58,7 @@ class OSXTransferable : public ::cppu::WeakImplHelper1 ByteSequence_t; - explicit OSXTransferable(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& context, - ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XMimeContentTypeFactory> rXMimeCntFactory, + explicit OSXTransferable(com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XMimeContentTypeFactory> rXMimeCntFactory, DataFlavorMapperPtr_t pDataFlavorMapper, NSPasteboard* pasteboard); @@ -96,7 +95,6 @@ public: private: com::sun::star::uno::Sequence< com::sun::star::datatransfer::DataFlavor > mFlavorList; - const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > mXComponentContext; ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XMimeContentTypeFactory> mrXMimeCntFactory; DataFlavorMapperPtr_t mDataFlavorMapper; NSPasteboard* mPasteboard; diff --git a/dtrans/source/aqua/PictToBmpFlt.cxx b/vcl/aqua/source/dtrans/PictToBmpFlt.cxx similarity index 100% rename from dtrans/source/aqua/PictToBmpFlt.cxx rename to vcl/aqua/source/dtrans/PictToBmpFlt.cxx diff --git a/dtrans/source/aqua/PictToBmpFlt.hxx b/vcl/aqua/source/dtrans/PictToBmpFlt.hxx similarity index 100% rename from dtrans/source/aqua/PictToBmpFlt.hxx rename to vcl/aqua/source/dtrans/PictToBmpFlt.hxx diff --git a/dtrans/source/aqua/aqua_clipboard.cxx b/vcl/aqua/source/dtrans/aqua_clipboard.cxx similarity index 93% rename from dtrans/source/aqua/aqua_clipboard.cxx rename to vcl/aqua/source/dtrans/aqua_clipboard.cxx index d0b821099ea0..27bf308dce9b 100644 --- a/dtrans/source/aqua/aqua_clipboard.cxx +++ b/vcl/aqua/source/dtrans/aqua_clipboard.cxx @@ -29,15 +29,15 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include "aqua_clipboard.hxx" #include "DataFlavorMapping.hxx" #include "OSXTransferable.hxx" -#ifndef COMPHELPER_MAKESEQUENCE_HXX_INCLUDED +#include "vcl/unohelp.hxx" + #include "comphelper/makesequence.hxx" -#endif #include @@ -95,15 +95,14 @@ Sequence clipboard_getSupportedServiceNames() } -AquaClipboard::AquaClipboard(const Reference< XComponentContext >& context, NSPasteboard* pasteboard, bool bUseSystemPasteboard) : +AquaClipboard::AquaClipboard(NSPasteboard* pasteboard, bool bUseSystemPasteboard) : WeakComponentImplHelper4(m_aMutex), - mXComponentContext(context), mIsSystemPasteboard(bUseSystemPasteboard) { - Reference mrServiceMgr = mXComponentContext->getServiceManager(); + Reference mrServiceMgr = vcl::unohelper::GetMultiServiceFactory(); - mrXMimeCntFactory = Reference(mrServiceMgr->createInstanceWithContext( - OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.datatransfer.MimeContentTypeFactory")), mXComponentContext), UNO_QUERY); + mrXMimeCntFactory = Reference(mrServiceMgr->createInstance( + OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.datatransfer.MimeContentTypeFactory"))), UNO_QUERY); if (!mrXMimeCntFactory.is()) { @@ -112,7 +111,7 @@ AquaClipboard::AquaClipboard(const Reference< XComponentContext >& context, NSPa static_cast(this)); } - mpDataFlavorMapper = DataFlavorMapperPtr_t(new DataFlavorMapper(mXComponentContext)); + mpDataFlavorMapper = DataFlavorMapperPtr_t(new DataFlavorMapper()); if (pasteboard != NULL) { @@ -183,8 +182,7 @@ Reference SAL_CALL AquaClipboard::getContents() throw(RuntimeExce return mXClipboardContent; } - return Reference(new OSXTransferable(mXComponentContext, - mrXMimeCntFactory, + return Reference(new OSXTransferable(mrXMimeCntFactory, mpDataFlavorMapper, mPasteboard)); } @@ -323,8 +321,13 @@ void AquaClipboard::fireLostClipboardOwnershipEvent(Reference o void AquaClipboard::provideDataForType(NSPasteboard* sender, NSString* type) { DataProviderPtr_t dp = mpDataFlavorMapper->getDataProvider(type, mXClipboardContent); - NSData* pBoardData = (NSData*)dp->getSystemData(); - [sender setData: pBoardData forType: type]; + NSData* pBoardData = NULL; + + if (dp.get() != NULL) + { + pBoardData = (NSData*)dp->getSystemData(); + [sender setData: pBoardData forType: type]; + } } diff --git a/dtrans/source/aqua/aqua_clipboard.hxx b/vcl/aqua/source/dtrans/aqua_clipboard.hxx similarity index 96% rename from dtrans/source/aqua/aqua_clipboard.hxx rename to vcl/aqua/source/dtrans/aqua_clipboard.hxx index 3de02f5dcdcd..90bb404fdb36 100644 --- a/dtrans/source/aqua/aqua_clipboard.hxx +++ b/vcl/aqua/source/dtrans/aqua_clipboard.hxx @@ -92,8 +92,7 @@ public: system clipboard will be created (bUseSystemClipboard == true) or if the DragPasteboard if bUseSystemClipboard == false */ - AquaClipboard(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& context, - NSPasteboard* pasteboard = NULL, + AquaClipboard(NSPasteboard* pasteboard = NULL, bool bUseSystemClipboard = true); ~AquaClipboard(); @@ -171,7 +170,6 @@ private: void fireClipboardChangedEvent(); private: - const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > mXComponentContext; ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XMimeContentTypeFactory > mrXMimeCntFactory; ::std::list< ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboardListener > > mClipboardListeners; ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > mXClipboardContent; diff --git a/dtrans/source/aqua/aqua_service.cxx b/vcl/aqua/source/dtrans/aqua_service.cxx similarity index 99% rename from dtrans/source/aqua/aqua_service.cxx rename to vcl/aqua/source/dtrans/aqua_service.cxx index 39453683a2cc..aeaf697670ef 100644 --- a/dtrans/source/aqua/aqua_service.cxx +++ b/vcl/aqua/source/dtrans/aqua_service.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include "aqua_clipboard.hxx" #include #include diff --git a/dtrans/source/aqua/makefile.mk b/vcl/aqua/source/dtrans/makefile.mk similarity index 75% rename from dtrans/source/aqua/makefile.mk rename to vcl/aqua/source/dtrans/makefile.mk index e0b4eecf6db4..e802c98abf64 100644 --- a/dtrans/source/aqua/makefile.mk +++ b/vcl/aqua/source/dtrans/makefile.mk @@ -29,17 +29,11 @@ # #************************************************************************* -PRJ=..$/.. +PRJ=..$/..$/.. -PRJNAME=dtrans +PRJNAME=vcl TARGET=dtransaqua ENABLE_EXCEPTIONS=TRUE -LIBTARGET=NO -.IF "$(OS)"=="MACOSX" -.IF "$(GUIBASE)"=="aqua" -COMP1TYPELIST=$(TARGET) -.ENDIF # "$(GUIBASE)"=="aqua" -.ENDIF # "$(OS)"=="MACOSX" # --- Settings ----------------------------------------------------- @@ -70,35 +64,7 @@ SLOFILES= \ $(SLO)$/DragSourceContext.obj \ $(SLO)$/DragActionConversion.obj -SHL1TARGET=$(TARGET)$(DLLPOSTFIX) - -SHL1STDLIBS= \ - $(SALLIB) \ - $(CPPULIB) \ - $(CPPUHELPERLIB) \ - -framework Carbon \ - -framework QuickTime \ - -framework Cocoa - -SHL1DEPN= -SHL1IMPLIB= i$(SHL1TARGET) - -SHL1OBJS= $(SLOFILES) - -#APP1NOSAL=TRUE -#APP1TARGET=test_aquacb -#APP1OBJS=$(SLO)$/test_aquacb.obj -#APP1STDLIBS= -#$(SALLIB) -#$(CPPULIB) -#$(CPPUHELPERLIB) -#-framework Cocoa - # --- Targets ------------------------------------------------------ - -ALL : ALLTAR - +cd $(LB) && $(REGCOMP) -register -r ../bin/$(COMP1TYPELIST).rdb -c $(SHL1TARGET) - .INCLUDE : target.mk .ENDIF # "$(GUIBASE)"!="aqua" diff --git a/vcl/aqua/source/dtrans/service_entry.cxx b/vcl/aqua/source/dtrans/service_entry.cxx new file mode 100644 index 000000000000..38784ecb53dd --- /dev/null +++ b/vcl/aqua/source/dtrans/service_entry.cxx @@ -0,0 +1,67 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: service_entry.cxx,v $ + * $Revision: 1.3 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#include "saldata.hxx" +#include "salinst.h" +#include "DragSource.hxx" +#include "DropTarget.hxx" +#include "aqua_clipboard.hxx" +#include "osl/diagnose.h" + +using namespace ::osl; +using namespace ::rtl; +using namespace ::com::sun::star::uno; +using namespace ::cppu; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::datatransfer::clipboard; + + +Reference< XInterface > AquaSalInstance::CreateClipboard( const Sequence< Any >& i_rArguments ) +{ + SalData* pSalData = GetSalData(); + if( ! pSalData->mxClipboard.is() ) + pSalData->mxClipboard = Reference(static_cast< XClipboard* >(new AquaClipboard()), UNO_QUERY); + return pSalData->mxClipboard; +} + + +Reference AquaSalInstance::CreateDragSource() +{ + return Reference(static_cast< XInitialization* >(new DragSource()), UNO_QUERY); +} + +Reference AquaSalInstance::CreateDropTarget() +{ + return Reference(static_cast< XInitialization* >(new DropTarget()), UNO_QUERY); +} + diff --git a/dtrans/source/aqua/test_aquacb.cxx b/vcl/aqua/source/dtrans/test_aquacb.cxx similarity index 99% rename from dtrans/source/aqua/test_aquacb.cxx rename to vcl/aqua/source/dtrans/test_aquacb.cxx index bcb9dcd164df..db60712ce852 100644 --- a/dtrans/source/aqua/test_aquacb.cxx +++ b/vcl/aqua/source/dtrans/test_aquacb.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include "aqua_clipboard.hxx" #include diff --git a/vcl/aqua/source/gdi/aquaprintview.mm b/vcl/aqua/source/gdi/aquaprintview.mm index 6099fbaed741..ba139da5f5a4 100755 --- a/vcl/aqua/source/gdi/aquaprintview.mm +++ b/vcl/aqua/source/gdi/aquaprintview.mm @@ -58,6 +58,9 @@ { NSSize aPaperSize = [mpInfoPrinter->getPrintInfo() paperSize]; int nWidth = (int)aPaperSize.width; + // #i101108# sanity check + if( nWidth < 1 ) + nWidth = 1; NSRect aRect = { { page % nWidth, page / nWidth }, aPaperSize }; return aRect; } @@ -71,7 +74,7 @@ -(void)drawRect: (NSRect)rect { NSPoint aPoint = [self locationOfPrintRect: rect]; - mpInfoPrinter->setStartPageOffset( rect.origin.x, rect.origin.y ); + mpInfoPrinter->setStartPageOffset( static_cast(rect.origin.x), static_cast(rect.origin.y) ); NSSize aPaperSize = [mpInfoPrinter->getPrintInfo() paperSize]; int nPage = (int)(aPaperSize.width * rect.origin.y + rect.origin.x); diff --git a/vcl/aqua/source/gdi/salatslayout.cxx b/vcl/aqua/source/gdi/salatslayout.cxx index 98700feba39d..1387a46c6345 100755 --- a/vcl/aqua/source/gdi/salatslayout.cxx +++ b/vcl/aqua/source/gdi/salatslayout.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: salatslayout.cxx,v $ - * $Revision: 1.12 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -73,12 +70,13 @@ private: // to prevent ATS overflowing the Fixed16.16 values // ATS font requests get size limited by downscaling huge fonts // in these cases the font scale becomes something bigger than 1.0 - float mfFontScale; + float mfFontScale; private: bool InitGIA( ImplLayoutArgs* pArgs = NULL ) const; bool GetIdealX() const; bool GetDeltaY() const; + void InvalidateMeasurements(); int Fixed2Vcl( Fixed ) const; // convert ATSU-Fixed units to VCL units int AtsuPix2Vcl( int ) const; // convert ATSU-Pixel units to VCL units @@ -305,17 +303,15 @@ void ATSLayout::AdjustLayout( ImplLayoutArgs& rArgs ) nPixelWidth = rArgs.mpDXArray[ mnCharCount - 1 ]; // workaround for ATSUI not using trailing spaces for justification - mnTrailingSpaceWidth = 0; int i = mnCharCount; - while( (--i > 0) && IsSpacingGlyph( rArgs.mpStr[mnMinCharPos+i]|GF_ISCHAR ) ) - mnTrailingSpaceWidth += rArgs.mpDXArray[i] - rArgs.mpDXArray[i-1]; - if( i <= 0 ) + while( (--i >= 0) && IsSpacingGlyph( rArgs.mpStr[mnMinCharPos+i]|GF_ISCHAR ) ) {} + if( i < 0 ) // nothing to do if the text is all spaces return; // #i91685# trailing letters are left aligned (right aligned for RTL) - mnTrailingSpaceWidth += rArgs.mpDXArray[i]; + mnTrailingSpaceWidth = rArgs.mpDXArray[ mnCharCount-1 ]; if( i > 0 ) - mnTrailingSpaceWidth -= rArgs.mpDXArray[i-1]; - InitGIA(); // ensure valid mpCharWidths[] + mnTrailingSpaceWidth -= rArgs.mpDXArray[ i-1 ]; + InitGIA(); // ensure valid mpCharWidths[], TODO: use GetIdealX() instead? mnTrailingSpaceWidth -= Fixed2Vcl( mpCharWidths[i] ); // ignore trailing space for calculating the available width nOrigWidth -= mnTrailingSpaceWidth; @@ -329,11 +325,15 @@ void ATSLayout::AdjustLayout( ImplLayoutArgs& rArgs ) if( !nPixelWidth ) return; - // HACK: justification requests which change the width by just one pixel are probably + // HACK: justification requests which change the width by just one pixel were probably // #i86038# introduced by lossy conversions between integer based coordinate system + // => ignoring such requests has many more benefits than eventual drawbacks if( (nOrigWidth >= nPixelWidth-1) && (nOrigWidth <= nPixelWidth+1) ) return; + // changing the layout will make all previous measurements invalid + InvalidateMeasurements(); + ATSUAttributeTag nTags[3]; ATSUAttributeValuePtr nVals[3]; ByteCount nBytes[3]; @@ -357,7 +357,7 @@ void ATSLayout::AdjustLayout( ImplLayoutArgs& rArgs ) if( eStatus != noErr ) return; - // check result of the justied layout + // update the measurements of the justified layout to match the justification request if( rArgs.mpDXArray ) InitGIA( &rArgs ); } @@ -431,8 +431,8 @@ void ATSLayout::DrawText( SalGraphics& rGraphics ) const if( rAquaGraphics.mnATSUIRotation != 0 ) { const double fRadians = rAquaGraphics.mnATSUIRotation * (M_PI/0xB40000); - nXOfsFixed = +rSubPortion.mnXOffset * cos( fRadians ); - nYOfsFixed = +rSubPortion.mnXOffset * sin( fRadians ); + nXOfsFixed = static_cast(static_cast(+rSubPortion.mnXOffset) * cos( fRadians )); + nYOfsFixed = static_cast(static_cast(+rSubPortion.mnXOffset) * sin( fRadians )); } // draw sub-portions @@ -745,6 +745,8 @@ int ATSLayout::GetTextBreak( long nMaxWidth, long nCharExtra, int nFactor ) cons // get a quick overview on what could fit const long nPixelWidth = (nMaxWidth - (nCharExtra * mnCharCount)) / nFactor; + if( nPixelWidth <= 0 ) + return mnMinCharPos; // check assumptions DBG_ASSERT( !mnTrailingSpaceWidth, "ATSLayout::GetTextBreak() with nTSW!=0" ); @@ -1072,6 +1074,23 @@ bool ATSLayout::GetDeltaY() const return true; } +// ----------------------------------------------------------------------- + +#define DELETEAZ( X ) { delete[] X; X = NULL; } + +void ATSLayout::InvalidateMeasurements() +{ + mnGlyphCount = -1; + DELETEAZ( mpGlyphIds ); + DELETEAZ( mpCharWidths ); + DELETEAZ( mpChars2Glyphs ); + DELETEAZ( mpGlyphs2Chars ); + DELETEAZ( mpGlyphRTLFlags ); + DELETEAZ( mpGlyphAdvances ); + DELETEAZ( mpGlyphOrigAdvs ); + DELETEAZ( mpDeltaY ); +} + // ======================================================================= #if 0 diff --git a/vcl/aqua/source/gdi/salatsuifontutils.cxx b/vcl/aqua/source/gdi/salatsuifontutils.cxx index 595b7d276a2a..23755ae2f571 100644 --- a/vcl/aqua/source/gdi/salatsuifontutils.cxx +++ b/vcl/aqua/source/gdi/salatsuifontutils.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: salatsuifontutils.cxx,v $ - * $Revision: 1.13.138.6 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -210,12 +207,15 @@ static bool GetDevFontAttributes( ATSUFontID nFontID, ImplDevFontAttributes& rDF rDFA.meItalic = ITALIC_NONE; rDFA.mbSymbolFlag = false; - // get the embeddable + subsettable status - // TODO: remove test after PS-OpenType subsetting is implemented + // ignore bitmap fonts ATSFontRef rATSFontRef = FMGetATSFontRefFromFont( nFontID ); - ByteCount nGlyfLen = 0; - OSStatus rc = ATSFontGetTable( rATSFontRef, 0x676c7966/*glyf*/, 0, 0, NULL, &nGlyfLen); - rDFA.mbSubsettable = ((rc == noErr) && (nGlyfLen > 0)); + ByteCount nHeadLen = 0; + OSStatus rc = ATSFontGetTable( rATSFontRef, 0x68656164/*head*/, 0, 0, NULL, &nHeadLen ); + if( (rc != noErr) || (nHeadLen <= 0) ) + return false; + + // all scalable fonts on this platform are subsettable + rDFA.mbSubsettable = true; rDFA.mbEmbeddable = false; // TODO: these members are needed only for our X11 platform targets rDFA.meAntiAlias = ANTIALIAS_DONTKNOW; @@ -269,7 +269,7 @@ static bool GetDevFontAttributes( ATSUFontID nFontID, ImplDevFontAttributes& rDF case 0x30A: nNameValue += 0; // Win-UCS-4 eEncoding = RTL_TEXTENCODING_UCS4; break; - case 0x100: nNameValue += 21; // Mac Roman + case 0x100: nNameValue += 21; // Mac Roman eEncoding = RTL_TEXTENCODING_APPLE_ROMAN; break; case 0x300: nNameValue = 0; // Win Symbol encoded name! diff --git a/vcl/aqua/source/gdi/salbmp.cxx b/vcl/aqua/source/gdi/salbmp.cxx index 42f29d677b52..8b7b23a681a0 100644 --- a/vcl/aqua/source/gdi/salbmp.cxx +++ b/vcl/aqua/source/gdi/salbmp.cxx @@ -214,16 +214,26 @@ bool AquaSalBitmap::CreateContext() { // convert user data to 32 bit nContextBytesPerRow = mnWidth << 2; - maContextBuffer.reset( new sal_uInt8[ mnHeight * nContextBytesPerRow ] ); + try + { + maContextBuffer.reset( new sal_uInt8[ mnHeight * nContextBytesPerRow ] ); - if( !bSkipConversion ) - ConvertBitmapData( mnWidth, mnHeight, - 32, nContextBytesPerRow, maPalette, maContextBuffer.get(), - mnBits, mnBytesPerRow, maPalette, maUserBuffer.get() ); + if( !bSkipConversion ) + ConvertBitmapData( mnWidth, mnHeight, + 32, nContextBytesPerRow, maPalette, maContextBuffer.get(), + mnBits, mnBytesPerRow, maPalette, maUserBuffer.get() ); + } + catch( std::bad_alloc ) + { + mxGraphicContext = 0; + } } - mxGraphicContext = ::CGBitmapContextCreate( maContextBuffer.get(), mnWidth, mnHeight, - bitsPerComponent, nContextBytesPerRow, aCGColorSpace, aCGBmpInfo ); + if( maContextBuffer.get() ) + { + mxGraphicContext = ::CGBitmapContextCreate( maContextBuffer.get(), mnWidth, mnHeight, + bitsPerComponent, nContextBytesPerRow, aCGColorSpace, aCGBmpInfo ); + } if( !mxGraphicContext ) maContextBuffer.reset(); diff --git a/vcl/aqua/source/gdi/salgdi.cxx b/vcl/aqua/source/gdi/salgdi.cxx index 3ee54afe2fba..1c9bdda3fbdb 100644 --- a/vcl/aqua/source/gdi/salgdi.cxx +++ b/vcl/aqua/source/gdi/salgdi.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: salgdi.cxx,v $ - * $Revision: 1.81.14.1 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -40,6 +37,7 @@ #include "salatsuifontutils.hxx" #include "vcl/impfont.hxx" +#include "vcl/fontsubset.hxx" #include "vcl/sysdata.hxx" #include "vcl/sallayout.hxx" #include "vcl/svapp.hxx" @@ -153,7 +151,7 @@ ImplFontCharMap* ImplMacFontData::GetImplFontCharMap() const if( !ParseCMAP( &aBuffer[0], nRawLength, aCmapResult ) ) return mpCharMap; - mpCharMap = new ImplFontCharMap( aCmapResult.mnPairCount, aCmapResult.mpPairCodes, aCmapResult.mpStartGlyphs ); + mpCharMap = new ImplFontCharMap( aCmapResult ); return mpCharMap; } @@ -175,8 +173,7 @@ void ImplMacFontData::ReadOs2Table( void ) const return; // allocate a buffer for the OS/2 raw data - ByteVector aBuffer; - aBuffer.resize( nBufSize ); + ByteVector aBuffer( nBufSize ); // get the OS/2 raw data ByteCount nRawLength = 0; @@ -215,8 +212,7 @@ void ImplMacFontData::ReadMacCmapEncoding( void ) const if( eStatus != noErr ) return; - ByteVector aBuffer; - aBuffer.resize( nBufSize ); + ByteVector aBuffer( nBufSize ); ByteCount nRawLength = 0; eStatus = ATSFontGetTable( rFont, GetTag("cmap"), 0, nBufSize, (void*)&aBuffer[0], &nRawLength ); @@ -408,6 +404,16 @@ void AquaSalGraphics::initResolution( NSWindow* pWin ) DBG_ERROR( "no screen found" ); } + // #i107076# maintaining size-WYSIWYG-ness causes many problems for + // low-DPI, high-DPI or for mis-reporting devices + // => it is better to limit the calculation result then + static const int nMinDPI = 72; + if( (mnRealDPIX < nMinDPI) || (mnRealDPIY < nMinDPI) ) + mnRealDPIX = mnRealDPIY = nMinDPI; + static const int nMaxDPI = 200; + if( (mnRealDPIX > nMaxDPI) || (mnRealDPIY > nMaxDPI) ) + mnRealDPIX = mnRealDPIY = nMaxDPI; + // for OSX any anisotropy reported for the display resolution is best ignored (e.g. TripleHead2Go) mnRealDPIX = mnRealDPIY = (mnRealDPIX + mnRealDPIY + 1) / 2; @@ -935,27 +941,29 @@ bool AquaSalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPol AddPolygonToPath( xPath, rPolygon, true, !getAntiAliasB2DDraw(), IsPenVisible() ); } - // use the path to prepare the graphics context - CGContextSaveGState( mrContext ); - CGContextBeginPath( mrContext ); - CGContextAddPath( mrContext, xPath ); const CGRect aRefreshRect = CGPathGetBoundingBox( xPath ); - CGPathRelease( xPath ); - #ifndef NO_I97317_WORKAROUND // #i97317# workaround for Quartz having problems with drawing small polygons - if( (aRefreshRect.size.width <= 0.125) && (aRefreshRect.size.height <= 0.125) ) - return true; + if( ! ((aRefreshRect.size.width <= 0.125) && (aRefreshRect.size.height <= 0.125)) ) #endif + { + // use the path to prepare the graphics context + CGContextSaveGState( mrContext ); + CGContextBeginPath( mrContext ); + CGContextAddPath( mrContext, xPath ); - // draw path with antialiased polygon - CGContextSetShouldAntialias( mrContext, true ); - CGContextSetAlpha( mrContext, 1.0 - fTransparency ); - CGContextDrawPath( mrContext, kCGPathEOFillStroke ); - CGContextRestoreGState( mrContext ); + // draw path with antialiased polygon + CGContextSetShouldAntialias( mrContext, true ); + CGContextSetAlpha( mrContext, 1.0 - fTransparency ); + CGContextDrawPath( mrContext, kCGPathEOFillStroke ); + CGContextRestoreGState( mrContext ); + + // mark modified rectangle as updated + RefreshRect( aRefreshRect ); + } + + CGPathRelease( xPath ); - // mark modified rectangle as updated - RefreshRect( aRefreshRect ); return true; } @@ -970,10 +978,17 @@ bool AquaSalGraphics::drawPolyLine( const ::basegfx::B2DPolygon& rPolyLine, if( nPointCount <= 0 ) return true; - // reject strange requests + // reject requests that cannot be handled yet if( rLineWidths.getX() != rLineWidths.getY() ) return false; + // #i101491# Aqua does not support B2DLINEJOIN_NONE; return false to use + // the fallback (own geometry preparation) + // #i104886# linejoin-mode and thus the above only applies to "fat" lines + if( (basegfx::B2DLINEJOIN_NONE == eLineJoin) + && (rLineWidths.getX() > 1.3) ) + return false; + // setup line attributes CGLineJoin aCGLineJoin = kCGLineJoinMiter; switch( eLineJoin ) { @@ -988,27 +1003,28 @@ bool AquaSalGraphics::drawPolyLine( const ::basegfx::B2DPolygon& rPolyLine, CGMutablePathRef xPath = CGPathCreateMutable(); AddPolygonToPath( xPath, rPolyLine, rPolyLine.isClosed(), !getAntiAliasB2DDraw(), true ); - // use the path to prepare the graphics context - CGContextSaveGState( mrContext ); - CGContextAddPath( mrContext, xPath ); const CGRect aRefreshRect = CGPathGetBoundingBox( xPath ); - CGPathRelease( xPath ); - #ifndef NO_I97317_WORKAROUND // #i97317# workaround for Quartz having problems with drawing small polygons - if( (aRefreshRect.size.width <= 0.125) && (aRefreshRect.size.height <= 0.125) ) - return true; + if( ! ((aRefreshRect.size.width <= 0.125) && (aRefreshRect.size.height <= 0.125)) ) #endif + { + // use the path to prepare the graphics context + CGContextSaveGState( mrContext ); + CGContextAddPath( mrContext, xPath ); + // draw path with antialiased line + CGContextSetShouldAntialias( mrContext, true ); + CGContextSetLineJoin( mrContext, aCGLineJoin ); + CGContextSetLineWidth( mrContext, rLineWidths.getX() ); + CGContextDrawPath( mrContext, kCGPathStroke ); + CGContextRestoreGState( mrContext ); - // draw path with antialiased line - CGContextSetShouldAntialias( mrContext, true ); - CGContextSetLineJoin( mrContext, aCGLineJoin ); - CGContextSetLineWidth( mrContext, rLineWidths.getX() ); - CGContextDrawPath( mrContext, kCGPathStroke ); - CGContextRestoreGState( mrContext ); + // mark modified rectangle as updated + RefreshRect( aRefreshRect ); + } + + CGPathRelease( xPath ); - // mark modified rectangle as updated - RefreshRect( aRefreshRect ); return true; } @@ -1985,15 +2001,30 @@ static void FakeDirEntry( FourCharCode eFCC, ByteCount nOfs, ByteCount nLen, } static bool GetRawFontData( const ImplFontData* pFontData, - ByteVector& rBuffer ) + ByteVector& rBuffer, bool* pJustCFF ) { const ImplMacFontData* pMacFont = static_cast(pFontData); const ATSUFontID nFontId = static_cast(pMacFont->GetFontId()); ATSFontRef rFont = FMGetATSFontRefFromFont( nFontId ); + ByteCount nCffLen = 0; + OSStatus eStatus = ATSFontGetTable( rFont, GetTag("CFF "), 0, 0, NULL, &nCffLen); + if( pJustCFF != NULL ) + { + *pJustCFF = (eStatus == noErr) && (nCffLen > 0); + if( *pJustCFF ) + { + rBuffer.resize( nCffLen ); + eStatus = ATSFontGetTable( rFont, GetTag("CFF "), 0, nCffLen, (void*)&rBuffer[0], &nCffLen); + if( (eStatus != noErr) || (nCffLen <= 0) ) + return false; + return true; + } + } + // get font table availability and size in bytes ByteCount nHeadLen = 0; - OSStatus eStatus = ATSFontGetTable( rFont, GetTag("head"), 0, 0, NULL, &nHeadLen); + eStatus = ATSFontGetTable( rFont, GetTag("head"), 0, 0, NULL, &nHeadLen); if( (eStatus != noErr) || (nHeadLen <= 0) ) return false; ByteCount nMaxpLen = 0; @@ -2004,14 +2035,6 @@ static bool GetRawFontData( const ImplFontData* pFontData, eStatus = ATSFontGetTable( rFont, GetTag("cmap"), 0, 0, NULL, &nCmapLen); if( (eStatus != noErr) || (nCmapLen <= 0) ) return false; - ByteCount nLocaLen = 0; - eStatus = ATSFontGetTable( rFont, GetTag("loca"), 0, 0, NULL, &nLocaLen); - if( (eStatus != noErr) || (nLocaLen <= 0) ) - return false; - ByteCount nGlyfLen = 0; - eStatus = ATSFontGetTable( rFont, GetTag("glyf"), 0, 0, NULL, &nGlyfLen); - if( (eStatus != noErr) || (nGlyfLen <= 0) ) - return false; ByteCount nNameLen = 0; eStatus = ATSFontGetTable( rFont, GetTag("name"), 0, 0, NULL, &nNameLen); if( (eStatus != noErr) || (nNameLen <= 0) ) @@ -2025,8 +2048,21 @@ static bool GetRawFontData( const ImplFontData* pFontData, if( (eStatus != noErr) || (nHmtxLen <= 0) ) return false; + // get the glyph outline tables + ByteCount nLocaLen = 0; + ByteCount nGlyfLen = 0; + if( (eStatus != noErr) || (nCffLen <= 0) ) + { + eStatus = ATSFontGetTable( rFont, GetTag("loca"), 0, 0, NULL, &nLocaLen); + if( (eStatus != noErr) || (nLocaLen <= 0) ) + return false; + eStatus = ATSFontGetTable( rFont, GetTag("glyf"), 0, 0, NULL, &nGlyfLen); + if( (eStatus != noErr) || (nGlyfLen <= 0) ) + return false; + } + ByteCount nPrepLen=0, nCvtLen=0, nFpgmLen=0; - if( 1 ) // TODO: reduce PDF size by making hint subsetting optional + if( nGlyfLen ) // TODO: reduce PDF size by making hint subsetting optional { eStatus = ATSFontGetTable( rFont, GetTag("prep"), 0, 0, NULL, &nPrepLen); eStatus = ATSFontGetTable( rFont, GetTag("cvt "), 0, 0, NULL, &nCvtLen); @@ -2034,11 +2070,15 @@ static bool GetRawFontData( const ImplFontData* pFontData, } // prepare a byte buffer for a fake font - int nTableCount = 8; - nTableCount += (nPrepLen>0) + (nCvtLen>0) + (nFpgmLen>0); + int nTableCount = 7; + nTableCount += (nPrepLen>0) + (nCvtLen>0) + (nFpgmLen>0) + (nGlyfLen>0); const ByteCount nFdirLen = 12 + 16*nTableCount; ByteCount nTotalLen = nFdirLen; - nTotalLen += nHeadLen + nMaxpLen + nNameLen + nCmapLen + nLocaLen + nGlyfLen; + nTotalLen += nHeadLen + nMaxpLen + nNameLen + nCmapLen; + if( nGlyfLen ) + nTotalLen += nLocaLen + nGlyfLen; + else + nTotalLen += nCffLen; nTotalLen += nHheaLen + nHmtxLen; nTotalLen += nPrepLen + nCvtLen + nFpgmLen; rBuffer.resize( nTotalLen ); @@ -2071,9 +2111,18 @@ static bool GetRawFontData( const ImplFontData* pFontData, FakeDirEntry( GetTag("fpgm"), nOfs, nFpgmLen, &rBuffer[0], pFakeEntry ); nOfs += nFpgmLen; } - eStatus = ATSFontGetTable( rFont, GetTag("glyf"), 0, nGlyfLen, (void*)&rBuffer[nOfs], &nGlyfLen); - FakeDirEntry( GetTag("glyf"), nOfs, nGlyfLen, &rBuffer[0], pFakeEntry ); - nOfs += nGlyfLen; + if( nCffLen ) { + eStatus = ATSFontGetTable( rFont, GetTag("CFF "), 0, nCffLen, (void*)&rBuffer[nOfs], &nCffLen); + FakeDirEntry( GetTag("CFF "), nOfs, nCffLen, &rBuffer[0], pFakeEntry ); + nOfs += nGlyfLen; + } else { + eStatus = ATSFontGetTable( rFont, GetTag("glyf"), 0, nGlyfLen, (void*)&rBuffer[nOfs], &nGlyfLen); + FakeDirEntry( GetTag("glyf"), nOfs, nGlyfLen, &rBuffer[0], pFakeEntry ); + nOfs += nGlyfLen; + eStatus = ATSFontGetTable( rFont, GetTag("loca"), 0, nLocaLen, (void*)&rBuffer[nOfs], &nLocaLen); + FakeDirEntry( GetTag("loca"), nOfs, nLocaLen, &rBuffer[0], pFakeEntry ); + nOfs += nLocaLen; + } eStatus = ATSFontGetTable( rFont, GetTag("head"), 0, nHeadLen, (void*)&rBuffer[nOfs], &nHeadLen); FakeDirEntry( GetTag("head"), nOfs, nHeadLen, &rBuffer[0], pFakeEntry ); nOfs += nHeadLen; @@ -2083,9 +2132,6 @@ static bool GetRawFontData( const ImplFontData* pFontData, eStatus = ATSFontGetTable( rFont, GetTag("hmtx"), 0, nHmtxLen, (void*)&rBuffer[nOfs], &nHmtxLen); FakeDirEntry( GetTag("hmtx"), nOfs, nHmtxLen, &rBuffer[0], pFakeEntry ); nOfs += nHmtxLen; - eStatus = ATSFontGetTable( rFont, GetTag("loca"), 0, nLocaLen, (void*)&rBuffer[nOfs], &nLocaLen); - FakeDirEntry( GetTag("loca"), nOfs, nLocaLen, &rBuffer[0], pFakeEntry ); - nOfs += nLocaLen; eStatus = ATSFontGetTable( rFont, GetTag("maxp"), 0, nMaxpLen, (void*)&rBuffer[nOfs], &nMaxpLen); FakeDirEntry( GetTag("maxp"), nOfs, nMaxpLen, &rBuffer[0], pFakeEntry ); nOfs += nMaxpLen; @@ -2107,10 +2153,38 @@ BOOL AquaSalGraphics::CreateFontSubset( const rtl::OUString& rToFile, const ImplFontData* pFontData, long* pGlyphIDs, sal_uInt8* pEncoding, sal_Int32* pGlyphWidths, int nGlyphCount, FontSubsetInfo& rInfo ) { + // TODO: move more of the functionality here into the generic subsetter code + + // prepare the requested file name for writing the font-subset file + rtl::OUString aSysPath; + if( osl_File_E_None != osl_getSystemPathFromFileURL( rToFile.pData, &aSysPath.pData ) ) + return FALSE; + const rtl_TextEncoding aThreadEncoding = osl_getThreadTextEncoding(); + const ByteString aToFile( rtl::OUStringToOString( aSysPath, aThreadEncoding ) ); + + // get the raw-bytes from the font to be subset ByteVector aBuffer; - if( !GetRawFontData( pFontData, aBuffer ) ) + bool bCffOnly = false; + if( !GetRawFontData( pFontData, aBuffer, &bCffOnly ) ) return sal_False; + // handle CFF-subsetting + if( bCffOnly ) + { + // provide the raw-CFF data to the subsetter + ByteCount nCffLen = aBuffer.size(); + rInfo.LoadFont( FontSubsetInfo::CFF_FONT, &aBuffer[0], nCffLen ); + + // NOTE: assuming that all glyphids requested on Aqua are fully translated + + // make the subsetter provide the requested subset + FILE* pOutFile = fopen( aToFile.GetBuffer(), "wb" ); + bool bRC = rInfo.CreateFontSubset( FontSubsetInfo::TYPE1_PFB, pOutFile, NULL, + pGlyphIDs, pEncoding, nGlyphCount, pGlyphWidths ); + fclose( pOutFile ); + return bRC; + } + // TODO: modernize psprint's horrible fontsubset C-API // this probably only makes sense after the switch to another SCM // that can preserve change history after file renames @@ -2124,7 +2198,7 @@ BOOL AquaSalGraphics::CreateFontSubset( const rtl::OUString& rToFile, // get details about the subsetted font TTGlobalFontInfo aTTInfo; ::GetTTGlobalFontInfo( pSftFont, &aTTInfo ); - rInfo.m_nFontType = SAL_FONTSUBSETINFO_TYPE_TRUETYPE; + rInfo.m_nFontType = FontSubsetInfo::SFNT_TTF; rInfo.m_aPSName = String( aTTInfo.psname, RTL_TEXTENCODING_UTF8 ); rInfo.m_aFontBBox = Rectangle( Point( aTTInfo.xMin, aTTInfo.yMin ), Point( aTTInfo.xMax, aTTInfo.yMax ) ); @@ -2202,11 +2276,6 @@ BOOL AquaSalGraphics::CreateFontSubset( const rtl::OUString& rToFile, free( pGlyphMetrics ); // write subset into destination file - rtl::OUString aSysPath; - if( osl_File_E_None != osl_getSystemPathFromFileURL( rToFile.pData, &aSysPath.pData ) ) - return FALSE; - rtl_TextEncoding aThreadEncoding = osl_getThreadTextEncoding(); - ByteString aToFile( rtl::OUStringToOString( aSysPath, aThreadEncoding ) ); nRC = ::CreateTTFromTTGlyphs( pSftFont, aToFile.GetBuffer(), aShortIDs, aTempEncs, nGlyphCount, 0, NULL, 0 ); ::CloseTTFont(pSftFont); @@ -2224,7 +2293,7 @@ void AquaSalGraphics::GetGlyphWidths( const ImplFontData* pFontData, bool bVerti if( pFontData->IsSubsettable() ) { ByteVector aBuffer; - if( !GetRawFontData( pFontData, aBuffer ) ) + if( !GetRawFontData( pFontData, aBuffer, NULL ) ) return; // TODO: modernize psprint's horrible fontsubset C-API @@ -2309,7 +2378,6 @@ const void* AquaSalGraphics::GetEmbedFontData( const ImplFontData* pFontData, FontSubsetInfo& rInfo, long* pDataLen ) { - // TODO: are the non-subsettable fonts on OSX that are embeddable? return NULL; } diff --git a/vcl/aqua/source/gdi/salgdiutils.cxx b/vcl/aqua/source/gdi/salgdiutils.cxx index 066268791b11..99a1629006d2 100755 --- a/vcl/aqua/source/gdi/salgdiutils.cxx +++ b/vcl/aqua/source/gdi/salgdiutils.cxx @@ -102,8 +102,8 @@ void AquaSalGraphics::SetVirDevGraphics( CGLayerRef xLayer, CGContextRef xContex else { const CGSize aSize = CGLayerGetSize( mxLayer ); - mnWidth = aSize.width; - mnHeight = aSize.height; + mnWidth = static_cast(aSize.width); + mnHeight = static_cast(aSize.height); } // prepare graphics for drawing @@ -219,7 +219,10 @@ void AquaSalGraphics::RefreshRect(float lX, float lY, float lWidth, float lHeigh { // update a little more around the designated rectangle // this helps with antialiased rendering - const Rectangle aVclRect( Point( lX-1, lY-1 ), Size( lWidth+2, lHeight+2) ); + const Rectangle aVclRect(Point(static_cast(lX-1), + static_cast(lY-1) ), + Size( static_cast(lWidth+2), + static_cast(lHeight+2) ) ); mpFrame->maInvalidRect.Union( aVclRect ); } } diff --git a/vcl/aqua/source/gdi/salnativewidgets.cxx b/vcl/aqua/source/gdi/salnativewidgets.cxx index 9f2c7c4fa3a7..754358823a93 100644 --- a/vcl/aqua/source/gdi/salnativewidgets.cxx +++ b/vcl/aqua/source/gdi/salnativewidgets.cxx @@ -430,9 +430,10 @@ BOOL AquaSalGraphics::hitTestNativeControl( ControlType nType, ControlPart nPart #define CTRL_STATE_SELECTED 0x0040 #define CTRL_CACHING_ALLOWED 0x8000 // set when the control is completely visible (i.e. not clipped) */ -static ThemeDrawState getState( ControlState nState ) +UInt32 AquaSalGraphics::getState( ControlState nState ) { - if( (nState & CTRL_STATE_ENABLED) == 0 ) + bool bDrawActive = mpFrame ? ([mpFrame->getWindow() isKeyWindow] ? true : false) : true; + if( (nState & CTRL_STATE_ENABLED) == 0 || ! bDrawActive ) { if( (nState & CTRL_STATE_HIDDEN) == 0 ) return kThemeStateInactive; @@ -612,7 +613,7 @@ BOOL AquaSalGraphics::drawNativeControl(ControlType nType, aPushInfo.animation.time.start = 0; aPushInfo.animation.time.current = 0; PushButtonValue* pPBVal = (PushButtonValue*)aValue.getOptionalVal(); - int nPaintHeight = rc.size.height; + int nPaintHeight = static_cast(rc.size.height); if( pPBVal && pPBVal->mbBevelButton ) { @@ -1162,8 +1163,10 @@ BOOL AquaSalGraphics::drawNativeControl(ControlType nType, if( mxClipPath ) aRect = CGPathGetBoundingBox( mxClipPath ); if( aRect.size.width != 0 && aRect.size.height != 0 ) - buttonRect.Intersection( Rectangle( Point( aRect.origin.x, aRect.origin.y ), - Size( aRect.size.width, aRect.size.height ) ) ); + buttonRect.Intersection( Rectangle( Point( static_cast(aRect.origin.x), + static_cast(aRect.origin.y) ), + Size( static_cast(aRect.size.width), + static_cast(aRect.size.height) ) ) ); } RefreshRect( buttonRect.Left(), buttonRect.Top(), buttonRect.GetWidth(), buttonRect.GetHeight() ); diff --git a/vcl/aqua/source/gdi/salprn.cxx b/vcl/aqua/source/gdi/salprn.cxx index ef6258829261..b9a1f4ef7748 100644 --- a/vcl/aqua/source/gdi/salprn.cxx +++ b/vcl/aqua/source/gdi/salprn.cxx @@ -127,20 +127,27 @@ void AquaSalInfoPrinter::SetupPrinterGraphics( CGContextRef i_rContext ) const NSRect aImageRect = [mpPrintInfo imageablePageBounds]; if( mePageOrientation == ORIENTATION_PORTRAIT ) { + // move mirrored CTM back into paper double dX = 0, dY = aPaperSize.height; + // move CTM to reflect imageable area dX += aImageRect.origin.x; dY -= aPaperSize.height - aImageRect.size.height - aImageRect.origin.y; CGContextTranslateCTM( i_rContext, dX + mnStartPageOffsetX, dY - mnStartPageOffsetY ); + // scale to be top/down and reflect our "virtual" DPI CGContextScaleCTM( i_rContext, 0.1, -0.1 ); } else { + // move CTM to reflect imageable area + double dX = aImageRect.origin.x, dY = aPaperSize.height - aImageRect.size.height - aImageRect.origin.y; + CGContextTranslateCTM( i_rContext, -dX, -dY ); + // turn by 90 degree CGContextRotateCTM( i_rContext, M_PI/2 ); - double dX = aPaperSize.height, dY = -aPaperSize.width; - dY += aPaperSize.height - aImageRect.size.height - aImageRect.origin.y; - dX -= aImageRect.origin.x; - + // move turned CTM back into paper + dX = aPaperSize.height; + dY = -aPaperSize.width; CGContextTranslateCTM( i_rContext, dX + mnStartPageOffsetY, dY - mnStartPageOffsetX ); + // scale to be top/down and reflect our "virtual" DPI CGContextScaleCTM( i_rContext, -0.1, 0.1 ); } mpGraphics->SetPrinterGraphics( i_rContext, nDPIX, nDPIY, 1.0 ); @@ -187,8 +194,8 @@ static struct PaperSizeEntry { 420, 595, PAPER_A5 }, { 612, 792, PAPER_LETTER }, { 612, 1008, PAPER_LEGAL }, - { 728, 1032, PAPER_B4 }, - { 516, 729, PAPER_B5 }, + { 728, 1032, PAPER_B4_JIS }, + { 516, 729, PAPER_B5_JIS }, { 792, 1224, PAPER_TABLOID } }; @@ -216,8 +223,8 @@ static Paper recognizePaper( double i_fWidth, double i_fHeight ) case 595000842: aPaper = PAPER_A4; break; case 420000595: aPaper = PAPER_A5; break; case 612000792: aPaper = PAPER_LETTER; break; - case 728001032: aPaper = PAPER_B4; break; - case 516000729: aPaper = PAPER_B5; break; + case 728001032: aPaper = PAPER_B4_JIS; break; + case 516000729: aPaper = PAPER_B5_JIS; break; case 612001008: aPaper = PAPER_LEGAL; break; case 792001224: aPaper = PAPER_TABLOID; break; default: @@ -303,8 +310,12 @@ BOOL AquaSalInfoPrinter::SetData( ULONG i_nFlags, ImplJobSetup* io_pSetupData ) double width = 0, height = 0; if( io_pSetupData->mePaperFormat == PAPER_USER ) { - width = TenMuToPt( io_pSetupData->mnPaperWidth ); - height = TenMuToPt( io_pSetupData->mnPaperHeight ); + // #i101108# sanity check + if( io_pSetupData->mnPaperWidth && io_pSetupData->mnPaperHeight ) + { + width = TenMuToPt( io_pSetupData->mnPaperWidth ); + height = TenMuToPt( io_pSetupData->mnPaperHeight ); + } } else getPaperSize( width, height, io_pSetupData->mePaperFormat ); diff --git a/vcl/aqua/source/gdi/salvd.cxx b/vcl/aqua/source/gdi/salvd.cxx index d7690e4e38bd..4d25d5d8b63b 100644 --- a/vcl/aqua/source/gdi/salvd.cxx +++ b/vcl/aqua/source/gdi/salvd.cxx @@ -228,8 +228,8 @@ void AquaSalVirtualDevice::GetSize( long& rWidth, long& rHeight ) if( mxLayer ) { const CGSize aSize = CGLayerGetSize( mxLayer ); - rWidth = aSize.width; - rHeight = aSize.height; + rWidth = static_cast(aSize.width); + rHeight = static_cast(aSize.height); } else { diff --git a/vcl/aqua/source/window/salframe.cxx b/vcl/aqua/source/window/salframe.cxx index 560d80fd75d5..7fe3b93ef2e8 100644 --- a/vcl/aqua/source/window/salframe.cxx +++ b/vcl/aqua/source/window/salframe.cxx @@ -43,6 +43,7 @@ #include "aqua11yfactory.h" #include "vcl/salwtype.hxx" #include "vcl/window.hxx" +#include "vcl/timer.hxx" #include "premac.h" // needed for theming @@ -53,10 +54,7 @@ #include "boost/assert.hpp" #include "vcl/svapp.hxx" #include "rtl/ustrbuf.hxx" - -#include -#include -#include +#include "osl/file.h" using namespace std; @@ -328,12 +326,29 @@ void AquaSalFrame::SetTitle(const XubString& rTitle) // ----------------------------------------------------------------------- -void AquaSalFrame::SetIcon( USHORT nIcon ) +void AquaSalFrame::SetIcon( USHORT ) { } // ----------------------------------------------------------------------- +void AquaSalFrame::SetRepresentedURL( const rtl::OUString& i_rDocURL ) +{ + if( i_rDocURL.indexOfAsciiL( "file:", 5 ) == 0 ) + { + rtl::OUString aSysPath; + osl_getSystemPathFromFileURL( i_rDocURL.pData, &aSysPath.pData ); + NSString* pStr = CreateNSString( aSysPath ); + if( pStr ) + { + [pStr autorelease]; + [mpWindow setRepresentedFilename: pStr]; + } + } +} + +// ----------------------------------------------------------------------- + void AquaSalFrame::initShow() { mbInitShow = false; @@ -520,8 +535,16 @@ void AquaSalFrame::SetClientSize( long nWidth, long nHeight ) void AquaSalFrame::GetClientSize( long& rWidth, long& rHeight ) { - rWidth = mbShown ? maGeometry.nWidth : 0; - rHeight = mbShown ? maGeometry.nHeight : 0; + if( mbShown || mbInitShow ) + { + rWidth = maGeometry.nWidth; + rHeight = maGeometry.nHeight; + } + else + { + rWidth = 0; + rHeight = 0; + } } // ----------------------------------------------------------------------- @@ -741,16 +764,37 @@ void AquaSalFrame::ShowFullScreen( BOOL bFullScreen, sal_Int32 nDisplay ) // ----------------------------------------------------------------------- +class PreventSleepTimer : public AutoTimer +{ +public: + PreventSleepTimer() + { + SetTimeout( 30000 ); + Start(); + } + + virtual ~PreventSleepTimer() + { + } + + virtual void Timeout() + { + UpdateSystemActivity(OverallAct); + } +}; + void AquaSalFrame::StartPresentation( BOOL bStart ) { if( bStart ) { + mpActivityTimer.reset( new PreventSleepTimer() ); [mpWindow setLevel: NSScreenSaverWindowLevel]; if( mbShown ) [mpWindow makeMainWindow]; } else { + mpActivityTimer.reset(); [mpWindow setLevel: NSNormalWindowLevel]; } } @@ -1165,6 +1209,7 @@ void AquaSalFrame::UpdateSettings( AllSettings& rSettings ) Color aMenuTextColor( getColor( [NSColor textColor], aStyleSettings.GetMenuTextColor(), mpWindow ) ); aStyleSettings.SetMenuTextColor( aMenuTextColor ); + aStyleSettings.SetMenuBarTextColor( aMenuTextColor ); aStyleSettings.SetCursorBlinkTime( 500 ); @@ -1174,7 +1219,7 @@ void AquaSalFrame::UpdateSettings( AllSettings& rSettings ) getAppleScrollBarVariant(); // set scrollbar size - aStyleSettings.SetScrollBarSize( [NSScroller scrollerWidth] ); + aStyleSettings.SetScrollBarSize( static_cast([NSScroller scrollerWidth]) ); // images in menus false for MacOSX aStyleSettings.SetUseImagesInMenus( false ); @@ -1195,7 +1240,15 @@ const SystemEnvData* AquaSalFrame::GetSystemData() const void AquaSalFrame::Beep( SoundType eSoundType ) { - NSBeep(); + switch( eSoundType ) + { + case SOUND_DISABLE: + // don't beep + break; + default: + NSBeep(); + break; + } } // ----------------------------------------------------------------------- @@ -1232,7 +1285,7 @@ void AquaSalFrame::SetPosSize(long nX, long nY, long nWidth, long nHeight, USHOR if( (nFlags & SAL_FRAME_POSSIZE_WIDTH) != 0 ) nX = mpParent->maGeometry.nWidth - nWidth-1 - nX; else - nX = mpParent->maGeometry.nWidth - aContentRect.size.width-1 - nX; + nX = mpParent->maGeometry.nWidth - static_cast( aContentRect.size.width-1) - nX; } NSRect aParentFrameRect = [mpParent->mpWindow frame]; aParentContentRect = [NSWindow contentRectForFrameRect: aParentFrameRect styleMask: mpParent->mnStyleMask]; diff --git a/vcl/aqua/source/window/salframeview.mm b/vcl/aqua/source/window/salframeview.mm index 7de43d770385..51f1b1a3b63c 100755 --- a/vcl/aqua/source/window/salframeview.mm +++ b/vcl/aqua/source/window/salframeview.mm @@ -184,6 +184,8 @@ static AquaSalFrame* getMouseContainerFrame() return YES; if( mpFrame->mbFullScreen ) return YES; + if( (mpFrame->mnStyle & SAL_FRAME_STYLE_FLOAT_FOCUSABLE) ) + return YES; return [super canBecomeKeyWindow]; } @@ -213,6 +215,7 @@ static AquaSalFrame* getMouseContainerFrame() AquaSalMenu::enableMainMenu( false ); #endif mpFrame->CallCallback( SALEVENT_GETFOCUS, 0 ); + mpFrame->SendPaintEvent(); // repaint controls as active } } @@ -221,7 +224,10 @@ static AquaSalFrame* getMouseContainerFrame() YIELD_GUARD; if( mpFrame && AquaSalFrame::isAlive( mpFrame ) ) + { mpFrame->CallCallback(SALEVENT_LOSEFOCUS, 0); + mpFrame->SendPaintEvent(); // repaint controls as inactive + } } -(void)windowDidChangeScreen: (NSNotification*)pNotification @@ -841,6 +847,16 @@ private: if( pUnmodifiedString && [pUnmodifiedString length] == 1 ) { + /* #i103102# key events with command and alternate don't make it through + interpretKeyEvents (why ?). Try to dispatch them here first, + if not successful continue normally + */ + if( (mpFrame->mnLastModifierFlags & (NSAlternateKeyMask | NSCommandKeyMask)) + == (NSAlternateKeyMask | NSCommandKeyMask) ) + { + if( [self sendSingleCharacter: mpLastEvent] ) + return YES; + } unichar keyChar = [pUnmodifiedString characterAtIndex: 0]; USHORT nKeyCode = ImplMapCharCode( keyChar ); @@ -1049,21 +1065,41 @@ private: [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_END_OF_LINE character: 0 modifiers: 0]; } +-(void)moveToRightEndOfLine: (id)aSender +{ + [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_END_OF_LINE character: 0 modifiers: 0]; +} + -(void)moveToEndOfLineAndModifySelection: (id)aSender { [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::SELECT_TO_END_OF_LINE character: 0 modifiers: 0]; } +-(void)moveToRightEndOfLineAndModifySelection: (id)aSender +{ + [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::SELECT_TO_END_OF_LINE character: 0 modifiers: 0]; +} + -(void)moveToBeginningOfLine: (id)aSender { [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_LINE character: 0 modifiers: 0]; } +-(void)moveToLeftEndOfLine: (id)aSender +{ + [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_LINE character: 0 modifiers: 0]; +} + -(void)moveToBeginningOfLineAndModifySelection: (id)aSender { [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE character: 0 modifiers: 0]; } +-(void)moveToLeftEndOfLineAndModifySelection: (id)aSender +{ + [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_LINE character: 0 modifiers: 0]; +} + -(void)moveToEndOfParagraph: (id)aSender { [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_END_OF_PARAGRAPH character: 0 modifiers: 0]; @@ -1109,6 +1145,12 @@ private: [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT character: 0 modifiers: 0]; } +-(void)scrollToEndOfDocument: (id)aSender +{ + // this is not exactly what we should do, but it makes "End" and "Shift-End" behave consistent + [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_END_OF_DOCUMENT character: 0 modifiers: 0]; +} + -(void)moveToEndOfDocumentAndModifySelection: (id)aSender { [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::SELECT_TO_END_OF_DOCUMENT character: 0 modifiers: 0]; @@ -1119,6 +1161,12 @@ private: [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT character: 0 modifiers: 0]; } +-(void)scrollToBeginningOfDocument: (id)aSender +{ + // this is not exactly what we should do, but it makes "Home" and "Shift-Home" behave consistent + [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::MOVE_TO_BEGIN_OF_DOCUMENT character: 0 modifiers: 0]; +} + -(void)moveToBeginningOfDocumentAndModifySelection: (id)aSender { [self sendKeyInputAndReleaseToFrame: com::sun::star::awt::Key::SELECT_TO_BEGIN_OF_DOCUMENT character: 0 modifiers: 0]; @@ -1242,12 +1290,18 @@ private: } } --(MacOSBOOL)sendKeyInputAndReleaseToFrame: (USHORT)nKeyCode character: (sal_Unicode)aChar +-(MacOSBOOL)sendKeyInputAndReleaseToFrame: (USHORT)nKeyCode character: (sal_Unicode)aChar { return [self sendKeyInputAndReleaseToFrame: nKeyCode character: aChar modifiers: mpFrame->mnLastModifierFlags]; } --(MacOSBOOL)sendKeyInputAndReleaseToFrame: (USHORT)nKeyCode character: (sal_Unicode)aChar modifiers: (unsigned int)nMod +-(MacOSBOOL)sendKeyInputAndReleaseToFrame: (USHORT)nKeyCode character: (sal_Unicode)aChar modifiers: (unsigned int)nMod +{ + return [self sendKeyToFrameDirect: nKeyCode character: aChar modifiers: nMod] || + [self sendSingleCharacter: mpLastEvent]; +} + +-(MacOSBOOL)sendKeyToFrameDirect: (USHORT)nKeyCode character: (sal_Unicode)aChar modifiers: (unsigned int)nMod { YIELD_GUARD; @@ -1283,7 +1337,7 @@ private: // don't send unicodes in the private use area if( keyChar >= 0xf700 && keyChar < 0xf780 ) keyChar = 0; - MacOSBOOL bRet = [self sendKeyInputAndReleaseToFrame: nKeyCode character: keyChar]; + MacOSBOOL bRet = [self sendKeyToFrameDirect: nKeyCode character: keyChar modifiers: mpFrame->mnLastModifierFlags]; mbInKeyInput = false; return bRet; @@ -1310,11 +1364,32 @@ private: { mbNeedSpecialKeyHandle = true; } + + // FIXME: + // #i106901# + // if we come here outside of mbInKeyInput, this is likely to be because + // of the keyboard viewer. For unknown reasons having no marked range + // in this case causes a crash. So we say we have a marked range anyway + // This is a hack, since it is not understood what a) causes that crash + // and b) why we should have a marked range at this point. + if( ! mbInKeyInput ) + bHasMarkedText = YES; + return bHasMarkedText; } - (NSRange)markedRange { + // FIXME: + // #i106901# + // if we come here outside of mbInKeyInput, this is likely to be because + // of the keyboard viewer. For unknown reasons having no marked range + // in this case causes a crash. So we say we have a marked range anyway + // This is a hack, since it is not understood what a) causes that crash + // and b) why we should have a marked range at this point. + if( ! mbInKeyInput ) + return NSMakeRange( 0, 0 ); + return [self hasMarkedText] ? mMarkedRange : NSMakeRange( NSNotFound, 0 ); } @@ -1404,7 +1479,7 @@ private: return 0; } -#ifdef MAC_OS_X_VERSION_10_5 +#if defined(MAC_OS_X_VERSION_10_5) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) /* build target 10.5 or greater */ - (NSInteger)conversationIdentifier #else @@ -1419,6 +1494,9 @@ private: { if( AquaSalFrame::isAlive( mpFrame ) ) { + #if OSL_DEBUG_LEVEL > 1 + // fprintf( stderr, "SalFrameView: doCommandBySelector %s\n", (char*)aSelector ); + #endif if( (mpFrame->mnICOptions & SAL_INPUTCONTEXT_TEXT) != 0 && aSelector != NULL && [self respondsToSelector: aSelector] ) { diff --git a/vcl/aqua/source/window/salmenu.cxx b/vcl/aqua/source/window/salmenu.cxx index 4fafbbdbb4cf..5c838701933c 100644 --- a/vcl/aqua/source/window/salmenu.cxx +++ b/vcl/aqua/source/window/salmenu.cxx @@ -651,11 +651,9 @@ void AquaSalMenu::SetItemImage( unsigned nPos, SalMenuItem* pSMI, const Image& r NSImage* pImage = CreateNSImage( rImage ); + [pSalMenuItem->mpMenuItem setImage: pImage]; if( pImage ) - { - [pSalMenuItem->mpMenuItem setImage: pImage]; [pImage release]; - } } void AquaSalMenu::SetItemText( unsigned i_nPos, SalMenuItem* i_pSalMenuItem, const XubString& i_rText ) @@ -894,7 +892,13 @@ Rectangle AquaSalMenu::GetMenuBarButtonRectPixel( USHORT i_nItemId, SalFrame* i_ aRect.origin.x -= i_pReferenceFrame->maGeometry.nX; aRect.origin.y -= i_pReferenceFrame->maGeometry.nY + aRect.size.height; - return Rectangle( Point( aRect.origin.x, aRect.origin.y ), Size( aRect.size.width, aRect.size.height ) ); + return Rectangle( Point(static_cast(aRect.origin.x), + static_cast(aRect.origin.y) + ), + Size( static_cast(aRect.size.width), + static_cast(aRect.size.height) + ) + ); } // ======================================================================= diff --git a/vcl/inc/list.h b/vcl/inc/list.h index b801b43d77eb..66bff6912bc0 100644 --- a/vcl/inc/list.h +++ b/vcl/inc/list.h @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: list.h,v $ - * $Revision: 1.4 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -28,8 +25,6 @@ * ************************************************************************/ -/* $Id: list.h,v 1.4 2008-06-25 14:20:01 kz Exp $ */ - /*[]---------------------------------------------------[]*/ /*| |*/ /*| Implementation of the list data type |*/ diff --git a/vcl/inc/sft.h b/vcl/inc/sft.h deleted file mode 100644 index efda0903afc5..000000000000 --- a/vcl/inc/sft.h +++ /dev/null @@ -1,641 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: sft.h,v $ - * $Revision: 1.21 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -/* $Id: sft.h,v 1.21 2008-06-25 14:20:49 kz Exp $ */ - -/** - - * - * @file sft.h - * @brief Sun Font Tools - * @author Alexander Gelfenbain - */ - -/* - * If NO_MAPPERS is defined, MapChar() and MapString() and consequently GetTTSimpleCharMetrics() - * don't get compiled in. This is done to avoid including a large chunk of code (TranslateXY() from - * xlat.c in the projects that don't require it. - * - * If NO_TYPE3 is defined CreateT3FromTTGlyphs() does not get compiled in. - * If NO_TYPE42 is defined Type42-related code is excluded - * If NO_TTCR is defined TrueType creation related code is excluded\ - * If NO_LIST is defined list.h and piblic functions that use it don't get compiled - */ - -/* - * Generated fonts contain an XUID entry in the form of: - * - * 103 0 T C1 N C2 C3 - * - * 103 - Sun's Adobe assigned XUID number. Contact person: Alexander Gelfenbain - * - * T - font type. 0: Type 3, 1: Type 42 - * C1 - CRC-32 of the entire source TrueType font - * N - number of glyphs in the subset - * C2 - CRC-32 of the array of glyph IDs used to generate the subset - * C3 - CRC-32 of the array of encoding numbers used to generate the subset - * - */ - - -#ifndef __SUBFONT_H -#define __SUBFONT_H - -#ifdef UNX -#include -#include -#endif -#include - -#include - -#ifndef NO_LIST -#include "list.h" -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/*@{*/ -#ifndef __cplusplus -#define false 0 /**< standard false value */ -#define true 1 /**< standard true value */ -#endif -/*@}*/ - -/*@{*/ - typedef sal_Int16 F2Dot14; /**< fixed: 2.14 */ - typedef sal_Int32 F16Dot16; /**< fixed: 16.16 */ -/*@}*/ - - typedef struct { - sal_uInt16 s; - sal_uInt16 d; - } sal_uInt16pair; - -/** Return value of OpenTTFont() and CreateT3FromTTGlyphs() */ - enum SFErrCodes { - SF_OK, /**< no error */ - SF_BADFILE, /**< file not found */ - SF_FILEIO, /**< file I/O error */ - SF_MEMORY, /**< memory allocation error */ - SF_GLYPHNUM, /**< incorrect number of glyphs */ - SF_BADARG, /**< incorrect arguments */ - SF_TTFORMAT, /**< incorrect TrueType font format */ - SF_TABLEFORMAT, /**< incorrect format of a TrueType table */ - SF_FONTNO /**< incorrect logical font number of a TTC font */ - }; - -#ifndef FW_THIN /* WIN32 compilation would conflict */ -/** Value of the weight member of the TTGlobalFontInfo struct */ - enum WeightClass { - FW_THIN = 100, /**< Thin */ - FW_EXTRALIGHT = 200, /**< Extra-light (Ultra-light) */ - FW_LIGHT = 300, /**< Light */ - FW_NORMAL = 400, /**< Normal (Regular) */ - FW_MEDIUM = 500, /**< Medium */ - FW_SEMIBOLD = 600, /**< Semi-bold (Demi-bold) */ - FW_BOLD = 700, /**< Bold */ - FW_EXTRABOLD = 800, /**< Extra-bold (Ultra-bold) */ - FW_BLACK = 900 /**< Black (Heavy) */ - }; - -/** Value of the width member of the TTGlobalFontInfo struct */ -#ifndef OS2 - enum WidthClass { - FWIDTH_ULTRA_CONDENSED = 1, /**< 50% of normal */ - FWIDTH_EXTRA_CONDENSED = 2, /**< 62.5% of normal */ - FWIDTH_CONDENSED = 3, /**< 75% of normal */ - FWIDTH_SEMI_CONDENSED = 4, /**< 87.5% of normal */ - FWIDTH_NORMAL = 5, /**< Medium, 100% */ - FWIDTH_SEMI_EXPANDED = 6, /**< 112.5% of normal */ - FWIDTH_EXPANDED = 7, /**< 125% of normal */ - FWIDTH_EXTRA_EXPANDED = 8, /**< 150% of normal */ - FWIDTH_ULTRA_EXPANDED = 9 /**< 200% of normal */ - }; -#endif // OS2 -#endif /* FW_THIN */ - -/** Type of the 'kern' table, stored in _TrueTypeFont::kerntype */ - enum KernType { - KT_NONE = 0, /**< no kern table */ - KT_APPLE_NEW = 1, /**< new Apple kern table */ - KT_MICROSOFT = 2 /**< Microsoft table */ - }; - -/* Composite glyph flags definition */ - enum CompositeFlags { - ARG_1_AND_2_ARE_WORDS = 1, - ARGS_ARE_XY_VALUES = 1<<1, - ROUND_XY_TO_GRID = 1<<2, - WE_HAVE_A_SCALE = 1<<3, - MORE_COMPONENTS = 1<<5, - WE_HAVE_AN_X_AND_Y_SCALE = 1<<6, - WE_HAVE_A_TWO_BY_TWO = 1<<7, - WE_HAVE_INSTRUCTIONS = 1<<8, - USE_MY_METRICS = 1<<9, - OVERLAP_COMPOUND = 1<<10 - }; - -#ifndef NO_TTCR -/** Flags for TrueType generation */ - enum TTCreationFlags { - TTCF_AutoName = 1, /**< Automatically generate a compact 'name' table. - If this flag is not set, name table is generated - either from an array of NameRecord structs passed as - arguments or if the array is NULL, 'name' table - of the generated TrueType file will be a copy - of the name table of the original file. - If this flag is set the array of NameRecord structs - is ignored and a very compact 'name' table is automatically - generated. */ - - TTCF_IncludeOS2 = 2 /** If this flag is set OS/2 table from the original font will be - copied to the subset */ - }; -#endif - - - - -/** Structure used by GetTTSimpleGlyphMetrics() and GetTTSimpleCharMetrics() functions */ - typedef struct { - sal_uInt16 adv; /**< advance width or height */ - sal_Int16 sb; /**< left or top sidebearing */ - } TTSimpleGlyphMetrics; - - - -/** Structure used by the TrueType Creator and GetRawGlyphData() */ - - typedef struct { - sal_uInt32 glyphID; /**< glyph ID */ - sal_uInt16 nbytes; /**< number of bytes in glyph data */ - sal_uInt8 *ptr; /**< pointer to glyph data */ - sal_uInt16 aw; /**< advance width */ - sal_Int16 lsb; /**< left sidebearing */ - sal_uInt16 compflag; /**< 0- if non-composite, 1- otherwise */ - sal_uInt16 npoints; /**< number of points */ - sal_uInt16 ncontours; /**< number of contours */ - /* */ - sal_uInt32 newID; /**< used internally by the TTCR */ - } GlyphData; - -/** Structure used by the TrueType Creator and CreateTTFromTTGlyphs() */ - typedef struct { - sal_uInt16 platformID; /**< Platform ID */ - sal_uInt16 encodingID; /**< Platform-specific encoding ID */ - sal_uInt16 languageID; /**< Language ID */ - sal_uInt16 nameID; /**< Name ID */ - sal_uInt16 slen; /**< String length in bytes */ - sal_uInt8 *sptr; /**< Pointer to string data (not zero-terminated!) */ - } NameRecord; - - - -/** Return value of GetTTGlobalFontInfo() */ - - typedef struct { - char *family; /**< family name */ - sal_uInt16 *ufamily; /**< family name UCS2 */ - char *subfamily; /**< subfamily name */ - sal_uInt16 *usubfamily; /**< subfamily name UCS2 */ - char *psname; /**< PostScript name */ - sal_uInt16 macStyle; /**< macstyle bits from 'HEAD' table */ - int weight; /**< value of WeightClass or 0 if can't be determined */ - int width; /**< value of WidthClass or 0 if can't be determined */ - int pitch; /**< 0: proportianal font, otherwise: monospaced */ - int italicAngle; /**< in counter-clockwise degrees * 65536 */ - int xMin; /**< global bounding box: xMin */ - int yMin; /**< global bounding box: yMin */ - int xMax; /**< global bounding box: xMax */ - int yMax; /**< global bounding box: yMax */ - int ascender; /**< typographic ascent. */ - int descender; /**< typographic descent. */ - int linegap; /**< typographic line gap.\ Negative values are treated as - zero in Win 3.1, System 6 and System 7. */ - int vascent; /**< typographic ascent for vertical writing mode */ - int vdescent; /**< typographic descent for vertical writing mode */ - int typoAscender; /**< OS/2 portable typographic ascender */ - int typoDescender; /**< OS/2 portable typographic descender */ - int typoLineGap; /**< OS/2 portable typographc line gap */ - int winAscent; /**< ascender metric for Windows */ - int winDescent; /**< descender metric for Windows */ - int symbolEncoded; /**< 1: MS symbol encoded 0: not symbol encoded */ - int rangeFlag; /**< if set to 1 Unicode Range flags are applicable */ - sal_uInt32 ur1; /**< bits 0 - 31 of Unicode Range flags */ - sal_uInt32 ur2; /**< bits 32 - 63 of Unicode Range flags */ - sal_uInt32 ur3; /**< bits 64 - 95 of Unicode Range flags */ - sal_uInt32 ur4; /**< bits 96 - 127 of Unicode Range flags */ - sal_uInt8 panose[10]; /**< PANOSE classification number */ - sal_uInt16 typeFlags; /**< type flags (copyright information) */ - } TTGlobalFontInfo; - -/** Structure used by KernGlyphs() */ - typedef struct { - int x; /**< positive: right, negative: left */ - int y; /**< positive: up, negative: down */ - } KernData; - - -/** ControlPoint structure used by GetTTGlyphPoints() */ - typedef struct { - sal_uInt32 flags; /**< 00000000 00000000 e0000000 bbbbbbbb */ - /**< b - byte flags from the glyf array */ - /**< e == 0 - regular point */ - /**< e == 1 - end contour */ - sal_Int16 x; /**< X coordinate in EmSquare units */ - sal_Int16 y; /**< Y coordinate in EmSquare units */ - } ControlPoint; - - typedef struct _TrueTypeFont TrueTypeFont; - -/** - * @defgroup sft Sun Font Tools Exported Functions - */ - - -/** - * Get the number of fonts contained in a TrueType collection - * @param fname - file name - * @return number of fonts or zero, if file is not a TTC file. - * @ingroup sft - */ - int CountTTCFonts(const char* fname); - - -/** - * TrueTypeFont constructor. - * The font file has to be provided as a memory buffer and length - * @param facenum - logical font number within a TTC file. This value is ignored - * for TrueType fonts - * @return value of SFErrCodes enum - * @ingroup sft - */ - int OpenTTFontBuffer(void* pBuffer, sal_uInt32 nLen, sal_uInt32 facenum, TrueTypeFont** ttf); /*FOLD01*/ -#if !defined(WIN32) && !defined(OS2) -/** - * TrueTypeFont constructor. - * Reads the font file and allocates the memory for the structure. - * on WIN32 the font has to be provided as a memory buffer and length - * @param facenum - logical font number within a TTC file. This value is ignored - * for TrueType fonts - * @return value of SFErrCodes enum - * @ingroup sft - */ - int OpenTTFontFile(const char *fname, sal_uInt32 facenum, TrueTypeFont** ttf); -#endif - -/** - * TrueTypeFont destructor. Deallocates the memory. - * @ingroup sft - */ - void CloseTTFont(TrueTypeFont *); - -/** - * Extracts TrueType control points, and stores them in an allocated array pointed to - * by *pointArray. This function returns the number of extracted points. - * - * @param ttf pointer to the TrueTypeFont structure - * @param glyphID Glyph ID - * @param pointArray Return value - address of the pointer to the first element of the array - * of points allocated by the function - * @return Returns the number of points in *pointArray or -1 if glyphID is - * invalid. - * @ingroup sft - * - */ - int GetTTGlyphPoints(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray); - -/** - * Extracts raw glyph data from the 'glyf' table and returns it in an allocated - * GlyphData structure. - * - * @param ttf pointer to the TrueTypeFont structure - * @param glyphID Glyph ID - * - * @return pointer to an allocated GlyphData structure or NULL if - * glyphID is not present in the font - * @ingroup sft - * - */ - GlyphData *GetTTRawGlyphData(TrueTypeFont *ttf, sal_uInt32 glyphID); - -#ifndef NO_LIST -/** - * For a specified glyph adds all component glyphs IDs to the list and - * return their number. If the glyph is a single glyph it has one component - * glyph (which is added to the list) and the function returns 1. - * For a composite glyphs it returns the number of component glyphs - * and adds all of them to the list. - * - * @param ttf pointer to the TrueTypeFont structure - * @param glyphID Glyph ID - * @param glyphlist list of glyphs - * - * @return number of component glyphs - * @ingroup sft - * - */ - int GetTTGlyphComponents(TrueTypeFont *ttf, sal_uInt32 glyphID, list glyphlist); -#endif - -/** - * Extracts all Name Records from the font and stores them in an allocated - * array of NameRecord structs - * - * @param ttf pointer to the TrueTypeFont struct - * @param nr pointer to the array of NameRecord structs - * - * @return number of NameRecord structs - * @ingroup sft - */ - - int GetTTNameRecords(TrueTypeFont *ttf, NameRecord **nr); - -/** - * Deallocates previously allocated array of NameRecords. - * - * @param nr array of NameRecord structs - * @param n number of elements in the array - * - * @ingroup sft - */ - void DisposeNameRecords(NameRecord* nr, int n); - - -#ifndef NO_TYPE3 -/** - * Generates a new PostScript Type 3 font and dumps it to outf file. - * This functions subsititues glyph 0 for all glyphIDs that are not found in the font. - * @param ttf pointer to the TrueTypeFont structure - * @param outf the resulting font is written to this stream - * @param fname font name for the new font. If it is NULL the PostScript name of the - * original font will be used - * @param glyphArray pointer to an array of glyphs that are to be extracted from ttf - * @param encoding array of encoding values. encoding[i] specifies the position of the glyph - * glyphArray[i] in the encoding vector of the resulting Type3 font - * @param nGlyphs number of glyph IDs in glyphArray and encoding values in encoding - * @param wmode writing mode for the output file: 0 - horizontal, 1 - vertical - * @return return the value of SFErrCodes enum - * @see SFErrCodes - * @ingroup sft - * - */ - int CreateT3FromTTGlyphs(TrueTypeFont *ttf, FILE *outf, const char *fname, sal_uInt16 *glyphArray, sal_uInt8 *encoding, int nGlyphs, int wmode); -#endif - -#ifndef NO_TTCR -/** - * Generates a new TrueType font and dumps it to outf file. - * This functions subsititues glyph 0 for all glyphIDs that are not found in the font. - * @param ttf pointer to the TrueTypeFont structure - * @param fname file name for the output TrueType font file - * @param glyphArray pointer to an array of glyphs that are to be extracted from ttf. The first - * element of this array has to be glyph 0 (default glyph) - * @param encoding array of encoding values. encoding[i] specifies character code for - * the glyphID glyphArray[i]. Character code 0 usually points to a default - * glyph (glyphID 0) - * @param nGlyphs number of glyph IDs in glyphArray and encoding values in encoding - * @param nNameRecs number of NameRecords for the font, if 0 the name table from the - * original font will be used - * @param nr array of NameRecords - * @param flags or'ed TTCreationFlags - * @return return the value of SFErrCodes enum - * @see SFErrCodes - * @ingroup sft - * - */ - int CreateTTFromTTGlyphs(TrueTypeFont *ttf, - const char *fname, - sal_uInt16 *glyphArray, - sal_uInt8 *encoding, - int nGlyphs, - int nNameRecs, - NameRecord *nr, - sal_uInt32 flags); -#endif - -#ifndef NO_TYPE42 -/** - * Generates a new PostScript Type42 font and dumps it to outf file. - * This functions subsititues glyph 0 for all glyphIDs that are not found in the font. - * @param ttf pointer to the TrueTypeFont structure - * @param outf output stream for a resulting font - * @param psname PostScript name of the resulting font - * @param glyphArray pointer to an array of glyphs that are to be extracted from ttf. The first - * element of this array has to be glyph 0 (default glyph) - * @param encoding array of encoding values. encoding[i] specifies character code for - * the glyphID glyphArray[i]. Character code 0 usually points to a default - * glyph (glyphID 0) - * @param nGlyphs number of glyph IDs in glyphArray and encoding values in encoding - * @return SF_OK - no errors - * SF_GLYPHNUM - too many glyphs (> 255) - * SF_TTFORMAT - corrupted TrueType fonts - * - * @see SFErrCodes - * @ingroup sft - * - */ - int CreateT42FromTTGlyphs(TrueTypeFont *ttf, - FILE *outf, - const char *psname, - sal_uInt16 *glyphArray, - sal_uInt8 *encoding, - int nGlyphs); -#endif - - -/** - * Queries glyph metrics. Allocates an array of TTSimpleGlyphMetrics structs and returns it. - * - * @param ttf pointer to the TrueTypeFont structure - * @param glyphArray pointer to an array of glyphs that are to be extracted from ttf - * @param nGlyphs number of glyph IDs in glyphArray and encoding values in encoding - * @param mode writing mode: 0 - horizontal, 1 - vertical - * @ingroup sft - * - */ - TTSimpleGlyphMetrics *GetTTSimpleGlyphMetrics(TrueTypeFont *ttf, sal_uInt16 *glyphArray, int nGlyphs, int mode); - -#ifndef NO_MAPPERS -/** - * Queries glyph metrics. Allocates an array of TTSimpleGlyphMetrics structs and returns it. - * This function behaves just like GetTTSimpleGlyphMetrics() but it takes a range of Unicode - * characters instead of an array of glyphs. - * - * @param ttf pointer to the TrueTypeFont structure - * @param firstChar Unicode value of the first character in the range - * @param nChars number of Unicode characters in the range - * @param mode writing mode: 0 - horizontal, 1 - vertical - * - * @see GetTTSimpleGlyphMetrics - * @ingroup sft - * - */ - TTSimpleGlyphMetrics *GetTTSimpleCharMetrics(TrueTypeFont *ttf, sal_uInt16 firstChar, int nChars, int mode); - -/** - * Maps a Unicode (UCS-2) string to a glyph array. Returns the number of glyphs in the array, - * which for TrueType fonts is always the same as the number of input characters. - * - * @param ttf pointer to the TrueTypeFont structure - * @param str pointer to a UCS-2 string - * @param nchars number of characters in str - * @param glyphArray pointer to the glyph array where glyph IDs are to be recorded. - * - * @return MapString() returns -1 if the TrueType font has no usable 'cmap' tables. - * Otherwise it returns the number of characters processed: nChars - * - * glyphIDs of TrueType fonts are 2 byte positive numbers. glyphID of 0 denotes a missing - * glyph and traditionally defaults to an empty square. - * glyphArray should be at least sizeof(sal_uInt16) * nchars bytes long. If glyphArray is NULL - * MapString() replaces the UCS-2 characters in str with glyphIDs. - * @ingroup sft - */ - int MapString(TrueTypeFont *ttf, sal_uInt16 *str, int nchars, sal_uInt16 *glyphArray, int bvertical); - -/** - * Maps a Unicode (UCS-2) character to a glyph ID and returns it. Missing glyph has - * a glyphID of 0 so this function can be used to test if a character is encoded in the font. - * - * @param ttf pointer to the TrueTypeFont structure - * @param ch Unicode (UCS-2) character - * @return glyph ID, if the character is missing in the font, the return value is 0. - * @ingroup sft - */ - sal_uInt16 MapChar(TrueTypeFont *ttf, sal_uInt16 ch, int bvertical); - -/** - * Returns 0 when the font does not substitute vertical glyphs - * - * @param ttf pointer to the TrueTypeFont structure - */ - int DoesVerticalSubstitution( TrueTypeFont *ttf, int bvertical); - -#endif - -/** - * Returns global font information about the TrueType font. - * @see TTGlobalFontInfo - * - * @param ttf pointer to a TrueTypeFont structure - * @param info pointer to a TTGlobalFontInfo structure - * @ingroup sft - * - */ - void GetTTGlobalFontInfo(TrueTypeFont *ttf, TTGlobalFontInfo *info); - -#ifdef TEST5 -/** - * Returns kerning information for an array of glyphs. - * Kerning is not cumulative. - * kern[i] contains kerning information for a pair of glyphs at positions i and i+1 - * - * @param ttf pointer to a TrueTypeFont structure - * @param glyphs array of source glyphs - * @param nglyphs number of glyphs in the array - * @param wmode writing mode: 0 - horizontal, 1 - vertical - * @param kern array of KernData structures. It should contain nglyphs-1 elements - * @see KernData - * @ingroup sft - * - */ - void KernGlyphs(TrueTypeFont *ttf, sal_uInt16 *glyphs, int nglyphs, int wmode, KernData *kern); -#endif - -/** - * Returns nonzero if font is a symbol encoded font - */ - int CheckSymbolEncoding(TrueTypeFont* ttf); - -/** - * returns the number of glyphs in a font - */ - int GetTTGlyphCount( TrueTypeFont* ttf ); - -/*- private definitions */ /*FOLD00*/ - - struct _TrueTypeFont { - sal_uInt32 tag; - - char *fname; - sal_Int32 fsize; - sal_uInt8 *ptr; - - char *psname; - char *family; - sal_uInt16 *ufamily; - char *subfamily; - sal_uInt16 *usubfamily; - - sal_uInt32 ntables; - sal_uInt32 *goffsets; - sal_uInt32 nglyphs; - sal_uInt32 unitsPerEm; - sal_uInt32 numberOfHMetrics; - sal_uInt32 numOfLongVerMetrics; /* if this number is not 0, font has vertical metrics information */ - sal_uInt8 *cmap; - int cmapType; - sal_uInt32 (*mapper)(const sal_uInt8 *, sal_uInt32); /* character to glyphID translation function */ - void **tables; /* array of pointers to tables */ - sal_uInt32 *tlens; /* array of table lengths */ - int kerntype; /* Defined in the KernType enum */ - sal_uInt32 nkern; /* number of kern subtables */ - sal_uInt8 **kerntables; /* array of pointers to kern subtables */ - void *pGSubstitution; /* info provided by GSUB for UseGSUB() */ - }; - -#ifdef __cplusplus -} -#endif - -/* indexes into _TrueTypeFont::tables[] and _TrueTypeFont::tlens[] */ -#define O_maxp 0 /* 'maxp' */ -#define O_glyf 1 /* 'glyf' */ -#define O_head 2 /* 'head' */ -#define O_loca 3 /* 'loca' */ -#define O_name 4 /* 'name' */ -#define O_hhea 5 /* 'hhea' */ -#define O_hmtx 6 /* 'hmtx' */ -#define O_cmap 7 /* 'cmap' */ -#define O_vhea 8 /* 'vhea' */ -#define O_vmtx 9 /* 'vmtx' */ -#define O_OS2 10 /* 'OS/2' */ -#define O_post 11 /* 'post' */ -#define O_kern 12 /* 'kern' */ -#define O_cvt 13 /* 'cvt_' - only used in TT->TT generation */ -#define O_prep 14 /* 'prep' - only used in TT->TT generation */ -#define O_fpgm 15 /* 'fpgm' - only used in TT->TT generation */ -#define O_gsub 16 /* 'GSUB' */ -#define NUM_TAGS 17 - -#endif /* __SUBFONT_H */ diff --git a/vcl/inc/sft.hxx b/vcl/inc/sft.hxx index 5f22bc0a471f..e2252802ba18 100644 --- a/vcl/inc/sft.hxx +++ b/vcl/inc/sft.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: sft.h,v $ - * $Revision: 1.21 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -28,11 +25,7 @@ * ************************************************************************/ -/* $Id: sft.h,v 1.21 2008-06-25 14:20:49 kz Exp $ */ - /** - - * * @file sft.h * @brief Sun Font Tools * @author Alexander Gelfenbain @@ -245,9 +238,13 @@ namespace vcl sal_uInt32 ur3; /**< bits 64 - 95 of Unicode Range flags */ sal_uInt32 ur4; /**< bits 96 - 127 of Unicode Range flags */ sal_uInt8 panose[10]; /**< PANOSE classification number */ - sal_uInt16 typeFlags; /**< type flags (copyright information) */ + sal_uInt32 typeFlags; /**< type flags (copyright bits + PS-OpenType flag) */ } TTGlobalFontInfo; +#define TYPEFLAG_INVALID 0x8000000 +#define TYPEFLAG_COPYRIGHT_MASK 0x000000E +#define TYPEFLAG_PS_OPENTYPE 0x0010000 + /** Structure used by KernGlyphs() */ typedef struct { int x; /**< positive: right, negative: left */ @@ -569,6 +566,12 @@ namespace vcl */ int GetTTGlyphCount( TrueTypeFont* ttf ); +/** + * provide access to the raw data of a SFNT-container's subtable + */ + bool GetSfntTable( TrueTypeFont* ttf, int nSubtableIndex, + const sal_uInt8** ppRawBytes, int* pRawLength ); + /*- private definitions */ /*FOLD00*/ struct _TrueTypeFont { @@ -590,14 +593,14 @@ namespace vcl sal_uInt32 unitsPerEm; sal_uInt32 numberOfHMetrics; sal_uInt32 numOfLongVerMetrics; /* if this number is not 0, font has vertical metrics information */ - sal_uInt8 *cmap; + const sal_uInt8* cmap; int cmapType; sal_uInt32 (*mapper)(const sal_uInt8 *, sal_uInt32); /* character to glyphID translation function */ - sal_uInt8 **tables; /* array of pointers to raw subtables in SFNT file */ + const sal_uInt8 **tables; /* array of pointers to raw subtables in SFNT file */ sal_uInt32 *tlens; /* array of table lengths */ int kerntype; /* Defined in the KernType enum */ sal_uInt32 nkern; /* number of kern subtables */ - sal_uInt8 **kerntables; /* array of pointers to kern subtables */ + const sal_uInt8** kerntables; /* array of pointers to kern subtables */ void *pGSubstitution; /* info provided by GSUB for UseGSUB() */ }; @@ -619,7 +622,8 @@ namespace vcl #define O_prep 14 /* 'prep' - only used in TT->TT generation */ #define O_fpgm 15 /* 'fpgm' - only used in TT->TT generation */ #define O_gsub 16 /* 'GSUB' */ -#define NUM_TAGS 17 +#define O_CFF 17 /* 'CFF' */ +#define NUM_TAGS 18 } // namespace vcl diff --git a/vcl/inc/vcl/bitmapex.hxx b/vcl/inc/vcl/bitmapex.hxx index 3da80ce8c2f1..e5ddf50f1efa 100644 --- a/vcl/inc/vcl/bitmapex.hxx +++ b/vcl/inc/vcl/bitmapex.hxx @@ -381,6 +381,19 @@ public: const BmpFilterParam* pFilterParam = NULL, const Link* pProgress = NULL ); + /** Get transparency at given position + + @param nX + integer X-Position in Bitmap + + @param nY + integer Y-Position in Bitmap + + @return transparency value in the range of [0 .. 255] where + 0 is not transparent, 255 is fully transparent + */ + sal_uInt8 GetTransparency(sal_Int32 nX, sal_Int32 nY) const; + public: friend VCL_DLLPUBLIC SvStream& operator<<( SvStream& rOStm, const BitmapEx& rBitmapEx ); diff --git a/vcl/inc/vcl/button.hxx b/vcl/inc/vcl/button.hxx index 94df24a9cea7..b80edf6712cd 100644 --- a/vcl/inc/vcl/button.hxx +++ b/vcl/inc/vcl/button.hxx @@ -144,10 +144,10 @@ protected: SAL_DLLPRIVATE PushButton( const PushButton & ); SAL_DLLPRIVATE PushButton& operator=( const PushButton & ); -protected: - using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); + using Control::ImplInitSettings; + using Window::ImplInit; public: SAL_DLLPRIVATE void ImplSetDefButton( BOOL bSet ); SAL_DLLPRIVATE static void ImplDrawPushButtonFrame( Window* pDev, Rectangle& rRect, USHORT nStyle ); @@ -158,6 +158,10 @@ protected: PushButton( WindowType nType ); virtual void FillLayoutData() const; + virtual const Font& + GetCanonicalFont( const StyleSettings& _rStyle ) const; + virtual const Color& + GetCanonicalTextColor( const StyleSettings& _rStyle ) const; public: PushButton( Window* pParent, WinBits nStyle = 0 ); PushButton( Window* pParent, const ResId& rResId ); @@ -307,19 +311,20 @@ private: SAL_DLLPRIVATE void ImplDrawRadioButtonState(); SAL_DLLPRIVATE void ImplDraw( OutputDevice* pDev, ULONG nDrawFlags, const Point& rPos, const Size& rSize, - const Size& rImageSize, long nImageSep, - Rectangle& rStateRect, Rectangle& rMouseRect, - bool bLayout = false ); + const Size& rImageSize, Rectangle& rStateRect, + Rectangle& rMouseRect, bool bLayout = false ); SAL_DLLPRIVATE void ImplDrawRadioButton( bool bLayout = false ); SAL_DLLPRIVATE void ImplInvalidateOrDrawRadioButtonState(); SAL_DLLPRIVATE void ImplUncheckAllOther(); SAL_DLLPRIVATE Size ImplGetRadioImageSize() const; + SAL_DLLPRIVATE long ImplGetImageToTextDistance() const; // Copy assignment is forbidden and not implemented. SAL_DLLPRIVATE RadioButton(const RadioButton &); SAL_DLLPRIVATE RadioButton& operator= (const RadioButton &); protected: + using Control::ImplInitSettings; using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); SAL_DLLPRIVATE void ImplLoadRes( const ResId& rResId ); @@ -330,6 +335,10 @@ public: protected: virtual void FillLayoutData() const; + virtual const Font& + GetCanonicalFont( const StyleSettings& _rStyle ) const; + virtual const Color& + GetCanonicalTextColor( const StyleSettings& _rStyle ) const; inline void SetMouseRect( const Rectangle& _rMouseRect ) { maMouseRect = _rMouseRect; } inline const Rectangle& GetMouseRect( ) const { return maMouseRect; } @@ -420,10 +429,10 @@ private: SAL_DLLPRIVATE void ImplInvalidateOrDrawCheckBoxState(); SAL_DLLPRIVATE void ImplDraw( OutputDevice* pDev, ULONG nDrawFlags, const Point& rPos, const Size& rSize, - const Size& rImageSize, long nImageSep, - Rectangle& rStateRect, + const Size& rImageSize, Rectangle& rStateRect, Rectangle& rMouseRect, bool bLayout ); SAL_DLLPRIVATE void ImplDrawCheckBox( bool bLayout = false ); + SAL_DLLPRIVATE long ImplGetImageToTextDistance() const; SAL_DLLPRIVATE Size ImplGetCheckImageSize() const; // Copy assignment is forbidden and not implemented. @@ -431,10 +440,15 @@ private: SAL_DLLPRIVATE CheckBox& operator= (const CheckBox &); protected: + using Control::ImplInitSettings; using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); SAL_DLLPRIVATE void ImplLoadRes( const ResId& rResId ); SAL_DLLPRIVATE virtual void FillLayoutData() const; + SAL_DLLPRIVATE virtual const Font& + GetCanonicalFont( const StyleSettings& _rStyle ) const; + SAL_DLLPRIVATE virtual const Color& + GetCanonicalTextColor( const StyleSettings& _rStyle ) const; public: SAL_DLLPRIVATE void ImplCheck(); diff --git a/vcl/inc/vcl/controldata.hxx b/vcl/inc/vcl/controldata.hxx new file mode 100644 index 000000000000..9ea698e792bd --- /dev/null +++ b/vcl/inc/vcl/controldata.hxx @@ -0,0 +1,60 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef VCL_CONTROLDATA_HXX +#define VCL_CONTROLDATA_HXX + +#include + +//........................................................................ +namespace vcl +{ +//........................................................................ + + //==================================================================== + //= ImplControlData + //==================================================================== + struct ImplControlData + { + mutable ControlLayoutData* mpLayoutData; + OutputDevice* mpReferenceDevice; + + ImplControlData() + :mpLayoutData( NULL ) + ,mpReferenceDevice( NULL ) + { + } + + ~ImplControlData() + { + delete mpLayoutData; + } + }; + +//........................................................................ +} // namespace vcl +//........................................................................ + +#endif // VCL_CONTROLDATA_HXX diff --git a/vcl/inc/vcl/ctrl.hxx b/vcl/inc/vcl/ctrl.hxx index 7bb5620ef93f..535f75549991 100644 --- a/vcl/inc/vcl/ctrl.hxx +++ b/vcl/inc/vcl/ctrl.hxx @@ -38,7 +38,7 @@ #include // forward -namespace vcl { struct ControlLayoutData; } +namespace vcl { struct ImplControlData; struct ControlLayoutData; } // ----------- // - Control - @@ -47,11 +47,12 @@ namespace vcl { struct ControlLayoutData; } class VCL_DLLPUBLIC Control : public Window { protected: - mutable vcl::ControlLayoutData* mpLayoutData; + ::vcl::ImplControlData* mpControlData; + private: - BOOL mbHasFocus; - Link maGetFocusHdl; - Link maLoseFocusHdl; + BOOL mbHasFocus; + Link maGetFocusHdl; + Link maLoseFocusHdl; SAL_DLLPRIVATE void ImplInitControlData(); @@ -66,6 +67,14 @@ protected: // helper method for composite controls void AppendLayoutData( const Control& rSubControl ) const; + /// creates the mpData->mpLayoutData structure + void CreateLayoutData() const; + /// determines whether we currently have layout data + bool HasLayoutData() const; + /// returns the current layout data + ::vcl::ControlLayoutData* + GetLayoutData() const; + /** this calls both our event listeners, and a specified handler If the Control instance is destroyed during any of those calls, the @@ -84,6 +93,25 @@ protected: ULONG nEvent, const Link& rHandler, void* pCaller ); + /** draws the given text onto the given device + + If no reference device is set, the draw request will simply be forwarded to OutputDevice::DrawText. Otherwise, + the text will be rendered according to the metrics at the reference device. + + Note that the given rectangle might be modified, it will contain the result of a GetTextRect call (either + directly at the target device, or taking the reference device into account) when returning. + */ + void DrawControlText( OutputDevice& _rTargetDevice, Rectangle& _io_rRect, + const XubString& _rStr, USHORT _nStyle, + MetricVector* _pVector, String* _pDisplayText ) const; + + virtual const Font& + GetCanonicalFont( const StyleSettings& _rStyle ) const; + virtual const Color& + GetCanonicalTextColor( const StyleSettings& _rStyle ) const; + + void ImplInitSettings( const BOOL _bFont, const BOOL _bForeground ); + //#if 0 // _SOLAR__PRIVATE public: SAL_DLLPRIVATE void ImplClearLayoutData() const; @@ -157,6 +185,20 @@ public: void SetLayoutDataParent( const Control* pParent ) const; virtual Size GetOptimalSize(WindowSizeType eType) const; + + /** sets a reference device used for rendering control text + @seealso DrawControlText + */ + void SetReferenceDevice( OutputDevice* _referenceDevice ); + OutputDevice* GetReferenceDevice() const; + + Font GetUnzoomedControlPointFont() const + { + Font aFont( GetCanonicalFont( GetSettings().GetStyleSettings() ) ); + if ( IsControlFont() ) + aFont.Merge( GetControlFont() ); + return aFont; + } }; #endif // _SV_CTRL_HXX diff --git a/vcl/inc/vcl/dialog.hxx b/vcl/inc/vcl/dialog.hxx index f34db3a2a5db..c5f032dfff82 100644 --- a/vcl/inc/vcl/dialog.hxx +++ b/vcl/inc/vcl/dialog.hxx @@ -65,6 +65,7 @@ private: SAL_DLLPRIVATE Dialog (const Dialog &); SAL_DLLPRIVATE Dialog & operator= (const Dialog &); + DECL_DLLPRIVATE_LINK( ImplAsyncCloseHdl, void* ); protected: using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); diff --git a/vcl/inc/vcl/edit.hxx b/vcl/inc/vcl/edit.hxx index 534d63b3427c..fb99bd028631 100644 --- a/vcl/inc/vcl/edit.hxx +++ b/vcl/inc/vcl/edit.hxx @@ -124,6 +124,7 @@ private: SAL_DLLPRIVATE ::com::sun::star::uno::Reference < ::com::sun::star::i18n::XBreakIterator > ImplGetBreakIterator() const; protected: + using Control::ImplInitSettings; using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); SAL_DLLPRIVATE WinBits ImplInitStyle( WinBits nStyle ); diff --git a/vcl/inc/vcl/fixbrd.hxx b/vcl/inc/vcl/fixbrd.hxx index 52de68d1c71f..68e1e69b9054 100644 --- a/vcl/inc/vcl/fixbrd.hxx +++ b/vcl/inc/vcl/fixbrd.hxx @@ -57,6 +57,7 @@ private: BOOL mbTransparent; private: + using Control::ImplInitSettings; using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); SAL_DLLPRIVATE WinBits ImplInitStyle( WinBits nStyle ); diff --git a/vcl/inc/vcl/fixed.hxx b/vcl/inc/vcl/fixed.hxx index ba576f280b83..a5c834fce486 100644 --- a/vcl/inc/vcl/fixed.hxx +++ b/vcl/inc/vcl/fixed.hxx @@ -47,6 +47,7 @@ class VCL_DLLPUBLIC FixedText : public Control { //#if 0 // _SOLAR__PRIVATE private: + using Control::ImplInitSettings; using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); SAL_DLLPRIVATE WinBits ImplInitStyle( WinBits nStyle ); @@ -58,6 +59,11 @@ public: //#endif protected: virtual void FillLayoutData() const; + virtual const Font& + GetCanonicalFont( const StyleSettings& _rStyle ) const; + virtual const Color& + GetCanonicalTextColor( const StyleSettings& _rStyle ) const; + public: FixedText( Window* pParent, WinBits nStyle = 0 ); FixedText( Window* pParent, const ResId& rResId ); @@ -81,6 +87,7 @@ public: class VCL_DLLPUBLIC FixedLine : public Control { private: + using Control::ImplInitSettings; using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); SAL_DLLPRIVATE WinBits ImplInitStyle( WinBits nStyle ); @@ -89,6 +96,10 @@ private: protected: virtual void FillLayoutData() const; + virtual const Font& + GetCanonicalFont( const StyleSettings& _rStyle ) const; + virtual const Color& + GetCanonicalTextColor( const StyleSettings& _rStyle ) const; public: FixedLine( Window* pParent, WinBits nStyle = WB_HORZ ); @@ -113,6 +124,7 @@ private: Bitmap maBitmap; Bitmap maBitmapHC; + using Control::ImplInitSettings; using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); SAL_DLLPRIVATE WinBits ImplInitStyle( WinBits nStyle ); @@ -153,6 +165,7 @@ private: BOOL mbInUserDraw; private: + using Control::ImplInitSettings; using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); SAL_DLLPRIVATE WinBits ImplInitStyle( WinBits nStyle ); diff --git a/vcl/inc/vcl/fldunit.hxx b/vcl/inc/vcl/fldunit.hxx index 98bc27cbadba..7417342d95be 100644 --- a/vcl/inc/vcl/fldunit.hxx +++ b/vcl/inc/vcl/fldunit.hxx @@ -31,14 +31,6 @@ #ifndef _VCL_FLDUNIT_HXX #define _VCL_FLDUNIT_HXX -// -------------- -// - FieldTypes - -// -------------- - -// By changes you must also change: rsc/vclrsc.hxx -enum FieldUnit { FUNIT_NONE, FUNIT_MM, FUNIT_CM, FUNIT_M, FUNIT_KM, - FUNIT_TWIP, FUNIT_POINT, FUNIT_PICA, - FUNIT_INCH, FUNIT_FOOT, FUNIT_MILE, FUNIT_CUSTOM, - FUNIT_PERCENT, FUNIT_100TH_MM }; +#include #endif // _VCL_FLDUNIT_HXX diff --git a/vcl/inc/vcl/floatwin.hxx b/vcl/inc/vcl/floatwin.hxx index 8dcba41e2a8e..02ac18ac28f8 100644 --- a/vcl/inc/vcl/floatwin.hxx +++ b/vcl/inc/vcl/floatwin.hxx @@ -157,6 +157,8 @@ public: const Link& GetPopupModeEndHdl() const { return maPopupModeEndHdl; } BOOL GrabsFocus() const { return mbGrabFocus; } + + static Point CalcFloatingPosition( Window* pWindow, const Rectangle& rRect, ULONG nFlags, USHORT& rArrangeIndex ); }; #endif // _SV_FLOATWIN_HXX diff --git a/vcl/inc/vcl/fontmanager.hxx b/vcl/inc/vcl/fontmanager.hxx index bdfd30d12f7f..edd7a787ae3d 100644 --- a/vcl/inc/vcl/fontmanager.hxx +++ b/vcl/inc/vcl/fontmanager.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: fontmanager.hxx,v $ - * $Revision: 1.36 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -51,6 +48,7 @@ // forward declarations namespace utl { class MultiAtomProvider; } // see unotools/atom.hxx +class FontSubsetInfo; namespace psp { class PPDParser; // see ppdparser.hxx @@ -166,6 +164,8 @@ struct FastPrintFontInfo rtl_TextEncoding m_aEncoding; fcstatus::type m_eEmbeddedbitmap; fcstatus::type m_eAntialias; + bool m_bSubsettable; + bool m_bEmbeddable; FastPrintFontInfo() : m_nID( 0 ), @@ -328,9 +328,9 @@ class VCL_DLLPUBLIC PrintFontManager rtl::OString m_aFontFile; // relative to directory rtl::OString m_aXLFD; // mainly for administration, contains the XLFD from fonts.dir int m_nCollectionEntry; // -1 for regular fonts, 0 to ... for fonts stemming from collections - unsigned int m_nTypeFlags; // from TrueType file; only known use is for copyright flags + unsigned int m_nTypeFlags; // copyright bits and PS-OpenType flag - TrueTypeFontFile() : PrintFont( fonttype::TrueType ), m_nDirectory( 0 ), m_nCollectionEntry(-1), m_nTypeFlags( 0x80000000 ) {} + TrueTypeFontFile(); virtual ~TrueTypeFontFile(); virtual bool queryMetricPage( int nPage, utl::MultiAtomProvider* pProvider ); }; @@ -648,7 +648,9 @@ public: // nGlyphs: number of glyphs in arrays // pCapHeight:: capital height of the produced font // pXMin, pYMin, pXMax, pYMax: outgoing font bounding box - bool createFontSubset( fontID nFont, + // TODO: callers of this method should use its FontSubsetInfo counterpart directly + bool createFontSubset( FontSubsetInfo&, + fontID nFont, const rtl::OUString& rOutFile, sal_Int32* pGlyphIDs, sal_uInt8* pNewEncoding, diff --git a/vcl/inc/vcl/fontsubset.hxx b/vcl/inc/vcl/fontsubset.hxx new file mode 100644 index 000000000000..3032490dcbab --- /dev/null +++ b/vcl/inc/vcl/fontsubset.hxx @@ -0,0 +1,97 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _SV_FONTSUBSET_HXX +#define _SV_FONTSUBSET_HXX + +#include +#include +#include + +namespace vcl { struct _TrueTypeFont; } // SFT's idea of a TTF font + +class FontSubsetInfo +{ +public: + explicit FontSubsetInfo( void ); + virtual ~FontSubsetInfo( void ); + + enum FontType { + NO_FONT = 0, + SFNT_TTF = 1<<1, // SFNT container with TrueType glyphs + SFNT_CFF = 1<<2, // SFNT container with CFF-container + TYPE1_PFA = 1<<3, // PSType1 Postscript Font Ascii + TYPE1_PFB = 1<<4, // PSType1 Postscript Font Binary + CFF_FONT = 1<<5, // CFF-container with PSType2 glyphs + TYPE3_FONT = 1<<6, // PSType3 Postscript font + TYPE42_FONT = 1<<7, // PSType42 wrapper for an SFNT_TTF + ANY_SFNT = SFNT_TTF | SFNT_CFF, + ANY_TYPE1 = TYPE1_PFA | TYPE1_PFB, + ANY_FONT = 0xFF + }; + + bool LoadFont( FontType eInFontType, + const unsigned char* pFontBytes, int nByteLength ); + bool LoadFont( vcl::_TrueTypeFont* pSftTrueTypeFont ); + + bool CreateFontSubset( int nOutFontTypeMask, + FILE* pOutFile, const char* pOutFontName, + const long* pReqGlyphIds, const sal_uInt8* pEncodedIds, + int nReqGlyphCount, sal_Int32* pOutGlyphWidths = NULL ); + +public: // TODO: make subsetter results private and provide accessor methods instead + // subsetter-provided subset details needed by e.g. Postscript or PDF + String m_aPSName; + int m_nAscent; // all metrics in PS font units + int m_nDescent; + int m_nCapHeight; + Rectangle m_aFontBBox; + FontType m_nFontType; // font-type of subset result + +private: + // input-font-specific details + unsigned const char* mpInFontBytes; + int mnInByteLength; + FontType meInFontType; // allowed mask of input font-types + vcl::_TrueTypeFont* mpSftTTFont; + + // subset-request details + int mnReqFontTypeMask; // allowed subset-target font types + FILE* mpOutFile; + const char* mpReqFontName; + const long* mpReqGlyphIds; + const sal_uInt8* mpReqEncodedIds; + int mnReqGlyphCount; + +protected: + bool CreateFontSubsetFromCff( sal_Int32* pOutGlyphWidths = NULL ); + bool CreateFontSubsetFromSfnt( sal_Int32* pOutGlyphWidths = NULL ); + bool CreateFontSubsetFromType1( sal_Int32* pOutGlyphWidths = NULL ); +}; + +#endif // _SV_FONTSUBSET_HXX + diff --git a/vcl/inc/vcl/gdimtf.hxx b/vcl/inc/vcl/gdimtf.hxx index 62439d4d4613..c53460d35584 100644 --- a/vcl/inc/vcl/gdimtf.hxx +++ b/vcl/inc/vcl/gdimtf.hxx @@ -164,6 +164,14 @@ public: void Scale( double fScaleX, double fScaleY ); void Scale( const Fraction& rScaleX, const Fraction& rScaleY ); void Rotate( long nAngle10 ); + /* get the bound rect of the contained actions + * caveats: + * - clip actions will limit the contained actions, + * but the current clipregion of the passed OutputDevice will not + * - coordinates of actions will be transformed to preferred mapmode + * - the returned rectangle is relative to the preferred mapmode of the metafile + */ + Rectangle GetBoundRect( OutputDevice& i_rReference ); void Adjust( short nLuminancePercent = 0, short nContrastPercent = 0, short nChannelRPercent = 0, short nChannelGPercent = 0, diff --git a/vcl/inc/vcl/glyphcache.hxx b/vcl/inc/vcl/glyphcache.hxx index 637feee34839..33a7c80b7746 100644 --- a/vcl/inc/vcl/glyphcache.hxx +++ b/vcl/inc/vcl/glyphcache.hxx @@ -50,6 +50,7 @@ struct ImplKernPairData; namespace basegfx { class B2DPolyPolygon; } class RawBitmap; +class CmapResult; #include @@ -189,7 +190,7 @@ public: virtual void FetchFontMetric( ImplFontMetricData&, long& rFactor ) const = 0; virtual ULONG GetKernPairs( ImplKernPairData** ) const { return 0; } virtual int GetGlyphKernValue( int, int ) const { return 0; } - virtual ULONG GetFontCodeRanges( sal_uInt32* ) const { return 0; } + virtual bool GetFontCodeRanges( CmapResult& ) const { return false; } Point TransformPoint( const Point& ) const; GlyphData& GetGlyphData( int nGlyphIndex ); diff --git a/vcl/inc/vcl/graph.hxx b/vcl/inc/vcl/graph.hxx index f56c55b7db42..5f5fa8eff6ce 100644 --- a/vcl/inc/vcl/graph.hxx +++ b/vcl/inc/vcl/graph.hxx @@ -53,6 +53,36 @@ class OutputDevice; class Font; class GfxLink; +class VCL_DLLPUBLIC GraphicConversionParameters +{ +private: + Size maSizePixel; // default is (0,0) + + // bitfield + unsigned mbUnlimitedSize : 1; // default is false + unsigned mbAntiAliase : 1; // default is false + unsigned mbSnapHorVerLines : 1; // default is false + +public: + GraphicConversionParameters( + const Size& rSizePixel = Size(), + bool bUnlimitedSize = false, + bool bAntiAliase = false, + bool bSnapHorVerLines = false) + : maSizePixel(rSizePixel), + mbUnlimitedSize(bUnlimitedSize), + mbAntiAliase(bAntiAliase), + mbSnapHorVerLines(bSnapHorVerLines) + { + } + + // data read access + const Size getSizePixel() const { return maSizePixel; } + bool getUnlimitedSize() const { return mbUnlimitedSize; } + bool getAntiAliase() const { return mbAntiAliase; } + bool getSnapHorVerLines() const { return mbSnapHorVerLines; } +}; + class VCL_DLLPUBLIC Graphic : public SvDataCopyStream { private: @@ -96,12 +126,14 @@ public: BOOL IsAlpha() const; BOOL IsAnimated() const; - Bitmap GetBitmap() const; - Bitmap GetBitmap( const Size* pSizePixel ) const; - BitmapEx GetBitmapEx() const; - BitmapEx GetBitmapEx( const Size* pSizePixel ) const; - Bitmap GetUnlimitedBitmap( const Size* pSizePixel ) const; - BitmapEx GetUnlimitedBitmapEx( const Size* pSizePixel ) const; + // #i102089# Access of Bitmap potentially will have to rasterconvert the Graphic + // if it is a MetaFile. To be able to control this conversion it is necessary to + // allow giving parameters which control AntiAliasing and LineSnapping of the + // MetaFile when played. Defaults will use a no-AAed, not snapped conversion as + // before. + Bitmap GetBitmap(const GraphicConversionParameters& rParameters = GraphicConversionParameters()) const; + BitmapEx GetBitmapEx(const GraphicConversionParameters& rParameters = GraphicConversionParameters()) const; + Animation GetAnimation() const; const GDIMetaFile& GetGDIMetaFile() const; @@ -174,7 +206,7 @@ public: BOOL IsSwapOut() const; void SetLink( const GfxLink& ); - GfxLink GetLink(); + GfxLink GetLink() const; BOOL IsLink() const; BOOL ExportNative( SvStream& rOStream ) const; diff --git a/vcl/inc/vcl/graphite_adaptors.hxx b/vcl/inc/vcl/graphite_adaptors.hxx new file mode 100644 index 000000000000..41ffa00b0f8f --- /dev/null +++ b/vcl/inc/vcl/graphite_adaptors.hxx @@ -0,0 +1,154 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _SV_GRAPHITEADAPTORS_HXX +#define _SV_GRAPHITEADAPTORS_HXX + +// We need this to enable namespace support in libgrengine headers. +#define GR_NAMESPACE + +// Standard Library +#include +// Platform + +#ifndef _SVWIN_H +#include +#endif + +#ifndef _SV_SVSYS_HXX +#include +#endif + +#ifndef _SV_SALGDI_HXX +#include +#endif + +#ifndef _SV_SALLAYOUT_HXX +#include +#endif + +// Module +#include "vcl/dllapi.h" + +// Libraries +#include +#include +#include + + +// Module type definitions and forward declarations. +// +#ifndef MSC +// SAL/VCL types +class ServerFont; +class FreetypeServerFont; + +// Graphite types + +struct FontProperties : gr::FontProps +{ + FontProperties(const FreetypeServerFont & font) throw(); +}; + +namespace grutils +{ + class GrFeatureParser; +} + +// This class adapts the Sal font and graphics services to form required by +// the Graphite engine. +// @author tse +// +class VCL_DLLPUBLIC GraphiteFontAdaptor : public gr::Font +{ +typedef std::map > GlyphMetricMap; + +public: + static bool IsGraphiteEnabledFont(ServerFont &) throw(); + + GraphiteFontAdaptor(ServerFont & font, const sal_Int32 dpi_x, const sal_Int32 dpi_y); + GraphiteFontAdaptor(const GraphiteFontAdaptor &) throw(); + ~GraphiteFontAdaptor() throw(); + + gr::Font * copyThis(); + + // Basic attribute accessors. + virtual float ascent(); + virtual float descent(); + virtual bool bold(); + virtual bool italic(); + virtual float height(); + virtual unsigned int getDPIx(); + virtual unsigned int getDPIy(); + + // Font access methods. + virtual const void * getTable(gr::fontTableId32 tableID, size_t * pcbSize); + virtual void getFontMetrics(float * ascent_out, float * descent_out = 0, float * em_square_out = 0); + + // Glyph metrics. + virtual void getGlyphMetrics(gr::gid16 glyphID, gr::Rect & boundingBox, gr::Point & advances); + + // Adaptor attributes. + const FontProperties & fontProperties() const throw(); + FreetypeServerFont & font() const throw(); + const grutils::GrFeatureParser * features() const { return mpFeatures; }; + +private: + virtual void UniqueCacheInfo(std::wstring &, bool &, bool &); + + FreetypeServerFont& mrFont; + FontProperties maFontProperties; + const unsigned int mnDpiX, mnDpiY; + const float mfAscent, + mfDescent, + mfEmUnits; + grutils::GrFeatureParser * mpFeatures; + GlyphMetricMap maGlyphMetricMap; +}; + +// Partial implementation of class GraphiteFontAdaptor. +// +inline const FontProperties & GraphiteFontAdaptor::fontProperties() const throw() { + return maFontProperties; +} + +inline FreetypeServerFont & GraphiteFontAdaptor::font() const throw() { + return mrFont; +} +#endif // not MFC + +// Partial implementation of class TextSourceAdaptor. +// +//inline const ImplLayoutArgs & TextSourceAdaptor::layoutArgs() const throw() { +// return _layout_args; +//} + + +#endif // _SV_GRAPHITEADAPTORS_HXX diff --git a/vcl/inc/vcl/graphite_cache.hxx b/vcl/inc/vcl/graphite_cache.hxx new file mode 100644 index 000000000000..5a537c5f1e48 --- /dev/null +++ b/vcl/inc/vcl/graphite_cache.hxx @@ -0,0 +1,265 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// Description: Classes to cache Graphite Segments to try to improve +// rendering performance. + +#ifndef GraphiteSegmentCache_h +#define GraphiteSegmentCache_h + +#include +#include + +#define GRCACHE_REUSE_VECTORS 1 + +//#include +#include + +class TextSourceAdaptor; +/** +* GrSegRecord stores a Graphite Segment and its associated text +*/ +class GrSegRecord { +public: + GrSegRecord(rtl::OUString * rope, TextSourceAdaptor * textSrc, gr::Segment * seg, bool bIsRtl); + + ~GrSegRecord(); + + void reuse(rtl::OUString * rope, TextSourceAdaptor * textSrc, gr::Segment * seg, bool bIsRtl); + + void clearVectors(); + void clear(); +#ifdef GRCACHE_REUSE_VECTORS + void setGlyphVectors(long nWidth, GraphiteLayout::Glyphs & vGlyphs, std::vector vCharDxs, + std::vector & vChar2Base, std::vector & vGlyph2Char) + { + clearVectors(); + mnWidth = nWidth; + mvGlyphs.insert(mvGlyphs.begin(), vGlyphs.begin(), vGlyphs.end()); + mvCharDxs.insert(mvCharDxs.begin(),vCharDxs.begin(),vCharDxs.end()); + mvChar2BaseGlyph.insert(mvChar2BaseGlyph.begin(),vChar2Base.begin(),vChar2Base.end()); + mvGlyph2Char.insert(mvGlyph2Char.begin(),vGlyph2Char.begin(),vGlyph2Char.end()); + } +#endif + gr::Segment * getSegment() { return m_seg; } + TextSourceAdaptor * getTextSrc() { return m_text; } + void unlock() { --m_lockCount; } + bool isRtl() const { return mbIsRtl; } +#ifdef GRCACHE_REUSE_VECTORS + const long & width() const { return mnWidth; } + const GraphiteLayout::Glyphs & glyphs() const { return mvGlyphs; } + const std::vector & charDxs() const { return mvCharDxs; } + const std::vector & char2BaseGlyph() const { return mvChar2BaseGlyph; } + const std::vector & glyph2Char() const { return mvGlyph2Char; } +#endif +private: + rtl::OUString * m_rope; + TextSourceAdaptor * m_text; + gr::Segment * m_seg; + const xub_Unicode * m_nextKey; + const xub_Unicode* m_pStr; + size_t m_startChar; + float m_fontScale; + long mnWidth; + GraphiteLayout::Glyphs mvGlyphs; // glyphs in display order + std::vector mvCharDxs; // right hand side x offset of each glyph + std::vector mvChar2BaseGlyph; + std::vector mvGlyph2Char; + bool mbIsRtl; + int m_lockCount; + friend class GraphiteSegmentCache; +}; + +typedef std::hash_map > GraphiteSegMap; +typedef std::hash_multimap GraphiteRopeMap; +typedef std::pair GrRMEntry; + +/** +* GraphiteSegmentCache contains the cached Segments for one particular font size +*/ +class GraphiteSegmentCache +{ + enum { + // not really sure what good values are here, + // bucket size should be >> cache size + SEG_BUCKET_SIZE = 4096, + SEG_CACHE_SIZE = 255 + }; +public: + GraphiteSegmentCache() + : m_segMap(SEG_BUCKET_SIZE), + m_oldestKey(NULL) {}; + ~GraphiteSegmentCache() + { + m_ropeMap.clear(); + GraphiteSegMap::iterator i = m_segMap.begin(); + while (i != m_segMap.end()) + { + GrSegRecord *r = i->second; + delete r; + ++i; + } + m_segMap.clear(); + }; + GrSegRecord * getSegment(ImplLayoutArgs & layoutArgs, bool bIsRtl) + { + GrSegRecord * found = NULL; + // try to find a segment starting at correct place, if not, try to find a + // match for the complete buffer + GraphiteSegMap::iterator iMap = + m_segMap.find(reinterpret_cast(layoutArgs.mpStr + + layoutArgs.mnMinCharPos)); + if (iMap != m_segMap.end()) + { + found = iMap->second; + } + else + { + iMap = m_segMap.find(reinterpret_cast(layoutArgs.mpStr)); + if (iMap != m_segMap.end()) + { + found = iMap->second; + } + } + if (found) + { + if (found->m_seg->startCharacter() <= layoutArgs.mnMinCharPos && + found->m_seg->stopCharacter() >= layoutArgs.mnEndCharPos) + { + const size_t seg_char_limit = min(layoutArgs.mnLength, layoutArgs.mnEndCharPos + + GraphiteLayout::EXTRA_CONTEXT_LENGTH); + DBG_ASSERT(found && found->m_seg, "null entry in GraphiteSegmentCache"); + // restore original start character, in case it has changed + found->m_seg->setTextSourceOffset(found->m_startChar); + // check that characters are the same, at least in the range of + // interest + // We could use substr and ==, but substr does a copy, + // so its probably faster to do it like this + for (size_t i = layoutArgs.mnMinCharPos; i < seg_char_limit; i++) + { + //if (!found->m_rope->match(rtl::OUString(layoutArgs.mpStr[i], layoutArgs.mnLength), i - found->m_seg->startCharacter())) + if (found->m_rope->getStr()[i-found->m_seg->startCharacter()] != layoutArgs.mpStr[i]) + return NULL; + } + if (found->isRtl() != bIsRtl) + { + return NULL; + } +// if (found->m_lockCount != 0) +// OutputDebugString("Multple users of SegRecord!"); + found->m_lockCount++; + } + else found = NULL; + } + else + { + // the pointers aren't the same, but we might still have the same text in a segment + // this is expecially needed when editing a large paragraph + // each edit changes the pointers, but if we don't reuse any segments it gets very + // slow. + const size_t seg_char_limit = min(layoutArgs.mnLength, layoutArgs.mnEndCharPos + + GraphiteLayout::EXTRA_CONTEXT_LENGTH); + rtl::OUString * rope = new rtl::OUString(layoutArgs.mpStr + layoutArgs.mnMinCharPos, + seg_char_limit - layoutArgs.mnMinCharPos); + if (!rope) return NULL; + size_t nHash = (*(rope)).hashCode(); + GrRMEntry range = m_ropeMap.equal_range(nHash); + while (range.first != range.second) + { + found = range.first->second; + if (found->m_lockCount == 0) + { + if(rope->match(*(found->m_rope))) + { + // found, but the pointers are all wrong + found->m_seg->setTextSourceOffset(layoutArgs.mnMinCharPos); + // the switch is done in graphite_layout.cxx + //found->m_text->switchLayoutArgs(layoutArgs); + found->m_lockCount++; + break; + } + else + found = NULL; + } + else + found = NULL; + ++(range.first); + } + delete rope; + } + return found; + }; + GrSegRecord * cacheSegment(TextSourceAdaptor * adapter, gr::Segment * seg, bool bIsRtl); +private: + GraphiteSegMap m_segMap; + GraphiteRopeMap m_ropeMap; + const xub_Unicode * m_oldestKey; + const xub_Unicode * m_prevKey; +}; + +typedef std::hash_map > GraphiteCacheMap; + +/** +* GraphiteCacheHandler maps a particular font, style, size to a GraphiteSegmentCache +*/ +class GraphiteCacheHandler +{ +public: + GraphiteCacheHandler() : m_cacheMap(255) {}; + ~GraphiteCacheHandler() + { + GraphiteCacheMap::iterator i = m_cacheMap.begin(); + while (i != m_cacheMap.end()) + { + GraphiteSegmentCache *r = i->second; + delete r; + ++i; + } + m_cacheMap.clear(); + }; + + static GraphiteCacheHandler instance; + + GraphiteSegmentCache * getCache(sal_Int32 & fontHash) + { + if (m_cacheMap.count(fontHash) > 0) + { + return m_cacheMap.find(fontHash)->second; + } + GraphiteSegmentCache *pCache = new GraphiteSegmentCache(); + m_cacheMap[fontHash] = pCache; + return pCache; + } +private: + GraphiteCacheMap m_cacheMap; +}; + +#endif + diff --git a/vcl/inc/vcl/graphite_features.hxx b/vcl/inc/vcl/graphite_features.hxx new file mode 100644 index 000000000000..6cfe5dfca0fd --- /dev/null +++ b/vcl/inc/vcl/graphite_features.hxx @@ -0,0 +1,77 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// Description: +// Parse a string of features specified as ; separated pairs. +// e.g. +// 1001=1&2002=2&fav1=0 + +#include +#include +#include + +namespace grutils +{ + + class GrFeatureParser + { + public: + enum { MAX_FEATURES = 64 }; + static const char FEAT_PREFIX; + static const char FEAT_SEPARATOR; + static const char FEAT_ID_VALUE_SEPARATOR; + static const std::string ISO_LANG; + GrFeatureParser(gr::Font & font, const std::string features, const std::string lang); + GrFeatureParser(gr::Font & font, const std::string lang); + GrFeatureParser(const GrFeatureParser & copy); + ~GrFeatureParser(); + size_t getFontFeatures(gr::FeatureSetting settings[MAX_FEATURES]) const; + bool parseErrors() { return mbErrors; }; + static bool isValid(gr::Font & font, gr::FeatureSetting & setting); + gr::isocode getLanguage() const { return maLang; }; + bool hasLanguage() const { return (maLang.rgch[0] != '\0'); } + sal_Int32 hashCode() const; + private: + void setLang(gr::Font & font, const std::string & lang); + bool isCharId(const std::string & id, size_t offset, size_t length); + int getCharId(const std::string & id, size_t offset, size_t length); + int getIntValue(const std::string & id, size_t offset, size_t length); + size_t mnNumSettings; + gr::isocode maLang; + bool mbErrors; + gr::FeatureSetting maSettings[64]; + }; + + union FeatId + { + gr::featid num; + unsigned char label[5]; + }; +} diff --git a/vcl/inc/vcl/graphite_layout.hxx b/vcl/inc/vcl/graphite_layout.hxx new file mode 100644 index 000000000000..2ec3bc4c2391 --- /dev/null +++ b/vcl/inc/vcl/graphite_layout.hxx @@ -0,0 +1,167 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _SV_GRAPHITELAYOUT_HXX +#define _SV_GRAPHITELAYOUT_HXX +// Description: An implementation of the SalLayout interface that uses the +// Graphite engine. + +// We need this to enable namespace support in libgrengine headers. +#define GR_NAMESPACE + +#define GRCACHE 1 + +// Standard Library +#include +#include +#include +// Libraries +#include +#include +#include +#include +#include +// Platform +#include +#include +// Module + +// For backwards compatibility with 2.4.x +#if (SUPD == 680) +typedef sal_Int32 sal_GlyphId; +#endif + + +// Module type definitions and forward declarations. +// +class TextSourceAdaptor; +class GraphiteFontAdaptor; +class GrSegRecord; +// SAL/VCL types +class ServerFont; +// Graphite types +namespace gr { class Segment; class GlyphIterator; } +namespace grutils { class GrFeatureParser; } + +// This class uses the SIL Graphite engine to provide complex text layout services to the VCL +// @author tse +// +class VCL_DLLPUBLIC GraphiteLayout : public SalLayout +{ +public: + class Glyphs : public std::vector + { + public: + typedef std::pair iterator_pair_t; + + void fill_from(gr::Segment & rSeg, ImplLayoutArgs & rArgs, + bool bRtl, long &rWidth, float fScaling, + std::vector & rChar2Base, std::vector & rGlyph2Char, + std::vector & rCharDxs); + void move_glyph(Glyphs::iterator, long dx); + + const_iterator cluster_base(const_iterator) const; + iterator_pair_t neighbour_clusters(const_iterator) const; + private: + std::pair appendCluster(gr::Segment & rSeg, ImplLayoutArgs & rArgs, + bool bRtl, int nFirstCharInCluster, int nNextChar, + int nFirstGlyphInCluster, int nNextGlyph, float fScaling, + std::vector & rChar2Base, std::vector & rGlyph2Char, + std::vector & rCharDxs, long & rDXOffset); + void append(gr::Segment & rSeg, ImplLayoutArgs & rArgs, gr::GlyphInfo & rGi, float nextGlyphOrigin, float fScaling, std::vector & rChar2Base, std::vector & rGlyph2Char, std::vector & rCharDxs, long & rDXOffset, bool bIsBase); + }; + + mutable Glyphs mvGlyphs; + void clear(); + +private: + TextSourceAdaptor * mpTextSrc; // Text source. + gr::LayoutEnvironment maLayout; + const gr::Font &mrFont; + long mnWidth; + std::vector mvCharDxs; + std::vector mvChar2BaseGlyph; + std::vector mvGlyph2Char; + float mfScaling; + const grutils::GrFeatureParser * mpFeatures; + +public: + GraphiteLayout(const gr::Font & font, const grutils::GrFeatureParser * features = NULL) throw(); + + // used by upper layers + virtual bool LayoutText( ImplLayoutArgs& ); // first step of layout + // split into two stages to allow dc to be restored on the segment +#ifdef GRCACHE + gr::Segment * CreateSegment(ImplLayoutArgs& rArgs, GrSegRecord ** pRecord = NULL); + bool LayoutGlyphs(ImplLayoutArgs& rArgs, gr::Segment * pSegment, GrSegRecord * pSegRecord); +#else + gr::Segment * CreateSegment(ImplLayoutArgs& rArgs); + bool LayoutGlyphs(ImplLayoutArgs& rArgs, gr::Segment * pSegment); +#endif + + virtual void AdjustLayout( ImplLayoutArgs& ); // adjusting positions + + // methods using string indexing + virtual int GetTextBreak( long nMaxWidth, long nCharExtra=0, int nFactor=1 ) const; + virtual long FillDXArray( sal_Int32* pDXArray ) const; + virtual void ApplyDXArray(ImplLayoutArgs &rArgs, std::vector & rDeltaWidth); + + virtual void GetCaretPositions( int nArraySize, sal_Int32* pCaretXArray ) const; + + // methods using glyph indexing + virtual int GetNextGlyphs(int nLen, sal_GlyphId* pGlyphIdxAry, ::Point & rPos, int&, + sal_Int32* pGlyphAdvAry = 0, int* pCharPosAry = 0 ) const; + + // used by glyph+font+script fallback + virtual void MoveGlyph( int nStart, long nNewXPos ); + virtual void DropGlyph( int nStart ); + virtual void Simplify( bool bIsBase ); + + // Dummy implementation so layout can be shared between Linux/Windows + virtual void DrawText(SalGraphics&) const {}; + + virtual ~GraphiteLayout() throw(); + void SetFeatures(grutils::GrFeatureParser * aFeature) { mpFeatures = aFeature; } + void SetFontScale(float s) { mfScaling = s; }; + const TextSourceAdaptor * textSrc() const { return mpTextSrc; }; + virtual sal_GlyphId getKashidaGlyph(int & width) = 0; + void kashidaJustify(std::vector & rDeltaWidth, sal_GlyphId, int width); + + static const int EXTRA_CONTEXT_LENGTH; +private: + int glyph_to_char(Glyphs::iterator); + std::pair glyph_to_chars(const GlyphItem &) const; + + std::pair caret_positions(size_t) const; +}; + + + +#endif // _SV_GRAPHITELAYOUT_HXX diff --git a/vcl/inc/vcl/graphite_serverfont.hxx b/vcl/inc/vcl/graphite_serverfont.hxx new file mode 100644 index 000000000000..d9e6670df79b --- /dev/null +++ b/vcl/inc/vcl/graphite_serverfont.hxx @@ -0,0 +1,103 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _SV_GRAPHITESERVERFONT_HXX +#define _SV_GRAPHITESERVERFONT_HXX + +// We need this to enable namespace support in libgrengine headers. +#define GR_NAMESPACE + +#ifndef MSC +#include +#include + +// Modules + +class VCL_DLLPUBLIC GraphiteLayoutImpl : public GraphiteLayout +{ +public: + GraphiteLayoutImpl(const gr::Font & font, const grutils::GrFeatureParser * features, GraphiteFontAdaptor * pFont) throw() + : GraphiteLayout(font, features), mpFont(pFont) {}; + virtual ~GraphiteLayoutImpl() throw() {}; + virtual sal_GlyphId getKashidaGlyph(int & width); +private: + GraphiteFontAdaptor * mpFont; +}; + +// This class implments the server font specific parts. +// @author tse +// +class VCL_DLLPUBLIC GraphiteServerFontLayout : public ServerFontLayout +{ +private: + mutable GraphiteFontAdaptor * mpFont; + // mutable so that the DrawOffset/DrawBase can be set + mutable GraphiteLayoutImpl maImpl; +public: + GraphiteServerFontLayout(GraphiteFontAdaptor * font) throw(); + + virtual bool LayoutText( ImplLayoutArgs& rArgs) { SalLayout::AdjustLayout(rArgs); return maImpl.LayoutText(rArgs); }; // first step of layout + virtual void AdjustLayout( ImplLayoutArgs& rArgs) + { + SalLayout::AdjustLayout(rArgs); + maImpl.DrawBase() = maDrawBase; + maImpl.DrawOffset() = maDrawOffset; + maImpl.AdjustLayout(rArgs); + }; + virtual long GetTextWidth() const { return maImpl.GetTextWidth(); } + virtual long FillDXArray( sal_Int32* dxa ) const { return maImpl.FillDXArray(dxa); } + virtual int GetTextBreak( long mw, long ce, int f ) const { return maImpl.GetTextBreak(mw, ce, f); } + virtual void GetCaretPositions( int as, sal_Int32* cxa ) const { maImpl.GetCaretPositions(as, cxa); } + + // used by display layers + virtual int GetNextGlyphs( int l, sal_GlyphId* gia, Point& p, int& s, + sal_Int32* gaa = NULL, int* cpa = NULL ) const + { + maImpl.DrawBase() = maDrawBase; + maImpl.DrawOffset() = maDrawOffset; + return maImpl.GetNextGlyphs(l, gia, p, s, gaa, cpa); + } + + virtual void MoveGlyph( int nStart, long nNewXPos ) { maImpl.MoveGlyph(nStart, nNewXPos); }; + virtual void DropGlyph( int nStart ) { maImpl.DropGlyph(nStart); }; + virtual void Simplify( bool bIsBase ) { maImpl.Simplify(bIsBase); }; + + virtual ~GraphiteServerFontLayout() throw(); + +// For use with PspGraphics + const sal_Unicode* getTextPtr() const; + int getMinCharPos() const { return mnMinCharPos; } + int getMaxCharPos() const { return mnEndCharPos; } +}; + + + +#endif +#endif //_SV_GRAPHITESERVERFONT_HXX diff --git a/vcl/inc/vcl/group.hxx b/vcl/inc/vcl/group.hxx index 0e84344587c7..7d5dd43fbee3 100644 --- a/vcl/inc/vcl/group.hxx +++ b/vcl/inc/vcl/group.hxx @@ -42,6 +42,7 @@ class VCL_DLLPUBLIC GroupBox : public Control { private: + using Control::ImplInitSettings; using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); SAL_DLLPRIVATE WinBits ImplInitStyle( WinBits nStyle ); @@ -50,6 +51,10 @@ private: const Point& rPos, const Size& rSize, bool bLayout = false ); virtual void FillLayoutData() const; + virtual const Font& + GetCanonicalFont( const StyleSettings& _rStyle ) const; + virtual const Color& + GetCanonicalTextColor( const StyleSettings& _rStyle ) const; public: GroupBox( Window* pParent, WinBits nStyle = 0 ); diff --git a/vcl/inc/vcl/ilstbox.hxx b/vcl/inc/vcl/ilstbox.hxx index e5f6696005fa..81dd32ef2705 100644 --- a/vcl/inc/vcl/ilstbox.hxx +++ b/vcl/inc/vcl/ilstbox.hxx @@ -369,6 +369,7 @@ public: void SetReadOnly( BOOL bReadOnly ) { mbReadOnly = bReadOnly; } BOOL IsReadOnly() const { return mbReadOnly; } + using Control::ImplInitSettings; void ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ); USHORT ImplGetTextStyle() const; diff --git a/vcl/inc/vcl/impfont.hxx b/vcl/inc/vcl/impfont.hxx index 90d8793f513f..e2b1889e8e0e 100644 --- a/vcl/inc/vcl/impfont.hxx +++ b/vcl/inc/vcl/impfont.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: impfont.hxx,v $ - * $Revision: 1.3.134.1 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -140,14 +137,15 @@ public: // - ImplFontCharMap - // ------------------- +class CmapResult; + class VCL_DLLPUBLIC ImplFontCharMap { public: - ImplFontCharMap( int nRangePairs, - const sal_uInt32* pRangeCodes, - const int* pStartGlyphs = NULL ); + explicit ImplFontCharMap( const CmapResult& ); + + static ImplFontCharMap* GetDefaultMap( bool bSymbols=false); -static ImplFontCharMap* GetDefaultMap(); bool IsDefaultMap() const; bool HasChar( sal_uInt32 ) const; int CountCharsInRange( sal_uInt32 cMin, sal_uInt32 cMax ) const; @@ -165,34 +163,46 @@ static ImplFontCharMap* GetDefaultMap(); void AddReference(); void DeReference(); - int GetGlyphIndex( sal_uInt32 ); + int GetGlyphIndex( sal_uInt32 ) const; private: - ~ImplFontCharMap(); + /*virtual*/ ~ImplFontCharMap(); int ImplFindRangeIndex( sal_uInt32 ) const; // prevent assignment and copy construction - ImplFontCharMap( const ImplFontCharMap& ); + explicit ImplFontCharMap( const ImplFontCharMap& ); void operator=( const ImplFontCharMap& ); private: const sal_uInt32* mpRangeCodes; // pairs of StartCode/(EndCode+1) - const int* mpStartGlyphs; // index of the first glyph of the ranges + const int* mpStartGlyphs; // range-specific mapper to glyphs + const USHORT* mpGlyphIds; // individual glyphid mappings int mnRangeCount; int mnCharCount; int mnRefCount; }; // CmapResult is a normalized version of the many CMAP formats -struct CmapResult +class +#ifdef UNX + VCL_DLLPUBLIC // vcl-plugins need it +#endif // UNX +CmapResult { - sal_uInt32* mpPairCodes; - int* mpStartGlyphs; - int mnPairCount; - bool mbRecoded; - bool mbSymbolic; +public: + explicit CmapResult( bool bSymbolic = false, + const sal_uInt32* pRangeCodes = NULL, int nRangeCount = 0, + const int* pStartGlyphs = 0, const USHORT* pGlyphIds = NULL ); + + const sal_uInt32* mpRangeCodes; + const int* mpStartGlyphs; + const USHORT* mpGlyphIds; + int mnRangeCount; + bool mbSymbolic; + bool mbRecoded; }; bool ParseCMAP( const unsigned char* pRawData, int nRawLength, CmapResult& ); #endif // _SV_IMPFONT_HXX + diff --git a/vcl/inc/vcl/impgraph.hxx b/vcl/inc/vcl/impgraph.hxx index 34b61a5fe21c..3b36173891ae 100644 --- a/vcl/inc/vcl/impgraph.hxx +++ b/vcl/inc/vcl/impgraph.hxx @@ -55,6 +55,7 @@ struct ImpSwapInfo class OutputDevice; class GfxLink; struct ImpSwapFile; +class GraphicConversionParameters; class ImpGraphic { @@ -102,8 +103,8 @@ private: BOOL ImplIsAlpha() const; BOOL ImplIsAnimated() const; - Bitmap ImplGetBitmap( const Size* pSizePixel, BOOL bUnlimited ) const; - BitmapEx ImplGetBitmapEx( const Size* pSizePixel, BOOL bUnlimited ) const; + Bitmap ImplGetBitmap(const GraphicConversionParameters& rParameters) const; + BitmapEx ImplGetBitmapEx(const GraphicConversionParameters& rParameters) const; Animation ImplGetAnimation() const; const GDIMetaFile& ImplGetGDIMetaFile() const; diff --git a/vcl/inc/vcl/impimagetree.hxx b/vcl/inc/vcl/impimagetree.hxx index dfbcb366fe6a..92761eabdf3c 100644 --- a/vcl/inc/vcl/impimagetree.hxx +++ b/vcl/inc/vcl/impimagetree.hxx @@ -54,14 +54,17 @@ public: ~ImplImageTree(); + // check whether the icon style is installed + bool checkStyle(rtl::OUString const & style); + bool loadImage( rtl::OUString const & name, rtl::OUString const & style, - BitmapEx & bitmap, bool localized = false); + BitmapEx & bitmap, bool localized = false ); void shutDown(); // a crude form of life cycle control (called from DeInitVCL; otherwise, // if the ImplImageTree singleton were destroyed during exit that would - // be too late for the destructors of the bitmaps in m_cache) + // be too late for the destructors of the bitmaps in m_iconCache) private: typedef std::list< @@ -71,20 +74,23 @@ private: com::sun::star::container::XNameAccess > > > Zips; typedef std::hash_map< - rtl::OUString, std::pair< bool, BitmapEx >, rtl::OUStringHash > Cache; + rtl::OUString, bool, rtl::OUStringHash > CheckStyleCache; + typedef std::hash_map< + rtl::OUString, std::pair< bool, BitmapEx >, rtl::OUStringHash > IconCache; rtl::OUString m_style; Zips m_zips; - Cache m_cache; + CheckStyleCache m_checkStyleCache; + IconCache m_iconCache; - void setStyle(rtl::OUString const & style); + void setStyle(rtl::OUString const & style ); void resetZips(); - bool cacheLookup( - rtl::OUString const & name, bool localized, BitmapEx & bitmap); + bool checkStyleCacheLookup( rtl::OUString const & style, bool &exists ); + bool iconCacheLookup( rtl::OUString const & name, bool localized, BitmapEx & bitmap ); - bool find(std::vector< rtl::OUString > const & paths, BitmapEx & bitmap); + bool find(std::vector< rtl::OUString > const & paths, BitmapEx & bitmap ); }; typedef salhelper::SingletonRef< ImplImageTree > ImplImageTreeSingletonRef; diff --git a/vcl/inc/vcl/jobset.h b/vcl/inc/vcl/jobset.h index 5d08319a7e6c..9f3eefd507d5 100644 --- a/vcl/inc/vcl/jobset.h +++ b/vcl/inc/vcl/jobset.h @@ -61,7 +61,7 @@ struct ImplJobSetup String maDriver; // Driver-Name Orientation meOrientation; // Orientation USHORT mnPaperBin; // Papierschacht - Paper mePaperFormat; // Papierformat + Paper mePaperFormat; // Papierformat long mnPaperWidth; // Papierbreite in 100tel mm long mnPaperHeight; // Papierhoehe in 100tel mm ULONG mnDriverDataLen; // Laenge der systemabhaengigen Daten diff --git a/vcl/inc/vcl/lazydelete.hxx b/vcl/inc/vcl/lazydelete.hxx index a0acba21fefa..4821492af1f8 100644 --- a/vcl/inc/vcl/lazydelete.hxx +++ b/vcl/inc/vcl/lazydelete.hxx @@ -225,7 +225,7 @@ namespace vcl SomeWindow::Paint() { - static vcl::DeleteOnDeinitBase< BitmapEx > aBmp( new BitmapEx( ResId( 1000, myResMgr ) ) ); + static vcl::DeleteOnDeinit< BitmapEx > aBmp( new BitmapEx( ResId( 1000, myResMgr ) ) ); if( aBmp.get() ) // check whether DeInitVCL has been called already DrawBitmapEx( Point( 10, 10 ), *aBmp.get() ); @@ -244,7 +244,7 @@ namespace vcl }; template < typename T > - class VCL_DLLPUBLIC DeleteOnDeinit : public DeleteOnDeinitBase + class DeleteOnDeinit : public DeleteOnDeinitBase { T* m_pT; virtual void doCleanup() { delete m_pT; m_pT = NULL; } diff --git a/vcl/inc/vcl/mapunit.hxx b/vcl/inc/vcl/mapunit.hxx index 6ba500f4fdb7..c50ba49c17bb 100644 --- a/vcl/inc/vcl/mapunit.hxx +++ b/vcl/inc/vcl/mapunit.hxx @@ -31,14 +31,6 @@ #ifndef _VCL_MAPUNIT_HXX #define _VCL_MAPUNIT_HXX -// ----------------- -// - MapMode-Types - -// ----------------- - -// By changes you must also change: rsc/vclrsc.hxx -enum MapUnit { MAP_100TH_MM, MAP_10TH_MM, MAP_MM, MAP_CM, - MAP_1000TH_INCH, MAP_100TH_INCH, MAP_10TH_INCH, MAP_INCH, - MAP_POINT, MAP_TWIP, MAP_PIXEL, MAP_SYSFONT, MAP_APPFONT, - MAP_RELATIVE, MAP_REALAPPFONT, MAP_LASTENUMDUMMY }; +#include #endif // _VCL_MAPUNIT_HXX diff --git a/vcl/inc/vcl/outdev.h b/vcl/inc/vcl/outdev.h index af671e24ee0a..67dc256ce11c 100644 --- a/vcl/inc/vcl/outdev.h +++ b/vcl/inc/vcl/outdev.h @@ -31,7 +31,7 @@ #ifndef _SV_OUTDEV_H #define _SV_OUTDEV_H -#include +#include #include #include @@ -44,13 +44,6 @@ class VirtualDevice; class ImplServerGraphics; class ImplGetDevFontList; class GetDevSizeList; -namespace vcl { -class FontSubstConfiguration; -} - -// ----------------------------------------------------------------------- - -void ImplGetEnglishSearchFontName( String& rName ); // ----------------------- // - ImplDevFontListData - @@ -80,7 +73,7 @@ public: int GetMinQuality() const { return mnMinQuality; } bool AddFontFace( ImplFontData* ); - void InitMatchData( const vcl::FontSubstConfiguration&, + void InitMatchData( const utl::FontSubstConfiguration&, const String& rSearchName ); ImplFontData* FindBestFontFace( const ImplFontSelectData& rFSD ) const; @@ -106,24 +99,6 @@ friend class ImplDevFontList; // TODO: remove soon }; -// --------------- -// - ImplCvtChar - -// --------------- - -class ImplCvtChar -{ -public: - const sal_Unicode* mpCvtTab; - const char* mpSubsFontName; - sal_Unicode (*mpCvtFunc)( sal_Unicode ); -}; - -sal_Unicode ImplRecodeChar( const ImplCvtChar* pCvtData, sal_Unicode c ); -void ImplRecodeString( const ImplCvtChar* pCvtData, String& rStr, - xub_StrLen nIndex, xub_StrLen nLen ); -const ImplCvtChar* ImplGetRecodeData( const String& rOrgFontName, - const String& rMapFontName ); - // ---------------------- // - ImplGetDevFontList - // ---------------------- diff --git a/vcl/inc/vcl/outdev.hxx b/vcl/inc/vcl/outdev.hxx index 3f821f995a51..1e1f784f0f49 100644 --- a/vcl/inc/vcl/outdev.hxx +++ b/vcl/inc/vcl/outdev.hxx @@ -45,6 +45,7 @@ #include #include #include +#include #include @@ -103,8 +104,12 @@ namespace awt { typedef std::vector< Rectangle > MetricVector; -namespace vcl { class PDFWriterImpl; } -namespace vcl { class ExtOutDevData; } +namespace vcl +{ + class PDFWriterImpl; + class ExtOutDevData; + class ITextLayout; +} #define OUTDEV_BUFFER_SIZE 128 @@ -260,31 +265,6 @@ struct KerningPair #define FONT_SUBSTITUTE_ALWAYS ((USHORT)0x0001) #define FONT_SUBSTITUTE_SCREENONLY ((USHORT)0x0002) -// Default-Font -#define DEFAULTFONT_SANS_UNICODE ((USHORT)1) -#define DEFAULTFONT_SANS ((USHORT)2) -#define DEFAULTFONT_SERIF ((USHORT)3) -#define DEFAULTFONT_FIXED ((USHORT)4) -#define DEFAULTFONT_SYMBOL ((USHORT)5) -#define DEFAULTFONT_UI_SANS ((USHORT)1000) -#define DEFAULTFONT_UI_FIXED ((USHORT)1001) -#define DEFAULTFONT_LATIN_TEXT ((USHORT)2000) -#define DEFAULTFONT_LATIN_PRESENTATION ((USHORT)2001) -#define DEFAULTFONT_LATIN_SPREADSHEET ((USHORT)2002) -#define DEFAULTFONT_LATIN_HEADING ((USHORT)2003) -#define DEFAULTFONT_LATIN_DISPLAY ((USHORT)2004) -#define DEFAULTFONT_LATIN_FIXED ((USHORT)2005) -#define DEFAULTFONT_CJK_TEXT ((USHORT)3000) -#define DEFAULTFONT_CJK_PRESENTATION ((USHORT)3001) -#define DEFAULTFONT_CJK_SPREADSHEET ((USHORT)3002) -#define DEFAULTFONT_CJK_HEADING ((USHORT)3003) -#define DEFAULTFONT_CJK_DISPLAY ((USHORT)3004) -#define DEFAULTFONT_CTL_TEXT ((USHORT)4000) -#define DEFAULTFONT_CTL_PRESENTATION ((USHORT)4001) -#define DEFAULTFONT_CTL_SPREADSHEET ((USHORT)4002) -#define DEFAULTFONT_CTL_HEADING ((USHORT)4003) -#define DEFAULTFONT_CTL_DISPLAY ((USHORT)4004) - #define DEFAULTFONT_FLAGS_ONLYONE ((ULONG)0x00000001) enum OutDevType { OUTDEV_DONTKNOW, OUTDEV_WINDOW, OUTDEV_PRINTER, OUTDEV_VIRDEV }; @@ -431,9 +411,13 @@ public: SAL_DLLPRIVATE SalLayout* ImplGlyphFallbackLayout( SalLayout*, ImplLayoutArgs& ) const; SAL_DLLPRIVATE long ImplGetTextWidth( const SalLayout& ) const; - SAL_DLLPRIVATE void ImplDrawText( const Rectangle& rRect, + static + SAL_DLLPRIVATE XubString ImplGetEllipsisString( const OutputDevice& rTargetDevice, const XubString& rStr, + long nMaxWidth, USHORT nStyle, const ::vcl::ITextLayout& _rLayout ); + static + SAL_DLLPRIVATE void ImplDrawText( OutputDevice& rTargetDevice, const Rectangle& rRect, const String& rOrigStr, USHORT nStyle, - MetricVector* pVector, String* pDisplayText ); + MetricVector* pVector, String* pDisplayText, ::vcl::ITextLayout& _rLayout ); SAL_DLLPRIVATE void ImplDrawTextBackground( const SalLayout& ); SAL_DLLPRIVATE void ImplDrawTextLines( SalLayout&, FontStrikeout eStrikeout, FontUnderline eUnderline, FontUnderline eOverline, BOOL bWordLine, BOOL bUnderlineAbove ); SAL_DLLPRIVATE bool ImplDrawRotateText( SalLayout& ); @@ -456,7 +440,8 @@ public: SAL_DLLPRIVATE void ImplDrawMnemonicLine( long nX, long nY, long nWidth ); SAL_DLLPRIVATE void ImplGetEmphasisMark( PolyPolygon& rPolyPoly, BOOL& rPolyLine, Rectangle& rRect1, Rectangle& rRect2, long& rYOff, long& rWidth, FontEmphasisMark eEmphasis, long nHeight, short nOrient ); SAL_DLLPRIVATE void ImplDrawEmphasisMark( long nBaseX, long nX, long nY, const PolyPolygon& rPolyPoly, BOOL bPolyLine, const Rectangle& rRect1, const Rectangle& rRect2 ); - SAL_DLLPRIVATE long ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, long nWidth, const XubString& rStr, USHORT nStyle ) const; + static + SAL_DLLPRIVATE long ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, long nWidth, const XubString& rStr, USHORT nStyle, const ::vcl::ITextLayout& _rLayout ); SAL_DLLPRIVATE void ImplInitFontList() const; SAL_DLLPRIVATE void ImplUpdateFontData( bool bNewFontLists ); SAL_DLLPRIVATE static void ImplUpdateAllFontData( bool bNewFontLists ); @@ -563,6 +548,20 @@ public: // tells whether this output device is RTL in an LTR UI or LTR in a RTL UI SAL_DLLPRIVATE bool ImplIsAntiparallel() const ; + // #i101491# + // Helper which holds the old line geometry creation and is extended to use AA when + // switched on. Advantage is that line geometry is only temporarily used for paint + SAL_DLLPRIVATE void ImpDrawPolyLineWithLineInfo(const Polygon& rPoly, const LineInfo& rLineInfo); + + // #i101491# + // Helper who implements the DrawPolyPolygon functionality for basegfx::B2DPolyPolygon + // without MetaFile processing + SAL_DLLPRIVATE void ImpDrawPolyPolygonWithB2DPolyPolygon(const basegfx::B2DPolyPolygon& rB2DPolyPoly); + + // #i101491# + // Helper who tries to use SalGDI's DrawPolyLine direct and returns it's bool. Contains no AA check. + SAL_DLLPRIVATE bool ImpTryDrawPolyLineDirect(const basegfx::B2DPolygon& rB2DPolygon, double fLineWidth, basegfx::B2DLineJoin eLineJoin); + protected: OutputDevice(); @@ -635,10 +634,12 @@ public: GDIMetaFile& rMtf ); void DrawText( const Rectangle& rRect, const XubString& rStr, USHORT nStyle = 0, - MetricVector* pVector = NULL, String* pDisplayText = NULL ); + MetricVector* pVector = NULL, String* pDisplayText = NULL, + ::vcl::ITextLayout* _pTextLayout = NULL ); Rectangle GetTextRect( const Rectangle& rRect, const XubString& rStr, USHORT nStyle = TEXT_DRAW_WORDBREAK, - TextRectInfo* pInfo = NULL ) const; + TextRectInfo* pInfo = NULL, + const ::vcl::ITextLayout* _pTextLayout = NULL ) const; XubString GetEllipsisString( const XubString& rStr, long nMaxWidth, USHORT nStyle = TEXT_DRAW_ENDELLIPSIS ) const; void DrawCtrlText( const Point& rPos, const XubString& rStr, @@ -655,20 +656,20 @@ public: void GetKerningPairs( ULONG nPairs, KerningPair* pKernPairs ) const; BOOL GetTextBoundRect( Rectangle& rRect, - const String& rStr, xub_StrLen nBase = 0, xub_StrLen nIndex = 0, - xub_StrLen nLen = STRING_LEN ) const; + const String& rStr, xub_StrLen nBase = 0, xub_StrLen nIndex = 0, xub_StrLen nLen = STRING_LEN, + ULONG nLayoutWidth = 0, const sal_Int32* pDXArray = NULL ) const; BOOL GetTextOutline( PolyPolygon&, const String& rStr, xub_StrLen nBase = 0, xub_StrLen nIndex = 0, xub_StrLen nLen = STRING_LEN, BOOL bOptimize = TRUE, - const ULONG nWidth = 0, const sal_Int32* pDXArray = NULL ) const; + ULONG nLayoutWidth = 0, const sal_Int32* pDXArray = NULL ) const; BOOL GetTextOutlines( PolyPolyVector&, const String& rStr, xub_StrLen nBase = 0, xub_StrLen nIndex = 0, xub_StrLen nLen = STRING_LEN, BOOL bOptimize = TRUE, - const ULONG nWidth = 0, const sal_Int32* pDXArray = NULL ) const; + ULONG nLayoutWidth = 0, const sal_Int32* pDXArray = NULL ) const; BOOL GetTextOutlines( ::basegfx::B2DPolyPolygonVector&, const String& rStr, xub_StrLen nBase = 0, xub_StrLen nIndex = 0, xub_StrLen nLen = STRING_LEN, BOOL bOptimize = TRUE, - const ULONG nWidth = 0, const sal_Int32* pDXArray = NULL ) const; + ULONG nLayoutWidth = 0, const sal_Int32* pDXArray = NULL ) const; BOOL GetGlyphBoundRects( const Point& rOrigin, const String& rStr, int nIndex, int nLen, int nBase, MetricVector& rVector ); diff --git a/vcl/inc/vcl/outfont.hxx b/vcl/inc/vcl/outfont.hxx index 86a5e59f6345..b72e78994a75 100644 --- a/vcl/inc/vcl/outfont.hxx +++ b/vcl/inc/vcl/outfont.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: outfont.hxx,v $ - * $Revision: 1.6.14.2 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -35,9 +32,9 @@ #include #include #include -#include +#include #include - +#include #include #include @@ -51,14 +48,10 @@ class ImplPreMatchFontSubstitution; class ImplGlyphFallbackFontSubstitution; class ImplFontSelectData; class Font; -class ImplCvtChar; +class ConvertChar; struct FontMatchStatus; class OutputDevice; -namespace vcl { - struct FontNameAttr; -} - // ---------------------- // - ImplFontAttributes - // ---------------------- @@ -188,8 +181,6 @@ public: // TODO: change to private ImplFontEntry* mpFontEntry; // pointer to the resulting FontCache entry }; -struct FontNameHash { int operator()(const String&) const; }; - // ------------------- // - ImplDevFontList - // ------------------- @@ -241,7 +232,7 @@ protected: ImplDevFontListData* ImplFindByTokenNames( const String& ) const; ImplDevFontListData* ImplFindByAliasName( const String& rSearchName, const String& rShortName ) const; - ImplDevFontListData* ImplFindBySubstFontAttr( const vcl::FontNameAttr& ) const; + ImplDevFontListData* ImplFindBySubstFontAttr( const utl::FontNameAttr& ) const; ImplDevFontListData* ImplFindByAttributes( ULONG nSearchType, FontWeight, FontWidth, FontFamily, FontItalic, const String& rSearchFamily ) const; ImplDevFontListData* FindDefaultFont() const; @@ -340,7 +331,7 @@ public: public: // TODO: make data members private ImplFontSelectData maFontSelData; // FontSelectionData ImplFontMetricData maMetric; // Font Metric - const ImplCvtChar* mpConversion; // used e.g. for StarBats->StarSymbol + const ConvertChar* mpConversion; // used e.g. for StarBats->StarSymbol long mnLineHeight; ULONG mnRefCount; USHORT mnSetFontFlags; // Flags returned by SalGraphics::SetFont() @@ -407,17 +398,5 @@ private: ImplMultiTextLineInfo& operator=( const ImplMultiTextLineInfo& ); }; -#define SAL_FONTSUBSETINFO_TYPE_TRUETYPE 0 -#define SAL_FONTSUBSETINFO_TYPE_TYPE1 1 - -struct FontSubsetInfo -{ - String m_aPSName; - int m_nFontType; - int m_nAscent; // all lengths in PS font units - int m_nDescent; - int m_nCapHeight; - Rectangle m_aFontBBox; -}; - #endif // _SV_OUTFONT_HXX + diff --git a/vcl/inc/vcl/pdfwriter.hxx b/vcl/inc/vcl/pdfwriter.hxx index bdf636754c77..dbfaf9eda18d 100644 --- a/vcl/inc/vcl/pdfwriter.hxx +++ b/vcl/inc/vcl/pdfwriter.hxx @@ -546,6 +546,8 @@ The following structure describes the permissions used in PDF security will be submitted. */ PDFWriter::ExportDataFormat SubmitFormat; + bool AllowDuplicateFieldNames; + bool FieldsUseSystemFonts; /* the following data members are used to customize the PDF viewer preferences */ @@ -590,6 +592,8 @@ The following structure describes the permissions used in PDF security Tagged( false ), EmbedStandardFonts( false ), SubmitFormat( PDFWriter::FDF ), + AllowDuplicateFieldNames( false ), + FieldsUseSystemFonts( true ), PDFDocumentMode( PDFWriter::ModeDefault ), PDFDocumentAction( PDFWriter::ActionDefault ), Zoom( 100 ), diff --git a/vcl/inc/vcl/pngread.hxx b/vcl/inc/vcl/pngread.hxx index 200b52eb6182..285af1407c1c 100644 --- a/vcl/inc/vcl/pngread.hxx +++ b/vcl/inc/vcl/pngread.hxx @@ -65,6 +65,8 @@ namespace vcl std::vector< sal_uInt8 > aData; }; const std::vector< ChunkData >& GetChunks() const; + + void SetIgnoreGammaChunk( sal_Bool b ); }; } diff --git a/vcl/inc/vcl/ppdparser.hxx b/vcl/inc/vcl/ppdparser.hxx index 5fa47d412f26..ed9f91b97d99 100644 --- a/vcl/inc/vcl/ppdparser.hxx +++ b/vcl/inc/vcl/ppdparser.hxx @@ -202,7 +202,7 @@ public: static const PPDParser* getParser( const String& rFile ); static String getPPDPrinterName( const String& rFile ); static void freeAll(); - static void getKnownPPDDrivers( std::list< rtl::OUString >& o_rDrivers ); + static void getKnownPPDDrivers( std::list< rtl::OUString >& o_rDrivers, bool bRefresh = false ); const String& getFilename() const { return m_aFile; } diff --git a/vcl/inc/vcl/print.hxx b/vcl/inc/vcl/print.hxx index fdc7f2ba9c69..b9176f4106dc 100644 --- a/vcl/inc/vcl/print.hxx +++ b/vcl/inc/vcl/print.hxx @@ -330,17 +330,12 @@ public: USHORT GetPaperBin() const; BOOL SetPaper( Paper ePaper ); BOOL SetPaperSizeUser( const Size& rSize ); - Paper GetPaper() const; + Paper GetPaper() const; // returns number of available paper formats int GetPaperInfoCount() const; // returns info about paper format nPaper - const vcl::PaperInfo& GetPaperInfo( int nPaper ) const; - // sets current paper to format contained in rInfo - BOOL SetPaperFromInfo( const vcl::PaperInfo& rInfo ); - // gets info about paper fromat best matching current paper - const vcl::PaperInfo& GetCurrentPaperInfo() const; - + const PaperInfo& GetPaperInfo( int nPaper ) const; USHORT GetPaperBinCount() const; XubString GetPaperBinName( USHORT nPaperBin ) const; diff --git a/vcl/inc/vcl/printergfx.hxx b/vcl/inc/vcl/printergfx.hxx index 3bb242c802dd..e34a1ce78001 100644 --- a/vcl/inc/vcl/printergfx.hxx +++ b/vcl/inc/vcl/printergfx.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: printergfx.hxx,v $ - * $Revision: 1.19.18.1 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -32,6 +29,7 @@ #define _PSPRINT_PRINTERGFX_HXX_ #include "vcl/helper.hxx" +#include "vcl/sallayout.hxx" #include "osl/file.hxx" #include "tools/gen.hxx" @@ -325,7 +323,7 @@ public: const sal_Int32* pDeltaArray = NULL); void drawGlyphs( const Point& rPoint, - sal_uInt32* pGlyphIds, + sal_GlyphId* pGlyphIds, sal_Unicode* pUnicodes, sal_Int16 nLen, sal_Int32* pDeltaArray ); @@ -428,7 +426,7 @@ public: // for CTL void DrawGlyphs( const Point& rPoint, - sal_uInt32* pGlyphIds, + sal_GlyphId* pGlyphIds, sal_Unicode* pUnicodes, sal_Int16 nLen, sal_Int32* pDeltaArray ); diff --git a/vcl/inc/vcl/prntypes.hxx b/vcl/inc/vcl/prntypes.hxx index 84ef320de20e..681f4f972a7c 100644 --- a/vcl/inc/vcl/prntypes.hxx +++ b/vcl/inc/vcl/prntypes.hxx @@ -33,6 +33,7 @@ #include #include +#include // --------------- // - Duplex Mode - @@ -46,33 +47,6 @@ enum DuplexMode { DUPLEX_UNKNOWN, DUPLEX_OFF, DUPLEX_ON }; enum Orientation { ORIENTATION_PORTRAIT, ORIENTATION_LANDSCAPE }; -// --------- -// - Paper - -// --------- - -typedef USHORT Paper; -#define PAPER_A3 ((Paper)0) -#define PAPER_A4 ((Paper)1) -#define PAPER_A5 ((Paper)2) -#define PAPER_B4 ((Paper)3) -#define PAPER_B5 ((Paper)4) -#define PAPER_LETTER ((Paper)5) -#define PAPER_LEGAL ((Paper)6) -#define PAPER_TABLOID ((Paper)7) -#define PAPER_USER ((Paper)8) - -namespace vcl -{ -struct PaperInfo -{ - String m_aPaperName; // user readable name of paper - unsigned long m_nPaperWidth; // width in mm - unsigned long m_nPaperHeight; // height in mm - - PaperInfo() : m_nPaperWidth( 0 ), m_nPaperHeight( 0 ) {} -}; -} - // ------------------- // - QueueInfo-Types - // ------------------- diff --git a/vcl/inc/vcl/salbtype.hxx b/vcl/inc/vcl/salbtype.hxx index 2a10353bee94..d9be75369a5d 100644 --- a/vcl/inc/vcl/salbtype.hxx +++ b/vcl/inc/vcl/salbtype.hxx @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -49,14 +50,6 @@ typedef HPBYTE Scanline; typedef const BYTE* ConstHPBYTE; typedef ConstHPBYTE ConstScanline; -// -------------------- -// - Helper functions - -// -------------------- - -inline long MinMax( long nVal, long nMin, long nMax ); -inline long AlignedWidth4Bytes( long nWidthBits ); -inline long FRound( double fVal ); - // ------------------ // - Bitmap formats - // ------------------ @@ -292,29 +285,6 @@ struct VCL_DLLPUBLIC BitmapBuffer VCL_DLLPUBLIC BitmapBuffer* StretchAndConvert( const BitmapBuffer& rSrcBuffer, const SalTwoRect& rTwoRect, ULONG nDstBitmapFormat, BitmapPalette* pDstPal = NULL, ColorMask* pDstMask = NULL ); -// --------------- -// - Inlines - -// --------------- - -inline long MinMax( long nVal, long nMin, long nMax ) -{ - return( nVal >= nMin ? ( nVal <= nMax ? nVal : nMax ) : nMin ); -} - -// ------------------------------------------------------------------ - -inline long AlignedWidth4Bytes( long nWidthBits ) -{ - return( ( ( nWidthBits + 31 ) >> 5 ) << 2 ); -} - -// ------------------------------------------------------------------ - -inline long FRound( double fVal ) -{ - return( fVal > 0.0 ? (long) ( fVal + 0.5 ) : -(long) ( -fVal + 0.5 ) ); -} - // ------------------------------------------------------------------ inline BitmapColor::BitmapColor() : diff --git a/vcl/inc/vcl/salframe.hxx b/vcl/inc/vcl/salframe.hxx index 7a99442ebd5b..b95f7036ad19 100644 --- a/vcl/inc/vcl/salframe.hxx +++ b/vcl/inc/vcl/salframe.hxx @@ -102,6 +102,8 @@ struct SystemEnvData; #define SAL_FRAME_STYLE_SYSTEMCHILD ((ULONG)0x08000000) // floating window #define SAL_FRAME_STYLE_FLOAT ((ULONG)0x20000000) +// floating window that needs to be focusable +#define SAL_FRAME_STYLE_FLOAT_FOCUSABLE ((ULONG)0x04000000) // toolwindows should be painted with a smaller decoration #define SAL_FRAME_STYLE_TOOLWINDOW ((ULONG)0x40000000) // the window containing the intro bitmap, aka splashscreen @@ -168,6 +170,7 @@ public: virtual void SetTitle( const XubString& rTitle ) = 0; virtual void SetIcon( USHORT nIcon ) = 0; + virtual void SetRepresentedURL( const rtl::OUString& ); virtual void SetMenu( SalMenu *pSalMenu ) = 0; virtual void DrawMenuBar() = 0; diff --git a/vcl/inc/vcl/salgdi.hxx b/vcl/inc/vcl/salgdi.hxx index 5cf6e70f5114..55f8a0d03deb 100644 --- a/vcl/inc/vcl/salgdi.hxx +++ b/vcl/inc/vcl/salgdi.hxx @@ -53,7 +53,7 @@ class ImplFontCharMap; class SalLayout; class ImplLayoutArgs; class Rectangle; -struct FontSubsetInfo; +class FontSubsetInfo; class OutputDevice; class ServerFontLayout; struct SystemGraphicsData; diff --git a/vcl/inc/vcl/salinst.hxx b/vcl/inc/vcl/salinst.hxx index 221c9e370ea6..f8c148859516 100644 --- a/vcl/inc/vcl/salinst.hxx +++ b/vcl/inc/vcl/salinst.hxx @@ -31,6 +31,8 @@ #ifndef _SV_SALINST_HXX #define _SV_SALINST_HXX +#include "com/sun/star/uno/Reference.hxx" + #include "vcl/sv.h" #include "vcl/dllapi.h" @@ -176,6 +178,13 @@ public: // this is only necessary because PrintFontManager is an exported vcl API and therefore // needs to be in libvcl while libvclplug_* do not contain exported C++ API virtual void FillFontPathList( std::list< rtl::OString >& o_rFontPaths ); + + // dtrans implementation + virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > + CreateClipboard( const com::sun::star::uno::Sequence< com::sun::star::uno::Any >& i_rArguments ); + virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > CreateDragSource(); + virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > CreateDropTarget(); + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType) = 0; }; // called from SVMain diff --git a/vcl/inc/vcl/sallayout.hxx b/vcl/inc/vcl/sallayout.hxx index 3141381041c8..6934cdc182b6 100755 --- a/vcl/inc/vcl/sallayout.hxx +++ b/vcl/inc/vcl/sallayout.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: sallayout.hxx,v $ - * $Revision: 1.8.54.1 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify diff --git a/vcl/inc/vcl/salprn.hxx b/vcl/inc/vcl/salprn.hxx index a80c5873cbfb..2927215034b5 100644 --- a/vcl/inc/vcl/salprn.hxx +++ b/vcl/inc/vcl/salprn.hxx @@ -68,7 +68,7 @@ struct VCL_DLLPUBLIC SalPrinterQueueInfo class VCL_DLLPUBLIC SalInfoPrinter { public: - std::vector< vcl::PaperInfo > m_aPaperFormats; // all printer supported formats + std::vector< PaperInfo > m_aPaperFormats; // all printer supported formats bool m_bPapersInit; // set to true after InitPaperFormats bool m_bCompatMetrics; diff --git a/vcl/inc/vcl/salsession.hxx b/vcl/inc/vcl/salsession.hxx index 05aa76cb0f56..bdc698fc63fd 100644 --- a/vcl/inc/vcl/salsession.hxx +++ b/vcl/inc/vcl/salsession.hxx @@ -37,7 +37,8 @@ enum SalSessionEventType { Interaction, SaveRequest, - ShutdownCancel + ShutdownCancel, + Quit }; struct SalSessionEvent @@ -78,6 +79,13 @@ struct SalSessionShutdownCancelEvent : public SalSessionEvent {} }; +struct SalSessionQuitEvent : public SalSessionEvent +{ + SalSessionQuitEvent() + : SalSessionEvent( Quit ) + {} +}; + typedef void(*SessionProc)( SalSessionEvent *pEvent); class VCL_DLLPUBLIC SalSession diff --git a/vcl/inc/vcl/settings.hxx b/vcl/inc/vcl/settings.hxx index 5ee27e3aeb31..61a970b738e0 100644 --- a/vcl/inc/vcl/settings.hxx +++ b/vcl/inc/vcl/settings.hxx @@ -38,6 +38,7 @@ #include "vcl/accel.hxx" #include "vcl/wall.hxx" #include "com/sun/star/lang/Locale.hpp" +#include class CollatorWrapper; class LocaleDataWrapper; @@ -139,7 +140,7 @@ private: ULONG mnMenuDelay; ULONG mnFollow; USHORT mnMiddleButtonAction; - BOOL mbNoWheelActionWithoutFocus; + USHORT mnWheelBehavior; BOOL mbAlign1; }; @@ -158,6 +159,10 @@ private: #define MOUSE_MIDDLE_AUTOSCROLL ((USHORT)1) #define MOUSE_MIDDLE_PASTESELECTION ((USHORT)2) +#define MOUSE_WHEEL_DISABLE ((USHORT)0) +#define MOUSE_WHEEL_FOCUS_ONLY ((USHORT)1) +#define MOUSE_WHEEL_ALWAYS ((USHORT)2) + class VCL_DLLPUBLIC MouseSettings { void CopyData(); @@ -257,10 +262,10 @@ public: USHORT GetMiddleButtonAction() const { return mpData->mnMiddleButtonAction; } - void SetNoWheelActionWithoutFocus( BOOL bAction ) - { CopyData(); mpData->mbNoWheelActionWithoutFocus = bAction; } - BOOL GetNoWheelActionWithoutFocus() const - { return mpData->mbNoWheelActionWithoutFocus; } + void SetWheelBehavior( USHORT nBehavior ) + { CopyData(); mpData->mnWheelBehavior = nBehavior; } + USHORT GetWheelBehavior() const + { return mpData->mnWheelBehavior; } const MouseSettings& operator =( const MouseSettings& rSet ); @@ -375,6 +380,7 @@ private: Color maMenuHighlightColor; Color maMenuHighlightTextColor; Color maMenuTextColor; + Color maMenuBarTextColor; Color maMonoColor; Color maRadioCheckTextColor; Color maShadowColor; @@ -516,9 +522,10 @@ private: #define STYLE_SYMBOLS_HICONTRAST ((ULONG)2) #define STYLE_SYMBOLS_INDUSTRIAL ((ULONG)3) #define STYLE_SYMBOLS_CRYSTAL ((ULONG)4) -#define STYLE_SYMBOLS_TANGO ((ULONG)5) -#define STYLE_SYMBOLS_CLASSIC ((ULONG)6) -#define STYLE_SYMBOLS_THEMES_MAX ((ULONG)6) +#define STYLE_SYMBOLS_TANGO ((ULONG)5) +#define STYLE_SYMBOLS_OXYGEN ((ULONG)6) +#define STYLE_SYMBOLS_CLASSIC ((ULONG)7) +#define STYLE_SYMBOLS_THEMES_MAX ((ULONG)8) #define STYLE_CURSOR_NOBLINKTIME ((ULONG)0xFFFFFFFF) @@ -685,6 +692,10 @@ public: { CopyData(); mpData->maMenuTextColor = rColor; } const Color& GetMenuTextColor() const { return mpData->maMenuTextColor; } + void SetMenuBarTextColor( const Color& rColor ) + { CopyData(); mpData->maMenuBarTextColor = rColor; } + const Color& GetMenuBarTextColor() const + { return mpData->maMenuBarTextColor; } void SetMenuHighlightColor( const Color& rColor ) { CopyData(); mpData->maMenuHighlightColor = rColor; } const Color& GetMenuHighlightColor() const @@ -938,6 +949,8 @@ public: void SetPreferredSymbolsStyleName( const ::rtl::OUString &rName ); ULONG GetPreferredSymbolsStyle() const { return mpData->mnPreferredSymbolsStyle; } + // check whether the symbols style is supported (icons are installed) + bool CheckSymbolStyle( ULONG nStyle ) const; ULONG GetAutoSymbolsStyle() const; ULONG GetCurrentSymbolsStyle() const; @@ -984,7 +997,6 @@ class ImplMiscData private: ULONG mnRefCount; - USHORT mnTwoDigitYearStart; USHORT mnEnableATT; BOOL mbEnableLocalizedDecimalSep; USHORT mnDisablePrinting; @@ -1006,10 +1018,6 @@ public: MiscSettings( const MiscSettings& rSet ); ~MiscSettings(); - void SetTwoDigitYearStart( USHORT nYearStart ) - { CopyData(); mpData->mnTwoDigitYearStart = nYearStart; } - USHORT GetTwoDigitYearStart() const - { return mpData->mnTwoDigitYearStart; } void SetEnableATToolSupport( BOOL bEnable ); BOOL GetEnableATToolSupport() const; void SetDisablePrinting( BOOL bEnable ); @@ -1132,7 +1140,7 @@ public: // ----------------------- // - ImplAllSettingsData - // ----------------------- - +class LocaleConfigurationListener; class ImplAllSettingsData { friend class AllSettings; @@ -1162,6 +1170,8 @@ private: CollatorWrapper* mpUICollatorWrapper; vcl::I18nHelper* mpI18nHelper; vcl::I18nHelper* mpUII18nHelper; + LocaleConfigurationListener* mpLocaleCfgListener; + SvtSysLocale maSysLocale; }; // --------------- @@ -1278,6 +1288,8 @@ public: BOOL operator ==( const AllSettings& rSet ) const; BOOL operator !=( const AllSettings& rSet ) const { return !(*this == rSet); } + static void LocaleSettingsChanged( sal_uInt32 nHint ); + SvtSysLocale& GetSysLocale() { return mpData->maSysLocale; } }; #endif // _SV_SETTINGS_HXX diff --git a/vcl/inc/vcl/slider.hxx b/vcl/inc/vcl/slider.hxx index 396ed0ca83cb..c3dfcfd42608 100644 --- a/vcl/inc/vcl/slider.hxx +++ b/vcl/inc/vcl/slider.hxx @@ -70,6 +70,7 @@ private: Link maSlideHdl; Link maEndSlideHdl; + using Control::ImplInitSettings; using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( Window* pParent, WinBits nStyle ); SAL_DLLPRIVATE void ImplLoadRes( const ResId& rResId ); diff --git a/vcl/inc/vcl/sndstyle.hxx b/vcl/inc/vcl/sndstyle.hxx index 2fc568a5e86d..55255171ad9f 100644 --- a/vcl/inc/vcl/sndstyle.hxx +++ b/vcl/inc/vcl/sndstyle.hxx @@ -44,6 +44,6 @@ typedef USHORT SoundType; #define SOUND_ERROR ((SoundType)3) #define SOUND_QUERY ((SoundType)4) -#define SOUND_DISABLE (SOUND_DEFAULT) +#define SOUND_DISABLE ((SoundType)5) #endif // _SV_SNDSTYLE_HXX diff --git a/vcl/inc/vcl/svapp.hxx b/vcl/inc/vcl/svapp.hxx index f853fae6c268..3e9a1cc55019 100644 --- a/vcl/inc/vcl/svapp.hxx +++ b/vcl/inc/vcl/svapp.hxx @@ -287,6 +287,9 @@ public: static vos::OThread::TThreadIdentifier GetMainThreadIdentifier(); static ULONG ReleaseSolarMutex(); static void AcquireSolarMutex( ULONG nCount ); + static void EnableNoYieldMode( bool i_bNoYield ); + static void AddPostYieldListener( const Link& i_rListener ); + static void RemovePostYieldListener( const Link& i_rListener ); static BOOL IsInMain(); static BOOL IsInExecute(); @@ -479,6 +482,20 @@ public: */ static const ::rtl::OUString& GetDesktopEnvironment(); + /** Add a file to the system shells recent document list if there is any. + This function may have no effect under Unix because there is no + standard API among the different desktop managers. + + @param rFileUrl + The file url of the document. + + @param rMimeType + The mime content type of the document specified by aFileUrl. + If an empty string will be provided "application/octet-stream" + will be used. + */ + static void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); + private: DECL_STATIC_LINK( Application, PostEventHandler, void* ); diff --git a/vcl/inc/vcl/svdata.hxx b/vcl/inc/vcl/svdata.hxx index c044364f2064..17ad1aa28c1a 100644 --- a/vcl/inc/vcl/svdata.hxx +++ b/vcl/inc/vcl/svdata.hxx @@ -44,6 +44,7 @@ #include #include #include +#include namespace com { namespace sun { @@ -110,14 +111,21 @@ class ImplWheelWindow; class SalTimer; class SalI18NImeStatus; class DockingManager; +class VclEventListeners2; namespace vos { class OMutex; } namespace vos { class OCondition; } -namespace vcl { class DisplayConnection; class FontSubstConfiguration; class SettingsConfigItem; class DefaultFontConfiguration; class DeleteOnDeinitBase; } +namespace vcl { class DisplayConnection; class SettingsConfigItem; class DeleteOnDeinitBase; } +namespace utl { class DefaultFontConfiguration; class FontSubstConfiguration; } // ----------------- // - ImplSVAppData - // ----------------- +class LocaleConfigurationListener : public utl::ConfigurationListener +{ +public: + virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 ); +}; struct ImplSVAppData { @@ -131,6 +139,7 @@ struct ImplSVAppData ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > mxMSF; String* mpMSFTempFileName; AllSettings* mpSettings; // Application settings + LocaleConfigurationListener* mpCfgListener; VclEventListeners* mpEventListeners; // listeners for vcl events (eg, extended toolkit) VclEventListeners* mpKeyListeners; // listeners for key events only (eg, extended toolkit) ImplAccelManager* mpAccelMgr; // Accelerator Manager @@ -145,19 +154,22 @@ struct ImplSVAppData ImplWheelWindow* mpWheelWindow; // WheelWindow ImplHotKey* mpFirstHotKey; // HotKey-Verwaltung ImplEventHook* mpFirstEventHook; // Event-Hooks - ULONG mnLastInputTime; // GetLastInputTime() - USHORT mnDispatchLevel; // DispatchLevel - USHORT mnModalMode; // ModalMode Count - USHORT mnModalDialog; // ModalDialog Count - USHORT mnAccessCount; // AccessHdl Count - USHORT mnSysWinMode; // Modus, wann SystemWindows erzeugt werden sollen - USHORT mnLayout; // --- RTL-Flags --- currently not used, only for testing - short mnDialogScaleX; // Scale X-Positions and sizes in Dialogs - BOOL mbInAppMain; // is Application::Main() on stack - BOOL mbInAppExecute; // is Application::Execute() on stack - BOOL mbAppQuit; // is Application::Quit() called - BOOL mbSettingsInit; // TRUE: Settings are init - BOOL mbDialogCancel; // TRUE: Alle Dialog::Execute()-Aufrufe werden mit return FALSE sofort beendet + VclEventListeners2* mpPostYieldListeners; // post yield listeners + ULONG mnLastInputTime; // GetLastInputTime() + USHORT mnDispatchLevel; // DispatchLevel + USHORT mnModalMode; // ModalMode Count + USHORT mnModalDialog; // ModalDialog Count + USHORT mnAccessCount; // AccessHdl Count + USHORT mnSysWinMode; // Modus, wann SystemWindows erzeugt werden sollen + USHORT mnLayout; // --- RTL-Flags --- currently not used, only for testing + short mnDialogScaleX; // Scale X-Positions and sizes in Dialogs + BOOL mbInAppMain; // is Application::Main() on stack + BOOL mbInAppExecute; // is Application::Execute() on stack + BOOL mbAppQuit; // is Application::Quit() called + BOOL mbSettingsInit; // TRUE: Settings are initialized + BOOL mbDialogCancel; // TRUE: Alle Dialog::Execute()-Aufrufe werden mit return FALSE sofort beendet + BOOL mbNoYield; // Application::Yield will not wait for events if the queue is empty + // essentially that makes it the same as Application::Reschedule /** Controls whether showing any IME status window is toggled on or off. @@ -196,8 +208,8 @@ struct ImplSVGDIData long mnAppFontX; // AppFont X-Numenator for 40/tel Width + DialogScaleX long mnAppFontY; // AppFont Y-Numenator for 80/tel Height BOOL mbFontSubChanged; // TRUE: FontSubstitution wurde zwischen Begin/End geaendert - vcl::DefaultFontConfiguration* mpDefaultFontConfiguration; - vcl::FontSubstConfiguration* mpFontSubstConfiguration; + utl::DefaultFontConfiguration* mpDefaultFontConfiguration; + utl::FontSubstConfiguration* mpFontSubstConfiguration; bool mbPrinterPullModel; // true: use pull model instead of normal push model when printing bool mbNativeFontConfig; // true: do not override UI font bool mbNoXORClipping; // true: do not use XOR to achieve clipping effects diff --git a/vcl/inc/vcl/syswin.hxx b/vcl/inc/vcl/syswin.hxx index 99a340ae4a58..d590cfe0a37e 100644 --- a/vcl/inc/vcl/syswin.hxx +++ b/vcl/inc/vcl/syswin.hxx @@ -201,6 +201,10 @@ public: void SetIcon( USHORT nIcon ); USHORT GetIcon() const { return mnIcon; } + // for systems like MacOSX which can display the URL a document is loaded from + // separately from the window title + void SetRepresentedURL( const rtl::OUString& ); + const rtl::OUString& GetRepresentedURL() const; void SetZLevel( BYTE nLevel ); BYTE GetZLevel() const; diff --git a/vcl/inc/vcl/tabctrl.hxx b/vcl/inc/vcl/tabctrl.hxx index 378459b9eadb..30edf6227a60 100644 --- a/vcl/inc/vcl/tabctrl.hxx +++ b/vcl/inc/vcl/tabctrl.hxx @@ -78,6 +78,7 @@ private: Link maActivateHdl; Link maDeactivateHdl; + using Control::ImplInitSettings; SAL_DLLPRIVATE void ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ); SAL_DLLPRIVATE ImplTabItem* ImplGetItem( USHORT nId ) const; SAL_DLLPRIVATE void ImplScrollBtnsColor(); @@ -101,6 +102,8 @@ protected: SAL_DLLPRIVATE void ImplLoadRes( const ResId& rResId ); virtual void FillLayoutData() const; + virtual const Font& GetCanonicalFont( const StyleSettings& _rStyle ) const; + virtual const Color& GetCanonicalTextColor( const StyleSettings& _rStyle ) const; SAL_DLLPRIVATE Rectangle* ImplFindPartRect( const Point& rPt ); public: diff --git a/vcl/inc/vcl/textlayout.hxx b/vcl/inc/vcl/textlayout.hxx new file mode 100755 index 000000000000..4c290452e2ad --- /dev/null +++ b/vcl/inc/vcl/textlayout.hxx @@ -0,0 +1,134 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +#ifndef VCL_TEXTLAYOUT_HXX +#define VCL_TEXTLAYOUT_HXX + +#include "vcl/outdev.hxx" + +#include +#include + +#include + +class Control; + +//........................................................................ +namespace vcl +{ +//........................................................................ + + //==================================================================== + //= ITextLayout + //==================================================================== + class SAL_NO_VTABLE ITextLayout + { + public: + virtual long GetTextWidth( const XubString& _rText, xub_StrLen _nStartIndex, xub_StrLen _nLength ) const = 0; + virtual void DrawText( const Point& _rStartPoint, const XubString& _rText, xub_StrLen _nStartIndex, xub_StrLen _nLength, + MetricVector* _pVector, String* _pDisplayText ) = 0; + virtual bool GetCaretPositions( const XubString& _rText, sal_Int32* _pCaretXArray, xub_StrLen _nStartIndex, xub_StrLen _nLength ) const = 0; + virtual xub_StrLen GetTextBreak( const XubString& _rText, long _nMaxTextWidth, xub_StrLen _nStartIndex, xub_StrLen _nLength ) const = 0; + virtual bool DecomposeTextRectAction() const = 0; + }; + + //==================================================================== + //= DefaultTextLayout + //==================================================================== + /** is an implementation of the ITextLayout interface which simply delegates its calls to the respective + methods of an OutputDevice instance, without any inbetween magic. + */ + class DefaultTextLayout : public ITextLayout + { + public: + DefaultTextLayout( OutputDevice& _rTargetDevice ) + :m_rTargetDevice( _rTargetDevice ) + { + } + virtual ~DefaultTextLayout(); + + // ITextLayout overridables + virtual long GetTextWidth( + const XubString& _rText, + xub_StrLen _nStartIndex, + xub_StrLen _nLength + ) const; + virtual void DrawText( + const Point& _rStartPoint, + const XubString& _rText, + xub_StrLen _nStartIndex, + xub_StrLen _nLength, + MetricVector* _pVector, + String* _pDisplayText + ); + virtual bool GetCaretPositions( + const XubString& _rText, + sal_Int32* _pCaretXArray, + xub_StrLen _nStartIndex, + xub_StrLen _nLength + ) const; + virtual xub_StrLen GetTextBreak( + const XubString& _rText, + long _nMaxTextWidth, + xub_StrLen _nStartIndex, + xub_StrLen _nLength + ) const; + virtual bool DecomposeTextRectAction() const; + + private: + OutputDevice& m_rTargetDevice; + }; + + //==================================================================== + //= ControlTextRenderer + //==================================================================== + class ReferenceDeviceTextLayout; + /** a class which allows rendering text of a Control onto a device, by taking into account the metrics of + a reference device. + */ + class ControlTextRenderer + { + public: + ControlTextRenderer( const Control& _rControl, OutputDevice& _rTargetDevice, OutputDevice& _rReferenceDevice ); + virtual ~ControlTextRenderer(); + + Rectangle DrawText( const Rectangle& _rRect, + const XubString& _rText, USHORT _nStyle = 0, + MetricVector* _pVector = NULL, String* _pDisplayText = NULL ); + + private: + ControlTextRenderer(); // never implemented + ControlTextRenderer( const ControlTextRenderer& ); // never implemented + ControlTextRenderer& operator=( const ControlTextRenderer& ); // never implemented + + private: + ::std::auto_ptr< ReferenceDeviceTextLayout > m_pImpl; + }; + +//........................................................................ +} // namespace vcl +//........................................................................ + +#endif // VCL_TEXTLAYOUT_HXX diff --git a/vcl/inc/vcl/toolbox.h b/vcl/inc/vcl/toolbox.h index 52a0db40b226..2dee85ab6b82 100644 --- a/vcl/inc/vcl/toolbox.h +++ b/vcl/inc/vcl/toolbox.h @@ -51,6 +51,7 @@ #define TB_LARGEIMAGESIZE 26 #define TB_LARGEIMAGESIZE_INDUSTRIAL 24 #define TB_LARGEIMAGESIZE_CRYSTAL 22 +#define TB_LARGEIMAGESIZE_OXYGEN 22 class Window; diff --git a/vcl/inc/vcl/vclevent.hxx b/vcl/inc/vcl/vclevent.hxx index 88ad880e26ab..74971f62c5a6 100644 --- a/vcl/inc/vcl/vclevent.hxx +++ b/vcl/inc/vcl/vclevent.hxx @@ -31,11 +31,13 @@ #ifndef _VCL_VCLEVENT_HXX #define _VCL_VCLEVENT_HXX -#include -#include -#include +#include "tools/link.hxx" +#include "tools/rtti.hxx" +#include "vcl/dllapi.h" +#include "vcl/impdel.hxx" #include +#include class Window; class Menu; @@ -146,6 +148,11 @@ class Menu; #define VCLEVENT_ROADMAP_ITEMSELECTED 1171 #define VCLEVENT_TOOLBOX_FORMATCHANGED 1172 // request new layout #define VCLEVENT_COMBOBOX_SETTEXT 1173 +// --> OD 2009-04-01 #i92103# +#define VCLEVENT_LISTBOX_ENTRY_EXPANDED 1174 +#define VCLEVENT_LISTBOX_ENTRY_COLLAPSED 1175 +// <-- +#define VCLEVENT_DROPDOWN_PRE_OPEN 1176 // VclMenuEvent #define VCLEVENT_MENU_ACTIVATE 1200 @@ -246,4 +253,29 @@ public: BOOL Process( VclSimpleEvent* pEvent ) const; }; +class VCL_DLLPUBLIC VclEventListeners2 : public vcl::DeletionNotifier +{ + std::list< Link > m_aListeners; + + struct ListenerIt + { + std::list< Link >::iterator m_aIt; + bool m_bWasInvalidated; + + ListenerIt() : m_bWasInvalidated( false ) {} + }; + + std::vector< ListenerIt > m_aIterators; + + +public: + VclEventListeners2(); + ~VclEventListeners2(); + + void addListener( const Link& ); + void removeListener( const Link& ); + + void callListeners( VclSimpleEvent* ); +}; + #endif // _VCL_VCLEVENT_HXX diff --git a/vcl/inc/vcl/window.hxx b/vcl/inc/vcl/window.hxx index 3f05383d4f80..56fdb22ddc57 100644 --- a/vcl/inc/vcl/window.hxx +++ b/vcl/inc/vcl/window.hxx @@ -165,6 +165,7 @@ namespace vcl { struct ControlLayoutData; } #define SHOW_NOPARENTUPDATE ((USHORT)0x0001) #define SHOW_NOFOCUSCHANGE ((USHORT)0x0002) #define SHOW_NOACTIVATE ((USHORT)0x0004) +#define SHOW_FOREGROUNDTASK ((USHORT)0x0008) // Flags for SetZOrder() #define WINDOW_ZORDER_BEFOR ((USHORT)0x0001) @@ -320,7 +321,6 @@ typedef USHORT StateChangedType; #define IMPL_MSGBOX_OFFSET_EXTRA_X 0 #define IMPL_MSGBOX_OFFSET_EXTRA_Y 2 #define IMPL_SEP_MSGBOX_IMAGE 8 -#define IMPL_SEP_BUTTON_IMAGE 4 #define DLGWINDOW_PREV 0 #define DLGWINDOW_NEXT 1 diff --git a/vcl/inc/vcl/wintypes.hxx b/vcl/inc/vcl/wintypes.hxx index f5869eca55e4..9e84648fb6a8 100644 --- a/vcl/inc/vcl/wintypes.hxx +++ b/vcl/inc/vcl/wintypes.hxx @@ -30,307 +30,7 @@ #ifndef _SV_WINTYPES_HXX #define _SV_WINTYPES_HXX -#include -#include - -// ---------------- -// - Window-Types - -// ---------------- - -typedef USHORT WindowType; -#define WINDOW_BASE 0x0100 -#define WINDOW_FIRST (WINDOW_BASE + 0x30) -#define WINDOW_MESSBOX (WINDOW_FIRST) -#define WINDOW_INFOBOX (WINDOW_FIRST + 0x01) -#define WINDOW_WARNINGBOX (WINDOW_FIRST + 0x02) -#define WINDOW_ERRORBOX (WINDOW_FIRST + 0x03) -#define WINDOW_QUERYBOX (WINDOW_FIRST + 0x04) -#define WINDOW_WINDOW (WINDOW_FIRST + 0x05) -#define WINDOW_SYSWINDOW (WINDOW_FIRST + 0x06) -#define WINDOW_WORKWINDOW (WINDOW_FIRST + 0x07) -// #define WINDOW_MDIWINDOW (WINDOW_FIRST + 0x08) -#define WINDOW_FLOATINGWINDOW (WINDOW_FIRST + 0x09) -#define WINDOW_DIALOG (WINDOW_FIRST + 0x0a) -#define WINDOW_MODELESSDIALOG (WINDOW_FIRST + 0x0b) -#define WINDOW_MODALDIALOG (WINDOW_FIRST + 0x0c) -#define WINDOW_SYSTEMDIALOG (WINDOW_FIRST + 0x0d) -#define WINDOW_PATHDIALOG (WINDOW_FIRST + 0x0e) -#define WINDOW_FILEDIALOG (WINDOW_FIRST + 0x0f) -#define WINDOW_PRINTERSETUPDIALOG (WINDOW_FIRST + 0x10) -#define WINDOW_PRINTDIALOG (WINDOW_FIRST + 0x11) -#define WINDOW_COLORDIALOG (WINDOW_FIRST + 0x12) -#define WINDOW_FONTDIALOG (WINDOW_FIRST + 0x13) -#define WINDOW_CONTROL (WINDOW_FIRST + 0x14) -#define WINDOW_BUTTON (WINDOW_FIRST + 0x15) -#define WINDOW_PUSHBUTTON (WINDOW_FIRST + 0x16) -#define WINDOW_OKBUTTON (WINDOW_FIRST + 0x17) -#define WINDOW_CANCELBUTTON (WINDOW_FIRST + 0x18) -#define WINDOW_HELPBUTTON (WINDOW_FIRST + 0x19) -#define WINDOW_IMAGEBUTTON (WINDOW_FIRST + 0x1a) -#define WINDOW_MENUBUTTON (WINDOW_FIRST + 0x1b) -#define WINDOW_MOREBUTTON (WINDOW_FIRST + 0x1c) -#define WINDOW_SPINBUTTON (WINDOW_FIRST + 0x1d) -#define WINDOW_RADIOBUTTON (WINDOW_FIRST + 0x1e) -#define WINDOW_IMAGERADIOBUTTON (WINDOW_FIRST + 0x1f) -#define WINDOW_CHECKBOX (WINDOW_FIRST + 0x20) -#define WINDOW_TRISTATEBOX (WINDOW_FIRST + 0x21) -#define WINDOW_EDIT (WINDOW_FIRST + 0x22) -#define WINDOW_MULTILINEEDIT (WINDOW_FIRST + 0x23) -#define WINDOW_COMBOBOX (WINDOW_FIRST + 0x24) -#define WINDOW_LISTBOX (WINDOW_FIRST + 0x25) -#define WINDOW_MULTILISTBOX (WINDOW_FIRST + 0x26) -#define WINDOW_FIXEDTEXT (WINDOW_FIRST + 0x27) -#define WINDOW_FIXEDLINE (WINDOW_FIRST + 0x28) -#define WINDOW_FIXEDBITMAP (WINDOW_FIRST + 0x29) -#define WINDOW_FIXEDIMAGE (WINDOW_FIRST + 0x2a) -#define WINDOW_GROUPBOX (WINDOW_FIRST + 0x2c) -#define WINDOW_SCROLLBAR (WINDOW_FIRST + 0x2d) -#define WINDOW_SCROLLBARBOX (WINDOW_FIRST + 0x2e) -#define WINDOW_SPLITTER (WINDOW_FIRST + 0x2f) -#define WINDOW_SPLITWINDOW (WINDOW_FIRST + 0x30) -#define WINDOW_SPINFIELD (WINDOW_FIRST + 0x31) -#define WINDOW_PATTERNFIELD (WINDOW_FIRST + 0x32) -#define WINDOW_NUMERICFIELD (WINDOW_FIRST + 0x33) -#define WINDOW_METRICFIELD (WINDOW_FIRST + 0x34) -#define WINDOW_CURRENCYFIELD (WINDOW_FIRST + 0x35) -#define WINDOW_DATEFIELD (WINDOW_FIRST + 0x36) -#define WINDOW_TIMEFIELD (WINDOW_FIRST + 0x37) -#define WINDOW_PATTERNBOX (WINDOW_FIRST + 0x38) -#define WINDOW_NUMERICBOX (WINDOW_FIRST + 0x39) -#define WINDOW_METRICBOX (WINDOW_FIRST + 0x3a) -#define WINDOW_CURRENCYBOX (WINDOW_FIRST + 0x3b) -#define WINDOW_DATEBOX (WINDOW_FIRST + 0x3c) -#define WINDOW_TIMEBOX (WINDOW_FIRST + 0x3d) -#define WINDOW_LONGCURRENCYFIELD (WINDOW_FIRST + 0x3e) -#define WINDOW_LONGCURRENCYBOX (WINDOW_FIRST + 0x3f) -#define WINDOW_TOOLBOX (WINDOW_FIRST + 0x41) -#define WINDOW_DOCKINGWINDOW (WINDOW_FIRST + 0x42) -#define WINDOW_STATUSBAR (WINDOW_FIRST + 0x43) -#define WINDOW_TABPAGE (WINDOW_FIRST + 0x44) -#define WINDOW_TABCONTROL (WINDOW_FIRST + 0x45) -#define WINDOW_TABDIALOG (WINDOW_FIRST + 0x46) -#define WINDOW_BORDERWINDOW (WINDOW_FIRST + 0x47) -#define WINDOW_BUTTONDIALOG (WINDOW_FIRST + 0x48) -#define WINDOW_SYSTEMCHILDWINDOW (WINDOW_FIRST + 0x49) -#define WINDOW_FIXEDBORDER (WINDOW_FIRST + 0x4a) -#define WINDOW_SLIDER (WINDOW_FIRST + 0x4b) -#define WINDOW_MENUBARWINDOW (WINDOW_FIRST + 0x4c) -#define WINDOW_TREELISTBOX (WINDOW_FIRST + 0x4d) -#define WINDOW_HELPTEXTWINDOW (WINDOW_FIRST + 0x4e) -#define WINDOW_INTROWINDOW (WINDOW_FIRST + 0x4f) -#define WINDOW_LISTBOXWINDOW (WINDOW_FIRST + 0x50) -#define WINDOW_DOCKINGAREA (WINDOW_FIRST + 0x51) -#define WINDOW_LAST (WINDOW_DOCKINGAREA) - - -// --------------- -// - Window-Bits - -// --------------- - -// By changes you must also change: rsc/vclrsc.hxx -typedef sal_Int64 WinBits; - -// Window-Bits fuer Window -#define WB_CLIPCHILDREN ((WinBits)0x00000001) -#define WB_DIALOGCONTROL ((WinBits)0x00000002) -#define WB_NODIALOGCONTROL ((WinBits)0x00000004) -#define WB_BORDER ((WinBits)0x00000008) -#define WB_NOBORDER ((WinBits)0x00000010) -#define WB_SIZEABLE ((WinBits)0x00000020) -#define WB_3DLOOK ((WinBits)0x00000040) -#define WB_AUTOSIZE ((WinBits)0x00000080) - -// Window-Bits fuer SystemWindows -#define WB_MOVEABLE ((WinBits)0x00000100) -#define WB_ROLLABLE ((WinBits)0x00000200) -#define WB_CLOSEABLE ((WinBits)0x00000400) -#define WB_STANDALONE ((WinBits)0x00000800) -#define WB_APP ((WinBits)0x00001000) -#define WB_PINABLE ((WinBits)0x00002000) -#define WB_SYSTEMWINDOW ((WinBits)SAL_CONST_INT64(0x40000000)) -// warning: do not confuse WB_SYSTEMCHILDWINDOW with the SystemChildWindow class - -// the SystemChildWindow class was there first and is a very specialized -// sytem child window type for plugged applications. The SystemChildWindow class -// explicitly should never use the WB_SYSTEMCHILDWINDOW WinBit - -// WB_SYSTEMCHILDWINDOW on the other hand is to be used on system windows -// which should be created as system child windows with (more or less) -// normal event handling -#define WB_SYSTEMCHILDWINDOW ((WinBits)SAL_CONST_INT64(0x8000000000)) -#define WB_SIZEMOVE (WB_SIZEABLE | WB_MOVEABLE) - -// Standard-Window-Bits fuer ChildWindows -#define WB_TABSTOP ((WinBits)0x00000100) -#define WB_NOTABSTOP ((WinBits)0x00000200) -#define WB_GROUP ((WinBits)0x00000400) -#define WB_NOGROUP ((WinBits)0x00000800) -#define WB_HORZ ((WinBits)0x00001000) -#define WB_VERT ((WinBits)0x00002000) -#define WB_LEFT ((WinBits)0x00004000) -#define WB_CENTER ((WinBits)0x00008000) -#define WB_RIGHT ((WinBits)0x00010000) -#define WB_TOP ((WinBits)0x00020000) -#define WB_VCENTER ((WinBits)0x00040000) -#define WB_BOTTOM ((WinBits)0x00080000) -#define WB_DRAG ((WinBits)0x00100000) -#define WB_SPIN ((WinBits)0x00200000) -#define WB_REPEAT ((WinBits)0x00400000) -#define WB_NOPOINTERFOCUS ((WinBits)0x00800000) -#define WB_WORDBREAK ((WinBits)0x01000000) -#define WB_NOLABEL ((WinBits)0x02000000) -#define WB_SORT ((WinBits)0x04000000) -#define WB_DROPDOWN ((WinBits)0x08000000) -#define WB_AUTOHSCROLL ((WinBits)SAL_CONST_INT64(0x10000000)) -#define WB_DOCKABLE ((WinBits)SAL_CONST_INT64(0x20000000)) -#define WB_AUTOVSCROLL ((WinBits)SAL_CONST_INT64(0x40000000)) -#define WB_HYPHENATION (((WinBits)SAL_CONST_INT64(0x80000000)) | WB_WORDBREAK) -#define WB_CHILDDLGCTRL ((WinBits)SAL_CONST_INT64(0x100000000000)) - -// system floating window -#define WB_SYSTEMFLOATWIN ((WinBits)SAL_CONST_INT64(0x100000000)) -#define WB_INTROWIN ((WinBits)SAL_CONST_INT64(0x200000000)) -#define WB_NOSHADOW ((WinBits)SAL_CONST_INT64(0x400000000)) -#define WB_TOOLTIPWIN ((WinBits)SAL_CONST_INT64(0x800000000)) -#define WB_OWNERDRAWDECORATION ((WinBits)SAL_CONST_INT64(0x2000000000)) -#define WB_DEFAULTWIN ((WinBits)SAL_CONST_INT64(0x4000000000)) - -#define WB_HIDE ((WinBits)SAL_CONST_INT64(0x80000000)) -#define WB_HSCROLL WB_HORZ -#define WB_VSCROLL WB_VERT -#define WB_TOPIMAGE WB_TOP - -// Window-Bits for PushButtons -#define WB_DEFBUTTON ((WinBits)0x10000000) -#define WB_NOLIGHTBORDER ((WinBits)0x20000000) -#define WB_RECTSTYLE ((WinBits)0x08000000) -#define WB_SMALLSTYLE ((WinBits)0x04000000) -#define WB_TOGGLE ((WinBits)SAL_CONST_INT64(0x1000000000)) -#define WB_BEVELBUTTON ((WinBits)SAL_CONST_INT64(0x2000000000)) - -// Window-Bits for FixedText -#define WB_PATHELLIPSIS ((WinBits)0x00100000) -#define WB_EXTRAOFFSET ((WinBits)0x02000000) -#define WB_NOMULTILINE ((WinBits)0x10000000) -#define WB_INFO ((WinBits)0x20000000) - -// Window-Bits for CheckBox -#define WB_CBLINESTYLE ((WinBits)SAL_CONST_INT64(0x2000000000)) - -// Window-Bits for Edit -#define WB_PASSWORD ((WinBits)0x01000000) -#define WB_READONLY ((WinBits)0x02000000) -#define WB_NOHIDESELECTION ((WinBits)SAL_CONST_INT64(0x1000000000)) -#define WB_FORCECTRLBACKGROUND ((WinBits)0x80000000) - -// Window-Bits for MultiLineEdit -#define WB_IGNORETAB ((WinBits)0x20000000) - -// Window-Bits for ListBox and MultiListBox -#define WB_SIMPLEMODE ((WinBits)0x20000000) - -// Window-Bits for FixedBitmap -#define WB_FAST ((WinBits)0x04000000) -#define WB_SCALE ((WinBits)0x08000000) -#define WB_TOPLEFTVISIBLE ((WinBits)0x10000000) - -// Window-Bits for ToolBox -#define WB_LINESPACING ((WinBits)0x01000000) -#define WB_SCROLL ((WinBits)0x02000000) -#define WB_FORCETABCYCLE ((WinBits)0x04000000) - -// Window-Bits for TabControl -#define WB_SINGLELINE ((WinBits)0x02000000) - -// Window-Bits for DockingWindows -#define WB_DOCKBORDER ((WinBits)0x00001000) - -// Window-Bits for SplitWindow -#define WB_NOSPLITDRAW ((WinBits)0x01000000) -#define WB_FLATSPLITDRAW ((WinBits)0x02000000) - -// Window-Bits for MessageBoxen -#define WB_OK ((WinBits)0x00100000) -#define WB_OK_CANCEL ((WinBits)0x00200000) -#define WB_YES_NO ((WinBits)0x00400000) -#define WB_YES_NO_CANCEL ((WinBits)0x00800000) -#define WB_RETRY_CANCEL ((WinBits)0x01000000) -#define WB_DEF_OK ((WinBits)0x02000000) -#define WB_DEF_CANCEL ((WinBits)0x04000000) -#define WB_DEF_RETRY ((WinBits)0x08000000) -#define WB_DEF_YES ((WinBits)SAL_CONST_INT64(0x10000000)) -#define WB_DEF_NO ((WinBits)SAL_CONST_INT64(0x20000000)) -#define WB_ABORT_RETRY_IGNORE ((WinBits)SAL_CONST_INT64(0x1000000000)) -#define WB_DEF_IGNORE ((WinBits)SAL_CONST_INT64(0x2000000000)) - -// Standard-WinBits -#define WB_STDWORK (WB_SIZEMOVE | WB_CLOSEABLE) -#define WB_STDDOCKWIN (WB_DOCKABLE | WB_MOVEABLE | WB_CLOSEABLE) -#define WB_STDFLOATWIN (WB_SIZEMOVE | WB_CLOSEABLE | WB_ROLLABLE) -#define WB_STDDIALOG (WB_MOVEABLE | WB_CLOSEABLE) -#define WB_STDMODELESS (WB_STDDIALOG) -#define WB_STDMODAL (WB_STDDIALOG) -#define WB_STDTABDIALOG (WB_STDDIALOG) -#define WB_STDTABCONTROL 0 - -// For TreeListBox -#define WB_HASBUTTONS ((WinBits)0x00800000) -#define WB_HASLINES ((WinBits)0x01000000) -#define WB_HASLINESATROOT ((WinBits)0x02000000) - -// For FileOpen Dialog -#define WB_PATH ((WinBits)0x00100000) -#define WB_OPEN ((WinBits)0x00200000) -#define WB_SAVEAS ((WinBits)0x00400000) - -// For Slider -// Window-Bits for TabControl -#define WB_SLIDERSET ((WinBits)0x02000000) - - -// -------------------- -// - extended WinBits - -// -------------------- -#define WB_EXT_DOCUMENT ((WinBits)0x00000001) -#define WB_EXT_DOCMODIFIED ((WinBits)0x00000002) - -// --------------- -// - WindowAlign - -// --------------- - -// By changes you must also change: rsc/vclrsc.hxx -enum WindowAlign { WINDOWALIGN_LEFT, WINDOWALIGN_TOP, WINDOWALIGN_RIGHT, WINDOWALIGN_BOTTOM }; -enum ImageAlign { IMAGEALIGN_LEFT, IMAGEALIGN_TOP, IMAGEALIGN_RIGHT, IMAGEALIGN_BOTTOM, - IMAGEALIGN_LEFT_TOP, IMAGEALIGN_LEFT_BOTTOM, IMAGEALIGN_TOP_LEFT, - IMAGEALIGN_TOP_RIGHT, IMAGEALIGN_RIGHT_TOP, IMAGEALIGN_RIGHT_BOTTOM, - IMAGEALIGN_BOTTOM_LEFT, IMAGEALIGN_BOTTOM_RIGHT, IMAGEALIGN_CENTER }; -enum SymbolAlign { SYMBOLALIGN_LEFT, SYMBOLALIGN_RIGHT }; - -// ------------ -// - TriState - -// ------------ - -// By changes you must also change: rsc/vclrsc.hxx -enum TriState { STATE_NOCHECK, STATE_CHECK, STATE_DONTKNOW }; - - -// ---------------------- -// - ButtonDialog-Types - -// ---------------------- - -typedef USHORT StandardButtonType; -#define BUTTON_OK ((StandardButtonType)0) -#define BUTTON_CANCEL ((StandardButtonType)1) -#define BUTTON_YES ((StandardButtonType)2) -#define BUTTON_NO ((StandardButtonType)3) -#define BUTTON_RETRY ((StandardButtonType)4) -#define BUTTON_HELP ((StandardButtonType)5) -#define BUTTON_CLOSE ((StandardButtonType)6) -#define BUTTON_MORE ((StandardButtonType)7) -#define BUTTON_IGNORE ((StandardButtonType)8) -#define BUTTON_ABORT ((StandardButtonType)9) -#define BUTTON_LESS ((StandardButtonType)10) -#define BUTTON_COUNT 11 +#include #endif // _SV_WINTYPES_HXX diff --git a/vcl/inc/vcl/wrkwin.hxx b/vcl/inc/vcl/wrkwin.hxx index 8b2701420a2f..1dd46d8debe5 100644 --- a/vcl/inc/vcl/wrkwin.hxx +++ b/vcl/inc/vcl/wrkwin.hxx @@ -105,7 +105,7 @@ public: void Restore(); void Maximize( BOOL bMaximize = TRUE ); - BOOL IsMaximized(); + BOOL IsMaximized() const; }; #endif // _SV_WRKWIN_HXX diff --git a/vcl/os2/inc/salinst.h b/vcl/os2/inc/salinst.h index 119324c1acd6..ba8dc7ddc43f 100644 --- a/vcl/os2/inc/salinst.h +++ b/vcl/os2/inc/salinst.h @@ -96,6 +96,7 @@ public: virtual void DestroyMenuItem( SalMenuItem* ); virtual SalSession* CreateSalSession(); virtual void* GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes ); + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); }; SalFrame* ImplSalCreateFrame( Os2SalInstance* pInst, HWND hWndParent, ULONG nSalFrameStyle ); diff --git a/vcl/os2/source/app/salinst.cxx b/vcl/os2/source/app/salinst.cxx index a14881c253ee..633ad4137aff 100644 --- a/vcl/os2/source/app/salinst.cxx +++ b/vcl/os2/source/app/salinst.cxx @@ -55,6 +55,7 @@ #include #include #include +#include // ======================================================================= @@ -501,12 +502,14 @@ Os2SalInstance::Os2SalInstance() mpSalWaitMutex = new vos::OMutex; mnYieldWaitCount = 0; mpSalYieldMutex->acquire(); + ::tools::SolarMutex::SetSolarMutex( mpSalYieldMutex ); } // ----------------------------------------------------------------------- Os2SalInstance::~Os2SalInstance() { + ::tools::SolarMutex::SetSolarMutex( 0 ); mpSalYieldMutex->release(); delete mpSalYieldMutex; delete mpSalWaitMutex; @@ -811,6 +814,10 @@ void* Os2SalInstance::GetConnectionIdentifier( ConnectionIdentifierType& rReturn return (void*) ""; } +void Os2SalInstance::AddToRecentDocumentList(const rtl::OUString& /*rFileUrl*/, const rtl::OUString& /*rMimeType*/) +{ +} + // ----------------------------------------------------------------------- SalTimer* Os2SalInstance::CreateSalTimer() diff --git a/vcl/os2/source/gdi/salgdi.cxx b/vcl/os2/source/gdi/salgdi.cxx index b6616eb3a24b..082e690c09e7 100644 --- a/vcl/os2/source/gdi/salgdi.cxx +++ b/vcl/os2/source/gdi/salgdi.cxx @@ -1016,7 +1016,7 @@ BOOL Os2SalGraphics::drawEPS( long nX, long nY, long nWidth, long nHeight, void* } } - delete pBuf; + delete [] pBuf; return bRet; } diff --git a/vcl/os2/source/window/salframe.cxx b/vcl/os2/source/window/salframe.cxx index 8860d68d683e..5e4b843c7cff 100644 --- a/vcl/os2/source/window/salframe.cxx +++ b/vcl/os2/source/window/salframe.cxx @@ -2172,6 +2172,7 @@ void Os2SalFrame::UpdateSettings( AllSettings& rSettings ) aStyleSettings.SetDeactiveBorderColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_INACTIVEBORDER, 0 ) ) ); aStyleSettings.SetMenuColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_MENU, 0 ) ) ); aStyleSettings.SetMenuTextColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_MENUTEXT, 0 ) ) ); + aStyleSettings.SetMenuBarTextColor( ImplOS2ColorToSal( WinQuerySysColor( HWND_DESKTOP, SYSCLR_MENUTEXT, 0 ) ) ); } aStyleSettings.SetDialogTextColor( aStyleSettings.GetButtonTextColor() ); aStyleSettings.SetRadioCheckTextColor( aStyleSettings.GetButtonTextColor() ); @@ -3319,7 +3320,7 @@ static long ImplHandleIMEConversion( Os2SalFrame* pFrame, MPARAM nMP2Param ) if ( pBuf ) { aEvt.maText = XubString( pBuf, (USHORT)nBufLen ); - delete pBuf; + delete [] pBuf; if ( pAttrBuf ) { USHORT nTextLen = aEvt.maText.Len(); @@ -3345,7 +3346,7 @@ static long ImplHandleIMEConversion( Os2SalFrame* pFrame, MPARAM nMP2Param ) } aEvt.mpTextAttr = pSalAttrAry; } - delete pAttrBuf; + delete [] pAttrBuf; } if ( bLastCursor ) aEvt.mnCursorPos = aEvt.maText.Len(); @@ -3357,7 +3358,7 @@ static long ImplHandleIMEConversion( Os2SalFrame* pFrame, MPARAM nMP2Param ) // wieder zerstoeren pFrame->CallCallback( SALEVENT_EXTTEXTINPUT, (void*)&aEvt ); if ( pSalAttrAry ) - delete pSalAttrAry; + delete [] pSalAttrAry; } else pIMEData->mpReleaseIME( hWnd, hIMI ); diff --git a/vcl/prj/build.lst b/vcl/prj/build.lst index cd6d32dc3d2a..5d2aaf90c6f7 100644 --- a/vcl/prj/build.lst +++ b/vcl/prj/build.lst @@ -1,4 +1,4 @@ -vc vcl : apple_remote BOOST:boost rsc sot ucbhelper unotools ICU:icu i18npool i18nutil unoil ridljar X11_EXTENSIONS:x11_extensions offuh basegfx basebmp tools transex3 icc SO:print_header cpputools NULL +vc vcl : l10n apple_remote BOOST:boost rsc sot ucbhelper unotools ICU:icu GRAPHITE:graphite i18npool i18nutil unoil ridljar X11_EXTENSIONS:x11_extensions offuh basegfx basebmp tools transex3 icc SO:print_header cpputools shell NULL vc vcl usr1 - all vc_mkout NULL vc vcl\inc nmake - all vc_inc NULL vc vcl\source\glyphs nmake - all vc_glyphs vc_inc NULL @@ -14,13 +14,15 @@ vc vcl\os2\source\app nmake - p vc__appp vc_inc NULL vc vcl\os2\source\gdi nmake - p vc__gdip vc_inc NULL vc vcl\os2\source\window nmake - p vc__winp vc_inc NULL vc vcl\os2\source\src nmake - p vc__srcp vc_inc NULL -vc vcl\source\components nmake - all vc_components NULL +vc vcl\source\components nmake - all vc_components vc_inc NULL vc vcl\win\source\app nmake - w vc__appw vc_inc NULL vc vcl\win\source\gdi nmake - w vc__gdiw vc_inc NULL vc vcl\win\source\window nmake - w vc__winw vc_inc NULL vc vcl\win\source\src nmake - w vc__srcw vc_inc NULL vc vcl\unx\source\plugadapt nmake - u vc__plug vc_inc NULL +vc vcl\unx\source\desktopdetect nmake - u vc__desk vc_inc NULL vc vcl\unx\source\app nmake - u vc__appu vc_inc NULL +vc vcl\unx\source\dtrans nmake - u vc__dtru vc_inc NULL vc vcl\unx\source\fontmanager nmake - u vc__ftmu vc_inc NULL vc vcl\unx\source\gdi nmake - u vc__gdiu vc_inc NULL vc vcl\unx\source\printer nmake - u vc__prnu vc_inc NULL @@ -32,8 +34,10 @@ vc vcl\unx\gtk\window nmake - u vc__gtkw vc_inc NULL vc vcl\unx\gtk\gdi nmake - u vc__gtkg vc_inc NULL vc vcl\unx\headless nmake - u vc__hl vc_inc NULL vc vcl\unx\kde nmake - u vc__kde vc_inc NULL +vc vcl\unx\kde4 nmake - u vc__kde4 vc_inc NULL vc vcl\aqua\source\a11y nmake - u vc__aquy vc_inc NULL vc vcl\aqua\source\app nmake - u vc__appa vc_inc NULL +vc vcl\aqua\source\dtrans nmake - u vc__dtra vc_inc NULL vc vcl\aqua\source\gdi nmake - u vc__gdia vc_inc NULL vc vcl\aqua\source\res nmake - u vc__resa NULL vc vcl\aqua\source\window nmake - u vc__wina vc_inc NULL @@ -41,6 +45,6 @@ vc vcl\mac\source\app nmake - m vc__appm vc_inc NULL vc vcl\mac\source\gdi nmake - m vc__gdim vc_inc NULL vc vcl\mac\source\window nmake - m vc__winm vc_inc NULL vc vcl\mac\source\src nmake - m vc__srcm vc_inc NULL -vc vcl\util nmake - all vc_util vc__plug.u vc__aquy.u vc__appa.u vc__appm.m vc__appu.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL +vc vcl\util nmake - all vc_util vc__plug.u vc__desk.u vc__aquy.u vc__appa.u vc__dtra.u vc__appm.m vc__appu.u vc__dtru.u vc__appw.w vc__appp.p vc__gdia.u vc__gdim.m vc__gdiu.u vc__gdiw.w vc__gdip.p vc__srcm.m vc__srcw.w vc__srcp.p vc__wina.u vc__winm.m vc__winu.u vc__winw.w vc__winp.p vc__gtka.u vc__gtky.u vc__gtkw.u vc__gtkg.u vc__kde.u vc__kde4.u vc__hl.u vc__ftmu.u vc__prgu.u vc__prnu.u vc_app vc_ctrl vc_gdi vc_hlp vc_src vc_win vc_glyphs vc_fts vc_components NULL vc vcl\util\linksvp nmake - u vc_lsvp vc_util NULL vc vcl\workben nmake - all vc_wrkb vc_util vc_salmain NULL diff --git a/vcl/prj/d.lst b/vcl/prj/d.lst index d9c14f46b8d1..54af0d2e289d 100644 --- a/vcl/prj/d.lst +++ b/vcl/prj/d.lst @@ -1,14 +1,12 @@ mkdir: %COMMON_DEST%\bin%_EXT%\hid mkdir: %_DEST%\inc%_EXT%\vcl -mkdir: %_DEST%\inc%_EXT%\vcl\plug -mkdir: %_DEST%\inc%_EXT%\vcl\plug\vcl ..\%COMMON_OUTDIR%\bin\*.zip %COMMON_DEST%\bin%_EXT%\*.zip ..\%COMMON_OUTDIR%\misc\*.hid %COMMON_DEST%\bin%_EXT%\hid\*.hid ..\%__SRC%\bin\vcl*.res %_DEST%\bin%_EXT%\vcl*.res ..\%__SRC%\bin\vcl?????.dll %_DEST%\bin%_EXT%\vcl?????.dll ..\%__SRC%\bin\vcl?????.sym %_DEST%\bin%_EXT%\vcl?????.sym -..\%__SRC%\lib\libvcl*.so %_DEST%\lib%_EXT%\libvcl*.so +..\%__SRC%\lib\lib*.so %_DEST%\lib%_EXT%\lib*.so ..\%__SRC%\lib\*.dylib %_DEST%\lib%_EXT%\*.dylib ..\%__SRC%\lib\ivcl.lib %_DEST%\lib%_EXT%\ivcl.lib ..\%__SRC%\misc\vcl?????.map %_DEST%\bin%_EXT%\vcl?????.map @@ -60,6 +58,7 @@ mkdir: %_DEST%\inc%_EXT%\vcl\plug\vcl ..\inc\vcl\imagerepository.hxx %_DEST%\inc%_EXT%\vcl\imagerepository.hxx ..\inc\vcl\imgcons.hxx %_DEST%\inc%_EXT%\vcl\imgcons.hxx ..\inc\vcl\imgctrl.hxx %_DEST%\inc%_EXT%\vcl\imgctrl.hxx +..\inc\vcl\impdel.hxx %_DEST%\inc%_EXT%\vcl\impdel.hxx ..\inc\vcl\inputctx.hxx %_DEST%\inc%_EXT%\vcl\inputctx.hxx ..\inc\vcl\javachild.hxx %_DEST%\inc%_EXT%\vcl\javachild.hxx ..\inc\vcl\jobset.hxx %_DEST%\inc%_EXT%\vcl\jobset.hxx @@ -153,3 +152,4 @@ mkdir: %_DEST%\inc%_EXT%\vcl\plug\vcl ..\inc\vcl\ppdparser.hxx %_DEST%\inc%_EXT%\vcl\ppdparser.hxx ..\inc\vcl\helper.hxx %_DEST%\inc%_EXT%\vcl\helper.hxx ..\inc\vcl\strhelper.hxx %_DEST%\inc%_EXT%\vcl\strhelper.hxx +..\inc\vcl\lazydelete.hxx %_DEST%\inc%_EXT%\vcl\lazydelete.hxx \ No newline at end of file diff --git a/vcl/source/app/dbggui.cxx b/vcl/source/app/dbggui.cxx index c8567264b9b9..36d0991c7640 100644 --- a/vcl/source/app/dbggui.cxx +++ b/vcl/source/app/dbggui.cxx @@ -1782,7 +1782,7 @@ void DbgDialogTest( Window* pWindow ) i++; } - delete pRectAry; + delete [] pRectAry; } // ======================================================================= diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 9d398aef10cd..516b23dd76be 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -61,6 +61,13 @@ void SalFrame::Flush( const Rectangle& ) // ----------------------------------------------------------------------- +void SalFrame::SetRepresentedURL( const rtl::OUString& ) +{ + // currently this is Mac only functionality +} + +// ----------------------------------------------------------------------- + SalInstance::~SalInstance() { } diff --git a/vcl/source/app/session.cxx b/vcl/source/app/session.cxx index ed8e355c2071..e82e93a9ccca 100644 --- a/vcl/source/app/session.cxx +++ b/vcl/source/app/session.cxx @@ -38,6 +38,7 @@ #include #include #include +#include #include @@ -81,6 +82,7 @@ class VCLSession : public cppu::WeakComponentImplHelper1 < XSessionManagerClient void callSaveRequested( bool bShutdown, bool bCancelable ); void callShutdownCancelled(); void callInteractionGranted( bool bGranted ); + void callQuit(); public: VCLSession(); virtual ~VCLSession(); @@ -199,6 +201,27 @@ void VCLSession::callShutdownCancelled() Application::AcquireSolarMutex( nAcquireCount ); } +void VCLSession::callQuit() +{ + std::list< Listener > aListeners; + { + osl::MutexGuard aGuard( m_aMutex ); + // copy listener list since calling a listener may remove it. + aListeners = m_aListeners; + // set back interaction state + m_bInteractionRequested = m_bInteractionDone = m_bInteractionGranted = false; + } + + ULONG nAcquireCount = Application::ReleaseSolarMutex(); + for( std::list< Listener >::const_iterator it = aListeners.begin(); it != aListeners.end(); ++it ) + { + Reference< XSessionManagerListener2 > xListener2( it->m_xListener, UNO_QUERY ); + if( xListener2.is() ) + xListener2->doQuit(); + } + Application::AcquireSolarMutex( nAcquireCount ); +} + void VCLSession::SalSessionEventProc( SalSessionEvent* pEvent ) { switch( pEvent->m_eType ) @@ -218,6 +241,9 @@ void VCLSession::SalSessionEventProc( SalSessionEvent* pEvent ) case ShutdownCancel: pOneInstance->callShutdownCancelled(); break; + case Quit: + pOneInstance->callQuit(); + break; } } diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx old mode 100644 new mode 100755 index 12213c25a64f..bd90d8824d91 --- a/vcl/source/app/settings.cxx +++ b/vcl/source/app/settings.cxx @@ -37,14 +37,17 @@ #include "vcl/event.hxx" #include "vcl/settings.hxx" #include "vcl/i18nhelp.hxx" -#include "vcl/fontcfg.hxx" +#include "unotools/fontcfg.hxx" #include "vcl/configsettings.hxx" #include "vcl/gradient.hxx" #include "vcl/unohelp.hxx" +#include "vcl/bitmapex.hxx" +#include "vcl/impimagetree.hxx" #include "unotools/localedatawrapper.hxx" #include "unotools/collatorwrapper.hxx" #include "unotools/configmgr.hxx" #include "unotools/confignode.hxx" +#include #ifdef WNT #include "tools/prewin.h" @@ -66,7 +69,6 @@ DBG_NAME( AllSettings ) STYLE_OPTION_NOMNEMONICS) // ======================================================================= - ImplMachineData::ImplMachineData() { mnRefCount = 1; @@ -189,7 +191,7 @@ ImplMouseData::ImplMouseData() mnActionDelay = 250; mnMenuDelay = 150; mnFollow = MOUSE_FOLLOW_MENU | MOUSE_FOLLOW_DDLIST; - mbNoWheelActionWithoutFocus = FALSE; + mnWheelBehavior = MOUSE_WHEEL_FOCUS_ONLY; } // ----------------------------------------------------------------------- @@ -217,7 +219,7 @@ ImplMouseData::ImplMouseData( const ImplMouseData& rData ) mnActionDelay = rData.mnActionDelay; mnMenuDelay = rData.mnMenuDelay; mnFollow = rData.mnFollow; - mbNoWheelActionWithoutFocus = rData.mbNoWheelActionWithoutFocus; + mnWheelBehavior = rData.mnWheelBehavior; } // ----------------------------------------------------------------------- @@ -308,7 +310,7 @@ BOOL MouseSettings::operator ==( const MouseSettings& rSet ) const (mpData->mnActionDelay == rSet.mpData->mnActionDelay) && (mpData->mnMenuDelay == rSet.mpData->mnMenuDelay) && (mpData->mnFollow == rSet.mpData->mnFollow) && - (mpData->mbNoWheelActionWithoutFocus == rSet.mpData->mbNoWheelActionWithoutFocus) ) + (mpData->mnWheelBehavior == rSet.mpData->mnWheelBehavior ) ) return TRUE; else return FALSE; @@ -478,6 +480,7 @@ ImplStyleData::ImplStyleData( const ImplStyleData& rData ) : maMenuHighlightColor( rData.maMenuHighlightColor ), maMenuHighlightTextColor( rData.maMenuHighlightTextColor ), maMenuTextColor( rData.maMenuTextColor ), + maMenuBarTextColor( rData.maMenuBarTextColor ), maMonoColor( rData.maMonoColor ), maRadioCheckTextColor( rData.maRadioCheckTextColor ), maShadowColor( rData.maShadowColor ), @@ -548,7 +551,7 @@ void ImplStyleData::SetStandardStyles() Font aStdFont( FAMILY_SWISS, Size( 0, 8 ) ); aStdFont.SetCharSet( gsl_getSystemTextEncoding() ); aStdFont.SetWeight( WEIGHT_NORMAL ); - aStdFont.SetName( vcl::DefaultFontConfiguration::get()->getUserInterfaceFont(com::sun::star::lang::Locale( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("en") ), rtl::OUString(), rtl::OUString() ) ) ); + aStdFont.SetName( utl::DefaultFontConfiguration::get()->getUserInterfaceFont(com::sun::star::lang::Locale( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("en") ), rtl::OUString(), rtl::OUString() ) ) ); maAppFont = aStdFont; maHelpFont = aStdFont; maMenuFont = aStdFont; @@ -597,6 +600,7 @@ void ImplStyleData::SetStandardStyles() maMenuBarColor = Color( COL_LIGHTGRAY ); maMenuBorderColor = Color( COL_LIGHTGRAY ); maMenuTextColor = Color( COL_BLACK ); + maMenuBarTextColor = Color( COL_BLACK ); maMenuHighlightColor = Color( COL_BLUE ); maMenuHighlightTextColor = Color( COL_WHITE ); maHighlightColor = Color( COL_BLUE ); @@ -704,6 +708,7 @@ void StyleSettings::Set3DColors( const Color& rColor ) case STYLE_SYMBOLS_INDUSTRIAL: return ::rtl::OUString::createFromAscii( "industrial" ); case STYLE_SYMBOLS_CRYSTAL: return ::rtl::OUString::createFromAscii( "crystal" ); case STYLE_SYMBOLS_TANGO: return ::rtl::OUString::createFromAscii( "tango" ); + case STYLE_SYMBOLS_OXYGEN: return ::rtl::OUString::createFromAscii( "oxygen" ); case STYLE_SYMBOLS_CLASSIC: return ::rtl::OUString::createFromAscii( "classic" ); } @@ -724,6 +729,8 @@ ULONG StyleSettings::ImplNameToSymbolsStyle( const ::rtl::OUString &rName ) cons return STYLE_SYMBOLS_CRYSTAL; else if ( rName == ::rtl::OUString::createFromAscii( "tango" ) ) return STYLE_SYMBOLS_TANGO; + else if ( rName == ::rtl::OUString::createFromAscii( "oxygen" ) ) + return STYLE_SYMBOLS_OXYGEN; else if ( rName == ::rtl::OUString::createFromAscii( "classic" ) ) return STYLE_SYMBOLS_CLASSIC; @@ -757,12 +764,12 @@ ULONG StyleSettings::GetCurrentSymbolsStyle() const // style selected in Tools -> Options... -> OpenOffice.org -> View ULONG nStyle = GetSymbolsStyle(); - if ( nStyle == STYLE_SYMBOLS_AUTO ) + if ( nStyle == STYLE_SYMBOLS_AUTO || ( !CheckSymbolStyle (nStyle) ) ) { // the preferred style can be read from the desktop setting by the desktop native widgets modules ULONG nPreferredStyle = GetPreferredSymbolsStyle(); - if ( nPreferredStyle == STYLE_SYMBOLS_AUTO ) + if ( nPreferredStyle == STYLE_SYMBOLS_AUTO || ( !CheckSymbolStyle (nPreferredStyle) ) ) { // use a hardcoded desktop-specific fallback if no preferred style has been detected @@ -778,7 +785,10 @@ ULONG StyleSettings::GetCurrentSymbolsStyle() const nPreferredStyle = snFallbackDesktopStyle; } - nStyle = GetHighContrastMode()? STYLE_SYMBOLS_HICONTRAST: nPreferredStyle; + if (GetHighContrastMode() && CheckSymbolStyle (STYLE_SYMBOLS_HICONTRAST) ) + nStyle = STYLE_SYMBOLS_HICONTRAST; + else + nStyle = nPreferredStyle; } return nStyle; @@ -812,6 +822,33 @@ ULONG StyleSettings::GetAutoSymbolsStyle() const nRet = STYLE_SYMBOLS_TANGO; else if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "kde" ) ) nRet = STYLE_SYMBOLS_CRYSTAL; + else if( rDesktopEnvironment.equalsIgnoreAsciiCaseAscii( "kde4" ) ) + nRet = STYLE_SYMBOLS_OXYGEN; + } + + // falback to any existing style + if ( ! CheckSymbolStyle (nRet) ) + { + for ( ULONG n = 0 ; n <= STYLE_SYMBOLS_THEMES_MAX ; n++ ) + { + ULONG nStyleToCheck = n; + + // auto is not a real theme => can't be fallback + if ( nStyleToCheck == STYLE_SYMBOLS_AUTO ) + continue; + + // will check hicontrast in the end + if ( nStyleToCheck == STYLE_SYMBOLS_HICONTRAST ) + continue; + if ( nStyleToCheck == STYLE_SYMBOLS_THEMES_MAX ) + nStyleToCheck = STYLE_SYMBOLS_HICONTRAST; + + if ( CheckSymbolStyle ( nStyleToCheck ) ) + { + nRet = nStyleToCheck; + n = STYLE_SYMBOLS_THEMES_MAX; + } + } } return nRet; @@ -819,6 +856,14 @@ ULONG StyleSettings::GetAutoSymbolsStyle() const // ----------------------------------------------------------------------- +bool StyleSettings::CheckSymbolStyle( ULONG nStyle ) const +{ + static ImplImageTreeSingletonRef aImageTree; + return aImageTree->checkStyle( ImplSymbolsStyleToName( nStyle ) ); +} + +// ----------------------------------------------------------------------- + void StyleSettings::SetStandardStyles() { CopyData(); @@ -1028,6 +1073,7 @@ BOOL StyleSettings::operator ==( const StyleSettings& rSet ) const (mpData->maMenuBarColor == rSet.mpData->maMenuBarColor) && (mpData->maMenuBorderColor == rSet.mpData->maMenuBorderColor) && (mpData->maMenuTextColor == rSet.mpData->maMenuTextColor) && + (mpData->maMenuBarTextColor == rSet.mpData->maMenuBarTextColor) && (mpData->maMenuHighlightColor == rSet.mpData->maMenuHighlightColor) && (mpData->maMenuHighlightTextColor == rSet.mpData->maMenuHighlightTextColor) && (mpData->maHighlightColor == rSet.mpData->maHighlightColor) && @@ -1066,7 +1112,6 @@ BOOL StyleSettings::operator ==( const StyleSettings& rSet ) const ImplMiscData::ImplMiscData() { mnRefCount = 1; - mnTwoDigitYearStart = 1930; mnEnableATT = sal::static_int_cast(~0U); mnDisablePrinting = sal::static_int_cast(~0U); static const char* pEnv = getenv("SAL_DECIMALSEP_ENABLED" ); // set default without UI @@ -1078,7 +1123,6 @@ ImplMiscData::ImplMiscData() ImplMiscData::ImplMiscData( const ImplMiscData& rData ) { mnRefCount = 1; - mnTwoDigitYearStart = rData.mnTwoDigitYearStart; mnEnableATT = rData.mnEnableATT; mnDisablePrinting = rData.mnDisablePrinting; mbEnableLocalizedDecimalSep = rData.mbEnableLocalizedDecimalSep; @@ -1152,8 +1196,7 @@ BOOL MiscSettings::operator ==( const MiscSettings& rSet ) const if ( mpData == rSet.mpData ) return TRUE; - if ( (mpData->mnTwoDigitYearStart == rSet.mpData->mnTwoDigitYearStart ) && - (mpData->mnEnableATT == rSet.mpData->mnEnableATT ) && + if ( (mpData->mnEnableATT == rSet.mpData->mnEnableATT ) && (mpData->mnDisablePrinting == rSet.mpData->mnDisablePrinting ) && (mpData->mbEnableLocalizedDecimalSep == rSet.mpData->mbEnableLocalizedDecimalSep ) ) return TRUE; @@ -1510,28 +1553,20 @@ BOOL HelpSettings::operator ==( const HelpSettings& rSet ) const // ======================================================================= -static BOOL ImplCompareLocales( const ::com::sun::star::lang::Locale& L1, const ::com::sun::star::lang::Locale& L2 ) -{ - return ( ( L1.Language == L2.Language ) && - ( L1.Country == L2.Country ) && - ( L1.Variant == L2.Variant ) ); -} - -// ======================================================================= - ImplAllSettingsData::ImplAllSettingsData() { mnRefCount = 1; mnSystemUpdate = SETTINGS_ALLSETTINGS; mnWindowUpdate = SETTINGS_ALLSETTINGS; meLanguage = LANGUAGE_SYSTEM; - meUILanguage = LANGUAGE_SYSTEM; + meUILanguage = LANGUAGE_SYSTEM; mpLocaleDataWrapper = NULL; mpUILocaleDataWrapper = NULL; mpCollatorWrapper = NULL; mpUICollatorWrapper = NULL; mpI18nHelper = NULL; mpUII18nHelper = NULL; + maMiscSettings.SetEnableLocalizedDecimalSep( maSysLocale.GetOptions().IsDecimalSeparatorAsLocale() ); } // ----------------------------------------------------------------------- @@ -1543,15 +1578,12 @@ ImplAllSettingsData::ImplAllSettingsData( const ImplAllSettingsData& rData ) : maMiscSettings( rData.maMiscSettings ), maNotificationSettings( rData.maNotificationSettings ), maHelpSettings( rData.maHelpSettings ), - maLocale( rData.maLocale ), - maUILocale( rData.maUILocale ) - + maLocale( rData.maLocale ) { mnRefCount = 1; mnSystemUpdate = rData.mnSystemUpdate; mnWindowUpdate = rData.mnWindowUpdate; meLanguage = rData.meLanguage; - meUILanguage = rData.meUILanguage; // Pointer couldn't shared and objects haven't a copy ctor // So we create the cache objects new, if the GetFunction is // called @@ -1747,11 +1779,7 @@ ULONG AllSettings::Update( ULONG nFlags, const AllSettings& rSet ) if ( nFlags & SETTINGS_UILOCALE ) { - if ( mpData->meUILanguage || rSet.mpData->meUILanguage ) - { - SetUILanguage( rSet.mpData->meUILanguage ); - nChangeFlags |= SETTINGS_UILOCALE; - } + // UILocale can't be changed } return nChangeFlags; @@ -1790,9 +1818,6 @@ ULONG AllSettings::GetChangeFlags( const AllSettings& rSet ) const if ( mpData->meLanguage || rSet.mpData->meLanguage ) nChangeFlags |= SETTINGS_LOCALE; - if ( mpData->meUILanguage || rSet.mpData->meUILanguage ) - nChangeFlags |= SETTINGS_UILOCALE; - return nChangeFlags; } @@ -1814,18 +1839,13 @@ BOOL AllSettings::operator ==( const AllSettings& rSet ) const (mpData->maNotificationSettings == rSet.mpData->maNotificationSettings) && (mpData->maHelpSettings == rSet.mpData->maHelpSettings) && (mpData->mnSystemUpdate == rSet.mpData->mnSystemUpdate) && + (mpData->maLocale == rSet.mpData->maLocale) && (mpData->mnWindowUpdate == rSet.mpData->mnWindowUpdate) ) { - // special treatment for Locale, because maLocale is only - // initialized after first call of GetLocale(). - ::com::sun::star::lang::Locale aEmptyLocale; - if ( ( ImplCompareLocales( mpData->maLocale, aEmptyLocale ) && ImplCompareLocales( rSet.mpData->maLocale, aEmptyLocale ) ) - || ImplCompareLocales( GetLocale(), rSet.GetLocale() ) ) - { - return TRUE; - } + return TRUE; } - return FALSE; + else + return FALSE; } // ----------------------------------------------------------------------- @@ -1854,70 +1874,39 @@ void AllSettings::SetLocale( const ::com::sun::star::lang::Locale& rLocale ) // ----------------------------------------------------------------------- -void AllSettings::SetUILocale( const ::com::sun::star::lang::Locale& rLocale ) +void AllSettings::SetUILocale( const ::com::sun::star::lang::Locale& ) { - CopyData(); - - mpData->maUILocale = rLocale; - - if ( !rLocale.Language.getLength() ) - mpData->meUILanguage = LANGUAGE_SYSTEM; - else - mpData->meUILanguage = MsLangId::convertLocaleToLanguage( rLocale ); - if ( mpData->mpUILocaleDataWrapper ) - { - delete mpData->mpUILocaleDataWrapper; - mpData->mpUILocaleDataWrapper = NULL; - } - if ( mpData->mpUII18nHelper ) - { - delete mpData->mpUII18nHelper; - mpData->mpUII18nHelper = NULL; - } + // there is only one UILocale per process } // ----------------------------------------------------------------------- void AllSettings::SetLanguage( LanguageType eLang ) { - CopyData(); - - mpData->meLanguage = eLang; - - // Will be calculated in GetLocale() - mpData->maLocale = ::com::sun::star::lang::Locale(); - if ( mpData->mpLocaleDataWrapper ) + if ( eLang != mpData->meLanguage ) { - delete mpData->mpLocaleDataWrapper; - mpData->mpLocaleDataWrapper = NULL; - } - if ( mpData->mpI18nHelper ) - { - delete mpData->mpI18nHelper; - mpData->mpI18nHelper = NULL; + CopyData(); + + mpData->meLanguage = eLang; + MsLangId::convertLanguageToLocale( GetLanguage(), ((AllSettings*)this)->mpData->maLocale ); + if ( mpData->mpLocaleDataWrapper ) + { + delete mpData->mpLocaleDataWrapper; + mpData->mpLocaleDataWrapper = NULL; + } + if ( mpData->mpI18nHelper ) + { + delete mpData->mpI18nHelper; + mpData->mpI18nHelper = NULL; + } } } // ----------------------------------------------------------------------- -void AllSettings::SetUILanguage( LanguageType eLang ) +void AllSettings::SetUILanguage( LanguageType ) { - CopyData(); - - mpData->meUILanguage = eLang; - - // Will be calculated in GetUILocale() - mpData->maUILocale = ::com::sun::star::lang::Locale(); - if ( mpData->mpUILocaleDataWrapper ) - { - delete mpData->mpUILocaleDataWrapper; - mpData->mpUILocaleDataWrapper = NULL; - } - if ( mpData->mpUII18nHelper ) - { - delete mpData->mpUII18nHelper; - mpData->mpUII18nHelper = NULL; - } + // there is only one UILanguage per process } // ----------------------------------------------------------------------- @@ -1970,8 +1959,7 @@ BOOL AllSettings::GetLayoutRTL() const const ::com::sun::star::lang::Locale& AllSettings::GetLocale() const { if ( !mpData->maLocale.Language.getLength() ) - MsLangId::convertLanguageToLocale( GetLanguage(), - ((AllSettings*)this)->mpData->maLocale ); + mpData->maLocale = mpData->maSysLocale.GetLocale(); return mpData->maLocale; } @@ -1980,9 +1968,9 @@ const ::com::sun::star::lang::Locale& AllSettings::GetLocale() const const ::com::sun::star::lang::Locale& AllSettings::GetUILocale() const { + // the UILocale is never changed if ( !mpData->maUILocale.Language.getLength() ) - MsLangId::convertLanguageToLocale( GetUILanguage(), - ((AllSettings*)this)->mpData->maUILocale ); + mpData->maUILocale = mpData->maSysLocale.GetUILocale(); return mpData->maUILocale; } @@ -1991,8 +1979,9 @@ const ::com::sun::star::lang::Locale& AllSettings::GetUILocale() const LanguageType AllSettings::GetLanguage() const { + // meLanguage == LANGUAGE_SYSTEM means: use settings from SvtSysLocale if ( mpData->meLanguage == LANGUAGE_SYSTEM ) - return MsLangId::getSystemLanguage(); + return mpData->maSysLocale.GetLanguage(); return mpData->meLanguage; } @@ -2001,10 +1990,8 @@ LanguageType AllSettings::GetLanguage() const LanguageType AllSettings::GetUILanguage() const { - if ( mpData->meUILanguage == LANGUAGE_SYSTEM ) - return MsLangId::getSystemUILanguage(); - - return mpData->meUILanguage; + // the UILanguage is never changed + return mpData->maSysLocale.GetUILanguage(); } // ----------------------------------------------------------------------- @@ -2073,3 +2060,22 @@ const CollatorWrapper& AllSettings::GetUICollatorWrapper() const } */ +void AllSettings::LocaleSettingsChanged( sal_uInt32 nHint ) +{ + AllSettings aAllSettings( Application::GetSettings() ); + if ( nHint & SYSLOCALEOPTIONS_HINT_DECSEP ) + { + MiscSettings aMiscSettings = aAllSettings.GetMiscSettings(); + BOOL bIsDecSepAsLocale = aAllSettings.mpData->maSysLocale.GetOptions().IsDecimalSeparatorAsLocale(); + if ( aMiscSettings.GetEnableLocalizedDecimalSep() != bIsDecSepAsLocale ) + { + aMiscSettings.SetEnableLocalizedDecimalSep( bIsDecSepAsLocale ); + aAllSettings.SetMiscSettings( aMiscSettings ); + } + } + + if ( (nHint & SYSLOCALEOPTIONS_HINT_LOCALE) ) + aAllSettings.SetLocale( aAllSettings.mpData->maSysLocale.GetOptions().GetLocale() ); + + Application::SetSettings( aAllSettings ); +} diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx index 262910d18c82..7f329f2d24d5 100644 --- a/vcl/source/app/svapp.cxx +++ b/vcl/source/app/svapp.cxx @@ -31,63 +31,53 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_vcl.hxx" -#ifndef _SV_SVSYS_HXX -#include -#endif -#include -#include -#include -#ifndef _VOS_PROCESS_HXX -#include -#endif -#ifndef _VOS_MUTEX_HXX -#include -#endif -#include -#include -#include -#include -#include -#include -#ifndef _ACCMGR_HXX -#include -#endif -#ifndef _SV_KEYCOD_HXX -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifndef _SV_SVIDS_HRC -#include -#endif -#include +#include "svsys.h" +#include "vcl/salinst.hxx" +#include "vcl/salframe.hxx" +#include "vcl/salsys.hxx" +#include "vos/process.hxx" +#include "vos/mutex.hxx" +#include "tools/tools.h" +#include "tools/debug.hxx" +#include "tools/time.hxx" +#include "i18npool/mslangid.hxx" +#include "vcl/svdata.hxx" +#include "vcl/settings.hxx" +#include "vcl/accmgr.hxx" +#include "vcl/keycod.hxx" +#include "vcl/event.hxx" +#include "vcl/vclevent.hxx" +#include "vcl/virdev.hxx" +#include "vcl/windata.hxx" +#include "vcl/window.h" +#include "vcl/wrkwin.hxx" +#include "vcl/idlemgr.hxx" +#include "vcl/svapp.hxx" +#include "vcl/cvtgrf.hxx" +#include "vcl/unowrap.hxx" +#include "vcl/xconnection.hxx" +#include "vcl/svids.hrc" +#include "vcl/timer.hxx" -#include +#include "vcl/unohelp.hxx" -#include -#include -#include -#include -#include +#include "com/sun/star/uno/Reference.h" +#include "com/sun/star/awt/XToolkit.hpp" +#include "com/sun/star/uno/XNamingService.hpp" +#include "com/sun/star/lang/XMultiServiceFactory.hpp" +#include "comphelper/processfactory.hxx" -#include -#include +#include "osl/module.h" +#include "osl/file.hxx" #include "osl/thread.h" #include "rtl/tencinfo.h" -#include -#include +#include "rtl/instance.hxx" +#include "vcl/salimestatus.hxx" #include #include +#include using namespace ::com::sun::star::uno; @@ -467,7 +457,7 @@ void Application::Execute() // ----------------------------------------------------------------------- -void Application::Reschedule( bool bAllEvents ) +inline void ImplYield( bool i_bWait, bool i_bAllEvents ) { ImplSVData* pSVData = ImplGetSVData(); @@ -477,34 +467,45 @@ void Application::Reschedule( bool bAllEvents ) Timer::ImplTimerCallbackProc(); pSVData->maAppData.mnDispatchLevel++; - pSVData->mpDefInst->Yield( false, bAllEvents ); + // do not wait for events if application was already quit; in that + // case only dispatch events already available + // do not wait for events either if the app decided that it is too busy for timers + // (feature added for the slideshow) + pSVData->mpDefInst->Yield( i_bWait && !pSVData->maAppData.mbAppQuit && !pSVData->maAppData.mbNoYield, i_bAllEvents ); pSVData->maAppData.mnDispatchLevel--; // flush lazy deleted objects if( pSVData->maAppData.mnDispatchLevel == 0 ) vcl::LazyDelete::flush(); + + // the system timer events will not necesseraly come in in non waiting mode + // e.g. on aqua; need to trigger timer checks manually + if( pSVData->maAppData.mbNoYield && !pSVData->mbNoCallTimer ) + { + do + { + Timer::ImplTimerCallbackProc(); + } + while( pSVData->mbNotAllTimerCalled ); + } + + // call post yield listeners + if( pSVData->maAppData.mpPostYieldListeners ) + pSVData->maAppData.mpPostYieldListeners->callListeners( NULL ); } // ----------------------------------------------------------------------- -void Application::Yield( bool bAllEvents ) +void Application::Reschedule( bool i_bAllEvents ) { - ImplSVData* pSVData = ImplGetSVData(); + ImplYield( false, i_bAllEvents ); +} - // run timers that have timed out - if ( !pSVData->mbNoCallTimer ) - while ( pSVData->mbNotAllTimerCalled ) - Timer::ImplTimerCallbackProc(); +// ----------------------------------------------------------------------- - // do not wait for events if application was already quit; in that - // case only dispatch events already available - pSVData->maAppData.mnDispatchLevel++; - pSVData->mpDefInst->Yield( !pSVData->maAppData.mbAppQuit, bAllEvents ); - pSVData->maAppData.mnDispatchLevel--; - - // flush lazy deleted objects - if( pSVData->maAppData.mnDispatchLevel == 0 ) - vcl::LazyDelete::flush(); +void Application::Yield( bool i_bAllEvents ) +{ + ImplYield( true, i_bAllEvents ); } // ----------------------------------------------------------------------- @@ -674,11 +675,11 @@ void Application::MergeSystemSettings( AllSettings& rSettings ) ImplSVData* pSVData = ImplGetSVData(); if ( !pSVData->maAppData.mbSettingsInit ) { - pWindow->ImplGetFrame()->UpdateSettings( *pSVData->maAppData.mpSettings ); + // side effect: ImplUpdateGlobalSettings does an ImplGetFrame()->UpdateSettings pWindow->ImplUpdateGlobalSettings( *pSVData->maAppData.mpSettings ); pSVData->maAppData.mbSettingsInit = TRUE; } - pWindow->ImplGetFrame()->UpdateSettings( rSettings ); + // side effect: ImplUpdateGlobalSettings does an ImplGetFrame()->UpdateSettings pWindow->ImplUpdateGlobalSettings( rSettings, FALSE ); } } @@ -704,12 +705,10 @@ bool Application::ValidateSystemFont() void Application::SetSettings( const AllSettings& rSettings ) { - MsLangId::setConfiguredSystemLanguage( rSettings.GetLanguage()); - MsLangId::setConfiguredSystemUILanguage( rSettings.GetUILanguage()); ImplSVData* pSVData = ImplGetSVData(); if ( !pSVData->maAppData.mpSettings ) { - pSVData->maAppData.mpSettings = new AllSettings(); + GetSettings(); *pSVData->maAppData.mpSettings = rSettings; ResMgr::SetDefaultLocale( rSettings.GetUILocale() ); } @@ -811,7 +810,12 @@ const AllSettings& Application::GetSettings() { ImplSVData* pSVData = ImplGetSVData(); if ( !pSVData->maAppData.mpSettings ) + { + pSVData->maAppData.mpCfgListener = new LocaleConfigurationListener; pSVData->maAppData.mpSettings = new AllSettings(); + pSVData->maAppData.mpSettings->GetSysLocale().GetOptions().AddListener( pSVData->maAppData.mpCfgListener ); + } + return *(pSVData->maAppData.mpSettings); } @@ -1193,6 +1197,33 @@ void Application::RemoveIdleHdl( const Link& rLink ) // ----------------------------------------------------------------------- +void Application::EnableNoYieldMode( bool i_bNoYield ) +{ + ImplSVData* pSVData = ImplGetSVData(); + pSVData->maAppData.mbNoYield = i_bNoYield; +} + +// ----------------------------------------------------------------------- + +void Application::AddPostYieldListener( const Link& i_rListener ) +{ + ImplSVData* pSVData = ImplGetSVData(); + if( ! pSVData->maAppData.mpPostYieldListeners ) + pSVData->maAppData.mpPostYieldListeners = new VclEventListeners2(); + pSVData->maAppData.mpPostYieldListeners->addListener( i_rListener ); +} + +// ----------------------------------------------------------------------- + +void Application::RemovePostYieldListener( const Link& i_rListener ) +{ + ImplSVData* pSVData = ImplGetSVData(); + if( pSVData->maAppData.mpPostYieldListeners ) + pSVData->maAppData.mpPostYieldListeners->removeListener( i_rListener ); +} + +// ----------------------------------------------------------------------- + WorkWindow* Application::GetAppWindow() { return ImplGetSVData()->maWinData.mpAppWin; @@ -1989,6 +2020,12 @@ const ::rtl::OUString& Application::GetDesktopEnvironment() return SalGetDesktopEnvironment(); } +void Application::AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType) +{ + ImplSVData* pSVData = ImplGetSVData(); + pSVData->mpDefInst->AddToRecentDocumentList(rFileUrl, rMimeType); +} + BOOL Application::IsAccessibilityEnabled() { return FALSE; diff --git a/vcl/source/app/svdata.cxx b/vcl/source/app/svdata.cxx index 21e1f34c1ef5..6a61d15db4c0 100644 --- a/vcl/source/app/svdata.cxx +++ b/vcl/source/app/svdata.cxx @@ -47,7 +47,7 @@ #include #include #include -#include +#include #include #include #include @@ -523,3 +523,9 @@ Window* ImplFindWindow( const SalFrame* pFrame, Point& rSalFramePos ) return NULL; } + +void LocaleConfigurationListener::ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 nHint ) +{ + AllSettings::LocaleSettingsChanged( nHint ); +} + diff --git a/vcl/source/app/svmain.cxx b/vcl/source/app/svmain.cxx index 6c09978e37b1..310c01a40673 100644 --- a/vcl/source/app/svmain.cxx +++ b/vcl/source/app/svmain.cxx @@ -79,8 +79,8 @@ #include "com/sun/star/lang/XMultiServiceFactory.hpp" #include "com/sun/star/lang/XComponent.hpp" #include "rtl/logfile.hxx" - -#include "vcl/fontcfg.hxx" +#include +#include "unotools/fontcfg.hxx" #include "vcl/configsettings.hxx" #include "vcl/lazydelete.hxx" @@ -467,6 +467,12 @@ void DeInitVCL() if ( pSVData->maAppData.mpSettings ) { + if ( pSVData->maAppData.mpCfgListener ) + { + pSVData->maAppData.mpSettings->GetSysLocale().GetOptions().RemoveListener( pSVData->maAppData.mpCfgListener ); + delete pSVData->maAppData.mpCfgListener; + } + delete pSVData->maAppData.mpSettings; pSVData->maAppData.mpSettings = NULL; } diff --git a/vcl/source/app/vclevent.cxx b/vcl/source/app/vclevent.cxx index 8ebc65c8a3f6..704d68c5bc7f 100644 --- a/vcl/source/app/vclevent.cxx +++ b/vcl/source/app/vclevent.cxx @@ -80,3 +80,56 @@ BOOL VclEventListeners::Process( VclSimpleEvent* pEvent ) const } return bProcessed; } + +VclEventListeners2::VclEventListeners2() +{ +} + +VclEventListeners2::~VclEventListeners2() +{ +} + +void VclEventListeners2::addListener( const Link& i_rLink ) +{ + // ensure uniqueness + for( std::list< Link >::const_iterator it = m_aListeners.begin(); it != m_aListeners.end(); ++it ) + { + if( *it == i_rLink ) + return; + } + m_aListeners.push_back( i_rLink ); +} + +void VclEventListeners2::removeListener( const Link& i_rLink ) +{ + size_t n = m_aIterators.size(); + for( size_t i = 0; i < n; i++ ) + { + if( m_aIterators[i].m_aIt != m_aListeners.end() && *m_aIterators[i].m_aIt == i_rLink ) + { + m_aIterators[i].m_bWasInvalidated = true; + ++m_aIterators[i].m_aIt; + } + } + m_aListeners.remove( i_rLink ); +} + +void VclEventListeners2::callListeners( VclSimpleEvent* i_pEvent ) +{ + vcl::DeletionListener aDel( this ); + + m_aIterators.push_back( ListenerIt() ); + size_t nIndex = m_aIterators.size() - 1; + m_aIterators[ nIndex ].m_aIt = m_aListeners.begin(); + while( ! aDel.isDeleted() && m_aIterators[ nIndex ].m_aIt != m_aListeners.end() ) + { + m_aIterators[ nIndex ].m_aIt->Call( i_pEvent ); + if( m_aIterators[ nIndex ].m_bWasInvalidated ) + // check if the current element was removed and the iterator increased in the meantime + m_aIterators[ nIndex ].m_bWasInvalidated = false; + else + ++m_aIterators[ nIndex ].m_aIt; + } + m_aIterators.pop_back(); +} + diff --git a/vcl/source/components/dtranscomp.cxx b/vcl/source/components/dtranscomp.cxx new file mode 100644 index 000000000000..58792cd4fbdb --- /dev/null +++ b/vcl/source/components/dtranscomp.cxx @@ -0,0 +1,556 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: fontident.cxx,v $ + * + * $Revision: 1.3 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#include "com/sun/star/lang/XServiceInfo.hpp" +#include "com/sun/star/lang/XSingleServiceFactory.hpp" +#include "com/sun/star/lang/XInitialization.hpp" +#include "com/sun/star/lang/DisposedException.hpp" +#include "com/sun/star/datatransfer/XTransferable.hpp" +#include "com/sun/star/datatransfer/clipboard/XClipboard.hpp" +#include "com/sun/star/datatransfer/clipboard/XClipboardEx.hpp" +#include "com/sun/star/datatransfer/clipboard/XClipboardNotifier.hpp" +#include "com/sun/star/datatransfer/clipboard/XClipboardListener.hpp" +#include "com/sun/star/datatransfer/dnd/XDragSource.hpp" +#include "com/sun/star/datatransfer/dnd/XDropTarget.hpp" +#include "com/sun/star/datatransfer/dnd/DNDConstants.hpp" + +#include "vcl/svapp.hxx" +#include "vcl/svdata.hxx" +#include "vcl/salinst.hxx" +#include "vos/mutex.hxx" +#include "osl/mutex.hxx" + +#include "cppuhelper/compbase1.hxx" +#include "cppuhelper/compbase2.hxx" +#include "cppuhelper/compbase3.hxx" +#include "cppuhelper/implbase1.hxx" + +using rtl::OUString; +using namespace com::sun::star; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; + +// ----------------------------------------------------------------------- + +namespace vcl +{ +// generic implementation to satisfy SalInstance +class GenericClipboard : + public cppu::WeakComponentImplHelper3 < + datatransfer::clipboard::XClipboardEx, + datatransfer::clipboard::XClipboardNotifier, + XServiceInfo + > +{ + osl::Mutex m_aMutex; + Reference< ::com::sun::star::datatransfer::XTransferable > m_aContents; + Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner > m_aOwner; + std::list< Reference< ::com::sun::star::datatransfer::clipboard::XClipboardListener > > m_aListeners; + + void fireChangedContentsEvent(); + void clearContents(); + +public: + + GenericClipboard() : cppu::WeakComponentImplHelper3< + datatransfer::clipboard::XClipboardEx, + datatransfer::clipboard::XClipboardNotifier, + XServiceInfo + >( m_aMutex ) + {} + virtual ~GenericClipboard(); + + /* + * XServiceInfo + */ + + virtual rtl::OUString SAL_CALL getImplementationName() throw( RuntimeException ); + virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw( RuntimeException ); + virtual Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( RuntimeException ); + + static rtl::OUString getImplementationName_static(); + static Sequence< rtl::OUString > getSupportedServiceNames_static(); + + /* + * XClipboard + */ + + virtual Reference< ::com::sun::star::datatransfer::XTransferable > SAL_CALL getContents() + throw(RuntimeException); + + virtual void SAL_CALL setContents( + const Reference< ::com::sun::star::datatransfer::XTransferable >& xTrans, + const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner ) + throw(RuntimeException); + + virtual ::rtl::OUString SAL_CALL getName() + throw(RuntimeException); + + /* + * XClipboardEx + */ + + virtual sal_Int8 SAL_CALL getRenderingCapabilities() + throw(RuntimeException); + + /* + * XClipboardNotifier + */ + virtual void SAL_CALL addClipboardListener( + const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardListener >& listener ) + throw(RuntimeException); + + virtual void SAL_CALL removeClipboardListener( + const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardListener >& listener ) + throw(RuntimeException); +}; + +GenericClipboard::~GenericClipboard() +{ +} + +rtl::OUString GenericClipboard::getImplementationName_static() +{ + return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.datatransfer.VCLGenericClipboard" ) ); +} + +Sequence< rtl::OUString > GenericClipboard::getSupportedServiceNames_static() +{ + Sequence< OUString > aRet(1); + aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.clipboard.SystemClipboard"); + return aRet; +} + +rtl::OUString GenericClipboard::getImplementationName() throw( RuntimeException ) +{ + return getImplementationName_static(); +} + +Sequence< rtl::OUString > GenericClipboard::getSupportedServiceNames() throw( RuntimeException ) +{ + return getSupportedServiceNames_static(); +} + +sal_Bool GenericClipboard::supportsService( const ::rtl::OUString& ServiceName ) throw( RuntimeException ) +{ + Sequence< OUString > aServices( getSupportedServiceNames() ); + sal_Int32 nServices = aServices.getLength(); + for( sal_Int32 i = 0; i < nServices; i++ ) + { + if( aServices[i] == ServiceName ) + return sal_True; + } + return sal_False; +} + +Reference< ::com::sun::star::datatransfer::XTransferable > GenericClipboard::getContents() throw( RuntimeException ) +{ + return m_aContents; +} + +void GenericClipboard::setContents( + const Reference< ::com::sun::star::datatransfer::XTransferable >& xTrans, + const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner ) + throw( RuntimeException ) +{ + osl::ClearableMutexGuard aGuard( m_aMutex ); + Reference< datatransfer::clipboard::XClipboardOwner > xOldOwner( m_aOwner ); + Reference< datatransfer::XTransferable > xOldContents( m_aContents ); + m_aContents = xTrans; + m_aOwner = xClipboardOwner; + + std::list< Reference< datatransfer::clipboard::XClipboardListener > > xListeners( m_aListeners ); + datatransfer::clipboard::ClipboardEvent aEv; + aEv.Contents = m_aContents; + + aGuard.clear(); + + if( xOldOwner.is() && xOldOwner != xClipboardOwner ) + xOldOwner->lostOwnership( this, xOldContents ); + for( std::list< Reference< datatransfer::clipboard::XClipboardListener > >::iterator it = + xListeners.begin(); it != xListeners.end() ; ++it ) + { + (*it)->changedContents( aEv ); + } +} + +rtl::OUString GenericClipboard::getName() throw( RuntimeException ) +{ + return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CLIPBOARD" ) ); +} + +sal_Int8 GenericClipboard::getRenderingCapabilities() throw( RuntimeException ) +{ + return 0; +} + +void GenericClipboard::addClipboardListener( const Reference< datatransfer::clipboard::XClipboardListener >& listener ) + throw( RuntimeException ) +{ + osl::ClearableMutexGuard aGuard( m_aMutex ); + + m_aListeners.push_back( listener ); +} + +void GenericClipboard::removeClipboardListener( const Reference< datatransfer::clipboard::XClipboardListener >& listener ) + throw( RuntimeException ) +{ + osl::ClearableMutexGuard aGuard( m_aMutex ); + + m_aListeners.remove( listener ); +} + +// ------------------------------------------------------------------------ + +class ClipboardFactory : public ::cppu::WeakComponentImplHelper1< + com::sun::star::lang::XSingleServiceFactory +> +{ + osl::Mutex m_aMutex; +public: + ClipboardFactory(); + virtual ~ClipboardFactory(); + + /* + * XSingleServiceFactory + */ + virtual Reference< XInterface > SAL_CALL createInstance() throw(); + virtual Reference< XInterface > SAL_CALL createInstanceWithArguments( const Sequence< Any >& rArgs ) throw(); +}; + +// ------------------------------------------------------------------------ + +ClipboardFactory::ClipboardFactory() : + cppu::WeakComponentImplHelper1< + com::sun::star::lang::XSingleServiceFactory +>( m_aMutex ) +{ +} + +// ------------------------------------------------------------------------ + +ClipboardFactory::~ClipboardFactory() +{ +} + +// ------------------------------------------------------------------------ + +Reference< XInterface > ClipboardFactory::createInstance() throw() +{ + return createInstanceWithArguments( Sequence< Any >() ); +} + +// ------------------------------------------------------------------------ + +Reference< XInterface > ClipboardFactory::createInstanceWithArguments( const Sequence< Any >& arguments ) throw() +{ + vos::OGuard aGuard( Application::GetSolarMutex() ); + Reference< XInterface > xResult = ImplGetSVData()->mpDefInst->CreateClipboard( arguments ); + return xResult; +} + +// ------------------------------------------------------------------------ + +Sequence< OUString > SAL_CALL Clipboard_getSupportedServiceNames() +{ + Sequence< OUString > aRet(1); + aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.clipboard.SystemClipboard"); + return aRet; +} + +OUString SAL_CALL Clipboard_getImplementationName() +{ + #if defined UNX + return OUString( RTL_CONSTASCII_USTRINGPARAM( + #if ! defined QUARTZ + "com.sun.star.datatransfer.X11ClipboardSupport" + #else + "com.sun.star.datatransfer.clipboard.AquaClipboard" + #endif + ) ); + #else + return GenericClipboard::getImplementationName_static(); + #endif +} + +Reference< XSingleServiceFactory > SAL_CALL Clipboard_createFactory( const Reference< XMultiServiceFactory > & ) +{ + return Reference< XSingleServiceFactory >( new ClipboardFactory() ); +} + +/* +* generic DragSource dummy +*/ +class GenericDragSource : public cppu::WeakComponentImplHelper2< + datatransfer::dnd::XDragSource, + XInitialization + > +{ + osl::Mutex m_aMutex; +public: + GenericDragSource() : cppu::WeakComponentImplHelper2< datatransfer::dnd::XDragSource, XInitialization >( m_aMutex ) {} + virtual ~GenericDragSource(); + + // XDragSource + virtual sal_Bool SAL_CALL isDragImageSupported() throw(); + virtual sal_Int32 SAL_CALL getDefaultCursor( sal_Int8 dragAction ) throw(); + virtual void SAL_CALL startDrag( + const datatransfer::dnd::DragGestureEvent& trigger, + sal_Int8 sourceActions, sal_Int32 cursor, sal_Int32 image, + const Reference< datatransfer::XTransferable >& transferable, + const Reference< datatransfer::dnd::XDragSourceListener >& listener + ) throw(); + + // XInitialization + virtual void SAL_CALL initialize( const Sequence< Any >& arguments ) throw( ::com::sun::star::uno::Exception ); + + static Sequence< OUString > getSupportedServiceNames_static() + { + Sequence< OUString > aRet( 1 ); + aRet[0] = OUString::createFromAscii( "com.sun.star.datatransfer.dnd.GenericDragSource" ); + return aRet; + } + + static OUString getImplementationName_static() + { + return OUString::createFromAscii( "com.sun.star.datatransfer.dnd.VclGenericDragSource" ); + } +}; + +GenericDragSource::~GenericDragSource() +{ +} + +sal_Bool GenericDragSource::isDragImageSupported() throw() +{ + return sal_False; +} + +sal_Int32 GenericDragSource::getDefaultCursor( sal_Int8 ) throw() +{ + return 0; +} + +void GenericDragSource::startDrag( const datatransfer::dnd::DragGestureEvent&, + sal_Int8 /*sourceActions*/, sal_Int32 /*cursor*/, sal_Int32 /*image*/, + const Reference< datatransfer::XTransferable >&, + const Reference< datatransfer::dnd::XDragSourceListener >& listener + ) throw() +{ + datatransfer::dnd::DragSourceDropEvent aEv; + aEv.DropAction = datatransfer::dnd::DNDConstants::ACTION_COPY; + aEv.DropSuccess = sal_False; + listener->dragDropEnd( aEv ); +} + +void GenericDragSource::initialize( const Sequence< Any >& ) throw( Exception ) +{ +} + + +Sequence< OUString > SAL_CALL DragSource_getSupportedServiceNames() +{ + #if defined UNX + static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( + #if ! defined QUARTZ + "com.sun.star.datatransfer.dnd.X11DragSource" + #else + "com.sun.star.datatransfer.dnd.OleDragSource" + #endif + ) ); + static Sequence< OUString > aServiceNames( &aServiceName, 1 ); + return aServiceNames; + #else + return GenericDragSource::getSupportedServiceNames_static(); + #endif +} + +OUString SAL_CALL DragSource_getImplementationName() +{ + #if defined UNX + return OUString( RTL_CONSTASCII_USTRINGPARAM( + #if ! defined QUARTZ + "com.sun.star.datatransfer.dnd.XdndSupport" + #else + "com.sun.star.comp.datatransfer.dnd.OleDragSource_V1" + #endif + ) ); + #else + return GenericDragSource::getImplementationName_static(); + #endif +} + +Reference< XInterface > SAL_CALL DragSource_createInstance( const Reference< XMultiServiceFactory >& ) +{ + vos::OGuard aGuard( Application::GetSolarMutex() ); + Reference< XInterface > xResult = ImplGetSVData()->mpDefInst->CreateDragSource(); + return xResult; +} + +/* +* generic DragSource dummy +*/ + +class GenericDropTarget : public cppu::WeakComponentImplHelper2< + datatransfer::dnd::XDropTarget, + XInitialization + > +{ + osl::Mutex m_aMutex; +public: + GenericDropTarget() : cppu::WeakComponentImplHelper2< + datatransfer::dnd::XDropTarget, + XInitialization + > ( m_aMutex ) + {} + virtual ~GenericDropTarget(); + + // XInitialization + virtual void SAL_CALL initialize( const Sequence< Any >& args ) throw ( Exception ); + + // XDropTarget + virtual void SAL_CALL addDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw(); + virtual void SAL_CALL removeDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw(); + virtual sal_Bool SAL_CALL isActive() throw(); + virtual void SAL_CALL setActive( sal_Bool active ) throw(); + virtual sal_Int8 SAL_CALL getDefaultActions() throw(); + virtual void SAL_CALL setDefaultActions( sal_Int8 actions ) throw(); + + static Sequence< OUString > getSupportedServiceNames_static() + { + Sequence< OUString > aRet( 1 ); + aRet[0] = OUString::createFromAscii( "com.sun.star.datatransfer.dnd.GenericDropTarget" ); + return aRet; + } + + static OUString getImplementationName_static() + { + return OUString::createFromAscii( "com.sun.star.datatransfer.dnd.VclGenericDropTarget" ); + } +}; + +GenericDropTarget::~GenericDropTarget() +{ +} + +void GenericDropTarget::initialize( const Sequence< Any >& ) throw( Exception ) +{ +} + +void GenericDropTarget::addDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw() +{ +} + +void GenericDropTarget::removeDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw() +{ +} + +sal_Bool GenericDropTarget::isActive() throw() +{ + return sal_False; +} + +void GenericDropTarget::setActive( sal_Bool ) throw() +{ +} + +sal_Int8 GenericDropTarget::getDefaultActions() throw() +{ + return 0; +} + +void GenericDropTarget::setDefaultActions( sal_Int8) throw() +{ +} + +Sequence< OUString > SAL_CALL DropTarget_getSupportedServiceNames() +{ + #if defined UNX + static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( + #if ! defined QUARTZ + "com.sun.star.datatransfer.dnd.X11DropTarget" + #else + "com.sun.star.datatransfer.dnd.OleDropTarget" + #endif + ) ); + static Sequence< OUString > aServiceNames( &aServiceName, 1 ); + return aServiceNames; + #else + return GenericDropTarget::getSupportedServiceNames_static(); + #endif +} + +OUString SAL_CALL DropTarget_getImplementationName() +{ + #if defined UNX + return OUString( RTL_CONSTASCII_USTRINGPARAM( + #if ! defined QUARTZ + "com.sun.star.datatransfer.dnd.XdndDropTarget" + #else + "com.sun.star.comp.datatransfer.dnd.OleDropTarget_V1" + #endif + ) ); + #else + return GenericDropTarget::getImplementationName_static(); + #endif +} + +Reference< XInterface > SAL_CALL DropTarget_createInstance( const Reference< XMultiServiceFactory >& ) +{ + vos::OGuard aGuard( Application::GetSolarMutex() ); + Reference< XInterface > xResult = ImplGetSVData()->mpDefInst->CreateDropTarget(); + return xResult; +} + + +} // namespace vcl + +/* +* SalInstance generic +*/ +Reference< XInterface > SalInstance::CreateClipboard( const Sequence< Any >& ) +{ + return Reference< XInterface >( ( cppu::OWeakObject * )new vcl::GenericClipboard() ); +} + +Reference< XInterface > SalInstance::CreateDragSource() +{ + return Reference< XInterface >( ( cppu::OWeakObject * )new vcl::GenericDragSource() ); +} + +Reference< XInterface > SalInstance::CreateDropTarget() +{ + return Reference< XInterface >( ( cppu::OWeakObject * )new vcl::GenericDropTarget() ); +} + diff --git a/vcl/source/components/factory.cxx b/vcl/source/components/factory.cxx index ef2e5c3b85fd..e816c31c613a 100644 --- a/vcl/source/components/factory.cxx +++ b/vcl/source/components/factory.cxx @@ -59,11 +59,23 @@ namespace vcl { extern Sequence< OUString > SAL_CALL DisplayAccess_getSupportedServiceNames(); extern OUString SAL_CALL DisplayAccess_getImplementationName(); -extern Reference< XInterface > SAL_CALL DisplayAccess_createInstance( const Reference< XMultiServiceFactory > & ); +extern Reference< XInterface > SAL_CALL DisplayAccess_createInstance( const Reference< XMultiServiceFactory > & ); extern Sequence< OUString > SAL_CALL FontIdentificator_getSupportedServiceNames(); extern OUString SAL_CALL FontIdentificator_getImplementationName(); -extern Reference< XInterface > SAL_CALL FontIdentificator_createInstance( const Reference< XMultiServiceFactory > & ); +extern Reference< XInterface > SAL_CALL FontIdentificator_createInstance( const Reference< XMultiServiceFactory > & ); + +extern Sequence< OUString > SAL_CALL Clipboard_getSupportedServiceNames(); +extern OUString SAL_CALL Clipboard_getImplementationName(); +extern Reference< XSingleServiceFactory > SAL_CALL Clipboard_createFactory( const Reference< XMultiServiceFactory > & ); + +extern Sequence< OUString > SAL_CALL DragSource_getSupportedServiceNames(); +extern OUString SAL_CALL DragSource_getImplementationName(); +extern Reference< XInterface > SAL_CALL DragSource_createInstance( const Reference< XMultiServiceFactory > & ); + +extern Sequence< OUString > SAL_CALL DropTarget_getSupportedServiceNames(); +extern OUString SAL_CALL DropTarget_getImplementationName(); +extern Reference< XInterface > SAL_CALL DropTarget_createInstance( const Reference< XMultiServiceFactory > & ); } extern "C" { @@ -102,6 +114,26 @@ extern "C" { aImplName.append( vcl::FontIdentificator_getSupportedServiceNames()[0] ); xKey->createKey( aImplName.makeStringAndClear() ); + #if defined UNX + aImplName.appendAscii( "/" ); + aImplName.append( vcl::Clipboard_getImplementationName() ); + aImplName.appendAscii( "/UNO/SERVICES/" ); + aImplName.append( vcl::Clipboard_getSupportedServiceNames()[0] ); + xKey->createKey( aImplName.makeStringAndClear() ); + + aImplName.appendAscii( "/" ); + aImplName.append( vcl::DragSource_getImplementationName() ); + aImplName.appendAscii( "/UNO/SERVICES/" ); + aImplName.append( vcl::DragSource_getSupportedServiceNames()[0] ); + xKey->createKey( aImplName.makeStringAndClear() ); + + aImplName.appendAscii( "/" ); + aImplName.append( vcl::DropTarget_getImplementationName() ); + aImplName.appendAscii( "/UNO/SERVICES/" ); + aImplName.append( vcl::DropTarget_getSupportedServiceNames()[0] ); + xKey->createKey( aImplName.makeStringAndClear() ); + #endif + return sal_True; } catch( ::com::sun::star::registry::InvalidRegistryException& ) @@ -143,6 +175,22 @@ extern "C" { xMgr, vcl::FontIdentificator_getImplementationName(), vcl::FontIdentificator_createInstance, vcl::FontIdentificator_getSupportedServiceNames() ); } + else if( vcl::Clipboard_getImplementationName().equalsAscii( pImplementationName ) ) + { + xFactory = vcl::Clipboard_createFactory( xMgr ); + } + else if( vcl::DragSource_getImplementationName().equalsAscii( pImplementationName ) ) + { + xFactory = ::cppu::createSingleFactory( + xMgr, vcl::DragSource_getImplementationName(), vcl::DragSource_createInstance, + vcl::DragSource_getSupportedServiceNames() ); + } + else if( vcl::DropTarget_getImplementationName().equalsAscii( pImplementationName ) ) + { + xFactory = ::cppu::createSingleFactory( + xMgr, vcl::DropTarget_getImplementationName(), vcl::DropTarget_createInstance, + vcl::DropTarget_getSupportedServiceNames() ); + } if( xFactory.is() ) { xFactory->acquire(); diff --git a/vcl/source/components/makefile.mk b/vcl/source/components/makefile.mk index 9158d33bb888..8cc836fe5424 100644 --- a/vcl/source/components/makefile.mk +++ b/vcl/source/components/makefile.mk @@ -44,6 +44,7 @@ ENABLE_EXCEPTIONS=TRUE # --- Files -------------------------------------------------------- SLOFILES= $(SLO)$/display.obj \ + $(SLO)$/dtranscomp.obj \ $(SLO)$/fontident.obj \ $(SLO)$/factory.obj diff --git a/vcl/source/control/button.cxx b/vcl/source/control/button.cxx index 2e2342fc6fc8..53a060af6bd6 100644 --- a/vcl/source/control/button.cxx +++ b/vcl/source/control/button.cxx @@ -50,7 +50,7 @@ #include #include #include -#include +#include #ifndef _SV_NATIVEWIDGET_HXX #include #endif @@ -383,8 +383,8 @@ void Button::ImplDrawAlignedImage( OutputDevice* pDev, Point& rPos, WinBits nWinStyle = GetStyle(); Rectangle aOutRect( rPos, rSize ); - MetricVector *pVector = bLayout ? &mpLayoutData->m_aUnicodeBoundRects : NULL; - String *pDisplayText = bLayout ? &mpLayoutData->m_aDisplayText : NULL; + MetricVector *pVector = bLayout ? &mpControlData->mpLayoutData->m_aUnicodeBoundRects : NULL; + String *pDisplayText = bLayout ? &mpControlData->mpLayoutData->m_aDisplayText : NULL; ImageAlign eImageAlign = mpButtonData->meImageAlign; Size aImageSize = mpButtonData->maImage.GetSizePixel(); @@ -406,13 +406,12 @@ void Button::ImplDrawAlignedImage( OutputDevice* pDev, Point& rPos, } else if ( bDrawText && !bDrawImage && !bHasSymbol ) { - aOutRect = pDev->GetTextRect( aOutRect, aText, nTextStyle ); + DrawControlText( *pDev, aOutRect, aText, nTextStyle, pVector, pDisplayText ); + + ImplSetFocusRect( aOutRect ); rSize = aOutRect.GetSize(); rPos = aOutRect.TopLeft(); - ImplSetFocusRect( aOutRect ); - - pDev->DrawText( aOutRect, aText, nTextStyle, pVector, pDisplayText ); return; } @@ -420,10 +419,9 @@ void Button::ImplDrawAlignedImage( OutputDevice* pDev, Point& rPos, Image *pImage = &(mpButtonData->maImage); BitmapEx *pBitmapEx = mpButtonData->mpBitmapEx; - Color aBackCol; - if( !!(mpButtonData->maImageHC) && ImplGetCurrentBackgroundColor( aBackCol ) ) + if( !!(mpButtonData->maImageHC) ) { - if( aBackCol.IsDark() ) + if( GetSettings().GetStyleSettings().GetHighContrastMode() ) { pImage = &(mpButtonData->maImageHC); pBitmapEx = mpButtonData->mpBitmapExHC; @@ -854,31 +852,25 @@ WinBits PushButton::ImplInitStyle( const Window* pPrevWindow, WinBits nStyle ) return nStyle; } +// ----------------------------------------------------------------- + +const Font& PushButton::GetCanonicalFont( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetPushButtonFont(); +} + +// ----------------------------------------------------------------- +const Color& PushButton::GetCanonicalTextColor( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetButtonTextColor(); +} + // ----------------------------------------------------------------------- void PushButton::ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ) { - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - - if ( bFont ) - { - Font aFont = rStyleSettings.GetPushButtonFont(); - if ( IsControlFont() ) - aFont.Merge( GetControlFont() ); - SetZoomedPointFont( aFont ); - } - - if ( bForeground || bFont ) - { - Color aColor; - if ( IsControlForeground() ) - aColor = GetControlForeground(); - else - aColor = rStyleSettings.GetButtonTextColor(); - SetTextColor( aColor ); - SetTextFillColor(); - } + Button::ImplInitSettings( bFont, bForeground ); if ( bBackground ) { @@ -1660,7 +1652,7 @@ void PushButton::KeyUp( const KeyEvent& rKEvt ) void PushButton::FillLayoutData() const { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); const_cast(this)->ImplDrawPushButton( true ); } @@ -2226,31 +2218,25 @@ WinBits RadioButton::ImplInitStyle( const Window* pPrevWindow, WinBits nStyle ) return nStyle; } +// ----------------------------------------------------------------- + +const Font& RadioButton::GetCanonicalFont( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetRadioCheckFont(); +} + +// ----------------------------------------------------------------- +const Color& RadioButton::GetCanonicalTextColor( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetRadioCheckTextColor(); +} + // ----------------------------------------------------------------------- void RadioButton::ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ) { - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - - if ( bFont ) - { - Font aFont = rStyleSettings.GetRadioCheckFont(); - if ( IsControlFont() ) - aFont.Merge( GetControlFont() ); - SetZoomedPointFont( aFont ); - } - - if ( bForeground || bFont ) - { - Color aColor; - if ( IsControlForeground() ) - aColor = GetControlForeground(); - else - aColor = rStyleSettings.GetRadioCheckTextColor(); - SetTextColor( aColor ); - SetTextFillColor(); - } + Button::ImplInitSettings( bFont, bForeground ); if ( bBackground ) { @@ -2375,14 +2361,10 @@ if ( bNativeOK == FALSE ) // check for HC mode Image *pImage = &maImage; - Color aBackCol; - if( !!maImageHC && ImplGetCurrentBackgroundColor( aBackCol ) ) + if( !!maImageHC ) { - if( aBackCol.IsDark() ) + if( rStyleSettings.GetHighContrastMode() ) pImage = &maImageHC; - // #99902 no col transform required - //if( aBackCol.IsBright() ) - // nStyle |= IMAGE_DRAW_COLORTRANSFORM; } Point aImagePos( aImageRect.TopLeft() ); @@ -2429,16 +2411,14 @@ if ( bNativeOK == FALSE ) void RadioButton::ImplDraw( OutputDevice* pDev, ULONG nDrawFlags, const Point& rPos, const Size& rSize, - const Size& rImageSize, long nImageSep, - Rectangle& rStateRect, - Rectangle& rMouseRect, - bool bLayout ) + const Size& rImageSize, Rectangle& rStateRect, + Rectangle& rMouseRect, bool bLayout ) { WinBits nWinStyle = GetStyle(); XubString aText( GetText() ); Rectangle aRect( rPos, rSize ); - MetricVector* pVector = bLayout ? &mpLayoutData->m_aUnicodeBoundRects : NULL; - String* pDisplayText = bLayout ? &mpLayoutData->m_aDisplayText : NULL; + MetricVector* pVector = bLayout ? &mpControlData->mpLayoutData->m_aUnicodeBoundRects : NULL; + String* pDisplayText = bLayout ? &mpControlData->mpLayoutData->m_aDisplayText : NULL; pDev->Push( PUSH_CLIPREGION ); pDev->IntersectClipRegion( Rectangle( rPos, rSize ) ); @@ -2451,9 +2431,9 @@ void RadioButton::ImplDraw( OutputDevice* pDev, ULONG nDrawFlags, { USHORT nTextStyle = Button::ImplGetTextStyle( aText, nWinStyle, nDrawFlags ); + const long nImageSep = GetDrawPixel( pDev, ImplGetImageToTextDistance() ); Size aSize( rSize ); Point aPos( rPos ); - aPos.X() += rImageSize.Width() + nImageSep; aSize.Width() -= rImageSize.Width() + nImageSep; @@ -2583,7 +2563,7 @@ void RadioButton::ImplDrawRadioButton( bool bLayout ) // Draw control text ImplDraw( this, 0, Point(), GetOutputSizePixel(), - aImageSize, IMPL_SEP_BUTTON_IMAGE, maStateRect, maMouseRect, bLayout ); + aImageSize, maStateRect, maMouseRect, bLayout ); if( !bLayout || (IsNativeControlSupported(CTRL_RADIOBUTTON, PART_ENTIRE_CONTROL)==TRUE) ) { @@ -2859,7 +2839,7 @@ void RadioButton::KeyUp( const KeyEvent& rKEvt ) void RadioButton::FillLayoutData() const { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); const_cast(this)->ImplDrawRadioButton( true ); } @@ -2914,8 +2894,7 @@ void RadioButton::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize pDev->SetTextFillColor(); ImplDraw( pDev, nFlags, aPos, aSize, - aImageSize, GetDrawPixel( pDev, IMPL_SEP_BUTTON_IMAGE ), - aStateRect, aMouseRect ); + aImageSize, aStateRect, aMouseRect ); Point aCenterPos = aStateRect.Center(); long nRadX = aImageSize.Width()/2; @@ -3163,6 +3142,15 @@ void RadioButton::Check( BOOL bCheck ) // ----------------------------------------------------------------------- +long RadioButton::ImplGetImageToTextDistance() const +{ + // 4 pixels, but take zoom into account, so the text doesn't "jump" relative to surrounding elements, + // which might have been aligned with the text of the check box + return CalcZoom( 4 ); +} + +// ----------------------------------------------------------------------- + Size RadioButton::ImplGetRadioImageSize() const { Size aSize; @@ -3336,12 +3324,12 @@ Size RadioButton::CalcMinimumSize( long nMaxWidth ) const { // subtract what will be added later nMaxWidth-=2; - nMaxWidth -= IMPL_SEP_BUTTON_IMAGE; + nMaxWidth -= ImplGetImageToTextDistance(); Size aTextSize = GetTextRect( Rectangle( Point(), Size( nMaxWidth > 0 ? nMaxWidth : 0x7fffffff, 0x7fffffff ) ), aText, FixedText::ImplGetTextStyle( GetStyle() ) ).GetSize(); aSize.Width()+=2; // for focus rect - aSize.Width() += IMPL_SEP_BUTTON_IMAGE; + aSize.Width() += ImplGetImageToTextDistance(); aSize.Width() += aTextSize.Width(); if ( aSize.Height() < aTextSize.Height() ) aSize.Height() = aTextSize.Height(); @@ -3400,31 +3388,25 @@ WinBits CheckBox::ImplInitStyle( const Window* pPrevWindow, WinBits nStyle ) return nStyle; } +// ----------------------------------------------------------------- + +const Font& CheckBox::GetCanonicalFont( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetRadioCheckFont(); +} + +// ----------------------------------------------------------------- +const Color& CheckBox::GetCanonicalTextColor( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetRadioCheckTextColor(); +} + // ----------------------------------------------------------------------- void CheckBox::ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ) { - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - - if ( bFont ) - { - Font aFont = rStyleSettings.GetRadioCheckFont(); - if ( IsControlFont() ) - aFont.Merge( GetControlFont() ); - SetZoomedPointFont( aFont ); - } - - if ( bForeground || bFont ) - { - Color aColor; - if ( IsControlForeground() ) - aColor = GetControlForeground(); - else - aColor = rStyleSettings.GetRadioCheckTextColor(); - SetTextColor( aColor ); - SetTextFillColor(); - } + Button::ImplInitSettings( bFont, bForeground ); if ( bBackground ) { @@ -3532,9 +3514,8 @@ void CheckBox::ImplDrawCheckBoxState() void CheckBox::ImplDraw( OutputDevice* pDev, ULONG nDrawFlags, const Point& rPos, const Size& rSize, - const Size& rImageSize, long nImageSep, - Rectangle& rStateRect, Rectangle& rMouseRect, - bool bLayout ) + const Size& rImageSize, Rectangle& rStateRect, + Rectangle& rMouseRect, bool bLayout ) { WinBits nWinStyle = GetStyle(); XubString aText( GetText() ); @@ -3548,6 +3529,7 @@ void CheckBox::ImplDraw( OutputDevice* pDev, ULONG nDrawFlags, { USHORT nTextStyle = Button::ImplGetTextStyle( aText, nWinStyle, nDrawFlags ); + const long nImageSep = GetDrawPixel( pDev, ImplGetImageToTextDistance() ); Size aSize( rSize ); Point aPos( rPos ); aPos.X() += rImageSize.Width() + nImageSep; @@ -3645,7 +3627,7 @@ void CheckBox::ImplDrawCheckBox( bool bLayout ) HideFocus(); ImplDraw( this, 0, Point(), GetOutputSizePixel(), aImageSize, - IMPL_SEP_BUTTON_IMAGE, maStateRect, maMouseRect, bLayout ); + maStateRect, maMouseRect, bLayout ); if( !bLayout ) { @@ -3802,7 +3784,7 @@ void CheckBox::KeyUp( const KeyEvent& rKEvt ) void CheckBox::FillLayoutData() const { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); const_cast(this)->ImplDrawCheckBox( true ); } @@ -3857,8 +3839,7 @@ void CheckBox::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, pDev->SetTextFillColor(); ImplDraw( pDev, nFlags, aPos, aSize, - aImageSize, GetDrawPixel( pDev, IMPL_SEP_BUTTON_IMAGE ), - aStateRect, aMouseRect, false ); + aImageSize, aStateRect, aMouseRect, false ); pDev->SetLineColor(); pDev->SetFillColor( Color( COL_BLACK ) ); @@ -4104,6 +4085,15 @@ void CheckBox::EnableTriState( BOOL bTriState ) // ----------------------------------------------------------------------- +long CheckBox::ImplGetImageToTextDistance() const +{ + // 4 pixels, but take zoom into account, so the text doesn't "jump" relative to surrounding elements, + // which might have been aligned with the text of the check box + return CalcZoom( 4 ); +} + +// ----------------------------------------------------------------------- + Size CheckBox::ImplGetCheckImageSize() const { Size aSize; @@ -4237,12 +4227,12 @@ Size CheckBox::CalcMinimumSize( long nMaxWidth ) const { // subtract what will be added later nMaxWidth-=2; - nMaxWidth -= IMPL_SEP_BUTTON_IMAGE; + nMaxWidth -= ImplGetImageToTextDistance(); Size aTextSize = GetTextRect( Rectangle( Point(), Size( nMaxWidth > 0 ? nMaxWidth : 0x7fffffff, 0x7fffffff ) ), aText, FixedText::ImplGetTextStyle( GetStyle() ) ).GetSize(); aSize.Width()+=2; // for focus rect - aSize.Width() += IMPL_SEP_BUTTON_IMAGE; + aSize.Width() += ImplGetImageToTextDistance(); aSize.Width() += aTextSize.Width(); if ( aSize.Height() < aTextSize.Height() ) aSize.Height() = aTextSize.Height(); diff --git a/vcl/source/control/combobox.cxx b/vcl/source/control/combobox.cxx index 42abe3fd248a..21707d0182f5 100644 --- a/vcl/source/control/combobox.cxx +++ b/vcl/source/control/combobox.cxx @@ -44,7 +44,7 @@ #include #include #include -#include +#include @@ -142,23 +142,19 @@ void ComboBox::ImplCalcEditHeight() if ( !IsDropDownBox() ) mnDDHeight += 4; - // FIXME: currently only on aqua; see if we can use this on other platforms - if( ImplGetSVData()->maNWFData.mbNoFocusRects ) + Region aCtrlRegion( Rectangle( (const Point&)Point(), Size( 10, 10 ) ) ); + Region aBoundRegion, aContentRegion; + ImplControlValue aControlValue; + ControlType aType = IsDropDownBox() ? CTRL_COMBOBOX : CTRL_EDITBOX; + if( GetNativeControlRegion( aType, PART_ENTIRE_CONTROL, + aCtrlRegion, + CTRL_STATE_ENABLED, + aControlValue, rtl::OUString(), + aBoundRegion, aContentRegion ) ) { - Region aCtrlRegion( Rectangle( (const Point&)Point(), Size( 10, 10 ) ) ); - Region aBoundRegion, aContentRegion; - ImplControlValue aControlValue; - ControlType aType = IsDropDownBox() ? CTRL_COMBOBOX : CTRL_EDITBOX; - if( GetNativeControlRegion( aType, PART_ENTIRE_CONTROL, - aCtrlRegion, - CTRL_STATE_ENABLED, - aControlValue, rtl::OUString(), - aBoundRegion, aContentRegion ) ) - { - const long nNCHeight = aBoundRegion.GetBoundRect().GetHeight(); - if( mnDDHeight < nNCHeight ) - mnDDHeight = sal::static_int_cast( nNCHeight ); - } + const long nNCHeight = aBoundRegion.GetBoundRect().GetHeight(); + if( mnDDHeight < nNCHeight ) + mnDDHeight = sal::static_int_cast( nNCHeight ); } } @@ -291,6 +287,7 @@ BOOL ComboBox::IsAutocompleteEnabled() const IMPL_LINK( ComboBox, ImplClickBtnHdl, void*, EMPTYARG ) { + ImplCallEventListeners( VCLEVENT_DROPDOWN_PRE_OPEN ); mpSubEdit->GrabFocus(); if ( !mpImplLB->GetEntryList()->GetMRUCount() ) ImplUpdateFloatSelection(); @@ -527,6 +524,7 @@ void ComboBox::ToggleDropDown() ImplUpdateFloatSelection(); else mpImplLB->SelectEntry( 0 , TRUE ); + ImplCallEventListeners( VCLEVENT_DROPDOWN_PRE_OPEN ); mpBtn->SetPressed( TRUE ); SetSelection( Selection( 0, SELECTION_MAX ) ); mpFloatWin->StartFloat( TRUE ); @@ -691,7 +689,7 @@ void ComboBox::Resize() void ComboBox::FillLayoutData() const { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); AppendLayoutData( *mpSubEdit ); mpSubEdit->SetLayoutDataParent( this ); Control* pMainWindow = mpImplLB->GetMainWindow(); @@ -804,14 +802,8 @@ void ComboBox::DataChanged( const DataChangedEvent& rDCEvt ) long ComboBox::PreNotify( NotifyEvent& rNEvt ) { - long nDone = 0; - if( ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN ) && ( rNEvt.GetWindow() == mpImplLB->GetMainWindow() ) ) - { - mpSubEdit->GrabFocus(); - } - - return nDone ? nDone : Edit::PreNotify( rNEvt ); + return Edit::PreNotify( rNEvt ); } // ----------------------------------------------------------------------- @@ -834,6 +826,7 @@ long ComboBox::Notify( NotifyEvent& rNEvt ) ImplUpdateFloatSelection(); if( ( nKeyCode == KEY_DOWN ) && mpFloatWin && !mpFloatWin->IsInPopupMode() && aKeyEvt.GetKeyCode().IsMod2() ) { + ImplCallEventListeners( VCLEVENT_DROPDOWN_PRE_OPEN ); mpBtn->SetPressed( TRUE ); if ( mpImplLB->GetEntryList()->GetMRUCount() ) mpImplLB->SelectEntry( 0 , TRUE ); @@ -876,10 +869,23 @@ long ComboBox::Notify( NotifyEvent& rNEvt ) (rNEvt.GetCommandEvent()->GetCommand() == COMMAND_WHEEL) && (rNEvt.GetWindow() == mpSubEdit) ) { - if( ! GetSettings().GetMouseSettings().GetNoWheelActionWithoutFocus() || HasChildPathFocus() ) + USHORT nWheelBehavior( GetSettings().GetMouseSettings().GetWheelBehavior() ); + if ( ( nWheelBehavior == MOUSE_WHEEL_ALWAYS ) + || ( ( nWheelBehavior == MOUSE_WHEEL_FOCUS_ONLY ) + && HasChildPathFocus() + ) + ) + { nDone = mpImplLB->HandleWheelAsCursorTravel( *rNEvt.GetCommandEvent() ); + } else + { nDone = 0; // don't eat this event, let the default handling happen (i.e. scroll the context) + } + } + else if( ( rNEvt.GetType() == EVENT_MOUSEBUTTONDOWN ) && ( rNEvt.GetWindow() == mpImplLB->GetMainWindow() ) ) + { + mpSubEdit->GrabFocus(); } return nDone ? nDone : Edit::Notify( rNEvt ); @@ -1528,7 +1534,7 @@ void ComboBox::SetBorderStyle( USHORT nBorderStyle ) long ComboBox::GetIndexForPoint( const Point& rPoint, USHORT& rPos ) const { - if( ! mpLayoutData ) + if( !HasLayoutData() ) FillLayoutData(); // check whether rPoint fits at all diff --git a/vcl/source/control/ctrl.cxx b/vcl/source/control/ctrl.cxx index 55c979fbd69f..1800327df33c 100644 --- a/vcl/source/control/ctrl.cxx +++ b/vcl/source/control/ctrl.cxx @@ -39,10 +39,12 @@ #include #include #include -#include +#include #include +#include - +#include +#include using namespace vcl; @@ -51,7 +53,7 @@ using namespace vcl; void Control::ImplInitControlData() { mbHasFocus = FALSE; - mpLayoutData = NULL; + mpControlData = new ImplControlData; } // ----------------------------------------------------------------------- @@ -90,7 +92,7 @@ Control::Control( Window* pParent, const ResId& rResId ) : Control::~Control() { - delete mpLayoutData, mpLayoutData = NULL; + delete mpControlData, mpControlData = NULL; } // ----------------------------------------------------------------------- @@ -111,7 +113,7 @@ void Control::LoseFocus() void Control::Resize() { - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); Window::Resize(); } @@ -123,10 +125,31 @@ void Control::FillLayoutData() const // ----------------------------------------------------------------------- +void Control::CreateLayoutData() const +{ + DBG_ASSERT( !mpControlData->mpLayoutData, "Control::CreateLayoutData: should be called with non-existent layout data only!" ); + mpControlData->mpLayoutData = new ::vcl::ControlLayoutData(); +} + +// ----------------------------------------------------------------------- + +bool Control::HasLayoutData() const +{ + return mpControlData->mpLayoutData != NULL; +} + +// ----------------------------------------------------------------------- + +::vcl::ControlLayoutData* Control::GetLayoutData() const +{ + return mpControlData->mpLayoutData; +} + +// ----------------------------------------------------------------------- + void Control::SetText( const String& rStr ) { - delete mpLayoutData; - mpLayoutData = NULL; + ImplClearLayoutData(); Window::SetText( rStr ); } @@ -142,9 +165,9 @@ Rectangle ControlLayoutData::GetCharacterBounds( long nIndex ) const Rectangle Control::GetCharacterBounds( long nIndex ) const { - if( ! mpLayoutData ) + if( !HasLayoutData() ) FillLayoutData(); - return mpLayoutData ? mpLayoutData->GetCharacterBounds( nIndex ) : Rectangle(); + return mpControlData->mpLayoutData ? mpControlData->mpLayoutData->GetCharacterBounds( nIndex ) : Rectangle(); } // ----------------------------------------------------------------------- @@ -167,9 +190,9 @@ long ControlLayoutData::GetIndexForPoint( const Point& rPoint ) const long Control::GetIndexForPoint( const Point& rPoint ) const { - if( ! mpLayoutData ) + if( ! HasLayoutData() ) FillLayoutData(); - return mpLayoutData ? mpLayoutData->GetIndexForPoint( rPoint ) : -1; + return mpControlData->mpLayoutData ? mpControlData->mpLayoutData->GetIndexForPoint( rPoint ) : -1; } // ----------------------------------------------------------------------- @@ -186,9 +209,9 @@ long ControlLayoutData::GetLineCount() const long Control::GetLineCount() const { - if( ! mpLayoutData ) + if( !HasLayoutData() ) FillLayoutData(); - return mpLayoutData ? mpLayoutData->GetLineCount() : 0; + return mpControlData->mpLayoutData ? mpControlData->mpLayoutData->GetLineCount() : 0; } // ----------------------------------------------------------------------- @@ -220,9 +243,9 @@ Pair ControlLayoutData::GetLineStartEnd( long nLine ) const Pair Control::GetLineStartEnd( long nLine ) const { - if( ! mpLayoutData ) + if( !HasLayoutData() ) FillLayoutData(); - return mpLayoutData ? mpLayoutData->GetLineStartEnd( nLine ) : Pair( -1, -1 ); + return mpControlData->mpLayoutData ? mpControlData->mpLayoutData->GetLineStartEnd( nLine ) : Pair( -1, -1 ); } // ----------------------------------------------------------------------- @@ -263,18 +286,18 @@ long ControlLayoutData::ToRelativeLineIndex( long nIndex ) const long Control::ToRelativeLineIndex( long nIndex ) const { - if( ! mpLayoutData ) + if( !HasLayoutData() ) FillLayoutData(); - return mpLayoutData ? mpLayoutData->ToRelativeLineIndex( nIndex ) : -1; + return mpControlData->mpLayoutData ? mpControlData->mpLayoutData->ToRelativeLineIndex( nIndex ) : -1; } // ----------------------------------------------------------------------- String Control::GetDisplayText() const { - if( ! mpLayoutData ) + if( !HasLayoutData() ) FillLayoutData(); - return mpLayoutData ? mpLayoutData->m_aDisplayText : GetText(); + return mpControlData->mpLayoutData ? mpControlData->mpLayoutData->m_aDisplayText : GetText(); } // ----------------------------------------------------------------------- @@ -321,8 +344,7 @@ void Control::StateChanged( StateChangedType nStateChange ) nStateChange == STATE_CHANGE_CONTROLFONT ) { - delete mpLayoutData; - mpLayoutData = NULL; + ImplClearLayoutData(); } Window::StateChanged( nStateChange ); } @@ -331,25 +353,25 @@ void Control::StateChanged( StateChangedType nStateChange ) void Control::AppendLayoutData( const Control& rSubControl ) const { - if( ! rSubControl.mpLayoutData ) + if( !rSubControl.HasLayoutData() ) rSubControl.FillLayoutData(); - if( ! rSubControl.mpLayoutData || ! rSubControl.mpLayoutData->m_aDisplayText.Len() ) + if( !rSubControl.HasLayoutData() || !rSubControl.mpControlData->mpLayoutData->m_aDisplayText.Len() ) return; - long nCurrentIndex = mpLayoutData->m_aDisplayText.Len(); - mpLayoutData->m_aDisplayText.Append( rSubControl.mpLayoutData->m_aDisplayText ); - int nLines = rSubControl.mpLayoutData->m_aLineIndices.size(); + long nCurrentIndex = mpControlData->mpLayoutData->m_aDisplayText.Len(); + mpControlData->mpLayoutData->m_aDisplayText.Append( rSubControl.mpControlData->mpLayoutData->m_aDisplayText ); + int nLines = rSubControl.mpControlData->mpLayoutData->m_aLineIndices.size(); int n; - mpLayoutData->m_aLineIndices.push_back( nCurrentIndex ); + mpControlData->mpLayoutData->m_aLineIndices.push_back( nCurrentIndex ); for( n = 1; n < nLines; n++ ) - mpLayoutData->m_aLineIndices.push_back( rSubControl.mpLayoutData->m_aLineIndices[n] + nCurrentIndex ); - int nRectangles = rSubControl.mpLayoutData->m_aUnicodeBoundRects.size(); + mpControlData->mpLayoutData->m_aLineIndices.push_back( rSubControl.mpControlData->mpLayoutData->m_aLineIndices[n] + nCurrentIndex ); + int nRectangles = rSubControl.mpControlData->mpLayoutData->m_aUnicodeBoundRects.size(); Rectangle aRel = const_cast(rSubControl).GetWindowExtentsRelative( const_cast(this) ); for( n = 0; n < nRectangles; n++ ) { - Rectangle aRect = rSubControl.mpLayoutData->m_aUnicodeBoundRects[n]; + Rectangle aRect = rSubControl.mpControlData->mpLayoutData->m_aUnicodeBoundRects[n]; aRect.Move( aRel.Left(), aRel.Top() ); - mpLayoutData->m_aUnicodeBoundRects.push_back( aRect ); + mpControlData->mpLayoutData->m_aUnicodeBoundRects.push_back( aRect ); } } @@ -378,15 +400,15 @@ BOOL Control::ImplCallEventListenersAndHandler( ULONG nEvent, const Link& rHand void Control::SetLayoutDataParent( const Control* pParent ) const { - if( mpLayoutData ) - mpLayoutData->m_pParent = pParent; + if( HasLayoutData() ) + mpControlData->mpLayoutData->m_pParent = pParent; } // ----------------------------------------------------------------- void Control::ImplClearLayoutData() const { - delete mpLayoutData, mpLayoutData = NULL; + delete mpControlData->mpLayoutData, mpControlData->mpLayoutData = NULL; } // ----------------------------------------------------------------------- @@ -467,3 +489,102 @@ Size Control::GetOptimalSize(WindowSizeType eType) const return Size( LONG_MAX, LONG_MAX ); } } + +// ----------------------------------------------------------------- + +void Control::SetReferenceDevice( OutputDevice* _referenceDevice ) +{ + if ( mpControlData->mpReferenceDevice == _referenceDevice ) + return; + + mpControlData->mpReferenceDevice = _referenceDevice; + Invalidate(); +} + +// ----------------------------------------------------------------- + +OutputDevice* Control::GetReferenceDevice() const +{ + return mpControlData->mpReferenceDevice; +} + +// ----------------------------------------------------------------- + +const Font& Control::GetCanonicalFont( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetLabelFont(); +} + +// ----------------------------------------------------------------- +const Color& Control::GetCanonicalTextColor( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetLabelTextColor(); +} + +// ----------------------------------------------------------------- +void Control::ImplInitSettings( const BOOL _bFont, const BOOL _bForeground ) +{ + const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); + + if ( _bFont ) + { + Font aFont( GetCanonicalFont( rStyleSettings ) ); + if ( IsControlFont() ) + aFont.Merge( GetControlFont() ); + SetZoomedPointFont( aFont ); + } + + if ( _bForeground || _bFont ) + { + Color aColor; + if ( IsControlForeground() ) + aColor = GetControlForeground(); + else + aColor = GetCanonicalTextColor( rStyleSettings ); + SetTextColor( aColor ); + SetTextFillColor(); + } +} + +// ----------------------------------------------------------------- + +void Control::DrawControlText( OutputDevice& _rTargetDevice, Rectangle& _io_rRect, const XubString& _rStr, + USHORT _nStyle, MetricVector* _pVector, String* _pDisplayText ) const +{ +#ifdef FS_DEBUG + if ( !_pVector ) + { + static MetricVector aCharRects; + static String sDisplayText; + aCharRects.clear(); + sDisplayText = String(); + _pVector = &aCharRects; + _pDisplayText = &sDisplayText; + } +#endif + + if ( !mpControlData->mpReferenceDevice || ( mpControlData->mpReferenceDevice == &_rTargetDevice ) ) + { + _io_rRect = _rTargetDevice.GetTextRect( _io_rRect, _rStr, _nStyle ); + _rTargetDevice.DrawText( _io_rRect, _rStr, _nStyle, _pVector, _pDisplayText ); + } + else + { + ControlTextRenderer aRenderer( *this, _rTargetDevice, *mpControlData->mpReferenceDevice ); + _io_rRect = aRenderer.DrawText( _io_rRect, _rStr, _nStyle, _pVector, _pDisplayText ); + } + +#ifdef FS_DEBUG + _rTargetDevice.Push( PUSH_LINECOLOR | PUSH_FILLCOLOR ); + _rTargetDevice.SetLineColor( COL_LIGHTRED ); + _rTargetDevice.SetFillColor(); + for ( MetricVector::const_iterator cr = _pVector->begin(); + cr != _pVector->end(); + ++cr + ) + { + _rTargetDevice.DrawRect( *cr ); + } + _rTargetDevice.Pop(); +#endif +} diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx index 5f41a441c6a1..b654e034470f 100644 --- a/vcl/source/control/edit.cxx +++ b/vcl/source/control/edit.cxx @@ -47,7 +47,7 @@ #include #include #include -#include +#include #include #include @@ -409,7 +409,7 @@ void Edit::ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ) if ( IsControlFont() ) aFont.Merge( GetControlFont() ); SetZoomedPointFont( aFont ); - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); } if ( bFont || bForeground ) @@ -526,8 +526,8 @@ void Edit::ImplRepaint( xub_StrLen nStart, xub_StrLen nEnd, bool bLayout ) long nPos = nStart ? pDX[2*nStart] : 0; aPos.X() = nPos + mnXOffset + ImplGetExtraOffset(); - MetricVector* pVector = &mpLayoutData->m_aUnicodeBoundRects; - String* pDisplayText = &mpLayoutData->m_aDisplayText; + MetricVector* pVector = &mpControlData->mpLayoutData->m_aUnicodeBoundRects; + String* pDisplayText = &mpControlData->mpLayoutData->m_aDisplayText; DrawText( aPos, aText, nStart, nEnd - nStart, pVector, pDisplayText ); @@ -722,7 +722,7 @@ void Edit::ImplDelete( const Selection& rSelection, BYTE nDirection, BYTE nMode ((rSelection.Max() == aText.Len()) && (nDirection == EDIT_DEL_RIGHT))) ) return; - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); Selection aSelection( rSelection ); aSelection.Justify(); @@ -864,7 +864,7 @@ void Edit::ImplInsertText( const XubString& rStr, const Selection* pNewSel, sal_ rtl::OUString aNewText( ImplGetValidString( rStr ) ); ImplTruncateToMaxLen( aNewText, aSelection.Len() ); - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); if ( aSelection.Len() ) maText.Erase( (xub_StrLen)aSelection.Min(), (xub_StrLen)aSelection.Len() ); @@ -1006,7 +1006,7 @@ void Edit::ImplSetText( const XubString& rText, const Selection* pNewSelection ) // wird, dann InsertText, damit flackerfrei. if ( ( rText.Len() <= mnMaxTextLen ) && ( (rText != maText) || (pNewSelection && (*pNewSelection != maSelection)) ) ) { - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); maSelection.Min() = 0; maSelection.Max() = maText.Len(); if ( mnXOffset || HasPaintEvent() ) @@ -1637,7 +1637,7 @@ BOOL Edit::ImplHandleKeyEvent( const KeyEvent& rKEvt ) { if ( !rKEvt.GetKeyCode().IsMod2() ) { - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); uno::Reference < i18n::XBreakIterator > xBI = ImplGetBreakIterator(); Selection aSel( maSelection ); @@ -1858,7 +1858,7 @@ void Edit::KeyInput( const KeyEvent& rKEvt ) void Edit::FillLayoutData() const { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); const_cast(this)->ImplRepaint( 0, STRING_LEN, true ); } @@ -2648,7 +2648,7 @@ void Edit::ImplSetSelection( const Selection& rSelection, BOOL bPaint ) if ( aNew != maSelection ) { - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); maSelection = aNew; if ( bPaint && ( aOld.Len() || aNew.Len() || IsPaintTransparent() ) ) diff --git a/vcl/source/control/field.cxx b/vcl/source/control/field.cxx index 1bc6af51f369..3cb6e45f0400 100644 --- a/vcl/source/control/field.cxx +++ b/vcl/source/control/field.cxx @@ -503,6 +503,9 @@ void NumericFormatter::ImplLoadRes( const ResId& rResId ) mnFieldValue = mnMin; mnLastValue = mnFieldValue; } + + if ( NUMERICFORMATTER_NOTHOUSANDSEP & nMask ) + SetUseThousandSep( !(BOOL)pMgr->ReadShort() ); } } diff --git a/vcl/source/control/field2.cxx b/vcl/source/control/field2.cxx index b417774142d3..a7729f4ace24 100644 --- a/vcl/source/control/field2.cxx +++ b/vcl/source/control/field2.cxx @@ -55,6 +55,7 @@ #include #include #include +#include using namespace ::com::sun::star; @@ -1214,7 +1215,7 @@ static BOOL ImplDateProcessKeyInput( Edit*, const KeyEvent& rKEvt, ExtDateFieldF static BOOL ImplDateGetValue( const XubString& rStr, Date& rDate, ExtDateFieldFormat eDateFormat, const LocaleDataWrapper& rLocaleDataWrapper, const CalendarWrapper& rCalendarWrapper, - const AllSettings& rSettings ) + const AllSettings& ) { USHORT nDay = 0; USHORT nMonth = 0; @@ -1312,7 +1313,7 @@ static BOOL ImplDateGetValue( const XubString& rStr, Date& rDate, ExtDateFieldFo return FALSE; Date aNewDate( nDay, nMonth, nYear ); - DateFormatter::ExpandCentury( aNewDate, rSettings.GetMiscSettings().GetTwoDigitYearStart() ); + DateFormatter::ExpandCentury( aNewDate, utl::MiscCfg().GetYear2000() ); if ( aNewDate.IsValid() ) { rDate = aNewDate; @@ -1355,7 +1356,7 @@ BOOL DateFormatter::ImplDateReformat( const XubString& rStr, XubString& rOutStr, // ----------------------------------------------------------------------- XubString DateFormatter::ImplGetDateAsText( const Date& rDate, - const AllSettings& rSettings ) const + const AllSettings& ) const { BOOL bShowCentury = FALSE; switch ( GetExtDateFormat() ) @@ -1379,7 +1380,7 @@ XubString DateFormatter::ImplGetDateAsText( const Date& rDate, if ( !bShowCentury ) { // Check if I have to use force showing the century - USHORT nTwoDigitYearStart = rSettings.GetMiscSettings().GetTwoDigitYearStart(); + USHORT nTwoDigitYearStart = utl::MiscCfg().GetYear2000(); USHORT nYear = rDate.GetYear(); // Wenn Jahr nicht im 2stelligen Grenzbereich liegt, @@ -2033,7 +2034,7 @@ void DateFormatter::Reformat() void DateFormatter::ExpandCentury( Date& rDate ) { - ExpandCentury( rDate, Application::GetSettings().GetMiscSettings().GetTwoDigitYearStart() ); + ExpandCentury( rDate, utl::MiscCfg().GetYear2000() ); } // ----------------------------------------------------------------------- diff --git a/vcl/source/control/fixed.cxx b/vcl/source/control/fixed.cxx index 530e928532e1..3d19e288a1ce 100644 --- a/vcl/source/control/fixed.cxx +++ b/vcl/source/control/fixed.cxx @@ -33,7 +33,7 @@ #include #include #include -#include +#include #include #include @@ -109,40 +109,25 @@ WinBits FixedText::ImplInitStyle( WinBits nStyle ) return nStyle; } +// ----------------------------------------------------------------- + +const Font& FixedText::GetCanonicalFont( const StyleSettings& _rStyle ) const +{ + return ( GetStyle() & WB_INFO ) ? _rStyle.GetInfoFont() : _rStyle.GetLabelFont(); +} + +// ----------------------------------------------------------------- +const Color& FixedText::GetCanonicalTextColor( const StyleSettings& _rStyle ) const +{ + return ( GetStyle() & WB_INFO ) ? _rStyle.GetInfoTextColor() : _rStyle.GetLabelTextColor(); +} + // ----------------------------------------------------------------------- void FixedText::ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ) { - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - - if ( bFont ) - { - Font aFont; - if ( GetStyle() & WB_INFO ) - aFont = rStyleSettings.GetInfoFont(); - else - aFont = rStyleSettings.GetLabelFont(); - if ( IsControlFont() ) - aFont.Merge( GetControlFont() ); - SetZoomedPointFont( aFont ); - } - - if ( bForeground || bFont ) - { - Color aColor; - if ( IsControlForeground() ) - aColor = GetControlForeground(); - else - { - if ( GetStyle() & WB_INFO ) - aColor = rStyleSettings.GetInfoTextColor(); - else - aColor = rStyleSettings.GetLabelTextColor(); - } - SetTextColor( aColor ); - SetTextFillColor(); - } + Control::ImplInitSettings( bFont, bForeground ); if ( bBackground ) { @@ -278,17 +263,13 @@ void FixedText::ImplDraw( OutputDevice* pDev, ULONG nDrawFlags, nTextStyle |= TEXT_DRAW_MONO; if( bFillLayout ) - { - mpLayoutData->m_aDisplayText = String(); - pDev->DrawText( Rectangle( aPos, rSize ), - aText, - nTextStyle, - &mpLayoutData->m_aUnicodeBoundRects, - &mpLayoutData->m_aDisplayText - ); - } - else - pDev->DrawText( Rectangle( aPos, rSize ), aText, nTextStyle ); + mpControlData->mpLayoutData->m_aDisplayText = String(); + + Rectangle aRect( Rectangle( aPos, rSize ) ); + DrawControlText( *pDev, aRect, aText, nTextStyle, + bFillLayout ? &mpControlData->mpLayoutData->m_aUnicodeBoundRects : NULL, + bFillLayout ? &mpControlData->mpLayoutData->m_aDisplayText : NULL + ); } // ----------------------------------------------------------------------- @@ -446,7 +427,7 @@ Size FixedText::GetOptimalSize(WindowSizeType eType) const void FixedText::FillLayoutData() const { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); ImplDraw( const_cast(this), 0, Point(), GetOutputSizePixel(), true ); } @@ -468,31 +449,25 @@ WinBits FixedLine::ImplInitStyle( WinBits nStyle ) return nStyle; } +// ----------------------------------------------------------------- + +const Font& FixedLine::GetCanonicalFont( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetGroupFont(); +} + +// ----------------------------------------------------------------- +const Color& FixedLine::GetCanonicalTextColor( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetGroupTextColor(); +} + // ----------------------------------------------------------------------- void FixedLine::ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ) { - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - - if ( bFont ) - { - Font aFont = rStyleSettings.GetGroupFont(); - if ( IsControlFont() ) - aFont.Merge( GetControlFont() ); - SetZoomedPointFont( aFont ); - } - - if ( bForeground || bFont ) - { - Color aColor; - if ( IsControlForeground() ) - aColor = GetControlForeground(); - else - aColor = rStyleSettings.GetGroupTextColor(); - SetTextColor( aColor ); - SetTextFillColor(); - } + Control::ImplInitSettings( bFont, bForeground ); if ( bBackground ) { @@ -526,8 +501,8 @@ void FixedLine::ImplDraw( bool bLayout ) String aText = GetText(); const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); WinBits nWinStyle = GetStyle(); - MetricVector* pVector = bLayout ? &mpLayoutData->m_aUnicodeBoundRects : NULL; - String* pDisplayText = bLayout ? &mpLayoutData->m_aDisplayText : NULL; + MetricVector* pVector = bLayout ? &mpControlData->mpLayoutData->m_aUnicodeBoundRects : NULL; + String* pDisplayText = bLayout ? &mpControlData->mpLayoutData->m_aDisplayText : NULL; if ( rStyleSettings.GetOptions() & STYLE_OPTION_MONO ) SetLineColor( Color( COL_BLACK ) ); @@ -574,8 +549,7 @@ void FixedLine::ImplDraw( bool bLayout ) if ( rStyleSettings.GetOptions() & STYLE_OPTION_MONO ) nStyle |= TEXT_DRAW_MONO; - aRect = GetTextRect( aRect, aText, nStyle ); - DrawText( aRect, aText, nStyle, pVector, pDisplayText ); + DrawControlText( *this, aRect, aText, nStyle, pVector, pDisplayText ); if( !pVector ) { @@ -617,7 +591,7 @@ FixedLine::FixedLine( Window* pParent, const ResId& rResId ) : void FixedLine::FillLayoutData() const { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); const_cast(this)->ImplDraw( true ); } @@ -804,13 +778,10 @@ void FixedBitmap::ImplDraw( OutputDevice* pDev, ULONG /* nDrawFlags */, USHORT nStyle = 0; Bitmap* pBitmap = &maBitmap; Color aCol; - if( !!maBitmapHC && ImplGetCurrentBackgroundColor( aCol ) ) + if( !!maBitmapHC ) { - if( aCol.IsDark() ) + if( GetSettings().GetStyleSettings().GetHighContrastMode() ) pBitmap = &maBitmapHC; - // #99902 no col transform required - //if( aCol.IsBright() ) - // nStyle |= IMAGE_DRAW_COLORTRANSFORM; } if( nStyle & IMAGE_DRAW_COLORTRANSFORM ) @@ -1058,13 +1029,10 @@ void FixedImage::ImplDraw( OutputDevice* pDev, ULONG nDrawFlags, Image *pImage = &maImage; Color aCol; - if( !!maImageHC && ImplGetCurrentBackgroundColor( aCol ) ) + if( !!maImageHC ) { - if( aCol.IsDark() ) + if( GetSettings().GetStyleSettings().GetHighContrastMode() ) pImage = &maImageHC; - // #99902 no col transform required - //if( aCol.IsBright() ) - // nStyle |= IMAGE_DRAW_COLORTRANSFORM; } // Haben wir ueberhaupt ein Image diff --git a/vcl/source/control/group.cxx b/vcl/source/control/group.cxx index a844c2f2eb93..4adc91f88d84 100644 --- a/vcl/source/control/group.cxx +++ b/vcl/source/control/group.cxx @@ -32,7 +32,7 @@ #include "precompiled_vcl.hxx" #include #include -#include +#include #ifndef _SV_RC_H #include @@ -66,31 +66,25 @@ WinBits GroupBox::ImplInitStyle( WinBits nStyle ) return nStyle; } +// ----------------------------------------------------------------- + +const Font& GroupBox::GetCanonicalFont( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetGroupFont(); +} + +// ----------------------------------------------------------------- +const Color& GroupBox::GetCanonicalTextColor( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetGroupTextColor(); +} + // ----------------------------------------------------------------------- void GroupBox::ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ) { - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - - if ( bFont ) - { - Font aFont = rStyleSettings.GetGroupFont(); - if ( IsControlFont() ) - aFont.Merge( GetControlFont() ); - SetZoomedPointFont( aFont ); - } - - if ( bForeground || bFont ) - { - Color aColor; - if ( IsControlForeground() ) - aColor = GetControlForeground(); - else - aColor = rStyleSettings.GetGroupTextColor(); - SetTextColor( aColor ); - SetTextFillColor(); - } + Control::ImplInitSettings( bFont, bForeground ); if ( bBackground ) { @@ -227,16 +221,16 @@ void GroupBox::ImplDraw( OutputDevice* pDev, ULONG nDrawFlags, } } - MetricVector* pVector = bLayout ? &mpLayoutData->m_aUnicodeBoundRects : NULL; - String* pDisplayText = bLayout ? &mpLayoutData->m_aDisplayText : NULL; - pDev->DrawText( aRect, aText, nTextStyle, pVector, pDisplayText ); + MetricVector* pVector = bLayout ? &mpControlData->mpLayoutData->m_aUnicodeBoundRects : NULL; + String* pDisplayText = bLayout ? &mpControlData->mpLayoutData->m_aDisplayText : NULL; + DrawControlText( *pDev, aRect, aText, nTextStyle, pVector, pDisplayText ); } // ----------------------------------------------------------------------- void GroupBox::FillLayoutData() const { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); const_cast(this)-> ImplDraw( const_cast(this), 0, Point(), GetOutputSizePixel(), true ); } diff --git a/vcl/source/control/ilstbox.cxx b/vcl/source/control/ilstbox.cxx index a25ddbb68e8b..a915d8e6b9e8 100644 --- a/vcl/source/control/ilstbox.cxx +++ b/vcl/source/control/ilstbox.cxx @@ -40,7 +40,7 @@ #include #include #include -#include +#include #include #ifndef _COM_SUN_STAR_UTIL_XCOLLATOR_HPP_ #include @@ -647,7 +647,7 @@ void ImplListBoxWindow::Clear() mnTop = 0; mnLeft = 0; mbImgsDiffSz = FALSE; - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); mnCurrentPos = LISTBOX_ENTRY_NOTFOUND; @@ -656,7 +656,7 @@ void ImplListBoxWindow::Clear() void ImplListBoxWindow::SetUserItemSize( const Size& rSz ) { - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); maUserItemSize = rSz; ImplCalcMetrics(); } @@ -778,7 +778,7 @@ void ImplListBoxWindow::ImplCallSelect() nMRUCount--; } - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); ImplEntryType* pNewEntry = new ImplEntryType( aSelected ); pNewEntry->mbIsSelected = bSelectNewEntry; @@ -798,7 +798,7 @@ void ImplListBoxWindow::ImplCallSelect() USHORT ImplListBoxWindow::InsertEntry( USHORT nPos, ImplEntryType* pNewEntry ) { - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); USHORT nNewPos = mpEntryList->InsertEntry( nPos, pNewEntry, mbSort ); if( (GetStyle() & WB_WORDBREAK) ) @@ -812,7 +812,7 @@ USHORT ImplListBoxWindow::InsertEntry( USHORT nPos, ImplEntryType* pNewEntry ) void ImplListBoxWindow::RemoveEntry( USHORT nPos ) { - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); mpEntryList->RemoveEntry( nPos ); if( mnCurrentPos >= mpEntryList->GetEntryCount() ) mnCurrentPos = LISTBOX_ENTRY_NOTFOUND; @@ -1062,7 +1062,7 @@ void ImplListBoxWindow::SelectEntry( USHORT nPos, BOOL bSelect ) ImplPaint( nPos ); if ( !IsVisible( nPos ) ) { - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); USHORT nVisibleEntries = GetLastVisibleEntry()-mnTop; if ( !nVisibleEntries || !IsReallyVisible() || ( nPos < GetTopEntry() ) ) { @@ -1233,7 +1233,7 @@ BOOL ImplListBoxWindow::SelectEntries( USHORT nSelect, LB_EVENT_TYPE eLET, BOOL if( HasFocus() ) ImplShowFocusRect(); } - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); } return bSelectionChanged; } @@ -1838,8 +1838,8 @@ void ImplListBoxWindow::DrawEntry( USHORT nPos, BOOL bDrawImage, BOOL bDrawText, if( bDrawText ) { - MetricVector* pVector = bLayout ? &mpLayoutData->m_aUnicodeBoundRects : NULL; - String* pDisplayText = bLayout ? &mpLayoutData->m_aDisplayText : NULL; + MetricVector* pVector = bLayout ? &mpControlData->mpLayoutData->m_aUnicodeBoundRects : NULL; + String* pDisplayText = bLayout ? &mpControlData->mpLayoutData->m_aDisplayText : NULL; XubString aStr( mpEntryList->GetEntryText( nPos ) ); if ( aStr.Len() ) { @@ -1859,7 +1859,7 @@ void ImplListBoxWindow::DrawEntry( USHORT nPos, BOOL bDrawImage, BOOL bDrawText, } if( bLayout ) - mpLayoutData->m_aLineIndices.push_back( mpLayoutData->m_aDisplayText.Len() ); + mpControlData->mpLayoutData->m_aLineIndices.push_back( mpControlData->mpLayoutData->m_aDisplayText.Len() ); // pb: #106948# explicit mirroring for calc if ( mbMirroring ) @@ -1900,7 +1900,7 @@ void ImplListBoxWindow::DrawEntry( USHORT nPos, BOOL bDrawImage, BOOL bDrawText, void ImplListBoxWindow::FillLayoutData() const { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); const_cast(this)-> ImplDoPaint( Rectangle( Point( 0, 0 ), GetOutputSize() ), true ); } @@ -1978,7 +1978,7 @@ void ImplListBoxWindow::Resize() if ( bShowFocusRect ) ImplShowFocusRect(); - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); } // ----------------------------------------------------------------------- @@ -2034,7 +2034,7 @@ void ImplListBoxWindow::SetTopEntry( USHORT nTop ) if ( nTop != mnTop ) { - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); long nDiff = mpEntryList->GetAddedHeight( mnTop, nTop, 0 ); Update(); ImplHideFocusRect(); @@ -2078,7 +2078,7 @@ void ImplListBoxWindow::ScrollHorz( long n ) if ( nDiff ) { - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); mnLeft = sal::static_int_cast(mnLeft + nDiff); Update(); ImplHideFocusRect(); @@ -2148,7 +2148,7 @@ void ImplListBoxWindow::StateChanged( StateChangedType nType ) ImplInitSettings( FALSE, FALSE, TRUE ); Invalidate(); } - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); } // ----------------------------------------------------------------------- @@ -2162,7 +2162,7 @@ void ImplListBoxWindow::DataChanged( const DataChangedEvent& rDCEvt ) ((rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE)) ) { - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); ImplInitSettings( TRUE, TRUE, TRUE ); ImplCalcMetrics(); Invalidate(); @@ -2743,7 +2743,7 @@ void ImplWin::MouseButtonDown( const MouseEvent& ) void ImplWin::FillLayoutData() const { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); const_cast(this)->ImplDraw( true ); } @@ -2899,23 +2899,8 @@ void ImplWin::DrawEntry( BOOL bDrawImage, BOOL bDrawText, BOOL bDrawTextAtImageP if( !!maImageHC ) { - // determine backgroundcolor as done in Paint() - Color aBackCol; - if( IsEnabled() ) - { - if( HasFocus() ) - aBackCol = GetSettings().GetStyleSettings().GetHighlightColor(); - else - aBackCol = GetBackground().GetColor(); - } - else // Disabled - aBackCol = GetBackground().GetColor(); - - if( aBackCol.IsDark() ) + if( GetSettings().GetStyleSettings().GetHighContrastMode() ) pImage = &maImageHC; - // #99902 no col transform required - //if( aBackCol.IsBright() ) - // nStyle |= IMAGE_DRAW_COLORTRANSFORM; } if ( !IsZoom() ) @@ -2951,8 +2936,8 @@ void ImplWin::DrawEntry( BOOL bDrawImage, BOOL bDrawText, BOOL bDrawTextAtImageP aTextRect.Left() += nMaxWidth + IMG_TXT_DISTANCE; } - MetricVector* pVector = bLayout ? &mpLayoutData->m_aUnicodeBoundRects : NULL; - String* pDisplayText = bLayout ? &mpLayoutData->m_aDisplayText : NULL; + MetricVector* pVector = bLayout ? &mpControlData->mpLayoutData->m_aUnicodeBoundRects : NULL; + String* pDisplayText = bLayout ? &mpControlData->mpLayoutData->m_aDisplayText : NULL; DrawText( aTextRect, maString, nTextStyle, pVector, pDisplayText ); } diff --git a/vcl/source/control/imgctrl.cxx b/vcl/source/control/imgctrl.cxx index 6d4777013a73..73b5154d32ac 100644 --- a/vcl/source/control/imgctrl.cxx +++ b/vcl/source/control/imgctrl.cxx @@ -93,14 +93,10 @@ void ImageControl::UserDraw( const UserDrawEvent& rUDEvt ) { USHORT nStyle = 0; BitmapEx* pBitmap = &maBmp; - Color aCol; - if( !!maBmpHC && ImplGetCurrentBackgroundColor( aCol ) ) + if( !!maBmpHC ) { - if( aCol.IsDark() ) + if( GetSettings().GetStyleSettings().GetHighContrastMode() ) pBitmap = &maBmpHC; - // #99902 no col transform required - //if( aCol.IsBright() ) - // nStyle |= IMAGE_DRAW_COLORTRANSFORM; } if ( !*pBitmap ) diff --git a/vcl/source/control/lstbox.cxx b/vcl/source/control/lstbox.cxx index 66722b70eef8..ceabbe4ab166 100644 --- a/vcl/source/control/lstbox.cxx +++ b/vcl/source/control/lstbox.cxx @@ -31,21 +31,21 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_vcl.hxx" -#ifndef _SV_RC_H -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include "tools/rc.h" + +#include "vcl/svdata.hxx" +#include "vcl/decoview.hxx" +#include "vcl/event.hxx" +#include "vcl/scrbar.hxx" +#include "vcl/button.hxx" +#include "vcl/edit.hxx" +#include "vcl/subedit.hxx" +#include "vcl/ilstbox.hxx" +#include "vcl/lstbox.hxx" +#include "vcl/combobox.hxx" +#include "vcl/controldata.hxx" + +#include "tools/debug.hxx" @@ -127,9 +127,7 @@ void ListBox::ImplInit( Window* pParent, WinBits nStyle ) GetBorder( nLeft, nTop, nRight, nBottom ); mnDDHeight = (USHORT)(GetTextHeight() + nTop + nBottom + 4); - // FIXME: this is currently only on mac/aqua - if( ImplGetSVData()->maNWFData.mbNoFocusRects && - IsNativeWidgetEnabled() && + if( IsNativeWidgetEnabled() && IsNativeControlSupported( CTRL_LISTBOX, PART_ENTIRE_CONTROL ) ) { ImplControlValue aControlValue; @@ -305,6 +303,7 @@ IMPL_LINK( ListBox, ImplClickBtnHdl, void*, EMPTYARG ) { if( !mpFloatWin->IsInPopupMode() ) { + ImplCallEventListeners( VCLEVENT_DROPDOWN_PRE_OPEN ); mpImplWin->GrabFocus(); mpBtn->SetPressed( TRUE ); mpFloatWin->StartFloat( TRUE ); @@ -365,6 +364,7 @@ void ListBox::ToggleDropDown() mpFloatWin->EndPopupMode(); else { + ImplCallEventListeners( VCLEVENT_DROPDOWN_PRE_OPEN ); mpImplWin->GrabFocus(); mpBtn->SetPressed( TRUE ); mpFloatWin->StartFloat( TRUE ); @@ -650,6 +650,7 @@ void ListBox::Resize() long nTop = 0; long nBottom = aOutSz.Height(); + // note: in case of no border, pBorder will actually be this Window *pBorder = GetWindow( WINDOW_BORDER ); ImplControlValue aControlValue; Point aPoint; @@ -678,6 +679,17 @@ void ListBox::Resize() // use the themes drop down size Rectangle aContentRect = aContent.GetBoundRect(); + if( ! (GetStyle() & WB_BORDER) && ImplGetSVData()->maNWFData.mbNoFocusRects ) + { + // no border but focus ring behavior -> we have a problem; the + // native rect relies on the border to draw the focus + // let's do the best we can and center vertically, so it doesn't look + // completely wrong. + Size aSz( GetOutputSizePixel() ); + long nDiff = aContentRect.Top() - (aSz.Height() - aContentRect.GetHeight())/2; + aContentRect.Top() -= nDiff; + aContentRect.Bottom() -= nDiff; + } mpImplWin->SetPosSizePixel( aContentRect.TopLeft(), aContentRect.GetSize() ); } else @@ -707,7 +719,7 @@ void ListBox::Resize() void ListBox::FillLayoutData() const { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); const Control* pMainWin = mpImplLB->GetMainWindow(); if( mpFloatWin ) { @@ -731,7 +743,7 @@ void ListBox::FillLayoutData() const long ListBox::GetIndexForPoint( const Point& rPoint, USHORT& rPos ) const { - if( ! mpLayoutData ) + if( !HasLayoutData() ) FillLayoutData(); // check whether rPoint fits at all @@ -909,6 +921,7 @@ long ListBox::PreNotify( NotifyEvent& rNEvt ) if( mpFloatWin && !mpFloatWin->IsInPopupMode() && aKeyEvt.GetKeyCode().IsMod2() ) { + ImplCallEventListeners( VCLEVENT_DROPDOWN_PRE_OPEN ); mpBtn->SetPressed( TRUE ); mpFloatWin->StartFloat( FALSE ); ImplCallEventListeners( VCLEVENT_DROPDOWN_OPEN ); @@ -959,10 +972,19 @@ long ListBox::PreNotify( NotifyEvent& rNEvt ) (rNEvt.GetCommandEvent()->GetCommand() == COMMAND_WHEEL) && (rNEvt.GetWindow() == mpImplWin) ) { - if( ! GetSettings().GetMouseSettings().GetNoWheelActionWithoutFocus() || HasChildPathFocus() ) + USHORT nWheelBehavior( GetSettings().GetMouseSettings().GetWheelBehavior() ); + if ( ( nWheelBehavior == MOUSE_WHEEL_ALWAYS ) + || ( ( nWheelBehavior == MOUSE_WHEEL_FOCUS_ONLY ) + && HasChildPathFocus() + ) + ) + { nDone = mpImplLB->HandleWheelAsCursorTravel( *rNEvt.GetCommandEvent() ); + } else + { nDone = 0; // don't eat this event, let the default handling happen (i.e. scroll the context) + } } } @@ -1264,6 +1286,26 @@ Size ListBox::CalcMinimumSize() const else { aSz.Height() = mpImplLB->CalcSize( 1 ).Height(); + if( aSz.Height() < mnDDHeight ) + { + aSz.Height() = mnDDHeight; + // FIXME: this is currently only on mac/aqua + if( ImplGetSVData()->maNWFData.mbNoFocusRects && + IsNativeWidgetEnabled() && + const_cast(this)->IsNativeControlSupported( CTRL_LISTBOX, PART_ENTIRE_CONTROL ) ) + { + ImplControlValue aControlValue; + Region aCtrlRegion( Rectangle( (const Point&)Point(), Size( 20, mnDDHeight ) ) ); + Region aBoundingRgn( aCtrlRegion ); + Region aContentRgn( aCtrlRegion ); + // adjust the size of the edit field + if( const_cast(this)->GetNativeControlRegion( CTRL_LISTBOX, PART_ENTIRE_CONTROL, + aCtrlRegion, 0, aControlValue, rtl::OUString(), aBoundingRgn, aContentRgn) ) + { + aSz.Height() = aContentRgn.GetBoundRect().GetHeight(); + } + } + } aSz.Width() = mpImplLB->GetMaxEntryWidth(); aSz.Width() += GetSettings().GetStyleSettings().GetScrollBarSize(); } diff --git a/vcl/source/control/spinfld.cxx b/vcl/source/control/spinfld.cxx index 3f8779dc2e90..1cdaa39298df 100644 --- a/vcl/source/control/spinfld.cxx +++ b/vcl/source/control/spinfld.cxx @@ -36,7 +36,7 @@ #include "vcl/decoview.hxx" #include "vcl/spin.h" #include "vcl/spinfld.hxx" -#include "vcl/controllayout.hxx" +#include "vcl/controldata.hxx" #include "vcl/svdata.hxx" // ======================================================================= @@ -599,7 +599,12 @@ long SpinField::Notify( NotifyEvent& rNEvt ) { if ( ( rNEvt.GetCommandEvent()->GetCommand() == COMMAND_WHEEL ) && !IsReadOnly() ) { - if( ! GetSettings().GetMouseSettings().GetNoWheelActionWithoutFocus() || HasChildPathFocus() ) + USHORT nWheelBehavior( GetSettings().GetMouseSettings().GetWheelBehavior() ); + if ( ( nWheelBehavior == MOUSE_WHEEL_ALWAYS ) + || ( ( nWheelBehavior == MOUSE_WHEEL_FOCUS_ONLY ) + && HasChildPathFocus() + ) + ) { const CommandWheelData* pData = rNEvt.GetCommandEvent()->GetWheelData(); if ( pData->GetMode() == COMMAND_WHEEL_SCROLL ) @@ -632,7 +637,7 @@ void SpinField::FillLayoutData() const { if( mbSpin ) { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); AppendLayoutData( *GetSubEdit() ); GetSubEdit()->SetLayoutDataParent( this ); } diff --git a/vcl/source/control/tabctrl.cxx b/vcl/source/control/tabctrl.cxx index 561d550b1168..9a34629ddf8e 100644 --- a/vcl/source/control/tabctrl.cxx +++ b/vcl/source/control/tabctrl.cxx @@ -45,7 +45,7 @@ #include #include #include -#include +#include #include #include @@ -169,31 +169,25 @@ void TabControl::ImplInit( Window* pParent, WinBits nStyle ) EnableChildTransparentMode( TRUE ); } +// ----------------------------------------------------------------- + +const Font& TabControl::GetCanonicalFont( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetAppFont(); +} + +// ----------------------------------------------------------------- +const Color& TabControl::GetCanonicalTextColor( const StyleSettings& _rStyle ) const +{ + return _rStyle.GetButtonTextColor(); +} + // ----------------------------------------------------------------------- void TabControl::ImplInitSettings( BOOL bFont, BOOL bForeground, BOOL bBackground ) { - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - - if ( bFont ) - { - Font aFont = rStyleSettings.GetAppFont(); - if ( IsControlFont() ) - aFont.Merge( GetControlFont() ); - SetZoomedPointFont( aFont ); - } - - if ( bForeground || bFont ) - { - Color aColor; - if ( IsControlForeground() ) - aColor = GetControlForeground(); - else - aColor = rStyleSettings.GetButtonTextColor(); - SetTextColor( aColor ); - SetTextFillColor(); - } + Control::ImplInitSettings( bFont, bForeground ); if ( bBackground ) { @@ -232,9 +226,9 @@ void TabControl::ImplInitSettings( BOOL bFont, void TabControl::ImplFreeLayoutData() { - if( mpLayoutData ) + if( HasLayoutData() ) { - delete mpLayoutData, mpLayoutData = NULL; + ImplClearLayoutData(); mpTabCtrlData->maLayoutPageIdToLine.clear(); mpTabCtrlData->maLayoutLineToPageId.clear(); } @@ -864,9 +858,9 @@ void TabControl::ImplDrawItem( ImplTabItem* pItem, const Rectangle& rCurRect, bo if( bLayout ) { - if( ! mpLayoutData ) + if( !HasLayoutData() ) { - mpLayoutData = new vcl::ControlLayoutData(); + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); mpTabCtrlData->maLayoutLineToPageId.clear(); mpTabCtrlData->maLayoutPageIdToLine.clear(); mpTabCtrlData->maTabRectangles.clear(); @@ -1010,8 +1004,8 @@ void TabControl::ImplDrawItem( ImplTabItem* pItem, const Rectangle& rCurRect, bo if( bLayout ) { - int nLine = mpLayoutData->m_aLineIndices.size(); - mpLayoutData->m_aLineIndices.push_back( mpLayoutData->m_aDisplayText.Len() ); + int nLine = mpControlData->mpLayoutData->m_aLineIndices.size(); + mpControlData->mpLayoutData->m_aLineIndices.push_back( mpControlData->mpLayoutData->m_aDisplayText.Len() ); mpTabCtrlData->maLayoutPageIdToLine[ (int)pItem->mnId ] = nLine; mpTabCtrlData->maLayoutLineToPageId[ nLine ] = (int)pItem->mnId; mpTabCtrlData->maTabRectangles.push_back( aRect ); @@ -1044,8 +1038,8 @@ void TabControl::ImplDrawItem( ImplTabItem* pItem, const Rectangle& rCurRect, bo DrawCtrlText( Point( nXPos + aImageSize.Width(), nYPos ), pItem->maFormatText, 0, STRING_LEN, nStyle, - bLayout ? &mpLayoutData->m_aUnicodeBoundRects : NULL, - bLayout ? &mpLayoutData->m_aDisplayText : NULL + bLayout ? &mpControlData->mpLayoutData->m_aUnicodeBoundRects : NULL, + bLayout ? &mpControlData->mpLayoutData->m_aDisplayText : NULL ); } @@ -2108,17 +2102,17 @@ Rectangle TabControl::GetCharacterBounds( USHORT nPageId, long nIndex ) const { Rectangle aRet; - if( ! mpLayoutData || ! mpTabCtrlData->maLayoutPageIdToLine.size() ) + if( !HasLayoutData() || ! mpTabCtrlData->maLayoutPageIdToLine.size() ) FillLayoutData(); - if( mpLayoutData ) + if( HasLayoutData() ) { std::hash_map< int, int >::const_iterator it = mpTabCtrlData->maLayoutPageIdToLine.find( (int)nPageId ); if( it != mpTabCtrlData->maLayoutPageIdToLine.end() ) { - Pair aPair = mpLayoutData->GetLineStartEnd( it->second ); + Pair aPair = mpControlData->mpLayoutData->GetLineStartEnd( it->second ); if( (aPair.B() - aPair.A()) >= nIndex ) - aRet = mpLayoutData->GetCharacterBounds( aPair.A() + nIndex ); + aRet = mpControlData->mpLayoutData->GetCharacterBounds( aPair.A() + nIndex ); } } @@ -2131,20 +2125,20 @@ long TabControl::GetIndexForPoint( const Point& rPoint, USHORT& rPageId ) const { long nRet = -1; - if( ! mpLayoutData || ! mpTabCtrlData->maLayoutPageIdToLine.size() ) + if( !HasLayoutData() || ! mpTabCtrlData->maLayoutPageIdToLine.size() ) FillLayoutData(); - if( mpLayoutData ) + if( HasLayoutData() ) { - int nIndex = mpLayoutData->GetIndexForPoint( rPoint ); + int nIndex = mpControlData->mpLayoutData->GetIndexForPoint( rPoint ); if( nIndex != -1 ) { // what line (->pageid) is this index in ? - int nLines = mpLayoutData->GetLineCount(); + int nLines = mpControlData->mpLayoutData->GetLineCount(); int nLine = -1; while( ++nLine < nLines ) { - Pair aPair = mpLayoutData->GetLineStartEnd( nLine ); + Pair aPair = mpControlData->mpLayoutData->GetLineStartEnd( nLine ); if( aPair.A() <= nIndex && aPair.B() >= nIndex ) { nRet = nIndex - aPair.A(); @@ -2173,10 +2167,10 @@ Rectangle TabControl::GetTabPageBounds( USHORT nPage ) const { Rectangle aRet; - if( ! mpLayoutData || ! mpTabCtrlData->maLayoutPageIdToLine.size() ) + if( !HasLayoutData() || ! mpTabCtrlData->maLayoutPageIdToLine.size() ) FillLayoutData(); - if( mpLayoutData ) + if( HasLayoutData() ) { std::hash_map< int, int >::const_iterator it = mpTabCtrlData->maLayoutPageIdToLine.find( (int)nPage ); if( it != mpTabCtrlData->maLayoutPageIdToLine.end() ) diff --git a/vcl/source/fontsubset/cff.cxx b/vcl/source/fontsubset/cff.cxx new file mode 100644 index 000000000000..dd198ff521db --- /dev/null +++ b/vcl/source/fontsubset/cff.cxx @@ -0,0 +1,2496 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#include +#include +#include + +#include + +//#define IGNORE_HINTS + +typedef unsigned char U8; +typedef unsigned short U16; +typedef long long S64; + +typedef sal_Int32 GlyphWidth; + +typedef float RealType; +typedef RealType ValType; +#include +typedef std::vector ValVector; + +// ==================================================================== + +static const char* pStringIds[] = { +/*0*/ ".notdef", "space", "exclam", "quotedbl", + "numbersign", "dollar", "percent", "ampersand", + "quoteright", "parenleft", "parenright", "asterisk", + "plus", "comma", "hyphen", "period", +/*16*/ "slash", "zero", "one", "two", + "three", "four", "five", "six", + "seven", "eight", "nine", "colon", + "semicolon", "less", "equal", "greater", +/*32*/ "question", "at", "A", "B", + "C", "D", "E", "F", + "G", "H", "I", "J", + "K", "L", "M", "N", +/*48*/ "O", "P", "Q", "R", + "S", "T", "U", "V", + "W", "X", "Y", "Z", + "bracketleft", "backslash", "bracketright", "asciicircum", +/*64*/ "underscore", "quoteleft", "a", "b", + "c", "d", "e", "f", + "g", "h", "i", "j", + "k", "l", "m", "n", +/*80*/ "o", "p", "q", "r", + "s", "t", "u", "v", + "w", "x", "y", "z", + "braceleft", "bar", "braceright", "asciitilde", +/*96*/ "exclamdown", "cent", "sterlin", "fraction", + "yen", "florin", "section", "currency", + "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft", + "guilsinglright", "fi", "fl", "endash", +/*112*/ "dagger", "daggerdbl", "periodcentered", "paragraph", + "bullet", "quotesinglbase", "quotedblbase", "quotedblright", + "guillemotright", "ellipsis", "perthousand", "questiondown", + "grave", "acute", "circumflex", "tilde", +/*128*/ "macron", "breve", "dotaccent", "dieresis", + "ring", "cedilla", "hungarumlaut", "ogonek", + "caron", "endash", "AE", "ordfeminine", + "Lslash", "Oslash", "OE", "ordmasculine", +/*144*/ "ae", "dotlessi", "lslash", "oslash", + "oe", "germandbls", "onesuperior", "logicalnot", + "mu", "trademark", "Eth", "onehalf", + "plusminus", "Thorn", "onequarter", "divide", +/*160*/ "brokenbar", "degree", "thorn", "threequarters", + "twosuperior", "registered", "minus", "eth", + "multiply", "threesuperior", "copyright", "Aacute", + "Acircumflex", "Adieresis", "Agrave", "Aring", +/*176*/ "Atilde", "Ccedilla", "Eacute", "Ecircumflex", + "Edieresis", "Egrave", "Iacute", "Icircumflex", + "Idieresis", "Igrave", "Ntilde", "Oacute", + "Ocircumflex", "Odieresis", "Ograve", "Otilde", +/*192*/ "Scaron", "Uacute", "Ucircumflex", "Udieresis", + "Ugrave", "Yacute", "Ydieresis", "Zcaron", + "aacute", "acircumflex", "adieresis", "agrave", + "aring", "atilde", "ccedilla", "eacute", +/*208*/ "ecircumflex", "edieresis", "egrave", "iacute", + "icircumflex", "idieresis", "igrave", "ntilde", + "oacute", "ocircumflex", "odieresis", "ograve", + "otilde", "scaron", "uacute", "ucircumflex", +/*224*/ "udieresis", "ugrave", "yacute", "ydieresis", + "zcaron", "exclamsmall", "Hungarumlautsmall","dollaroldstyle", + "dollarsuperior", "ampersandsmall", "Acutesmall", "parenleftsuperior", + "parenrightsuperior","twodotenleader", "onedotenleader", "zerooldstyle", +/*240*/ "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle", + "fiveoldstyle", "sixoldstyle", "sevenoldstyle", "eightoldstyle", + "nineoldstile", "commasuperior", "threequartersemdash","periodsuperior", + "questionsmall", "asuperior", "bsuperior", "centsuperior", +/*256*/ "dsuperior", "esuperior", "isuperior", "lsuperior", + "msuperior", "nsuperior", "osuperior", "rsuperior", + "ssuperior", "tsuperior", "ff", "ffi", + "ffl", "parenleftinferior","parenrightinferior","Circumflexsmall", +/*272*/ "hyphensuperior","Gravesmall", "Asmall", "Bsmall", + "Csmall", "Dsmall", "Esmall", "Fsmall", + "Gsmall", "Hsmall", "Ismall", "Jsmall", + "Ksmall", "Lsmall", "Msmall", "Nsmall", +/*288*/ "Osmall", "Psmall", "Qsmall", "Rsmall", + "Ssmall", "Tsmall", "Usmall", "Vsmall", + "Wsmall", "Xsmall", "Ysmall", "Zsmall", + "colonmonetary", "onefitted", "rupia", "Tildesmall", +/*304*/ "exclamdownsmall","centoldstyle", "Lslashsmall", "Scaronsmall", + "Zcaronsmall", "Dieresissmall", "Brevesmall", "Caronsmall", + "Dotaccentsmall", "Macronsmall", "figuredash", "hypheninferior", + "Ogoneksmall", "Ringsmall", "Cedillasmall", "questiondownsmall", +/*320*/ "oneeight", "threeeights", "fiveeights", "seveneights", + "onethird", "twothirds", "zerosuperior", "foursuperior", + "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior", + "ninesuperior", "zeroinferior", "oneinferior", "twoinferior", +/*336*/ "threeinferior","fourinferior", "fiveinferior", "sixinferior", + "seveninferior", "eightinferior", "nineinferior", "centinferior", + "dollarinferior", "periodinferior", "commainferior", "Agravesmall", + "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall", +/*352*/ "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", + "Eacutesmall", "Ecircumflexsmall", "Edieresissmall", "Igravesmall", + "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall", + "Ntildesmall", "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", +/*368*/ "Otildesmall", "Odieressissmall", "OEsmall", "Oslashsmall", + "Ugravesmall", "Uacutesmall", "Ucircumflexsmall", "Udieresissmall", + "Yacutesmall", "Thornsmall", "Ydieresissmall", "001.000", + "001.001", "001.002", "001.003", "Black", +/*384*/ "Bold", "Book", "Light", "Medium", + "Regular", "Roman", "Semibold" +}; + +// -------------------------------------------------------------------- + +#if 0 // TODO: use them +static const char* pStdEncNames[] = { + "ISOAdobe", "Expert", "ExpertSubSet" +}; +#endif + +// -------------------------------------------------------------------- + +// TOP DICT keywords (also covers PRIV DICT keywords) +static const char* pDictOps[] = { + "sVersion", "sNotice", "sFullName", "sFamilyName", + "sWeight", "aFontBBox", "dBlueValues", "dOtherBlues", + "dFamilyBlues", "dFamilyOtherBlues", "nStdHW", "nStdVW", + "xESC", "nUniqueID", "aXUID", "nCharset", + "nEncoding", "nCharStrings", "PPrivate", "nSubrs", + "nDefaultWidthX", "nNominalWidthX", NULL, NULL, + NULL, NULL, NULL, NULL, + "shortint", "longint", "BCD", NULL +}; + +// -------------------------------------------------------------------- + +// TOP DICT escapes (also covers PRIV DICT escapes) +static const char* pDictEscs[] = { + "sCopyright", "bIsFixedPitch", "nItalicAngle", "nUnderlinePosition", + "nUnderlineThickness", "nPaintType", "tCharstringType", "aFontMatrix", + "nStrokeWidth", "nBlueScale", "nBlueShift", "nBlueFuzz", + "dStemSnapH", "dStemSnapV", "bForceBold", NULL, + NULL, "nLanguageGroup", "nExpansionFactor", "nInitialRandomSeed", + "nSyntheticBase", "sPostScript", "sBaseFontName", "dBaseFontBlend", + NULL, NULL, NULL, NULL, + NULL, NULL, "rROS", "nCIDFontVersion", + "nCIDFontRevision", "nCIDFontType", "nCIDCount", "nUIDBase", + "nFDArray", "nFDSelect", "sFontName" +}; + +// -------------------------------------------------------------------- + +static const char* pType1Ops[] = { + NULL, "2hstem", NULL, "2vstem", + "1vmoveto", "Arlineto", "1hlineto", "1vlineto", + "Crrcurveto", "0closepath", "Lcallsubr", "0return", + "xT1ESC", "2hsbw", "0endchar", NULL, + NULL, NULL, NULL, NULL, + NULL, "2rmoveto", "1hmoveto", NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, "4vhcurveto", "4hvcurveto" +}; + +// -------------------------------------------------------------------- + +static const char* pT1EscOps[] = { + "0dotsection", "6vstem3", "6hstem3", NULL, + NULL, NULL, "5seac", "4sbw", + NULL, "1abs", "2add", "2sub", + "2div", NULL, NULL, NULL, + "Gcallothersubr", "1pop", NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + NULL, "2setcurrentpoint" +}; + +// -------------------------------------------------------------------- + +struct TYPE1OP +{ + enum OPS + { + HSTEM=1, VSTEM=3, VMOVETO=4, RLINETO=5, + HLINETO=6, VLINETO=7, RCURVETO=8, CLOSEPATH=9, + CALLSUBR=10, RETURN=11, T1ESC=12, HSBW=13, + ENDCHAR=14, RMOVETO=21, HMOVETO=22, VHCURVETO=30, + HVCURVETO=31 + }; + + enum ESCS + { + DOTSECTION=0, VSTEM3=1, HSTEM3=2, SEAC=6, + SBW=7, ABS=9, ADD=10, SUB=11, + DIV=12, CALLOTHERSUBR=16, POP=17, SETCURRENTPOINT=33 + }; +}; + +// -------------------------------------------------------------------- + +static const char* pType2Ops[] = { + NULL, "hhstem", NULL, "vvstem", + "mvmoveto", "Arlineto", "Ehlineto", "Evlineto", + "Crrcurveto", NULL, "Lcallsubr", "Xreturn", + "xT2ESC", NULL, "eendchar", NULL, + NULL, NULL, "Hhstemhm", "Khintmask", + "Kcntrmask", "Mrmoveto", "mhmoveto", "Vvstemhm", + ".rcurveline", ".rlinecurve", ".vvcurveto", ".hhcurveto", + ".shortint", "Gcallgsubr", ".vhcurveto", ".hvcurveto" +}; + +// -------------------------------------------------------------------- + +static const char* pT2EscOps[] = { + NULL, NULL, NULL, "2and", + "2or", "1not", NULL, NULL, + NULL, "1abs", "2add", "2sub", + "2div", NULL, "1neg", "2eq", + NULL, NULL, "1drop", NULL, + "1put", "1get", "4ifelse", "0random", + "2mul", NULL, "1sqrt", "1dup", + "2exch", "Iindex", "Rroll", NULL, + NULL, NULL, "7hflex", "Fflex", + "9hflex1", "fflex1" +}; + +// -------------------------------------------------------------------- + +struct TYPE2OP +{ + enum OPS + { + HSTEM=1, VSTEM=3, VMOVETO=4, RLINETO=5, + HLINETO=6, VLINETO=7, RCURVETO=8, CALLSUBR=10, + RETURN=11, T2ESC=12, ENDCHAR=14, HSTEMHM=18, + HINTMASK=19, CNTRMASK=20, RMOVETO=21, HMOVETO=22, + VSTEMHM=23, RCURVELINE=24, RLINECURVE=25, VVCURVETO=26, + HHCURVETO=27, SHORTINT=28, CALLGSUBR=29, VHCURVETO=30, + HVCURVETO=31 + }; + + enum ESCS + { + AND=3, OR=4, NOT=5, ABS=9, + ADD=10, SUB=11, DIV=12, NEG=14, + EQ=15, DROP=18, PUT=20, GET=21, + IFELSE=22, RANDOM=23, MUL=24, SQRT=26, + DUP=27, EXCH=28, INDEX=29, ROLL=30, + HFLEX=34, FLEX=35, HFLEX1=36, FLEX1=37 + }; +}; + +// ==================================================================== + +struct CffGlobal +{ + explicit CffGlobal(); + + int mnNameIdxBase; + int mnNameIdxCount; + int mnStringIdxBase; + int mnStringIdxCount; + bool mbCIDFont; + int mnCharStrBase; + int mnCharStrCount; + int mnEncodingBase; + int mnCharsetBase; + int mnGlobalSubrBase; + int mnGlobalSubrCount; + int mnGlobalSubrBias; + int mnFDSelectBase; + int mnFontDictBase; + int mnFDAryCount; + + ValVector maFontBBox; + ValVector maFontMatrix; + + int mnFontNameSID; + int mnFullNameSID; + int mnFamilyNameSID; +}; + +// ==================================================================== + +struct CffLocal +{ + explicit CffLocal(); + + int mnPrivDictBase; + int mnPrivDictSize; + int mnLocalSubrOffs; + int mnLocalSubrBase; + int mnLocalSubrCount; + int mnLocalSubrBias; + + ValType maNominalWidth; + ValType maDefaultWidth; + + // ATM hinting related values + ValType maStemStdHW; + ValType maStemStdVW; + ValVector maStemSnapH; + ValVector maStemSnapV; + ValVector maBlueValues; + ValVector maOtherBlues; + ValVector maFamilyBlues; + ValVector maFamilyOtherBlues; + RealType mfBlueScale; + RealType mfBlueShift; + RealType mfBlueFuzz; + RealType mfExpFactor; + int mnLangGroup; + bool mbForceBold; +}; + +// ==================================================================== + +class SubsetterContext +{ +public: + virtual ~SubsetterContext( void); + virtual bool emitAsType1( class Type1Emitter&, + const long* pGlyphIDs, const U8* pEncoding, + GlyphWidth* pGlyphWidths, int nGlyphCount, FontSubsetInfo& ) = 0; +}; + +// -------------------------------------------------------------------- + +SubsetterContext::~SubsetterContext( void) +{} + +// ==================================================================== + +class CffSubsetterContext +: public SubsetterContext +, private CffGlobal +{ +public: + static const int NMAXSTACK = 48; // see CFF.appendixB + static const int NMAXHINTS = 2*96; // see CFF.appendixB + static const int NMAXTRANS = 32; // see CFF.appendixB +public: + explicit CffSubsetterContext( const U8* pBasePtr, int nBaseLen); + virtual ~CffSubsetterContext( void); + + void initialCffRead( void); + bool emitAsType1( class Type1Emitter&, + const long* pGlyphIDs, const U8* pEncoding, + GlyphWidth* pGlyphWidths, int nGlyphCount, FontSubsetInfo& ); + + // used by charstring converter + void setCharStringType( int); + void fakeLocalSubrCount( int nLocalSubrs ) { maCffLocal[0].mnLocalSubrCount=nLocalSubrs;} + void readCharString( const U8* pTypeOps, int nTypeLen); +protected: + int convert2Type1Ops( CffLocal*, const U8* pType2Ops, int nType2Len, U8* pType1Ops); +private: + void readTypeOp( CffSubsetterContext&); + void convertOneTypeOp( void); + void convertOneTypeEsc( void); + void callType2Subr( bool bGlobal, int nSubrNumber); + long getReadOfs( void) const { return (long)(mpReadPtr - mpBasePtr);} + + const U8* mpBasePtr; + const U8* mpBaseEnd; + + const U8* mpReadPtr; + const U8* mpReadEnd; + + U8* mpWritePtr; + bool mbSawError; + bool mbNeedClose; + bool mbIgnoreHints; + long mnCntrMask; + +private: + int seekIndexData( int nIndexBase, int nDataIndex); + void seekIndexEnd( int nIndexBase); + +private: + const char** mpCharStringOps; + const char** mpCharStringEscs; + + CffLocal maCffLocal[16]; + CffLocal* mpCffLocal; + + void readDictOp( void); + RealType readRealVal( void); + const char* getString( int nStringID); + int getFDSelect( int nGlyphIndex) const; + int getGlyphSID( int nGlyphIndex) const; + const char* getGlyphName( int nGlyphIndex); + + void readTypeOp( void); + void read2push( void); + void pop2write( void); + void writeType1Val( ValType); + void writeTypeOp( int nTypeOp); + void writeTypeEsc( int nTypeOp); + void writeCurveTo( int nStackPos, int nIX1, int nIY1, int nIX2, int nIY2, int nIX3, int nIY3); + void pop2MultiWrite( int nArgsPerTypo, int nTypeOp, int nTypeXor=0); + void popAll2Write( int nTypeOp); + +public: // TODO: is public really needed? + // accessing the value stack + // TODO: add more checks + void push( ValType nVal) { mnValStack[ mnStackIdx++] = nVal;} + ValType popVal( void) { return ((mnStackIdx>0) ? mnValStack[ --mnStackIdx] : 0);} + ValType peekVal( void) const { return ((mnStackIdx>0) ? mnValStack[ mnStackIdx-1] : 0);} + ValType getVal( int nIndex) const { return mnValStack[ nIndex];} + int popInt( void); + int peekInt( void) const; + int getInt( int nIndex) const; + int size( void) const { return mnStackIdx;} + bool empty( void) const { return !mnStackIdx;} + void clear( void) { mnStackIdx = 0;} + + // accessing the charstring hints + void addHints( bool bVerticalHints); + int getHorzHintCount( void) const { return (mnHorzHintSize/2);} + int getVertHintCount( void) const { return (mnHintSize-mnHorzHintSize)/2;} + void getHintPair( int nIndex, ValType* nMin, ValType* nEnd) const; + + // accessing other charstring specifics + bool hasCharWidth( void) const { return (maCharWidth > 0);} + ValType getCharWidth( void) const { return maCharWidth;} + void setNominalWidth( ValType aWidth) { mpCffLocal->maNominalWidth = aWidth;} + void setDefaultWidth( ValType aWidth) { mpCffLocal->maDefaultWidth = aWidth;} + void updateWidth( bool bUseFirstVal); + +private: + // typeop exceution context + int mnStackIdx; + ValType mnValStack[ NMAXSTACK]; + ValType mnTransVals[ NMAXTRANS]; + + int mnHintSize; + int mnHorzHintSize; + ValType mnHintStack[ NMAXHINTS]; + + ValType maCharWidth; +}; + +// -------------------------------------------------------------------- + +CffSubsetterContext::CffSubsetterContext( const U8* pBasePtr, int nBaseLen) +: mpBasePtr( pBasePtr) +, mpBaseEnd( pBasePtr+nBaseLen) +, mnStackIdx(0) +, mnHintSize(0) +, mnHorzHintSize(0) +, maCharWidth(-1) +{ +// setCharStringType( 1); + // TODO: new CffLocal[ mnFDAryCount]; + mpCffLocal = &maCffLocal[0]; +} + +// -------------------------------------------------------------------- + +CffSubsetterContext::~CffSubsetterContext( void) +{ + // TODO: delete[] maCffLocal; +} + +// -------------------------------------------------------------------- + +inline int CffSubsetterContext::popInt( void) +{ + const ValType aVal = popVal(); + const int nInt = static_cast(aVal); + assert( nInt == aVal); + return nInt; +} + +// -------------------------------------------------------------------- + +inline int CffSubsetterContext::peekInt( void) const +{ + const ValType aVal = peekVal(); + const int nInt = static_cast(aVal); + assert( nInt == aVal); + return nInt; +} + +// -------------------------------------------------------------------- + +inline int CffSubsetterContext::getInt( int nIndex) const +{ + const ValType aVal = getVal( nIndex); + const int nInt = static_cast(aVal); + assert( nInt == aVal); + return nInt; +} + +// -------------------------------------------------------------------- + +inline void CffSubsetterContext::updateWidth( bool bUseFirstVal) +{ +#if 1 // TODO: is this still needed? + // the first value is not a hint but the charwidth + if( hasCharWidth()) + return; +#endif + if( bUseFirstVal) { + maCharWidth = mpCffLocal->maNominalWidth + mnValStack[0]; + // remove bottom stack entry + --mnStackIdx; + for( int i = 0; i < mnStackIdx; ++i) + mnValStack[ i] = mnValStack[ i+1]; + } else { + maCharWidth = mpCffLocal->maDefaultWidth; + } +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::addHints( bool bVerticalHints) +{ + // the first charstring value may a charwidth instead of a charwidth + updateWidth( (mnStackIdx & 1) != 0); + // return early (e.g. no implicit hints for hintmask) + if( !mnStackIdx) + return; + + // copy the remaining values to the hint arrays + // assert( (mnStackIdx & 1) == 0); // depends on called subrs + if( mnStackIdx & 1) --mnStackIdx;//####### + // TODO: if( !bSubr) assert( mnStackIdx >= 2); + + assert( (mnHintSize + mnStackIdx) <= 2*NMAXHINTS); + +#ifdef IGNORE_HINTS + mnHintSize += mnStackIdx; +#else + ValType nHintOfs = 0; + for( int i = 0; i < mnStackIdx; ++i) { + nHintOfs += mnValStack[ i ]; + mnHintStack[ mnHintSize++] = nHintOfs; + } +#endif // IGNORE_HINTS + if( !bVerticalHints) + mnHorzHintSize = mnHintSize; + + // clear all values from the stack + mnStackIdx = 0; +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::getHintPair( int nIndex, ValType* pMin, ValType* pEnd) const +{ + nIndex *= 2; + assert( nIndex < mnHintSize); + assert( nIndex >= 0); + const ValType* pHint = &mnHintStack[ nIndex ]; + *pMin = pHint[0]; + *pEnd = pHint[1]; +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::setCharStringType( int nVal) +{ + switch( nVal) { + case 1: mpCharStringOps=pType1Ops; mpCharStringEscs=pT1EscOps; break; + case 2: mpCharStringOps=pType2Ops; mpCharStringEscs=pT2EscOps; break; + default: fprintf( stderr, "Unknown CharstringType=%d\n",nVal); break; + } +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::readCharString( const U8* pTypeOps, int nTypeLen) +{ + mnStackIdx = 0; + mnHintSize = 0; + mnHorzHintSize = 0; + maCharWidth = -1; + + assert( nTypeLen >= 0); +// assert( nEnd <= getLength()); + mpReadPtr = pTypeOps; + mpReadEnd = mpReadPtr + nTypeLen; + // reset the execution context + while( mpReadPtr < mpReadEnd) + readTypeOp(); +//### assert( tellRel() == nEnd); +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::readDictOp( void) +{ + ValType nVal = 0; + int nInt = 0; + const U8 c = *mpReadPtr; + if( c <= 21 ) { + int nOpId = *(mpReadPtr++); + const char* pCmdName; + if( nOpId != 12) + pCmdName = pDictOps[ nOpId]; + else { + const U8 nExtId = *(mpReadPtr++); + pCmdName = pDictEscs[ nExtId]; + nOpId = 900 + nExtId; + } + + //TODO: if( nStackIdx > 0) + switch( *pCmdName) { + default: fprintf( stderr, "unsupported DictOp.type=\'%c\'\n", *pCmdName); break; + case 'b': // bool + nInt = popInt(); + switch( nOpId) { + case 915: mpCffLocal->mbForceBold = nInt; break; // "ForceBold" + default: break; // TODO: handle more boolean dictops? + } + break; + case 'n': // dict-op number + nVal = popVal(); + nInt = static_cast(nVal); + switch( nOpId) { + case 10: mpCffLocal->maStemStdHW = nVal; break; // "StdHW" + case 11: mpCffLocal->maStemStdVW = nVal; break; // "StdVW" + case 15: mnCharsetBase = nInt; break; // "charset" + case 16: mnEncodingBase = nInt; break; // "nEncoding" + case 17: mnCharStrBase = nInt; break; // "nCharStrings" + case 19: mpCffLocal->mnLocalSubrOffs = nInt; break;// "nSubrs" + case 20: setDefaultWidth( nVal ); break; // "defaultWidthX" + case 21: setNominalWidth( nVal ); break; // "nominalWidthX" + case 909: mpCffLocal->mfBlueScale = nVal; break; // "BlueScale" + case 910: mpCffLocal->mfBlueShift = nVal; break; // "BlueShift" + case 911: mpCffLocal->mfBlueFuzz = nVal; break; // "BlueFuzz" + case 912: mpCffLocal->mfExpFactor = nVal; break; // "ExpansionFactor" + case 917: mpCffLocal->mnLangGroup = nInt; break; // "LanguageGroup" + case 936: mnFontDictBase = nInt; break; // "nFDArray" + case 937: mnFDSelectBase = nInt; break; // "nFDSelect" + default: break; // TODO: handle more numeric dictops? + } + break; + case 'a': { // array + switch( nOpId) { + case 5: maFontBBox.clear(); break; // "FontBBox" + case 907: maFontMatrix.clear(); break; // "FontMatrix" + default: break; // TODO: reset other arrays? + } + for( int i = 0; i < size(); ++i ) { + nVal = getVal(i); + switch( nOpId) { + case 5: maFontBBox.push_back( nVal); break; // "FontBBox" + case 907: maFontMatrix.push_back( nVal); break; // "FontMatrix" + default: break; // TODO: handle more array dictops? + } + } + clear(); + } break; + case 'd': { // delta array + nVal = 0; + for( int i = 0; i < size(); ++i ) { + nVal += getVal(i); + switch( nOpId) { + case 6: mpCffLocal->maBlueValues.push_back( nVal); break; // "BlueValues" + case 7: mpCffLocal->maOtherBlues.push_back( nVal); break; // "OtherBlues" + case 8: mpCffLocal->maFamilyBlues.push_back( nVal); break; // "FamilyBlues" + case 9: mpCffLocal->maFamilyOtherBlues.push_back( nVal); break;// "FamilyOtherBlues" + case 912: mpCffLocal->maStemSnapH.push_back( nVal); break; // "StemSnapH" + case 913: mpCffLocal->maStemSnapV.push_back( nVal); break; // "StemSnapV" + default: break; // TODO: handle more delta-array dictops? + } + } + clear(); + } break; + case 's': // stringid (SID) + nInt = popInt(); + switch( nOpId ) { + case 2: mnFullNameSID = nInt; break; // "FullName" + case 3: mnFamilyNameSID = nInt; break; // "FamilyName" + case 938: mnFontNameSID = nInt; break; // "FontName" + default: break; // TODO: handle more string dictops? + } + break; + case 'P': // private dict + mpCffLocal->mnPrivDictBase = popInt(); + mpCffLocal->mnPrivDictSize = popInt(); + break; + case 'r': { // ROS operands + int nSid1 = popInt(); + int nSid2 = popInt(); + (void)nSid1; // TODO: use + (void)nSid2; // TODO: use + nVal = popVal(); + mbCIDFont = true; + } break; + case 't': // CharstringType + nInt = popInt(); + setCharStringType( nInt ); + break; + } + + return; + } + + if( (c >= 32) || (c == 28) ) { +// --mpReadPtr; + read2push(); + } else if( c == 29 ) { // longint + ++mpReadPtr; // skip 29 + int nS32 = mpReadPtr[0] << 24; + nS32 += mpReadPtr[1] << 16; + nS32 += mpReadPtr[2] << 8; + nS32 += mpReadPtr[3] << 0; + if( (sizeof(nS32) != 4) && (nS32 & (1<<31))) + nS32 |= (~0U) << 31; // assuming 2s complement + mpReadPtr += 4; + nVal = static_cast(nS32); + push( nVal ); + } else if( c == 30) { // real number + ++mpReadPtr; // skip 30 + const RealType fReal = readRealVal(); + // push value onto stack + nVal = fReal; + push( nVal); + } +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::readTypeOp( void) +{ + int nVal = 0; + const U8 c = *mpReadPtr; + if( (c <= 31) && (c != 28) ) { + const int nOpId = *(mpReadPtr++); + const char* pCmdName; + if( nOpId != 12) + pCmdName = mpCharStringOps[ nOpId]; + else { + const int nExtId = *(mpReadPtr++); + pCmdName = mpCharStringEscs[ nExtId]; + } + + if( !pCmdName ) + pCmdName = ".NULL"; + // handle typeop parameters + int nMinStack = -1, nMaxStack = -1; + switch( *pCmdName) { + default: fprintf( stderr, "unsupported TypeOp.type=\'%c\'\n", *pCmdName); break; + case '.': nMinStack = 0; nMaxStack = 999; break; + case '0': nMinStack = nMaxStack = 0; break; + case '1': nMinStack = nMaxStack = 1; break; + case '2': nMinStack = nMaxStack = 2; break; + case '4': nMinStack = nMaxStack = 4; break; + case '5': nMinStack = nMaxStack = 5; break; // not used for Type2 ops + case '6': nMinStack = nMaxStack = 6; break; + case '7': nMinStack = nMaxStack = 7; break; + case '9': nMinStack = nMaxStack = 9; break; + case 'f': nMinStack = nMaxStack = 11; break; + case 'F': nMinStack = nMaxStack = 13; break; + case 'A': nMinStack = 2; nMaxStack = 999; break; + case 'C': nMinStack = 6; nMaxStack = 999; break; + case 'E': nMinStack = 1; nMaxStack = 999; break; + case 'G': nMinStack = 1; nMaxStack = 999; // global subr + nVal = peekInt(); + // TODO global subr + break; + case 'L': // local subr + nMinStack = 1; nMaxStack = 999; + nVal = peekInt(); + // TODO local subr + break; + case 'I': // operands for "index" +#if 0 + nMinStack = nValStack[ nStackIdx-1]; + if( nMinStack < 0) nMinStack = 0; + nMinStack += 1; +#else + fprintf( stderr, "TODO: Iindex op\n"); +#endif + break; + case 'R': // operands for "rol" +#if 0 + nMinStack = nValStack[ nStackIdx-2]; +#else + fprintf( stderr, "TODO: Rrol op\n"); +#endif + case 'X': // operands for "return" + nMinStack = 0; + nMaxStack = /*### (!bInSubrs)? 0 :###*/999; + break; + case 'H': // "hstemhm" + case 'h': // "hstem" + addHints( false); + nMinStack = nMaxStack = 0; + break; + case 'V': // "vstemhm" + case 'v': // "vstem" + addHints( true); + nMinStack = nMaxStack = 0; + break; + case 'K': // "hintmask" or "cntrmask" + addHints( true); // implicit vstemhm + nMinStack = nMaxStack = 0; + break; + case 'e': // endchar + updateWidth( (size() >= 1) && (size() != 4)); + nMinStack = nMaxStack = 0; + if( size() == 4) + fprintf( stderr,"Deprecated SEAC-like endchar is not supported for CFF subsetting!\n"); // TODO: handle deprecated op + break; + case 'm': // hmoveto or vmoveto + updateWidth( size() > 1); + nMinStack = 1; + nMaxStack = nMinStack; + break; + case 'M': // rmoveto + updateWidth( size() > 2); + nMinStack = 2; + nMaxStack = nMinStack; + break; + } + + clear(); + return; + } + + if( (c >= 32) || (c == 28)) { +// --mpReadPtr; + read2push(); + } +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::read2push() +{ + ValType aVal = 0; + + const U8*& p = mpReadPtr; + const U8 c = *p; + if( c == 28 ) { + short nS16 = (p[1] << 8) + p[2]; + if( (sizeof(nS16) != 2) && (nS16 & (1<<15))) + nS16 |= (~0U) << 15; // assuming 2s complement + aVal = nS16; + p += 3; + } else if( c <= 246 ) { // -107..+107 + aVal = static_cast(p[0] - 139); + p += 1; + } else if( c <= 250 ) { // +108..+1131 + aVal = static_cast(((p[0] << 8) + p[1]) - 63124); + p += 2; + } else if( c <= 254 ) { // -108..-1131 + aVal = static_cast(64148 - ((p[0] << 8) + p[1])); + p += 2; + } else /*if( c == 255)*/ { // Fixed16.16 + int nS32 = (p[1] << 24) + (p[2] << 16) + (p[3] << 8) + p[4]; + if( (sizeof(nS32) != 2) && (nS32 & (1<<31))) + nS32 |= (~0U) << 31; // assuming 2s complement + aVal = static_cast(nS32 * (1.0 / 0x10000)); + p += 5; + } + + push( aVal); +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::writeType1Val( ValType aVal) +{ + U8* pOut = mpWritePtr; + + int nInt = static_cast(aVal); + static const int nOutCharstrType = 1; + if( (nInt != aVal) && (nOutCharstrType == 2)) { + // numtype==255 means int32 for Type1, but 16.16 for Type2 charstrings!!! + *(pOut++) = 255; // Fixed 16.16 + *(pOut++) = static_cast(nInt >> 8); + *(pOut++) = static_cast(nInt); + nInt = static_cast(aVal * 0x10000) & 0xFFFF; + *(pOut++) = static_cast(nInt >> 8); + *(pOut++) = static_cast(nInt); + } else if( (nInt >= -107) && (nInt <= +107)) { + *(pOut++) = static_cast(nInt + 139); // -107..+107 + } else if( (nInt >= -1131) && (nInt <= +1131)) { + if( nInt >= 0) + nInt += 63124; // +108..+1131 + else + nInt = 64148 - nInt; // -108..-1131 + *(pOut++) = static_cast(nInt >> 8); + *(pOut++) = static_cast(nInt); + } else if( nOutCharstrType == 1) { + // numtype==255 means int32 for Type1, but 16.16 for Type2 charstrings!!! + *(pOut++) = 255; + *(pOut++) = static_cast(nInt >> 24); + *(pOut++) = static_cast(nInt >> 16); + *(pOut++) = static_cast(nInt >> 8); + *(pOut++) = static_cast(nInt); + } + + mpWritePtr = pOut; +} + +// -------------------------------------------------------------------- + +inline void CffSubsetterContext::pop2write( void) +{ + const ValType aVal = popVal(); + writeType1Val( aVal); +} + +// -------------------------------------------------------------------- + +inline void CffSubsetterContext::writeTypeOp( int nTypeOp) +{ + *(mpWritePtr++) = static_cast(nTypeOp); +} + +// -------------------------------------------------------------------- + +inline void CffSubsetterContext::writeTypeEsc( int nTypeEsc) +{ + *(mpWritePtr++) = TYPE1OP::T1ESC; + *(mpWritePtr++) = static_cast(nTypeEsc); +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::pop2MultiWrite( int nArgsPerTypo, int nTypeOp, int nTypeXor) +{ + for( int i = 0; i < mnStackIdx;) { + for( int j = 0; j < nArgsPerTypo; ++j) { + const ValType aVal = mnValStack[i+j]; + writeType1Val( aVal); + } + i += nArgsPerTypo; + writeTypeOp( nTypeOp); + nTypeOp ^= nTypeXor; // for toggling vlineto/hlineto + } + clear(); +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::popAll2Write( int nTypeOp) +{ + // pop in reverse order, then write + for( int i = 0; i < mnStackIdx; ++i) { + const ValType aVal = mnValStack[i]; + writeType1Val( aVal); + } + clear(); + writeTypeOp( nTypeOp); +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::writeCurveTo( int nStackPos, + int nIX1, int nIY1, int nIX2, int nIY2, int nIX3, int nIY3) +{ + // get the values from the stack + const ValType nDX1 = nIX1 ? mnValStack[ nStackPos+nIX1 ] : 0; + const ValType nDY1 = nIY1 ? mnValStack[ nStackPos+nIY1 ] : 0; + const ValType nDX2 = nIX2 ? mnValStack[ nStackPos+nIX2 ] : 0; + const ValType nDY2 = nIY2 ? mnValStack[ nStackPos+nIY2 ] : 0; + const ValType nDX3 = nIX3 ? mnValStack[ nStackPos+nIX3 ] : 0; + const ValType nDY3 = nIY3 ? mnValStack[ nStackPos+nIY3 ] : 0; + + // emit the curveto operator and operands + // TODO: determine the most efficient curveto operator + // TODO: depending on type1op or type2op target + writeType1Val( nDX1 ); + writeType1Val( nDY1 ); + writeType1Val( nDX2 ); + writeType1Val( nDY2 ); + writeType1Val( nDX3 ); + writeType1Val( nDY3 ); + writeTypeOp( TYPE1OP::RCURVETO ); +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::convertOneTypeOp( void) +{ + const int nType2Op = *(mpReadPtr++); + + int i, nInt; // prevent WAE for declarations inside switch cases + // convert each T2op + switch( nType2Op) { + case TYPE2OP::T2ESC: + convertOneTypeEsc(); + break; + case TYPE2OP::HSTEM: + case TYPE2OP::VSTEM: + addHints( nType2Op == TYPE2OP::VSTEM ); +#ifndef IGNORE_HINTS + for( i = 0; i < mnHintSize; i+=2 ) { + writeType1Val( mnHintStack[i]); + writeType1Val( mnHintStack[i+1] - mnHintStack[i]); + writeTypeOp( nType2Op ); + } +#endif // IGNORE_HINTS + break; + case TYPE2OP::HSTEMHM: + case TYPE2OP::VSTEMHM: + addHints( nType2Op == TYPE2OP::VSTEMHM); + break; + case TYPE2OP::CNTRMASK: + // TODO: replace cntrmask with vstem3/hstem3 + addHints( true); +#ifdef IGNORE_HINTS + mpReadPtr += (mnHintSize + 15) / 16; + mbIgnoreHints = true; +#else + { + U8 nMaskBit = 0; + U8 nMaskByte = 0; + for( i = 0; i < mnHintSize; i+=2, nMaskBit>>=1) { + if( !nMaskBit) { + nMaskByte = *(mpReadPtr++); + nMaskBit = 0x80; + } + if( !(nMaskByte & nMaskBit)) + continue; + if( i >= 8*(int)sizeof(mnCntrMask)) + mbIgnoreHints = true; + if( mbIgnoreHints) + continue; + mnCntrMask |= (1U << i); + } + } +#endif + break; + case TYPE2OP::HINTMASK: + addHints( true); +#ifdef IGNORE_HINTS + mpReadPtr += (mnHintSize + 15) / 16; +#else + { + long nHintMask = 0; + int nCntrBits[2] = {0,0}; + U8 nMaskBit = 0; + U8 nMaskByte = 0; + for( i = 0; i < mnHintSize; i+=2, nMaskBit>>=1) { + if( !nMaskBit) { + nMaskByte = *(mpReadPtr++); + nMaskBit = 0x80; + } + if( !(nMaskByte & nMaskBit)) + continue; + if( i >= 8*(int)sizeof(nHintMask)) + mbIgnoreHints = true; + if( mbIgnoreHints) + continue; + nHintMask |= (1U << i); + nCntrBits[ i < mnHorzHintSize] += (mnCntrMask >> i) & 1; + } + + mbIgnoreHints |= (nCntrBits[0] && (nCntrBits[0] != 3)); + mbIgnoreHints |= (nCntrBits[1] && (nCntrBits[1] != 3)); + if( mbIgnoreHints) + break; + + for( i = 0; i < mnHintSize; i+=2) { + if( !(nHintMask & (1U << i))) + continue; + writeType1Val( mnHintStack[i]); + writeType1Val( mnHintStack[i+1] - mnHintStack[i]); + const bool bHorz = (i < mnHorzHintSize); + if( !nCntrBits[ bHorz]) + writeTypeOp( bHorz ? TYPE1OP::HSTEM : TYPE1OP::VSTEM); + else if( !--nCntrBits[ bHorz]) + writeTypeEsc( bHorz ? TYPE1OP::HSTEM3 : TYPE1OP::VSTEM3); + } + } +#endif + break; + case TYPE2OP::CALLSUBR: + case TYPE2OP::CALLGSUBR: + { + nInt = popInt(); + const bool bGlobal = (nType2Op == TYPE2OP::CALLGSUBR); + callType2Subr( bGlobal, nInt); + } + break; + case TYPE2OP::RETURN: + // TODO: check that we are in a subroutine + return; + case TYPE2OP::VMOVETO: + case TYPE2OP::HMOVETO: + if( mbNeedClose) + writeTypeOp( TYPE1OP::CLOSEPATH); + else + updateWidth( size() > 1); + mbNeedClose = true; + pop2MultiWrite( 1, nType2Op); + break; + case TYPE2OP::VLINETO: + case TYPE2OP::HLINETO: + pop2MultiWrite( 1, nType2Op, + TYPE1OP::VLINETO ^ TYPE1OP::HLINETO); + break; + case TYPE2OP::RMOVETO: + // TODO: convert rmoveto to vlineto/hlineto if possible + if( mbNeedClose) + writeTypeOp( TYPE1OP::CLOSEPATH); + else + updateWidth( size() > 2); + mbNeedClose = true; + pop2MultiWrite( 2, nType2Op); + break; + case TYPE2OP::RLINETO: + // TODO: convert rlineto to vlineto/hlineto if possible + pop2MultiWrite( 2, nType2Op); + break; + case TYPE2OP::RCURVETO: + // TODO: convert rcurveto to vh/hv/hh/vv-curveto if possible + pop2MultiWrite( 6, nType2Op); + break; + case TYPE2OP::RCURVELINE: + i = 0; + while( (i += 6) <= mnStackIdx) + writeCurveTo( i, -6, -5, -4, -3, -2, -1 ); + i -= 6; + while( (i += 2) <= mnStackIdx) { + writeType1Val( mnValStack[i-2]); + writeType1Val( mnValStack[i-1]); + writeTypeOp( TYPE2OP::RLINETO); + } + clear(); + break; + case TYPE2OP::RLINECURVE: + i = 0; + while( (i += 2) <= mnStackIdx-6) { + writeType1Val( mnValStack[i-2]); + writeType1Val( mnValStack[i-1]); + writeTypeOp( TYPE2OP::RLINETO); + } + i -= 2; + while( (i += 6) <= mnStackIdx) + writeCurveTo( i, -6, -5, -4, -3, -2, -1 ); + clear(); + break; + case TYPE2OP::VHCURVETO: + case TYPE2OP::HVCURVETO: + { + bool bVert = (nType2Op == TYPE2OP::VHCURVETO); + i = 0; + nInt = 0; + if( mnStackIdx & 1 ) + nInt = static_cast(mnValStack[ --mnStackIdx ]); + while( (i += 4) <= mnStackIdx) { + // TODO: use writeCurveTo() + if( bVert ) writeType1Val( 0 ); + writeType1Val( mnValStack[i-4] ); + if( !bVert ) writeType1Val( 0); + writeType1Val( mnValStack[i-3] ); + writeType1Val( mnValStack[i-2] ); + if( !bVert ) writeType1Val( static_cast((i==mnStackIdx) ? nInt : 0) ); + writeType1Val( mnValStack[i-1] ); + if( bVert ) writeType1Val( static_cast((i==mnStackIdx) ? nInt : 0) ); + bVert = !bVert; + writeTypeOp( TYPE2OP::RCURVETO); + } + } + clear(); + break; + case TYPE2OP::HHCURVETO: + i = (mnStackIdx & 1); + while( (i += 4) <= mnStackIdx) { + if( i != 5) + writeCurveTo( i, -4, 0, -3, -2, -1, 0); + else + writeCurveTo( i, -4, -5, -3, -2, -1, 0); + } + clear(); + break; + case TYPE2OP::VVCURVETO: + i = (mnStackIdx & 1); + while( (i += 4) <= mnStackIdx) { + if( i != 5) + writeCurveTo( i, 0, -4, -3, -2, 0, -1); + else + writeCurveTo( i, -5, -4, -3, -2, 0, -1); + } + clear(); + break; + case TYPE2OP::ENDCHAR: + if( mbNeedClose) + writeTypeOp( TYPE1OP::CLOSEPATH); + else + updateWidth( size() >= 1); + // mbNeedClose = true; + writeTypeOp( TYPE1OP::ENDCHAR); + break; + default: + if( ((nType2Op >= 32) && (nType2Op <= 255)) || (nType2Op == 28)) { + --mpReadPtr; + read2push(); + } else { + popAll2Write( nType2Op); + assert( false); // TODO? + } + break; + } +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::convertOneTypeEsc( void) +{ + const int nType2Esc = *(mpReadPtr++); + ValType* pTop = &mnValStack[ mnStackIdx-1]; + // convert each T2op + switch( nType2Esc) { + case TYPE2OP::AND: + assert( mnStackIdx >= 2 ); + pTop[0] = static_cast(static_cast(pTop[0]) & static_cast(pTop[-1])); + --mnStackIdx; + break; + case TYPE2OP::OR: + assert( mnStackIdx >= 2 ); + pTop[0] = static_cast(static_cast(pTop[0]) | static_cast(pTop[-1])); + --mnStackIdx; + break; + case TYPE2OP::NOT: + assert( mnStackIdx >= 1 ); + pTop[0] = (pTop[0] == 0); + break; + case TYPE2OP::ABS: + assert( mnStackIdx >= 1 ); + if( pTop[0] >= 0) + break; + // fall through + case TYPE2OP::NEG: + assert( mnStackIdx >= 1 ); + pTop[0] = -pTop[0]; + break; + case TYPE2OP::ADD: + assert( mnStackIdx >= 2 ); + pTop[0] += pTop[-1]; + --mnStackIdx; + break; + case TYPE2OP::SUB: + assert( mnStackIdx >= 2 ); + pTop[0] -= pTop[-1]; + --mnStackIdx; + break; + case TYPE2OP::MUL: + assert( mnStackIdx >= 2 ); + if( pTop[-1]) + pTop[0] *= pTop[-1]; + --mnStackIdx; + break; + case TYPE2OP::DIV: + assert( mnStackIdx >= 2 ); + if( pTop[-1]) + pTop[0] /= pTop[-1]; + --mnStackIdx; + break; + case TYPE2OP::EQ: + assert( mnStackIdx >= 2 ); + pTop[0] = (pTop[0] == pTop[-1]); + --mnStackIdx; + break; + case TYPE2OP::DROP: + assert( mnStackIdx >= 1 ); + --mnStackIdx; + break; + case TYPE2OP::PUT: { + assert( mnStackIdx >= 2 ); + const int nIdx = static_cast(pTop[0]); + assert( nIdx >= 0 ); + assert( nIdx < NMAXTRANS ); + mnTransVals[ nIdx] = pTop[-1]; + mnStackIdx -= 2; + break; + } + case TYPE2OP::GET: { + assert( mnStackIdx >= 1 ); + const int nIdx = static_cast(pTop[0]); + assert( nIdx >= 0 ); + assert( nIdx < NMAXTRANS ); + pTop[0] = mnTransVals[ nIdx ]; + break; + } + case TYPE2OP::IFELSE: { + assert( mnStackIdx >= 4 ); + if( pTop[-1] > pTop[0] ) + pTop[-3] = pTop[-2]; + mnStackIdx -= 3; + break; + } + case TYPE2OP::RANDOM: + pTop[+1] = 1234; // TODO + ++mnStackIdx; + break; + case TYPE2OP::SQRT: + // TODO: implement + break; + case TYPE2OP::DUP: + assert( mnStackIdx >= 1 ); + pTop[+1] = pTop[0]; + ++mnStackIdx; + break; + case TYPE2OP::EXCH: { + assert( mnStackIdx >= 2 ); + const ValType nVal = pTop[0]; + pTop[0] = pTop[-1]; + pTop[-1] = nVal; + break; + } + case TYPE2OP::INDEX: { + assert( mnStackIdx >= 1 ); + const int nVal = static_cast(pTop[0]); + assert( nVal >= 0 ); + assert( nVal < mnStackIdx-1 ); + pTop[0] = pTop[-1-nVal]; + break; + } + case TYPE2OP::ROLL: { + assert( mnStackIdx >= 1 ); + const int nNum = static_cast(pTop[0]); + assert( nNum >= 0); + assert( nNum < mnStackIdx-2 ); + (void)nNum; // TODO: implement + const int nOfs = static_cast(pTop[-1]); + mnStackIdx -= 2; + (void)nOfs;// TODO: implement + break; + } + case TYPE2OP::HFLEX1: { + assert( mnStackIdx == 9 ); + writeCurveTo( mnStackIdx, -9, -8, -7, -6, -5, -6 ); + writeCurveTo( mnStackIdx, -4, -6, -3, -2, -1, -8 ); + mnStackIdx -= 9; + } + break; + case TYPE2OP::HFLEX: { + assert( mnStackIdx == 7 ); + writeCurveTo( mnStackIdx, -7, 0, -6, -5, -4, -5 ); + writeCurveTo( mnStackIdx, -3, -5, -2, 0, -1, 0 ); + mnStackIdx -= 7; + } + break; + case TYPE2OP::FLEX: { + assert( mnStackIdx == 13 ); + writeCurveTo( mnStackIdx, -13, -12, -11, -10, -9, -8 ); + writeCurveTo( mnStackIdx, -7, -6, -5, -4, -3, -2 ); + const ValType nFlexDepth = mnValStack[ mnStackIdx-1 ]; + (void)nFlexDepth; // ignoring nFlexDepth + mnStackIdx -= 13; + } + break; + case TYPE2OP::FLEX1: { + assert( mnStackIdx == 11 ); + // write the first part of the flex1-hinted curve + writeCurveTo( mnStackIdx, -11, -10, -9, -8, -7, -6 ); + + // determine if nD6 is horizontal or vertical + const int i = mnStackIdx; + ValType nDeltaX = mnValStack[i-11] + mnValStack[i-9] + mnValStack[i-7] + mnValStack[i-5] + mnValStack[i-3]; + if( nDeltaX < 0 ) nDeltaX = -nDeltaX; + ValType nDeltaY = mnValStack[i-10] + mnValStack[i-8] + mnValStack[i-6] + mnValStack[i-4] + mnValStack[i-2]; + if( nDeltaY < 0 ) nDeltaY = -nDeltaY; + const bool bVertD6 = (nDeltaY > nDeltaX); + + // write the second part of the flex1-hinted curve + if( !bVertD6 ) + writeCurveTo( mnStackIdx, -5, -4, -3, -2, -1, 0); + else + writeCurveTo( mnStackIdx, -5, -4, -3, -2, 0, -1); + mnStackIdx -= 11; + } + break; + default: + fprintf( stderr,"unhandled type2esc %d\n", nType2Esc); + assert( false); + break; + } +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::callType2Subr( bool bGlobal, int nSubrNumber) +{ + const U8* const pOldReadPtr = mpReadPtr; + const U8* const pOldReadEnd = mpReadEnd; + + int nLen = 0; + if( bGlobal ) { + nSubrNumber += mnGlobalSubrBias; + nLen = seekIndexData( mnGlobalSubrBase, nSubrNumber); + } else { + nSubrNumber += mpCffLocal->mnLocalSubrBias; + nLen = seekIndexData( mpCffLocal->mnLocalSubrBase, nSubrNumber); + } + + while( mpReadPtr < mpReadEnd) + convertOneTypeOp(); + + mpReadPtr = pOldReadPtr; + mpReadEnd = pOldReadEnd; +} + +// -------------------------------------------------------------------- + +static const int MAX_T1OPS_SIZE = 81920; // TODO: use dynamic value + +int CffSubsetterContext::convert2Type1Ops( CffLocal* pCffLocal, const U8* const pT2Ops, int nT2Len, U8* const pT1Ops) +{ + mpCffLocal = pCffLocal; + + // prepare the charstring conversion + mpWritePtr = pT1Ops; +#if 1 // TODO: update caller + U8 aType1Ops[ MAX_T1OPS_SIZE]; + if( !pT1Ops) + mpWritePtr = aType1Ops; + *const_cast(&pT1Ops) = mpWritePtr; +#else + assert( pT1Ops); +#endif + + // prepend random seed for T1crypt + *(mpWritePtr++) = 0x48; + *(mpWritePtr++) = 0x44; + *(mpWritePtr++) = 0x55; + *(mpWritePtr++) = ' '; +#if 1 // convert the Type2 charstring to Type1 + mpReadPtr = pT2Ops; + mpReadEnd = pT2Ops + nT2Len; + // prepend "hsbw" or "sbw" + // TODO: only emit hsbw when charwidth is known + // TODO: remove charwidth from T2 stack + writeType1Val( 0); // TODO: aSubsetterContext.getLeftSideBearing(); + writeType1Val( 1000/*###getCharWidth()###*/); + writeTypeOp( TYPE1OP::HSBW); +mbSawError = false; +mbNeedClose = false; +mbIgnoreHints = false; +mnHintSize=mnHorzHintSize=mnStackIdx=0; maCharWidth=-1;//####### +mnCntrMask = 0; + while( mpReadPtr < mpReadEnd) + convertOneTypeOp(); +// if( bActivePath) +// writeTypeOp( TYPE1OP::CLOSEPATH); +// if( bSubRoutine) +// writeTypeOp( TYPE1OP::RETURN); +if( mbSawError) { + mpWritePtr = pT1Ops+4; + // create an "idiotproof" charstring + writeType1Val( 0); + writeType1Val( 800); + writeTypeOp( TYPE1OP::HSBW); + writeType1Val( 50); + writeTypeOp( TYPE1OP::HMOVETO); + writeType1Val( 650); + writeType1Val( 100); + writeTypeOp( TYPE1OP::RLINETO); + writeType1Val( -350); + writeType1Val( 700); + writeTypeOp( TYPE1OP::RLINETO); +#if 0 + writeType1Val( -300); + writeType1Val( -800); + writeTypeOp( TYPE1OP::RLINETO); +#else + writeTypeOp( TYPE1OP::CLOSEPATH); +#endif + writeTypeOp( TYPE1OP::ENDCHAR); +} +#else // useful for manually encoding charstrings + mpWritePtr = pT1Ops; + mpWritePtr += sprintf( (char*)mpWritePtr, "OOo_\x8b\x8c\x0c\x10\x0b"); +#endif + const int nType1Len = mpWritePtr - pT1Ops; + + // encrypt the Type1 charstring + int nRDCryptR = 4330; // TODO: mnRDCryptSeed; + for( U8* p = pT1Ops; p < mpWritePtr; ++p) { + *p ^= (nRDCryptR >> 8); + nRDCryptR = (*(U8*)p + nRDCryptR) * 52845 + 22719; + } + + return nType1Len; +} + +// -------------------------------------------------------------------- + +RealType CffSubsetterContext::readRealVal() +{ + // TODO: more thorough number validity test + bool bComma = false; + int nExpVal = 0; + int nExpSign = 0; + S64 nNumber = 0; + RealType fReal = +1.0; + for(;;){ + const U8 c = *(mpReadPtr++); // read nibbles + // parse high nibble + const U8 nH = c >> 4U; + if( nH <= 9) { + nNumber = nNumber * 10 + nH; + --nExpVal; + } else if( nH == 10) { // comma + nExpVal = 0; + bComma = true; + } else if( nH == 11) { // +exp + fReal *= nNumber; + nExpSign = +1; + nNumber = 0; + } else if( nH == 12) { // -exp + fReal *= nNumber; + nExpSign = -1; + nNumber = 0; + } else if( nH == 13) { // reserved + // TODO: ignore or error? + } else if( nH == 14) // minus + fReal = -fReal; + else if( nH == 15) // end + break; + // parse low nibble + const U8 nL = c & 0x0F; + if( nL <= 9) { + nNumber = nNumber * 10 + nL; + --nExpVal; + } else if( nL == 10) { // comma + nExpVal = 0; + bComma = true; + } else if( nL == 11) { // +exp + fReal *= nNumber; + nNumber = 0; + nExpSign = +1; + } else if( nL == 12) { // -exp + fReal *= nNumber; + nNumber = 0; + nExpSign = -1; + } else if( nL == 13) { // reserved + // TODO: ignore or error? + } else if( nL == 14) // minus + fReal = -fReal; + else if( nL == 15) // end + break; + } + + // merge exponents + if( !bComma) + nExpVal = 0; + if( !nExpSign) { fReal *= nNumber;} + else if( nExpSign > 0) { nExpVal += static_cast(nNumber);} + else if( nExpSign < 0) { nExpVal -= static_cast(nNumber);} + + // apply exponents + if( !nExpVal) { /*nothing to apply*/} + else if( nExpVal > 0) { while( --nExpVal >= 0) fReal *= 10.0;} + else if( nExpVal < 0) { while( ++nExpVal <= 0) fReal /= 10.0;} + return fReal; +} + +// -------------------------------------------------------------------- + +// prepare to access an element inside a CFF/CID index table +int CffSubsetterContext::seekIndexData( int nIndexBase, int nDataIndex) +{ + assert( (nIndexBase > 0) && (mpBasePtr + nIndexBase + 3 <= mpBaseEnd)); + if( nDataIndex < 0) + return -1; + mpReadPtr = mpBasePtr + nIndexBase; + const int nDataCount = (mpReadPtr[0]<<8) + mpReadPtr[1]; + if( nDataIndex >= nDataCount) + return -1; + const int nDataOfsSz = mpReadPtr[2]; + mpReadPtr += 3 + (nDataOfsSz * nDataIndex); + int nOfs1 = 0; + switch( nDataOfsSz) { + default: fprintf( stderr, "\tINVALID nDataOfsSz=%d\n\n", nDataOfsSz); return -1; + case 1: nOfs1 = mpReadPtr[0]; break; + case 2: nOfs1 = (mpReadPtr[0]<<8) + mpReadPtr[1]; break; + case 3: nOfs1 = (mpReadPtr[0]<<16) + (mpReadPtr[1]<<8) + mpReadPtr[2]; break; + case 4: nOfs1 = (mpReadPtr[0]<<24) + (mpReadPtr[1]<<16) + (mpReadPtr[2]<<8) + mpReadPtr[3]; break; + } + mpReadPtr += nDataOfsSz; + + int nOfs2 = 0; + switch( nDataOfsSz) { + case 1: nOfs2 = mpReadPtr[0]; break; + case 2: nOfs2 = (mpReadPtr[0]<<8) + mpReadPtr[1]; break; + case 3: nOfs2 = (mpReadPtr[0]<<16) + (mpReadPtr[1]<<8) + mpReadPtr[2]; break; + case 4: nOfs2 = (mpReadPtr[0]<<24) + (mpReadPtr[1]<<16) + (mpReadPtr[2]<<8) + mpReadPtr[3]; break; + } + + mpReadPtr = mpBasePtr + (nIndexBase + 2) + nDataOfsSz * (nDataCount + 1) + nOfs1; + mpReadEnd = mpReadPtr + (nOfs2 - nOfs1); + assert( nOfs1 >= 0); + assert( nOfs2 >= nOfs1); + assert( mpReadPtr <= mpBaseEnd); + assert( mpReadEnd <= mpBaseEnd); + return (nOfs2 - nOfs1); +} + +// -------------------------------------------------------------------- + +// skip over a CFF/CID index table +void CffSubsetterContext::seekIndexEnd( int nIndexBase) +{ + assert( (nIndexBase > 0) && (mpBasePtr + nIndexBase + 3 <= mpBaseEnd)); + mpReadPtr = mpBasePtr + nIndexBase; + const int nDataCount = (mpReadPtr[0]<<8) + mpReadPtr[1]; + const int nDataOfsSz = mpReadPtr[2]; + mpReadPtr += 3 + nDataOfsSz * nDataCount; + assert( mpReadPtr <= mpBaseEnd); + int nEndOfs = 0; + switch( nDataOfsSz) { + default: fprintf( stderr, "\tINVALID nDataOfsSz=%d\n\n", nDataOfsSz); return; + case 1: nEndOfs = mpReadPtr[0]; break; + case 2: nEndOfs = (mpReadPtr[0]<<8) + mpReadPtr[1]; break; + case 3: nEndOfs = (mpReadPtr[0]<<16) + (mpReadPtr[1]<<8) + mpReadPtr[2];break; + case 4: nEndOfs = (mpReadPtr[0]<<24) + (mpReadPtr[1]<<16) + (mpReadPtr[2]<<8) + mpReadPtr[3]; break; + } + mpReadPtr += nDataOfsSz; + mpReadPtr += nEndOfs - 1; + mpReadEnd = mpBaseEnd; + assert( nEndOfs >= 0); + assert( mpReadEnd <= mpBaseEnd); +} + +// ==================================================================== + +// initialize FONTDICT specific values +CffLocal::CffLocal( void) +: mnPrivDictBase( 0) +, mnPrivDictSize( 0) +, mnLocalSubrOffs( 0) +, mnLocalSubrBase( 0) +, mnLocalSubrCount( 0) +, mnLocalSubrBias( 0) +, maNominalWidth( 0) +, maDefaultWidth( 0) +, maStemStdHW( 0) +, maStemStdVW( 0) +, mfBlueScale( 0.0) +, mfBlueShift( 0.0) +, mfBlueFuzz( 0.0) +, mfExpFactor( 0.0) +, mnLangGroup( 0) +, mbForceBold( false) +{ + maStemSnapH.clear(); + maStemSnapV.clear(); + maBlueValues.clear(); + maOtherBlues.clear(); + maFamilyBlues.clear(); + maFamilyOtherBlues.clear(); +} + +// -------------------------------------------------------------------- + +CffGlobal::CffGlobal( void) +: mnNameIdxBase( 0) +, mnNameIdxCount( 0) +, mnStringIdxBase( 0) +, mnStringIdxCount( 0) +, mbCIDFont( false) +, mnCharStrBase( 0) +, mnCharStrCount( 0) +, mnEncodingBase( 0) +, mnCharsetBase( 0) +, mnGlobalSubrBase( 0) +, mnGlobalSubrCount( 0) +, mnGlobalSubrBias( 0) +, mnFDSelectBase( 0) +, mnFontDictBase( 0) +, mnFDAryCount( 1) +, mnFontNameSID( 0) +, mnFullNameSID( 0) +, mnFamilyNameSID( 0) +{ + maFontBBox.clear(); + // TODO; maFontMatrix.clear(); +} + +// -------------------------------------------------------------------- + +void CffSubsetterContext::initialCffRead( void) +{ + // get the CFFHeader + mpReadPtr = mpBasePtr; + const U8 nVerMajor = *(mpReadPtr++); + const U8 nVerMinor = *(mpReadPtr++); + const U8 nHeaderSize = *(mpReadPtr++); + const U8 nOffsetSize = *(mpReadPtr++); + // TODO: is the version number useful for anything else? + assert( (nVerMajor == 1) && (nVerMinor == 0)); + (void)(nVerMajor + nVerMinor + nOffsetSize); // avoid compiler warnings + + // prepare access to the NameIndex + mnNameIdxBase = nHeaderSize; + mpReadPtr = mpBasePtr + nHeaderSize; + mnNameIdxCount = (mpReadPtr[0]<<8) + mpReadPtr[1]; + seekIndexEnd( mnNameIdxBase); + + // get the TopDict index + const long nTopDictBase = getReadOfs(); + const int nTopDictCount = (mpReadPtr[0]<<8) + mpReadPtr[1]; + if( nTopDictCount) { + for( int i = 0; i < nTopDictCount; ++i) { + seekIndexData( nTopDictBase, i); + while( mpReadPtr < mpReadEnd) + readDictOp(); + assert( mpReadPtr == mpReadEnd); + } + } + + // prepare access to the String index + mnStringIdxBase = getReadOfs(); + mnStringIdxCount = (mpReadPtr[0]<<8) + mpReadPtr[1]; + seekIndexEnd( mnStringIdxBase); + + // prepare access to the GlobalSubr index + mnGlobalSubrBase = getReadOfs(); + mnGlobalSubrCount = (mpReadPtr[0]<<8) + mpReadPtr[1]; + mnGlobalSubrBias = (mnGlobalSubrCount<1240)?107:(mnGlobalSubrCount<33900)?1131:32768; + // skip past the last GlobalSubr entry +// seekIndexEnd( mnGlobalSubrBase); + + // get/skip the Encodings (we got mnEncodingBase from TOPDICT) +// seekEncodingsEnd( mnEncodingBase); + // get/skip the Charsets (we got mnCharsetBase from TOPDICT) +// seekCharsetsEnd( mnCharStrBase); + // get/skip FDSelect (CID only) data + + // prepare access to the CharStrings index (we got the base from TOPDICT) + mpReadPtr = mpBasePtr + mnCharStrBase; + mnCharStrCount = (mpReadPtr[0]<<8) + mpReadPtr[1]; +// seekIndexEnd( mnCharStrBase); + + // read the FDArray index (CID only) + if( mbCIDFont) { +// assert( mnFontDictBase == tellRel()); + mpReadPtr = mpBasePtr + mnFontDictBase; + mnFDAryCount = (mpReadPtr[0]<<8) + mpReadPtr[1]; + assert( mnFDAryCount < (int)(sizeof(maCffLocal)/sizeof(*maCffLocal))); + + // read FDArray details to get access to the PRIVDICTs + for( int i = 0; i < mnFDAryCount; ++i) { + mpCffLocal = &maCffLocal[i]; + seekIndexData( mnFontDictBase, i); + while( mpReadPtr < mpReadEnd) + readDictOp(); + assert( mpReadPtr == mpReadEnd); + } + } + + for( int i = 0; i < mnFDAryCount; ++i) { + mpCffLocal = &maCffLocal[i]; + + // get the PrivateDict index + // (we got mnPrivDictSize and mnPrivDictBase from TOPDICT or FDArray) + if( mpCffLocal->mnPrivDictSize != 0) { + assert( mpCffLocal->mnPrivDictSize > 0); + // get the PrivDict data + mpReadPtr = mpBasePtr + mpCffLocal->mnPrivDictBase; + mpReadEnd = mpReadPtr + mpCffLocal->mnPrivDictSize; + assert( mpReadEnd <= mpBaseEnd); + // read PrivDict details + while( mpReadPtr < mpReadEnd) + readDictOp(); + } + + // prepare access to the LocalSubrs (we got mnLocalSubrOffs from PRIVDICT) + if( mpCffLocal->mnLocalSubrOffs) { + // read LocalSubrs summary + mpCffLocal->mnLocalSubrBase = mpCffLocal->mnPrivDictBase + mpCffLocal->mnLocalSubrOffs; + mpReadPtr = mpBasePtr + mpCffLocal->mnLocalSubrBase; + const int nSubrCount = (mpReadPtr[0] << 8) + mpReadPtr[1]; + mpCffLocal->mnLocalSubrCount = nSubrCount; + mpCffLocal->mnLocalSubrBias = (nSubrCount<1240)?107:(nSubrCount<33900)?1131:32768; +// seekIndexEnd( mpCffLocal->mnLocalSubrBase); + } + } + + // ignore the Notices info +} + +// -------------------------------------------------------------------- + +// get a cstring from a StringID +const char* CffSubsetterContext::getString( int nStringID) +{ + // get a standard string if possible + const static int nStdStrings = sizeof(pStringIds)/sizeof(*pStringIds); + if( (nStringID >= 0) && (nStringID < nStdStrings)) + return pStringIds[ nStringID]; + + // else get the string from the StringIndex table + const U8* pReadPtr = mpReadPtr; + const U8* pReadEnd = mpReadEnd; + nStringID -= nStdStrings; + int nLen = seekIndexData( mnStringIdxBase, nStringID); + // assert( nLen >= 0); + // TODO: just return the undecorated name + // TODO: get rid of static char buffer + static char aNameBuf[ 2560]; + if( nLen < 0) { + sprintf( aNameBuf, "name[%d].notfound!", nStringID); + } else { + const int nMaxLen = sizeof(aNameBuf) - 1; + if( nLen >= nMaxLen) + nLen = nMaxLen; + for( int i = 0; i < nLen; ++i) + aNameBuf[i] = *(mpReadPtr++); + aNameBuf[ nLen] = '\0'; + } + mpReadPtr = pReadPtr; + mpReadEnd = pReadEnd; + return aNameBuf; +} + +// -------------------------------------------------------------------- + +// access a CID's FDSelect table +int CffSubsetterContext::getFDSelect( int nGlyphIndex) const +{ + assert( nGlyphIndex >= 0); + assert( nGlyphIndex < mnCharStrCount); + if( !mbCIDFont) + return 0; + + const U8* pReadPtr = mpBasePtr + mnFDSelectBase; + const U8 nFDSelFormat = *(pReadPtr++); + switch( nFDSelFormat) { + case 0: { // FDSELECT format 0 + pReadPtr += nGlyphIndex; + const U8 nFDIdx = *(pReadPtr++); + return nFDIdx; + } //break; + case 3: { // FDSELECT format 3 + const U16 nRangeCount = (pReadPtr[0]<<8) + pReadPtr[1]; + assert( nRangeCount > 0); + assert( nRangeCount <= mnCharStrCount); + U16 nPrev = (pReadPtr[2]<<8) + pReadPtr[3]; + assert( nPrev == 0); + pReadPtr += 4; + // TODO? binary search + for( int i = 0; i < nRangeCount; ++i) { + const U8 nFDIdx = pReadPtr[0]; + const U16 nNext = (pReadPtr[1]<<8) + pReadPtr[2]; + assert( nPrev < nNext); + if( nGlyphIndex < nNext) + return nFDIdx; + pReadPtr += 3; + nPrev = nNext; + } + } break; + default: // invalid FDselect format + fprintf( stderr, "invalid CFF.FdselType=%d\n", nFDSelFormat); + break; + } + + assert( false); + return -1; +} + +// -------------------------------------------------------------------- + +int CffSubsetterContext::getGlyphSID( int nGlyphIndex) const +{ + if( nGlyphIndex == 0) + return 0; // ".notdef" + assert( nGlyphIndex >= 0); + assert( nGlyphIndex < mnCharStrCount); + if( (nGlyphIndex < 0) || (nGlyphIndex >= mnCharStrCount)) + return -1; + + // get the SID/CID from the Charset table + const U8* pReadPtr = mpBasePtr + mnCharsetBase; + const U8 nCSetFormat = *(pReadPtr++); + int nGlyphsToSkip = nGlyphIndex - 1; + switch( nCSetFormat) { + case 0: // charset format 0 + pReadPtr += 2 * nGlyphsToSkip; + nGlyphsToSkip = 0; + break; + case 1: // charset format 1 + while( nGlyphsToSkip >= 0) { + const int nLeft = pReadPtr[2]; + if( nGlyphsToSkip <= nLeft) + break; + nGlyphsToSkip -= nLeft + 1; + pReadPtr += 3; + } + break; + case 2: // charset format 2 + while( nGlyphsToSkip >= 0) { + const int nLeft = (pReadPtr[2]<<8) + pReadPtr[3]; + if( nGlyphsToSkip <= nLeft) + break; + nGlyphsToSkip -= nLeft + 1; + pReadPtr += 4; + } + break; + default: + fprintf( stderr, "ILLEGAL CFF-Charset format %d\n", nCSetFormat); + return -2; + } + + int nSID = (pReadPtr[0]<<8) + pReadPtr[1]; + nSID += nGlyphsToSkip; + // NOTE: for CID-fonts the resulting SID is interpreted as CID + return nSID; +} + +// -------------------------------------------------------------------- + +// NOTE: the result becomes invalid with the next call to this method +const char* CffSubsetterContext::getGlyphName( int nGlyphIndex) +{ + // the first glyph is always the .notdef glyph + const char* pGlyphName = ".notdef"; + if( nGlyphIndex == 0) + return pGlyphName; + + // prepare a result buffer + // TODO: get rid of static buffer + static char aDefaultGlyphName[64]; + pGlyphName = aDefaultGlyphName; + + // get the glyph specific name + const int nSID = getGlyphSID( nGlyphIndex); + if( nSID < 0) // default glyph name + sprintf( aDefaultGlyphName, "gly%03d", nGlyphIndex); + else if( mbCIDFont) // default glyph name in CIDs + sprintf( aDefaultGlyphName, "cid%03d", nSID); + else { // glyph name from string table + const char* pSidName = getString( nSID); + // check validity of glyph name + if( pSidName) { + const char* p = pSidName; + while( (*p >= '0') && (*p <= 'z')) ++p; + if( (p >= pSidName+1) && (*p == '\0')) + pGlyphName = pSidName; + } + // if needed invent a fallback name + if( pGlyphName != pSidName) + sprintf( aDefaultGlyphName, "bad%03d", nSID); + } + + return pGlyphName; +} + +// -------------------------------------------------------------------- + +class Type1Emitter +{ +public: + explicit Type1Emitter( const char* pOutFileName, bool bPfbSubset = true); + explicit Type1Emitter( FILE* pOutFile, bool bPfbSubset = true); + /*virtual*/ ~Type1Emitter( void); + void setSubsetName( const char* ); + + void emitRawData( const char* pData, int nLength) const; + void emitAllRaw( void); + void emitAllHex( void); + void emitAllCrypted( void); + int tellPos( void) const; + void updateLen( int nTellPos, int nLength); + void emitValVector( const char* pLineHead, const char* pLineTail, const ValVector&); +private: + FILE* mpFileOut; + bool mbCloseOutfile; + char maBuffer[MAX_T1OPS_SIZE]; // TODO: dynamic allocation + int mnEECryptR; +public: + char* mpPtr; + + char maSubsetName[256]; + bool mbPfbSubset; + int mnHexLineCol; +}; + +// -------------------------------------------------------------------- + +Type1Emitter::Type1Emitter( const char* pPfbFileName, bool bPfbSubset) +: mpFileOut( NULL) +, mbCloseOutfile( true) +, mnEECryptR( 55665) // default eexec seed, TODO: mnEECryptSeed +, mpPtr( maBuffer) +, mbPfbSubset( bPfbSubset) +, mnHexLineCol( 0) +{ + mpFileOut = fopen( pPfbFileName, "wb"); + maSubsetName[0] = '\0'; +} + +// -------------------------------------------------------------------- + +Type1Emitter::Type1Emitter( FILE* pOutFile, bool bPfbSubset) +: mpFileOut( pOutFile) +, mbCloseOutfile( false) +, mnEECryptR( 55665) // default eexec seed, TODO: mnEECryptSeed +, mpPtr( maBuffer) +, mbPfbSubset( bPfbSubset) +, mnHexLineCol( 0) +{ + maSubsetName[0] = '\0'; +} + +// -------------------------------------------------------------------- + +Type1Emitter::~Type1Emitter( void) +{ + if( !mpFileOut) + return; + if( mbCloseOutfile ) + fclose( mpFileOut); + mpFileOut = NULL; +} + +// -------------------------------------------------------------------- + +void Type1Emitter::setSubsetName( const char* pSubsetName) +{ + maSubsetName[0] = '\0'; + if( pSubsetName) + strncpy( maSubsetName, pSubsetName, sizeof(maSubsetName)); + maSubsetName[sizeof(maSubsetName)-1] = '\0'; +} + +// -------------------------------------------------------------------- + +int Type1Emitter::tellPos( void) const +{ + int nTellPos = ftell( mpFileOut); + return nTellPos; +} + +// -------------------------------------------------------------------- + +void Type1Emitter::updateLen( int nTellPos, int nLength) +{ + // update PFB segment header length + U8 cData[4]; + cData[0] = static_cast(nLength >> 0); + cData[1] = static_cast(nLength >> 8); + cData[2] = static_cast(nLength >> 16); + cData[3] = static_cast(nLength >> 24); + const int nCurrPos = ftell( mpFileOut); + fseek( mpFileOut, nTellPos, SEEK_SET); + fwrite( cData, 1, sizeof(cData), mpFileOut); + fseek( mpFileOut, nCurrPos, SEEK_SET); +} + +// -------------------------------------------------------------------- + +inline void Type1Emitter::emitRawData( const char* pData, int nLength) const +{ + fwrite( pData, 1, nLength, mpFileOut); +} + +// -------------------------------------------------------------------- + +inline void Type1Emitter::emitAllRaw( void) +{ + // writeout raw data + assert( (mpPtr - maBuffer) < (int)sizeof(maBuffer)); + emitRawData( maBuffer, mpPtr - maBuffer); + // reset the raw buffer + mpPtr = maBuffer; +} + +// -------------------------------------------------------------------- + +inline void Type1Emitter::emitAllHex( void) +{ + assert( (mpPtr - maBuffer) < (int)sizeof(maBuffer)); + for( const char* p = maBuffer; p < mpPtr;) { + // convert binary chunk to hex + char aHexBuf[0x4000]; + char* pOut = aHexBuf; + while( (p < mpPtr) && (pOut < aHexBuf+sizeof(aHexBuf)-4)) { + // convert each byte to hex + char cNibble = (*p >> 4) & 0x0F; + cNibble += (cNibble < 10) ? '0' : 'A'-10; + *(pOut++) = cNibble; + cNibble = *(p++) & 0x0F; + cNibble += (cNibble < 10) ? '0' : 'A'-10; + *(pOut++) = cNibble; + // limit the line length + if( (++mnHexLineCol & 0x3F) == 0) + *(pOut++) = '\n'; + } + // writeout hex-converted chunk + emitRawData( aHexBuf, pOut-aHexBuf); + } + // reset the raw buffer + mpPtr = maBuffer; +} + +// -------------------------------------------------------------------- + +void Type1Emitter::emitAllCrypted( void) +{ + // apply t1crypt + for( char* p = maBuffer; p < mpPtr; ++p) { + *p ^= (mnEECryptR >> 8); + mnEECryptR = (*(U8*)p + mnEECryptR) * 52845 + 22719; + } + + // emit the t1crypt result + if( mbPfbSubset) + emitAllRaw(); + else + emitAllHex(); +} + +// -------------------------------------------------------------------- + +void Type1Emitter::emitValVector( const char* pLineHead, const char* pLineTail, + const ValVector& rVector) +{ + // ignore empty vectors + if( rVector.empty()) + return; + + // emit the line head + mpPtr += sprintf( mpPtr, pLineHead); + // emit the vector values + ValVector::value_type aVal = 0; + for( ValVector::const_iterator it = rVector.begin();;) { + aVal = *it; + if( ++it == rVector.end() ) + break; + mpPtr += sprintf( mpPtr, "%g ", aVal); + } + // emit the last value + mpPtr += sprintf( mpPtr, "%g", aVal); + // emit the line tail + mpPtr += sprintf( mpPtr, pLineTail); +} + +// -------------------------------------------------------------------- + +bool CffSubsetterContext::emitAsType1( Type1Emitter& rEmitter, + const long* pReqGlyphIDs, const U8* pReqEncoding, + GlyphWidth* pGlyphWidths, int nGlyphCount, FontSubsetInfo& rFSInfo) +{ + // prepare some fontdirectory details + static const int nUniqueIdBase = 4100000; // using private-interchange UniqueIds + static int nUniqueId = nUniqueIdBase; + ++nUniqueId; + + char* pFontName = rEmitter.maSubsetName; + if( !*pFontName ) { + if( mnFontNameSID) { + // get the fontname directly if available + strncpy( pFontName, getString( mnFontNameSID), sizeof(rEmitter.maSubsetName)); + } else if( mnFullNameSID) { + // approximate fontname as fullname-whitespace + const char* pI = getString( mnFullNameSID); + char* pO = pFontName; + const char* pLimit = pFontName + sizeof(rEmitter.maSubsetName) - 1; + while( pO < pLimit) { + const char c = *(pI++); + if( c != ' ') + *(pO++) = c; + if( !c) + break; + } + *pO = '\0'; + } else { + // fallback name of last resort + strncpy( pFontName, "DummyName", sizeof(rEmitter.maSubsetName)); + } + } + const char* pFullName = pFontName; + const char* pFamilyName = pFontName; + + char*& pOut = rEmitter.mpPtr; // convenience reference, TODO: cleanup + + // create a PFB+Type1 header + if( rEmitter.mbPfbSubset ) { + static const char aPfbHeader[] = "\x80\x01\x00\x00\x00\x00"; + rEmitter.emitRawData( aPfbHeader, sizeof(aPfbHeader)-1); + } + + pOut += sprintf( pOut, "%%!FontType1-1.0: %s 001.003\n", rEmitter.maSubsetName); + // emit TOPDICT +#if 0 // improve PS Type1 caching? + nOfs += sprintf( &aT1Str[nOfs], + "FontDirectory/%s known{/%s findfont dup/UniqueID known{dup\n" + "/UniqueID get %d eq exch/FontType get 1 eq and}{pop false}ifelse\n" + "{save true}{false}ifelse}\n{false}ifelse\n", + pFamilyName, pFamilyName, nUniqueId); +#endif + pOut += sprintf( pOut, + "11 dict begin\n" // TODO: dynamic entry count for TOPDICT + "/FontType 1 def\n" + "/PaintType 0 def\n"); + pOut += sprintf( pOut, "/FontName /%s def\n", rEmitter.maSubsetName); + pOut += sprintf( pOut, "/UniqueID %d def\n", nUniqueId); + // emit FontMatrix + if( maFontMatrix.size() == 6) + rEmitter.emitValVector( "/FontMatrix [", "]readonly def\n", maFontMatrix); + else // emit default FontMatrix if needed + pOut += sprintf( pOut, "/FontMatrix [0.001 0 0 0.001 0 0]readonly def\n"); + // emit FontBBox + if( maFontBBox.size() == 4) + rEmitter.emitValVector( "/FontBBox {", "}readonly def\n", maFontBBox); + else // emit default FontBBox if needed + pOut += sprintf( pOut, "/FontBBox {0 0 999 999}readonly def\n"); + // emit FONTINFO into TOPDICT + pOut += sprintf( pOut, + "/FontInfo 2 dict dup begin\n" // TODO: check fontinfo entry count + " /FullName (%s) readonly def\n" + " /FamilyName (%s) readonly def\n" + "end readonly def\n", + pFullName, pFamilyName); +#if 0 // TODO: use an standard Type1 encoding if possible + pOut += sprintf( pOut, + "/Encoding StandardEncoding def\n"); +#else + pOut += sprintf( pOut, + "/Encoding 256 array\n" + "0 1 255 {1 index exch /.notdef put} for\n"); + for( int i = 1; (i < nGlyphCount) && (i < 256); ++i) { + const char* pGlyphName = getGlyphName( pReqGlyphIDs[i]); + pOut += sprintf( pOut, "dup %d /%s put\n", pReqEncoding[i], pGlyphName); + } + pOut += sprintf( pOut, "readonly def\n"); +#endif + pOut += sprintf( pOut, + // TODO: more topdict entries + "currentdict end\n" + "currentfile eexec\n"); + + // emit PFB header + rEmitter.emitAllRaw(); + if( rEmitter.mbPfbSubset) { + // update PFB header segment + const int nPfbHeaderLen = rEmitter.tellPos() - 6; + rEmitter.updateLen( 2, nPfbHeaderLen); + + // prepare start of eexec segment + rEmitter.emitRawData( "\x80\x02\x00\x00\x00\x00", 6); // segment start + } + const int nEExecSegTell = rEmitter.tellPos(); + + // which always starts with a privdict + // count the privdict entries + int nPrivEntryCount = 9; +#if !defined(IGNORE_HINTS) + // emit blue hints only if non-default values + nPrivEntryCount += !mpCffLocal->maOtherBlues.empty(); + nPrivEntryCount += !mpCffLocal->maFamilyBlues.empty(); + nPrivEntryCount += !mpCffLocal->maFamilyOtherBlues.empty(); + nPrivEntryCount += (mpCffLocal->mfBlueScale != 0.0); + nPrivEntryCount += (mpCffLocal->mfBlueShift != 0.0); + nPrivEntryCount += (mpCffLocal->mfBlueFuzz != 0.0); + // emit stem hints only if non-default values + nPrivEntryCount += (mpCffLocal->maStemStdHW != 0); + nPrivEntryCount += (mpCffLocal->maStemStdVW != 0); + nPrivEntryCount += !mpCffLocal->maStemSnapH.empty(); + nPrivEntryCount += !mpCffLocal->maStemSnapV.empty(); + // emit other hints only if non-default values + nPrivEntryCount += (mpCffLocal->mfExpFactor != 0.0); + nPrivEntryCount += (mpCffLocal->mnLangGroup != 0); + nPrivEntryCount += (mpCffLocal->mnLangGroup == 1); + nPrivEntryCount += (mpCffLocal->mbForceBold != false); +#endif // IGNORE_HINTS + // emit the privdict header + pOut += sprintf( pOut, + "\110\104\125 " + "dup\n/Private %d dict dup begin\n" + "/RD{string currentfile exch readstring pop}executeonly def\n" + "/ND{noaccess def}executeonly def\n" + "/NP{noaccess put}executeonly def\n" + "/MinFeature{16 16}ND\n" + "/password 5839 def\n", // TODO: mnRDCryptSeed? + nPrivEntryCount); + +#if defined(IGNORE_HINTS) + pOut += sprintf( pOut, "/BlueValues []ND\n"); // BlueValues are mandatory +#else + // emit blue hint related privdict entries + if( !mpCffLocal->maBlueValues.empty()) + rEmitter.emitValVector( "/BlueValues [", "]ND\n", mpCffLocal->maBlueValues); + else + pOut += sprintf( pOut, "/BlueValues []ND\n"); // default to empty BlueValues + rEmitter.emitValVector( "/OtherBlues [", "]ND\n", mpCffLocal->maOtherBlues); + rEmitter.emitValVector( "/FamilyBlues [", "]ND\n", mpCffLocal->maFamilyBlues); + rEmitter.emitValVector( "/FamilyOtherBlues [", "]ND\n", mpCffLocal->maFamilyOtherBlues); + + if( mpCffLocal->mfBlueScale) + pOut += sprintf( pOut, "/BlueScale %.6f def\n", mpCffLocal->mfBlueScale); + if( mpCffLocal->mfBlueShift) // default BlueShift==7 + pOut += sprintf( pOut, "/BlueShift %.1f def\n", mpCffLocal->mfBlueShift); + if( mpCffLocal->mfBlueFuzz) // default BlueFuzz==1 + pOut += sprintf( pOut, "/BlueFuzz %.1f def\n", mpCffLocal->mfBlueFuzz); + + // emit stem hint related privdict entries + if( mpCffLocal->maStemStdHW) + pOut += sprintf( pOut, "/StdHW [%g] def\n", mpCffLocal->maStemStdHW); + if( mpCffLocal->maStemStdVW) + pOut += sprintf( pOut, "/StdVW [%g] def\n", mpCffLocal->maStemStdVW); + rEmitter.emitValVector( "/StemSnapH [", "]ND\n", mpCffLocal->maStemSnapH); + rEmitter.emitValVector( "/StemSnapV [", "]ND\n", mpCffLocal->maStemSnapV); + + // emit other hints + if( mpCffLocal->mbForceBold) + pOut += sprintf( pOut, "/ForceBold true def\n"); + if( mpCffLocal->mnLangGroup != 0) + pOut += sprintf( pOut, "/LanguageGroup %d def\n", mpCffLocal->mnLangGroup); + if( mpCffLocal->mnLangGroup == 1) // compatibility with ancient printers + pOut += sprintf( pOut, "/RndStemUp false def\n"); + if( mpCffLocal->mfExpFactor) + pOut += sprintf( pOut, "/ExpansionFactor %.2f def\n", mpCffLocal->mfExpFactor); +#endif // IGNORE_HINTS + + // emit remaining privdict entries + pOut += sprintf( pOut, "/UniqueID %d def\n", nUniqueId); + // TODO?: more privdict entries? + + static const char aOtherSubrs[] = + "/OtherSubrs\n" + "% Dummy code for faking flex hints\n" + "[ {} {} {} {systemdict /internaldict known not {pop 3}\n" + "{1183615869 systemdict /internaldict get exec\n" + "dup /startlock known\n" + "{/startlock get exec}\n" + "{dup /strtlck known\n" + "{/strtlck get exec}\n" + "{pop 3}\nifelse}\nifelse}\nifelse\n} executeonly\n" + "] ND\n"; + memcpy( pOut, aOtherSubrs, sizeof(aOtherSubrs)-1); + pOut += sizeof(aOtherSubrs)-1; + + // emit used GlobalSubr charstrings + // these are the just the default subrs + static const char aSubrs[] = + "/Subrs 5 array\n" + "dup 0 15 RD \x5F\x3D\x6B\xAC\x3C\xBD\x74\x3D\x3E\x17\xA0\x86\x58\x08\x85 NP\n" + "dup 1 9 RD \x5F\x3D\x6B\xD8\xA6\xB5\x68\xB6\xA2 NP\n" + "dup 2 9 RD \x5F\x3D\x6B\xAC\x39\x46\xB9\x43\xF9 NP\n" + "dup 3 5 RD \x5F\x3D\x6B\xAC\xB9 NP\n" + "dup 4 12 RD \x5F\x3D\x6B\xAC\x3E\x5D\x48\x54\x62\x76\x39\x03 NP\n" + "ND\n"; + memcpy( pOut, aSubrs, sizeof(aSubrs)-1); + pOut += sizeof(aSubrs)-1; + + // TODO: emit more GlobalSubr charstrings? + // TODO: emit used LocalSubr charstrings? + + // emit the CharStrings for the requested glyphs + pOut += sprintf( pOut, + "2 index /CharStrings %d dict dup begin\n", nGlyphCount); + rEmitter.emitAllCrypted(); + for( int i = 0; i < nGlyphCount; ++i) { + const int nGlyphId = pReqGlyphIDs[i]; + assert( (nGlyphId >= 0) && (nGlyphId < mnCharStrCount)); + // get privdict context matching to the glyph + const int nFDSelect = getFDSelect( nGlyphId); + mpCffLocal = &maCffLocal[ nFDSelect]; + // convert the Type2op charstring to its Type1op counterpart + const int nT2Len = seekIndexData( mnCharStrBase, nGlyphId); + assert( nT2Len > 0); + U8 aType1Ops[ MAX_T1OPS_SIZE]; // TODO: dynamic allocation + const int nT1Len = convert2Type1Ops( mpCffLocal, mpReadPtr, nT2Len, aType1Ops); + // get the glyph name + const char* pGlyphName = getGlyphName( nGlyphId); + // emit the encrypted Type1op charstring + pOut += sprintf( pOut, "/%s %d RD ", pGlyphName, nT1Len); + memcpy( pOut, aType1Ops, nT1Len); + pOut += nT1Len; + pOut += sprintf( pOut, " ND\n"); + rEmitter.emitAllCrypted(); + // provide individual glyphwidths if requested + if( pGlyphWidths ) { + ValType aCharWidth = getCharWidth(); + if( maFontMatrix.size() >= 4) + aCharWidth *= 1000.0F * maFontMatrix[0]; + pGlyphWidths[i] = static_cast(aCharWidth); + } + } + pOut += sprintf( pOut, "end end\nreadonly put\nput\n"); + pOut += sprintf( pOut, "dup/FontName get exch definefont pop\n"); + pOut += sprintf( pOut, "mark currentfile closefile\n"); + rEmitter.emitAllCrypted(); + + // mark stop of eexec encryption + if( rEmitter.mbPfbSubset) { + const int nEExecLen = rEmitter.tellPos() - nEExecSegTell; + rEmitter.updateLen( nEExecSegTell-4, nEExecLen); + } + + // create PFB footer + static const char aPfxFooter[] = "\x80\x01\x14\x02\x00\x00\n" // TODO: check segment len + "0000000000000000000000000000000000000000000000000000000000000000\n" + "0000000000000000000000000000000000000000000000000000000000000000\n" + "0000000000000000000000000000000000000000000000000000000000000000\n" + "0000000000000000000000000000000000000000000000000000000000000000\n" + "0000000000000000000000000000000000000000000000000000000000000000\n" + "0000000000000000000000000000000000000000000000000000000000000000\n" + "0000000000000000000000000000000000000000000000000000000000000000\n" + "0000000000000000000000000000000000000000000000000000000000000000\n" + "cleartomark\n" + "\x80\x03"; + if( rEmitter.mbPfbSubset) + rEmitter.emitRawData( aPfxFooter, sizeof(aPfxFooter)-1); + else + rEmitter.emitRawData( aPfxFooter+6, sizeof(aPfxFooter)-9); + + // provide details to the subset requesters, TODO: move into own method? + // note: Top and Bottom are flipped between Type1 and VCL + // note: the rest of VCL expects the details below to be scaled like for an emUnits==1000 font + ValType fXFactor = 1.0; + ValType fYFactor = 1.0; + if( maFontMatrix.size() >= 4) { + fXFactor = 1000.0F * maFontMatrix[0]; + fYFactor = 1000.0F * maFontMatrix[3]; + } + rFSInfo.m_aFontBBox = Rectangle( Point( static_cast(maFontBBox[0] * fXFactor), + static_cast(maFontBBox[1] * fYFactor) ), + Point( static_cast(maFontBBox[2] * fXFactor), + static_cast(maFontBBox[3] * fYFactor) ) ); + // PDF-Spec says the values below mean the ink bounds! + // TODO: use better approximations for these ink bounds + rFSInfo.m_nAscent = +rFSInfo.m_aFontBBox.Bottom(); // for capital letters + rFSInfo.m_nDescent = -rFSInfo.m_aFontBBox.Top(); // for all letters + rFSInfo.m_nCapHeight = rFSInfo.m_nAscent; // for top-flat capital letters + + rFSInfo.m_nFontType = rEmitter.mbPfbSubset ? FontSubsetInfo::TYPE1_PFB : FontSubsetInfo::TYPE1_PFA; + rFSInfo.m_aPSName = String( rEmitter.maSubsetName, RTL_TEXTENCODING_UTF8 ); + + return true; +} + +// ==================================================================== + +bool FontSubsetInfo::CreateFontSubsetFromCff( GlyphWidth* pOutGlyphWidths ) +{ + CffSubsetterContext aCff( mpInFontBytes, mnInByteLength); + aCff.initialCffRead(); + + // emit Type1 subset from the CFF input + // TODO: also support CFF->CFF subsetting (when PDF-export and PS-printing need it) + const bool bPfbSubset = (0 != (mnReqFontTypeMask & FontSubsetInfo::TYPE1_PFB)); + Type1Emitter aType1Emitter( mpOutFile, bPfbSubset); + aType1Emitter.setSubsetName( mpReqFontName); + bool bRC = aCff.emitAsType1( aType1Emitter, + mpReqGlyphIds, mpReqEncodedIds, + pOutGlyphWidths, mnReqGlyphCount, *this); + return bRC; +} + +// ==================================================================== + diff --git a/vcl/source/fontsubset/fontsubset.cxx b/vcl/source/fontsubset/fontsubset.cxx new file mode 100644 index 000000000000..84f548d0a32f --- /dev/null +++ b/vcl/source/fontsubset/fontsubset.cxx @@ -0,0 +1,185 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#include +#include +#include + +// ==================================================================== + +FontSubsetInfo::FontSubsetInfo() +: m_nAscent( 0) +, m_nDescent( 0) +, m_nCapHeight( 0) +, m_nFontType( FontSubsetInfo::NO_FONT) +, mpInFontBytes( NULL) +, mnInByteLength( 0) +, meInFontType( FontSubsetInfo::NO_FONT) +, mpSftTTFont( NULL) +{} + +// -------------------------------------------------------------------- + +FontSubsetInfo::~FontSubsetInfo() +{} + +// -------------------------------------------------------------------- + +// prepare subsetting for fonts where the input font file is mapped +bool FontSubsetInfo::LoadFont( + FontSubsetInfo::FontType eInFontType, + const unsigned char* pInFontBytes, int nInByteLength) +{ + DBG_ASSERT( (mpSftTTFont == NULL), "Subset from SFT and from mapped font-file requested"); + meInFontType = eInFontType; + mpInFontBytes = pInFontBytes; + mnInByteLength = nInByteLength; + return (mnInByteLength > 0); +} + +// -------------------------------------------------------------------- + +// prepare subsetting for fonts that are known to the SFT-parser +bool FontSubsetInfo::LoadFont( vcl::_TrueTypeFont* pSftTTFont ) +{ + DBG_ASSERT( (mpInFontBytes == NULL), "Subset from SFT and from mapped font-file requested"); + mpSftTTFont = pSftTTFont; + meInFontType = ANY_SFNT; + return (mpSftTTFont == NULL); +} + +// -------------------------------------------------------------------- + +bool FontSubsetInfo::CreateFontSubset( + int nReqFontTypeMask, + FILE* pOutFile, const char* pReqFontName, + const long* pReqGlyphIds, const sal_uInt8* pReqEncodedIds, int nReqGlyphCount, + sal_Int32* pOutGlyphWidths) +{ + // prepare request details needed by all underlying subsetters + mnReqFontTypeMask = nReqFontTypeMask; + mpOutFile = pOutFile; + mpReqFontName = pReqFontName; + mpReqGlyphIds = pReqGlyphIds; + mpReqEncodedIds = pReqEncodedIds; + mnReqGlyphCount = nReqGlyphCount; + + // TODO: move the glyphid/encid/notdef reshuffling from the callers to here + + // dispatch to underlying subsetters + bool bOK = false; + + // TODO: better match available input-type to possible subset-types + switch( meInFontType) { + case SFNT_TTF: + case SFNT_CFF: + case ANY_SFNT: + bOK = CreateFontSubsetFromSfnt( pOutGlyphWidths); + break; + case CFF_FONT: + bOK = CreateFontSubsetFromCff( pOutGlyphWidths); + break; + case TYPE1_PFA: + case TYPE1_PFB: + case ANY_TYPE1: + bOK = CreateFontSubsetFromType1( pOutGlyphWidths); + break; + // fall trough + case NO_FONT: + // fall trough + default: + DBG_ERROR( "unhandled type in CreateFontSubset()"); + break; + } + + return bOK; +} + +// -------------------------------------------------------------------- + +// TODO: move function to sft.cxx to replace dummy implementation +bool FontSubsetInfo::CreateFontSubsetFromSfnt( sal_Int32* pOutGlyphWidths ) +{ + // handle SFNT_CFF fonts + int nCffLength = 0; + const sal_uInt8* pCffBytes = NULL; + if( GetSfntTable( mpSftTTFont, O_CFF, &pCffBytes, &nCffLength)) + { + LoadFont( CFF_FONT, pCffBytes, nCffLength); + const bool bOK = CreateFontSubsetFromCff( pOutGlyphWidths); + return bOK; + } + + // handle SFNT_TTF fonts + // by forwarding the subset request to AG's sft subsetter +#if 1 // TODO: remove conversion tp 16bit glyphids when sft-subsetter has been updated + sal_uInt16 aShortGlyphIds[256]; + for( int i = 0; i < mnReqGlyphCount; ++i) + aShortGlyphIds[i] = (sal_uInt16)mpReqGlyphIds[i]; + // remove const_cast when sft-subsetter is const-correct + sal_uInt8* pEncArray = const_cast( mpReqEncodedIds ); +#endif + int nSFTErr = vcl::SF_BADARG; + if( (mnReqFontTypeMask & TYPE42_FONT) != 0 ) + { + nSFTErr = CreateT42FromTTGlyphs( mpSftTTFont, mpOutFile, mpReqFontName, + aShortGlyphIds, pEncArray, mnReqGlyphCount ); + } + else if( (mnReqFontTypeMask & TYPE3_FONT) != 0 ) + { + nSFTErr = CreateT3FromTTGlyphs( mpSftTTFont, mpOutFile, mpReqFontName, + aShortGlyphIds, pEncArray, mnReqGlyphCount, + 0 /* 0 = horizontal, 1 = vertical */ ); + } + else if( (mnReqFontTypeMask & SFNT_TTF) != 0 ) + { + // TODO: use CreateTTFromTTGlyphs() + // TODO: move functionality from callers here + } + + return (nSFTErr != vcl::SF_OK); +} + +// -------------------------------------------------------------------- + +// TODO: replace dummy implementation +bool FontSubsetInfo::CreateFontSubsetFromType1( sal_Int32* pOutGlyphWidths) +{ +#if 0 + // TODO: replace dummy implementation when someone needs this +#else + (void)pOutGlyphWidths; + fprintf(stderr,"CreateFontSubsetFromType1: replace dummy implementation\n"); +#endif + return false; +} + +// ==================================================================== + diff --git a/vcl/source/fontsubset/gsub.cxx b/vcl/source/fontsubset/gsub.cxx index 9715e7fc8585..600c03194210 100644 --- a/vcl/source/fontsubset/gsub.cxx +++ b/vcl/source/fontsubset/gsub.cxx @@ -32,6 +32,8 @@ #include "gsub.h" +#include + #include #include #include @@ -280,9 +282,11 @@ int ReadGSUB( struct _TrueTypeFont* pTTFile, { const USHORT nGlyph0 = NEXT_UShort( pCoverage ); const USHORT nGlyph1 = NEXT_UShort( pCoverage ); - const USHORT nCovIdx = NEXT_UShort( pCoverage ); + const USHORT nStartCoverageIndex = NEXT_UShort( pCoverage ); + OSL_ENSURE( aSubstVector.size() == nStartCoverageIndex, "coverage index mismatch"); + (void)nStartCoverageIndex; for( USHORT j = nGlyph0; j <= nGlyph1; ++j ) - aSubstVector.push_back( GlyphSubst( j + nCovIdx, 0 ) ); + aSubstVector.push_back( GlyphSubst( j, 0 ) ); } } break; diff --git a/vcl/source/fontsubset/makefile.mk b/vcl/source/fontsubset/makefile.mk index b7d719f3c912..95cc12bccfaa 100644 --- a/vcl/source/fontsubset/makefile.mk +++ b/vcl/source/fontsubset/makefile.mk @@ -40,6 +40,8 @@ ENABLE_EXCEPTIONS=true SLOFILES=\ $(SLO)$/list.obj \ $(SLO)$/sft.obj \ + $(SLO)$/cff.obj \ + $(SLO)$/fontsubset.obj \ $(SLO)$/xlat.obj \ $(SLO)$/ttcr.obj \ $(SLO)$/gsub.obj diff --git a/vcl/source/fontsubset/sft.cxx b/vcl/source/fontsubset/sft.cxx index 10d4cf774b04..0accc42af968 100644 --- a/vcl/source/fontsubset/sft.cxx +++ b/vcl/source/fontsubset/sft.cxx @@ -25,6 +25,9 @@ * ************************************************************************/ +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + /* * Sun Font Tools * @@ -131,6 +134,7 @@ static const sal_uInt32 TTFontClassTag = 0x74746663; /* 'ttfc' */ static const sal_uInt32 T_true = 0x74727565; /* 'true' */ static const sal_uInt32 T_ttcf = 0x74746366; /* 'ttcf' */ +static const sal_uInt32 T_otto = 0x4f54544f; /* 'OTTO' */ /* standard TrueType table tags */ #define T_maxp 0x6D617870 @@ -150,6 +154,7 @@ static const sal_uInt32 T_ttcf = 0x74746366; /* 'ttcf' */ #define T_prep 0x70726570 #define T_fpgm 0x6670676D #define T_gsub 0x47535542 +#define T_CFF 0x43464620 #define LAST_URANGE_BIT 69 const char *ulcodes[LAST_URANGE_BIT+2] = { @@ -329,7 +334,7 @@ _inline void PutInt16(sal_Int16 val, sal_uInt8 *ptr, size_t offset, int bigendia } -#if defined(OSL_BIG_ENDIAN) +#if defined(OSL_BIGENDIAN) #define Int16FromMOTA(a) (a) #define Int32FromMOTA(a) (a) #else @@ -416,7 +421,7 @@ _inline const char *UnicodeRangeName(sal_uInt16 bit) return ulcodes[bit]; } -_inline sal_uInt8 *getTable(TrueTypeFont *ttf, sal_uInt32 ord) +_inline const sal_uInt8* getTable( TrueTypeFont *ttf, sal_uInt32 ord) { return (sal_uInt8*)ttf->tables[ord]; } @@ -496,7 +501,7 @@ static void HexFmtBlockWrite(HexFmt *_this, const void *ptr, sal_uInt32 size) /* fills the aw and lsb entries of the TTGlyphMetrics structure from hmtx table -*/ static void GetMetrics(TrueTypeFont *ttf, sal_uInt32 glyphID, TTGlyphMetrics *metrics) { - sal_uInt8 *table = getTable(ttf, O_hmtx); + const sal_uInt8* table = getTable( ttf, O_hmtx ); metrics->aw = metrics->lsb = metrics->ah = metrics->tsb = 0; if (!table || !ttf->numberOfHMetrics) return; @@ -510,7 +515,8 @@ static void GetMetrics(TrueTypeFont *ttf, sal_uInt32 glyphID, TTGlyphMetrics *me } table = getTable(ttf, O_vmtx); - if (!table || !ttf->numOfLongVerMetrics) return; + if( !table || !ttf->numOfLongVerMetrics ) + return; if (glyphID < ttf->numOfLongVerMetrics) { metrics->ah = GetUInt16(table, 4 * glyphID, 1); @@ -526,19 +532,21 @@ static int GetTTGlyphOutline(TrueTypeFont *, sal_uInt32 , ControlPoint **, TTGly /* returns the number of control points, allocates the pointArray */ static int GetSimpleTTOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray, TTGlyphMetrics *metrics) /*FOLD02*/ { - sal_uInt8 *table = getTable(ttf, O_glyf); - sal_uInt8 *ptr, *p, flag, n; - sal_Int16 numberOfContours; - sal_uInt16 t, instLen, lastPoint=0; + const sal_uInt8* table = getTable( ttf, O_glyf ); + sal_uInt8 flag, n; + sal_uInt16 t, lastPoint=0; int i, j, z; *pointArray = 0; /* printf("GetSimpleTTOutline(%d)\n", glyphID); */ - if (glyphID >= ttf->nglyphs) return 0; /*- glyph is not present in the font */ - ptr = table + ttf->goffsets[glyphID]; - if ((numberOfContours = GetInt16(ptr, 0, 1)) <= 0) return 0; /*- glyph is not simple */ + if( glyphID >= ttf->nglyphs ) /*- glyph is not present in the font */ + return 0; + const sal_uInt8* ptr = table + ttf->goffsets[glyphID]; + const sal_Int16 numberOfContours = GetInt16(ptr, 0, 1); + if( numberOfContours <= 0 ) /*- glyph is not simple */ + return 0; if (metrics) { /*- GetCompoundTTOutline() calls this function with NULL metrics -*/ metrics->xMin = GetInt16(ptr, 2, 1); @@ -554,8 +562,8 @@ static int GetSimpleTTOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoin if ((t = GetUInt16(ptr, 10+i*2, 1)) > lastPoint) lastPoint = t; } - instLen = GetUInt16(ptr, 10 + numberOfContours*2, 1); - p = ptr + 10 + 2 * numberOfContours + 2 + instLen; + sal_uInt16 instLen = GetUInt16(ptr, 10 + numberOfContours*2, 1); + const sal_uInt8* p = ptr + 10 + 2 * numberOfContours + 2 + instLen; ControlPoint* pa = (ControlPoint*)calloc(lastPoint+1, sizeof(ControlPoint)); i = 0; @@ -617,8 +625,7 @@ static int GetCompoundTTOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPo { sal_uInt16 flags, index; sal_Int16 e, f, numberOfContours; - sal_uInt8 *table = getTable(ttf, O_glyf); - sal_uInt8 *ptr; + const sal_uInt8* table = getTable( ttf, O_glyf ); std::vector myPoints; ControlPoint *nextComponent, *pa; int i, np; @@ -627,13 +634,12 @@ static int GetCompoundTTOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPo *pointArray = 0; /* printf("GetCompoundTTOutline(%d)\n", glyphID); */ - if (glyphID >= ttf->nglyphs) { /*- incorrect glyphID */ + if (glyphID >= ttf->nglyphs) /*- incorrect glyphID */ return 0; - } - ptr = table + ttf->goffsets[glyphID]; - if ((numberOfContours = GetInt16(ptr, 0, 1)) != -1) { /*- glyph is not compound */ + + const sal_uInt8* ptr = table + ttf->goffsets[glyphID]; + if ((numberOfContours = GetInt16(ptr, 0, 1)) != -1) /*- glyph is not compound */ return 0; - } if (metrics) { metrics->xMin = GetInt16(ptr, 2, 1); @@ -819,9 +825,8 @@ static int GetCompoundTTOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPo */ static int GetTTGlyphOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **pointArray, TTGlyphMetrics *metrics, std::vector< sal_uInt32 >* glyphlist) { - sal_uInt8 *ptr, *table = getTable(ttf, O_glyf); + const sal_uInt8 *table = getTable( ttf, O_glyf ); sal_Int16 numberOfContours; - int length; int res; *pointArray = 0; @@ -831,8 +836,8 @@ static int GetTTGlyphOutline(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint if (glyphID >= ttf->nglyphs) return -1; /**/ - ptr = table + ttf->goffsets[glyphID]; - length = ttf->goffsets[glyphID+1] - ttf->goffsets[glyphID]; + const sal_uInt8* ptr = table + ttf->goffsets[glyphID]; + int length = ttf->goffsets[glyphID+1] - ttf->goffsets[glyphID]; if (length == 0) { /*- empty glyphs still have hmtx and vmtx metrics values */ if (metrics) GetMetrics(ttf, glyphID, metrics); @@ -1005,15 +1010,15 @@ static int BSplineToPSPath(ControlPoint *srcA, int srcCount, PSPathElement **pat /*- Extracts a string from the name table and allocates memory for it -*/ -static char *nameExtract(sal_uInt8 *name, int nTableSize, int n, int dbFlag, sal_uInt16** ucs2result ) +static char *nameExtract( const sal_uInt8* name, int nTableSize, int n, int dbFlag, sal_uInt16** ucs2result ) { int i; char *res; - sal_uInt8 *ptr = name + GetUInt16(name, 4, 1) + GetUInt16(name + 6, 12 * n + 10, 1); + const sal_uInt8* ptr = name + GetUInt16(name, 4, 1) + GetUInt16(name + 6, 12 * n + 10, 1); int len = GetUInt16(name+6, 12 * n + 8, 1); // sanity check - if( ! len || ptr >= (name+nTableSize-len) ) + if( (len <= 0) || ((ptr+len) > (name+nTableSize)) ) { if( ucs2result ) *ucs2result = NULL; @@ -1043,7 +1048,8 @@ static char *nameExtract(sal_uInt8 *name, int nTableSize, int n, int dbFlag, sal return res; } -static int findname(sal_uInt8 *name, sal_uInt16 n, sal_uInt16 platformID, sal_uInt16 encodingID, sal_uInt16 languageID, sal_uInt16 nameID) +static int findname( const sal_uInt8 *name, sal_uInt16 n, sal_uInt16 platformID, + sal_uInt16 encodingID, sal_uInt16 languageID, sal_uInt16 nameID ) { int l = 0, r = n-1, i; sal_uInt32 t1, t2; @@ -1085,7 +1091,7 @@ static int findname(sal_uInt8 *name, sal_uInt16 n, sal_uInt16 platformID, sal_uI static void GetNames(TrueTypeFont *t) { - sal_uInt8 *table = getTable(t, O_name); + const sal_uInt8* table = getTable( t, O_name ); int nTableSize = getTableSize(t, O_name); sal_uInt16 n = GetUInt16(table, 2, 1); @@ -1107,6 +1113,11 @@ static void GetNames(TrueTypeFont *t) // some symbol fonts like Marlett have a 3,0 name! t->psname = nameExtract(table, nTableSize, r, 1, NULL); } + // for embedded font in Ghostscript PDFs + if ( ! t->psname && (r = findname(table, n, 2, 2, 0, 6)) != -1) + { + t->psname = nameExtract(table, nTableSize, r, 0, NULL); + } if ( ! t->psname ) { if ( t->fname ) @@ -1374,7 +1385,7 @@ static sal_uInt32 getGlyph12(const sal_uInt8 *pCmap, sal_uInt32 cChar) { static void FindCmap(TrueTypeFont *ttf) { - sal_uInt8 *table = getTable(ttf, O_cmap); + const sal_uInt8* table = getTable(ttf, O_cmap); sal_uInt32 table_size = getTableSize(ttf, O_cmap); sal_uInt16 ncmaps = GetUInt16(table, 2, 1); unsigned int i; @@ -1468,24 +1479,20 @@ static void FindCmap(TrueTypeFont *ttf) static void GetKern(TrueTypeFont *ttf) { - sal_uInt8 *table = getTable(ttf, O_kern); - sal_uInt8 *ptr; - sal_uInt32 i; - /* - sal_uInt16 v1; - sal_uInt32 v2; - */ + const sal_uInt8* table = getTable(ttf, O_kern); + const sal_uInt8 *ptr; - if (!table) goto badtable; + if( !table ) + goto badtable; if (GetUInt16(table, 0, 1) == 0) { /* Traditional Microsoft style table with USHORT version and nTables fields */ ttf->nkern = GetUInt16(table, 2, 1); - ttf->kerntables = (sal_uInt8**)calloc(ttf->nkern, sizeof(sal_uInt8 *)); + ttf->kerntables = (const sal_uInt8**)calloc(ttf->nkern, sizeof(sal_uInt8 *)); assert(ttf->kerntables != 0); memset(ttf->kerntables, 0, ttf->nkern * sizeof(sal_uInt8 *)); ttf->kerntype = KT_MICROSOFT; ptr = table + 4; - for (i=0; i < ttf->nkern; i++) { + for( unsigned i = 0; i < ttf->nkern; ++i) { ttf->kerntables[i] = ptr; ptr += GetUInt16(ptr, 2, 1); /* sanity check */ @@ -1500,12 +1507,12 @@ static void GetKern(TrueTypeFont *ttf) if (GetUInt32(table, 0, 1) == 0x00010000) { /* MacOS style kern tables: fixed32 version and sal_uInt32 nTables fields */ ttf->nkern = GetUInt32(table, 4, 1); - ttf->kerntables = (sal_uInt8**)calloc(ttf->nkern, sizeof(sal_uInt8*)); + ttf->kerntables = (const sal_uInt8**)calloc(ttf->nkern, sizeof(sal_uInt8*)); assert(ttf->kerntables != 0); memset(ttf->kerntables, 0, ttf->nkern * sizeof(sal_uInt8 *)); ttf->kerntype = KT_APPLE_NEW; ptr = table + 8; - for (i = 0; i < ttf->nkern; i++) { + for( unsigned i = 0; i < ttf->nkern; ++i) { ttf->kerntables[i] = ptr; ptr += GetUInt32(ptr, 0, 1); /* sanity check; there are some fonts that are broken in this regard */ @@ -1717,7 +1724,9 @@ static int doOpenTTFont( sal_uInt32 facenum, TrueTypeFont* t ) if ((version == 0x00010000) || (version == T_true)) { tdoffset = 0; - } else if (version == T_ttcf) { /*- TrueType collection */ + } else if (version == T_otto) { /* PS-OpenType font */ + tdoffset = 0; + } else if (version == T_ttcf) { /* TrueType collection */ if (GetUInt32(t->ptr, 4, 1) != 0x00010000) { CloseTTFont(t); return SF_TTFORMAT; @@ -1743,7 +1752,7 @@ static int doOpenTTFont( sal_uInt32 facenum, TrueTypeFont* t ) if( t->ntables >= 128 ) return SF_TTFORMAT; - t->tables = (sal_uInt8**)calloc(NUM_TAGS, sizeof(sal_uInt8*)); + t->tables = (const sal_uInt8**)calloc(NUM_TAGS, sizeof(sal_uInt8*)); assert(t->tables != 0); t->tlens = (sal_uInt32*)calloc(NUM_TAGS, sizeof(sal_uInt32)); assert(t->tlens != 0); @@ -1773,6 +1782,7 @@ static int doOpenTTFont( sal_uInt32 facenum, TrueTypeFont* t ) case T_prep: nIndex = O_prep; break; case T_fpgm: nIndex = O_fpgm; break; case T_gsub: nIndex = O_gsub; break; + case T_CFF: nIndex = O_CFF; break; default: nIndex = -1; break; } if( nIndex >= 0 ) { @@ -1817,11 +1827,12 @@ static int doOpenTTFont( sal_uInt32 facenum, TrueTypeFont* t ) if( (sal_uInt8*)t->tables[i] < t->ptr ) { +#if OSL_DEBUG_LEVEL > 1 + if( t->tables[i] ) + fprintf( stderr, "font file %s has bad table offset %d (tagnum=%d)\n", t->fname, (sal_uInt8*)t->tables[i]-t->ptr, i ); +#endif t->tlens[i] = 0; t->tables[i] = NULL; -#if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "font file %s has bad table offset (tagnum=%d)\n", t->fname, i ); -#endif } else if( (sal_uInt8*)t->tables[i] + t->tlens[i] > t->ptr + t->fsize ) { @@ -1839,15 +1850,15 @@ static int doOpenTTFont( sal_uInt32 facenum, TrueTypeFont* t ) and read the basic font properties */ /* The following tables are absolutely required: - * maxp, head, glyf, loca, name, cmap + * maxp, head, name, cmap */ - if (!(getTable(t, O_maxp) && getTable(t, O_head) && getTable(t, O_glyf) && getTable(t, O_loca) && getTable(t, O_name) && getTable(t, O_cmap) )) { + if( !(getTable(t, O_maxp) && getTable(t, O_head) && getTable(t, O_name) && getTable(t, O_cmap)) ) { CloseTTFont(t); return SF_TTFORMAT; } - sal_uInt8* table = getTable(t, O_maxp); + const sal_uInt8* table = getTable(t, O_maxp); t->nglyphs = GetUInt16(table, 4, 1); table = getTable(t, O_head); @@ -1859,16 +1870,24 @@ static int doOpenTTFont( sal_uInt32 facenum, TrueTypeFont* t ) return SF_TTFORMAT; } - k = (getTableSize(t, O_loca) / (indexfmt ? 4 : 2)) - 1; - if (k < (int)t->nglyphs) t->nglyphs = k; /* Hack for broken Chinese fonts */ + if( getTable(t, O_glyf) && getTable(t, O_loca) ) { /* TTF or TTF-OpenType */ + k = (getTableSize(t, O_loca) / (indexfmt ? 4 : 2)) - 1; + if( k < (int)t->nglyphs ) /* Hack for broken Chinese fonts */ + t->nglyphs = k; - table = getTable(t, O_loca); + table = getTable(t, O_loca); + t->goffsets = (sal_uInt32 *) calloc(1+t->nglyphs, sizeof(sal_uInt32)); + assert(t->goffsets != 0); - t->goffsets = (sal_uInt32 *) calloc(1+t->nglyphs, sizeof(sal_uInt32)); - assert(t->goffsets != 0); - - for (i = 0; i <= (int)t->nglyphs; i++) { - t->goffsets[i] = indexfmt ? GetUInt32(table, i << 2, 1) : (sal_uInt32)GetUInt16(table, i << 1, 1) << 1; + for( i = 0; i <= (int)t->nglyphs; ++i ) + t->goffsets[i] = indexfmt ? GetUInt32(table, i << 2, 1) : (sal_uInt32)GetUInt16(table, i << 1, 1) << 1; + } else if( getTable(t, O_CFF) ) { /* PS-OpenType */ + t->goffsets = (sal_uInt32 *) calloc(1+t->nglyphs, sizeof(sal_uInt32)); + /* TODO: implement to get subsetting */ + assert(t->goffsets != 0); + } else { + CloseTTFont(t); + return SF_TTFORMAT; } table = getTable(t, O_hhea); @@ -1919,11 +1938,13 @@ int GetTTGlyphPoints(TrueTypeFont *ttf, sal_uInt32 glyphID, ControlPoint **point int GetTTGlyphComponents(TrueTypeFont *ttf, sal_uInt32 glyphID, std::vector< sal_uInt32 >& glyphlist) { - sal_uInt8 *ptr, *glyf = getTable(ttf, O_glyf); int n = 1; - if (glyphID >= ttf->nglyphs) return 0; - ptr = glyf + ttf->goffsets[glyphID]; + if( glyphID >= ttf->nglyphs ) + return 0; + + const sal_uInt8* glyf = getTable(ttf, O_glyf); + const sal_uInt8* ptr = glyf + ttf->goffsets[glyphID]; glyphlist.push_back( glyphID ); @@ -1964,7 +1985,7 @@ int CreateT3FromTTGlyphs(TrueTypeFont *ttf, FILE *outf, const char *fname, /*FO ControlPoint *pa; PSPathElement *path; int i, j, r, n; - sal_uInt8 *table = getTable(ttf, O_head); + const sal_uInt8* table = getTable(ttf, O_head); TTGlyphMetrics metrics; int UPEm = ttf->unitsPerEm; @@ -2123,7 +2144,6 @@ int CreateTTFromTTGlyphs(TrueTypeFont *ttf, { TrueTypeCreator *ttcr; TrueTypeTable *head=0, *hhea=0, *maxp=0, *cvt=0, *prep=0, *glyf=0, *fpgm=0, *cmap=0, *name=0, *post = 0, *os2 = 0; - sal_uInt8 *p; int i; int res; @@ -2173,7 +2193,7 @@ int CreateTTFromTTGlyphs(TrueTypeFont *ttf, maxp = TrueTypeTableNew_maxp(getTable(ttf, O_maxp), getTableSize(ttf, O_maxp)); /** hhea **/ - p = getTable(ttf, O_hhea); + const sal_uInt8* p = getTable(ttf, O_hhea); if (p) { hhea = TrueTypeTableNew_hhea(GetUInt16(p, 4, 1), GetUInt16(p, 6, 1), GetUInt16(p, 8, 1), GetUInt16(p, 18, 1), GetUInt16(p, 20, 1)); } else { @@ -2356,12 +2376,10 @@ int CreateT42FromTTGlyphs(TrueTypeFont *ttf, { TrueTypeCreator *ttcr; TrueTypeTable *head=0, *hhea=0, *maxp=0, *cvt=0, *prep=0, *glyf=0, *fpgm=0; - sal_uInt8 *p; int i; int res; sal_uInt32 ver, rev; - sal_uInt8 *headP; sal_uInt8 *sfntP; sal_uInt32 sfntLen; @@ -2374,7 +2392,8 @@ int CreateT42FromTTGlyphs(TrueTypeFont *ttf, TrueTypeCreatorNewEmpty(T_true, &ttcr); /* head */ - headP = p = getTable(ttf, O_head); + const sal_uInt8* p = getTable(ttf, O_head); + const sal_uInt8* headP = p; assert(p != 0); head = TrueTypeTableNew_head(GetUInt32(p, 4, 1), GetUInt16(p, 16, 1), GetUInt16(p, 18, 1), p+20, GetUInt16(p, 44, 1), GetUInt16(p, 46, 1), GetInt16(p, 48, 1)); ver = GetUInt32(p, 0, 1); @@ -2551,13 +2570,21 @@ int GetTTGlyphCount( TrueTypeFont* ttf ) return ttf->nglyphs; } +bool GetSfntTable( TrueTypeFont* ttf, int nSubtableIndex, + const sal_uInt8** ppRawBytes, int* pRawLength ) +{ + if( (nSubtableIndex < 0) || (nSubtableIndex >= NUM_TAGS) ) + return false; + *pRawLength = ttf->tlens[ nSubtableIndex ]; + *ppRawBytes = ttf->tables[ nSubtableIndex ]; + bool bOk = (*pRawLength > 0) && (ppRawBytes != NULL); + return bOk; +} + TTSimpleGlyphMetrics *GetTTSimpleGlyphMetrics(TrueTypeFont *ttf, sal_uInt16 *glyphArray, int nGlyphs, int mode) { - sal_uInt8* pTable; - int i; - sal_uInt16 glyphID; + const sal_uInt8* pTable; sal_uInt32 n; - int UPEm = ttf->unitsPerEm; int nTableSize; if (mode == 0) { @@ -2576,9 +2603,10 @@ TTSimpleGlyphMetrics *GetTTSimpleGlyphMetrics(TrueTypeFont *ttf, sal_uInt16 *gly TTSimpleGlyphMetrics* res = (TTSimpleGlyphMetrics*)calloc(nGlyphs, sizeof(TTSimpleGlyphMetrics)); assert(res != 0); - for (i=0; iunitsPerEm; + for( int i = 0; i < nGlyphs; ++i) { int nAdvOffset, nLsbOffset; - glyphID = glyphArray[i]; + sal_uInt16 glyphID = glyphArray[i]; if (glyphID < n) { nAdvOffset = 4 * glyphID; @@ -2629,7 +2657,6 @@ TTSimpleGlyphMetrics *GetTTSimpleCharMetrics(TrueTypeFont * ttf, sal_uInt16 firs void GetTTGlobalFontInfo(TrueTypeFont *ttf, TTGlobalFontInfo *info) { - sal_uInt8 *table; int UPEm = ttf->unitsPerEm; memset(info, 0, sizeof(TTGlobalFontInfo)); @@ -2641,7 +2668,7 @@ void GetTTGlobalFontInfo(TrueTypeFont *ttf, TTGlobalFontInfo *info) info->psname = ttf->psname; info->symbolEncoded = (ttf->cmapType == CMAP_MS_Symbol); - table = getTable(ttf, O_OS2); + const sal_uInt8* table = getTable(ttf, O_OS2); if (table) { info->weight = GetUInt16(table, 4, 1); info->width = GetUInt16(table, 6, 1); @@ -2670,6 +2697,8 @@ void GetTTGlobalFontInfo(TrueTypeFont *ttf, TTGlobalFontInfo *info) } memcpy(info->panose, table + 32, 10); info->typeFlags = GetUInt16( table, 8, 1 ); + if( getTable(ttf, O_CFF) ) + info->typeFlags |= TYPEFLAG_PS_OPENTYPE; } table = getTable(ttf, O_post); @@ -2718,17 +2747,15 @@ void KernGlyphs(TrueTypeFont *ttf, sal_uInt16 *glyphs, int nglyphs, int wmode, K GlyphData *GetTTRawGlyphData(TrueTypeFont *ttf, sal_uInt32 glyphID) { - sal_uInt8 *glyf = getTable(ttf, O_glyf); - sal_uInt8 *hmtx = getTable(ttf, O_hmtx); - sal_uInt32 length; - ControlPoint *cp; + const sal_uInt8* glyf = getTable(ttf, O_glyf); + const sal_uInt8* hmtx = getTable(ttf, O_hmtx); int i, n, m; if( glyphID >= ttf->nglyphs ) return 0; /* #127161# check the glyph offsets */ - length = getTableSize( ttf, O_glyf ); + sal_uInt32 length = getTableSize( ttf, O_glyf ); if( length < ttf->goffsets[ glyphID+1 ] ) return 0; @@ -2737,7 +2764,7 @@ GlyphData *GetTTRawGlyphData(TrueTypeFont *ttf, sal_uInt32 glyphID) GlyphData* d = (GlyphData*)malloc(sizeof(GlyphData)); assert(d != 0); if (length > 0) { - sal_uInt8 *srcptr = glyf + ttf->goffsets[glyphID]; + const sal_uInt8* srcptr = glyf + ttf->goffsets[glyphID]; d->ptr = (sal_uInt8*)malloc((length + 1) & ~1); assert(d->ptr != 0); memcpy( d->ptr, srcptr, length ); d->compflag = (GetInt16( srcptr, 0, 1 ) < 0); @@ -2750,6 +2777,7 @@ GlyphData *GetTTRawGlyphData(TrueTypeFont *ttf, sal_uInt32 glyphID) d->nbytes = (sal_uInt16)((length + 1) & ~1); /* now calculate npoints and ncontours */ + ControlPoint *cp; n = GetTTGlyphPoints(ttf, glyphID, &cp); if (n != -1) { m = 0; @@ -2778,18 +2806,16 @@ GlyphData *GetTTRawGlyphData(TrueTypeFont *ttf, sal_uInt32 glyphID) int GetTTNameRecords(TrueTypeFont *ttf, NameRecord **nr) { - sal_uInt8 *table = getTable(ttf, O_name); + const sal_uInt8* table = getTable(ttf, O_name); int nTableSize = getTableSize(ttf, O_name ); sal_uInt16 n = GetUInt16(table, 2, 1); - sal_uInt8* rec_string = NULL; int nStrBase = GetUInt16(table, 4, 1); - NameRecord *rec; int i; *nr = 0; if (n == 0) return 0; - rec = (NameRecord*)calloc(n, sizeof(NameRecord)); + NameRecord* rec = (NameRecord*)calloc(n, sizeof(NameRecord)); for (i = 0; i < n; i++) { int nStrOffset = GetUInt16(table + 6, 10 + 12 * i, 1); @@ -2805,7 +2831,7 @@ int GetTTNameRecords(TrueTypeFont *ttf, NameRecord **nr) continue; } - rec_string = table + nStrBase + nStrOffset; + const sal_uInt8* rec_string = table + nStrBase + nStrOffset; // sanity check if( rec_string > (sal_uInt8*)ttf->ptr && rec_string < ((sal_uInt8*)ttf->ptr + ttf->fsize - rec[i].slen ) ) { diff --git a/vcl/source/fontsubset/ttcr.cxx b/vcl/source/fontsubset/ttcr.cxx index 7f9ae796142b..ebd00c1e7c50 100644 --- a/vcl/source/fontsubset/ttcr.cxx +++ b/vcl/source/fontsubset/ttcr.cxx @@ -32,10 +32,6 @@ * */ -#include -#include -#include - #if OSL_DEBUG_LEVEL == 0 # ifndef NDEBUG # define NDEBUG @@ -45,6 +41,7 @@ #include "ttcr.hxx" #include "list.h" +#include "string.h" @@ -96,7 +93,7 @@ _inline sal_uInt32 mkTag(sal_uInt8 a, sal_uInt8 b, sal_uInt8 c, sal_uInt8 d) { } /*- Data access macros for data stored in big-endian or little-endian format */ -_inline sal_Int16 GetInt16(const sal_uInt8 *ptr, sal_uInt32 offset, int bigendian) +_inline sal_Int16 GetInt16( const sal_uInt8* ptr, sal_uInt32 offset, int bigendian) { sal_Int16 t; assert(ptr != 0); @@ -110,7 +107,7 @@ _inline sal_Int16 GetInt16(const sal_uInt8 *ptr, sal_uInt32 offset, int bigendia return t; } -_inline sal_uInt16 GetUInt16(const sal_uInt8 *ptr, sal_uInt32 offset, int bigendian) +_inline sal_uInt16 GetUInt16( const sal_uInt8* ptr, sal_uInt32 offset, int bigendian) { sal_uInt16 t; assert(ptr != 0); @@ -124,7 +121,7 @@ _inline sal_uInt16 GetUInt16(const sal_uInt8 *ptr, sal_uInt32 offset, int bigend return t; } -_inline sal_Int32 GetInt32(const sal_uInt8 *ptr, sal_uInt32 offset, int bigendian) +_inline sal_Int32 GetInt32( const sal_uInt8* ptr, sal_uInt32 offset, int bigendian) { sal_Int32 t; assert(ptr != 0); @@ -140,7 +137,7 @@ _inline sal_Int32 GetInt32(const sal_uInt8 *ptr, sal_uInt32 offset, int bigendi return t; } -_inline sal_uInt32 GetUInt32(const sal_uInt8 *ptr, sal_uInt32 offset, int bigendian) +_inline sal_uInt32 GetUInt32( const sal_uInt8* ptr, sal_uInt32 offset, int bigendian) { sal_uInt32 t; assert(ptr != 0); @@ -968,7 +965,7 @@ static struct { TrueTypeTable *TrueTypeTableNew(sal_uInt32 tag, sal_uInt32 nbytes, - sal_uInt8 *ptr) + const sal_uInt8* ptr) { TrueTypeTable* table = (TrueTypeTable*)smalloc(sizeof(TrueTypeTable)); tdata_generic* pdata = (tdata_generic*)smalloc(sizeof(tdata_generic)); @@ -991,7 +988,7 @@ TrueTypeTable *TrueTypeTableNew(sal_uInt32 tag, TrueTypeTable *TrueTypeTableNew_head(sal_uInt32 fontRevision, sal_uInt16 flags, sal_uInt16 unitsPerEm, - sal_uInt8 *created, + const sal_uInt8* created, sal_uInt16 macStyle, sal_uInt16 lowestRecPPEM, sal_Int16 fontDirectionHint) @@ -1064,7 +1061,7 @@ TrueTypeTable *TrueTypeTableNew_loca(void) return table; } -TrueTypeTable *TrueTypeTableNew_maxp(sal_uInt8 *maxp, int size) +TrueTypeTable *TrueTypeTableNew_maxp( const sal_uInt8* maxp, int size) { TrueTypeTable* table = (TrueTypeTable*)smalloc(sizeof(TrueTypeTable)); table->data = ttmalloc(TABLESIZE_maxp); diff --git a/vcl/source/fontsubset/ttcr.hxx b/vcl/source/fontsubset/ttcr.hxx index 5b47f09d552a..04c617efc944 100644 --- a/vcl/source/fontsubset/ttcr.hxx +++ b/vcl/source/fontsubset/ttcr.hxx @@ -138,7 +138,7 @@ namespace vcl */ TrueTypeTable *TrueTypeTableNew(sal_uInt32 tag, sal_uInt32 nbytes, - sal_uInt8 *ptr); + const sal_uInt8* ptr); /** * Creates a new 'head' table for a TrueType font. @@ -149,7 +149,7 @@ namespace vcl TrueTypeTable *TrueTypeTableNew_head(sal_uInt32 fontRevision, sal_uInt16 flags, sal_uInt16 unitsPerEm, - sal_uInt8 *created, + const sal_uInt8 *created, sal_uInt16 macStyle, sal_uInt16 lowestRecPPEM, sal_Int16 fontDirectionHint); @@ -177,7 +177,7 @@ namespace vcl * size specifies the size of existing maxp table for * error-checking purposes */ - TrueTypeTable *TrueTypeTableNew_maxp(sal_uInt8 *maxp, int size); + TrueTypeTable *TrueTypeTableNew_maxp( const sal_uInt8* maxp, int size); /** * Creates a new empty 'glyf' table. diff --git a/vcl/source/fontsubset/u2big5.inc b/vcl/source/fontsubset/u2big5.inc deleted file mode 100644 index 951b65cffc25..000000000000 --- a/vcl/source/fontsubset/u2big5.inc +++ /dev/null @@ -1,1756 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// TODO: use generic RTL_TEXTENCODING_BIG5 to get rid of this file - -sal_uInt16pair xlat_1_3[13798] = { - {0x0020, 0x0020},{0x0021, 0x0021},{0x0022, 0x0022},{0x0023, 0x0023},{0x0024, 0x0024},{0x0025, 0x0025},{0x0026, 0x0026},{0x0027, 0x0027}, - {0x0028, 0x0028},{0x0029, 0x0029},{0x002A, 0x002A},{0x002B, 0x002B},{0x002C, 0x002C},{0x002D, 0x002D},{0x002E, 0x002E},{0x002F, 0x002F}, - {0x0030, 0x0030},{0x0031, 0x0031},{0x0032, 0x0032},{0x0033, 0x0033},{0x0034, 0x0034},{0x0035, 0x0035},{0x0036, 0x0036},{0x0037, 0x0037}, - {0x0038, 0x0038},{0x0039, 0x0039},{0x003A, 0x003A},{0x003B, 0x003B},{0x003C, 0x003C},{0x003D, 0x003D},{0x003E, 0x003E},{0x003F, 0x003F}, - {0x0040, 0x0040},{0x0041, 0x0041},{0x0042, 0x0042},{0x0043, 0x0043},{0x0044, 0x0044},{0x0045, 0x0045},{0x0046, 0x0046},{0x0047, 0x0047}, - {0x0048, 0x0048},{0x0049, 0x0049},{0x004A, 0x004A},{0x004B, 0x004B},{0x004C, 0x004C},{0x004D, 0x004D},{0x004E, 0x004E},{0x004F, 0x004F}, - {0x0050, 0x0050},{0x0051, 0x0051},{0x0052, 0x0052},{0x0053, 0x0053},{0x0054, 0x0054},{0x0055, 0x0055},{0x0056, 0x0056},{0x0057, 0x0057}, - {0x0058, 0x0058},{0x0059, 0x0059},{0x005A, 0x005A},{0x005B, 0x005B},{0x005C, 0x005C},{0x005D, 0x005D},{0x005E, 0x005E},{0x005F, 0x005F}, - {0x0060, 0x0060},{0x0061, 0x0061},{0x0062, 0x0062},{0x0063, 0x0063},{0x0064, 0x0064},{0x0065, 0x0065},{0x0066, 0x0066},{0x0067, 0x0067}, - {0x0068, 0x0068},{0x0069, 0x0069},{0x006A, 0x006A},{0x006B, 0x006B},{0x006C, 0x006C},{0x006D, 0x006D},{0x006E, 0x006E},{0x006F, 0x006F}, - {0x0070, 0x0070},{0x0071, 0x0071},{0x0072, 0x0072},{0x0073, 0x0073},{0x0074, 0x0074},{0x0075, 0x0075},{0x0076, 0x0076},{0x0077, 0x0077}, - {0x0078, 0x0078},{0x0079, 0x0079},{0x007A, 0x007A},{0x007B, 0x007B},{0x007C, 0x007C},{0x007D, 0x007D},{0x007E, 0x007E},{0x00A2, 0xA246}, - {0x00A3, 0xA247},{0x00A5, 0xA244},{0x00A7, 0xA1B1},{0x00B0, 0xA258},{0x00B1, 0xA1D3},{0x00B7, 0xA150},{0x00D7, 0xA1D1},{0x00F7, 0xA1D2}, - {0x02C7, 0xA3BE},{0x02C9, 0xA3BC},{0x02CA, 0xA3BD},{0x02CB, 0xA3BF},{0x02D9, 0xA3BB},{0x0391, 0xA344},{0x0392, 0xA345},{0x0393, 0xA346}, - {0x0394, 0xA347},{0x0395, 0xA348},{0x0396, 0xA349},{0x0397, 0xA34A},{0x0398, 0xA34B},{0x0399, 0xA34C},{0x039A, 0xA34D},{0x039B, 0xA34E}, - {0x039C, 0xA34F},{0x039D, 0xA350},{0x039E, 0xA351},{0x039F, 0xA352},{0x03A0, 0xA353},{0x03A1, 0xA354},{0x03A3, 0xA355},{0x03A4, 0xA356}, - {0x03A5, 0xA357},{0x03A6, 0xA358},{0x03A7, 0xA359},{0x03A8, 0xA35A},{0x03A9, 0xA35B},{0x03B1, 0xA35C},{0x03B2, 0xA35D},{0x03B3, 0xA35E}, - {0x03B4, 0xA35F},{0x03B5, 0xA360},{0x03B6, 0xA361},{0x03B7, 0xA362},{0x03B8, 0xA363},{0x03B9, 0xA364},{0x03BA, 0xA365},{0x03BB, 0xA366}, - {0x03BC, 0xA367},{0x03BD, 0xA368},{0x03BE, 0xA369},{0x03BF, 0xA36A},{0x03C0, 0xA36B},{0x03C1, 0xA36C},{0x03C3, 0xA36D},{0x03C4, 0xA36E}, - {0x03C5, 0xA36F},{0x03C6, 0xA370},{0x03C7, 0xA371},{0x03C8, 0xA372},{0x03C9, 0xA373},{0x0401, 0xC7B3},{0x0414, 0xC7B1},{0x0415, 0xC7B2}, - {0x0416, 0xC7B4},{0x0417, 0xC7B5},{0x0418, 0xC7B6},{0x0419, 0xC7B7},{0x041A, 0xC7B8},{0x041B, 0xC7B9},{0x041C, 0xC7BA},{0x0423, 0xC7BB}, - {0x0424, 0xC7BC},{0x0425, 0xC7BD},{0x0426, 0xC7BE},{0x0427, 0xC7BF},{0x0428, 0xC7C0},{0x0429, 0xC7C1},{0x042A, 0xC7C2},{0x042B, 0xC7C3}, - {0x042C, 0xC7C4},{0x042D, 0xC7C5},{0x042E, 0xC7C6},{0x042F, 0xC7C7},{0x0430, 0xC7C8},{0x0431, 0xC7C9},{0x0432, 0xC7CA},{0x0433, 0xC7CB}, - {0x0434, 0xC7CC},{0x0435, 0xC7CD},{0x0436, 0xC7CF},{0x0437, 0xC7D0},{0x0438, 0xC7D1},{0x0439, 0xC7D2},{0x043A, 0xC7D3},{0x043B, 0xC7D4}, - {0x043C, 0xC7D5},{0x043D, 0xC7D6},{0x043E, 0xC7D7},{0x043F, 0xC7D8},{0x0440, 0xC7D9},{0x0441, 0xC7DA},{0x0442, 0xC7DB},{0x0443, 0xC7DC}, - {0x0444, 0xC7DD},{0x0445, 0xC7DE},{0x0446, 0xC7DF},{0x0447, 0xC7E0},{0x0448, 0xC7E1},{0x0449, 0xC7E2},{0x044A, 0xC7E3},{0x044B, 0xC7E4}, - {0x044C, 0xC7E5},{0x044D, 0xC7E6},{0x044E, 0xC7E7},{0x044F, 0xC7E8},{0x0451, 0xC7CE},{0x2013, 0xA156},{0x2014, 0xA158},{0x2018, 0xA1A5}, - {0x2019, 0xA1A6},{0x201C, 0xA1A7},{0x201D, 0xA1A8},{0x2022, 0xA145},{0x2025, 0xA14C},{0x2026, 0xA14B},{0x2032, 0xA1AC},{0x2035, 0xA1AB}, - {0x203B, 0xA1B0},{0x203E, 0xA1C2},{0x2103, 0xA24A},{0x2105, 0xA1C1},{0x2109, 0xA24B},{0x2160, 0xA2B9},{0x2161, 0xA2BA},{0x2162, 0xA2BB}, - {0x2163, 0xA2BC},{0x2164, 0xA2BD},{0x2165, 0xA2BE},{0x2166, 0xA2BF},{0x2167, 0xA2C0},{0x2168, 0xA2C1},{0x2169, 0xA2C2},{0x2190, 0xA1F6}, - {0x2191, 0xA1F4},{0x2192, 0xA1F7},{0x2193, 0xA1F5},{0x2196, 0xA1F8},{0x2197, 0xA1F9},{0x2198, 0xA1FB},{0x2199, 0xA1FA},{0x221A, 0xA1D4}, - {0x221E, 0xA1DB},{0x221F, 0xA1E8},{0x2220, 0xA1E7},{0x2223, 0xA1FD},{0x2225, 0xA1FC},{0x2229, 0xA1E4},{0x222A, 0xA1E5},{0x222B, 0xA1EC}, - {0x222E, 0xA1ED},{0x2234, 0xA1EF},{0x2235, 0xA1EE},{0x223C, 0xA1E3},{0x2252, 0xA1DC},{0x2260, 0xA1DA},{0x2261, 0xA1DD},{0x2266, 0xA1D8}, - {0x2267, 0xA1D9},{0x22A5, 0xA1E6},{0x22BF, 0xA1E9},{0x2460, 0xC7E9},{0x2461, 0xC7EA},{0x2462, 0xC7EB},{0x2463, 0xC7EC},{0x2464, 0xC7ED}, - {0x2465, 0xC7EE},{0x2466, 0xC7EF},{0x2467, 0xC7F0},{0x2468, 0xC7F1},{0x2469, 0xC7F2},{0x2474, 0xC7F3},{0x2475, 0xC7F4},{0x2476, 0xC7F5}, - {0x2477, 0xC7F6},{0x2478, 0xC7F7},{0x2479, 0xC7F8},{0x247A, 0xC7F9},{0x247B, 0xC7FA},{0x247C, 0xC7FB},{0x247D, 0xC7FC},{0x2500, 0xA277}, - {0x2502, 0xA278},{0x250C, 0xA27A},{0x2510, 0xA27B},{0x2514, 0xA27C},{0x2518, 0xA27D},{0x251C, 0xA275},{0x2524, 0xA274},{0x252C, 0xA273}, - {0x2534, 0xA272},{0x253C, 0xA271},{0x2550, 0xA2A4},{0x255E, 0xA2A5},{0x2561, 0xA2A7},{0x256A, 0xA2A6},{0x256D, 0xA27E},{0x256E, 0xA2A1}, - {0x256F, 0xA2A3},{0x2570, 0xA2A2},{0x2571, 0xA2AC},{0x2572, 0xA2AD},{0x2573, 0xA2AE},{0x2581, 0xA262},{0x2582, 0xA263},{0x2583, 0xA264}, - {0x2584, 0xA265},{0x2585, 0xA266},{0x2586, 0xA267},{0x2587, 0xA268},{0x2588, 0xA269},{0x2589, 0xA270},{0x258A, 0xA26F},{0x258B, 0xA26E}, - {0x258C, 0xA26D},{0x258D, 0xA26C},{0x258E, 0xA26B},{0x258F, 0xA26A},{0x2594, 0xA276},{0x2595, 0xA279},{0x25A0, 0xA1BD},{0x25A1, 0xA1BC}, - {0x25B2, 0xA1B6},{0x25B3, 0xA1B5},{0x25BC, 0xA1BF},{0x25BD, 0xA1BE},{0x25C6, 0xA1BB},{0x25C7, 0xA1BA},{0x25CB, 0xA1B3},{0x25CE, 0xA1B7}, - {0x25CF, 0xA1B4},{0x25E2, 0xA2A8},{0x25E3, 0xA2A9},{0x25E4, 0xA2AB},{0x25E5, 0xA2AA},{0x2605, 0xA1B9},{0x2606, 0xA1B8},{0x2609, 0xA1F3}, - {0x2640, 0xA1F0},{0x2641, 0xA1F2},{0x2642, 0xA1F1},{0x3000, 0xA140},{0x3001, 0xA142},{0x3002, 0xA143},{0x3003, 0xA1B2},{0x3005, 0xC6A4}, - {0x3008, 0xA171},{0x3009, 0xA172},{0x300A, 0xA16D},{0x300B, 0xA16E},{0x300C, 0xA175},{0x300D, 0xA176},{0x300E, 0xA179},{0x300F, 0xA17A}, - {0x3010, 0xA169},{0x3011, 0xA16A},{0x3012, 0xA245},{0x3014, 0xA165},{0x3015, 0xA166},{0x301D, 0xA1A9},{0x301E, 0xA1AA},{0x3021, 0xA2C3}, - {0x3022, 0xA2C4},{0x3023, 0xA2C5},{0x3024, 0xA2C6},{0x3025, 0xA2C7},{0x3026, 0xA2C8},{0x3027, 0xA2C9},{0x3028, 0xA2CA},{0x3029, 0xA2CB}, - {0x3041, 0xC6A5},{0x3042, 0xC6A6},{0x3043, 0xC6A7},{0x3044, 0xC6A8},{0x3045, 0xC6A9},{0x3046, 0xC6AA},{0x3047, 0xC6AB},{0x3048, 0xC6AC}, - {0x3049, 0xC6AD},{0x304A, 0xC6AE},{0x304B, 0xC6AF},{0x304C, 0xC6B0},{0x304D, 0xC6B1},{0x304E, 0xC6B2},{0x304F, 0xC6B3},{0x3050, 0xC6B4}, - {0x3051, 0xC6B5},{0x3052, 0xC6B6},{0x3053, 0xC6B7},{0x3054, 0xC6B8},{0x3055, 0xC6B9},{0x3056, 0xC6BA},{0x3057, 0xC6BB},{0x3058, 0xC6BC}, - {0x3059, 0xC6BD},{0x305A, 0xC6BE},{0x305B, 0xC6BF},{0x305C, 0xC6C0},{0x305D, 0xC6C1},{0x305E, 0xC6C2},{0x305F, 0xC6C3},{0x3060, 0xC6C4}, - {0x3061, 0xC6C5},{0x3062, 0xC6C6},{0x3063, 0xC6C7},{0x3064, 0xC6C8},{0x3065, 0xC6C9},{0x3066, 0xC6CA},{0x3067, 0xC6CB},{0x3068, 0xC6CC}, - {0x3069, 0xC6CD},{0x306A, 0xC6CE},{0x306B, 0xC6CF},{0x306C, 0xC6D0},{0x306D, 0xC6D1},{0x306E, 0xC6D2},{0x306F, 0xC6D3},{0x3070, 0xC6D4}, - {0x3071, 0xC6D5},{0x3072, 0xC6D6},{0x3073, 0xC6D7},{0x3074, 0xC6D8},{0x3075, 0xC6D9},{0x3076, 0xC6DA},{0x3077, 0xC6DB},{0x3078, 0xC6DC}, - {0x3079, 0xC6DD},{0x307A, 0xC6DE},{0x307B, 0xC6DF},{0x307C, 0xC6E0},{0x307D, 0xC6E1},{0x307E, 0xC6E2},{0x307F, 0xC6E3},{0x3080, 0xC6E4}, - {0x3081, 0xC6E5},{0x3082, 0xC6E6},{0x3083, 0xC6E7},{0x3084, 0xC6E8},{0x3085, 0xC6E9},{0x3086, 0xC6EA},{0x3087, 0xC6EB},{0x3088, 0xC6EC}, - {0x3089, 0xC6ED},{0x308A, 0xC6EE},{0x308B, 0xC6EF},{0x308C, 0xC6F0},{0x308D, 0xC6F1},{0x308E, 0xC6F2},{0x308F, 0xC6F3},{0x3090, 0xC6F4}, - {0x3091, 0xC6F5},{0x3092, 0xC6F6},{0x3093, 0xC6F7},{0x309D, 0xC6A2},{0x309E, 0xC6A3},{0x30A1, 0xC6F8},{0x30A2, 0xC6F9},{0x30A3, 0xC6FA}, - {0x30A4, 0xC6FB},{0x30A5, 0xC6FC},{0x30A6, 0xC6FD},{0x30A7, 0xC6FE},{0x30A8, 0xC740},{0x30A9, 0xC741},{0x30AA, 0xC742},{0x30AB, 0xC743}, - {0x30AC, 0xC744},{0x30AD, 0xC745},{0x30AE, 0xC746},{0x30AF, 0xC747},{0x30B0, 0xC748},{0x30B1, 0xC749},{0x30B2, 0xC74A},{0x30B3, 0xC74B}, - {0x30B4, 0xC74C},{0x30B5, 0xC74D},{0x30B6, 0xC74E},{0x30B7, 0xC74F},{0x30B8, 0xC750},{0x30B9, 0xC751},{0x30BA, 0xC752},{0x30BB, 0xC753}, - {0x30BC, 0xC754},{0x30BD, 0xC755},{0x30BE, 0xC756},{0x30BF, 0xC757},{0x30C0, 0xC758},{0x30C1, 0xC759},{0x30C2, 0xC75A},{0x30C3, 0xC75B}, - {0x30C4, 0xC75C},{0x30C5, 0xC75D},{0x30C6, 0xC75E},{0x30C7, 0xC75F},{0x30C8, 0xC760},{0x30C9, 0xC761},{0x30CA, 0xC762},{0x30CB, 0xC763}, - {0x30CC, 0xC764},{0x30CD, 0xC765},{0x30CE, 0xC766},{0x30CF, 0xC767},{0x30D0, 0xC768},{0x30D1, 0xC769},{0x30D2, 0xC76A},{0x30D3, 0xC76B}, - {0x30D4, 0xC76C},{0x30D5, 0xC76D},{0x30D6, 0xC76E},{0x30D7, 0xC76F},{0x30D8, 0xC770},{0x30D9, 0xC771},{0x30DA, 0xC772},{0x30DB, 0xC773}, - {0x30DC, 0xC774},{0x30DD, 0xC775},{0x30DE, 0xC776},{0x30DF, 0xC777},{0x30E0, 0xC778},{0x30E1, 0xC779},{0x30E2, 0xC77A},{0x30E3, 0xC77B}, - {0x30E4, 0xC77C},{0x30E5, 0xC77D},{0x30E6, 0xC77E},{0x30E7, 0xC7A1},{0x30E8, 0xC7A2},{0x30E9, 0xC7A3},{0x30EA, 0xC7A4},{0x30EB, 0xC7A5}, - {0x30EC, 0xC7A6},{0x30ED, 0xC7A7},{0x30EE, 0xC7A8},{0x30EF, 0xC7A9},{0x30F0, 0xC7AA},{0x30F1, 0xC7AB},{0x30F2, 0xC7AC},{0x30F3, 0xC7AD}, - {0x30F4, 0xC7AE},{0x30F5, 0xC7AF},{0x30F6, 0xC7B0},{0x30FE, 0xC6A1},{0x3105, 0xA374},{0x3106, 0xA375},{0x3107, 0xA376},{0x3108, 0xA377}, - {0x3109, 0xA378},{0x310A, 0xA379},{0x310B, 0xA37A},{0x310C, 0xA37B},{0x310D, 0xA37C},{0x310E, 0xA37D},{0x310F, 0xA37E},{0x3110, 0xA3A1}, - {0x3111, 0xA3A2},{0x3112, 0xA3A3},{0x3113, 0xA3A4},{0x3114, 0xA3A5},{0x3115, 0xA3A6},{0x3116, 0xA3A7},{0x3117, 0xA3A8},{0x3118, 0xA3A9}, - {0x3119, 0xA3AA},{0x311A, 0xA3AB},{0x311B, 0xA3AC},{0x311C, 0xA3AD},{0x311D, 0xA3AE},{0x311E, 0xA3AF},{0x311F, 0xA3B0},{0x3120, 0xA3B1}, - {0x3121, 0xA3B2},{0x3122, 0xA3B3},{0x3123, 0xA3B4},{0x3124, 0xA3B5},{0x3125, 0xA3B6},{0x3126, 0xA3B7},{0x3127, 0xA3B8},{0x3128, 0xA3B9}, - {0x3129, 0xA3BA},{0x32A3, 0xA1C0},{0x338E, 0xA255},{0x338F, 0xA256},{0x339C, 0xA250},{0x339D, 0xA251},{0x339E, 0xA252},{0x33A1, 0xA254}, - {0x33C4, 0xA257},{0x33CE, 0xA253},{0x33D1, 0xA1EB},{0x33D2, 0xA1EA},{0x33D5, 0xA24F},{0x4E00, 0xA440},{0x4E01, 0xA442},{0x4E03, 0xA443}, - {0x4E07, 0xC945},{0x4E08, 0xA456},{0x4E09, 0xA454},{0x4E0A, 0xA457},{0x4E0B, 0xA455},{0x4E0C, 0xC946},{0x4E0D, 0xA4A3},{0x4E0E, 0xC94F}, - {0x4E0F, 0xC94D},{0x4E10, 0xA4A2},{0x4E11, 0xA4A1},{0x4E14, 0xA542},{0x4E15, 0xA541},{0x4E16, 0xA540},{0x4E18, 0xA543},{0x4E19, 0xA4FE}, - {0x4E1E, 0xA5E0},{0x4E1F, 0xA5E1},{0x4E26, 0xA8C3},{0x4E2B, 0xA458},{0x4E2D, 0xA4A4},{0x4E2E, 0xC950},{0x4E30, 0xA4A5},{0x4E31, 0xC963}, - {0x4E32, 0xA6EA},{0x4E33, 0xCBB1},{0x4E38, 0xA459},{0x4E39, 0xA4A6},{0x4E3B, 0xA544},{0x4E3C, 0xC964},{0x4E42, 0xC940},{0x4E43, 0xA444}, - {0x4E45, 0xA45B},{0x4E47, 0xC947},{0x4E48, 0xA45C},{0x4E4B, 0xA4A7},{0x4E4D, 0xA545},{0x4E4E, 0xA547},{0x4E4F, 0xA546},{0x4E52, 0xA5E2}, - {0x4E53, 0xA5E3},{0x4E56, 0xA8C4},{0x4E58, 0xADBC},{0x4E59, 0xA441},{0x4E5C, 0xC941},{0x4E5D, 0xA445},{0x4E5E, 0xA45E},{0x4E5F, 0xA45D}, - {0x4E69, 0xA5E4},{0x4E73, 0xA8C5},{0x4E7E, 0xB0AE},{0x4E7F, 0xD44B},{0x4E82, 0xB6C3},{0x4E83, 0xDCB1},{0x4E84, 0xDCB2},{0x4E86, 0xA446}, - {0x4E88, 0xA4A9},{0x4E8B, 0xA8C6},{0x4E8C, 0xA447},{0x4E8D, 0xC948},{0x4E8E, 0xA45F},{0x4E91, 0xA4AA},{0x4E92, 0xA4AC},{0x4E93, 0xC951}, - {0x4E94, 0xA4AD},{0x4E95, 0xA4AB},{0x4E99, 0xA5E5},{0x4E9B, 0xA8C7},{0x4E9E, 0xA8C8},{0x4E9F, 0xAB45},{0x4EA1, 0xA460},{0x4EA2, 0xA4AE}, - {0x4EA4, 0xA5E6},{0x4EA5, 0xA5E8},{0x4EA6, 0xA5E7},{0x4EA8, 0xA6EB},{0x4EAB, 0xA8C9},{0x4EAC, 0xA8CA},{0x4EAD, 0xAB46},{0x4EAE, 0xAB47}, - {0x4EB3, 0xADBD},{0x4EB6, 0xDCB3},{0x4EB9, 0xF6D6},{0x4EBA, 0xA448},{0x4EC0, 0xA4B0},{0x4EC1, 0xA4AF},{0x4EC2, 0xC952},{0x4EC3, 0xA4B1}, - {0x4EC4, 0xA4B7},{0x4EC6, 0xA4B2},{0x4EC7, 0xA4B3},{0x4EC8, 0xC954},{0x4EC9, 0xC953},{0x4ECA, 0xA4B5},{0x4ECB, 0xA4B6},{0x4ECD, 0xA4B4}, - {0x4ED4, 0xA54A},{0x4ED5, 0xA54B},{0x4ED6, 0xA54C},{0x4ED7, 0xA54D},{0x4ED8, 0xA549},{0x4ED9, 0xA550},{0x4EDA, 0xC96A},{0x4EDC, 0xC966}, - {0x4EDD, 0xC969},{0x4EDE, 0xA551},{0x4EDF, 0xA561},{0x4EE1, 0xC968},{0x4EE3, 0xA54E},{0x4EE4, 0xA54F},{0x4EE5, 0xA548},{0x4EE8, 0xC965}, - {0x4EE9, 0xC967},{0x4EF0, 0xA5F5},{0x4EF1, 0xC9B0},{0x4EF2, 0xA5F2},{0x4EF3, 0xA5F6},{0x4EF4, 0xC9BA},{0x4EF5, 0xC9AE},{0x4EF6, 0xA5F3}, - {0x4EF7, 0xC9B2},{0x4EFB, 0xA5F4},{0x4EFD, 0xA5F7},{0x4EFF, 0xA5E9},{0x4F00, 0xC9B1},{0x4F01, 0xA5F8},{0x4F02, 0xC9B5},{0x4F04, 0xC9B9}, - {0x4F05, 0xC9B6},{0x4F08, 0xC9B3},{0x4F09, 0xA5EA},{0x4F0A, 0xA5EC},{0x4F0B, 0xA5F9},{0x4F0D, 0xA5EE},{0x4F0E, 0xC9AB},{0x4F0F, 0xA5F1}, - {0x4F10, 0xA5EF},{0x4F11, 0xA5F0},{0x4F12, 0xC9BB},{0x4F13, 0xC9B8},{0x4F14, 0xC9AF},{0x4F15, 0xA5ED},{0x4F18, 0xC9AC},{0x4F19, 0xA5EB}, - {0x4F1D, 0xC9B4},{0x4F22, 0xC9B7},{0x4F2C, 0xC9AD},{0x4F2D, 0xCA66},{0x4F2F, 0xA742},{0x4F30, 0xA6F4},{0x4F33, 0xCA67},{0x4F34, 0xA6F1}, - {0x4F36, 0xA744},{0x4F38, 0xA6F9},{0x4F3A, 0xA6F8},{0x4F3B, 0xCA5B},{0x4F3C, 0xA6FC},{0x4F3D, 0xA6F7},{0x4F3E, 0xCA60},{0x4F3F, 0xCA68}, - {0x4F41, 0xCA64},{0x4F43, 0xA6FA},{0x4F46, 0xA6FD},{0x4F47, 0xA6EE},{0x4F48, 0xA747},{0x4F49, 0xCA5D},{0x4F4C, 0xCBBD},{0x4F4D, 0xA6EC}, - {0x4F4E, 0xA743},{0x4F4F, 0xA6ED},{0x4F50, 0xA6F5},{0x4F51, 0xA6F6},{0x4F52, 0xCA62},{0x4F53, 0xCA5E},{0x4F54, 0xA6FB},{0x4F55, 0xA6F3}, - {0x4F56, 0xCA5A},{0x4F57, 0xA6EF},{0x4F58, 0xCA65},{0x4F59, 0xA745},{0x4F5A, 0xA748},{0x4F5B, 0xA6F2},{0x4F5C, 0xA740},{0x4F5D, 0xA746}, - {0x4F5E, 0xA6F0},{0x4F5F, 0xCA63},{0x4F60, 0xA741},{0x4F61, 0xCA69},{0x4F62, 0xCA5C},{0x4F63, 0xA6FE},{0x4F64, 0xCA5F},{0x4F67, 0xCA61}, - {0x4F69, 0xA8D8},{0x4F6A, 0xCBBF},{0x4F6B, 0xCBCB},{0x4F6C, 0xA8D0},{0x4F6E, 0xCBCC},{0x4F6F, 0xA8CB},{0x4F70, 0xA8D5},{0x4F73, 0xA8CE}, - {0x4F74, 0xCBB9},{0x4F75, 0xA8D6},{0x4F76, 0xCBB8},{0x4F77, 0xCBBC},{0x4F78, 0xCBC3},{0x4F79, 0xCBC1},{0x4F7A, 0xA8DE},{0x4F7B, 0xA8D9}, - {0x4F7C, 0xCBB3},{0x4F7D, 0xCBB5},{0x4F7E, 0xA8DB},{0x4F7F, 0xA8CF},{0x4F80, 0xCBB6},{0x4F81, 0xCBC2},{0x4F82, 0xCBC9},{0x4F83, 0xA8D4}, - {0x4F84, 0xCBBB},{0x4F85, 0xCBB4},{0x4F86, 0xA8D3},{0x4F87, 0xCBB7},{0x4F88, 0xA8D7},{0x4F89, 0xCBBA},{0x4F8B, 0xA8D2},{0x4F8D, 0xA8CD}, - {0x4F8F, 0xA8DC},{0x4F90, 0xCBC4},{0x4F91, 0xA8DD},{0x4F92, 0xCBC8},{0x4F94, 0xCBC6},{0x4F95, 0xCBCA},{0x4F96, 0xA8DA},{0x4F97, 0xCBBE}, - {0x4F98, 0xCBB2},{0x4F9A, 0xCBC0},{0x4F9B, 0xA8D1},{0x4F9C, 0xCBC5},{0x4F9D, 0xA8CC},{0x4F9E, 0xCBC7},{0x4FAE, 0xAB56},{0x4FAF, 0xAB4A}, - {0x4FB2, 0xCDE0},{0x4FB3, 0xCDE8},{0x4FB5, 0xAB49},{0x4FB6, 0xAB51},{0x4FB7, 0xAB5D},{0x4FB9, 0xCDEE},{0x4FBA, 0xCDEC},{0x4FBB, 0xCDE7}, - {0x4FBF, 0xAB4B},{0x4FC0, 0xCDED},{0x4FC1, 0xCDE3},{0x4FC2, 0xAB59},{0x4FC3, 0xAB50},{0x4FC4, 0xAB58},{0x4FC5, 0xCDDE},{0x4FC7, 0xCDEA}, - {0x4FC9, 0xCDE1},{0x4FCA, 0xAB54},{0x4FCB, 0xCDE2},{0x4FCD, 0xCDDD},{0x4FCE, 0xAB5B},{0x4FCF, 0xAB4E},{0x4FD0, 0xAB57},{0x4FD1, 0xAB4D}, - {0x4FD3, 0xCDDF},{0x4FD4, 0xCDE4},{0x4FD6, 0xCDEB},{0x4FD7, 0xAB55},{0x4FD8, 0xAB52},{0x4FD9, 0xCDE6},{0x4FDA, 0xAB5A},{0x4FDB, 0xCDE9}, - {0x4FDC, 0xCDE5},{0x4FDD, 0xAB4F},{0x4FDE, 0xAB5C},{0x4FDF, 0xAB53},{0x4FE0, 0xAB4C},{0x4FE1, 0xAB48},{0x4FEC, 0xCDEF},{0x4FEE, 0xADD7}, - {0x4FEF, 0xADC1},{0x4FF1, 0xADD1},{0x4FF3, 0xADD6},{0x4FF4, 0xD0D0},{0x4FF5, 0xD0CF},{0x4FF6, 0xD0D4},{0x4FF7, 0xD0D5},{0x4FF8, 0xADC4}, - {0x4FFA, 0xADCD},{0x4FFE, 0xADDA},{0x5000, 0xADCE},{0x5005, 0xD0C9},{0x5006, 0xADC7},{0x5007, 0xD0CA},{0x5009, 0xADDC},{0x500B, 0xADD3}, - {0x500C, 0xADBE},{0x500D, 0xADBF},{0x500E, 0xD0DD},{0x500F, 0xB0BF},{0x5011, 0xADCC},{0x5012, 0xADCB},{0x5013, 0xD0CB},{0x5014, 0xADCF}, - {0x5015, 0xD45B},{0x5016, 0xADC6},{0x5017, 0xD0D6},{0x5018, 0xADD5},{0x5019, 0xADD4},{0x501A, 0xADCA},{0x501B, 0xD0CE},{0x501C, 0xD0D7}, - {0x501E, 0xD0C8},{0x501F, 0xADC9},{0x5020, 0xD0D8},{0x5021, 0xADD2},{0x5022, 0xD0CC},{0x5023, 0xADC0},{0x5025, 0xADC3},{0x5026, 0xADC2}, - {0x5027, 0xD0D9},{0x5028, 0xADD0},{0x5029, 0xADC5},{0x502A, 0xADD9},{0x502B, 0xADDB},{0x502C, 0xD0D3},{0x502D, 0xADD8},{0x502F, 0xD0DB}, - {0x5030, 0xD0CD},{0x5031, 0xD0DC},{0x5033, 0xD0D1},{0x5035, 0xD0DA},{0x5037, 0xD0D2},{0x503C, 0xADC8},{0x5040, 0xD463},{0x5041, 0xD457}, - {0x5043, 0xB0B3},{0x5045, 0xD45C},{0x5046, 0xD462},{0x5047, 0xB0B2},{0x5048, 0xD455},{0x5049, 0xB0B6},{0x504A, 0xD459},{0x504B, 0xD452}, - {0x504C, 0xB0B4},{0x504D, 0xD456},{0x504E, 0xB0B9},{0x504F, 0xB0BE},{0x5051, 0xD467},{0x5053, 0xD451},{0x5055, 0xB0BA},{0x5057, 0xD466}, - {0x505A, 0xB0B5},{0x505B, 0xD458},{0x505C, 0xB0B1},{0x505D, 0xD453},{0x505E, 0xD44F},{0x505F, 0xD45D},{0x5060, 0xD450},{0x5061, 0xD44E}, - {0x5062, 0xD45A},{0x5063, 0xD460},{0x5064, 0xD461},{0x5065, 0xB0B7},{0x5068, 0xD85B},{0x5069, 0xD45E},{0x506A, 0xD44D},{0x506B, 0xD45F}, - {0x506D, 0xB0C1},{0x506E, 0xD464},{0x506F, 0xB0C0},{0x5070, 0xD44C},{0x5072, 0xD454},{0x5073, 0xD465},{0x5074, 0xB0BC},{0x5075, 0xB0BB}, - {0x5076, 0xB0B8},{0x5077, 0xB0BD},{0x507A, 0xB0AF},{0x507D, 0xB0B0},{0x5080, 0xB3C8},{0x5082, 0xD85E},{0x5083, 0xD857},{0x5085, 0xB3C5}, - {0x5087, 0xD85F},{0x508B, 0xD855},{0x508C, 0xD858},{0x508D, 0xB3C4},{0x508E, 0xD859},{0x5091, 0xB3C7},{0x5092, 0xD85D},{0x5094, 0xD853}, - {0x5095, 0xD852},{0x5096, 0xB3C9},{0x5098, 0xB3CA},{0x5099, 0xB3C6},{0x509A, 0xB3CB},{0x509B, 0xD851},{0x509C, 0xD85C},{0x509D, 0xD85A}, - {0x509E, 0xD854},{0x50A2, 0xB3C3},{0x50A3, 0xD856},{0x50AC, 0xB6CA},{0x50AD, 0xB6C4},{0x50AE, 0xDCB7},{0x50AF, 0xB6CD},{0x50B0, 0xDCBD}, - {0x50B1, 0xDCC0},{0x50B2, 0xB6C6},{0x50B3, 0xB6C7},{0x50B4, 0xDCBA},{0x50B5, 0xB6C5},{0x50B6, 0xDCC3},{0x50B7, 0xB6CB},{0x50B8, 0xDCC4}, - {0x50BA, 0xDCBF},{0x50BB, 0xB6CC},{0x50BD, 0xDCB4},{0x50BE, 0xB6C9},{0x50BF, 0xDCB5},{0x50C1, 0xDCBE},{0x50C2, 0xDCBC},{0x50C4, 0xDCB8}, - {0x50C5, 0xB6C8},{0x50C6, 0xDCB6},{0x50C7, 0xB6CE},{0x50C8, 0xDCBB},{0x50C9, 0xDCC2},{0x50CA, 0xDCB9},{0x50CB, 0xDCC1},{0x50CE, 0xB9B6}, - {0x50CF, 0xB9B3},{0x50D1, 0xB9B4},{0x50D3, 0xE0F9},{0x50D4, 0xE0F1},{0x50D5, 0xB9B2},{0x50D6, 0xB9AF},{0x50D7, 0xE0F2},{0x50DA, 0xB9B1}, - {0x50DB, 0xE0F5},{0x50DD, 0xE0F7},{0x50E0, 0xE0FE},{0x50E3, 0xE0FD},{0x50E4, 0xE0F8},{0x50E5, 0xB9AE},{0x50E6, 0xE0F0},{0x50E7, 0xB9AC}, - {0x50E8, 0xE0F3},{0x50E9, 0xB9B7},{0x50EA, 0xE0F6},{0x50EC, 0xE0FA},{0x50ED, 0xB9B0},{0x50EE, 0xB9AD},{0x50EF, 0xE0FC},{0x50F0, 0xE0FB}, - {0x50F1, 0xB9B5},{0x50F3, 0xE0F4},{0x50F5, 0xBBF8},{0x50F6, 0xE4EC},{0x50F8, 0xE4E9},{0x50F9, 0xBBF9},{0x50FB, 0xBBF7},{0x50FD, 0xE4F0}, - {0x50FE, 0xE4ED},{0x50FF, 0xE4E6},{0x5100, 0xBBF6},{0x5102, 0xBBFA},{0x5103, 0xE4E7},{0x5104, 0xBBF5},{0x5105, 0xBBFD},{0x5106, 0xE4EA}, - {0x5107, 0xE4EB},{0x5108, 0xBBFB},{0x5109, 0xBBFC},{0x510A, 0xE4F1},{0x510B, 0xE4EE},{0x510C, 0xE4EF},{0x5110, 0xBEAA},{0x5111, 0xE8F8}, - {0x5112, 0xBEA7},{0x5113, 0xE8F5},{0x5114, 0xBEA9},{0x5115, 0xBEAB},{0x5117, 0xE8F6},{0x5118, 0xBEA8},{0x511A, 0xE8F7},{0x511C, 0xE8F4}, - {0x511F, 0xC076},{0x5120, 0xECBD},{0x5121, 0xC077},{0x5122, 0xECBB},{0x5124, 0xECBC},{0x5125, 0xECBA},{0x5126, 0xECB9},{0x5129, 0xECBE}, - {0x512A, 0xC075},{0x512D, 0xEFB8},{0x512E, 0xEFB9},{0x5130, 0xE4E8},{0x5131, 0xEFB7},{0x5132, 0xC078},{0x5133, 0xC35F},{0x5134, 0xF1EB}, - {0x5135, 0xF1EC},{0x5137, 0xC4D7},{0x5138, 0xC4D8},{0x5139, 0xF5C1},{0x513A, 0xF5C0},{0x513B, 0xC56C},{0x513C, 0xC56B},{0x513D, 0xF7D0}, - {0x513F, 0xA449},{0x5140, 0xA461},{0x5141, 0xA4B9},{0x5143, 0xA4B8},{0x5144, 0xA553},{0x5145, 0xA552},{0x5146, 0xA5FC},{0x5147, 0xA5FB}, - {0x5148, 0xA5FD},{0x5149, 0xA5FA},{0x514B, 0xA74A},{0x514C, 0xA749},{0x514D, 0xA74B},{0x5152, 0xA8E0},{0x5154, 0xA8DF},{0x5155, 0xA8E1}, - {0x5157, 0xAB5E},{0x5159, 0xA259},{0x515A, 0xD0DE},{0x515B, 0xA25A},{0x515C, 0xB0C2},{0x515D, 0xA25C},{0x515E, 0xA25B},{0x515F, 0xD860}, - {0x5161, 0xA25D},{0x5162, 0xB9B8},{0x5163, 0xA25E},{0x5165, 0xA44A},{0x5167, 0xA4BA},{0x5168, 0xA5FE},{0x5169, 0xA8E2},{0x516B, 0xA44B}, - {0x516C, 0xA4BD},{0x516D, 0xA4BB},{0x516E, 0xA4BC},{0x5171, 0xA640},{0x5175, 0xA74C},{0x5176, 0xA8E4},{0x5177, 0xA8E3},{0x5178, 0xA8E5}, - {0x517C, 0xADDD},{0x5180, 0xBEAC},{0x5187, 0xC94E},{0x5189, 0xA554},{0x518A, 0xA555},{0x518D, 0xA641},{0x518F, 0xCA6A},{0x5191, 0xAB60}, - {0x5192, 0xAB5F},{0x5193, 0xD0E0},{0x5194, 0xD0DF},{0x5195, 0xB0C3},{0x5197, 0xA4BE},{0x5198, 0xC955},{0x519E, 0xCBCD},{0x51A0, 0xAB61}, - {0x51A2, 0xADE0},{0x51A4, 0xADDE},{0x51A5, 0xADDF},{0x51AA, 0xBEAD},{0x51AC, 0xA556},{0x51B0, 0xA642},{0x51B1, 0xC9BC},{0x51B6, 0xA74D}, - {0x51B7, 0xA74E},{0x51B9, 0xCA6B},{0x51BC, 0xCBCE},{0x51BD, 0xA8E6},{0x51BE, 0xCBCF},{0x51C4, 0xD0E2},{0x51C5, 0xD0E3},{0x51C6, 0xADE3}, - {0x51C8, 0xD0E4},{0x51CA, 0xD0E1},{0x51CB, 0xADE4},{0x51CC, 0xADE2},{0x51CD, 0xADE1},{0x51CE, 0xD0E5},{0x51D0, 0xD468},{0x51D4, 0xD861}, - {0x51D7, 0xDCC5},{0x51D8, 0xE140},{0x51DC, 0xBBFE},{0x51DD, 0xBEAE},{0x51DE, 0xE8F9},{0x51E0, 0xA44C},{0x51E1, 0xA45A},{0x51F0, 0xB0C4}, - {0x51F1, 0xB3CD},{0x51F3, 0xB9B9},{0x51F5, 0xC942},{0x51F6, 0xA4BF},{0x51F8, 0xA559},{0x51F9, 0xA557},{0x51FA, 0xA558},{0x51FD, 0xA8E7}, - {0x5200, 0xA44D},{0x5201, 0xA44E},{0x5203, 0xA462},{0x5206, 0xA4C0},{0x5207, 0xA4C1},{0x5208, 0xA4C2},{0x5209, 0xC9BE},{0x520A, 0xA55A}, - {0x520C, 0xC96B},{0x520E, 0xA646},{0x5210, 0xC9BF},{0x5211, 0xA644},{0x5212, 0xA645},{0x5213, 0xC9BD},{0x5216, 0xA647},{0x5217, 0xA643}, - {0x521C, 0xCA6C},{0x521D, 0xAAEC},{0x521E, 0xCA6D},{0x5221, 0xCA6E},{0x5224, 0xA750},{0x5225, 0xA74F},{0x5228, 0xA753},{0x5229, 0xA751}, - {0x522A, 0xA752},{0x522E, 0xA8ED},{0x5230, 0xA8EC},{0x5231, 0xCBD4},{0x5232, 0xCBD1},{0x5233, 0xCBD2},{0x5235, 0xCBD0},{0x5236, 0xA8EE}, - {0x5237, 0xA8EA},{0x5238, 0xA8E9},{0x523A, 0xA8EB},{0x523B, 0xA8E8},{0x5241, 0xA8EF},{0x5243, 0xAB63},{0x5244, 0xCDF0},{0x5246, 0xCBD3}, - {0x5247, 0xAB68},{0x5249, 0xCDF1},{0x524A, 0xAB64},{0x524B, 0xAB67},{0x524C, 0xAB66},{0x524D, 0xAB65},{0x524E, 0xAB62},{0x5252, 0xD0E8}, - {0x5254, 0xADE7},{0x5255, 0xD0EB},{0x5256, 0xADE5},{0x525A, 0xD0E7},{0x525B, 0xADE8},{0x525C, 0xADE6},{0x525D, 0xADE9},{0x525E, 0xD0E9}, - {0x525F, 0xD0EA},{0x5261, 0xD0E6},{0x5262, 0xD0EC},{0x5269, 0xB3D1},{0x526A, 0xB0C5},{0x526B, 0xD469},{0x526C, 0xD46B},{0x526D, 0xD46A}, - {0x526E, 0xD46C},{0x526F, 0xB0C6},{0x5272, 0xB3CE},{0x5274, 0xB3CF},{0x5275, 0xB3D0},{0x5277, 0xB6D0},{0x5278, 0xDCC7},{0x527A, 0xDCC6}, - {0x527B, 0xDCC8},{0x527C, 0xDCC9},{0x527D, 0xB6D1},{0x527F, 0xB6CF},{0x5280, 0xE141},{0x5281, 0xE142},{0x5282, 0xB9BB},{0x5283, 0xB9BA}, - {0x5284, 0xE35A},{0x5287, 0xBC40},{0x5288, 0xBC41},{0x5289, 0xBC42},{0x528A, 0xBC44},{0x528B, 0xE4F2},{0x528C, 0xE4F3},{0x528D, 0xBC43}, - {0x5291, 0xBEAF},{0x5293, 0xBEB0},{0x5296, 0xF1ED},{0x5297, 0xF5C3},{0x5298, 0xF5C2},{0x5299, 0xF7D1},{0x529B, 0xA44F},{0x529F, 0xA55C}, - {0x52A0, 0xA55B},{0x52A3, 0xA648},{0x52A6, 0xC9C0},{0x52A9, 0xA755},{0x52AA, 0xA756},{0x52AB, 0xA754},{0x52AC, 0xA757},{0x52AD, 0xCA6F}, - {0x52AE, 0xCA70},{0x52BB, 0xA8F1},{0x52BC, 0xCBD5},{0x52BE, 0xA8F0},{0x52C0, 0xCDF2},{0x52C1, 0xAB6C},{0x52C2, 0xCDF3},{0x52C3, 0xAB6B}, - {0x52C7, 0xAB69},{0x52C9, 0xAB6A},{0x52CD, 0xD0ED},{0x52D2, 0xB0C7},{0x52D3, 0xD46E},{0x52D5, 0xB0CA},{0x52D6, 0xD46D},{0x52D7, 0xB1E5}, - {0x52D8, 0xB0C9},{0x52D9, 0xB0C8},{0x52DB, 0xB3D4},{0x52DD, 0xB3D3},{0x52DE, 0xB3D2},{0x52DF, 0xB6D2},{0x52E2, 0xB6D5},{0x52E3, 0xB6D6}, - {0x52E4, 0xB6D4},{0x52E6, 0xB6D3},{0x52E9, 0xE143},{0x52EB, 0xE144},{0x52EF, 0xE4F5},{0x52F0, 0xBC45},{0x52F1, 0xE4F4},{0x52F3, 0xBEB1}, - {0x52F4, 0xECBF},{0x52F5, 0xC079},{0x52F7, 0xF1EE},{0x52F8, 0xC455},{0x52FA, 0xA463},{0x52FB, 0xA4C3},{0x52FC, 0xC956},{0x52FE, 0xA4C4}, - {0x52FF, 0xA4C5},{0x5305, 0xA55D},{0x5306, 0xA55E},{0x5308, 0xA649},{0x5309, 0xCA71},{0x530A, 0xCBD6},{0x530B, 0xCBD7},{0x530D, 0xAB6D}, - {0x530E, 0xD0EE},{0x530F, 0xB0CC},{0x5310, 0xB0CB},{0x5311, 0xD863},{0x5312, 0xD862},{0x5315, 0xA450},{0x5316, 0xA4C6},{0x5317, 0xA55F}, - {0x5319, 0xB0CD},{0x531A, 0xC943},{0x531C, 0xC96C},{0x531D, 0xA560},{0x531F, 0xC9C2},{0x5320, 0xA64B},{0x5321, 0xA64A},{0x5322, 0xC9C1}, - {0x5323, 0xA758},{0x532A, 0xADEA},{0x532D, 0xD46F},{0x532F, 0xB6D7},{0x5330, 0xE145},{0x5331, 0xB9BC},{0x5334, 0xE8FA},{0x5337, 0xF3FD}, - {0x5339, 0xA4C7},{0x533C, 0xCBD8},{0x533D, 0xCDF4},{0x533E, 0xB0D0},{0x533F, 0xB0CE},{0x5340, 0xB0CF},{0x5341, 0xA451},{0x5343, 0xA464}, - {0x5344, 0xA2CD},{0x5345, 0xA4CA},{0x5347, 0xA4C9},{0x5348, 0xA4C8},{0x5349, 0xA563},{0x534A, 0xA562},{0x534C, 0xC96D},{0x534D, 0xC9C3}, - {0x5351, 0xA8F5},{0x5352, 0xA8F2},{0x5353, 0xA8F4},{0x5354, 0xA8F3},{0x5357, 0xAB6E},{0x535A, 0xB3D5},{0x535C, 0xA452},{0x535E, 0xA4CB}, - {0x5360, 0xA565},{0x5361, 0xA564},{0x5363, 0xCA72},{0x5366, 0xA8F6},{0x536C, 0xC957},{0x536E, 0xA567},{0x536F, 0xA566},{0x5370, 0xA64C}, - {0x5371, 0xA64D},{0x5372, 0xCA73},{0x5373, 0xA759},{0x5375, 0xA75A},{0x5377, 0xA8F7},{0x5378, 0xA8F8},{0x5379, 0xA8F9},{0x537B, 0xAB6F}, - {0x537C, 0xCDF5},{0x537F, 0xADEB},{0x5382, 0xC944},{0x5384, 0xA4CC},{0x538A, 0xC9C4},{0x538E, 0xCA74},{0x538F, 0xCA75},{0x5392, 0xCBD9}, - {0x5394, 0xCBDA},{0x5396, 0xCDF7},{0x5397, 0xCDF6},{0x5398, 0xCDF9},{0x5399, 0xCDF8},{0x539A, 0xAB70},{0x539C, 0xD470},{0x539D, 0xADED}, - {0x539E, 0xD0EF},{0x539F, 0xADEC},{0x53A4, 0xD864},{0x53A5, 0xB3D6},{0x53A7, 0xD865},{0x53AC, 0xE146},{0x53AD, 0xB9BD},{0x53B2, 0xBC46}, - {0x53B4, 0xF1EF},{0x53B9, 0xC958},{0x53BB, 0xA568},{0x53C3, 0xB0D1},{0x53C8, 0xA453},{0x53C9, 0xA465},{0x53CA, 0xA4CE},{0x53CB, 0xA4CD}, - {0x53CD, 0xA4CF},{0x53D4, 0xA8FB},{0x53D6, 0xA8FA},{0x53D7, 0xA8FC},{0x53DB, 0xAB71},{0x53DF, 0xADEE},{0x53E1, 0xE8FB},{0x53E2, 0xC24F}, - {0x53E3, 0xA466},{0x53E4, 0xA56A},{0x53E5, 0xA579},{0x53E6, 0xA574},{0x53E8, 0xA56F},{0x53E9, 0xA56E},{0x53EA, 0xA575},{0x53EB, 0xA573}, - {0x53EC, 0xA56C},{0x53ED, 0xA57A},{0x53EE, 0xA56D},{0x53EF, 0xA569},{0x53F0, 0xA578},{0x53F1, 0xA577},{0x53F2, 0xA576},{0x53F3, 0xA56B}, - {0x53F5, 0xA572},{0x53F8, 0xA571},{0x53FB, 0xA57B},{0x53FC, 0xA570},{0x5401, 0xA653},{0x5403, 0xA659},{0x5404, 0xA655},{0x5406, 0xA65B}, - {0x5407, 0xC9C5},{0x5408, 0xA658},{0x5409, 0xA64E},{0x540A, 0xA651},{0x540B, 0xA654},{0x540C, 0xA650},{0x540D, 0xA657},{0x540E, 0xA65A}, - {0x540F, 0xA64F},{0x5410, 0xA652},{0x5411, 0xA656},{0x5412, 0xA65C},{0x5418, 0xCA7E},{0x5419, 0xCA7B},{0x541B, 0xA767},{0x541C, 0xCA7C}, - {0x541D, 0xA75B},{0x541E, 0xA75D},{0x541F, 0xA775},{0x5420, 0xA770},{0x5424, 0xCAA5},{0x5425, 0xCA7D},{0x5426, 0xA75F},{0x5427, 0xA761}, - {0x5428, 0xCAA4},{0x5429, 0xA768},{0x542A, 0xCA78},{0x542B, 0xA774},{0x542C, 0xA776},{0x542D, 0xA75C},{0x542E, 0xA76D},{0x5430, 0xCA76}, - {0x5431, 0xA773},{0x5433, 0xA764},{0x5435, 0xA76E},{0x5436, 0xA76F},{0x5437, 0xCA77},{0x5438, 0xA76C},{0x5439, 0xA76A},{0x543B, 0xA76B}, - {0x543C, 0xA771},{0x543D, 0xCAA1},{0x543E, 0xA75E},{0x5440, 0xA772},{0x5441, 0xCAA3},{0x5442, 0xA766},{0x5443, 0xA763},{0x5445, 0xCA7A}, - {0x5446, 0xA762},{0x5447, 0xCAA6},{0x5448, 0xA765},{0x544A, 0xA769},{0x544E, 0xA760},{0x544F, 0xCAA2},{0x5454, 0xCA79},{0x5460, 0xCBEB}, - {0x5461, 0xCBEA},{0x5462, 0xA94F},{0x5463, 0xCBED},{0x5464, 0xCBEF},{0x5465, 0xCBE4},{0x5466, 0xCBE7},{0x5467, 0xCBEE},{0x5468, 0xA950}, - {0x546B, 0xCBE1},{0x546C, 0xCBE5},{0x546F, 0xCBE9},{0x5470, 0xCE49},{0x5471, 0xA94B},{0x5472, 0xCE4D},{0x5473, 0xA8FD},{0x5474, 0xCBE6}, - {0x5475, 0xA8FE},{0x5476, 0xA94C},{0x5477, 0xA945},{0x5478, 0xA941},{0x547A, 0xCBE2},{0x547B, 0xA944},{0x547C, 0xA949},{0x547D, 0xA952}, - {0x547E, 0xCBE3},{0x547F, 0xCBDC},{0x5480, 0xA943},{0x5481, 0xCBDD},{0x5482, 0xCBDF},{0x5484, 0xA946},{0x5486, 0xA948},{0x5487, 0xCBDB}, - {0x5488, 0xCBE0},{0x548B, 0xA951},{0x548C, 0xA94D},{0x548D, 0xCBE8},{0x548E, 0xA953},{0x5490, 0xA94A},{0x5491, 0xCBDE},{0x5492, 0xA947}, - {0x5495, 0xA942},{0x5496, 0xA940},{0x5498, 0xCBEC},{0x549A, 0xA94E},{0x54A0, 0xCE48},{0x54A1, 0xCDFB},{0x54A2, 0xCE4B},{0x54A5, 0xCDFD}, - {0x54A6, 0xAB78},{0x54A7, 0xABA8},{0x54A8, 0xAB74},{0x54A9, 0xABA7},{0x54AA, 0xAB7D},{0x54AB, 0xABA4},{0x54AC, 0xAB72},{0x54AD, 0xCDFC}, - {0x54AE, 0xCE43},{0x54AF, 0xABA3},{0x54B0, 0xCE4F},{0x54B1, 0xABA5},{0x54B3, 0xAB79},{0x54B6, 0xCE45},{0x54B7, 0xCE42},{0x54B8, 0xAB77}, - {0x54BA, 0xCDFA},{0x54BB, 0xABA6},{0x54BC, 0xCE4A},{0x54BD, 0xAB7C},{0x54BE, 0xCE4C},{0x54BF, 0xABA9},{0x54C0, 0xAB73},{0x54C1, 0xAB7E}, - {0x54C2, 0xAB7B},{0x54C3, 0xCE40},{0x54C4, 0xABA1},{0x54C5, 0xCE46},{0x54C6, 0xCE47},{0x54C7, 0xAB7A},{0x54C8, 0xABA2},{0x54C9, 0xAB76}, - {0x54CE, 0xAB75},{0x54CF, 0xCDFE},{0x54D6, 0xCE44},{0x54DE, 0xCE4E},{0x54E0, 0xD144},{0x54E1, 0xADFB},{0x54E2, 0xD0F1},{0x54E4, 0xD0F6}, - {0x54E5, 0xADF4},{0x54E6, 0xAE40},{0x54E7, 0xD0F4},{0x54E8, 0xADEF},{0x54E9, 0xADF9},{0x54EA, 0xADFE},{0x54EB, 0xD0FB},{0x54ED, 0xADFA}, - {0x54EE, 0xADFD},{0x54F1, 0xD0FE},{0x54F2, 0xADF5},{0x54F3, 0xD0F5},{0x54F7, 0xD142},{0x54F8, 0xD143},{0x54FA, 0xADF7},{0x54FB, 0xD141}, - {0x54FC, 0xADF3},{0x54FD, 0xAE43},{0x54FF, 0xD0F8},{0x5501, 0xADF1},{0x5503, 0xD146},{0x5504, 0xD0F9},{0x5505, 0xD0FD},{0x5506, 0xADF6}, - {0x5507, 0xAE42},{0x5508, 0xD0FA},{0x5509, 0xADFC},{0x550A, 0xD140},{0x550B, 0xD147},{0x550C, 0xD4A1},{0x550E, 0xD145},{0x550F, 0xAE44}, - {0x5510, 0xADF0},{0x5511, 0xD0FC},{0x5512, 0xD0F3},{0x5514, 0xADF8},{0x5517, 0xD0F2},{0x551A, 0xD0F7},{0x5526, 0xD0F0},{0x5527, 0xAE41}, - {0x552A, 0xD477},{0x552C, 0xB0E4},{0x552D, 0xD4A7},{0x552E, 0xB0E2},{0x552F, 0xB0DF},{0x5530, 0xD47C},{0x5531, 0xB0DB},{0x5532, 0xD4A2}, - {0x5533, 0xB0E6},{0x5534, 0xD476},{0x5535, 0xD47B},{0x5536, 0xD47A},{0x5537, 0xADF2},{0x5538, 0xB0E1},{0x5539, 0xD4A5},{0x553B, 0xD4A8}, - {0x553C, 0xD473},{0x553E, 0xB3E8},{0x5540, 0xD4A9},{0x5541, 0xB0E7},{0x5543, 0xB0D9},{0x5544, 0xB0D6},{0x5545, 0xD47E},{0x5546, 0xB0D3}, - {0x5548, 0xD4A6},{0x554A, 0xB0DA},{0x554B, 0xD4AA},{0x554D, 0xD474},{0x554E, 0xD4A4},{0x554F, 0xB0DD},{0x5550, 0xD475},{0x5551, 0xD478}, - {0x5552, 0xD47D},{0x5555, 0xB0DE},{0x5556, 0xB0DC},{0x5557, 0xB0E8},{0x555C, 0xB0E3},{0x555E, 0xB0D7},{0x555F, 0xB1D2},{0x5561, 0xB0D8}, - {0x5562, 0xD479},{0x5563, 0xB0E5},{0x5564, 0xB0E0},{0x5565, 0xD4A3},{0x5566, 0xB0D5},{0x556A, 0xB0D4},{0x5575, 0xD471},{0x5576, 0xD472}, - {0x5577, 0xD86A},{0x557B, 0xB3D7},{0x557C, 0xB3DA},{0x557D, 0xD875},{0x557E, 0xB3EE},{0x557F, 0xD878},{0x5580, 0xB3D8},{0x5581, 0xD871}, - {0x5582, 0xB3DE},{0x5583, 0xB3E4},{0x5584, 0xB5BD},{0x5587, 0xB3E2},{0x5588, 0xD86E},{0x5589, 0xB3EF},{0x558A, 0xB3DB},{0x558B, 0xB3E3}, - {0x558C, 0xD876},{0x558D, 0xDCD7},{0x558E, 0xD87B},{0x558F, 0xD86F},{0x5591, 0xD866},{0x5592, 0xD873},{0x5593, 0xD86D},{0x5594, 0xB3E1}, - {0x5595, 0xD879},{0x5598, 0xB3DD},{0x5599, 0xB3F1},{0x559A, 0xB3EA},{0x559C, 0xB3DF},{0x559D, 0xB3DC},{0x559F, 0xB3E7},{0x55A1, 0xD87A}, - {0x55A2, 0xD86C},{0x55A3, 0xD872},{0x55A4, 0xD874},{0x55A5, 0xD868},{0x55A6, 0xD877},{0x55A7, 0xB3D9},{0x55A8, 0xD867},{0x55AA, 0xB3E0}, - {0x55AB, 0xB3F0},{0x55AC, 0xB3EC},{0x55AD, 0xD869},{0x55AE, 0xB3E6},{0x55B1, 0xB3ED},{0x55B2, 0xB3E9},{0x55B3, 0xB3E5},{0x55B5, 0xD870}, - {0x55BB, 0xB3EB},{0x55BF, 0xDCD5},{0x55C0, 0xDCD1},{0x55C2, 0xDCE0},{0x55C3, 0xDCCA},{0x55C4, 0xDCD3},{0x55C5, 0xB6E5},{0x55C6, 0xB6E6}, - {0x55C7, 0xB6DE},{0x55C8, 0xDCDC},{0x55C9, 0xB6E8},{0x55CA, 0xDCCF},{0x55CB, 0xDCCE},{0x55CC, 0xDCCC},{0x55CD, 0xDCDE},{0x55CE, 0xB6DC}, - {0x55CF, 0xDCD8},{0x55D0, 0xDCCD},{0x55D1, 0xB6DF},{0x55D2, 0xDCD6},{0x55D3, 0xB6DA},{0x55D4, 0xDCD2},{0x55D5, 0xDCD9},{0x55D6, 0xDCDB}, - {0x55D9, 0xDCDF},{0x55DA, 0xB6E3},{0x55DB, 0xDCCB},{0x55DC, 0xB6DD},{0x55DD, 0xDCD0},{0x55DF, 0xB6D8},{0x55E1, 0xB6E4},{0x55E2, 0xDCDA}, - {0x55E3, 0xB6E0},{0x55E4, 0xB6E1},{0x55E5, 0xB6E7},{0x55E6, 0xB6DB},{0x55E7, 0xA25F},{0x55E8, 0xB6D9},{0x55E9, 0xDCD4},{0x55EF, 0xB6E2}, - {0x55F2, 0xDCDD},{0x55F6, 0xB9CD},{0x55F7, 0xB9C8},{0x55F9, 0xE155},{0x55FA, 0xE151},{0x55FC, 0xE14B},{0x55FD, 0xB9C2},{0x55FE, 0xB9BE}, - {0x55FF, 0xE154},{0x5600, 0xB9BF},{0x5601, 0xE14E},{0x5602, 0xE150},{0x5604, 0xE153},{0x5606, 0xB9C4},{0x5608, 0xB9CB},{0x5609, 0xB9C5}, - {0x560C, 0xE149},{0x560D, 0xB9C6},{0x560E, 0xB9C7},{0x560F, 0xE14C},{0x5610, 0xB9CC},{0x5612, 0xE14A},{0x5613, 0xE14F},{0x5614, 0xB9C3}, - {0x5615, 0xE148},{0x5616, 0xB9C9},{0x5617, 0xB9C1},{0x561B, 0xB9C0},{0x561C, 0xE14D},{0x561D, 0xE152},{0x561F, 0xB9CA},{0x5627, 0xE147}, - {0x5629, 0xBC4D},{0x562A, 0xE547},{0x562C, 0xE544},{0x562E, 0xBC47},{0x562F, 0xBC53},{0x5630, 0xBC54},{0x5632, 0xBC4A},{0x5633, 0xE542}, - {0x5634, 0xBC4C},{0x5635, 0xE4F9},{0x5636, 0xBC52},{0x5638, 0xE546},{0x5639, 0xBC49},{0x563A, 0xE548},{0x563B, 0xBC48},{0x563D, 0xE543}, - {0x563E, 0xE545},{0x563F, 0xBC4B},{0x5640, 0xE541},{0x5641, 0xE4FA},{0x5642, 0xE4F7},{0x5645, 0xD86B},{0x5646, 0xE4FD},{0x5648, 0xE4F6}, - {0x5649, 0xE4FC},{0x564A, 0xE4FB},{0x564C, 0xE4F8},{0x564E, 0xBC4F},{0x5653, 0xBC4E},{0x5657, 0xBC50},{0x5658, 0xE4FE},{0x5659, 0xBEB2}, - {0x565A, 0xE540},{0x565E, 0xE945},{0x5660, 0xE8FD},{0x5662, 0xBEBE},{0x5663, 0xE942},{0x5664, 0xBEB6},{0x5665, 0xBEBA},{0x5666, 0xE941}, - {0x5668, 0xBEB9},{0x5669, 0xBEB5},{0x566A, 0xBEB8},{0x566B, 0xBEB3},{0x566C, 0xBEBD},{0x566D, 0xE943},{0x566E, 0xE8FE},{0x566F, 0xBEBC}, - {0x5670, 0xE8FC},{0x5671, 0xBEBB},{0x5672, 0xE944},{0x5673, 0xE940},{0x5674, 0xBC51},{0x5676, 0xBEBF},{0x5677, 0xE946},{0x5678, 0xBEB7}, - {0x5679, 0xBEB4},{0x567E, 0xECC6},{0x567F, 0xECC8},{0x5680, 0xC07B},{0x5681, 0xECC9},{0x5682, 0xECC7},{0x5683, 0xECC5},{0x5684, 0xECC4}, - {0x5685, 0xC07D},{0x5686, 0xECC3},{0x5687, 0xC07E},{0x568C, 0xECC1},{0x568D, 0xECC2},{0x568E, 0xC07A},{0x568F, 0xC0A1},{0x5690, 0xC07C}, - {0x5693, 0xECC0},{0x5695, 0xC250},{0x5697, 0xEFBC},{0x5698, 0xEFBA},{0x5699, 0xEFBF},{0x569A, 0xEFBD},{0x569C, 0xEFBB},{0x569D, 0xEFBE}, - {0x56A5, 0xC360},{0x56A6, 0xF1F2},{0x56A7, 0xF1F3},{0x56A8, 0xC456},{0x56AA, 0xF1F4},{0x56AB, 0xF1F0},{0x56AC, 0xF1F5},{0x56AD, 0xF1F1}, - {0x56AE, 0xC251},{0x56B2, 0xF3FE},{0x56B3, 0xF441},{0x56B4, 0xC459},{0x56B5, 0xF440},{0x56B6, 0xC458},{0x56B7, 0xC457},{0x56BC, 0xC45A}, - {0x56BD, 0xF5C5},{0x56BE, 0xF5C6},{0x56C0, 0xC4DA},{0x56C1, 0xC4D9},{0x56C2, 0xC4DB},{0x56C3, 0xF5C4},{0x56C5, 0xF6D8},{0x56C6, 0xF6D7}, - {0x56C8, 0xC56D},{0x56C9, 0xC56F},{0x56CA, 0xC56E},{0x56CB, 0xF6D9},{0x56CC, 0xC5C8},{0x56CD, 0xF8A6},{0x56D1, 0xC5F1},{0x56D3, 0xF8A5}, - {0x56D4, 0xF8EE},{0x56D7, 0xC949},{0x56DA, 0xA57D},{0x56DB, 0xA57C},{0x56DD, 0xA65F},{0x56DE, 0xA65E},{0x56DF, 0xC9C7},{0x56E0, 0xA65D}, - {0x56E1, 0xC9C6},{0x56E4, 0xA779},{0x56E5, 0xCAA9},{0x56E7, 0xCAA8},{0x56EA, 0xA777},{0x56EB, 0xA77A},{0x56EE, 0xCAA7},{0x56F0, 0xA778}, - {0x56F7, 0xCBF0},{0x56F9, 0xCBF1},{0x56FA, 0xA954},{0x56FF, 0xABAA},{0x5701, 0xD148},{0x5702, 0xD149},{0x5703, 0xAE45},{0x5704, 0xAE46}, - {0x5707, 0xD4AC},{0x5708, 0xB0E9},{0x5709, 0xB0EB},{0x570A, 0xD4AB},{0x570B, 0xB0EA},{0x570C, 0xD87C},{0x570D, 0xB3F2},{0x5712, 0xB6E9}, - {0x5713, 0xB6EA},{0x5714, 0xDCE1},{0x5716, 0xB9CF},{0x5718, 0xB9CE},{0x571A, 0xE549},{0x571B, 0xE948},{0x571C, 0xE947},{0x571E, 0xF96B}, - {0x571F, 0xA467},{0x5720, 0xC959},{0x5722, 0xC96E},{0x5723, 0xC96F},{0x5728, 0xA662},{0x5729, 0xA666},{0x572A, 0xC9C9},{0x572C, 0xA664}, - {0x572D, 0xA663},{0x572E, 0xC9C8},{0x572F, 0xA665},{0x5730, 0xA661},{0x5733, 0xA660},{0x5734, 0xC9CA},{0x573B, 0xA7A6},{0x573E, 0xA7A3}, - {0x5740, 0xA77D},{0x5741, 0xCAAA},{0x5745, 0xCAAB},{0x5747, 0xA7A1},{0x5749, 0xCAAD},{0x574A, 0xA77B},{0x574B, 0xCAAE},{0x574C, 0xCAAC}, - {0x574D, 0xA77E},{0x574E, 0xA7A2},{0x574F, 0xA7A5},{0x5750, 0xA7A4},{0x5751, 0xA77C},{0x5752, 0xCAAF},{0x5761, 0xA959},{0x5762, 0xCBFE}, - {0x5764, 0xA95B},{0x5766, 0xA95A},{0x5768, 0xCC40},{0x5769, 0xA958},{0x576A, 0xA957},{0x576B, 0xCBF5},{0x576D, 0xCBF4},{0x576F, 0xCBF2}, - {0x5770, 0xCBF7},{0x5771, 0xCBF6},{0x5772, 0xCBF3},{0x5773, 0xCBFC},{0x5774, 0xCBFD},{0x5775, 0xCBFA},{0x5776, 0xCBF8},{0x5777, 0xA956}, - {0x577B, 0xCBFB},{0x577C, 0xA95C},{0x577D, 0xCC41},{0x5780, 0xCBF9},{0x5782, 0xABAB},{0x5783, 0xA955},{0x578B, 0xABAC},{0x578C, 0xCE54}, - {0x578F, 0xCE5A},{0x5793, 0xABB2},{0x5794, 0xCE58},{0x5795, 0xCE5E},{0x5797, 0xCE55},{0x5798, 0xCE59},{0x5799, 0xCE5B},{0x579A, 0xCE5D}, - {0x579B, 0xCE57},{0x579D, 0xCE56},{0x579E, 0xCE51},{0x579F, 0xCE52},{0x57A0, 0xABAD},{0x57A2, 0xABAF},{0x57A3, 0xABAE},{0x57A4, 0xCE53}, - {0x57A5, 0xCE5C},{0x57AE, 0xABB1},{0x57B5, 0xCE50},{0x57B6, 0xD153},{0x57B8, 0xD152},{0x57B9, 0xD157},{0x57BA, 0xD14E},{0x57BC, 0xD151}, - {0x57BD, 0xD150},{0x57BF, 0xD154},{0x57C1, 0xD158},{0x57C2, 0xAE47},{0x57C3, 0xAE4A},{0x57C6, 0xD14F},{0x57C7, 0xD155},{0x57CB, 0xAE49}, - {0x57CC, 0xD14A},{0x57CE, 0xABB0},{0x57CF, 0xD4BA},{0x57D0, 0xD156},{0x57D2, 0xD14D},{0x57D4, 0xAE48},{0x57D5, 0xD14C},{0x57DC, 0xD4B1}, - {0x57DF, 0xB0EC},{0x57E0, 0xB0F0},{0x57E1, 0xD4C1},{0x57E2, 0xD4AF},{0x57E3, 0xD4BD},{0x57E4, 0xB0F1},{0x57E5, 0xD4BF},{0x57E7, 0xD4C5}, - {0x57E9, 0xD4C9},{0x57EC, 0xD4C0},{0x57ED, 0xD4B4},{0x57EE, 0xD4BC},{0x57F0, 0xD4CA},{0x57F1, 0xD4C8},{0x57F2, 0xD4BE},{0x57F3, 0xD4B9}, - {0x57F4, 0xD4B2},{0x57F5, 0xD8A6},{0x57F6, 0xD4B0},{0x57F7, 0xB0F5},{0x57F8, 0xD4B7},{0x57F9, 0xB0F6},{0x57FA, 0xB0F2},{0x57FB, 0xD4AD}, - {0x57FC, 0xD4C3},{0x57FD, 0xD4B5},{0x5800, 0xD4B3},{0x5801, 0xD4C6},{0x5802, 0xB0F3},{0x5804, 0xD4CC},{0x5805, 0xB0ED},{0x5806, 0xB0EF}, - {0x5807, 0xD4BB},{0x5808, 0xD4B6},{0x5809, 0xAE4B},{0x580A, 0xB0EE},{0x580B, 0xD4B8},{0x580C, 0xD4C7},{0x580D, 0xD4CB},{0x580E, 0xD4C2}, - {0x5810, 0xD4C4},{0x5814, 0xD4AE},{0x5819, 0xD8A1},{0x581B, 0xD8AA},{0x581C, 0xD8A9},{0x581D, 0xB3FA},{0x581E, 0xD8A2},{0x5820, 0xB3FB}, - {0x5821, 0xB3F9},{0x5823, 0xD8A4},{0x5824, 0xB3F6},{0x5825, 0xD8A8},{0x5827, 0xD8A3},{0x5828, 0xD8A5},{0x5829, 0xD87D},{0x582A, 0xB3F4}, - {0x582C, 0xD8B2},{0x582D, 0xD8B1},{0x582E, 0xD8AE},{0x582F, 0xB3F3},{0x5830, 0xB3F7},{0x5831, 0xB3F8},{0x5832, 0xD14B},{0x5833, 0xD8AB}, - {0x5834, 0xB3F5},{0x5835, 0xB0F4},{0x5836, 0xD8AD},{0x5837, 0xD87E},{0x5838, 0xD8B0},{0x5839, 0xD8AF},{0x583B, 0xD8B3},{0x583D, 0xDCEF}, - {0x583F, 0xD8AC},{0x5848, 0xD8A7},{0x5849, 0xDCE7},{0x584A, 0xB6F4},{0x584B, 0xB6F7},{0x584C, 0xB6F2},{0x584D, 0xDCE6},{0x584E, 0xDCEA}, - {0x584F, 0xDCE5},{0x5851, 0xB6EC},{0x5852, 0xB6F6},{0x5853, 0xDCE2},{0x5854, 0xB6F0},{0x5855, 0xDCE9},{0x5857, 0xB6EE},{0x5858, 0xB6ED}, - {0x5859, 0xDCEC},{0x585A, 0xB6EF},{0x585B, 0xDCEE},{0x585D, 0xDCEB},{0x585E, 0xB6EB},{0x5862, 0xB6F5},{0x5863, 0xDCF0},{0x5864, 0xDCE4}, - {0x5865, 0xDCED},{0x5868, 0xDCE3},{0x586B, 0xB6F1},{0x586D, 0xB6F3},{0x586F, 0xDCE8},{0x5871, 0xDCF1},{0x5874, 0xE15D},{0x5875, 0xB9D0}, - {0x5876, 0xE163},{0x5879, 0xB9D5},{0x587A, 0xE15F},{0x587B, 0xE166},{0x587C, 0xE157},{0x587D, 0xB9D7},{0x587E, 0xB9D1},{0x587F, 0xE15C}, - {0x5880, 0xBC55},{0x5881, 0xE15B},{0x5882, 0xE164},{0x5883, 0xB9D2},{0x5885, 0xB9D6},{0x5886, 0xE15A},{0x5887, 0xE160},{0x5888, 0xE165}, - {0x5889, 0xE156},{0x588A, 0xB9D4},{0x588B, 0xE15E},{0x588E, 0xE162},{0x588F, 0xE168},{0x5890, 0xE158},{0x5891, 0xE161},{0x5893, 0xB9D3}, - {0x5894, 0xE167},{0x5898, 0xE159},{0x589C, 0xBC59},{0x589D, 0xE54B},{0x589E, 0xBC57},{0x589F, 0xBC56},{0x58A0, 0xE54D},{0x58A1, 0xE552}, - {0x58A3, 0xE54E},{0x58A5, 0xE551},{0x58A6, 0xBC5C},{0x58A8, 0xBEA5},{0x58A9, 0xBC5B},{0x58AB, 0xE54A},{0x58AC, 0xE550},{0x58AE, 0xBC5A}, - {0x58AF, 0xE54F},{0x58B1, 0xE54C},{0x58B3, 0xBC58},{0x58BA, 0xE94D},{0x58BC, 0xE94F},{0x58BD, 0xE94A},{0x58BE, 0xBEC1},{0x58BF, 0xE94C}, - {0x58C1, 0xBEC0},{0x58C2, 0xE94E},{0x58C5, 0xBEC3},{0x58C6, 0xE950},{0x58C7, 0xBEC2},{0x58C8, 0xE949},{0x58C9, 0xE94B},{0x58CE, 0xC0A5}, - {0x58CF, 0xECCC},{0x58D1, 0xC0A4},{0x58D2, 0xECCD},{0x58D3, 0xC0A3},{0x58D4, 0xECCB},{0x58D5, 0xC0A2},{0x58D6, 0xECCA},{0x58D8, 0xC253}, - {0x58D9, 0xC252},{0x58DA, 0xF1F6},{0x58DB, 0xF1F8},{0x58DD, 0xF1F7},{0x58DE, 0xC361},{0x58DF, 0xC362},{0x58E2, 0xC363},{0x58E3, 0xF442}, - {0x58E4, 0xC45B},{0x58E7, 0xF7D3},{0x58E8, 0xF7D2},{0x58E9, 0xC5F2},{0x58EB, 0xA468},{0x58EC, 0xA4D0},{0x58EF, 0xA7A7},{0x58F4, 0xCE5F}, - {0x58F9, 0xB3FC},{0x58FA, 0xB3FD},{0x58FC, 0xDCF2},{0x58FD, 0xB9D8},{0x58FE, 0xE169},{0x58FF, 0xE553},{0x5903, 0xC95A},{0x5906, 0xCAB0}, - {0x590C, 0xCC42},{0x590D, 0xCE60},{0x590E, 0xD159},{0x590F, 0xAE4C},{0x5912, 0xF1F9},{0x5914, 0xC4DC},{0x5915, 0xA469},{0x5916, 0xA57E}, - {0x5917, 0xC970},{0x5919, 0xA667},{0x591A, 0xA668},{0x591C, 0xA95D},{0x5920, 0xB0F7},{0x5922, 0xB9DA},{0x5924, 0xB9DB},{0x5925, 0xB9D9}, - {0x5927, 0xA46A},{0x5929, 0xA4D1},{0x592A, 0xA4D3},{0x592B, 0xA4D2},{0x592C, 0xC95B},{0x592D, 0xA4D4},{0x592E, 0xA5A1},{0x592F, 0xC971}, - {0x5931, 0xA5A2},{0x5937, 0xA669},{0x5938, 0xA66A},{0x593C, 0xC9CB},{0x593E, 0xA7A8},{0x5940, 0xCAB1},{0x5944, 0xA961},{0x5945, 0xCC43}, - {0x5947, 0xA95F},{0x5948, 0xA960},{0x5949, 0xA95E},{0x594A, 0xD15A},{0x594E, 0xABB6},{0x594F, 0xABB5},{0x5950, 0xABB7},{0x5951, 0xABB4}, - {0x5953, 0xCE61},{0x5954, 0xA962},{0x5955, 0xABB3},{0x5957, 0xAE4D},{0x5958, 0xAE4E},{0x595A, 0xAE4F},{0x595C, 0xD4CD},{0x5960, 0xB3FE}, - {0x5961, 0xD8B4},{0x5962, 0xB0F8},{0x5967, 0xB6F8},{0x5969, 0xB9DD},{0x596A, 0xB9DC},{0x596B, 0xE16A},{0x596D, 0xBC5D},{0x596E, 0xBEC4}, - {0x5970, 0xEFC0},{0x5971, 0xF6DA},{0x5972, 0xF7D4},{0x5973, 0xA46B},{0x5974, 0xA5A3},{0x5976, 0xA5A4},{0x5977, 0xC9D1},{0x5978, 0xA66C}, - {0x5979, 0xA66F},{0x597B, 0xC9CF},{0x597C, 0xC9CD},{0x597D, 0xA66E},{0x597E, 0xC9D0},{0x597F, 0xC9D2},{0x5980, 0xC9CC},{0x5981, 0xA671}, - {0x5982, 0xA670},{0x5983, 0xA66D},{0x5984, 0xA66B},{0x5985, 0xC9CE},{0x598A, 0xA7B3},{0x598D, 0xA7B0},{0x598E, 0xCAB6},{0x598F, 0xCAB9}, - {0x5990, 0xCAB8},{0x5992, 0xA7AA},{0x5993, 0xA7B2},{0x5996, 0xA7AF},{0x5997, 0xCAB5},{0x5998, 0xCAB3},{0x5999, 0xA7AE},{0x599D, 0xA7A9}, - {0x599E, 0xA7AC},{0x59A0, 0xCAB4},{0x59A1, 0xCABB},{0x59A2, 0xCAB7},{0x59A3, 0xA7AD},{0x59A4, 0xA7B1},{0x59A5, 0xA7B4},{0x59A6, 0xCAB2}, - {0x59A7, 0xCABA},{0x59A8, 0xA7AB},{0x59AE, 0xA967},{0x59AF, 0xA96F},{0x59B1, 0xCC4F},{0x59B2, 0xCC48},{0x59B3, 0xA970},{0x59B4, 0xCC53}, - {0x59B5, 0xCC44},{0x59B6, 0xCC4B},{0x59B9, 0xA966},{0x59BA, 0xCC45},{0x59BB, 0xA964},{0x59BC, 0xCC4C},{0x59BD, 0xCC50},{0x59BE, 0xA963}, - {0x59C0, 0xCC51},{0x59C1, 0xCC4A},{0x59C3, 0xCC4D},{0x59C5, 0xA972},{0x59C6, 0xA969},{0x59C7, 0xCC54},{0x59C8, 0xCC52},{0x59CA, 0xA96E}, - {0x59CB, 0xA96C},{0x59CC, 0xCC49},{0x59CD, 0xA96B},{0x59CE, 0xCC47},{0x59CF, 0xCC46},{0x59D0, 0xA96A},{0x59D1, 0xA968},{0x59D2, 0xA971}, - {0x59D3, 0xA96D},{0x59D4, 0xA965},{0x59D6, 0xCC4E},{0x59D8, 0xABB9},{0x59DA, 0xABC0},{0x59DB, 0xCE6F},{0x59DC, 0xABB8},{0x59DD, 0xCE67}, - {0x59DE, 0xCE63},{0x59E0, 0xCE73},{0x59E1, 0xCE62},{0x59E3, 0xABBB},{0x59E4, 0xCE6C},{0x59E5, 0xABBE},{0x59E6, 0xABC1},{0x59E8, 0xABBC}, - {0x59E9, 0xCE70},{0x59EA, 0xABBF},{0x59EC, 0xAE56},{0x59ED, 0xCE76},{0x59EE, 0xCE64},{0x59F1, 0xCE66},{0x59F2, 0xCE6D},{0x59F3, 0xCE71}, - {0x59F4, 0xCE75},{0x59F5, 0xCE72},{0x59F6, 0xCE6B},{0x59F7, 0xCE6E},{0x59FA, 0xCE68},{0x59FB, 0xABC3},{0x59FC, 0xCE6A},{0x59FD, 0xCE69}, - {0x59FE, 0xCE74},{0x59FF, 0xABBA},{0x5A00, 0xCE65},{0x5A01, 0xABC2},{0x5A03, 0xABBD},{0x5A09, 0xAE5C},{0x5A0A, 0xD162},{0x5A0C, 0xAE5B}, - {0x5A0F, 0xD160},{0x5A11, 0xAE50},{0x5A13, 0xAE55},{0x5A15, 0xD15F},{0x5A16, 0xD15C},{0x5A17, 0xD161},{0x5A18, 0xAE51},{0x5A19, 0xD15B}, - {0x5A1B, 0xAE54},{0x5A1C, 0xAE52},{0x5A1E, 0xD163},{0x5A1F, 0xAE53},{0x5A20, 0xAE57},{0x5A23, 0xAE58},{0x5A25, 0xAE5A},{0x5A29, 0xAE59}, - {0x5A2D, 0xD15D},{0x5A2E, 0xD15E},{0x5A33, 0xD164},{0x5A35, 0xD4D4},{0x5A36, 0xB0F9},{0x5A37, 0xD8C2},{0x5A38, 0xD4D3},{0x5A39, 0xD4E6}, - {0x5A3C, 0xB140},{0x5A3E, 0xD4E4},{0x5A40, 0xB0FE},{0x5A41, 0xB0FA},{0x5A42, 0xD4ED},{0x5A43, 0xD4DD},{0x5A44, 0xD4E0},{0x5A46, 0xB143}, - {0x5A47, 0xD4EA},{0x5A48, 0xD4E2},{0x5A49, 0xB0FB},{0x5A4A, 0xB144},{0x5A4C, 0xD4E7},{0x5A4D, 0xD4E5},{0x5A50, 0xD4D6},{0x5A51, 0xD4EB}, - {0x5A52, 0xD4DF},{0x5A53, 0xD4DA},{0x5A55, 0xD4D0},{0x5A56, 0xD4EC},{0x5A57, 0xD4DC},{0x5A58, 0xD4CF},{0x5A5A, 0xB142},{0x5A5B, 0xD4E1}, - {0x5A5C, 0xD4EE},{0x5A5D, 0xD4DE},{0x5A5E, 0xD4D2},{0x5A5F, 0xD4D7},{0x5A60, 0xD4CE},{0x5A62, 0xB141},{0x5A64, 0xD4DB},{0x5A65, 0xD4D8}, - {0x5A66, 0xB0FC},{0x5A67, 0xD4D1},{0x5A69, 0xD4E9},{0x5A6A, 0xB0FD},{0x5A6C, 0xD4D9},{0x5A6D, 0xD4D5},{0x5A70, 0xD4E8},{0x5A77, 0xB440}, - {0x5A78, 0xD8BB},{0x5A7A, 0xD8B8},{0x5A7B, 0xD8C9},{0x5A7C, 0xD8BD},{0x5A7D, 0xD8CA},{0x5A7F, 0xB442},{0x5A83, 0xD8C6},{0x5A84, 0xD8C3}, - {0x5A8A, 0xD8C4},{0x5A8B, 0xD8C7},{0x5A8C, 0xD8CB},{0x5A8E, 0xD4E3},{0x5A8F, 0xD8CD},{0x5A90, 0xDD47},{0x5A92, 0xB443},{0x5A93, 0xD8CE}, - {0x5A94, 0xD8B6},{0x5A95, 0xD8C0},{0x5A97, 0xD8C5},{0x5A9A, 0xB441},{0x5A9B, 0xB444},{0x5A9C, 0xD8CC},{0x5A9D, 0xD8CF},{0x5A9E, 0xD8BA}, - {0x5A9F, 0xD8B7},{0x5AA2, 0xD8B9},{0x5AA5, 0xD8BE},{0x5AA6, 0xD8BC},{0x5AA7, 0xB445},{0x5AA9, 0xD8C8},{0x5AAC, 0xD8BF},{0x5AAE, 0xD8C1}, - {0x5AAF, 0xD8B5},{0x5AB0, 0xDCFA},{0x5AB1, 0xDCF8},{0x5AB2, 0xB742},{0x5AB3, 0xB740},{0x5AB4, 0xDD43},{0x5AB5, 0xDCF9},{0x5AB6, 0xDD44}, - {0x5AB7, 0xDD40},{0x5AB8, 0xDCF7},{0x5AB9, 0xDD46},{0x5ABA, 0xDCF6},{0x5ABB, 0xDCFD},{0x5ABC, 0xB6FE},{0x5ABD, 0xB6FD},{0x5ABE, 0xB6FC}, - {0x5ABF, 0xDCFB},{0x5AC0, 0xDD41},{0x5AC1, 0xB6F9},{0x5AC2, 0xB741},{0x5AC4, 0xDCF4},{0x5AC6, 0xDCFE},{0x5AC7, 0xDCF3},{0x5AC8, 0xDCFC}, - {0x5AC9, 0xB6FA},{0x5ACA, 0xDD42},{0x5ACB, 0xDCF5},{0x5ACC, 0xB6FB},{0x5ACD, 0xDD45},{0x5AD5, 0xE16E},{0x5AD6, 0xB9E2},{0x5AD7, 0xB9E1}, - {0x5AD8, 0xB9E3},{0x5AD9, 0xE17A},{0x5ADA, 0xE170},{0x5ADB, 0xE176},{0x5ADC, 0xE16B},{0x5ADD, 0xE179},{0x5ADE, 0xE178},{0x5ADF, 0xE17C}, - {0x5AE0, 0xE175},{0x5AE1, 0xB9DE},{0x5AE2, 0xE174},{0x5AE3, 0xB9E4},{0x5AE5, 0xE16D},{0x5AE6, 0xB9DF},{0x5AE8, 0xE17B},{0x5AE9, 0xB9E0}, - {0x5AEA, 0xE16F},{0x5AEB, 0xE172},{0x5AEC, 0xE177},{0x5AED, 0xE171},{0x5AEE, 0xE16C},{0x5AF3, 0xE173},{0x5AF4, 0xE555},{0x5AF5, 0xBC61}, - {0x5AF6, 0xE558},{0x5AF7, 0xE557},{0x5AF8, 0xE55A},{0x5AF9, 0xE55C},{0x5AFB, 0xBC5F},{0x5AFD, 0xE556},{0x5AFF, 0xE554},{0x5B01, 0xE55D}, - {0x5B02, 0xE55B},{0x5B03, 0xE559},{0x5B05, 0xE55F},{0x5B07, 0xE55E},{0x5B08, 0xBC63},{0x5B09, 0xBC5E},{0x5B0B, 0xBC60},{0x5B0C, 0xBC62}, - {0x5B0F, 0xE560},{0x5B10, 0xE957},{0x5B13, 0xE956},{0x5B14, 0xE955},{0x5B16, 0xE958},{0x5B17, 0xE951},{0x5B19, 0xE952},{0x5B1A, 0xE95A}, - {0x5B1B, 0xE953},{0x5B1D, 0xBEC5},{0x5B1E, 0xE95C},{0x5B20, 0xE95B},{0x5B21, 0xE954},{0x5B23, 0xECD1},{0x5B24, 0xC0A8},{0x5B25, 0xECCF}, - {0x5B26, 0xECD4},{0x5B27, 0xECD3},{0x5B28, 0xE959},{0x5B2A, 0xC0A7},{0x5B2C, 0xECD2},{0x5B2D, 0xECCE},{0x5B2E, 0xECD6},{0x5B2F, 0xECD5}, - {0x5B30, 0xC0A6},{0x5B32, 0xECD0},{0x5B34, 0xBEC6},{0x5B38, 0xC254},{0x5B3C, 0xEFC1},{0x5B3D, 0xF1FA},{0x5B3E, 0xF1FB},{0x5B3F, 0xF1FC}, - {0x5B40, 0xC45C},{0x5B43, 0xC45D},{0x5B45, 0xF443},{0x5B47, 0xF5C8},{0x5B48, 0xF5C7},{0x5B4B, 0xF6DB},{0x5B4C, 0xF6DC},{0x5B4D, 0xF7D5}, - {0x5B4E, 0xF8A7},{0x5B50, 0xA46C},{0x5B51, 0xA46D},{0x5B53, 0xA46E},{0x5B54, 0xA4D5},{0x5B55, 0xA5A5},{0x5B56, 0xC9D3},{0x5B57, 0xA672}, - {0x5B58, 0xA673},{0x5B5A, 0xA7B7},{0x5B5B, 0xA7B8},{0x5B5C, 0xA7B6},{0x5B5D, 0xA7B5},{0x5B5F, 0xA973},{0x5B62, 0xCC55},{0x5B63, 0xA975}, - {0x5B64, 0xA974},{0x5B65, 0xCC56},{0x5B69, 0xABC4},{0x5B6B, 0xAE5D},{0x5B6C, 0xD165},{0x5B6E, 0xD4F0},{0x5B70, 0xB145},{0x5B71, 0xB447}, - {0x5B72, 0xD4EF},{0x5B73, 0xB446},{0x5B75, 0xB9E5},{0x5B77, 0xE17D},{0x5B78, 0xBEC7},{0x5B7A, 0xC0A9},{0x5B7B, 0xECD7},{0x5B7D, 0xC45E}, - {0x5B7F, 0xC570},{0x5B81, 0xC972},{0x5B83, 0xA5A6},{0x5B84, 0xC973},{0x5B85, 0xA676},{0x5B87, 0xA674},{0x5B88, 0xA675},{0x5B89, 0xA677}, - {0x5B8B, 0xA7BA},{0x5B8C, 0xA7B9},{0x5B8E, 0xCABC},{0x5B8F, 0xA7BB},{0x5B92, 0xCABD},{0x5B93, 0xCC57},{0x5B95, 0xCC58},{0x5B97, 0xA976}, - {0x5B98, 0xA978},{0x5B99, 0xA97A},{0x5B9A, 0xA977},{0x5B9B, 0xA97B},{0x5B9C, 0xA979},{0x5BA2, 0xABC8},{0x5BA3, 0xABC5},{0x5BA4, 0xABC7}, - {0x5BA5, 0xABC9},{0x5BA6, 0xABC6},{0x5BA7, 0xD166},{0x5BA8, 0xCE77},{0x5BAC, 0xD168},{0x5BAD, 0xD167},{0x5BAE, 0xAE63},{0x5BB0, 0xAE5F}, - {0x5BB3, 0xAE60},{0x5BB4, 0xAE62},{0x5BB5, 0xAE64},{0x5BB6, 0xAE61},{0x5BB8, 0xAE66},{0x5BB9, 0xAE65},{0x5BBF, 0xB14A},{0x5BC0, 0xD4F2}, - {0x5BC1, 0xD4F1},{0x5BC2, 0xB149},{0x5BC4, 0xB148},{0x5BC5, 0xB147},{0x5BC6, 0xB14B},{0x5BC7, 0xB146},{0x5BCA, 0xD8D5},{0x5BCB, 0xD8D2}, - {0x5BCC, 0xB449},{0x5BCD, 0xD8D1},{0x5BCE, 0xD8D6},{0x5BD0, 0xB44B},{0x5BD1, 0xD8D4},{0x5BD2, 0xB448},{0x5BD3, 0xB44A},{0x5BD4, 0xD8D3}, - {0x5BD6, 0xDD48},{0x5BD8, 0xDD49},{0x5BD9, 0xDD4A},{0x5BDE, 0xB9E6},{0x5BDF, 0xB9EE},{0x5BE0, 0xE17E},{0x5BE1, 0xB9E8},{0x5BE2, 0xB9EC}, - {0x5BE3, 0xE1A1},{0x5BE4, 0xB9ED},{0x5BE5, 0xB9E9},{0x5BE6, 0xB9EA},{0x5BE7, 0xB9E7},{0x5BE8, 0xB9EB},{0x5BE9, 0xBC66},{0x5BEA, 0xD8D0}, - {0x5BEB, 0xBC67},{0x5BEC, 0xBC65},{0x5BEE, 0xBC64},{0x5BEF, 0xE95D},{0x5BF0, 0xBEC8},{0x5BF1, 0xECD8},{0x5BF2, 0xECD9},{0x5BF5, 0xC364}, - {0x5BF6, 0xC45F},{0x5BF8, 0xA46F},{0x5BFA, 0xA678},{0x5C01, 0xABCA},{0x5C03, 0xD169},{0x5C04, 0xAE67},{0x5C07, 0xB14E},{0x5C08, 0xB14D}, - {0x5C09, 0xB14C},{0x5C0A, 0xB44C},{0x5C0B, 0xB44D},{0x5C0C, 0xD8D7},{0x5C0D, 0xB9EF},{0x5C0E, 0xBEC9},{0x5C0F, 0xA470},{0x5C10, 0xC95C}, - {0x5C11, 0xA4D6},{0x5C12, 0xC974},{0x5C15, 0xC9D4},{0x5C16, 0xA679},{0x5C1A, 0xA97C},{0x5C1F, 0xDD4B},{0x5C22, 0xA471},{0x5C24, 0xA4D7}, - {0x5C25, 0xC9D5},{0x5C28, 0xCABE},{0x5C2A, 0xCABF},{0x5C2C, 0xA7BC},{0x5C30, 0xD8D8},{0x5C31, 0xB44E},{0x5C33, 0xDD4C},{0x5C37, 0xC0AA}, - {0x5C38, 0xA472},{0x5C39, 0xA4A8},{0x5C3A, 0xA4D8},{0x5C3B, 0xC975},{0x5C3C, 0xA5A7},{0x5C3E, 0xA7C0},{0x5C3F, 0xA7BF},{0x5C40, 0xA7BD}, - {0x5C41, 0xA7BE},{0x5C44, 0xCC59},{0x5C45, 0xA97E},{0x5C46, 0xA9A1},{0x5C47, 0xCC5A},{0x5C48, 0xA97D},{0x5C4B, 0xABCE},{0x5C4C, 0xCE78}, - {0x5C4D, 0xABCD},{0x5C4E, 0xABCB},{0x5C4F, 0xABCC},{0x5C50, 0xAE6A},{0x5C51, 0xAE68},{0x5C54, 0xD16B},{0x5C55, 0xAE69},{0x5C56, 0xD16A}, - {0x5C58, 0xAE5E},{0x5C59, 0xD4F3},{0x5C5C, 0xB150},{0x5C5D, 0xB151},{0x5C60, 0xB14F},{0x5C62, 0xB9F0},{0x5C63, 0xE1A2},{0x5C64, 0xBC68}, - {0x5C65, 0xBC69},{0x5C67, 0xE561},{0x5C68, 0xC0AB},{0x5C69, 0xEFC2},{0x5C6A, 0xEFC3},{0x5C6C, 0xC4DD},{0x5C6D, 0xF8A8},{0x5C6E, 0xC94B}, - {0x5C6F, 0xA4D9},{0x5C71, 0xA473},{0x5C73, 0xC977},{0x5C74, 0xC976},{0x5C79, 0xA67A},{0x5C7A, 0xC9D7},{0x5C7B, 0xC9D8},{0x5C7C, 0xC9D6}, - {0x5C7E, 0xC9D9},{0x5C86, 0xCAC7},{0x5C88, 0xCAC2},{0x5C89, 0xCAC4},{0x5C8A, 0xCAC6},{0x5C8B, 0xCAC3},{0x5C8C, 0xA7C4},{0x5C8D, 0xCAC0}, - {0x5C8F, 0xCAC1},{0x5C90, 0xA7C1},{0x5C91, 0xA7C2},{0x5C92, 0xCAC5},{0x5C93, 0xCAC8},{0x5C94, 0xA7C3},{0x5C95, 0xCAC9},{0x5C9D, 0xCC68}, - {0x5C9F, 0xCC62},{0x5CA0, 0xCC5D},{0x5CA1, 0xA9A3},{0x5CA2, 0xCC65},{0x5CA3, 0xCC63},{0x5CA4, 0xCC5C},{0x5CA5, 0xCC69},{0x5CA6, 0xCC6C}, - {0x5CA7, 0xCC67},{0x5CA8, 0xCC60},{0x5CA9, 0xA9A5},{0x5CAA, 0xCC66},{0x5CAB, 0xA9A6},{0x5CAC, 0xCC61},{0x5CAD, 0xCC64},{0x5CAE, 0xCC5B}, - {0x5CAF, 0xCC5F},{0x5CB0, 0xCC6B},{0x5CB1, 0xA9A7},{0x5CB3, 0xA9A8},{0x5CB5, 0xCC5E},{0x5CB6, 0xCC6A},{0x5CB7, 0xA9A2},{0x5CB8, 0xA9A4}, - {0x5CC6, 0xCEAB},{0x5CC7, 0xCEA4},{0x5CC8, 0xCEAA},{0x5CC9, 0xCEA3},{0x5CCA, 0xCEA5},{0x5CCB, 0xCE7D},{0x5CCC, 0xCE7B},{0x5CCE, 0xCEAC}, - {0x5CCF, 0xCEA9},{0x5CD0, 0xCE79},{0x5CD2, 0xABD0},{0x5CD3, 0xCEA7},{0x5CD4, 0xCEA8},{0x5CD6, 0xCEA6},{0x5CD7, 0xCE7C},{0x5CD8, 0xCE7A}, - {0x5CD9, 0xABCF},{0x5CDA, 0xCEA2},{0x5CDB, 0xCE7E},{0x5CDE, 0xCEA1},{0x5CDF, 0xCEAD},{0x5CE8, 0xAE6F},{0x5CEA, 0xAE6E},{0x5CEC, 0xD16C}, - {0x5CED, 0xAE6B},{0x5CEE, 0xD16E},{0x5CF0, 0xAE70},{0x5CF1, 0xD16F},{0x5CF4, 0xAE73},{0x5CF6, 0xAE71},{0x5CF7, 0xD170},{0x5CF8, 0xCEAE}, - {0x5CF9, 0xD172},{0x5CFB, 0xAE6D},{0x5CFD, 0xAE6C},{0x5CFF, 0xD16D},{0x5D00, 0xD171},{0x5D01, 0xAE72},{0x5D06, 0xB153},{0x5D07, 0xB152}, - {0x5D0B, 0xD4F5},{0x5D0C, 0xD4F9},{0x5D0D, 0xD4FB},{0x5D0E, 0xB154},{0x5D0F, 0xD4FE},{0x5D11, 0xB158},{0x5D12, 0xD541},{0x5D14, 0xB15A}, - {0x5D16, 0xB156},{0x5D17, 0xB15E},{0x5D19, 0xB15B},{0x5D1A, 0xD4F7},{0x5D1B, 0xB155},{0x5D1D, 0xD4F6},{0x5D1E, 0xD4F4},{0x5D1F, 0xD543}, - {0x5D20, 0xD4F8},{0x5D22, 0xB157},{0x5D23, 0xD542},{0x5D24, 0xB15C},{0x5D25, 0xD4FD},{0x5D26, 0xD4FC},{0x5D27, 0xB15D},{0x5D28, 0xD4FA}, - {0x5D29, 0xB159},{0x5D2E, 0xD544},{0x5D30, 0xD540},{0x5D31, 0xD8E7},{0x5D32, 0xD8EE},{0x5D33, 0xD8E3},{0x5D34, 0xB451},{0x5D35, 0xD8DF}, - {0x5D36, 0xD8EF},{0x5D37, 0xD8D9},{0x5D38, 0xD8EC},{0x5D39, 0xD8EA},{0x5D3A, 0xD8E4},{0x5D3C, 0xD8ED},{0x5D3D, 0xD8E6},{0x5D3F, 0xD8DE}, - {0x5D40, 0xD8F0},{0x5D41, 0xD8DC},{0x5D42, 0xD8E9},{0x5D43, 0xD8DA},{0x5D45, 0xD8F1},{0x5D47, 0xB452},{0x5D49, 0xD8EB},{0x5D4A, 0xDD4F}, - {0x5D4B, 0xD8DD},{0x5D4C, 0xB44F},{0x5D4E, 0xD8E1},{0x5D50, 0xB450},{0x5D51, 0xD8E0},{0x5D52, 0xD8E5},{0x5D55, 0xD8E2},{0x5D59, 0xD8E8}, - {0x5D5E, 0xDD53},{0x5D62, 0xDD56},{0x5D63, 0xDD4E},{0x5D65, 0xDD50},{0x5D67, 0xDD55},{0x5D68, 0xDD54},{0x5D69, 0xB743},{0x5D6B, 0xD8DB}, - {0x5D6C, 0xDD52},{0x5D6F, 0xB744},{0x5D71, 0xDD4D},{0x5D72, 0xDD51},{0x5D77, 0xE1A9},{0x5D79, 0xE1B0},{0x5D7A, 0xE1A7},{0x5D7C, 0xE1AE}, - {0x5D7D, 0xE1A5},{0x5D7E, 0xE1AD},{0x5D7F, 0xE1B1},{0x5D80, 0xE1A4},{0x5D81, 0xE1A8},{0x5D82, 0xE1A3},{0x5D84, 0xB9F1},{0x5D86, 0xE1A6}, - {0x5D87, 0xB9F2},{0x5D88, 0xE1AC},{0x5D89, 0xE1AB},{0x5D8A, 0xE1AA},{0x5D8D, 0xE1AF},{0x5D92, 0xE565},{0x5D93, 0xE567},{0x5D94, 0xBC6B}, - {0x5D95, 0xE568},{0x5D97, 0xE563},{0x5D99, 0xE562},{0x5D9A, 0xE56C},{0x5D9C, 0xE56A},{0x5D9D, 0xBC6A},{0x5D9E, 0xE56D},{0x5D9F, 0xE564}, - {0x5DA0, 0xE569},{0x5DA1, 0xE56B},{0x5DA2, 0xE566},{0x5DA7, 0xE961},{0x5DA8, 0xE966},{0x5DA9, 0xE960},{0x5DAA, 0xE965},{0x5DAC, 0xE95E}, - {0x5DAD, 0xE968},{0x5DAE, 0xE964},{0x5DAF, 0xE969},{0x5DB0, 0xE963},{0x5DB1, 0xE95F},{0x5DB2, 0xE967},{0x5DB4, 0xE96A},{0x5DB5, 0xE962}, - {0x5DB7, 0xECDA},{0x5DB8, 0xC0AF},{0x5DBA, 0xC0AD},{0x5DBC, 0xC0AC},{0x5DBD, 0xC0AE},{0x5DC0, 0xEFC4},{0x5DC2, 0xF172},{0x5DC3, 0xF1FD}, - {0x5DC6, 0xF444},{0x5DC7, 0xF445},{0x5DC9, 0xC460},{0x5DCB, 0xF5C9},{0x5DCD, 0xC4DE},{0x5DCF, 0xF5CA},{0x5DD1, 0xF6DE},{0x5DD2, 0xC572}, - {0x5DD4, 0xC571},{0x5DD5, 0xF6DD},{0x5DD6, 0xC5C9},{0x5DD8, 0xF7D6},{0x5DDD, 0xA474},{0x5DDE, 0xA67B},{0x5DDF, 0xC9DA},{0x5DE0, 0xCACA}, - {0x5DE1, 0xA8B5},{0x5DE2, 0xB15F},{0x5DE5, 0xA475},{0x5DE6, 0xA5AA},{0x5DE7, 0xA5A9},{0x5DE8, 0xA5A8},{0x5DEB, 0xA7C5},{0x5DEE, 0xAE74}, - {0x5DF0, 0xDD57},{0x5DF1, 0xA476},{0x5DF2, 0xA477},{0x5DF3, 0xA478},{0x5DF4, 0xA4DA},{0x5DF7, 0xABD1},{0x5DF9, 0xCEAF},{0x5DFD, 0xB453}, - {0x5DFE, 0xA479},{0x5DFF, 0xC95D},{0x5E02, 0xA5AB},{0x5E03, 0xA5AC},{0x5E04, 0xC978},{0x5E06, 0xA67C},{0x5E0A, 0xCACB},{0x5E0C, 0xA7C6}, - {0x5E0E, 0xCACC},{0x5E11, 0xA9AE},{0x5E14, 0xCC6E},{0x5E15, 0xA9AC},{0x5E16, 0xA9AB},{0x5E17, 0xCC6D},{0x5E18, 0xA9A9},{0x5E19, 0xCC6F}, - {0x5E1A, 0xA9AA},{0x5E1B, 0xA9AD},{0x5E1D, 0xABD2},{0x5E1F, 0xABD4},{0x5E20, 0xCEB3},{0x5E21, 0xCEB0},{0x5E22, 0xCEB1},{0x5E23, 0xCEB2}, - {0x5E24, 0xCEB4},{0x5E25, 0xABD3},{0x5E28, 0xD174},{0x5E29, 0xD173},{0x5E2B, 0xAE76},{0x5E2D, 0xAE75},{0x5E33, 0xB162},{0x5E34, 0xD546}, - {0x5E36, 0xB161},{0x5E37, 0xB163},{0x5E38, 0xB160},{0x5E3D, 0xB455},{0x5E3E, 0xD545},{0x5E40, 0xB456},{0x5E41, 0xD8F3},{0x5E43, 0xB457}, - {0x5E44, 0xD8F2},{0x5E45, 0xB454},{0x5E4A, 0xDD5A},{0x5E4B, 0xDD5C},{0x5E4C, 0xB745},{0x5E4D, 0xDD5B},{0x5E4E, 0xDD59},{0x5E4F, 0xDD58}, - {0x5E53, 0xE1B4},{0x5E54, 0xB9F7},{0x5E55, 0xB9F5},{0x5E57, 0xB9F6},{0x5E58, 0xE1B2},{0x5E59, 0xE1B3},{0x5E5B, 0xB9F3},{0x5E5C, 0xE571}, - {0x5E5D, 0xE56F},{0x5E5F, 0xBC6D},{0x5E60, 0xE570},{0x5E61, 0xBC6E},{0x5E62, 0xBC6C},{0x5E63, 0xB9F4},{0x5E66, 0xE96D},{0x5E67, 0xE96B}, - {0x5E68, 0xE96C},{0x5E69, 0xE56E},{0x5E6A, 0xECDC},{0x5E6B, 0xC0B0},{0x5E6C, 0xECDB},{0x5E6D, 0xEFC5},{0x5E6E, 0xEFC6},{0x5E6F, 0xE96E}, - {0x5E70, 0xF1FE},{0x5E72, 0xA47A},{0x5E73, 0xA5AD},{0x5E74, 0xA67E},{0x5E75, 0xC9DB},{0x5E76, 0xA67D},{0x5E78, 0xA9AF},{0x5E79, 0xB746}, - {0x5E7B, 0xA4DB},{0x5E7C, 0xA5AE},{0x5E7D, 0xABD5},{0x5E7E, 0xB458},{0x5E80, 0xC979},{0x5E82, 0xC97A},{0x5E84, 0xC9DC},{0x5E87, 0xA7C8}, - {0x5E88, 0xCAD0},{0x5E89, 0xCACE},{0x5E8A, 0xA7C9},{0x5E8B, 0xCACD},{0x5E8C, 0xCACF},{0x5E8D, 0xCAD1},{0x5E8F, 0xA7C7},{0x5E95, 0xA9B3}, - {0x5E96, 0xA9B4},{0x5E97, 0xA9B1},{0x5E9A, 0xA9B0},{0x5E9B, 0xCEB8},{0x5E9C, 0xA9B2},{0x5EA0, 0xABD6},{0x5EA2, 0xCEB7},{0x5EA3, 0xCEB9}, - {0x5EA4, 0xCEB6},{0x5EA5, 0xCEBA},{0x5EA6, 0xABD7},{0x5EA7, 0xAE79},{0x5EA8, 0xD175},{0x5EAA, 0xD177},{0x5EAB, 0xAE77},{0x5EAC, 0xD178}, - {0x5EAD, 0xAE78},{0x5EAE, 0xD176},{0x5EB0, 0xCEB5},{0x5EB1, 0xD547},{0x5EB2, 0xD54A},{0x5EB3, 0xD54B},{0x5EB4, 0xD548},{0x5EB5, 0xB167}, - {0x5EB6, 0xB166},{0x5EB7, 0xB164},{0x5EB8, 0xB165},{0x5EB9, 0xD549},{0x5EBE, 0xB168},{0x5EC1, 0xB45A},{0x5EC2, 0xB45B},{0x5EC4, 0xB45C}, - {0x5EC5, 0xDD5D},{0x5EC6, 0xDD5F},{0x5EC7, 0xDD61},{0x5EC8, 0xB748},{0x5EC9, 0xB747},{0x5ECA, 0xB459},{0x5ECB, 0xDD60},{0x5ECC, 0xDD5E}, - {0x5ECE, 0xE1B8},{0x5ED1, 0xE1B6},{0x5ED2, 0xE1BC},{0x5ED3, 0xB9F8},{0x5ED4, 0xE1BD},{0x5ED5, 0xE1BA},{0x5ED6, 0xB9F9},{0x5ED7, 0xE1B7}, - {0x5ED8, 0xE1B5},{0x5ED9, 0xE1BB},{0x5EDA, 0xBC70},{0x5EDB, 0xE573},{0x5EDC, 0xE1B9},{0x5EDD, 0xBC72},{0x5EDE, 0xE574},{0x5EDF, 0xBC71}, - {0x5EE0, 0xBC74},{0x5EE1, 0xE575},{0x5EE2, 0xBC6F},{0x5EE3, 0xBC73},{0x5EE5, 0xE973},{0x5EE6, 0xE971},{0x5EE7, 0xE970},{0x5EE8, 0xE972}, - {0x5EE9, 0xE96F},{0x5EEC, 0xC366},{0x5EEE, 0xF446},{0x5EEF, 0xF447},{0x5EF1, 0xF5CB},{0x5EF2, 0xF6DF},{0x5EF3, 0xC655},{0x5EF6, 0xA9B5}, - {0x5EF7, 0xA7CA},{0x5EFA, 0xABD8},{0x5EFE, 0xA47B},{0x5EFF, 0xA4DC},{0x5F01, 0xA5AF},{0x5F02, 0xC9DD},{0x5F04, 0xA7CB},{0x5F05, 0xCAD2}, - {0x5F07, 0xCEBB},{0x5F08, 0xABD9},{0x5F0A, 0xB9FA},{0x5F0B, 0xA47C},{0x5F0F, 0xA6A1},{0x5F12, 0xB749},{0x5F13, 0xA47D},{0x5F14, 0xA4DD}, - {0x5F15, 0xA4DE},{0x5F17, 0xA5B1},{0x5F18, 0xA5B0},{0x5F1A, 0xC9DE},{0x5F1B, 0xA6A2},{0x5F1D, 0xCAD3},{0x5F1F, 0xA7CC},{0x5F22, 0xCC71}, - {0x5F23, 0xCC72},{0x5F24, 0xCC73},{0x5F26, 0xA9B6},{0x5F27, 0xA9B7},{0x5F28, 0xCC70},{0x5F29, 0xA9B8},{0x5F2D, 0xABDA},{0x5F2E, 0xCEBC}, - {0x5F30, 0xD17A},{0x5F31, 0xAE7A},{0x5F33, 0xD179},{0x5F35, 0xB169},{0x5F36, 0xD54C},{0x5F37, 0xB16A},{0x5F38, 0xD54D},{0x5F3C, 0xB45D}, - {0x5F40, 0xDD62},{0x5F43, 0xE1BF},{0x5F44, 0xE1BE},{0x5F46, 0xB9FB},{0x5F48, 0xBC75},{0x5F49, 0xE576},{0x5F4A, 0xBECA},{0x5F4B, 0xE974}, - {0x5F4C, 0xC0B1},{0x5F4E, 0xC573},{0x5F4F, 0xF7D8},{0x5F54, 0xCC74},{0x5F56, 0xCEBD},{0x5F57, 0xB16B},{0x5F58, 0xD8F4},{0x5F59, 0xB74A}, - {0x5F5D, 0xC255},{0x5F62, 0xA7CE},{0x5F64, 0xA7CD},{0x5F65, 0xABDB},{0x5F67, 0xD17B},{0x5F69, 0xB16D},{0x5F6A, 0xB343},{0x5F6B, 0xB16E}, - {0x5F6C, 0xB16C},{0x5F6D, 0xB45E},{0x5F6F, 0xE1C0},{0x5F70, 0xB9FC},{0x5F71, 0xBC76},{0x5F73, 0xC94C},{0x5F74, 0xC9DF},{0x5F76, 0xCAD5}, - {0x5F77, 0xA7CF},{0x5F78, 0xCAD4},{0x5F79, 0xA7D0},{0x5F7C, 0xA9BC},{0x5F7D, 0xCC77},{0x5F7E, 0xCC76},{0x5F7F, 0xA9BB},{0x5F80, 0xA9B9}, - {0x5F81, 0xA9BA},{0x5F82, 0xCC75},{0x5F85, 0xABDD},{0x5F86, 0xCEBE},{0x5F87, 0xABE0},{0x5F88, 0xABDC},{0x5F89, 0xABE2},{0x5F8A, 0xABDE}, - {0x5F8B, 0xABDF},{0x5F8C, 0xABE1},{0x5F90, 0xAE7D},{0x5F91, 0xAE7C},{0x5F92, 0xAE7B},{0x5F96, 0xD54F},{0x5F97, 0xB16F},{0x5F98, 0xB172}, - {0x5F99, 0xB170},{0x5F9B, 0xD54E},{0x5F9C, 0xB175},{0x5F9E, 0xB171},{0x5F9F, 0xD550},{0x5FA0, 0xB174},{0x5FA1, 0xB173},{0x5FA5, 0xD8F6}, - {0x5FA6, 0xD8F5},{0x5FA8, 0xB461},{0x5FA9, 0xB45F},{0x5FAA, 0xB460},{0x5FAB, 0xD8F7},{0x5FAC, 0xB74B},{0x5FAD, 0xDD64},{0x5FAE, 0xB74C}, - {0x5FAF, 0xDD63},{0x5FB2, 0xE577},{0x5FB5, 0xBC78},{0x5FB6, 0xE1C1},{0x5FB7, 0xBC77},{0x5FB9, 0xB9FD},{0x5FBB, 0xECDE},{0x5FBC, 0xE975}, - {0x5FBD, 0xC0B2},{0x5FBE, 0xECDD},{0x5FBF, 0xF240},{0x5FC0, 0xF448},{0x5FC1, 0xF449},{0x5FC3, 0xA4DF},{0x5FC5, 0xA5B2},{0x5FC9, 0xC97B}, - {0x5FCC, 0xA7D2},{0x5FCD, 0xA7D4},{0x5FCF, 0xC9E2},{0x5FD0, 0xCAD8},{0x5FD1, 0xCAD7},{0x5FD2, 0xCAD6},{0x5FD4, 0xC9E1},{0x5FD5, 0xC9E0}, - {0x5FD6, 0xA6A4},{0x5FD7, 0xA7D3},{0x5FD8, 0xA7D1},{0x5FD9, 0xA6A3},{0x5FDD, 0xA9BD},{0x5FDE, 0xCC78},{0x5FE0, 0xA9BE},{0x5FE1, 0xCADD}, - {0x5FE3, 0xCADF},{0x5FE4, 0xCADE},{0x5FE5, 0xCC79},{0x5FE8, 0xCADA},{0x5FEA, 0xA7D8},{0x5FEB, 0xA7D6},{0x5FED, 0xCAD9},{0x5FEE, 0xCADB}, - {0x5FEF, 0xCAE1},{0x5FF1, 0xA7D5},{0x5FF3, 0xCADC},{0x5FF4, 0xCAE5},{0x5FF5, 0xA9C0},{0x5FF7, 0xCAE2},{0x5FF8, 0xA7D7},{0x5FFA, 0xCAE0}, - {0x5FFB, 0xCAE3},{0x5FFD, 0xA9BF},{0x5FFF, 0xA9C1},{0x6000, 0xCAE4},{0x6009, 0xCCAF},{0x600A, 0xCCA2},{0x600B, 0xCC7E},{0x600C, 0xCCAE}, - {0x600D, 0xCCA9},{0x600E, 0xABE7},{0x600F, 0xA9C2},{0x6010, 0xCCAA},{0x6011, 0xCCAD},{0x6012, 0xABE3},{0x6013, 0xCCAC},{0x6014, 0xA9C3}, - {0x6015, 0xA9C8},{0x6016, 0xA9C6},{0x6017, 0xCCA3},{0x6019, 0xCC7C},{0x601A, 0xCCA5},{0x601B, 0xA9CD},{0x601C, 0xCCB0},{0x601D, 0xABE4}, - {0x601E, 0xCCA6},{0x6020, 0xABE5},{0x6021, 0xA9C9},{0x6022, 0xCCA8},{0x6024, 0xCECD},{0x6025, 0xABE6},{0x6026, 0xCC7B},{0x6027, 0xA9CA}, - {0x6028, 0xABE8},{0x6029, 0xA9CB},{0x602A, 0xA9C7},{0x602B, 0xA9CC},{0x602C, 0xCCA7},{0x602D, 0xCC7A},{0x602E, 0xCCAB},{0x602F, 0xA9C4}, - {0x6032, 0xCC7D},{0x6033, 0xCCA4},{0x6034, 0xCCA1},{0x6035, 0xA9C5},{0x6037, 0xCEBF},{0x6039, 0xCEC0},{0x6040, 0xCECA},{0x6041, 0xD1A1}, - {0x6042, 0xCECB},{0x6043, 0xABEE},{0x6044, 0xCECE},{0x6045, 0xCEC4},{0x6046, 0xABED},{0x6047, 0xCEC6},{0x6049, 0xCEC7},{0x604C, 0xCEC9}, - {0x604D, 0xABE9},{0x6050, 0xAEA3},{0x6053, 0xCEC5},{0x6054, 0xCEC1},{0x6055, 0xAEA4},{0x6058, 0xCECF},{0x6059, 0xAE7E},{0x605A, 0xD17D}, - {0x605B, 0xCEC8},{0x605D, 0xD17C},{0x605E, 0xCEC3},{0x605F, 0xCECC},{0x6062, 0xABEC},{0x6063, 0xAEA1},{0x6064, 0xABF2},{0x6065, 0xAEA2}, - {0x6066, 0xCED0},{0x6067, 0xD17E},{0x6068, 0xABEB},{0x6069, 0xAEA6},{0x606A, 0xABF1},{0x606B, 0xABF0},{0x606C, 0xABEF},{0x606D, 0xAEA5}, - {0x606E, 0xCED1},{0x606F, 0xAEA7},{0x6070, 0xABEA},{0x6072, 0xCEC2},{0x607F, 0xB176},{0x6080, 0xD1A4},{0x6081, 0xD1A6},{0x6083, 0xD1A8}, - {0x6084, 0xAEA8},{0x6085, 0xAEAE},{0x6086, 0xD553},{0x6087, 0xD1AC},{0x6088, 0xD1A3},{0x6089, 0xB178},{0x608A, 0xD551},{0x608C, 0xAEAD}, - {0x608D, 0xAEAB},{0x608E, 0xD1AE},{0x6090, 0xD552},{0x6092, 0xD1A5},{0x6094, 0xAEAC},{0x6095, 0xD1A9},{0x6096, 0xAEAF},{0x6097, 0xD1AB}, - {0x609A, 0xAEAA},{0x609B, 0xD1AA},{0x609C, 0xD1AD},{0x609D, 0xD1A7},{0x609F, 0xAEA9},{0x60A0, 0xB179},{0x60A2, 0xD1A2},{0x60A3, 0xB177}, - {0x60A8, 0xB17A},{0x60B0, 0xD555},{0x60B1, 0xD55E},{0x60B2, 0xB464},{0x60B4, 0xB17C},{0x60B5, 0xB1A3},{0x60B6, 0xB465},{0x60B7, 0xD560}, - {0x60B8, 0xB1AA},{0x60B9, 0xD8F9},{0x60BA, 0xD556},{0x60BB, 0xB1A2},{0x60BC, 0xB1A5},{0x60BD, 0xB17E},{0x60BE, 0xD554},{0x60BF, 0xD562}, - {0x60C0, 0xD565},{0x60C1, 0xD949},{0x60C3, 0xD563},{0x60C4, 0xD8FD},{0x60C5, 0xB1A1},{0x60C6, 0xB1A8},{0x60C7, 0xB1AC},{0x60C8, 0xD55D}, - {0x60C9, 0xD8F8},{0x60CA, 0xD561},{0x60CB, 0xB17B},{0x60CC, 0xD8FA},{0x60CD, 0xD564},{0x60CE, 0xD8FC},{0x60CF, 0xD559},{0x60D1, 0xB462}, - {0x60D3, 0xD557},{0x60D4, 0xD558},{0x60D5, 0xB1A7},{0x60D8, 0xB1A6},{0x60D9, 0xD55B},{0x60DA, 0xB1AB},{0x60DB, 0xD55F},{0x60DC, 0xB1A4}, - {0x60DD, 0xD55C},{0x60DF, 0xB1A9},{0x60E0, 0xB466},{0x60E1, 0xB463},{0x60E2, 0xD8FB},{0x60E4, 0xD55A},{0x60E6, 0xB17D},{0x60F0, 0xB46B}, - {0x60F1, 0xB46F},{0x60F2, 0xD940},{0x60F3, 0xB751},{0x60F4, 0xB46D},{0x60F5, 0xD944},{0x60F6, 0xB471},{0x60F7, 0xDD65},{0x60F8, 0xD946}, - {0x60F9, 0xB753},{0x60FA, 0xB469},{0x60FB, 0xB46C},{0x60FC, 0xD947},{0x60FE, 0xD948},{0x60FF, 0xD94E},{0x6100, 0xB473},{0x6101, 0xB754}, - {0x6103, 0xD94A},{0x6104, 0xD94F},{0x6105, 0xD943},{0x6106, 0xB75E},{0x6108, 0xB755},{0x6109, 0xB472},{0x610A, 0xD941},{0x610B, 0xD950}, - {0x610D, 0xB75D},{0x610E, 0xB470},{0x610F, 0xB74E},{0x6110, 0xD94D},{0x6112, 0xB474},{0x6113, 0xD945},{0x6114, 0xD8FE},{0x6115, 0xB46A}, - {0x6116, 0xD942},{0x6118, 0xD94B},{0x611A, 0xB74D},{0x611B, 0xB752},{0x611C, 0xB467},{0x611D, 0xD94C},{0x611F, 0xB750},{0x6123, 0xB468}, - {0x6127, 0xB75C},{0x6128, 0xE1C3},{0x6129, 0xDD70},{0x612B, 0xDD68},{0x612C, 0xE1C2},{0x612E, 0xDD6C},{0x612F, 0xDD6E},{0x6132, 0xDD6B}, - {0x6134, 0xB75B},{0x6136, 0xDD6A},{0x6137, 0xB75F},{0x613B, 0xE1D2},{0x613E, 0xB75A},{0x613F, 0xBA40},{0x6140, 0xDD71},{0x6141, 0xE1C4}, - {0x6144, 0xB758},{0x6145, 0xDD69},{0x6146, 0xDD6D},{0x6147, 0xB9FE},{0x6148, 0xB74F},{0x6149, 0xDD66},{0x614A, 0xDD67},{0x614B, 0xBA41}, - {0x614C, 0xB757},{0x614D, 0xB759},{0x614E, 0xB756},{0x614F, 0xDD6F},{0x6152, 0xE1C8},{0x6153, 0xE1C9},{0x6154, 0xE1CE},{0x6155, 0xBC7D}, - {0x6156, 0xE1D5},{0x6158, 0xBA47},{0x615A, 0xBA46},{0x615B, 0xE1D0},{0x615D, 0xBC7C},{0x615E, 0xE1C5},{0x615F, 0xBA45},{0x6161, 0xE1D4}, - {0x6162, 0xBA43},{0x6163, 0xBA44},{0x6165, 0xE1D1},{0x6166, 0xE5AA},{0x6167, 0xBC7A},{0x6168, 0xB46E},{0x616A, 0xE1D3},{0x616B, 0xBCA3}, - {0x616C, 0xE1CB},{0x616E, 0xBC7B},{0x6170, 0xBCA2},{0x6171, 0xE1C6},{0x6172, 0xE1CA},{0x6173, 0xE1C7},{0x6174, 0xE1CD},{0x6175, 0xBA48}, - {0x6176, 0xBC79},{0x6177, 0xBA42},{0x6179, 0xE57A},{0x617A, 0xE1CF},{0x617C, 0xBCA1},{0x617E, 0xBCA4},{0x6180, 0xE1CC},{0x6182, 0xBC7E}, - {0x6183, 0xE579},{0x6189, 0xE57E},{0x618A, 0xBECE},{0x618B, 0xE578},{0x618C, 0xE9A3},{0x618D, 0xE5A9},{0x618E, 0xBCA8},{0x6190, 0xBCA6}, - {0x6191, 0xBECC},{0x6192, 0xE5A6},{0x6193, 0xE5A2},{0x6194, 0xBCAC},{0x6196, 0xE978},{0x619A, 0xBCAA},{0x619B, 0xE5A1},{0x619D, 0xE976}, - {0x619F, 0xE5A5},{0x61A1, 0xE5A8},{0x61A2, 0xE57D},{0x61A4, 0xBCAB},{0x61A7, 0xBCA5},{0x61A8, 0xE977},{0x61A9, 0xBECD},{0x61AA, 0xE5A7}, - {0x61AB, 0xBCA7},{0x61AC, 0xBCA9},{0x61AD, 0xE5A4},{0x61AE, 0xBCAD},{0x61AF, 0xE5A3},{0x61B0, 0xE57C},{0x61B1, 0xE57B},{0x61B2, 0xBECB}, - {0x61B3, 0xE5AB},{0x61B4, 0xE97A},{0x61B5, 0xECE0},{0x61B6, 0xBED0},{0x61B8, 0xE9A2},{0x61BA, 0xE97E},{0x61BC, 0xECE1},{0x61BE, 0xBED1}, - {0x61BF, 0xE9A1},{0x61C1, 0xE97C},{0x61C2, 0xC0B4},{0x61C3, 0xECDF},{0x61C5, 0xE979},{0x61C6, 0xE97B},{0x61C7, 0xC0B5},{0x61C8, 0xBED3}, - {0x61C9, 0xC0B3},{0x61CA, 0xBED2},{0x61CB, 0xC0B7},{0x61CC, 0xE97D},{0x61CD, 0xBECF},{0x61D6, 0xEFCF},{0x61D8, 0xEFC7},{0x61DE, 0xECE7}, - {0x61DF, 0xEFC8},{0x61E0, 0xECE3},{0x61E3, 0xC256},{0x61E4, 0xECE5},{0x61E5, 0xECE4},{0x61E6, 0xC0B6},{0x61E7, 0xECE2},{0x61E8, 0xECE6}, - {0x61E9, 0xEFD0},{0x61EA, 0xEFCC},{0x61EB, 0xEFCE},{0x61ED, 0xEFC9},{0x61EE, 0xEFCA},{0x61F0, 0xEFCD},{0x61F1, 0xEFCB},{0x61F2, 0xC367}, - {0x61F5, 0xC36A},{0x61F6, 0xC369},{0x61F7, 0xC368},{0x61F8, 0xC461},{0x61F9, 0xF44A},{0x61FA, 0xC462},{0x61FB, 0xF241},{0x61FC, 0xC4DF}, - {0x61FD, 0xF5CC},{0x61FE, 0xC4E0},{0x61FF, 0xC574},{0x6200, 0xC5CA},{0x6201, 0xF7D9},{0x6203, 0xF7DA},{0x6204, 0xF7DB},{0x6207, 0xF9BA}, - {0x6208, 0xA4E0},{0x6209, 0xC97C},{0x620A, 0xA5B3},{0x620C, 0xA6A6},{0x620D, 0xA6A7},{0x620E, 0xA6A5},{0x6210, 0xA6A8},{0x6211, 0xA7DA}, - {0x6212, 0xA7D9},{0x6214, 0xCCB1},{0x6215, 0xA9CF},{0x6216, 0xA9CE},{0x6219, 0xD1AF},{0x621A, 0xB1AD},{0x621B, 0xB1AE},{0x621F, 0xB475}, - {0x6220, 0xDD72},{0x6221, 0xB760},{0x6222, 0xB761},{0x6223, 0xDD74},{0x6224, 0xDD76},{0x6225, 0xDD75},{0x6227, 0xE1D7},{0x6229, 0xE1D6}, - {0x622A, 0xBA49},{0x622B, 0xE1D8},{0x622D, 0xE5AC},{0x622E, 0xBCAE},{0x6230, 0xBED4},{0x6232, 0xC0B8},{0x6233, 0xC257},{0x6234, 0xC0B9}, - {0x6236, 0xA4E1},{0x623A, 0xCAE6},{0x623D, 0xCCB2},{0x623E, 0xA9D1},{0x623F, 0xA9D0},{0x6240, 0xA9D2},{0x6241, 0xABF3},{0x6242, 0xCED2}, - {0x6243, 0xCED3},{0x6246, 0xD1B0},{0x6247, 0xAEB0},{0x6248, 0xB1AF},{0x6249, 0xB476},{0x624A, 0xD951},{0x624B, 0xA4E2},{0x624D, 0xA47E}, - {0x624E, 0xA4E3},{0x6250, 0xC97D},{0x6251, 0xA5B7},{0x6252, 0xA5B6},{0x6253, 0xA5B4},{0x6254, 0xA5B5},{0x6258, 0xA6AB},{0x6259, 0xC9E9}, - {0x625A, 0xC9EB},{0x625B, 0xA6AA},{0x625C, 0xC9E3},{0x625E, 0xC9E4},{0x6260, 0xC9EA},{0x6261, 0xC9E6},{0x6262, 0xC9E8},{0x6263, 0xA6A9}, - {0x6264, 0xC9E5},{0x6265, 0xC9EC},{0x6266, 0xC9E7},{0x626D, 0xA7E1},{0x626E, 0xA7EA},{0x626F, 0xA7E8},{0x6270, 0xCAF0},{0x6271, 0xCAED}, - {0x6272, 0xCAF5},{0x6273, 0xA7E6},{0x6274, 0xCAF6},{0x6276, 0xA7DF},{0x6277, 0xCAF3},{0x6279, 0xA7E5},{0x627A, 0xCAEF},{0x627B, 0xCAEE}, - {0x627C, 0xA7E3},{0x627D, 0xCAF4},{0x627E, 0xA7E4},{0x627F, 0xA9D3},{0x6280, 0xA7DE},{0x6281, 0xCAF1},{0x6283, 0xCAE7},{0x6284, 0xA7DB}, - {0x6286, 0xA7EE},{0x6287, 0xCAEC},{0x6288, 0xCAF2},{0x6289, 0xA7E0},{0x628A, 0xA7E2},{0x628C, 0xCAE8},{0x628E, 0xCAE9},{0x628F, 0xCAEA}, - {0x6291, 0xA7ED},{0x6292, 0xA7E7},{0x6293, 0xA7EC},{0x6294, 0xCAEB},{0x6295, 0xA7EB},{0x6296, 0xA7DD},{0x6297, 0xA7DC},{0x6298, 0xA7E9}, - {0x62A8, 0xA9E1},{0x62A9, 0xCCBE},{0x62AA, 0xCCB7},{0x62AB, 0xA9DC},{0x62AC, 0xA9EF},{0x62AD, 0xCCB3},{0x62AE, 0xCCBA},{0x62AF, 0xCCBC}, - {0x62B0, 0xCCBF},{0x62B1, 0xA9EA},{0x62B3, 0xCCBB},{0x62B4, 0xCCB4},{0x62B5, 0xA9E8},{0x62B6, 0xCCB8},{0x62B8, 0xCCC0},{0x62B9, 0xA9D9}, - {0x62BB, 0xCCBD},{0x62BC, 0xA9E3},{0x62BD, 0xA9E2},{0x62BE, 0xCCB6},{0x62BF, 0xA9D7},{0x62C2, 0xA9D8},{0x62C4, 0xA9D6},{0x62C6, 0xA9EE}, - {0x62C7, 0xA9E6},{0x62C8, 0xA9E0},{0x62C9, 0xA9D4},{0x62CA, 0xCCB9},{0x62CB, 0xA9DF},{0x62CC, 0xA9D5},{0x62CD, 0xA9E7},{0x62CE, 0xA9F0}, - {0x62CF, 0xCED4},{0x62D0, 0xA9E4},{0x62D1, 0xCCB5},{0x62D2, 0xA9DA},{0x62D3, 0xA9DD},{0x62D4, 0xA9DE},{0x62D6, 0xA9EC},{0x62D7, 0xA9ED}, - {0x62D8, 0xA9EB},{0x62D9, 0xA9E5},{0x62DA, 0xA9E9},{0x62DB, 0xA9DB},{0x62DC, 0xABF4},{0x62EB, 0xCEDA},{0x62EC, 0xAC41},{0x62ED, 0xABF8}, - {0x62EE, 0xABFA},{0x62EF, 0xAC40},{0x62F0, 0xCEE6},{0x62F1, 0xABFD},{0x62F2, 0xD1B1},{0x62F3, 0xAEB1},{0x62F4, 0xAC43},{0x62F5, 0xCED7}, - {0x62F6, 0xCEDF},{0x62F7, 0xABFE},{0x62F8, 0xCEDE},{0x62F9, 0xCEDB},{0x62FA, 0xCEE3},{0x62FB, 0xCEE5},{0x62FC, 0xABF7},{0x62FD, 0xABFB}, - {0x62FE, 0xAC42},{0x62FF, 0xAEB3},{0x6300, 0xCEE0},{0x6301, 0xABF9},{0x6302, 0xAC45},{0x6303, 0xCED9},{0x6307, 0xABFC},{0x6308, 0xAEB2}, - {0x6309, 0xABF6},{0x630B, 0xCED6},{0x630C, 0xCEDD},{0x630D, 0xCED5},{0x630E, 0xCED8},{0x630F, 0xCEDC},{0x6310, 0xD1B2},{0x6311, 0xAC44}, - {0x6313, 0xCEE1},{0x6314, 0xCEE2},{0x6315, 0xCEE4},{0x6316, 0xABF5},{0x6328, 0xAEC1},{0x6329, 0xD1BE},{0x632A, 0xAEBF},{0x632B, 0xAEC0}, - {0x632C, 0xD1B4},{0x632D, 0xD1C4},{0x632F, 0xAEB6},{0x6332, 0xD566},{0x6333, 0xD1C6},{0x6334, 0xD1C0},{0x6336, 0xD1B7},{0x6338, 0xD1C9}, - {0x6339, 0xD1BA},{0x633A, 0xAEBC},{0x633B, 0xD57D},{0x633C, 0xD1BD},{0x633D, 0xAEBE},{0x633E, 0xAEB5},{0x6340, 0xD1CB},{0x6341, 0xD1BF}, - {0x6342, 0xAEB8},{0x6343, 0xD1B8},{0x6344, 0xD1B5},{0x6345, 0xD1B6},{0x6346, 0xAEB9},{0x6347, 0xD1C5},{0x6348, 0xD1CC},{0x6349, 0xAEBB}, - {0x634A, 0xD1BC},{0x634B, 0xD1BB},{0x634C, 0xAEC3},{0x634D, 0xAEC2},{0x634E, 0xAEB4},{0x634F, 0xAEBA},{0x6350, 0xAEBD},{0x6351, 0xD1C8}, - {0x6354, 0xD1C2},{0x6355, 0xAEB7},{0x6356, 0xD1B3},{0x6357, 0xD1CA},{0x6358, 0xD1C1},{0x6359, 0xD1C3},{0x635A, 0xD1C7},{0x6365, 0xD567}, - {0x6367, 0xB1B7},{0x6368, 0xB1CB},{0x6369, 0xB1CA},{0x636B, 0xB1BF},{0x636D, 0xD579},{0x636E, 0xD575},{0x636F, 0xD572},{0x6370, 0xD5A6}, - {0x6371, 0xB1BA},{0x6372, 0xB1B2},{0x6375, 0xD577},{0x6376, 0xB4A8},{0x6377, 0xB1B6},{0x6378, 0xD5A1},{0x637A, 0xB1CC},{0x637B, 0xB1C9}, - {0x637C, 0xD57B},{0x637D, 0xD56A},{0x6380, 0xB1C8},{0x6381, 0xD5A3},{0x6382, 0xD569},{0x6383, 0xB1BD},{0x6384, 0xB1C1},{0x6385, 0xD5A2}, - {0x6387, 0xD573},{0x6388, 0xB1C2},{0x6389, 0xB1BC},{0x638A, 0xD568},{0x638C, 0xB478},{0x638D, 0xD5A5},{0x638E, 0xD571},{0x638F, 0xB1C7}, - {0x6390, 0xD574},{0x6391, 0xD5A4},{0x6392, 0xB1C6},{0x6394, 0xD952},{0x6396, 0xB1B3},{0x6397, 0xD56F},{0x6398, 0xB1B8},{0x6399, 0xB1C3}, - {0x639B, 0xB1BE},{0x639C, 0xD578},{0x639D, 0xD56E},{0x639E, 0xD56C},{0x639F, 0xD57E},{0x63A0, 0xB1B0},{0x63A1, 0xB1C4},{0x63A2, 0xB1B4}, - {0x63A3, 0xB477},{0x63A4, 0xD57C},{0x63A5, 0xB1B5},{0x63A7, 0xB1B1},{0x63A8, 0xB1C0},{0x63A9, 0xB1BB},{0x63AA, 0xB1B9},{0x63AB, 0xD570}, - {0x63AC, 0xB1C5},{0x63AD, 0xD56D},{0x63AE, 0xD57A},{0x63AF, 0xD576},{0x63B0, 0xD954},{0x63B1, 0xD953},{0x63BD, 0xD56B},{0x63BE, 0xD964}, - {0x63C0, 0xB47A},{0x63C2, 0xD96A},{0x63C3, 0xD959},{0x63C4, 0xD967},{0x63C5, 0xDD77},{0x63C6, 0xB47D},{0x63C7, 0xD96B},{0x63C8, 0xD96E}, - {0x63C9, 0xB47C},{0x63CA, 0xD95C},{0x63CB, 0xD96D},{0x63CC, 0xD96C},{0x63CD, 0xB47E},{0x63CE, 0xD955},{0x63CF, 0xB479},{0x63D0, 0xB4A3}, - {0x63D2, 0xB4A1},{0x63D3, 0xD969},{0x63D5, 0xD95F},{0x63D6, 0xB4A5},{0x63D7, 0xD970},{0x63D8, 0xD968},{0x63D9, 0xD971},{0x63DA, 0xB4AD}, - {0x63DB, 0xB4AB},{0x63DC, 0xD966},{0x63DD, 0xD965},{0x63DF, 0xD963},{0x63E0, 0xD95D},{0x63E1, 0xB4A4},{0x63E3, 0xB4A2},{0x63E4, 0xD1B9}, - {0x63E5, 0xD956},{0x63E7, 0xDDB7},{0x63E8, 0xD957},{0x63E9, 0xB47B},{0x63EA, 0xB4AA},{0x63EB, 0xDD79},{0x63ED, 0xB4A6},{0x63EE, 0xB4A7}, - {0x63EF, 0xD958},{0x63F0, 0xD96F},{0x63F1, 0xDD78},{0x63F2, 0xD960},{0x63F3, 0xD95B},{0x63F4, 0xB4A9},{0x63F5, 0xD961},{0x63F6, 0xD95E}, - {0x63F9, 0xB4AE},{0x6406, 0xB770},{0x6409, 0xDD7C},{0x640A, 0xDDB1},{0x640B, 0xDDB6},{0x640C, 0xDDAA},{0x640D, 0xB76C},{0x640E, 0xDDBB}, - {0x640F, 0xB769},{0x6410, 0xDD7A},{0x6412, 0xDD7B},{0x6413, 0xB762},{0x6414, 0xB76B},{0x6415, 0xDDA4},{0x6416, 0xB76E},{0x6417, 0xB76F}, - {0x6418, 0xDDA5},{0x641A, 0xDDB2},{0x641B, 0xDDB8},{0x641C, 0xB76A},{0x641E, 0xB764},{0x641F, 0xDDA3},{0x6420, 0xDD7D},{0x6421, 0xDDBA}, - {0x6422, 0xDDA8},{0x6423, 0xDDA9},{0x6424, 0xDD7E},{0x6425, 0xDDB4},{0x6426, 0xDDAB},{0x6427, 0xDDB5},{0x6428, 0xDDAD},{0x642A, 0xB765}, - {0x642B, 0xE1D9},{0x642C, 0xB768},{0x642D, 0xB766},{0x642E, 0xDDB9},{0x642F, 0xDDB0},{0x6430, 0xDDAC},{0x6433, 0xDDA1},{0x6434, 0xBA53}, - {0x6435, 0xDDAF},{0x6436, 0xB76D},{0x6437, 0xDDA7},{0x6439, 0xDDA6},{0x643D, 0xB767},{0x643E, 0xB763},{0x643F, 0xE1EE},{0x6440, 0xDDB3}, - {0x6441, 0xDDAE},{0x6443, 0xDDA2},{0x644B, 0xE1E9},{0x644D, 0xE1DA},{0x644E, 0xE1E5},{0x6450, 0xE1EC},{0x6451, 0xBA51},{0x6452, 0xB4AC}, - {0x6453, 0xE1EA},{0x6454, 0xBA4C},{0x6458, 0xBA4B},{0x6459, 0xE1F1},{0x645B, 0xE1DB},{0x645C, 0xE1E8},{0x645D, 0xE1DC},{0x645E, 0xE1E7}, - {0x645F, 0xBA4F},{0x6460, 0xE1EB},{0x6461, 0xD962},{0x6465, 0xE1F2},{0x6466, 0xE1E3},{0x6467, 0xBA52},{0x6468, 0xE5BA},{0x6469, 0xBCAF}, - {0x646B, 0xE1F0},{0x646C, 0xE1EF},{0x646D, 0xBA54},{0x646E, 0xE5AD},{0x646F, 0xBCB0},{0x6470, 0xE5AE},{0x6472, 0xE1DF},{0x6473, 0xE1E0}, - {0x6474, 0xE1DD},{0x6475, 0xE1E2},{0x6476, 0xE1DE},{0x6477, 0xE1F3},{0x6478, 0xBA4E},{0x6479, 0xBCB1},{0x647A, 0xBA50},{0x647B, 0xBA55}, - {0x647D, 0xE1E1},{0x647F, 0xE1ED},{0x6482, 0xE1E6},{0x6485, 0xE5B1},{0x6487, 0xBA4A},{0x6488, 0xBCB4},{0x6489, 0xE9AA},{0x648A, 0xE5B6}, - {0x648B, 0xE5B5},{0x648C, 0xE5B7},{0x648F, 0xE5B4},{0x6490, 0xBCB5},{0x6492, 0xBCBB},{0x6493, 0xBCB8},{0x6495, 0xBCB9},{0x6496, 0xE5AF}, - {0x6497, 0xE5B2},{0x6498, 0xE5BC},{0x6499, 0xBCC1},{0x649A, 0xBCBF},{0x649C, 0xE5B3},{0x649D, 0xD95A},{0x649E, 0xBCB2},{0x649F, 0xE5B9}, - {0x64A0, 0xE5B0},{0x64A2, 0xBCC2},{0x64A3, 0xE5B8},{0x64A4, 0xBA4D},{0x64A5, 0xBCB7},{0x64A6, 0xE1E4},{0x64A9, 0xBCBA},{0x64AB, 0xBCBE}, - {0x64AC, 0xBCC0},{0x64AD, 0xBCBD},{0x64AE, 0xBCBC},{0x64B0, 0xBCB6},{0x64B1, 0xE5BB},{0x64B2, 0xBCB3},{0x64B3, 0xBCC3},{0x64BB, 0xBED8}, - {0x64BC, 0xBED9},{0x64BD, 0xE9A9},{0x64BE, 0xBEE2},{0x64BF, 0xBEDF},{0x64C1, 0xBED6},{0x64C2, 0xBEDD},{0x64C3, 0xE9AB},{0x64C4, 0xBEDB}, - {0x64C5, 0xBED5},{0x64C7, 0xBEDC},{0x64C9, 0xE9A8},{0x64CA, 0xC0BB},{0x64CB, 0xBED7},{0x64CD, 0xBEDE},{0x64CE, 0xC0BA},{0x64CF, 0xE9A7}, - {0x64D0, 0xE9A6},{0x64D2, 0xBEE0},{0x64D4, 0xBEE1},{0x64D6, 0xE9A5},{0x64D7, 0xE9A4},{0x64D8, 0xC0BC},{0x64D9, 0xE9AE},{0x64DA, 0xBEDA}, - {0x64DB, 0xE9AC},{0x64E0, 0xC0BD},{0x64E2, 0xC0C2},{0x64E3, 0xECEA},{0x64E4, 0xECEC},{0x64E6, 0xC0BF},{0x64E8, 0xECED},{0x64E9, 0xECE9}, - {0x64EB, 0xECEB},{0x64EC, 0xC0C0},{0x64ED, 0xC0C3},{0x64EF, 0xECE8},{0x64F0, 0xC0BE},{0x64F1, 0xC0C1},{0x64F2, 0xC259},{0x64F3, 0xE9AD}, - {0x64F4, 0xC258},{0x64F7, 0xC25E},{0x64F8, 0xEFD4},{0x64FA, 0xC25C},{0x64FB, 0xC25D},{0x64FC, 0xEFD7},{0x64FD, 0xEFD3},{0x64FE, 0xC25A}, - {0x64FF, 0xEFD1},{0x6500, 0xC36B},{0x6501, 0xEFD5},{0x6503, 0xEFD6},{0x6504, 0xEFD2},{0x6506, 0xC25B},{0x6507, 0xF242},{0x6509, 0xF245}, - {0x650C, 0xF246},{0x650D, 0xF244},{0x650E, 0xF247},{0x650F, 0xC36C},{0x6510, 0xF243},{0x6513, 0xF44E},{0x6514, 0xC464},{0x6515, 0xF44D}, - {0x6516, 0xF44C},{0x6517, 0xF44B},{0x6518, 0xC463},{0x6519, 0xC465},{0x651B, 0xF5CD},{0x651C, 0xC4E2},{0x651D, 0xC4E1},{0x6520, 0xF6E1}, - {0x6521, 0xF6E0},{0x6522, 0xF6E3},{0x6523, 0xC5CB},{0x6524, 0xC575},{0x6525, 0xF7DD},{0x6526, 0xF6E2},{0x6529, 0xF7DC},{0x652A, 0xC5CD}, - {0x652B, 0xC5CC},{0x652C, 0xC5F3},{0x652D, 0xF8A9},{0x652E, 0xF8EF},{0x652F, 0xA4E4},{0x6532, 0xD972},{0x6533, 0xE9AF},{0x6536, 0xA6AC}, - {0x6537, 0xCAF7},{0x6538, 0xA7F1},{0x6539, 0xA7EF},{0x653B, 0xA7F0},{0x653D, 0xCCC1},{0x653E, 0xA9F1},{0x653F, 0xAC46},{0x6541, 0xCEE7}, - {0x6543, 0xCEE8},{0x6545, 0xAC47},{0x6546, 0xD1CE},{0x6548, 0xAEC4},{0x6549, 0xAEC5},{0x654A, 0xD1CD},{0x654F, 0xB1D3},{0x6551, 0xB1CF}, - {0x6553, 0xD5A7},{0x6554, 0xB1D6},{0x6555, 0xB1D5},{0x6556, 0xB1CE},{0x6557, 0xB1D1},{0x6558, 0xB1D4},{0x6559, 0xB1D0},{0x655C, 0xD976}, - {0x655D, 0xB1CD},{0x655E, 0xB4AF},{0x6562, 0xB4B1},{0x6563, 0xB4B2},{0x6564, 0xD975},{0x6565, 0xD978},{0x6566, 0xB4B0},{0x6567, 0xD973}, - {0x6568, 0xD977},{0x656A, 0xD974},{0x656C, 0xB771},{0x656F, 0xDDBC},{0x6572, 0xBA56},{0x6573, 0xE1F4},{0x6574, 0xBEE3},{0x6575, 0xBCC4}, - {0x6576, 0xE5BD},{0x6577, 0xBCC5},{0x6578, 0xBCC6},{0x6579, 0xE5BF},{0x657A, 0xE5BE},{0x657B, 0xE5C0},{0x657C, 0xE9B1},{0x657F, 0xE9B0}, - {0x6580, 0xECEF},{0x6581, 0xECEE},{0x6582, 0xC0C4},{0x6583, 0xC0C5},{0x6584, 0xF248},{0x6587, 0xA4E5},{0x658C, 0xD979},{0x6590, 0xB4B4}, - {0x6591, 0xB4B3},{0x6592, 0xDDBD},{0x6594, 0xEFD8},{0x6595, 0xC4E3},{0x6596, 0xF7DE},{0x6597, 0xA4E6},{0x6599, 0xAEC6},{0x659B, 0xB1D8}, - {0x659C, 0xB1D7},{0x659D, 0xD97A},{0x659E, 0xD97B},{0x659F, 0xB772},{0x65A0, 0xE1F5},{0x65A1, 0xBA57},{0x65A2, 0xE9B2},{0x65A4, 0xA4E7}, - {0x65A5, 0xA5B8},{0x65A7, 0xA9F2},{0x65A8, 0xCCC2},{0x65AA, 0xCEE9},{0x65AB, 0xAC48},{0x65AC, 0xB1D9},{0x65AE, 0xD97C},{0x65AF, 0xB4B5}, - {0x65B0, 0xB773},{0x65B2, 0xE5C1},{0x65B3, 0xE5C2},{0x65B6, 0xECF0},{0x65B7, 0xC25F},{0x65B8, 0xF8F0},{0x65B9, 0xA4E8},{0x65BB, 0xCCC3}, - {0x65BC, 0xA9F3},{0x65BD, 0xAC49},{0x65BF, 0xCEEA},{0x65C1, 0xAEC7},{0x65C2, 0xD1D2},{0x65C3, 0xD1D0},{0x65C4, 0xD1D1},{0x65C5, 0xAEC8}, - {0x65C6, 0xD1CF},{0x65CB, 0xB1DB},{0x65CC, 0xB1DC},{0x65CD, 0xD5A8},{0x65CE, 0xB1DD},{0x65CF, 0xB1DA},{0x65D0, 0xD97D},{0x65D2, 0xD97E}, - {0x65D3, 0xDDBE},{0x65D6, 0xBA59},{0x65D7, 0xBA58},{0x65DA, 0xECF1},{0x65DB, 0xEFD9},{0x65DD, 0xF24A},{0x65DE, 0xF249},{0x65DF, 0xF44F}, - {0x65E1, 0xC95E},{0x65E2, 0xAC4A},{0x65E5, 0xA4E9},{0x65E6, 0xA5B9},{0x65E8, 0xA6AE},{0x65E9, 0xA6AD},{0x65EC, 0xA6AF},{0x65ED, 0xA6B0}, - {0x65EE, 0xC9EE},{0x65EF, 0xC9ED},{0x65F0, 0xCAF8},{0x65F1, 0xA7F2},{0x65F2, 0xCAFB},{0x65F3, 0xCAFA},{0x65F4, 0xCAF9},{0x65F5, 0xCAFC}, - {0x65FA, 0xA9F4},{0x65FB, 0xCCC9},{0x65FC, 0xCCC5},{0x65FD, 0xCCCE},{0x6600, 0xA9FB},{0x6602, 0xA9F9},{0x6603, 0xCCCA},{0x6604, 0xCCC6}, - {0x6605, 0xCCCD},{0x6606, 0xA9F8},{0x6607, 0xAA40},{0x6608, 0xCCC8},{0x6609, 0xCCC4},{0x660A, 0xA9FE},{0x660B, 0xCCCB},{0x660C, 0xA9F7}, - {0x660D, 0xCCCC},{0x660E, 0xA9FA},{0x660F, 0xA9FC},{0x6610, 0xCCD0},{0x6611, 0xCCCF},{0x6612, 0xCCC7},{0x6613, 0xA9F6},{0x6614, 0xA9F5}, - {0x6615, 0xA9FD},{0x661C, 0xCEEF},{0x661D, 0xCEF5},{0x661F, 0xAC50},{0x6620, 0xAC4D},{0x6621, 0xCEEC},{0x6622, 0xCEF1},{0x6624, 0xAC53}, - {0x6625, 0xAC4B},{0x6626, 0xCEF0},{0x6627, 0xAC4E},{0x6628, 0xAC51},{0x662B, 0xCEF3},{0x662D, 0xAC4C},{0x662E, 0xCEF8},{0x662F, 0xAC4F}, - {0x6631, 0xAC52},{0x6632, 0xCEED},{0x6633, 0xCEF2},{0x6634, 0xCEF6},{0x6635, 0xCEEE},{0x6636, 0xCEEB},{0x6639, 0xCEF7},{0x663A, 0xCEF4}, - {0x6641, 0xAED0},{0x6642, 0xAEC9},{0x6643, 0xAECC},{0x6645, 0xAECF},{0x6647, 0xD1D5},{0x6649, 0xAECA},{0x664A, 0xD1D3},{0x664C, 0xAECE}, - {0x664F, 0xAECB},{0x6651, 0xD1D6},{0x6652, 0xAECD},{0x6659, 0xD5AC},{0x665A, 0xB1DF},{0x665B, 0xD5AB},{0x665C, 0xD5AD},{0x665D, 0xB1DE}, - {0x665E, 0xB1E3},{0x665F, 0xD1D4},{0x6661, 0xD5AA},{0x6662, 0xD5AE},{0x6664, 0xB1E0},{0x6665, 0xD5A9},{0x6666, 0xB1E2},{0x6668, 0xB1E1}, - {0x666A, 0xD9A7},{0x666C, 0xD9A2},{0x666E, 0xB4B6},{0x666F, 0xB4BA},{0x6670, 0xB4B7},{0x6671, 0xD9A5},{0x6672, 0xD9A8},{0x6674, 0xB4B8}, - {0x6676, 0xB4B9},{0x6677, 0xB4BE},{0x6678, 0xDDC7},{0x6679, 0xD9A6},{0x667A, 0xB4BC},{0x667B, 0xD9A3},{0x667C, 0xD9A1},{0x667E, 0xB4BD}, - {0x6680, 0xD9A4},{0x6684, 0xB779},{0x6686, 0xDDBF},{0x6687, 0xB776},{0x6688, 0xB777},{0x6689, 0xB775},{0x668A, 0xDDC4},{0x668B, 0xDDC3}, - {0x668C, 0xDDC0},{0x668D, 0xB77B},{0x6690, 0xDDC2},{0x6691, 0xB4BB},{0x6694, 0xDDC6},{0x6695, 0xDDC1},{0x6696, 0xB778},{0x6697, 0xB774}, - {0x6698, 0xB77A},{0x6699, 0xDDC5},{0x669D, 0xBA5C},{0x669F, 0xE1F8},{0x66A0, 0xE1F7},{0x66A1, 0xE1F6},{0x66A2, 0xBA5A},{0x66A8, 0xBA5B}, - {0x66A9, 0xE5C5},{0x66AA, 0xE5C8},{0x66AB, 0xBCC8},{0x66AE, 0xBCC7},{0x66AF, 0xE5C9},{0x66B0, 0xE5C4},{0x66B1, 0xBCCA},{0x66B2, 0xE5C6}, - {0x66B4, 0xBCC9},{0x66B5, 0xE5C3},{0x66B7, 0xE5C7},{0x66B8, 0xBEE9},{0x66B9, 0xBEE6},{0x66BA, 0xE9BB},{0x66BB, 0xE9BA},{0x66BD, 0xE9B9}, - {0x66BE, 0xE9B4},{0x66C0, 0xE9B5},{0x66C4, 0xBEE7},{0x66C6, 0xBEE4},{0x66C7, 0xBEE8},{0x66C8, 0xE9B3},{0x66C9, 0xBEE5},{0x66CA, 0xE9B6}, - {0x66CB, 0xE9B7},{0x66CC, 0xE9BC},{0x66CF, 0xE9B8},{0x66D2, 0xECF2},{0x66D6, 0xC0C7},{0x66D8, 0xEFDC},{0x66D9, 0xC0C6},{0x66DA, 0xEFDA}, - {0x66DB, 0xEFDB},{0x66DC, 0xC260},{0x66DD, 0xC36E},{0x66DE, 0xF24B},{0x66E0, 0xC36D},{0x66E3, 0xF451},{0x66E4, 0xF452},{0x66E6, 0xC466}, - {0x66E8, 0xF450},{0x66E9, 0xC4E4},{0x66EB, 0xF7DF},{0x66EC, 0xC5CE},{0x66ED, 0xF8AA},{0x66EE, 0xF8AB},{0x66F0, 0xA4EA},{0x66F2, 0xA6B1}, - {0x66F3, 0xA6B2},{0x66F4, 0xA7F3},{0x66F6, 0xCCD1},{0x66F7, 0xAC54},{0x66F8, 0xAED1},{0x66F9, 0xB1E4},{0x66FC, 0xB0D2},{0x66FE, 0xB4BF}, - {0x66FF, 0xB4C0},{0x6700, 0xB3CC},{0x6701, 0xD9A9},{0x6703, 0xB77C},{0x6704, 0xE1FA},{0x6705, 0xE1F9},{0x6708, 0xA4EB},{0x6709, 0xA6B3}, - {0x670A, 0xCCD2},{0x670B, 0xAA42},{0x670D, 0xAA41},{0x670F, 0xCEF9},{0x6710, 0xCEFA},{0x6712, 0xD1D7},{0x6713, 0xD1D8},{0x6714, 0xAED2}, - {0x6715, 0xAED3},{0x6717, 0xAED4},{0x6718, 0xD5AF},{0x671B, 0xB1E6},{0x671D, 0xB4C2},{0x671F, 0xB4C1},{0x6720, 0xDDC8},{0x6721, 0xDF7A}, - {0x6722, 0xE1FB},{0x6723, 0xE9BD},{0x6726, 0xC261},{0x6727, 0xC467},{0x6728, 0xA4EC},{0x672A, 0xA5BC},{0x672B, 0xA5BD},{0x672C, 0xA5BB}, - {0x672D, 0xA5BE},{0x672E, 0xA5BA},{0x6731, 0xA6B6},{0x6733, 0xC9F6},{0x6734, 0xA6B5},{0x6735, 0xA6B7},{0x6738, 0xC9F1},{0x6739, 0xC9F0}, - {0x673A, 0xC9F3},{0x673B, 0xC9F2},{0x673C, 0xC9F5},{0x673D, 0xA6B4},{0x673E, 0xC9EF},{0x673F, 0xC9F4},{0x6745, 0xCAFD},{0x6746, 0xA7FD}, - {0x6747, 0xCAFE},{0x6748, 0xCB43},{0x6749, 0xA7FC},{0x674B, 0xCB47},{0x674C, 0xCB42},{0x674D, 0xCB45},{0x674E, 0xA7F5},{0x674F, 0xA7F6}, - {0x6750, 0xA7F7},{0x6751, 0xA7F8},{0x6753, 0xA840},{0x6755, 0xCB41},{0x6756, 0xA7FA},{0x6757, 0xA841},{0x6759, 0xCB40},{0x675A, 0xCB46}, - {0x675C, 0xA7F9},{0x675D, 0xCB44},{0x675E, 0xA7FB},{0x675F, 0xA7F4},{0x6760, 0xA7FE},{0x676A, 0xAA57},{0x676C, 0xCCD4},{0x676D, 0xAA43}, - {0x676F, 0xAA4D},{0x6770, 0xAA4E},{0x6771, 0xAA46},{0x6772, 0xAA58},{0x6773, 0xAA48},{0x6774, 0xCCDC},{0x6775, 0xAA53},{0x6776, 0xCCD7}, - {0x6777, 0xAA49},{0x6778, 0xCCE6},{0x6779, 0xCCE7},{0x677A, 0xCCDF},{0x677B, 0xCCD8},{0x677C, 0xAA56},{0x677D, 0xCCE4},{0x677E, 0xAA51}, - {0x677F, 0xAA4F},{0x6781, 0xCCE5},{0x6783, 0xCCE3},{0x6784, 0xCCDB},{0x6785, 0xCCD3},{0x6786, 0xCCDA},{0x6787, 0xAA4A},{0x6789, 0xAA50}, - {0x678B, 0xAA44},{0x678C, 0xCCDE},{0x678D, 0xCCDD},{0x678E, 0xCCD5},{0x6790, 0xAA52},{0x6791, 0xCCE1},{0x6792, 0xCCD6},{0x6793, 0xAA55}, - {0x6794, 0xCCE8},{0x6795, 0xAA45},{0x6797, 0xAA4C},{0x6798, 0xCCD9},{0x6799, 0xCCE2},{0x679A, 0xAA54},{0x679C, 0xAA47},{0x679D, 0xAA4B}, - {0x679F, 0xCCE0},{0x67AE, 0xCF5B},{0x67AF, 0xAC5C},{0x67B0, 0xAC69},{0x67B2, 0xCF56},{0x67B3, 0xCF4C},{0x67B4, 0xAC62},{0x67B5, 0xCF4A}, - {0x67B6, 0xAC5B},{0x67B7, 0xCF45},{0x67B8, 0xAC65},{0x67B9, 0xCF52},{0x67BA, 0xCEFE},{0x67BB, 0xCF41},{0x67C0, 0xCF44},{0x67C1, 0xCEFB}, - {0x67C2, 0xCF51},{0x67C3, 0xCF61},{0x67C4, 0xAC60},{0x67C5, 0xCF46},{0x67C6, 0xCF58},{0x67C8, 0xCEFD},{0x67C9, 0xCF5F},{0x67CA, 0xCF60}, - {0x67CB, 0xCF63},{0x67CC, 0xCF5A},{0x67CD, 0xCF4B},{0x67CE, 0xCF53},{0x67CF, 0xAC66},{0x67D0, 0xAC59},{0x67D1, 0xAC61},{0x67D2, 0xAC6D}, - {0x67D3, 0xAC56},{0x67D4, 0xAC58},{0x67D8, 0xCF43},{0x67D9, 0xAC6A},{0x67DA, 0xAC63},{0x67DB, 0xCF5D},{0x67DC, 0xCF40},{0x67DD, 0xAC6C}, - {0x67DE, 0xAC67},{0x67DF, 0xCF49},{0x67E2, 0xAC6B},{0x67E3, 0xCF50},{0x67E4, 0xCF48},{0x67E5, 0xAC64},{0x67E6, 0xCF5C},{0x67E7, 0xCF54}, - {0x67E9, 0xAC5E},{0x67EA, 0xCF62},{0x67EB, 0xCF47},{0x67EC, 0xAC5A},{0x67ED, 0xCF59},{0x67EE, 0xCF4F},{0x67EF, 0xAC5F},{0x67F0, 0xCF55}, - {0x67F1, 0xAC57},{0x67F2, 0xCEFC},{0x67F3, 0xAC68},{0x67F4, 0xAEE3},{0x67F5, 0xAC5D},{0x67F6, 0xCF4E},{0x67F7, 0xCF4D},{0x67F8, 0xCF42}, - {0x67FA, 0xCF5E},{0x67FC, 0xCF57},{0x67FF, 0xAC55},{0x6812, 0xD1EC},{0x6813, 0xAEEA},{0x6814, 0xD1ED},{0x6816, 0xD1E1},{0x6817, 0xAEDF}, - {0x6818, 0xAEEB},{0x681A, 0xD1DA},{0x681C, 0xD1E3},{0x681D, 0xD1EB},{0x681F, 0xD1D9},{0x6820, 0xD1F4},{0x6821, 0xAED5},{0x6825, 0xD1F3}, - {0x6826, 0xD1EE},{0x6828, 0xD1EF},{0x6829, 0xAEDD},{0x682A, 0xAEE8},{0x682B, 0xD1E5},{0x682D, 0xD1E6},{0x682E, 0xD1F0},{0x682F, 0xD1E7}, - {0x6831, 0xD1E2},{0x6832, 0xD1DC},{0x6833, 0xD1DD},{0x6834, 0xD1EA},{0x6835, 0xD1E4},{0x6838, 0xAED6},{0x6839, 0xAEDA},{0x683A, 0xD1F2}, - {0x683B, 0xD1DE},{0x683C, 0xAEE6},{0x683D, 0xAEE2},{0x6840, 0xAEE5},{0x6841, 0xAEEC},{0x6842, 0xAEDB},{0x6843, 0xAEE7},{0x6844, 0xD1E9}, - {0x6845, 0xAEE9},{0x6846, 0xAED8},{0x6848, 0xAED7},{0x6849, 0xD1DB},{0x684B, 0xD1DF},{0x684C, 0xAEE0},{0x684D, 0xD1F1},{0x684E, 0xD1E8}, - {0x684F, 0xD1E0},{0x6850, 0xAEE4},{0x6851, 0xAEE1},{0x6853, 0xAED9},{0x6854, 0xAEDC},{0x686B, 0xD5C4},{0x686D, 0xD5B4},{0x686E, 0xD5B5}, - {0x686F, 0xD5B9},{0x6871, 0xD5C8},{0x6872, 0xD5C5},{0x6874, 0xD5BE},{0x6875, 0xD5BD},{0x6876, 0xB1ED},{0x6877, 0xD5C1},{0x6878, 0xD5D0}, - {0x6879, 0xD5B0},{0x687B, 0xD5D1},{0x687C, 0xD5C3},{0x687D, 0xD5D5},{0x687E, 0xD5C9},{0x687F, 0xB1EC},{0x6880, 0xD5C7},{0x6881, 0xB1E7}, - {0x6882, 0xB1FC},{0x6883, 0xB1F2},{0x6885, 0xB1F6},{0x6886, 0xB1F5},{0x6887, 0xD5B1},{0x6889, 0xD5CE},{0x688A, 0xD5D4},{0x688B, 0xD5CC}, - {0x688C, 0xD5D3},{0x688F, 0xD5C0},{0x6890, 0xD5B2},{0x6891, 0xD5D2},{0x6892, 0xD5C2},{0x6893, 0xB1EA},{0x6894, 0xB1F7},{0x6896, 0xD5CB}, - {0x6897, 0xB1F0},{0x689B, 0xD5CA},{0x689C, 0xD5B3},{0x689D, 0xB1F8},{0x689F, 0xB1FA},{0x68A0, 0xD5CD},{0x68A1, 0xB1FB},{0x68A2, 0xB1E9}, - {0x68A3, 0xD5BA},{0x68A4, 0xD5CF},{0x68A7, 0xB1EF},{0x68A8, 0xB1F9},{0x68A9, 0xD5BC},{0x68AA, 0xD5C6},{0x68AB, 0xD5B7},{0x68AC, 0xD5BB}, - {0x68AD, 0xB1F4},{0x68AE, 0xD5B6},{0x68AF, 0xB1E8},{0x68B0, 0xB1F1},{0x68B1, 0xB1EE},{0x68B2, 0xD5BF},{0x68B3, 0xAEDE},{0x68B4, 0xD9C0}, - {0x68B5, 0xB1EB},{0x68C4, 0xB1F3},{0x68C6, 0xD9C3},{0x68C7, 0xD9D9},{0x68C8, 0xD9CE},{0x68C9, 0xB4D6},{0x68CB, 0xB4D1},{0x68CC, 0xD9BD}, - {0x68CD, 0xB4D2},{0x68CE, 0xD9CD},{0x68D0, 0xD9C6},{0x68D1, 0xD9D3},{0x68D2, 0xB4CE},{0x68D3, 0xD9AB},{0x68D4, 0xD9D5},{0x68D5, 0xB4C4}, - {0x68D6, 0xD9B3},{0x68D7, 0xB4C7},{0x68D8, 0xB4C6},{0x68DA, 0xB4D7},{0x68DC, 0xD9AD},{0x68DD, 0xD9CF},{0x68DE, 0xD9D0},{0x68DF, 0xB4C9}, - {0x68E0, 0xB4C5},{0x68E1, 0xD9BB},{0x68E3, 0xB4D0},{0x68E4, 0xD9B6},{0x68E6, 0xD9D1},{0x68E7, 0xB4CC},{0x68E8, 0xD9C9},{0x68E9, 0xD9D6}, - {0x68EA, 0xD9B0},{0x68EB, 0xD9B5},{0x68EC, 0xD9AF},{0x68EE, 0xB4CB},{0x68EF, 0xD9C2},{0x68F0, 0xDDDE},{0x68F1, 0xD9B1},{0x68F2, 0xB4CF}, - {0x68F3, 0xD9BA},{0x68F4, 0xD9D2},{0x68F5, 0xB4CA},{0x68F6, 0xD9B7},{0x68F7, 0xD9B4},{0x68F8, 0xD9C5},{0x68F9, 0xB4CD},{0x68FA, 0xB4C3}, - {0x68FB, 0xB4D9},{0x68FC, 0xD9C8},{0x68FD, 0xD9C7},{0x6904, 0xD9AC},{0x6905, 0xB4C8},{0x6906, 0xD9D4},{0x6907, 0xD9BC},{0x6908, 0xD9BE}, - {0x690A, 0xD9CB},{0x690B, 0xD9CA},{0x690C, 0xD9AA},{0x690D, 0xB4D3},{0x690E, 0xB4D5},{0x690F, 0xD9B2},{0x6910, 0xD9B9},{0x6911, 0xD9C1}, - {0x6912, 0xB4D4},{0x6913, 0xD9B8},{0x6914, 0xD9C4},{0x6915, 0xD9D7},{0x6917, 0xD9CC},{0x6925, 0xD9D8},{0x692A, 0xD9AE},{0x692F, 0xDDF2}, - {0x6930, 0xB7A6},{0x6932, 0xDDF0},{0x6933, 0xDDDB},{0x6934, 0xDDE0},{0x6935, 0xDDD9},{0x6937, 0xDDEC},{0x6938, 0xDDCB},{0x6939, 0xDDD2}, - {0x693B, 0xDDEA},{0x693C, 0xDDF4},{0x693D, 0xDDDC},{0x693F, 0xDDCF},{0x6940, 0xDDE2},{0x6941, 0xDDE7},{0x6942, 0xDDD3},{0x6944, 0xDDE4}, - {0x6945, 0xDDD0},{0x6948, 0xDDD7},{0x6949, 0xDDD8},{0x694A, 0xB7A8},{0x694B, 0xDDEB},{0x694C, 0xDDE9},{0x694E, 0xDDCC},{0x694F, 0xDDEE}, - {0x6951, 0xDDEF},{0x6952, 0xDDF1},{0x6953, 0xB7AC},{0x6954, 0xB7A4},{0x6956, 0xD5B8},{0x6957, 0xDDD4},{0x6958, 0xDDE6},{0x6959, 0xDDD5}, - {0x695A, 0xB7A1},{0x695B, 0xB7B1},{0x695C, 0xDDED},{0x695D, 0xB7AF},{0x695E, 0xB7AB},{0x695F, 0xDDCA},{0x6960, 0xB7A3},{0x6962, 0xDDCD}, - {0x6963, 0xB7B0},{0x6965, 0xDDDD},{0x6966, 0xDDC9},{0x6968, 0xB7A9},{0x6969, 0xDDE1},{0x696A, 0xDDD1},{0x696B, 0xB7AA},{0x696C, 0xDDDA}, - {0x696D, 0xB77E},{0x696E, 0xB4D8},{0x696F, 0xDDE3},{0x6970, 0xD9BF},{0x6971, 0xDDCE},{0x6974, 0xDDE8},{0x6975, 0xB7A5},{0x6976, 0xDDE5}, - {0x6977, 0xB7A2},{0x6978, 0xDDDF},{0x6979, 0xB7AD},{0x697A, 0xDDD6},{0x697B, 0xDDF3},{0x6982, 0xB7A7},{0x6983, 0xDEC6},{0x6986, 0xB7AE}, - {0x698D, 0xE24A},{0x698E, 0xE248},{0x6990, 0xE25E},{0x6991, 0xE246},{0x6993, 0xE258},{0x6994, 0xB77D},{0x6995, 0xBA5F},{0x6996, 0xE242}, - {0x6997, 0xE25D},{0x6999, 0xE247},{0x699A, 0xE255},{0x699B, 0xBA64},{0x699C, 0xBA5D},{0x699E, 0xE25B},{0x69A0, 0xE240},{0x69A1, 0xE25A}, - {0x69A3, 0xBA6F},{0x69A4, 0xE251},{0x69A5, 0xE261},{0x69A6, 0xBA6D},{0x69A7, 0xE249},{0x69A8, 0xBA5E},{0x69A9, 0xE24B},{0x69AA, 0xE259}, - {0x69AB, 0xBA67},{0x69AC, 0xE244},{0x69AD, 0xBA6B},{0x69AE, 0xBA61},{0x69AF, 0xE24D},{0x69B0, 0xE243},{0x69B1, 0xE1FC},{0x69B3, 0xE257}, - {0x69B4, 0xBA68},{0x69B5, 0xE260},{0x69B6, 0xE1FD},{0x69B7, 0xBA65},{0x69B9, 0xE253},{0x69BB, 0xBA66},{0x69BC, 0xE245},{0x69BD, 0xE250}, - {0x69BE, 0xE24C},{0x69BF, 0xE24E},{0x69C1, 0xBA60},{0x69C2, 0xE25F},{0x69C3, 0xBA6E},{0x69C4, 0xE24F},{0x69C6, 0xE262},{0x69C9, 0xE1FE}, - {0x69CA, 0xE254},{0x69CB, 0xBA63},{0x69CC, 0xBA6C},{0x69CD, 0xBA6A},{0x69CE, 0xE241},{0x69CF, 0xE256},{0x69D0, 0xBA69},{0x69D3, 0xBA62}, - {0x69D4, 0xE252},{0x69D9, 0xE25C},{0x69E2, 0xE5D5},{0x69E4, 0xE5D1},{0x69E5, 0xE5CD},{0x69E6, 0xE5E1},{0x69E7, 0xE5DE},{0x69E8, 0xBCCD}, - {0x69EB, 0xE5E5},{0x69EC, 0xE5D4},{0x69ED, 0xBCD8},{0x69EE, 0xE5DB},{0x69F1, 0xE5D0},{0x69F2, 0xE5DA},{0x69F3, 0xBCD5},{0x69F4, 0xE5EE}, - {0x69F6, 0xE5EB},{0x69F7, 0xE5DD},{0x69F8, 0xE5CE},{0x69FB, 0xE5E2},{0x69FC, 0xE5E4},{0x69FD, 0xBCD1},{0x69FE, 0xE5D8},{0x69FF, 0xE5D3}, - {0x6A00, 0xE5CA},{0x6A01, 0xBCCE},{0x6A02, 0xBCD6},{0x6A04, 0xE5E7},{0x6A05, 0xBCD7},{0x6A06, 0xE5CB},{0x6A07, 0xE5ED},{0x6A08, 0xE5E0}, - {0x6A09, 0xE5E6},{0x6A0A, 0xBCD4},{0x6A0D, 0xE5E3},{0x6A0F, 0xE5EA},{0x6A11, 0xBCD9},{0x6A13, 0xBCD3},{0x6A14, 0xE5DC},{0x6A15, 0xE5CF}, - {0x6A16, 0xE5EF},{0x6A17, 0xE5CC},{0x6A18, 0xE5E8},{0x6A19, 0xBCD0},{0x6A1B, 0xE5D6},{0x6A1D, 0xE5D7},{0x6A1E, 0xBCCF},{0x6A1F, 0xBCCC}, - {0x6A20, 0xE5D2},{0x6A21, 0xBCD2},{0x6A23, 0xBCCB},{0x6A25, 0xE5E9},{0x6A26, 0xE5EC},{0x6A27, 0xE5D9},{0x6A28, 0xE9CA},{0x6A32, 0xE9C2}, - {0x6A34, 0xE9BE},{0x6A35, 0xBEF6},{0x6A38, 0xBEEB},{0x6A39, 0xBEF0},{0x6A3A, 0xBEEC},{0x6A3B, 0xE9CC},{0x6A3C, 0xE9D7},{0x6A3D, 0xBEEA}, - {0x6A3E, 0xE9C4},{0x6A3F, 0xE9CD},{0x6A40, 0xE5DF},{0x6A41, 0xE9CE},{0x6A44, 0xBEF1},{0x6A46, 0xE9DD},{0x6A47, 0xBEF5},{0x6A48, 0xBEF8}, - {0x6A49, 0xE9C0},{0x6A4B, 0xBEF4},{0x6A4D, 0xE9DB},{0x6A4E, 0xE9DC},{0x6A4F, 0xE9D2},{0x6A50, 0xE9D1},{0x6A51, 0xE9C9},{0x6A54, 0xE9D3}, - {0x6A55, 0xE9DA},{0x6A56, 0xE9D9},{0x6A58, 0xBEEF},{0x6A59, 0xBEED},{0x6A5A, 0xE9CB},{0x6A5B, 0xE9C8},{0x6A5D, 0xE9C5},{0x6A5E, 0xE9D8}, - {0x6A5F, 0xBEF7},{0x6A60, 0xE9D6},{0x6A61, 0xBEF3},{0x6A62, 0xBEF2},{0x6A64, 0xE9D0},{0x6A66, 0xE9BF},{0x6A67, 0xE9C1},{0x6A68, 0xE9C3}, - {0x6A69, 0xE9D5},{0x6A6A, 0xE9CF},{0x6A6B, 0xBEEE},{0x6A6D, 0xE9C6},{0x6A6F, 0xE9D4},{0x6A76, 0xE9C7},{0x6A7E, 0xC0CF},{0x6A7F, 0xED45}, - {0x6A80, 0xC0C8},{0x6A81, 0xECF5},{0x6A83, 0xED41},{0x6A84, 0xC0CA},{0x6A85, 0xED48},{0x6A87, 0xECFC},{0x6A89, 0xECF7},{0x6A8C, 0xED49}, - {0x6A8D, 0xECF3},{0x6A8E, 0xECFE},{0x6A90, 0xC0D1},{0x6A91, 0xED44},{0x6A92, 0xED4A},{0x6A93, 0xECFD},{0x6A94, 0xC0C9},{0x6A95, 0xED40}, - {0x6A96, 0xECF4},{0x6A97, 0xC0D0},{0x6A9A, 0xED47},{0x6A9B, 0xECF9},{0x6A9C, 0xC0CC},{0x6A9E, 0xECFB},{0x6A9F, 0xECF8},{0x6AA0, 0xC0D2}, - {0x6AA1, 0xECFA},{0x6AA2, 0xC0CB},{0x6AA3, 0xC0CE},{0x6AA4, 0xED43},{0x6AA5, 0xECF6},{0x6AA6, 0xED46},{0x6AA8, 0xED42},{0x6AAC, 0xC263}, - {0x6AAD, 0xEFE7},{0x6AAE, 0xC268},{0x6AAF, 0xC269},{0x6AB3, 0xC262},{0x6AB4, 0xEFE6},{0x6AB6, 0xEFE3},{0x6AB7, 0xEFE4},{0x6AB8, 0xC266}, - {0x6AB9, 0xEFDE},{0x6ABA, 0xEFE2},{0x6ABB, 0xC265},{0x6ABD, 0xEFDF},{0x6AC2, 0xC267},{0x6AC3, 0xC264},{0x6AC5, 0xEFDD},{0x6AC6, 0xEFE1}, - {0x6AC7, 0xEFE5},{0x6ACB, 0xF251},{0x6ACC, 0xF24E},{0x6ACD, 0xF257},{0x6ACF, 0xF256},{0x6AD0, 0xF254},{0x6AD1, 0xF24F},{0x6AD3, 0xC372}, - {0x6AD9, 0xF250},{0x6ADA, 0xC371},{0x6ADB, 0xC0CD},{0x6ADC, 0xF253},{0x6ADD, 0xC370},{0x6ADE, 0xF258},{0x6ADF, 0xF252},{0x6AE0, 0xF24D}, - {0x6AE1, 0xEFE0},{0x6AE5, 0xC36F},{0x6AE7, 0xF24C},{0x6AE8, 0xF456},{0x6AEA, 0xF455},{0x6AEB, 0xF255},{0x6AEC, 0xC468},{0x6AEE, 0xF459}, - {0x6AEF, 0xF45A},{0x6AF0, 0xF454},{0x6AF1, 0xF458},{0x6AF3, 0xF453},{0x6AF8, 0xF5D1},{0x6AF9, 0xF457},{0x6AFA, 0xC4E7},{0x6AFB, 0xC4E5}, - {0x6AFC, 0xF5CF},{0x6B00, 0xF5D2},{0x6B02, 0xF5CE},{0x6B03, 0xF5D0},{0x6B04, 0xC4E6},{0x6B08, 0xF6E5},{0x6B09, 0xF6E6},{0x6B0A, 0xC576}, - {0x6B0B, 0xF6E4},{0x6B0F, 0xF7E2},{0x6B10, 0xC5CF},{0x6B11, 0xF7E0},{0x6B12, 0xF7E1},{0x6B13, 0xF8AC},{0x6B16, 0xC656},{0x6B17, 0xF8F3}, - {0x6B18, 0xF8F1},{0x6B19, 0xF8F2},{0x6B1A, 0xF8F4},{0x6B1E, 0xF9BB},{0x6B20, 0xA4ED},{0x6B21, 0xA6B8},{0x6B23, 0xAA59},{0x6B25, 0xCCE9}, - {0x6B28, 0xCF64},{0x6B2C, 0xD1F5},{0x6B2D, 0xD1F7},{0x6B2F, 0xD1F6},{0x6B31, 0xD1F8},{0x6B32, 0xB1FD},{0x6B33, 0xD5D7},{0x6B34, 0xD1F9}, - {0x6B36, 0xD5D6},{0x6B37, 0xD5D8},{0x6B38, 0xD5D9},{0x6B39, 0xD9DA},{0x6B3A, 0xB4DB},{0x6B3B, 0xD9DB},{0x6B3C, 0xD9DD},{0x6B3D, 0xB4DC}, - {0x6B3E, 0xB4DA},{0x6B3F, 0xD9DC},{0x6B41, 0xDDFA},{0x6B42, 0xDDF8},{0x6B43, 0xDDF7},{0x6B45, 0xDDF6},{0x6B46, 0xDDF5},{0x6B47, 0xB7B2}, - {0x6B48, 0xDDF9},{0x6B49, 0xBA70},{0x6B4A, 0xE263},{0x6B4B, 0xE265},{0x6B4C, 0xBA71},{0x6B4D, 0xE264},{0x6B4E, 0xBCDB},{0x6B50, 0xBCDA}, - {0x6B51, 0xE5F0},{0x6B54, 0xE9DF},{0x6B55, 0xE9DE},{0x6B56, 0xE9E0},{0x6B59, 0xBEF9},{0x6B5B, 0xED4B},{0x6B5C, 0xC0D3},{0x6B5E, 0xEFE8}, - {0x6B5F, 0xC26A},{0x6B60, 0xF259},{0x6B61, 0xC577},{0x6B62, 0xA4EE},{0x6B63, 0xA5BF},{0x6B64, 0xA6B9},{0x6B65, 0xA842},{0x6B66, 0xAA5A}, - {0x6B67, 0xAA5B},{0x6B6A, 0xAC6E},{0x6B6D, 0xD1FA},{0x6B72, 0xB7B3},{0x6B76, 0xE6D1},{0x6B77, 0xBEFA},{0x6B78, 0xC26B},{0x6B79, 0xA4EF}, - {0x6B7B, 0xA6BA},{0x6B7E, 0xCCEB},{0x6B7F, 0xAA5C},{0x6B80, 0xCCEA},{0x6B82, 0xCF65},{0x6B83, 0xAC6F},{0x6B84, 0xCF66},{0x6B86, 0xAC70}, - {0x6B88, 0xD1FC},{0x6B89, 0xAEEE},{0x6B8A, 0xAEED},{0x6B8C, 0xD5DE},{0x6B8D, 0xD5DC},{0x6B8E, 0xD5DD},{0x6B8F, 0xD5DB},{0x6B91, 0xD5DA}, - {0x6B94, 0xD9DE},{0x6B95, 0xD9E1},{0x6B96, 0xB4DE},{0x6B97, 0xD9DF},{0x6B98, 0xB4DD},{0x6B99, 0xD9E0},{0x6B9B, 0xDDFB},{0x6B9E, 0xE266}, - {0x6B9F, 0xE267},{0x6BA0, 0xE268},{0x6BA2, 0xE5F3},{0x6BA3, 0xE5F2},{0x6BA4, 0xBCDC},{0x6BA5, 0xE5F1},{0x6BA6, 0xE5F4},{0x6BA7, 0xE9E1}, - {0x6BAA, 0xE9E2},{0x6BAB, 0xE9E3},{0x6BAD, 0xED4C},{0x6BAE, 0xC0D4},{0x6BAF, 0xC26C},{0x6BB0, 0xF25A},{0x6BB2, 0xC4E8},{0x6BB3, 0xC95F}, - {0x6BB5, 0xAC71},{0x6BB6, 0xCF67},{0x6BB7, 0xAEEF},{0x6BBA, 0xB1FE},{0x6BBC, 0xB4DF},{0x6BBD, 0xD9E2},{0x6BBF, 0xB7B5},{0x6BC0, 0xB7B4}, - {0x6BC3, 0xE269},{0x6BC4, 0xE26A},{0x6BC5, 0xBCDD},{0x6BC6, 0xBCDE},{0x6BC7, 0xE9E5},{0x6BC8, 0xE9E4},{0x6BC9, 0xEFE9},{0x6BCA, 0xF7E3}, - {0x6BCB, 0xA4F0},{0x6BCC, 0xC960},{0x6BCD, 0xA5C0},{0x6BCF, 0xA843},{0x6BD0, 0xCB48},{0x6BD2, 0xAC72},{0x6BD3, 0xB7B6},{0x6BD4, 0xA4F1}, - {0x6BD6, 0xCF68},{0x6BD7, 0xAC73},{0x6BD8, 0xCF69},{0x6BDA, 0xC0D5},{0x6BDB, 0xA4F2},{0x6BDE, 0xCCEC},{0x6BE0, 0xCF6A},{0x6BE2, 0xD242}, - {0x6BE3, 0xD241},{0x6BE4, 0xD1FE},{0x6BE6, 0xD1FD},{0x6BE7, 0xD243},{0x6BE8, 0xD240},{0x6BEB, 0xB240},{0x6BEC, 0xB241},{0x6BEF, 0xB4E0}, - {0x6BF0, 0xD9E3},{0x6BF2, 0xD9E4},{0x6BF3, 0xD9E5},{0x6BF7, 0xDE41},{0x6BF8, 0xDE42},{0x6BF9, 0xDE40},{0x6BFB, 0xDDFD},{0x6BFC, 0xDDFE}, - {0x6BFD, 0xB7B7},{0x6BFE, 0xE26B},{0x6BFF, 0xE5F7},{0x6C00, 0xE5F6},{0x6C01, 0xE5F5},{0x6C02, 0xE5F8},{0x6C03, 0xE9E7},{0x6C04, 0xE9E6}, - {0x6C05, 0xBEFB},{0x6C06, 0xE9E8},{0x6C08, 0xC0D6},{0x6C09, 0xED4D},{0x6C0B, 0xEFEA},{0x6C0C, 0xF25B},{0x6C0D, 0xF6E7},{0x6C0F, 0xA4F3}, - {0x6C10, 0xA5C2},{0x6C11, 0xA5C1},{0x6C13, 0xAA5D},{0x6C14, 0xC961},{0x6C15, 0xC97E},{0x6C16, 0xA6BB},{0x6C18, 0xC9F7},{0x6C19, 0xCB49}, - {0x6C1A, 0xCB4A},{0x6C1B, 0xAA5E},{0x6C1D, 0xCCED},{0x6C1F, 0xAC74},{0x6C20, 0xCF6B},{0x6C21, 0xCF6C},{0x6C23, 0xAEF0},{0x6C24, 0xAEF4}, - {0x6C25, 0xD244},{0x6C26, 0xAEF3},{0x6C27, 0xAEF1},{0x6C28, 0xAEF2},{0x6C2A, 0xD5DF},{0x6C2B, 0xB242},{0x6C2C, 0xB4E3},{0x6C2E, 0xB4E1}, - {0x6C2F, 0xB4E2},{0x6C30, 0xD9E6},{0x6C33, 0xBA72},{0x6C34, 0xA4F4},{0x6C36, 0xC9A1},{0x6C38, 0xA5C3},{0x6C3B, 0xC9A4},{0x6C3E, 0xA5C6}, - {0x6C3F, 0xC9A3},{0x6C40, 0xA5C5},{0x6C41, 0xA5C4},{0x6C42, 0xA844},{0x6C43, 0xC9A2},{0x6C46, 0xC9F8},{0x6C4A, 0xC9FC},{0x6C4B, 0xC9FE}, - {0x6C4C, 0xCA40},{0x6C4D, 0xA6C5},{0x6C4E, 0xA6C6},{0x6C4F, 0xC9FB},{0x6C50, 0xA6C1},{0x6C52, 0xC9F9},{0x6C54, 0xC9FD},{0x6C55, 0xA6C2}, - {0x6C57, 0xA6BD},{0x6C59, 0xA6BE},{0x6C5B, 0xA6C4},{0x6C5C, 0xC9FA},{0x6C5D, 0xA6BC},{0x6C5E, 0xA845},{0x6C5F, 0xA6BF},{0x6C60, 0xA6C0}, - {0x6C61, 0xA6C3},{0x6C65, 0xCB5B},{0x6C66, 0xCB59},{0x6C67, 0xCB4C},{0x6C68, 0xA851},{0x6C69, 0xCB53},{0x6C6A, 0xA84C},{0x6C6B, 0xCB4D}, - {0x6C6D, 0xCB55},{0x6C6F, 0xCB52},{0x6C70, 0xA84F},{0x6C71, 0xCB51},{0x6C72, 0xA856},{0x6C73, 0xCB5A},{0x6C74, 0xA858},{0x6C76, 0xA85A}, - {0x6C78, 0xCB4B},{0x6C7A, 0xA84D},{0x6C7B, 0xCB5C},{0x6C7D, 0xA854},{0x6C7E, 0xA857},{0x6C80, 0xCD45},{0x6C81, 0xA847},{0x6C82, 0xA85E}, - {0x6C83, 0xA855},{0x6C84, 0xCB4E},{0x6C85, 0xA84A},{0x6C86, 0xA859},{0x6C87, 0xCB56},{0x6C88, 0xA848},{0x6C89, 0xA849},{0x6C8A, 0xCD43}, - {0x6C8B, 0xCB4F},{0x6C8C, 0xA850},{0x6C8D, 0xA85B},{0x6C8E, 0xCB5D},{0x6C8F, 0xCB50},{0x6C90, 0xA84E},{0x6C92, 0xA853},{0x6C93, 0xCCEE}, - {0x6C94, 0xA85C},{0x6C95, 0xCB57},{0x6C96, 0xA852},{0x6C98, 0xA85D},{0x6C99, 0xA846},{0x6C9A, 0xCB54},{0x6C9B, 0xA84B},{0x6C9C, 0xCB58}, - {0x6C9D, 0xCD44},{0x6CAB, 0xAA6A},{0x6CAC, 0xAA7A},{0x6CAD, 0xCCF5},{0x6CAE, 0xAA71},{0x6CB0, 0xCD4B},{0x6CB1, 0xAA62},{0x6CB3, 0xAA65}, - {0x6CB4, 0xCD42},{0x6CB6, 0xCCF3},{0x6CB7, 0xCCF7},{0x6CB8, 0xAA6D},{0x6CB9, 0xAA6F},{0x6CBA, 0xCCFA},{0x6CBB, 0xAA76},{0x6CBC, 0xAA68}, - {0x6CBD, 0xAA66},{0x6CBE, 0xAA67},{0x6CBF, 0xAA75},{0x6CC0, 0xCD47},{0x6CC1, 0xAA70},{0x6CC2, 0xCCF9},{0x6CC3, 0xCCFB},{0x6CC4, 0xAA6E}, - {0x6CC5, 0xAA73},{0x6CC6, 0xCCFC},{0x6CC7, 0xCD4A},{0x6CC9, 0xAC75},{0x6CCA, 0xAA79},{0x6CCC, 0xAA63},{0x6CCD, 0xCD49},{0x6CCF, 0xCD4D}, - {0x6CD0, 0xCCF8},{0x6CD1, 0xCD4F},{0x6CD2, 0xCD40},{0x6CD3, 0xAA6C},{0x6CD4, 0xCCF4},{0x6CD5, 0xAA6B},{0x6CD6, 0xAA7D},{0x6CD7, 0xAA72}, - {0x6CD9, 0xCCF2},{0x6CDA, 0xCF75},{0x6CDB, 0xAA78},{0x6CDC, 0xAA7C},{0x6CDD, 0xCD41},{0x6CDE, 0xCD46},{0x6CE0, 0xAA7E},{0x6CE1, 0xAA77}, - {0x6CE2, 0xAA69},{0x6CE3, 0xAA5F},{0x6CE5, 0xAA64},{0x6CE7, 0xCCF6},{0x6CE8, 0xAA60},{0x6CE9, 0xCD4E},{0x6CEB, 0xCCF0},{0x6CEC, 0xCCEF}, - {0x6CED, 0xCCFD},{0x6CEE, 0xCCF1},{0x6CEF, 0xAA7B},{0x6CF0, 0xAEF5},{0x6CF1, 0xAA74},{0x6CF2, 0xCCFE},{0x6CF3, 0xAA61},{0x6CF5, 0xACA6}, - {0x6CF9, 0xCD4C},{0x6D00, 0xCF7C},{0x6D01, 0xCFA1},{0x6D03, 0xCFA4},{0x6D04, 0xCF77},{0x6D07, 0xCFA7},{0x6D08, 0xCFAA},{0x6D09, 0xCFAC}, - {0x6D0A, 0xCF74},{0x6D0B, 0xAC76},{0x6D0C, 0xAC7B},{0x6D0D, 0xD249},{0x6D0E, 0xACAD},{0x6D0F, 0xCFA5},{0x6D10, 0xCFAD},{0x6D11, 0xCF7B}, - {0x6D12, 0xCF73},{0x6D16, 0xD264},{0x6D17, 0xAC7E},{0x6D18, 0xCFA2},{0x6D19, 0xCF78},{0x6D1A, 0xCF7A},{0x6D1B, 0xACA5},{0x6D1D, 0xCF7D}, - {0x6D1E, 0xAC7D},{0x6D1F, 0xCF70},{0x6D20, 0xCFA8},{0x6D22, 0xCFAB},{0x6D25, 0xAC7A},{0x6D27, 0xACA8},{0x6D28, 0xCF6D},{0x6D29, 0xACAA}, - {0x6D2A, 0xAC78},{0x6D2B, 0xACAE},{0x6D2C, 0xCFA9},{0x6D2D, 0xCF6F},{0x6D2E, 0xACAB},{0x6D2F, 0xD25E},{0x6D30, 0xCD48},{0x6D31, 0xAC7C}, - {0x6D32, 0xAC77},{0x6D33, 0xCF76},{0x6D34, 0xCF6E},{0x6D35, 0xACAC},{0x6D36, 0xACA4},{0x6D37, 0xCFA3},{0x6D38, 0xACA9},{0x6D39, 0xACA7}, - {0x6D3A, 0xCF79},{0x6D3B, 0xACA1},{0x6D3C, 0xCF71},{0x6D3D, 0xACA2},{0x6D3E, 0xACA3},{0x6D3F, 0xCF72},{0x6D40, 0xCFA6},{0x6D41, 0xAC79}, - {0x6D42, 0xCF7E},{0x6D58, 0xD24C},{0x6D59, 0xAEFD},{0x6D5A, 0xAF43},{0x6D5E, 0xD255},{0x6D5F, 0xD25B},{0x6D60, 0xD257},{0x6D61, 0xD24A}, - {0x6D62, 0xD24D},{0x6D63, 0xD246},{0x6D64, 0xD247},{0x6D65, 0xAF4A},{0x6D66, 0xAEFA},{0x6D67, 0xD256},{0x6D68, 0xD25F},{0x6D69, 0xAF45}, - {0x6D6A, 0xAEF6},{0x6D6C, 0xAF40},{0x6D6D, 0xD24E},{0x6D6E, 0xAF42},{0x6D6F, 0xD24F},{0x6D70, 0xD259},{0x6D74, 0xAF44},{0x6D75, 0xD268}, - {0x6D76, 0xD248},{0x6D77, 0xAEFC},{0x6D78, 0xAEFB},{0x6D79, 0xAF48},{0x6D7A, 0xD245},{0x6D7B, 0xD266},{0x6D7C, 0xD25A},{0x6D7D, 0xD267}, - {0x6D7E, 0xD261},{0x6D7F, 0xD253},{0x6D80, 0xD262},{0x6D82, 0xD25C},{0x6D83, 0xD265},{0x6D84, 0xD263},{0x6D85, 0xAF49},{0x6D86, 0xD254}, - {0x6D87, 0xAEF9},{0x6D88, 0xAEF8},{0x6D89, 0xAF41},{0x6D8A, 0xAF47},{0x6D8B, 0xD260},{0x6D8C, 0xAF46},{0x6D8D, 0xD251},{0x6D8E, 0xB243}, - {0x6D90, 0xD269},{0x6D91, 0xD250},{0x6D92, 0xD24B},{0x6D93, 0xAEFE},{0x6D94, 0xAF4B},{0x6D95, 0xAEF7},{0x6D97, 0xD258},{0x6D98, 0xD25D}, - {0x6DAA, 0xB265},{0x6DAB, 0xD5E1},{0x6DAC, 0xD5E5},{0x6DAE, 0xB252},{0x6DAF, 0xB250},{0x6DB2, 0xB247},{0x6DB3, 0xD5E3},{0x6DB4, 0xD5E2}, - {0x6DB5, 0xB25B},{0x6DB7, 0xD5E8},{0x6DB8, 0xB255},{0x6DBA, 0xD5FA},{0x6DBB, 0xD647},{0x6DBC, 0xB244},{0x6DBD, 0xD5F7},{0x6DBE, 0xD5F0}, - {0x6DBF, 0xB267},{0x6DC0, 0xD5E0},{0x6DC2, 0xD5FC},{0x6DC4, 0xB264},{0x6DC5, 0xB258},{0x6DC6, 0xB263},{0x6DC7, 0xB24E},{0x6DC8, 0xD5EC}, - {0x6DC9, 0xD5FE},{0x6DCA, 0xD5F6},{0x6DCB, 0xB24F},{0x6DCC, 0xB249},{0x6DCD, 0xD645},{0x6DCF, 0xD5FD},{0x6DD0, 0xD640},{0x6DD1, 0xB251}, - {0x6DD2, 0xB259},{0x6DD3, 0xD642},{0x6DD4, 0xD5EA},{0x6DD5, 0xD5FB},{0x6DD6, 0xD5EF},{0x6DD7, 0xD644},{0x6DD8, 0xB25E},{0x6DD9, 0xB246}, - {0x6DDA, 0xB25C},{0x6DDB, 0xD5F4},{0x6DDC, 0xD5F2},{0x6DDD, 0xD5F3},{0x6DDE, 0xB253},{0x6DDF, 0xD5EE},{0x6DE0, 0xD5ED},{0x6DE1, 0xB248}, - {0x6DE2, 0xD5E7},{0x6DE3, 0xD646},{0x6DE4, 0xB24A},{0x6DE5, 0xD5F1},{0x6DE6, 0xB268},{0x6DE8, 0xB262},{0x6DE9, 0xD5E6},{0x6DEA, 0xB25F}, - {0x6DEB, 0xB25D},{0x6DEC, 0xB266},{0x6DED, 0xD5F8},{0x6DEE, 0xB261},{0x6DEF, 0xD252},{0x6DF0, 0xD5F9},{0x6DF1, 0xB260},{0x6DF2, 0xD641}, - {0x6DF3, 0xB245},{0x6DF4, 0xD5F5},{0x6DF5, 0xB257},{0x6DF6, 0xD5E9},{0x6DF7, 0xB256},{0x6DF9, 0xB254},{0x6DFA, 0xB24C},{0x6DFB, 0xB24B}, - {0x6DFC, 0xD9E7},{0x6DFD, 0xD643},{0x6E00, 0xD5EB},{0x6E03, 0xD9FC},{0x6E05, 0xB24D},{0x6E19, 0xB541},{0x6E1A, 0xB25A},{0x6E1B, 0xB4EE}, - {0x6E1C, 0xD9F6},{0x6E1D, 0xB4FC},{0x6E1F, 0xD9EA},{0x6E20, 0xB4EB},{0x6E21, 0xB4E7},{0x6E22, 0xDA49},{0x6E23, 0xB4ED},{0x6E24, 0xB4F1}, - {0x6E25, 0xB4EC},{0x6E26, 0xB4F5},{0x6E27, 0xDA4D},{0x6E28, 0xDA44},{0x6E2B, 0xD9F1},{0x6E2C, 0xB4FA},{0x6E2D, 0xB4F4},{0x6E2E, 0xD9FD}, - {0x6E2F, 0xB4E4},{0x6E30, 0xDA4A},{0x6E31, 0xDA43},{0x6E32, 0xB4E8},{0x6E33, 0xD9F7},{0x6E34, 0xB4F7},{0x6E35, 0xDA55},{0x6E36, 0xDA56}, - {0x6E38, 0xB4E5},{0x6E39, 0xDA48},{0x6E3A, 0xB4F9},{0x6E3B, 0xD9FB},{0x6E3C, 0xD9ED},{0x6E3D, 0xD9EE},{0x6E3E, 0xB4FD},{0x6E3F, 0xD9F2}, - {0x6E40, 0xD9F9},{0x6E41, 0xD9F3},{0x6E43, 0xB4FB},{0x6E44, 0xB544},{0x6E45, 0xD9EF},{0x6E46, 0xD9E8},{0x6E47, 0xD9E9},{0x6E49, 0xD9EB}, - {0x6E4A, 0xB4EA},{0x6E4B, 0xD9F8},{0x6E4D, 0xB4F8},{0x6E4E, 0xB542},{0x6E51, 0xD9FA},{0x6E52, 0xDA53},{0x6E53, 0xDA4B},{0x6E54, 0xB4E6}, - {0x6E55, 0xDA51},{0x6E56, 0xB4F2},{0x6E58, 0xB4F0},{0x6E5A, 0xDA57},{0x6E5B, 0xB4EF},{0x6E5C, 0xDA41},{0x6E5D, 0xD9F4},{0x6E5E, 0xD9FE}, - {0x6E5F, 0xB547},{0x6E60, 0xDA45},{0x6E61, 0xDA42},{0x6E62, 0xD9F0},{0x6E63, 0xB543},{0x6E64, 0xDA4F},{0x6E65, 0xDA4C},{0x6E66, 0xDA54}, - {0x6E67, 0xB4E9},{0x6E68, 0xDA40},{0x6E69, 0xB546},{0x6E6B, 0xDA47},{0x6E6E, 0xB4F3},{0x6E6F, 0xB4F6},{0x6E71, 0xDA46},{0x6E72, 0xB545}, - {0x6E73, 0xD9F5},{0x6E74, 0xD5E4},{0x6E77, 0xDA50},{0x6E78, 0xDA4E},{0x6E79, 0xDA52},{0x6E88, 0xD9EC},{0x6E89, 0xB540},{0x6E8D, 0xDE61}, - {0x6E8E, 0xDE60},{0x6E8F, 0xDE46},{0x6E90, 0xB7BD},{0x6E92, 0xDE5F},{0x6E93, 0xDE49},{0x6E94, 0xDE4A},{0x6E96, 0xB7C7},{0x6E97, 0xDE68}, - {0x6E98, 0xB7C2},{0x6E99, 0xDE5E},{0x6E9B, 0xDE43},{0x6E9C, 0xB7C8},{0x6E9D, 0xB7BE},{0x6E9E, 0xDE52},{0x6E9F, 0xDE48},{0x6EA0, 0xDE4B}, - {0x6EA1, 0xDE63},{0x6EA2, 0xB7B8},{0x6EA3, 0xDE6A},{0x6EA4, 0xDE62},{0x6EA5, 0xB7C1},{0x6EA6, 0xDE57},{0x6EA7, 0xB7CC},{0x6EAA, 0xB7CB}, - {0x6EAB, 0xB7C5},{0x6EAE, 0xDE69},{0x6EAF, 0xB7B9},{0x6EB0, 0xDE55},{0x6EB1, 0xDE4C},{0x6EB2, 0xDE59},{0x6EB3, 0xDE65},{0x6EB4, 0xB7CD}, - {0x6EB6, 0xB7BB},{0x6EB7, 0xDE54},{0x6EB9, 0xDE4D},{0x6EBA, 0xB7C4},{0x6EBC, 0xB7C3},{0x6EBD, 0xDE50},{0x6EBE, 0xDE5A},{0x6EBF, 0xDE64}, - {0x6EC0, 0xDE47},{0x6EC1, 0xDE51},{0x6EC2, 0xB7BC},{0x6EC3, 0xDE5B},{0x6EC4, 0xB7C9},{0x6EC5, 0xB7C0},{0x6EC6, 0xDE4E},{0x6EC7, 0xB7BF}, - {0x6EC8, 0xDE45},{0x6EC9, 0xDE53},{0x6ECA, 0xDE67},{0x6ECB, 0xB4FE},{0x6ECC, 0xBAB0},{0x6ECD, 0xDE56},{0x6ECE, 0xE26C},{0x6ECF, 0xDE58}, - {0x6ED0, 0xDE66},{0x6ED1, 0xB7C6},{0x6ED2, 0xDE4F},{0x6ED3, 0xB7BA},{0x6ED4, 0xB7CA},{0x6ED5, 0xBCF0},{0x6ED6, 0xDE44},{0x6ED8, 0xDE5D}, - {0x6EDC, 0xDE5C},{0x6EEB, 0xE2AA},{0x6EEC, 0xBAAD},{0x6EED, 0xE27D},{0x6EEE, 0xE2A4},{0x6EEF, 0xBAA2},{0x6EF1, 0xE26E},{0x6EF2, 0xBAAF}, - {0x6EF4, 0xBA77},{0x6EF5, 0xE26D},{0x6EF6, 0xE2B0},{0x6EF7, 0xBAB1},{0x6EF8, 0xE271},{0x6EF9, 0xE2A3},{0x6EFB, 0xE273},{0x6EFC, 0xE2B3}, - {0x6EFD, 0xE2AF},{0x6EFE, 0xBA75},{0x6EFF, 0xBAA1},{0x6F00, 0xE653},{0x6F01, 0xBAAE},{0x6F02, 0xBA7D},{0x6F03, 0xE26F},{0x6F05, 0xE2AE}, - {0x6F06, 0xBAA3},{0x6F07, 0xE2AB},{0x6F08, 0xE2B8},{0x6F09, 0xE275},{0x6F0A, 0xE27E},{0x6F0D, 0xE2B6},{0x6F0E, 0xE2AC},{0x6F0F, 0xBA7C}, - {0x6F12, 0xE27C},{0x6F13, 0xBA76},{0x6F14, 0xBA74},{0x6F15, 0xBAA8},{0x6F18, 0xE27A},{0x6F19, 0xE277},{0x6F1A, 0xE278},{0x6F1C, 0xE2B2}, - {0x6F1E, 0xE2B7},{0x6F1F, 0xE2B5},{0x6F20, 0xBA7A},{0x6F21, 0xE2B9},{0x6F22, 0xBA7E},{0x6F23, 0xBAA7},{0x6F25, 0xE270},{0x6F26, 0xE5FA}, - {0x6F27, 0xE279},{0x6F29, 0xBA78},{0x6F2A, 0xBAAC},{0x6F2B, 0xBAA9},{0x6F2C, 0xBA7B},{0x6F2D, 0xE2A5},{0x6F2E, 0xE274},{0x6F2F, 0xBAAA}, - {0x6F30, 0xE2A7},{0x6F31, 0xBAA4},{0x6F32, 0xBAA6},{0x6F33, 0xBA73},{0x6F35, 0xE2A9},{0x6F36, 0xE2A1},{0x6F37, 0xE272},{0x6F38, 0xBAA5}, - {0x6F39, 0xE2B1},{0x6F3A, 0xE2B4},{0x6F3B, 0xE27B},{0x6F3C, 0xE2A8},{0x6F3E, 0xBA79},{0x6F3F, 0xBCDF},{0x6F40, 0xE2A6},{0x6F41, 0xE5F9}, - {0x6F43, 0xE2AD},{0x6F4E, 0xE276},{0x6F4F, 0xE644},{0x6F50, 0xE64E},{0x6F51, 0xBCE2},{0x6F52, 0xE64D},{0x6F53, 0xE659},{0x6F54, 0xBCE4}, - {0x6F55, 0xE64B},{0x6F57, 0xE64F},{0x6F58, 0xBCEF},{0x6F5A, 0xE646},{0x6F5B, 0xBCE7},{0x6F5D, 0xE652},{0x6F5E, 0xE9F0},{0x6F5F, 0xBCF3}, - {0x6F60, 0xBCF2},{0x6F61, 0xE654},{0x6F62, 0xE643},{0x6F63, 0xE65E},{0x6F64, 0xBCED},{0x6F66, 0xBCE3},{0x6F67, 0xE657},{0x6F69, 0xE65B}, - {0x6F6A, 0xE660},{0x6F6B, 0xE655},{0x6F6C, 0xE649},{0x6F6D, 0xBCE6},{0x6F6E, 0xBCE9},{0x6F6F, 0xBCF1},{0x6F70, 0xBCEC},{0x6F72, 0xE64C}, - {0x6F73, 0xE2A2},{0x6F76, 0xE648},{0x6F77, 0xE65F},{0x6F78, 0xBCE8},{0x6F7A, 0xBCEB},{0x6F7B, 0xE661},{0x6F7C, 0xBCE0},{0x6F7D, 0xE656}, - {0x6F7E, 0xE5FB},{0x6F7F, 0xE65C},{0x6F80, 0xC0DF},{0x6F82, 0xE64A},{0x6F84, 0xBCE1},{0x6F85, 0xE645},{0x6F86, 0xBCE5},{0x6F87, 0xE5FC}, - {0x6F88, 0xBAAB},{0x6F89, 0xE641},{0x6F8B, 0xE65A},{0x6F8C, 0xE642},{0x6F8D, 0xE640},{0x6F8E, 0xBCEA},{0x6F90, 0xE658},{0x6F92, 0xE5FE}, - {0x6F93, 0xE651},{0x6F94, 0xE650},{0x6F95, 0xE65D},{0x6F96, 0xE647},{0x6F97, 0xBCEE},{0x6F9E, 0xE9F3},{0x6FA0, 0xBF49},{0x6FA1, 0xBEFE}, - {0x6FA2, 0xEA40},{0x6FA3, 0xE9EB},{0x6FA4, 0xBF41},{0x6FA5, 0xE9F7},{0x6FA6, 0xBF48},{0x6FA7, 0xBF43},{0x6FA8, 0xE9F5},{0x6FA9, 0xED4F}, - {0x6FAA, 0xE9FB},{0x6FAB, 0xEA42},{0x6FAC, 0xE9FA},{0x6FAD, 0xE9E9},{0x6FAE, 0xE9F8},{0x6FAF, 0xEA44},{0x6FB0, 0xEA46},{0x6FB1, 0xBEFD}, - {0x6FB2, 0xEA45},{0x6FB3, 0xBF44},{0x6FB4, 0xBF4A},{0x6FB6, 0xBF47},{0x6FB8, 0xE9FE},{0x6FB9, 0xBF46},{0x6FBA, 0xE9F9},{0x6FBC, 0xE9ED}, - {0x6FBD, 0xE9F2},{0x6FBF, 0xE9FD},{0x6FC0, 0xBF45},{0x6FC1, 0xBF42},{0x6FC2, 0xBEFC},{0x6FC3, 0xBF40},{0x6FC4, 0xE9F1},{0x6FC6, 0xE5FD}, - {0x6FC7, 0xE9EC},{0x6FC8, 0xE9EF},{0x6FC9, 0xEA41},{0x6FCA, 0xE9F4},{0x6FCB, 0xE9EA},{0x6FCC, 0xED4E},{0x6FCD, 0xEA43},{0x6FCE, 0xE9EE}, - {0x6FCF, 0xE9FC},{0x6FD4, 0xED51},{0x6FD5, 0xC0E3},{0x6FD8, 0xC0D7},{0x6FDB, 0xC0DB},{0x6FDC, 0xED53},{0x6FDD, 0xED59},{0x6FDE, 0xED57}, - {0x6FDF, 0xC0D9},{0x6FE0, 0xC0DA},{0x6FE1, 0xC0E1},{0x6FE2, 0xED5A},{0x6FE3, 0xED52},{0x6FE4, 0xC0DC},{0x6FE6, 0xED56},{0x6FE7, 0xED55}, - {0x6FE8, 0xED5B},{0x6FE9, 0xC0E2},{0x6FEB, 0xC0DD},{0x6FEC, 0xC0E0},{0x6FED, 0xED54},{0x6FEE, 0xC0E4},{0x6FEF, 0xC0DE},{0x6FF0, 0xC0E5}, - {0x6FF1, 0xC0D8},{0x6FF2, 0xED58},{0x6FF4, 0xED50},{0x6FF7, 0xEFF7},{0x6FFA, 0xC271},{0x6FFB, 0xEFF4},{0x6FFC, 0xEFF6},{0x6FFE, 0xC26F}, - {0x6FFF, 0xEFF2},{0x7000, 0xEFF3},{0x7001, 0xEFEE},{0x7004, 0xE9F6},{0x7005, 0xEFEF},{0x7006, 0xC270},{0x7007, 0xEFEB},{0x7009, 0xC26D}, - {0x700A, 0xEFF8},{0x700B, 0xC26E},{0x700C, 0xEFEC},{0x700D, 0xEFED},{0x700E, 0xEFF1},{0x700F, 0xC273},{0x7011, 0xC272},{0x7014, 0xEFF0}, - {0x7015, 0xC378},{0x7016, 0xF25F},{0x7017, 0xF265},{0x7018, 0xC379},{0x7019, 0xF25C},{0x701A, 0xC376},{0x701B, 0xC373},{0x701C, 0xF267}, - {0x701D, 0xC377},{0x701F, 0xC374},{0x7020, 0xF25E},{0x7021, 0xF261},{0x7022, 0xF262},{0x7023, 0xF263},{0x7024, 0xF266},{0x7026, 0xEFF5}, - {0x7027, 0xF25D},{0x7028, 0xC375},{0x7029, 0xF264},{0x702A, 0xF268},{0x702B, 0xF260},{0x702F, 0xF45D},{0x7030, 0xC46A},{0x7031, 0xF460}, - {0x7032, 0xC46B},{0x7033, 0xF468},{0x7034, 0xF45F},{0x7035, 0xF45C},{0x7037, 0xF45E},{0x7038, 0xF462},{0x7039, 0xF465},{0x703A, 0xF464}, - {0x703B, 0xF467},{0x703C, 0xF45B},{0x703E, 0xC469},{0x703F, 0xF463},{0x7040, 0xF466},{0x7041, 0xF469},{0x7042, 0xF461},{0x7043, 0xF5D3}, - {0x7044, 0xF5D4},{0x7045, 0xF5D8},{0x7046, 0xF5D9},{0x7048, 0xF5D6},{0x7049, 0xF5D7},{0x704A, 0xF5D5},{0x704C, 0xC4E9},{0x7051, 0xC578}, - {0x7052, 0xF6EB},{0x7055, 0xF6E8},{0x7056, 0xF6E9},{0x7057, 0xF6EA},{0x7058, 0xC579},{0x705A, 0xF7E5},{0x705B, 0xF7E4},{0x705D, 0xF8AF}, - {0x705E, 0xC5F4},{0x705F, 0xF8AD},{0x7060, 0xF8B0},{0x7061, 0xF8AE},{0x7062, 0xF8F5},{0x7063, 0xC657},{0x7064, 0xC665},{0x7065, 0xF9A3}, - {0x7066, 0xF96C},{0x7068, 0xF9A2},{0x7069, 0xF9D0},{0x706A, 0xF9D1},{0x706B, 0xA4F5},{0x7070, 0xA6C7},{0x7071, 0xCA41},{0x7074, 0xCB5E}, - {0x7076, 0xA85F},{0x7078, 0xA862},{0x707A, 0xCB5F},{0x707C, 0xA860},{0x707D, 0xA861},{0x7082, 0xCD58},{0x7083, 0xCD5A},{0x7084, 0xCD55}, - {0x7085, 0xCD52},{0x7086, 0xCD54},{0x708A, 0xAAA4},{0x708E, 0xAAA2},{0x7091, 0xCD56},{0x7092, 0xAAA3},{0x7093, 0xCD53},{0x7094, 0xCD50}, - {0x7095, 0xAAA1},{0x7096, 0xCD57},{0x7098, 0xCD51},{0x7099, 0xAAA5},{0x709A, 0xCD59},{0x709F, 0xCFAF},{0x70A1, 0xCFB3},{0x70A4, 0xACB7}, - {0x70A9, 0xCFB6},{0x70AB, 0xACAF},{0x70AC, 0xACB2},{0x70AD, 0xACB4},{0x70AE, 0xACB6},{0x70AF, 0xACB3},{0x70B0, 0xCFB2},{0x70B1, 0xCFB1}, - {0x70B3, 0xACB1},{0x70B4, 0xCFB4},{0x70B5, 0xCFB5},{0x70B7, 0xCFAE},{0x70B8, 0xACB5},{0x70BA, 0xACB0},{0x70BE, 0xCFB0},{0x70C5, 0xD277}, - {0x70C6, 0xD278},{0x70C7, 0xD279},{0x70C8, 0xAF50},{0x70CA, 0xAF4C},{0x70CB, 0xD26E},{0x70CD, 0xD276},{0x70CE, 0xD27B},{0x70CF, 0xAF51}, - {0x70D1, 0xD26C},{0x70D2, 0xD272},{0x70D3, 0xD26B},{0x70D4, 0xD275},{0x70D7, 0xD271},{0x70D8, 0xAF4D},{0x70D9, 0xAF4F},{0x70DA, 0xD27A}, - {0x70DC, 0xD26A},{0x70DD, 0xD26D},{0x70DE, 0xD273},{0x70E0, 0xD274},{0x70E1, 0xD27C},{0x70E2, 0xD270},{0x70E4, 0xAF4E},{0x70EF, 0xB26D}, - {0x70F0, 0xD64E},{0x70F3, 0xD650},{0x70F4, 0xD64C},{0x70F6, 0xD658},{0x70F7, 0xD64A},{0x70F8, 0xD657},{0x70F9, 0xB269},{0x70FA, 0xD648}, - {0x70FB, 0xDA5B},{0x70FC, 0xD652},{0x70FD, 0xB26C},{0x70FF, 0xD653},{0x7100, 0xD656},{0x7102, 0xD65A},{0x7104, 0xD64F},{0x7106, 0xD654}, - {0x7109, 0xB26A},{0x710A, 0xB26B},{0x710B, 0xD659},{0x710C, 0xD64D},{0x710D, 0xD649},{0x710E, 0xD65B},{0x7110, 0xD651},{0x7113, 0xD655}, - {0x7117, 0xD64B},{0x7119, 0xB548},{0x711A, 0xB549},{0x711B, 0xDA65},{0x711C, 0xB54F},{0x711E, 0xDA59},{0x711F, 0xDA62},{0x7120, 0xDA58}, - {0x7121, 0xB54C},{0x7122, 0xDA60},{0x7123, 0xDA5E},{0x7125, 0xDA5F},{0x7126, 0xB54A},{0x7128, 0xDA63},{0x712E, 0xDA5C},{0x712F, 0xDA5A}, - {0x7130, 0xB54B},{0x7131, 0xDA5D},{0x7132, 0xDA61},{0x7136, 0xB54D},{0x713A, 0xDA64},{0x7141, 0xDE70},{0x7142, 0xDE77},{0x7143, 0xDE79}, - {0x7144, 0xDEA1},{0x7146, 0xB7DA},{0x7147, 0xDE6B},{0x7149, 0xB7D2},{0x714B, 0xDE7A},{0x714C, 0xB7D7},{0x714D, 0xDEA2},{0x714E, 0xB7CE}, - {0x7150, 0xDE7D},{0x7152, 0xDE6D},{0x7153, 0xDE7E},{0x7154, 0xDE6C},{0x7156, 0xB7DC},{0x7158, 0xDE78},{0x7159, 0xB7CF},{0x715A, 0xDEA3}, - {0x715C, 0xB7D4},{0x715D, 0xDE71},{0x715E, 0xB7D9},{0x715F, 0xDE7C},{0x7160, 0xDE6F},{0x7161, 0xDE76},{0x7162, 0xDE72},{0x7163, 0xDE6E}, - {0x7164, 0xB7D1},{0x7165, 0xB7D8},{0x7166, 0xB7D6},{0x7167, 0xB7D3},{0x7168, 0xB7DB},{0x7169, 0xB7D0},{0x716A, 0xDE75},{0x716C, 0xB7D5}, - {0x716E, 0xB54E},{0x7170, 0xDE7B},{0x7172, 0xDE73},{0x7178, 0xDE74},{0x717B, 0xE2C1},{0x717D, 0xBAB4},{0x7180, 0xE2BD},{0x7181, 0xE2C3}, - {0x7182, 0xE2BF},{0x7184, 0xBAB6},{0x7185, 0xE2BE},{0x7186, 0xE2C2},{0x7187, 0xE2BA},{0x7189, 0xE2BC},{0x718A, 0xBAB5},{0x718F, 0xE2C0}, - {0x7190, 0xE2BB},{0x7192, 0xBAB7},{0x7194, 0xBAB2},{0x7197, 0xE2C4},{0x7199, 0xBAB3},{0x719A, 0xE667},{0x719B, 0xE664},{0x719C, 0xE670}, - {0x719D, 0xE66A},{0x719E, 0xE66C},{0x719F, 0xBCF4},{0x71A0, 0xE666},{0x71A1, 0xE66E},{0x71A4, 0xE66D},{0x71A5, 0xE66B},{0x71A7, 0xE671}, - {0x71A8, 0xBCF7},{0x71A9, 0xE668},{0x71AA, 0xE66F},{0x71AC, 0xBCF5},{0x71AF, 0xE663},{0x71B0, 0xE665},{0x71B1, 0xBCF6},{0x71B2, 0xE662}, - {0x71B3, 0xE672},{0x71B5, 0xE669},{0x71B8, 0xEA4A},{0x71B9, 0xBF51},{0x71BC, 0xEA55},{0x71BD, 0xEA53},{0x71BE, 0xBF4B},{0x71BF, 0xEA49}, - {0x71C0, 0xEA4C},{0x71C1, 0xEA4D},{0x71C2, 0xEA48},{0x71C3, 0xBF55},{0x71C4, 0xBF56},{0x71C5, 0xEA47},{0x71C6, 0xEA56},{0x71C7, 0xEA51}, - {0x71C8, 0xBF4F},{0x71C9, 0xBF4C},{0x71CA, 0xEA50},{0x71CB, 0xEA4E},{0x71CE, 0xBF52},{0x71CF, 0xEA52},{0x71D0, 0xBF4D},{0x71D2, 0xBF4E}, - {0x71D4, 0xEA4F},{0x71D5, 0xBF50},{0x71D6, 0xEA4B},{0x71D8, 0xEA54},{0x71D9, 0xBF53},{0x71DA, 0xEA57},{0x71DB, 0xEA58},{0x71DC, 0xBF54}, - {0x71DF, 0xC0E7},{0x71E0, 0xC0EE},{0x71E1, 0xED5C},{0x71E2, 0xED62},{0x71E4, 0xED60},{0x71E5, 0xC0EA},{0x71E6, 0xC0E9},{0x71E7, 0xC0E6}, - {0x71E8, 0xED5E},{0x71EC, 0xC0EC},{0x71ED, 0xC0EB},{0x71EE, 0xC0E8},{0x71F0, 0xED61},{0x71F1, 0xED5D},{0x71F2, 0xED5F},{0x71F4, 0xC0ED}, - {0x71F8, 0xC277},{0x71F9, 0xEFFB},{0x71FB, 0xC274},{0x71FC, 0xC275},{0x71FD, 0xEFFD},{0x71FE, 0xC276},{0x71FF, 0xEFFA},{0x7201, 0xEFF9}, - {0x7202, 0xF26C},{0x7203, 0xEFFC},{0x7205, 0xF26D},{0x7206, 0xC37A},{0x7207, 0xF26B},{0x720A, 0xF26A},{0x720C, 0xF269},{0x720D, 0xC37B}, - {0x7210, 0xC46C},{0x7213, 0xF46A},{0x7214, 0xF46B},{0x7219, 0xF5DC},{0x721A, 0xF5DB},{0x721B, 0xC4EA},{0x721D, 0xF5DA},{0x721E, 0xF6EC}, - {0x721F, 0xF6ED},{0x7222, 0xF7E6},{0x7223, 0xF8B1},{0x7226, 0xF8F6},{0x7227, 0xF9BC},{0x7228, 0xC679},{0x7229, 0xF9C6},{0x722A, 0xA4F6}, - {0x722C, 0xAAA6},{0x722D, 0xAAA7},{0x7230, 0xACB8},{0x7235, 0xC0EF},{0x7236, 0xA4F7},{0x7238, 0xAAA8},{0x7239, 0xAF52},{0x723A, 0xB7DD}, - {0x723B, 0xA4F8},{0x723D, 0xB26E},{0x723E, 0xBAB8},{0x723F, 0xC962},{0x7241, 0xCFB7},{0x7242, 0xD27D},{0x7244, 0xE2C5},{0x7246, 0xC0F0}, - {0x7247, 0xA4F9},{0x7248, 0xAAA9},{0x7249, 0xCFB8},{0x724A, 0xCFB9},{0x724B, 0xDA66},{0x724C, 0xB550},{0x724F, 0xDEA4},{0x7252, 0xB7DE}, - {0x7253, 0xE2C6},{0x7256, 0xBCF8},{0x7258, 0xC37C},{0x7259, 0xA4FA},{0x725A, 0xDA67},{0x725B, 0xA4FB},{0x725D, 0xA6C9},{0x725E, 0xCA42}, - {0x725F, 0xA6C8},{0x7260, 0xA865},{0x7261, 0xA864},{0x7262, 0xA863},{0x7263, 0xCB60},{0x7267, 0xAAAA},{0x7269, 0xAAAB},{0x726A, 0xCD5B}, - {0x726C, 0xCFBA},{0x726E, 0xCFBD},{0x726F, 0xACBA},{0x7270, 0xCFBB},{0x7272, 0xACB9},{0x7273, 0xCFBC},{0x7274, 0xACBB},{0x7276, 0xD2A2}, - {0x7277, 0xD2A1},{0x7278, 0xD27E},{0x7279, 0xAF53},{0x727B, 0xD65D},{0x727C, 0xD65E},{0x727D, 0xB26F},{0x727E, 0xD65C},{0x727F, 0xD65F}, - {0x7280, 0xB552},{0x7281, 0xB270},{0x7284, 0xB551},{0x7285, 0xDA6B},{0x7286, 0xDA6A},{0x7288, 0xDA68},{0x7289, 0xDA69},{0x728B, 0xDA6C}, - {0x728C, 0xDEA6},{0x728D, 0xDEA5},{0x728E, 0xDEA9},{0x7290, 0xDEA8},{0x7291, 0xDEA7},{0x7292, 0xBAB9},{0x7293, 0xE2C9},{0x7295, 0xE2C8}, - {0x7296, 0xBABA},{0x7297, 0xE2C7},{0x7298, 0xE673},{0x729A, 0xE674},{0x729B, 0xBCF9},{0x729D, 0xEA59},{0x729E, 0xEA5A},{0x72A1, 0xF272}, - {0x72A2, 0xC37D},{0x72A3, 0xF271},{0x72A4, 0xF270},{0x72A5, 0xF26E},{0x72A6, 0xF26F},{0x72A7, 0xC4EB},{0x72A8, 0xF46C},{0x72A9, 0xF6EE}, - {0x72AA, 0xF8F7},{0x72AC, 0xA4FC},{0x72AE, 0xC9A5},{0x72AF, 0xA5C7},{0x72B0, 0xC9A6},{0x72B4, 0xCA43},{0x72B5, 0xCA44},{0x72BA, 0xCB66}, - {0x72BD, 0xCB62},{0x72BF, 0xCB61},{0x72C0, 0xAAAC},{0x72C1, 0xCB65},{0x72C2, 0xA867},{0x72C3, 0xCB63},{0x72C4, 0xA866},{0x72C5, 0xCB67}, - {0x72C6, 0xCB64},{0x72C9, 0xCD5F},{0x72CA, 0xCFBE},{0x72CB, 0xCD5D},{0x72CC, 0xCD64},{0x72CE, 0xAAAD},{0x72D0, 0xAAB0},{0x72D1, 0xCD65}, - {0x72D2, 0xCD61},{0x72D4, 0xCD62},{0x72D6, 0xCD5C},{0x72D7, 0xAAAF},{0x72D8, 0xCD5E},{0x72D9, 0xAAAE},{0x72DA, 0xCD63},{0x72DC, 0xCD60}, - {0x72DF, 0xCFC2},{0x72E0, 0xACBD},{0x72E1, 0xACBE},{0x72E3, 0xCFC5},{0x72E4, 0xCFBF},{0x72E6, 0xCFC4},{0x72E8, 0xCFC0},{0x72E9, 0xACBC}, - {0x72EA, 0xCFC3},{0x72EB, 0xCFC1},{0x72F3, 0xD2A8},{0x72F4, 0xD2A5},{0x72F6, 0xD2A7},{0x72F7, 0xAF58},{0x72F8, 0xAF57},{0x72F9, 0xAF55}, - {0x72FA, 0xD2A4},{0x72FB, 0xD2A9},{0x72FC, 0xAF54},{0x72FD, 0xAF56},{0x72FE, 0xD2A6},{0x72FF, 0xD667},{0x7300, 0xD2A3},{0x7301, 0xD2AA}, - {0x7307, 0xD662},{0x7308, 0xD666},{0x730A, 0xD665},{0x730B, 0xDA6E},{0x730C, 0xDA79},{0x730F, 0xD668},{0x7311, 0xD663},{0x7312, 0xDA6D}, - {0x7313, 0xB274},{0x7316, 0xB273},{0x7317, 0xD661},{0x7318, 0xD664},{0x7319, 0xB275},{0x731B, 0xB272},{0x731C, 0xB271},{0x731D, 0xD660}, - {0x731E, 0xD669},{0x7322, 0xDA70},{0x7323, 0xDA77},{0x7325, 0xB554},{0x7326, 0xDA76},{0x7327, 0xDA73},{0x7329, 0xB556},{0x732D, 0xDA75}, - {0x7330, 0xDA6F},{0x7331, 0xDA71},{0x7332, 0xDA74},{0x7333, 0xDA72},{0x7334, 0xB555},{0x7335, 0xDA78},{0x7336, 0xB553},{0x7337, 0xB7DF}, - {0x733A, 0xDEAD},{0x733B, 0xDEAC},{0x733C, 0xDEAA},{0x733E, 0xB7E2},{0x733F, 0xB7E1},{0x7340, 0xDEAE},{0x7342, 0xDEAB},{0x7343, 0xE2CA}, - {0x7344, 0xBABB},{0x7345, 0xB7E0},{0x7349, 0xDEB0},{0x734A, 0xDEAF},{0x734C, 0xE2CD},{0x734D, 0xE2CB},{0x734E, 0xBCFA},{0x7350, 0xBABC}, - {0x7351, 0xE2CC},{0x7352, 0xE676},{0x7357, 0xBCFB},{0x7358, 0xE675},{0x7359, 0xE67E},{0x735A, 0xE67D},{0x735B, 0xE67B},{0x735D, 0xE67A}, - {0x735E, 0xE677},{0x735F, 0xE678},{0x7360, 0xE679},{0x7361, 0xE67C},{0x7362, 0xE6A1},{0x7365, 0xEA5F},{0x7366, 0xEA5C},{0x7367, 0xEA5D}, - {0x7368, 0xBF57},{0x7369, 0xEA5B},{0x736A, 0xEA61},{0x736B, 0xEA60},{0x736C, 0xEA5E},{0x736E, 0xED64},{0x736F, 0xED65},{0x7370, 0xC0F1}, - {0x7372, 0xC0F2},{0x7373, 0xED63},{0x7375, 0xC279},{0x7376, 0xEFFE},{0x7377, 0xC278},{0x7378, 0xC37E},{0x737A, 0xC3A1},{0x737B, 0xC46D}, - {0x737C, 0xF46E},{0x737D, 0xF46D},{0x737E, 0xF5DD},{0x737F, 0xF6EF},{0x7380, 0xC57A},{0x7381, 0xF7E8},{0x7382, 0xF7E7},{0x7383, 0xF7E9}, - {0x7384, 0xA5C8},{0x7385, 0xCFC6},{0x7386, 0xAF59},{0x7387, 0xB276},{0x7388, 0xD66A},{0x7389, 0xA5C9},{0x738A, 0xC9A7},{0x738B, 0xA4FD}, - {0x738E, 0xCA45},{0x7392, 0xCB6C},{0x7393, 0xCB6A},{0x7394, 0xCB6B},{0x7395, 0xCB68},{0x7396, 0xA868},{0x7397, 0xCB69},{0x739D, 0xCD6D}, - {0x739F, 0xAAB3},{0x73A0, 0xCD6B},{0x73A1, 0xCD67},{0x73A2, 0xCD6A},{0x73A4, 0xCD66},{0x73A5, 0xAAB5},{0x73A6, 0xCD69},{0x73A8, 0xAAB2}, - {0x73A9, 0xAAB1},{0x73AB, 0xAAB4},{0x73AC, 0xCD6C},{0x73AD, 0xCD68},{0x73B2, 0xACC2},{0x73B3, 0xACC5},{0x73B4, 0xCFCE},{0x73B5, 0xCFCD}, - {0x73B6, 0xCFCC},{0x73B7, 0xACBF},{0x73B8, 0xCFD5},{0x73B9, 0xCFCB},{0x73BB, 0xACC1},{0x73BC, 0xD2AF},{0x73BE, 0xCFD2},{0x73BF, 0xCFD0}, - {0x73C0, 0xACC4},{0x73C2, 0xCFC8},{0x73C3, 0xCFD3},{0x73C5, 0xCFCA},{0x73C6, 0xCFD4},{0x73C7, 0xCFD1},{0x73C8, 0xCFC9},{0x73CA, 0xACC0}, - {0x73CB, 0xCFD6},{0x73CC, 0xCFC7},{0x73CD, 0xACC3},{0x73D2, 0xD2B4},{0x73D3, 0xD2AB},{0x73D4, 0xD2B6},{0x73D6, 0xD2AE},{0x73D7, 0xD2B9}, - {0x73D8, 0xD2BA},{0x73D9, 0xD2AC},{0x73DA, 0xD2B8},{0x73DB, 0xD2B5},{0x73DC, 0xD2B3},{0x73DD, 0xD2B7},{0x73DE, 0xAF5F},{0x73E0, 0xAF5D}, - {0x73E3, 0xD2B1},{0x73E5, 0xD2AD},{0x73E7, 0xD2B0},{0x73E8, 0xD2BB},{0x73E9, 0xD2B2},{0x73EA, 0xAF5E},{0x73EB, 0xCFCF},{0x73ED, 0xAF5A}, - {0x73EE, 0xAF5C},{0x73F4, 0xD678},{0x73F5, 0xD66D},{0x73F6, 0xD66B},{0x73F8, 0xD66C},{0x73FA, 0xD673},{0x73FC, 0xD674},{0x73FD, 0xD670}, - {0x73FE, 0xB27B},{0x73FF, 0xD675},{0x7400, 0xD672},{0x7401, 0xD66F},{0x7403, 0xB279},{0x7404, 0xD66E},{0x7405, 0xB277},{0x7406, 0xB27A}, - {0x7407, 0xD671},{0x7408, 0xD679},{0x7409, 0xAF5B},{0x740A, 0xB278},{0x740B, 0xD677},{0x740C, 0xD676},{0x740D, 0xB27C},{0x7416, 0xDA7E}, - {0x741A, 0xDAA1},{0x741B, 0xB560},{0x741D, 0xDAA7},{0x7420, 0xDAA9},{0x7421, 0xDAA2},{0x7422, 0xB55A},{0x7423, 0xDAA6},{0x7424, 0xDAA5}, - {0x7425, 0xB55B},{0x7426, 0xB561},{0x7428, 0xB562},{0x7429, 0xDAA8},{0x742A, 0xB558},{0x742B, 0xDA7D},{0x742C, 0xDA7B},{0x742D, 0xDAA3}, - {0x742E, 0xDA7A},{0x742F, 0xB55F},{0x7430, 0xDA7C},{0x7431, 0xDAA4},{0x7432, 0xDAAA},{0x7433, 0xB559},{0x7434, 0xB55E},{0x7435, 0xB55C}, - {0x7436, 0xB55D},{0x743A, 0xB557},{0x743F, 0xB7E9},{0x7440, 0xDEB7},{0x7441, 0xB7E8},{0x7442, 0xDEBB},{0x7444, 0xDEB1},{0x7446, 0xDEBC}, - {0x744A, 0xDEB2},{0x744B, 0xDEB3},{0x744D, 0xDEBD},{0x744E, 0xDEBA},{0x744F, 0xDEB8},{0x7450, 0xDEB9},{0x7451, 0xDEB5},{0x7452, 0xDEB4}, - {0x7454, 0xDEBE},{0x7455, 0xB7E5},{0x7457, 0xDEB6},{0x7459, 0xB7EA},{0x745A, 0xB7E4},{0x745B, 0xB7EB},{0x745C, 0xB7EC},{0x745E, 0xB7E7}, - {0x745F, 0xB7E6},{0x7462, 0xE2CE},{0x7463, 0xBABE},{0x7464, 0xBABD},{0x7467, 0xE2D3},{0x7469, 0xBCFC},{0x746A, 0xBABF},{0x746D, 0xBAC1}, - {0x746E, 0xE2D4},{0x746F, 0xB7E3},{0x7470, 0xBAC0},{0x7471, 0xE2D0},{0x7472, 0xE2D2},{0x7473, 0xE2CF},{0x7475, 0xE2D1},{0x7479, 0xE6AB}, - {0x747C, 0xE6AA},{0x747D, 0xE6A7},{0x747E, 0xBD40},{0x747F, 0xEA62},{0x7480, 0xBD41},{0x7481, 0xE6A6},{0x7483, 0xBCFE},{0x7485, 0xE6A8}, - {0x7486, 0xE6A5},{0x7487, 0xE6A2},{0x7488, 0xE6A9},{0x7489, 0xE6A3},{0x748A, 0xE6A4},{0x748B, 0xBCFD},{0x7490, 0xED69},{0x7492, 0xEA66}, - {0x7494, 0xEA65},{0x7495, 0xEA67},{0x7497, 0xED66},{0x7498, 0xBF5A},{0x749A, 0xEA63},{0x749C, 0xBF58},{0x749E, 0xBF5C},{0x749F, 0xBF5B}, - {0x74A0, 0xEA64},{0x74A1, 0xEA68},{0x74A3, 0xBF59},{0x74A5, 0xED6D},{0x74A6, 0xC0F5},{0x74A7, 0xC27A},{0x74A8, 0xC0F6},{0x74A9, 0xC0F3}, - {0x74AA, 0xED6A},{0x74AB, 0xED68},{0x74AD, 0xED6B},{0x74AF, 0xED6E},{0x74B0, 0xC0F4},{0x74B1, 0xED6C},{0x74B2, 0xED67},{0x74B5, 0xF042}, - {0x74B6, 0xF045},{0x74B7, 0xF275},{0x74B8, 0xF040},{0x74BA, 0xF46F},{0x74BB, 0xF046},{0x74BD, 0xC3A2},{0x74BE, 0xF044},{0x74BF, 0xC27B}, - {0x74C0, 0xF041},{0x74C1, 0xF043},{0x74C2, 0xF047},{0x74C3, 0xF276},{0x74C5, 0xF274},{0x74CA, 0xC3A3},{0x74CB, 0xF273},{0x74CF, 0xC46E}, - {0x74D4, 0xC4ED},{0x74D5, 0xF6F1},{0x74D6, 0xC4EC},{0x74D7, 0xF6F3},{0x74D8, 0xF6F0},{0x74D9, 0xF6F2},{0x74DA, 0xC5D0},{0x74DB, 0xF8B2}, - {0x74DC, 0xA5CA},{0x74DD, 0xCD6E},{0x74DE, 0xD2BC},{0x74DF, 0xD2BD},{0x74E0, 0xB27D},{0x74E1, 0xDEBF},{0x74E2, 0xBF5D},{0x74E3, 0xC3A4}, - {0x74E4, 0xC57B},{0x74E5, 0xF8B3},{0x74E6, 0xA5CB},{0x74E8, 0xCD6F},{0x74E9, 0xA260},{0x74EC, 0xCFD7},{0x74EE, 0xCFD8},{0x74F4, 0xD2BE}, - {0x74F5, 0xD2BF},{0x74F6, 0xB27E},{0x74F7, 0xB2A1},{0x74FB, 0xDAAB},{0x74FD, 0xDEC2},{0x74FE, 0xDEC1},{0x74FF, 0xDEC0},{0x7500, 0xE2D5}, - {0x7502, 0xE2D6},{0x7503, 0xE2D7},{0x7504, 0xBAC2},{0x7507, 0xE6AD},{0x7508, 0xE6AC},{0x750B, 0xEA69},{0x750C, 0xBF5E},{0x750D, 0xBF5F}, - {0x750F, 0xED72},{0x7510, 0xED6F},{0x7511, 0xED70},{0x7512, 0xED71},{0x7513, 0xF049},{0x7514, 0xF048},{0x7515, 0xC27C},{0x7516, 0xF277}, - {0x7517, 0xF5DE},{0x7518, 0xA5CC},{0x751A, 0xACC6},{0x751C, 0xB2A2},{0x751D, 0xDEC3},{0x751F, 0xA5CD},{0x7521, 0xD2C0},{0x7522, 0xB2A3}, - {0x7525, 0xB563},{0x7526, 0xB564},{0x7528, 0xA5CE},{0x7529, 0xA5CF},{0x752A, 0xCA46},{0x752B, 0xA86A},{0x752C, 0xA869},{0x752D, 0xACC7}, - {0x752E, 0xCFD9},{0x752F, 0xDAAC},{0x7530, 0xA5D0},{0x7531, 0xA5D1},{0x7532, 0xA5D2},{0x7533, 0xA5D3},{0x7537, 0xA86B},{0x7538, 0xA86C}, - {0x7539, 0xCB6E},{0x753A, 0xCB6D},{0x753D, 0xAAB6},{0x753E, 0xCD72},{0x753F, 0xCD70},{0x7540, 0xCD71},{0x7547, 0xCFDA},{0x7548, 0xCFDB}, - {0x754B, 0xACCB},{0x754C, 0xACC9},{0x754E, 0xACCA},{0x754F, 0xACC8},{0x7554, 0xAF60},{0x7559, 0xAF64},{0x755A, 0xAF63},{0x755B, 0xD2C1}, - {0x755C, 0xAF62},{0x755D, 0xAF61},{0x755F, 0xD2C2},{0x7562, 0xB2A6},{0x7563, 0xD67B},{0x7564, 0xD67A},{0x7565, 0xB2A4},{0x7566, 0xB2A5}, - {0x756A, 0xB566},{0x756B, 0xB565},{0x756C, 0xDAAE},{0x756F, 0xDAAD},{0x7570, 0xB2A7},{0x7576, 0xB7ED},{0x7577, 0xDEC5},{0x7578, 0xB7EE}, - {0x7579, 0xDEC4},{0x757D, 0xE2D8},{0x757E, 0xE6AE},{0x757F, 0xBD42},{0x7580, 0xEA6A},{0x7584, 0xED73},{0x7586, 0xC3A6},{0x7587, 0xC3A5}, - {0x758A, 0xC57C},{0x758B, 0xA5D4},{0x758C, 0xCD73},{0x758F, 0xB2A8},{0x7590, 0xE2D9},{0x7591, 0xBAC3},{0x7594, 0xCB6F},{0x7595, 0xCB70}, - {0x7598, 0xCD74},{0x7599, 0xAAB8},{0x759A, 0xAAB9},{0x759D, 0xAAB7},{0x75A2, 0xACCF},{0x75A3, 0xACD0},{0x75A4, 0xACCD},{0x75A5, 0xACCE}, - {0x75A7, 0xCFDC},{0x75AA, 0xCFDD},{0x75AB, 0xACCC},{0x75B0, 0xD2C3},{0x75B2, 0xAF68},{0x75B3, 0xAF69},{0x75B5, 0xB2AB},{0x75B6, 0xD2C9}, - {0x75B8, 0xAF6E},{0x75B9, 0xAF6C},{0x75BA, 0xD2CA},{0x75BB, 0xD2C5},{0x75BC, 0xAF6B},{0x75BD, 0xAF6A},{0x75BE, 0xAF65},{0x75BF, 0xD2C8}, - {0x75C0, 0xD2C7},{0x75C1, 0xD2C4},{0x75C2, 0xAF6D},{0x75C4, 0xD2C6},{0x75C5, 0xAF66},{0x75C7, 0xAF67},{0x75CA, 0xB2AC},{0x75CB, 0xD6A1}, - {0x75CC, 0xD6A2},{0x75CD, 0xB2AD},{0x75CE, 0xD67C},{0x75CF, 0xD67E},{0x75D0, 0xD6A4},{0x75D1, 0xD6A3},{0x75D2, 0xD67D},{0x75D4, 0xB2A9}, - {0x75D5, 0xB2AA},{0x75D7, 0xDAB6},{0x75D8, 0xB56B},{0x75D9, 0xB56A},{0x75DA, 0xDAB0},{0x75DB, 0xB568},{0x75DD, 0xDAB3},{0x75DE, 0xB56C}, - {0x75DF, 0xDAB4},{0x75E0, 0xB56D},{0x75E1, 0xDAB1},{0x75E2, 0xB567},{0x75E3, 0xB569},{0x75E4, 0xDAB5},{0x75E6, 0xDAB2},{0x75E7, 0xDAAF}, - {0x75ED, 0xDED2},{0x75EF, 0xDEC7},{0x75F0, 0xB7F0},{0x75F1, 0xB7F3},{0x75F2, 0xB7F2},{0x75F3, 0xB7F7},{0x75F4, 0xB7F6},{0x75F5, 0xDED3}, - {0x75F6, 0xDED1},{0x75F7, 0xDECA},{0x75F8, 0xDECE},{0x75F9, 0xDECD},{0x75FA, 0xB7F4},{0x75FB, 0xDED0},{0x75FC, 0xDECC},{0x75FD, 0xDED4}, - {0x75FE, 0xDECB},{0x75FF, 0xB7F5},{0x7600, 0xB7EF},{0x7601, 0xB7F1},{0x7603, 0xDEC9},{0x7608, 0xE2DB},{0x7609, 0xBAC7},{0x760A, 0xE2DF}, - {0x760B, 0xBAC6},{0x760C, 0xE2DC},{0x760D, 0xBAC5},{0x760F, 0xDEC8},{0x7610, 0xDECF},{0x7611, 0xE2DE},{0x7613, 0xBAC8},{0x7614, 0xE2E0}, - {0x7615, 0xE2DD},{0x7616, 0xE2DA},{0x7619, 0xE6B1},{0x761A, 0xE6B5},{0x761B, 0xE6B7},{0x761C, 0xE6B3},{0x761D, 0xE6B2},{0x761E, 0xE6B0}, - {0x761F, 0xBD45},{0x7620, 0xBD43},{0x7621, 0xBD48},{0x7622, 0xBD49},{0x7623, 0xE6B4},{0x7624, 0xBD46},{0x7625, 0xE6AF},{0x7626, 0xBD47}, - {0x7627, 0xBAC4},{0x7628, 0xE6B6},{0x7629, 0xBD44},{0x762D, 0xEA6C},{0x762F, 0xEA6B},{0x7630, 0xEA73},{0x7631, 0xEA6D},{0x7632, 0xEA72}, - {0x7633, 0xEA6F},{0x7634, 0xBF60},{0x7635, 0xEA71},{0x7638, 0xBF61},{0x763A, 0xBF62},{0x763C, 0xEA70},{0x763D, 0xEA6E},{0x7642, 0xC0F8}, - {0x7643, 0xED74},{0x7646, 0xC0F7},{0x7647, 0xED77},{0x7648, 0xED75},{0x7649, 0xED76},{0x764C, 0xC0F9},{0x7650, 0xF04D},{0x7652, 0xC2A1}, - {0x7653, 0xF04E},{0x7656, 0xC27D},{0x7657, 0xF04F},{0x7658, 0xC27E},{0x7659, 0xF04C},{0x765A, 0xF050},{0x765C, 0xF04A},{0x765F, 0xC3A7}, - {0x7660, 0xF278},{0x7661, 0xC3A8},{0x7662, 0xC46F},{0x7664, 0xF04B},{0x7665, 0xC470},{0x7669, 0xC4EE},{0x766A, 0xF5DF},{0x766C, 0xC57E}, - {0x766D, 0xF6F4},{0x766E, 0xC57D},{0x7670, 0xF7EA},{0x7671, 0xC5F5},{0x7672, 0xC5F6},{0x7675, 0xF9CC},{0x7678, 0xACD1},{0x7679, 0xCFDE}, - {0x767B, 0xB56E},{0x767C, 0xB56F},{0x767D, 0xA5D5},{0x767E, 0xA6CA},{0x767F, 0xCA47},{0x7681, 0xCB71},{0x7682, 0xA86D},{0x7684, 0xAABA}, - {0x7686, 0xACD2},{0x7687, 0xACD3},{0x7688, 0xACD4},{0x7689, 0xD6A6},{0x768A, 0xD2CB},{0x768B, 0xAF6F},{0x768E, 0xB2AE},{0x768F, 0xD6A5}, - {0x7692, 0xDAB8},{0x7693, 0xB571},{0x7695, 0xDAB7},{0x7696, 0xB570},{0x7699, 0xDED5},{0x769A, 0xBD4A},{0x769B, 0xE6BB},{0x769C, 0xE6B8}, - {0x769D, 0xE6B9},{0x769E, 0xE6BA},{0x76A4, 0xED78},{0x76A6, 0xF051},{0x76AA, 0xF471},{0x76AB, 0xF470},{0x76AD, 0xF6F5},{0x76AE, 0xA5D6}, - {0x76AF, 0xCD75},{0x76B0, 0xAF70},{0x76B4, 0xB572},{0x76B5, 0xDED6},{0x76B8, 0xE2E1},{0x76BA, 0xBD4B},{0x76BB, 0xEA74},{0x76BD, 0xF052}, - {0x76BE, 0xF472},{0x76BF, 0xA5D7},{0x76C2, 0xAABB},{0x76C3, 0xACD7},{0x76C4, 0xCFDF},{0x76C5, 0xACD8},{0x76C6, 0xACD6},{0x76C8, 0xACD5}, - {0x76C9, 0xD2CC},{0x76CA, 0xAF71},{0x76CD, 0xAF72},{0x76CE, 0xAF73},{0x76D2, 0xB2B0},{0x76D3, 0xD6A7},{0x76D4, 0xB2AF},{0x76DA, 0xDAB9}, - {0x76DB, 0xB2B1},{0x76DC, 0xB573},{0x76DD, 0xDED7},{0x76DE, 0xB7F8},{0x76DF, 0xB7F9},{0x76E1, 0xBAC9},{0x76E3, 0xBACA},{0x76E4, 0xBD4C}, - {0x76E5, 0xBF64},{0x76E6, 0xEA75},{0x76E7, 0xBF63},{0x76E9, 0xED79},{0x76EA, 0xC0FA},{0x76EC, 0xF053},{0x76ED, 0xF473},{0x76EE, 0xA5D8}, - {0x76EF, 0xA86E},{0x76F0, 0xCD78},{0x76F1, 0xCD77},{0x76F2, 0xAABC},{0x76F3, 0xCD76},{0x76F4, 0xAABD},{0x76F5, 0xCD79},{0x76F7, 0xCFE5}, - {0x76F8, 0xACDB},{0x76F9, 0xACDA},{0x76FA, 0xCFE7},{0x76FB, 0xCFE6},{0x76FC, 0xACDF},{0x76FE, 0xACDE},{0x7701, 0xACD9},{0x7703, 0xCFE1}, - {0x7704, 0xCFE2},{0x7705, 0xCFE3},{0x7707, 0xACE0},{0x7708, 0xCFE0},{0x7709, 0xACDC},{0x770A, 0xCFE4},{0x770B, 0xACDD},{0x7710, 0xD2CF}, - {0x7711, 0xD2D3},{0x7712, 0xD2D1},{0x7713, 0xD2D0},{0x7715, 0xD2D4},{0x7719, 0xD2D5},{0x771A, 0xD2D6},{0x771B, 0xD2CE},{0x771D, 0xD2CD}, - {0x771F, 0xAF75},{0x7720, 0xAF76},{0x7722, 0xD2D7},{0x7723, 0xD2D2},{0x7725, 0xD6B0},{0x7727, 0xD2D8},{0x7728, 0xAF77},{0x7729, 0xAF74}, - {0x772D, 0xD6AA},{0x772F, 0xD6A9},{0x7731, 0xD6AB},{0x7732, 0xD6AC},{0x7733, 0xD6AE},{0x7734, 0xD6AD},{0x7735, 0xD6B2},{0x7736, 0xB2B5}, - {0x7737, 0xB2B2},{0x7738, 0xB2B6},{0x7739, 0xD6A8},{0x773A, 0xB2B7},{0x773B, 0xD6B1},{0x773C, 0xB2B4},{0x773D, 0xD6AF},{0x773E, 0xB2B3}, - {0x7744, 0xDABC},{0x7745, 0xDABE},{0x7746, 0xDABA},{0x7747, 0xDABB},{0x774A, 0xDABF},{0x774B, 0xDAC1},{0x774C, 0xDAC2},{0x774D, 0xDABD}, - {0x774E, 0xDAC0},{0x774F, 0xB574},{0x7752, 0xDEDB},{0x7754, 0xDEE0},{0x7755, 0xDED8},{0x7756, 0xDEDC},{0x7759, 0xDEE1},{0x775A, 0xDEDD}, - {0x775B, 0xB7FA},{0x775C, 0xB843},{0x775E, 0xB7FD},{0x775F, 0xDED9},{0x7760, 0xDEDA},{0x7761, 0xBACE},{0x7762, 0xB846},{0x7763, 0xB7FE}, - {0x7765, 0xB844},{0x7766, 0xB7FC},{0x7767, 0xDEDF},{0x7768, 0xB845},{0x7769, 0xDEDE},{0x776A, 0xB841},{0x776B, 0xB7FB},{0x776C, 0xB842}, - {0x776D, 0xDEE2},{0x776E, 0xE2E6},{0x776F, 0xE2E8},{0x7779, 0xB840},{0x777C, 0xE2E3},{0x777D, 0xBACC},{0x777E, 0xE2E9},{0x777F, 0xBACD}, - {0x7780, 0xE2E7},{0x7781, 0xE2E2},{0x7782, 0xE2E5},{0x7783, 0xE2EA},{0x7784, 0xBACB},{0x7785, 0xE2E4},{0x7787, 0xBD4E},{0x7788, 0xE6BF}, - {0x7789, 0xE6BE},{0x778B, 0xBD51},{0x778C, 0xBD4F},{0x778D, 0xE6BC},{0x778E, 0xBD4D},{0x778F, 0xE6BD},{0x7791, 0xBD50},{0x7795, 0xEA7D}, - {0x7797, 0xEAA1},{0x7799, 0xEA7E},{0x779A, 0xEA76},{0x779B, 0xEA7A},{0x779C, 0xEA79},{0x779D, 0xEA77},{0x779E, 0xBF66},{0x779F, 0xBF67}, - {0x77A0, 0xBF65},{0x77A1, 0xEA78},{0x77A2, 0xEA7B},{0x77A3, 0xEA7C},{0x77A5, 0xBF68},{0x77A7, 0xC140},{0x77A8, 0xEDA3},{0x77AA, 0xC0FC}, - {0x77AB, 0xED7B},{0x77AC, 0xC0FE},{0x77AD, 0xC141},{0x77B0, 0xC0FD},{0x77B1, 0xEDA2},{0x77B2, 0xED7C},{0x77B3, 0xC0FB},{0x77B4, 0xEDA1}, - {0x77B5, 0xED7A},{0x77B6, 0xED7E},{0x77B7, 0xED7D},{0x77BA, 0xF055},{0x77BB, 0xC2A4},{0x77BC, 0xC2A5},{0x77BD, 0xC2A2},{0x77BF, 0xC2A3}, - {0x77C2, 0xF054},{0x77C4, 0xF27B},{0x77C7, 0xC3A9},{0x77C9, 0xF279},{0x77CA, 0xF27A},{0x77CC, 0xF474},{0x77CD, 0xF477},{0x77CE, 0xF475}, - {0x77CF, 0xF476},{0x77D0, 0xF5E0},{0x77D3, 0xC4EF},{0x77D4, 0xF7EB},{0x77D5, 0xF8B4},{0x77D7, 0xC5F7},{0x77D8, 0xF8F8},{0x77D9, 0xF8F9}, - {0x77DA, 0xC666},{0x77DB, 0xA5D9},{0x77DC, 0xACE1},{0x77DE, 0xDAC3},{0x77E0, 0xDEE3},{0x77E2, 0xA5DA},{0x77E3, 0xA86F},{0x77E5, 0xAABE}, - {0x77E7, 0xCFE8},{0x77E8, 0xCFE9},{0x77E9, 0xAF78},{0x77EC, 0xDAC4},{0x77ED, 0xB575},{0x77EE, 0xB847},{0x77EF, 0xC142},{0x77F0, 0xEDA4}, - {0x77F1, 0xF27C},{0x77F2, 0xF478},{0x77F3, 0xA5DB},{0x77F7, 0xCDA1},{0x77F8, 0xCD7A},{0x77F9, 0xCD7C},{0x77FA, 0xCD7E},{0x77FB, 0xCD7D}, - {0x77FC, 0xCD7B},{0x77FD, 0xAABF},{0x7802, 0xACE2},{0x7803, 0xCFF2},{0x7805, 0xCFED},{0x7806, 0xCFEA},{0x7809, 0xCFF1},{0x780C, 0xACE4}, - {0x780D, 0xACE5},{0x780E, 0xCFF0},{0x780F, 0xCFEF},{0x7810, 0xCFEE},{0x7811, 0xCFEB},{0x7812, 0xCFEC},{0x7813, 0xCFF3},{0x7814, 0xACE3}, - {0x781D, 0xAF7C},{0x781F, 0xAFA4},{0x7820, 0xAFA3},{0x7821, 0xD2E1},{0x7822, 0xD2DB},{0x7823, 0xD2D9},{0x7825, 0xAFA1},{0x7826, 0xD6B9}, - {0x7827, 0xAF7A},{0x7828, 0xD2DE},{0x7829, 0xD2E2},{0x782A, 0xD2E4},{0x782B, 0xD2E0},{0x782C, 0xD2DA},{0x782D, 0xAFA2},{0x782E, 0xD2DF}, - {0x782F, 0xD2DD},{0x7830, 0xAF79},{0x7831, 0xD2E5},{0x7832, 0xAFA5},{0x7833, 0xD2E3},{0x7834, 0xAF7D},{0x7835, 0xD2DC},{0x7837, 0xAF7E}, - {0x7838, 0xAF7B},{0x7843, 0xB2B9},{0x7845, 0xD6BA},{0x7848, 0xD6B3},{0x7849, 0xD6B5},{0x784A, 0xD6B7},{0x784C, 0xD6B8},{0x784D, 0xD6B6}, - {0x784E, 0xB2BA},{0x7850, 0xD6BB},{0x7852, 0xD6B4},{0x785C, 0xDAC8},{0x785D, 0xB576},{0x785E, 0xDAD0},{0x7860, 0xDAC5},{0x7862, 0xDAD1}, - {0x7864, 0xDAC6},{0x7865, 0xDAC7},{0x7868, 0xDACF},{0x7869, 0xDACE},{0x786A, 0xDACB},{0x786B, 0xB2B8},{0x786C, 0xB577},{0x786D, 0xDAC9}, - {0x786E, 0xDACC},{0x786F, 0xB578},{0x7870, 0xDACD},{0x7871, 0xDACA},{0x7879, 0xDEEE},{0x787B, 0xDEF2},{0x787C, 0xB84E},{0x787E, 0xE2F0}, - {0x787F, 0xB851},{0x7880, 0xDEF0},{0x7883, 0xDEED},{0x7884, 0xDEE8},{0x7885, 0xDEEA},{0x7886, 0xDEEB},{0x7887, 0xDEE4},{0x7889, 0xB84D}, - {0x788C, 0xB84C},{0x788E, 0xB848},{0x788F, 0xDEE7},{0x7891, 0xB84F},{0x7893, 0xB850},{0x7894, 0xDEE6},{0x7895, 0xDEE9},{0x7896, 0xDEF1}, - {0x7897, 0xB84A},{0x7898, 0xB84B},{0x7899, 0xDEEF},{0x789A, 0xDEE5},{0x789E, 0xE2F2},{0x789F, 0xBAD0},{0x78A0, 0xE2F4},{0x78A1, 0xDEEC}, - {0x78A2, 0xE2F6},{0x78A3, 0xBAD4},{0x78A4, 0xE2F7},{0x78A5, 0xE2F3},{0x78A7, 0xBAD1},{0x78A8, 0xE2EF},{0x78A9, 0xBAD3},{0x78AA, 0xE2EC}, - {0x78AB, 0xE2F1},{0x78AC, 0xE2F5},{0x78AD, 0xE2EE},{0x78B0, 0xB849},{0x78B2, 0xE2EB},{0x78B3, 0xBAD2},{0x78B4, 0xE2ED},{0x78BA, 0xBD54}, - {0x78BB, 0xE6C1},{0x78BC, 0xBD58},{0x78BE, 0xBD56},{0x78C1, 0xBACF},{0x78C3, 0xE6C8},{0x78C4, 0xE6C9},{0x78C5, 0xBD53},{0x78C8, 0xE6C7}, - {0x78C9, 0xE6CA},{0x78CA, 0xBD55},{0x78CB, 0xBD52},{0x78CC, 0xE6C3},{0x78CD, 0xE6C0},{0x78CE, 0xE6C5},{0x78CF, 0xE6C2},{0x78D0, 0xBD59}, - {0x78D1, 0xE6C4},{0x78D4, 0xE6C6},{0x78D5, 0xBD57},{0x78DA, 0xBF6A},{0x78DB, 0xEAA8},{0x78DD, 0xEAA2},{0x78DE, 0xEAA6},{0x78DF, 0xEAAC}, - {0x78E0, 0xEAAD},{0x78E1, 0xEAA9},{0x78E2, 0xEAAA},{0x78E3, 0xEAA7},{0x78E5, 0xEAA4},{0x78E7, 0xBF6C},{0x78E8, 0xBF69},{0x78E9, 0xEAA3}, - {0x78EA, 0xEAA5},{0x78EC, 0xBF6B},{0x78ED, 0xEAAB},{0x78EF, 0xC146},{0x78F2, 0xEDAA},{0x78F3, 0xEDA5},{0x78F4, 0xC145},{0x78F7, 0xC143}, - {0x78F9, 0xEDAC},{0x78FA, 0xC144},{0x78FB, 0xEDA8},{0x78FC, 0xEDA9},{0x78FD, 0xEDA6},{0x78FE, 0xEDAD},{0x78FF, 0xF056},{0x7901, 0xC147}, - {0x7902, 0xEDA7},{0x7904, 0xEDAE},{0x7905, 0xEDAB},{0x7909, 0xF05A},{0x790C, 0xF057},{0x790E, 0xC2A6},{0x7910, 0xF05B},{0x7911, 0xF05D}, - {0x7912, 0xF05C},{0x7913, 0xF058},{0x7914, 0xF059},{0x7917, 0xF2A3},{0x7919, 0xC3AA},{0x791B, 0xF27E},{0x791C, 0xF2A2},{0x791D, 0xF27D}, - {0x791E, 0xF2A4},{0x7921, 0xF2A1},{0x7923, 0xF47A},{0x7924, 0xF47D},{0x7925, 0xF479},{0x7926, 0xC471},{0x7927, 0xF47B},{0x7928, 0xF47C}, - {0x7929, 0xF47E},{0x792A, 0xC472},{0x792B, 0xC474},{0x792C, 0xC473},{0x792D, 0xF5E1},{0x792F, 0xF5E3},{0x7931, 0xF5E2},{0x7935, 0xF6F6}, - {0x7938, 0xF8B5},{0x7939, 0xF8FA},{0x793A, 0xA5DC},{0x793D, 0xCB72},{0x793E, 0xAAC0},{0x793F, 0xCDA3},{0x7940, 0xAAC1},{0x7941, 0xAAC2}, - {0x7942, 0xCDA2},{0x7944, 0xCFF8},{0x7945, 0xCFF7},{0x7946, 0xACE6},{0x7947, 0xACE9},{0x7948, 0xACE8},{0x7949, 0xACE7},{0x794A, 0xCFF4}, - {0x794B, 0xCFF6},{0x794C, 0xCFF5},{0x794F, 0xD2E8},{0x7950, 0xAFA7},{0x7951, 0xD2EC},{0x7952, 0xD2EB},{0x7953, 0xD2EA},{0x7954, 0xD2E6}, - {0x7955, 0xAFA6},{0x7956, 0xAFAA},{0x7957, 0xAFAD},{0x795A, 0xAFAE},{0x795B, 0xD2E7},{0x795C, 0xD2E9},{0x795D, 0xAFAC},{0x795E, 0xAFAB}, - {0x795F, 0xAFA9},{0x7960, 0xAFA8},{0x7961, 0xD6C2},{0x7963, 0xD6C0},{0x7964, 0xD6BC},{0x7965, 0xB2BB},{0x7967, 0xD6BD},{0x7968, 0xB2BC}, - {0x7969, 0xD6BE},{0x796A, 0xD6BF},{0x796B, 0xD6C1},{0x796D, 0xB2BD},{0x7970, 0xDAD5},{0x7972, 0xDAD4},{0x7973, 0xDAD3},{0x7974, 0xDAD2}, - {0x7979, 0xDEF6},{0x797A, 0xB852},{0x797C, 0xDEF3},{0x797D, 0xDEF5},{0x797F, 0xB853},{0x7981, 0xB854},{0x7982, 0xDEF4},{0x7988, 0xE341}, - {0x798A, 0xE2F9},{0x798B, 0xE2FA},{0x798D, 0xBAD7},{0x798E, 0xBAD5},{0x798F, 0xBAD6},{0x7990, 0xE343},{0x7992, 0xE342},{0x7993, 0xE2FE}, - {0x7994, 0xE2FD},{0x7995, 0xE2FC},{0x7996, 0xE2FB},{0x7997, 0xE340},{0x7998, 0xE2F8},{0x799A, 0xE6CB},{0x799B, 0xE6D0},{0x799C, 0xE6CE}, - {0x79A0, 0xE6CD},{0x79A1, 0xE6CC},{0x79A2, 0xE6CF},{0x79A4, 0xEAAE},{0x79A6, 0xBF6D},{0x79A7, 0xC148},{0x79A8, 0xEDB0},{0x79AA, 0xC149}, - {0x79AB, 0xEDAF},{0x79AC, 0xF05F},{0x79AD, 0xF05E},{0x79AE, 0xC2A7},{0x79B0, 0xF2A5},{0x79B1, 0xC3AB},{0x79B2, 0xF4A1},{0x79B3, 0xC5A1}, - {0x79B4, 0xF6F7},{0x79B6, 0xF8B7},{0x79B7, 0xF8B6},{0x79B8, 0xC9A8},{0x79B9, 0xACEA},{0x79BA, 0xACEB},{0x79BB, 0xD6C3},{0x79BD, 0xB856}, - {0x79BE, 0xA5DD},{0x79BF, 0xA872},{0x79C0, 0xA871},{0x79C1, 0xA870},{0x79C5, 0xCDA4},{0x79C8, 0xAAC4},{0x79C9, 0xAAC3},{0x79CB, 0xACEE}, - {0x79CD, 0xCFFA},{0x79CE, 0xCFFD},{0x79CF, 0xCFFB},{0x79D1, 0xACEC},{0x79D2, 0xACED},{0x79D5, 0xCFF9},{0x79D6, 0xCFFC},{0x79D8, 0xAFB5}, - {0x79DC, 0xD2F3},{0x79DD, 0xD2F5},{0x79DE, 0xD2F4},{0x79DF, 0xAFB2},{0x79E0, 0xD2EF},{0x79E3, 0xAFB0},{0x79E4, 0xAFAF},{0x79E6, 0xAFB3}, - {0x79E7, 0xAFB1},{0x79E9, 0xAFB4},{0x79EA, 0xD2F2},{0x79EB, 0xD2ED},{0x79EC, 0xD2EE},{0x79ED, 0xD2F1},{0x79EE, 0xD2F0},{0x79F6, 0xD6C6}, - {0x79F7, 0xD6C7},{0x79F8, 0xD6C5},{0x79FA, 0xD6C4},{0x79FB, 0xB2BE},{0x7A00, 0xB57D},{0x7A02, 0xDAD6},{0x7A03, 0xDAD8},{0x7A04, 0xDADA}, - {0x7A05, 0xB57C},{0x7A08, 0xB57A},{0x7A0A, 0xDAD7},{0x7A0B, 0xB57B},{0x7A0C, 0xDAD9},{0x7A0D, 0xB579},{0x7A10, 0xDF41},{0x7A11, 0xDEF7}, - {0x7A12, 0xDEFA},{0x7A13, 0xDEFE},{0x7A14, 0xB85A},{0x7A15, 0xDEFC},{0x7A17, 0xDEFB},{0x7A18, 0xDEF8},{0x7A19, 0xDEF9},{0x7A1A, 0xB858}, - {0x7A1B, 0xDF40},{0x7A1C, 0xB857},{0x7A1E, 0xB85C},{0x7A1F, 0xB85B},{0x7A20, 0xB859},{0x7A22, 0xDEFD},{0x7A26, 0xE349},{0x7A28, 0xE348}, - {0x7A2B, 0xE344},{0x7A2E, 0xBAD8},{0x7A2F, 0xE347},{0x7A30, 0xE346},{0x7A31, 0xBAD9},{0x7A37, 0xBD5E},{0x7A39, 0xE6D2},{0x7A3B, 0xBD5F}, - {0x7A3C, 0xBD5B},{0x7A3D, 0xBD5D},{0x7A3F, 0xBD5A},{0x7A40, 0xBD5C},{0x7A44, 0xEAAF},{0x7A46, 0xBF70},{0x7A47, 0xEAB1},{0x7A48, 0xEAB0}, - {0x7A4A, 0xE345},{0x7A4B, 0xBF72},{0x7A4C, 0xBF71},{0x7A4D, 0xBF6E},{0x7A4E, 0xBF6F},{0x7A54, 0xEDB5},{0x7A56, 0xEDB3},{0x7A57, 0xC14A}, - {0x7A58, 0xEDB4},{0x7A5A, 0xEDB6},{0x7A5B, 0xEDB2},{0x7A5C, 0xEDB1},{0x7A5F, 0xF060},{0x7A60, 0xC2AA},{0x7A61, 0xC2A8},{0x7A62, 0xC2A9}, - {0x7A67, 0xF2A6},{0x7A68, 0xF2A7},{0x7A69, 0xC3AD},{0x7A6B, 0xC3AC},{0x7A6C, 0xF4A3},{0x7A6D, 0xF4A4},{0x7A6E, 0xF4A2},{0x7A70, 0xF6F8}, - {0x7A71, 0xF6F9},{0x7A74, 0xA5DE},{0x7A75, 0xCA48},{0x7A76, 0xA873},{0x7A78, 0xCDA5},{0x7A79, 0xAAC6},{0x7A7A, 0xAAC5},{0x7A7B, 0xCDA6}, - {0x7A7E, 0xD040},{0x7A7F, 0xACEF},{0x7A80, 0xCFFE},{0x7A81, 0xACF0},{0x7A84, 0xAFB6},{0x7A85, 0xD2F8},{0x7A86, 0xD2F6},{0x7A87, 0xD2FC}, - {0x7A88, 0xAFB7},{0x7A89, 0xD2F7},{0x7A8A, 0xD2FB},{0x7A8B, 0xD2F9},{0x7A8C, 0xD2FA},{0x7A8F, 0xD6C8},{0x7A90, 0xD6CA},{0x7A92, 0xB2BF}, - {0x7A94, 0xD6C9},{0x7A95, 0xB2C0},{0x7A96, 0xB5A2},{0x7A97, 0xB5A1},{0x7A98, 0xB57E},{0x7A99, 0xDADB},{0x7A9E, 0xDF44},{0x7A9F, 0xB85D}, - {0x7AA0, 0xB85E},{0x7AA2, 0xDF43},{0x7AA3, 0xDF42},{0x7AA8, 0xE34A},{0x7AA9, 0xBADB},{0x7AAA, 0xBADA},{0x7AAB, 0xE34B},{0x7AAC, 0xE34C}, - {0x7AAE, 0xBD61},{0x7AAF, 0xBD60},{0x7AB1, 0xEAB5},{0x7AB2, 0xE6D3},{0x7AB3, 0xE6D5},{0x7AB4, 0xE6D4},{0x7AB5, 0xEAB4},{0x7AB6, 0xEAB2}, - {0x7AB7, 0xEAB6},{0x7AB8, 0xEAB3},{0x7ABA, 0xBF73},{0x7ABE, 0xEDB7},{0x7ABF, 0xC14B},{0x7AC0, 0xEDB8},{0x7AC1, 0xEDB9},{0x7AC4, 0xC2AB}, - {0x7AC5, 0xC2AC},{0x7AC7, 0xC475},{0x7ACA, 0xC5D1},{0x7ACB, 0xA5DF},{0x7AD1, 0xD041},{0x7AD8, 0xD2FD},{0x7AD9, 0xAFB8},{0x7ADF, 0xB3BA}, - {0x7AE0, 0xB3B9},{0x7AE3, 0xB5A4},{0x7AE4, 0xDADD},{0x7AE5, 0xB5A3},{0x7AE6, 0xDADC},{0x7AEB, 0xDF45},{0x7AED, 0xBADC},{0x7AEE, 0xE34D}, - {0x7AEF, 0xBADD},{0x7AF6, 0xC476},{0x7AF7, 0xF4A5},{0x7AF9, 0xA6CB},{0x7AFA, 0xAAC7},{0x7AFB, 0xCDA7},{0x7AFD, 0xACF2},{0x7AFF, 0xACF1}, - {0x7B00, 0xD042},{0x7B01, 0xD043},{0x7B04, 0xD340},{0x7B05, 0xD342},{0x7B06, 0xAFB9},{0x7B08, 0xD344},{0x7B09, 0xD347},{0x7B0A, 0xD345}, - {0x7B0E, 0xD346},{0x7B0F, 0xD343},{0x7B10, 0xD2FE},{0x7B11, 0xAFBA},{0x7B12, 0xD348},{0x7B13, 0xD341},{0x7B18, 0xD6D3},{0x7B19, 0xB2C6}, - {0x7B1A, 0xD6DC},{0x7B1B, 0xB2C3},{0x7B1D, 0xD6D5},{0x7B1E, 0xB2C7},{0x7B20, 0xB2C1},{0x7B22, 0xD6D0},{0x7B23, 0xD6DD},{0x7B24, 0xD6D1}, - {0x7B25, 0xD6CE},{0x7B26, 0xB2C5},{0x7B28, 0xB2C2},{0x7B2A, 0xD6D4},{0x7B2B, 0xD6D7},{0x7B2C, 0xB2C4},{0x7B2D, 0xD6D8},{0x7B2E, 0xB2C8}, - {0x7B2F, 0xD6D9},{0x7B30, 0xD6CF},{0x7B31, 0xD6D6},{0x7B32, 0xD6DA},{0x7B33, 0xD6D2},{0x7B34, 0xD6CD},{0x7B35, 0xD6CB},{0x7B38, 0xD6DB}, - {0x7B3B, 0xDADF},{0x7B40, 0xDAE4},{0x7B44, 0xDAE0},{0x7B45, 0xDAE6},{0x7B46, 0xB5A7},{0x7B47, 0xD6CC},{0x7B48, 0xDAE1},{0x7B49, 0xB5A5}, - {0x7B4A, 0xDADE},{0x7B4B, 0xB5AC},{0x7B4C, 0xDAE2},{0x7B4D, 0xB5AB},{0x7B4E, 0xDAE3},{0x7B4F, 0xB5AD},{0x7B50, 0xB5A8},{0x7B51, 0xB5AE}, - {0x7B52, 0xB5A9},{0x7B54, 0xB5AA},{0x7B56, 0xB5A6},{0x7B58, 0xDAE5},{0x7B60, 0xB861},{0x7B61, 0xDF50},{0x7B63, 0xDF53},{0x7B64, 0xDF47}, - {0x7B65, 0xDF4C},{0x7B66, 0xDF46},{0x7B67, 0xB863},{0x7B69, 0xDF4A},{0x7B6D, 0xDF48},{0x7B6E, 0xB862},{0x7B70, 0xDF4F},{0x7B71, 0xDF4E}, - {0x7B72, 0xDF4B},{0x7B73, 0xDF4D},{0x7B74, 0xDF49},{0x7B75, 0xBAE1},{0x7B76, 0xDF52},{0x7B77, 0xB85F},{0x7B78, 0xDF51},{0x7B82, 0xE35D}, - {0x7B84, 0xBAE8},{0x7B85, 0xE358},{0x7B87, 0xBAE7},{0x7B88, 0xE34E},{0x7B8A, 0xE350},{0x7B8B, 0xBAE0},{0x7B8C, 0xE355},{0x7B8D, 0xE354}, - {0x7B8E, 0xE357},{0x7B8F, 0xBAE5},{0x7B90, 0xE352},{0x7B91, 0xE351},{0x7B94, 0xBAE4},{0x7B95, 0xBADF},{0x7B96, 0xE353},{0x7B97, 0xBAE2}, - {0x7B98, 0xE359},{0x7B99, 0xE35B},{0x7B9B, 0xE356},{0x7B9C, 0xE34F},{0x7B9D, 0xBAE3},{0x7BA0, 0xBD69},{0x7BA1, 0xBADE},{0x7BA4, 0xE35C}, - {0x7BAC, 0xE6D9},{0x7BAD, 0xBD62},{0x7BAF, 0xE6DB},{0x7BB1, 0xBD63},{0x7BB4, 0xBD65},{0x7BB5, 0xE6DE},{0x7BB7, 0xE6D6},{0x7BB8, 0xBAE6}, - {0x7BB9, 0xE6DC},{0x7BBE, 0xE6D8},{0x7BC0, 0xB860},{0x7BC1, 0xBD68},{0x7BC4, 0xBD64},{0x7BC6, 0xBD66},{0x7BC7, 0xBD67},{0x7BC9, 0xBF76}, - {0x7BCA, 0xE6DD},{0x7BCB, 0xE6D7},{0x7BCC, 0xBD6A},{0x7BCE, 0xE6DA},{0x7BD4, 0xEAC0},{0x7BD5, 0xEABB},{0x7BD8, 0xEAC5},{0x7BD9, 0xBF74}, - {0x7BDA, 0xEABD},{0x7BDB, 0xBF78},{0x7BDC, 0xEAC3},{0x7BDD, 0xEABA},{0x7BDE, 0xEAB7},{0x7BDF, 0xEAC6},{0x7BE0, 0xC151},{0x7BE1, 0xBF79}, - {0x7BE2, 0xEAC2},{0x7BE3, 0xEAB8},{0x7BE4, 0xBF77},{0x7BE5, 0xEABC},{0x7BE6, 0xBF7B},{0x7BE7, 0xEAB9},{0x7BE8, 0xEABE},{0x7BE9, 0xBF7A}, - {0x7BEA, 0xEAC1},{0x7BEB, 0xEAC4},{0x7BF0, 0xEDCB},{0x7BF1, 0xEDCC},{0x7BF2, 0xEDBC},{0x7BF3, 0xEDC3},{0x7BF4, 0xEDC1},{0x7BF7, 0xC14F}, - {0x7BF8, 0xEDC8},{0x7BF9, 0xEABF},{0x7BFB, 0xEDBF},{0x7BFD, 0xEDC9},{0x7BFE, 0xC14E},{0x7BFF, 0xEDBE},{0x7C00, 0xEDBD},{0x7C01, 0xEDC7}, - {0x7C02, 0xEDC4},{0x7C03, 0xEDC6},{0x7C05, 0xEDBA},{0x7C06, 0xEDCA},{0x7C07, 0xC14C},{0x7C09, 0xEDC5},{0x7C0A, 0xEDCE},{0x7C0B, 0xEDC2}, - {0x7C0C, 0xC150},{0x7C0D, 0xC14D},{0x7C0E, 0xEDC0},{0x7C0F, 0xEDBB},{0x7C10, 0xEDCD},{0x7C11, 0xBF75},{0x7C19, 0xF063},{0x7C1C, 0xF061}, - {0x7C1D, 0xF067},{0x7C1E, 0xC2B0},{0x7C1F, 0xF065},{0x7C20, 0xF064},{0x7C21, 0xC2B2},{0x7C22, 0xF06A},{0x7C23, 0xC2B1},{0x7C25, 0xF06B}, - {0x7C26, 0xF068},{0x7C27, 0xC2AE},{0x7C28, 0xF069},{0x7C29, 0xF062},{0x7C2A, 0xC2AF},{0x7C2B, 0xC2AD},{0x7C2C, 0xF2AB},{0x7C2D, 0xF066}, - {0x7C30, 0xF06C},{0x7C33, 0xF2A8},{0x7C37, 0xC3B2},{0x7C38, 0xC3B0},{0x7C39, 0xF2AA},{0x7C3B, 0xF2AC},{0x7C3C, 0xF2A9},{0x7C3D, 0xC3B1}, - {0x7C3E, 0xC3AE},{0x7C3F, 0xC3AF},{0x7C40, 0xC3B3},{0x7C43, 0xC478},{0x7C45, 0xF4AA},{0x7C47, 0xF4A9},{0x7C48, 0xF4A7},{0x7C49, 0xF4A6}, - {0x7C4A, 0xF4A8},{0x7C4C, 0xC477},{0x7C4D, 0xC479},{0x7C50, 0xC4F0},{0x7C53, 0xF5E5},{0x7C54, 0xF5E4},{0x7C57, 0xF6FA},{0x7C59, 0xF6FC}, - {0x7C5A, 0xF6FE},{0x7C5B, 0xF6FD},{0x7C5C, 0xF6FB},{0x7C5F, 0xC5A3},{0x7C60, 0xC5A2},{0x7C63, 0xC5D3},{0x7C64, 0xC5D2},{0x7C65, 0xC5D4}, - {0x7C66, 0xF7ED},{0x7C67, 0xF7EC},{0x7C69, 0xF8FB},{0x7C6A, 0xF8B8},{0x7C6B, 0xF8FC},{0x7C6C, 0xC658},{0x7C6E, 0xC659},{0x7C6F, 0xF96D}, - {0x7C72, 0xC67E},{0x7C73, 0xA6CC},{0x7C75, 0xCDA8},{0x7C78, 0xD045},{0x7C79, 0xD046},{0x7C7A, 0xD044},{0x7C7D, 0xACF3},{0x7C7F, 0xD047}, - {0x7C80, 0xD048},{0x7C81, 0xD049},{0x7C84, 0xD349},{0x7C85, 0xD34F},{0x7C88, 0xD34D},{0x7C89, 0xAFBB},{0x7C8A, 0xD34B},{0x7C8C, 0xD34C}, - {0x7C8D, 0xD34E},{0x7C91, 0xD34A},{0x7C92, 0xB2C9},{0x7C94, 0xD6DE},{0x7C95, 0xB2CB},{0x7C96, 0xD6E0},{0x7C97, 0xB2CA},{0x7C98, 0xD6DF}, - {0x7C9E, 0xDAE8},{0x7C9F, 0xB5AF},{0x7CA1, 0xDAEA},{0x7CA2, 0xDAE7},{0x7CA3, 0xD6E1},{0x7CA5, 0xB5B0},{0x7CA8, 0xDAE9},{0x7CAF, 0xDF56}, - {0x7CB1, 0xB864},{0x7CB2, 0xDF54},{0x7CB3, 0xB865},{0x7CB4, 0xDF55},{0x7CB5, 0xB866},{0x7CB9, 0xBAE9},{0x7CBA, 0xE361},{0x7CBB, 0xE35E}, - {0x7CBC, 0xE360},{0x7CBD, 0xBAEA},{0x7CBE, 0xBAEB},{0x7CBF, 0xE35F},{0x7CC5, 0xE6DF},{0x7CC8, 0xE6E0},{0x7CCA, 0xBD6B},{0x7CCB, 0xE6E2}, - {0x7CCC, 0xE6E1},{0x7CCE, 0xA261},{0x7CD0, 0xEACA},{0x7CD1, 0xEACB},{0x7CD2, 0xEAC7},{0x7CD4, 0xEAC8},{0x7CD5, 0xBF7C},{0x7CD6, 0xBF7D}, - {0x7CD7, 0xEAC9},{0x7CD9, 0xC157},{0x7CDC, 0xC153},{0x7CDD, 0xC158},{0x7CDE, 0xC154},{0x7CDF, 0xC156},{0x7CE0, 0xC152},{0x7CE2, 0xC155}, - {0x7CE7, 0xC2B3},{0x7CE8, 0xEDCF},{0x7CEA, 0xF2AE},{0x7CEC, 0xF2AD},{0x7CEE, 0xF4AB},{0x7CEF, 0xC47A},{0x7CF0, 0xC47B},{0x7CF1, 0xF741}, - {0x7CF2, 0xF5E6},{0x7CF4, 0xF740},{0x7CF6, 0xF8FD},{0x7CF7, 0xF9A4},{0x7CF8, 0xA6CD},{0x7CFB, 0xA874},{0x7CFD, 0xCDA9},{0x7CFE, 0xAAC8}, - {0x7D00, 0xACF6},{0x7D01, 0xD04C},{0x7D02, 0xACF4},{0x7D03, 0xD04A},{0x7D04, 0xACF9},{0x7D05, 0xACF5},{0x7D06, 0xACFA},{0x7D07, 0xACF8}, - {0x7D08, 0xD04B},{0x7D09, 0xACF7},{0x7D0A, 0xAFBF},{0x7D0B, 0xAFBE},{0x7D0C, 0xD35A},{0x7D0D, 0xAFC7},{0x7D0E, 0xD353},{0x7D0F, 0xD359}, - {0x7D10, 0xAFC3},{0x7D11, 0xD352},{0x7D12, 0xD358},{0x7D13, 0xD356},{0x7D14, 0xAFC2},{0x7D15, 0xAFC4},{0x7D16, 0xD355},{0x7D17, 0xAFBD}, - {0x7D18, 0xD354},{0x7D19, 0xAFC8},{0x7D1A, 0xAFC5},{0x7D1B, 0xAFC9},{0x7D1C, 0xAFC6},{0x7D1D, 0xD351},{0x7D1E, 0xD350},{0x7D1F, 0xD357}, - {0x7D20, 0xAFC0},{0x7D21, 0xAFBC},{0x7D22, 0xAFC1},{0x7D28, 0xD6F0},{0x7D29, 0xD6E9},{0x7D2B, 0xB5B5},{0x7D2C, 0xD6E8},{0x7D2E, 0xB2CF}, - {0x7D2F, 0xB2D6},{0x7D30, 0xB2D3},{0x7D31, 0xB2D9},{0x7D32, 0xB2D8},{0x7D33, 0xB2D4},{0x7D35, 0xD6E2},{0x7D36, 0xD6E5},{0x7D38, 0xD6E4}, - {0x7D39, 0xB2D0},{0x7D3A, 0xD6E6},{0x7D3B, 0xD6EF},{0x7D3C, 0xB2D1},{0x7D3D, 0xD6E3},{0x7D3E, 0xD6EC},{0x7D3F, 0xD6ED},{0x7D40, 0xB2D2}, - {0x7D41, 0xD6EA},{0x7D42, 0xB2D7},{0x7D43, 0xB2CD},{0x7D44, 0xB2D5},{0x7D45, 0xD6E7},{0x7D46, 0xB2CC},{0x7D47, 0xD6EB},{0x7D4A, 0xD6EE}, - {0x7D4E, 0xDAFB},{0x7D4F, 0xDAF2},{0x7D50, 0xB5B2},{0x7D51, 0xDAF9},{0x7D52, 0xDAF6},{0x7D53, 0xDAEE},{0x7D54, 0xDAF7},{0x7D55, 0xB5B4}, - {0x7D56, 0xDAEF},{0x7D58, 0xDAEB},{0x7D5B, 0xB86C},{0x7D5C, 0xDAF4},{0x7D5E, 0xB5B1},{0x7D5F, 0xDAFA},{0x7D61, 0xB5B8},{0x7D62, 0xB5BA}, - {0x7D63, 0xDAED},{0x7D66, 0xB5B9},{0x7D67, 0xDAF0},{0x7D68, 0xB5B3},{0x7D69, 0xDAF8},{0x7D6A, 0xDAF1},{0x7D6B, 0xDAF5},{0x7D6D, 0xDAF3}, - {0x7D6E, 0xB5B6},{0x7D6F, 0xDAEC},{0x7D70, 0xB5BB},{0x7D71, 0xB2CE},{0x7D72, 0xB5B7},{0x7D73, 0xB5BC},{0x7D79, 0xB868},{0x7D7A, 0xDF5D}, - {0x7D7B, 0xDF5F},{0x7D7C, 0xDF61},{0x7D7D, 0xDF65},{0x7D7F, 0xDF5B},{0x7D80, 0xDF59},{0x7D81, 0xB86A},{0x7D83, 0xDF60},{0x7D84, 0xDF64}, - {0x7D85, 0xDF5C},{0x7D86, 0xDF58},{0x7D88, 0xDF57},{0x7D8C, 0xDF62},{0x7D8D, 0xDF5A},{0x7D8E, 0xDF5E},{0x7D8F, 0xB86B},{0x7D91, 0xB869}, - {0x7D92, 0xDF66},{0x7D93, 0xB867},{0x7D94, 0xDF63},{0x7D96, 0xE372},{0x7D9C, 0xBAEE},{0x7D9D, 0xE36A},{0x7D9E, 0xBD78},{0x7D9F, 0xE374}, - {0x7DA0, 0xBAF1},{0x7DA1, 0xE378},{0x7DA2, 0xBAF7},{0x7DA3, 0xE365},{0x7DA6, 0xE375},{0x7DA7, 0xE362},{0x7DA9, 0xE377},{0x7DAA, 0xE366}, - {0x7DAC, 0xBAFE},{0x7DAD, 0xBAFB},{0x7DAE, 0xE376},{0x7DAF, 0xE370},{0x7DB0, 0xBAED},{0x7DB1, 0xBAF5},{0x7DB2, 0xBAF4},{0x7DB4, 0xBAF3}, - {0x7DB5, 0xBAF9},{0x7DB7, 0xE363},{0x7DB8, 0xBAFA},{0x7DB9, 0xE371},{0x7DBA, 0xBAF6},{0x7DBB, 0xBAEC},{0x7DBC, 0xE373},{0x7DBD, 0xBAEF}, - {0x7DBE, 0xBAF0},{0x7DBF, 0xBAF8},{0x7DC0, 0xE368},{0x7DC1, 0xE367},{0x7DC2, 0xE364},{0x7DC4, 0xE36C},{0x7DC5, 0xE369},{0x7DC6, 0xE36D}, - {0x7DC7, 0xBAFD},{0x7DC9, 0xE379},{0x7DCA, 0xBAF2},{0x7DCB, 0xE36E},{0x7DCC, 0xE36F},{0x7DCE, 0xE36B},{0x7DD2, 0xBAFC},{0x7DD7, 0xE6E7}, - {0x7DD8, 0xBD70},{0x7DD9, 0xBD79},{0x7DDA, 0xBD75},{0x7DDB, 0xE6E4},{0x7DDD, 0xBD72},{0x7DDE, 0xBD76},{0x7DDF, 0xE6F0},{0x7DE0, 0xBD6C}, - {0x7DE1, 0xE6E8},{0x7DE3, 0xBD74},{0x7DE6, 0xE6EB},{0x7DE7, 0xE6E6},{0x7DE8, 0xBD73},{0x7DE9, 0xBD77},{0x7DEA, 0xE6E5},{0x7DEC, 0xBD71}, - {0x7DEE, 0xE6EF},{0x7DEF, 0xBD6E},{0x7DF0, 0xE6EE},{0x7DF1, 0xE6ED},{0x7DF2, 0xBD7A},{0x7DF3, 0xE572},{0x7DF4, 0xBD6D},{0x7DF6, 0xE6EC}, - {0x7DF7, 0xE6E3},{0x7DF9, 0xBD7B},{0x7DFA, 0xE6EA},{0x7DFB, 0xBD6F},{0x7E03, 0xE6E9},{0x7E08, 0xBFA2},{0x7E09, 0xBFA7},{0x7E0A, 0xBF7E}, - {0x7E0B, 0xEAD8},{0x7E0C, 0xEACF},{0x7E0D, 0xEADB},{0x7E0E, 0xEAD3},{0x7E0F, 0xEAD9},{0x7E10, 0xBFA8},{0x7E11, 0xBFA1},{0x7E12, 0xEACC}, - {0x7E13, 0xEAD2},{0x7E14, 0xEADC},{0x7E15, 0xEAD5},{0x7E16, 0xEADA},{0x7E17, 0xEACE},{0x7E1A, 0xEAD6},{0x7E1B, 0xBFA3},{0x7E1C, 0xEAD4}, - {0x7E1D, 0xBFA6},{0x7E1E, 0xBFA5},{0x7E1F, 0xEAD0},{0x7E20, 0xEAD1},{0x7E21, 0xEACD},{0x7E22, 0xEAD7},{0x7E23, 0xBFA4},{0x7E24, 0xEADE}, - {0x7E25, 0xEADD},{0x7E29, 0xEDDA},{0x7E2A, 0xEDD6},{0x7E2B, 0xC15F},{0x7E2D, 0xEDD0},{0x7E2E, 0xC159},{0x7E2F, 0xC169},{0x7E30, 0xEDDC}, - {0x7E31, 0xC161},{0x7E32, 0xC15D},{0x7E33, 0xEDD3},{0x7E34, 0xC164},{0x7E35, 0xC167},{0x7E36, 0xEDDE},{0x7E37, 0xC15C},{0x7E38, 0xEDD5}, - {0x7E39, 0xC165},{0x7E3A, 0xEDE0},{0x7E3B, 0xEDDD},{0x7E3C, 0xEDD1},{0x7E3D, 0xC160},{0x7E3E, 0xC15A},{0x7E3F, 0xC168},{0x7E40, 0xEDD8}, - {0x7E41, 0xC163},{0x7E42, 0xEDD2},{0x7E43, 0xC15E},{0x7E44, 0xEDDF},{0x7E45, 0xC162},{0x7E46, 0xC15B},{0x7E47, 0xEDD9},{0x7E48, 0xC166}, - {0x7E49, 0xEDD7},{0x7E4C, 0xEDDB},{0x7E50, 0xF06E},{0x7E51, 0xF074},{0x7E52, 0xC2B9},{0x7E53, 0xF077},{0x7E54, 0xC2B4},{0x7E55, 0xC2B5}, - {0x7E56, 0xF06F},{0x7E57, 0xF076},{0x7E58, 0xF071},{0x7E59, 0xC2BA},{0x7E5A, 0xC2B7},{0x7E5C, 0xF06D},{0x7E5E, 0xC2B6},{0x7E5F, 0xF073}, - {0x7E60, 0xF075},{0x7E61, 0xC2B8},{0x7E62, 0xF072},{0x7E63, 0xF070},{0x7E68, 0xF2B8},{0x7E69, 0xC3B7},{0x7E6A, 0xC3B8},{0x7E6B, 0xC3B4}, - {0x7E6D, 0xC3B5},{0x7E6F, 0xF2B4},{0x7E70, 0xF2B2},{0x7E72, 0xF2B6},{0x7E73, 0xC3BA},{0x7E74, 0xF2B7},{0x7E75, 0xF2B0},{0x7E76, 0xF2AF}, - {0x7E77, 0xF2B3},{0x7E78, 0xF2B1},{0x7E79, 0xC3B6},{0x7E7A, 0xF2B5},{0x7E7B, 0xF4AC},{0x7E7C, 0xC47E},{0x7E7D, 0xC47D},{0x7E7E, 0xF4AD}, - {0x7E80, 0xF4AF},{0x7E81, 0xF4AE},{0x7E82, 0xC4A1},{0x7E86, 0xF5EB},{0x7E87, 0xF5E8},{0x7E88, 0xF5E9},{0x7E8A, 0xF5E7},{0x7E8B, 0xF5EA}, - {0x7E8C, 0xC4F2},{0x7E8D, 0xF5EC},{0x7E8F, 0xC4F1},{0x7E91, 0xF742},{0x7E93, 0xC5D5},{0x7E94, 0xC5D7},{0x7E95, 0xF7EE},{0x7E96, 0xC5D6}, - {0x7E97, 0xF8B9},{0x7E98, 0xF940},{0x7E99, 0xF942},{0x7E9A, 0xF8FE},{0x7E9B, 0xF941},{0x7E9C, 0xC66C},{0x7F36, 0xA6CE},{0x7F38, 0xACFB}, - {0x7F39, 0xD26F},{0x7F3A, 0xAFCA},{0x7F3D, 0xB2DA},{0x7F3E, 0xDAFC},{0x7F3F, 0xDAFD},{0x7F43, 0xEADF},{0x7F44, 0xC16A},{0x7F45, 0xEDE1}, - {0x7F48, 0xC2BB},{0x7F4A, 0xF2BA},{0x7F4B, 0xF2B9},{0x7F4C, 0xC4A2},{0x7F4D, 0xF5ED},{0x7F4F, 0xF743},{0x7F50, 0xC5F8},{0x7F51, 0xCA49}, - {0x7F54, 0xAAC9},{0x7F55, 0xA875},{0x7F58, 0xD04D},{0x7F5B, 0xD360},{0x7F5C, 0xD35B},{0x7F5D, 0xD35F},{0x7F5E, 0xD35D},{0x7F5F, 0xAFCB}, - {0x7F60, 0xD35E},{0x7F61, 0xD35C},{0x7F63, 0xD6F1},{0x7F65, 0xDAFE},{0x7F66, 0xDB40},{0x7F67, 0xDF69},{0x7F68, 0xDF6A},{0x7F69, 0xB86E}, - {0x7F6A, 0xB86F},{0x7F6B, 0xDF68},{0x7F6C, 0xDF6B},{0x7F6D, 0xDF67},{0x7F6E, 0xB86D},{0x7F70, 0xBB40},{0x7F72, 0xB870},{0x7F73, 0xE37A}, - {0x7F75, 0xBD7C},{0x7F76, 0xE6F1},{0x7F77, 0xBD7D},{0x7F79, 0xBFA9},{0x7F7A, 0xEAE2},{0x7F7B, 0xEAE0},{0x7F7C, 0xEAE1},{0x7F7D, 0xEDE4}, - {0x7F7E, 0xEDE3},{0x7F7F, 0xEDE2},{0x7F83, 0xF2BB},{0x7F85, 0xC3B9},{0x7F86, 0xF2BC},{0x7F87, 0xF744},{0x7F88, 0xC5F9},{0x7F89, 0xF8BA}, - {0x7F8A, 0xA6CF},{0x7F8B, 0xAACB},{0x7F8C, 0xAACA},{0x7F8D, 0xD04F},{0x7F8E, 0xACFC},{0x7F91, 0xD04E},{0x7F92, 0xD362},{0x7F94, 0xAFCC}, - {0x7F95, 0xD6F2},{0x7F96, 0xD361},{0x7F9A, 0xB2DC},{0x7F9B, 0xD6F5},{0x7F9C, 0xD6F3},{0x7F9D, 0xD6F4},{0x7F9E, 0xB2DB},{0x7FA0, 0xDB42}, - {0x7FA1, 0xDB43},{0x7FA2, 0xDB41},{0x7FA4, 0xB873},{0x7FA5, 0xDF6D},{0x7FA6, 0xDF6C},{0x7FA7, 0xDF6E},{0x7FA8, 0xB872},{0x7FA9, 0xB871}, - {0x7FAC, 0xE6F2},{0x7FAD, 0xE6F4},{0x7FAF, 0xBD7E},{0x7FB0, 0xE6F3},{0x7FB1, 0xEAE3},{0x7FB2, 0xBFAA},{0x7FB3, 0xF079},{0x7FB5, 0xF078}, - {0x7FB6, 0xC3BB},{0x7FB7, 0xF2BD},{0x7FB8, 0xC3BD},{0x7FB9, 0xC3BC},{0x7FBA, 0xF4B0},{0x7FBB, 0xF5EE},{0x7FBC, 0xC4F3},{0x7FBD, 0xA6D0}, - {0x7FBE, 0xD050},{0x7FBF, 0xACFD},{0x7FC0, 0xD365},{0x7FC1, 0xAFCE},{0x7FC2, 0xD364},{0x7FC3, 0xD363},{0x7FC5, 0xAFCD},{0x7FC7, 0xD6FB}, - {0x7FC9, 0xD6FD},{0x7FCA, 0xD6F6},{0x7FCB, 0xD6F7},{0x7FCC, 0xB2DD},{0x7FCD, 0xD6F8},{0x7FCE, 0xB2DE},{0x7FCF, 0xD6FC},{0x7FD0, 0xD6F9}, - {0x7FD1, 0xD6FA},{0x7FD2, 0xB2DF},{0x7FD4, 0xB5BE},{0x7FD5, 0xB5BF},{0x7FD7, 0xDB44},{0x7FDB, 0xDF6F},{0x7FDC, 0xDF70},{0x7FDE, 0xE37E}, - {0x7FDF, 0xBB43},{0x7FE0, 0xBB41},{0x7FE1, 0xBB42},{0x7FE2, 0xE37B},{0x7FE3, 0xE37C},{0x7FE5, 0xE37D},{0x7FE6, 0xE6F9},{0x7FE8, 0xE6FA}, - {0x7FE9, 0xBDA1},{0x7FEA, 0xE6F7},{0x7FEB, 0xE6F6},{0x7FEC, 0xE6F8},{0x7FED, 0xE6F5},{0x7FEE, 0xBFAD},{0x7FEF, 0xEAE4},{0x7FF0, 0xBFAB}, - {0x7FF1, 0xBFAC},{0x7FF2, 0xEDE6},{0x7FF3, 0xC16B},{0x7FF4, 0xEDE5},{0x7FF5, 0xEFA8},{0x7FF7, 0xF07A},{0x7FF8, 0xF07B},{0x7FF9, 0xC2BC}, - {0x7FFB, 0xC2BD},{0x7FFC, 0xC16C},{0x7FFD, 0xF2BE},{0x7FFE, 0xF2BF},{0x7FFF, 0xF4B1},{0x8000, 0xC4A3},{0x8001, 0xA6D1},{0x8003, 0xA6D2}, - {0x8004, 0xACFE},{0x8005, 0xAACC},{0x8006, 0xAFCF},{0x8007, 0xD051},{0x800B, 0xB5C0},{0x800C, 0xA6D3},{0x800D, 0xAD41},{0x800E, 0xD052}, - {0x800F, 0xD053},{0x8010, 0xAD40},{0x8011, 0xAD42},{0x8012, 0xA6D4},{0x8014, 0xD054},{0x8015, 0xAFD1},{0x8016, 0xD366},{0x8017, 0xAFD3}, - {0x8018, 0xAFD0},{0x8019, 0xAFD2},{0x801B, 0xD741},{0x801C, 0xB2E0},{0x801E, 0xD740},{0x801F, 0xD6FE},{0x8021, 0xDF71},{0x8024, 0xE3A1}, - {0x8026, 0xBDA2},{0x8028, 0xBFAE},{0x8029, 0xEAE6},{0x802A, 0xEAE5},{0x802C, 0xEDE7},{0x8030, 0xF5EF},{0x8033, 0xA6D5},{0x8034, 0xCB73}, - {0x8035, 0xCDAA},{0x8036, 0xAD43},{0x8037, 0xD055},{0x8039, 0xD368},{0x803D, 0xAFD4},{0x803E, 0xD367},{0x803F, 0xAFD5},{0x8043, 0xD743}, - {0x8046, 0xB2E2},{0x8047, 0xD742},{0x8048, 0xD744},{0x804A, 0xB2E1},{0x804F, 0xDB46},{0x8050, 0xDB47},{0x8051, 0xDB45},{0x8052, 0xB5C1}, - {0x8056, 0xB874},{0x8058, 0xB875},{0x805A, 0xBB45},{0x805C, 0xE3A3},{0x805D, 0xE3A2},{0x805E, 0xBB44},{0x8064, 0xE6FB},{0x8067, 0xE6FC}, - {0x806C, 0xEAE7},{0x806F, 0xC170},{0x8070, 0xC16F},{0x8071, 0xC16D},{0x8072, 0xC16E},{0x8073, 0xC171},{0x8075, 0xF07C},{0x8076, 0xC2BF}, - {0x8077, 0xC2BE},{0x8078, 0xF2C0},{0x8079, 0xF4B2},{0x807D, 0xC5A5},{0x807E, 0xC5A4},{0x807F, 0xA6D6},{0x8082, 0xD1FB},{0x8084, 0xB877}, - {0x8085, 0xB5C2},{0x8086, 0xB876},{0x8087, 0xBB46},{0x8089, 0xA6D7},{0x808A, 0xC9A9},{0x808B, 0xA6D8},{0x808C, 0xA6D9},{0x808F, 0xCDAB}, - {0x8090, 0xCB76},{0x8092, 0xCB77},{0x8093, 0xA877},{0x8095, 0xCB74},{0x8096, 0xA876},{0x8098, 0xA879},{0x8099, 0xCB75},{0x809A, 0xA87B}, - {0x809B, 0xA87A},{0x809C, 0xCB78},{0x809D, 0xA878},{0x80A1, 0xAAD1},{0x80A2, 0xAACF},{0x80A3, 0xCDAD},{0x80A5, 0xAACE},{0x80A9, 0xAAD3}, - {0x80AA, 0xAAD5},{0x80AB, 0xAAD2},{0x80AD, 0xCDB0},{0x80AE, 0xCDAC},{0x80AF, 0xAAD6},{0x80B1, 0xAAD0},{0x80B2, 0xA87C},{0x80B4, 0xAAD4}, - {0x80B5, 0xCDAF},{0x80B8, 0xCDAE},{0x80BA, 0xAACD},{0x80C2, 0xD05B},{0x80C3, 0xAD47},{0x80C4, 0xAD48},{0x80C5, 0xD05D},{0x80C7, 0xD057}, - {0x80C8, 0xD05A},{0x80C9, 0xD063},{0x80CA, 0xD061},{0x80CC, 0xAD49},{0x80CD, 0xD067},{0x80CE, 0xAD4C},{0x80CF, 0xD064},{0x80D0, 0xD05C}, - {0x80D1, 0xD059},{0x80D4, 0xDB49},{0x80D5, 0xD062},{0x80D6, 0xAD44},{0x80D7, 0xD065},{0x80D8, 0xD056},{0x80D9, 0xD05F},{0x80DA, 0xAD46}, - {0x80DB, 0xAD4B},{0x80DC, 0xD060},{0x80DD, 0xAD4F},{0x80DE, 0xAD4D},{0x80E0, 0xD058},{0x80E1, 0xAD4A},{0x80E3, 0xD05E},{0x80E4, 0xAD4E}, - {0x80E5, 0xAD45},{0x80E6, 0xD066},{0x80ED, 0xAFDA},{0x80EF, 0xAFE3},{0x80F0, 0xAFD8},{0x80F1, 0xAFD6},{0x80F2, 0xD36A},{0x80F3, 0xAFDE}, - {0x80F4, 0xAFDB},{0x80F5, 0xD36C},{0x80F8, 0xAFDD},{0x80F9, 0xD36B},{0x80FA, 0xD369},{0x80FB, 0xD36E},{0x80FC, 0xAFE2},{0x80FD, 0xAFE0}, - {0x80FE, 0xDB48},{0x8100, 0xD36F},{0x8101, 0xD36D},{0x8102, 0xAFD7},{0x8105, 0xAFD9},{0x8106, 0xAFDC},{0x8108, 0xAFDF},{0x810A, 0xAFE1}, - {0x8115, 0xD74E},{0x8116, 0xB2E4},{0x8118, 0xD745},{0x8119, 0xD747},{0x811B, 0xD748},{0x811D, 0xD750},{0x811E, 0xD74C},{0x811F, 0xD74A}, - {0x8121, 0xD74D},{0x8122, 0xD751},{0x8123, 0xB2E5},{0x8124, 0xB2E9},{0x8125, 0xD746},{0x8127, 0xD74F},{0x8129, 0xB2E7},{0x812B, 0xB2E6}, - {0x812C, 0xD74B},{0x812D, 0xD749},{0x812F, 0xB2E3},{0x8130, 0xB2E8},{0x8139, 0xB5C8},{0x813A, 0xDB51},{0x813D, 0xDB4F},{0x813E, 0xB5CA}, - {0x8143, 0xDB4A},{0x8144, 0xDFA1},{0x8146, 0xB5C9},{0x8147, 0xDB4E},{0x814A, 0xDB4B},{0x814B, 0xB5C5},{0x814C, 0xB5CB},{0x814D, 0xDB50}, - {0x814E, 0xB5C7},{0x814F, 0xDB4D},{0x8150, 0xBB47},{0x8151, 0xB5C6},{0x8152, 0xDB4C},{0x8153, 0xB5CC},{0x8154, 0xB5C4},{0x8155, 0xB5C3}, - {0x815B, 0xDF77},{0x815C, 0xDF75},{0x815E, 0xDF7B},{0x8160, 0xDF73},{0x8161, 0xDFA2},{0x8162, 0xDF78},{0x8164, 0xDF72},{0x8165, 0xB87B}, - {0x8166, 0xB8A3},{0x8167, 0xDF7D},{0x8169, 0xDF76},{0x816B, 0xB87E},{0x816E, 0xB87C},{0x816F, 0xDF7E},{0x8170, 0xB879},{0x8171, 0xB878}, - {0x8172, 0xDF79},{0x8173, 0xB87D},{0x8174, 0xB5CD},{0x8176, 0xDF7C},{0x8177, 0xDF74},{0x8178, 0xB87A},{0x8179, 0xB8A1},{0x817A, 0xB8A2}, - {0x817F, 0xBB4C},{0x8180, 0xBB48},{0x8182, 0xBB4D},{0x8183, 0xE3A6},{0x8186, 0xE3A5},{0x8187, 0xE3A7},{0x8188, 0xBB4A},{0x8189, 0xE3A4}, - {0x818A, 0xBB4B},{0x818B, 0xE3AA},{0x818C, 0xE3A9},{0x818D, 0xE3A8},{0x818F, 0xBB49},{0x8195, 0xE741},{0x8197, 0xE744},{0x8198, 0xBDA8}, - {0x8199, 0xE743},{0x819A, 0xBDA7},{0x819B, 0xBDA3},{0x819C, 0xBDA4},{0x819D, 0xBDA5},{0x819E, 0xE740},{0x819F, 0xE6FE},{0x81A0, 0xBDA6}, - {0x81A2, 0xE742},{0x81A3, 0xE6FD},{0x81A6, 0xEAE9},{0x81A7, 0xEAF3},{0x81A8, 0xBFB1},{0x81A9, 0xBFB0},{0x81AB, 0xEAED},{0x81AC, 0xEAEF}, - {0x81AE, 0xEAEA},{0x81B0, 0xEAEE},{0x81B1, 0xEAE8},{0x81B2, 0xEAF1},{0x81B3, 0xBFAF},{0x81B4, 0xEAF0},{0x81B5, 0xEAEC},{0x81B7, 0xEAF2}, - {0x81B9, 0xEAEB},{0x81BA, 0xC174},{0x81BB, 0xEDE8},{0x81BC, 0xEDEE},{0x81BD, 0xC178},{0x81BE, 0xC17A},{0x81BF, 0xC177},{0x81C0, 0xC176}, - {0x81C2, 0xC175},{0x81C3, 0xC173},{0x81C4, 0xEDE9},{0x81C5, 0xEDEC},{0x81C6, 0xC172},{0x81C7, 0xEDED},{0x81C9, 0xC179},{0x81CA, 0xEDEB}, - {0x81CC, 0xEDEA},{0x81CD, 0xC2C0},{0x81CF, 0xC2C1},{0x81D0, 0xF0A1},{0x81D1, 0xF07D},{0x81D2, 0xF07E},{0x81D5, 0xF2C2},{0x81D7, 0xF2C1}, - {0x81D8, 0xC3BE},{0x81D9, 0xF4B4},{0x81DA, 0xC4A4},{0x81DB, 0xF4B3},{0x81DD, 0xF5F0},{0x81DE, 0xF745},{0x81DF, 0xC5A6},{0x81E0, 0xF943}, - {0x81E1, 0xF944},{0x81E2, 0xC5D8},{0x81E3, 0xA6DA},{0x81E5, 0xAAD7},{0x81E6, 0xDB52},{0x81E7, 0xBB4E},{0x81E8, 0xC17B},{0x81E9, 0xEDEF}, - {0x81EA, 0xA6DB},{0x81EC, 0xAFE5},{0x81ED, 0xAFE4},{0x81EE, 0xDB53},{0x81F2, 0xEAF4},{0x81F3, 0xA6DC},{0x81F4, 0xAD50},{0x81F7, 0xDB54}, - {0x81F8, 0xDB55},{0x81F9, 0xDB56},{0x81FA, 0xBB4F},{0x81FB, 0xBFB2},{0x81FC, 0xA6DD},{0x81FE, 0xAAD8},{0x81FF, 0xD068},{0x8200, 0xAFE6}, - {0x8201, 0xD370},{0x8202, 0xB2EA},{0x8204, 0xDB57},{0x8205, 0xB8A4},{0x8207, 0xBB50},{0x8208, 0xBFB3},{0x8209, 0xC17C},{0x820A, 0xC2C2}, - {0x820B, 0xF4B5},{0x820C, 0xA6DE},{0x820D, 0xAAD9},{0x8210, 0xAFE7},{0x8211, 0xD752},{0x8212, 0xB5CE},{0x8214, 0xBB51},{0x8215, 0xE3AB}, - {0x8216, 0xE745},{0x821B, 0xA6DF},{0x821C, 0xB5CF},{0x821D, 0xDFA3},{0x821E, 0xBB52},{0x821F, 0xA6E0},{0x8220, 0xCDB1},{0x8221, 0xD069}, - {0x8222, 0xAD51},{0x8225, 0xD372},{0x8228, 0xAFEA},{0x822A, 0xAFE8},{0x822B, 0xAFE9},{0x822C, 0xAFEB},{0x822F, 0xD371},{0x8232, 0xD757}, - {0x8233, 0xD754},{0x8234, 0xD756},{0x8235, 0xB2EB},{0x8236, 0xB2ED},{0x8237, 0xB2EC},{0x8238, 0xD753},{0x8239, 0xB2EE},{0x823A, 0xD755}, - {0x823C, 0xDB58},{0x823D, 0xDB59},{0x823F, 0xDB5A},{0x8240, 0xDFA6},{0x8242, 0xDFA7},{0x8244, 0xDFA5},{0x8245, 0xDFA8},{0x8247, 0xB8A5}, - {0x8249, 0xDFA4},{0x824B, 0xBB53},{0x824E, 0xE74A},{0x824F, 0xE746},{0x8250, 0xE749},{0x8251, 0xE74B},{0x8252, 0xE748},{0x8253, 0xE747}, - {0x8255, 0xEAF5},{0x8256, 0xEAF6},{0x8257, 0xEAF7},{0x8258, 0xBFB4},{0x8259, 0xBFB5},{0x825A, 0xEDF1},{0x825B, 0xEDF0},{0x825C, 0xEDF2}, - {0x825E, 0xF0A3},{0x825F, 0xF0A2},{0x8261, 0xF2C4},{0x8263, 0xF2C5},{0x8264, 0xF2C3},{0x8266, 0xC4A5},{0x8268, 0xF4B6},{0x8269, 0xF4B7}, - {0x826B, 0xF746},{0x826C, 0xF7EF},{0x826D, 0xF8BB},{0x826E, 0xA6E1},{0x826F, 0xA87D},{0x8271, 0xC17D},{0x8272, 0xA6E2},{0x8274, 0xD758}, - {0x8275, 0xDB5B},{0x8277, 0xC641},{0x8278, 0xCA4A},{0x827C, 0xCA4B},{0x827D, 0xCA4D},{0x827E, 0xA6E3},{0x827F, 0xCA4E},{0x8280, 0xCA4C}, - {0x8283, 0xCBA2},{0x8284, 0xCBA3},{0x8285, 0xCB7B},{0x828A, 0xCBA1},{0x828B, 0xA8A1},{0x828D, 0xA8A2},{0x828E, 0xCB7C},{0x828F, 0xCB7A}, - {0x8290, 0xCB79},{0x8291, 0xCB7D},{0x8292, 0xA87E},{0x8293, 0xCB7E},{0x8294, 0xD06A},{0x8298, 0xCDB6},{0x8299, 0xAADC},{0x829A, 0xCDB5}, - {0x829B, 0xCDB7},{0x829D, 0xAADB},{0x829E, 0xCDBC},{0x829F, 0xAADF},{0x82A0, 0xCDB2},{0x82A1, 0xCDC0},{0x82A2, 0xCDC6},{0x82A3, 0xAAE6}, - {0x82A4, 0xCDC3},{0x82A5, 0xAAE3},{0x82A7, 0xCDB9},{0x82A8, 0xCDBF},{0x82A9, 0xCDC1},{0x82AB, 0xCDB4},{0x82AC, 0xAAE2},{0x82AD, 0xAADD}, - {0x82AE, 0xCDBA},{0x82AF, 0xAAE4},{0x82B0, 0xAAE7},{0x82B1, 0xAAE1},{0x82B3, 0xAADA},{0x82B4, 0xCDBE},{0x82B5, 0xCDB8},{0x82B6, 0xCDC5}, - {0x82B7, 0xAAE9},{0x82B8, 0xAAE5},{0x82B9, 0xAAE0},{0x82BA, 0xCDBD},{0x82BB, 0xAFEC},{0x82BC, 0xCDBB},{0x82BD, 0xAADE},{0x82BE, 0xAAE8}, - {0x82C0, 0xCDB3},{0x82C2, 0xCDC2},{0x82C3, 0xCDC4},{0x82D1, 0xAD62},{0x82D2, 0xAD5C},{0x82D3, 0xAD64},{0x82D4, 0xAD61},{0x82D5, 0xD071}, - {0x82D6, 0xD074},{0x82D7, 0xAD5D},{0x82D9, 0xD06B},{0x82DB, 0xAD56},{0x82DC, 0xAD60},{0x82DE, 0xAD63},{0x82DF, 0xAD65},{0x82E0, 0xD0A2}, - {0x82E1, 0xD077},{0x82E3, 0xAD55},{0x82E4, 0xD0A1},{0x82E5, 0xAD59},{0x82E6, 0xAD57},{0x82E7, 0xAD52},{0x82E8, 0xD06F},{0x82EA, 0xD07E}, - {0x82EB, 0xD073},{0x82EC, 0xD076},{0x82ED, 0xD0A5},{0x82EF, 0xAD66},{0x82F0, 0xD07D},{0x82F1, 0xAD5E},{0x82F2, 0xD078},{0x82F3, 0xD0A4}, - {0x82F4, 0xD075},{0x82F5, 0xD079},{0x82F6, 0xD07C},{0x82F9, 0xD06D},{0x82FA, 0xD0A3},{0x82FB, 0xD07B},{0x82FE, 0xD06C},{0x8300, 0xD070}, - {0x8301, 0xAD5F},{0x8302, 0xAD5A},{0x8303, 0xAD53},{0x8304, 0xAD58},{0x8305, 0xAD54},{0x8306, 0xAD67},{0x8307, 0xD06E},{0x8308, 0xD3A5}, - {0x8309, 0xAD5B},{0x830C, 0xD07A},{0x830D, 0xCE41},{0x8316, 0xD3A8},{0x8317, 0xAFFA},{0x8319, 0xD376},{0x831B, 0xD3A3},{0x831C, 0xD37D}, - {0x831E, 0xD3B2},{0x8320, 0xD3AA},{0x8322, 0xD37E},{0x8324, 0xD3A9},{0x8325, 0xD378},{0x8326, 0xD37C},{0x8327, 0xD3B5},{0x8328, 0xAFFD}, - {0x8329, 0xD3AD},{0x832A, 0xD3A4},{0x832B, 0xAFED},{0x832C, 0xD3B3},{0x832D, 0xD374},{0x832F, 0xD3AC},{0x8331, 0xAFFC},{0x8332, 0xAFF7}, - {0x8333, 0xD373},{0x8334, 0xAFF5},{0x8335, 0xAFF4},{0x8336, 0xAFF9},{0x8337, 0xD3AB},{0x8338, 0xAFF1},{0x8339, 0xAFF8},{0x833A, 0xD072}, - {0x833B, 0xDB5C},{0x833C, 0xD3A6},{0x833F, 0xD37A},{0x8340, 0xAFFB},{0x8341, 0xD37B},{0x8342, 0xD3A1},{0x8343, 0xAFFE},{0x8344, 0xD375}, - {0x8345, 0xD3AF},{0x8347, 0xD3AE},{0x8348, 0xD3B6},{0x8349, 0xAFF3},{0x834A, 0xAFF0},{0x834B, 0xD3B4},{0x834C, 0xD3B0},{0x834D, 0xD3A7}, - {0x834E, 0xD3A2},{0x834F, 0xAFF6},{0x8350, 0xAFF2},{0x8351, 0xD377},{0x8352, 0xAFEE},{0x8353, 0xD3B1},{0x8354, 0xAFEF},{0x8356, 0xD379}, - {0x8373, 0xD75E},{0x8374, 0xD760},{0x8375, 0xD765},{0x8376, 0xD779},{0x8377, 0xB2FC},{0x8378, 0xB2F2},{0x837A, 0xD75D},{0x837B, 0xB2FD}, - {0x837C, 0xB2FE},{0x837D, 0xD768},{0x837E, 0xD76F},{0x837F, 0xD775},{0x8381, 0xD762},{0x8383, 0xD769},{0x8386, 0xB340},{0x8387, 0xD777}, - {0x8388, 0xD772},{0x8389, 0xB2FA},{0x838A, 0xB2F8},{0x838B, 0xD76E},{0x838C, 0xD76A},{0x838D, 0xD75C},{0x838E, 0xB2EF},{0x838F, 0xD761}, - {0x8390, 0xD759},{0x8392, 0xB2F7},{0x8393, 0xB2F9},{0x8394, 0xD766},{0x8395, 0xD763},{0x8396, 0xB2F4},{0x8397, 0xD773},{0x8398, 0xB2F1}, - {0x8399, 0xD764},{0x839A, 0xD77A},{0x839B, 0xD76C},{0x839D, 0xD76B},{0x839E, 0xB2F0},{0x83A0, 0xB2FB},{0x83A2, 0xB2F3},{0x83A3, 0xD75A}, - {0x83A4, 0xD75F},{0x83A5, 0xD770},{0x83A6, 0xD776},{0x83A7, 0xB341},{0x83A8, 0xD75B},{0x83A9, 0xD767},{0x83AA, 0xD76D},{0x83AB, 0xB2F6}, - {0x83AE, 0xD778},{0x83AF, 0xD771},{0x83B0, 0xD774},{0x83BD, 0xB2F5},{0x83BF, 0xDB6C},{0x83C0, 0xDB60},{0x83C1, 0xB5D7},{0x83C2, 0xDB7D}, - {0x83C3, 0xDBA7},{0x83C4, 0xDBAA},{0x83C5, 0xB5D5},{0x83C6, 0xDB68},{0x83C7, 0xDBA3},{0x83C8, 0xDB69},{0x83C9, 0xDB77},{0x83CA, 0xB5E2}, - {0x83CB, 0xDB73},{0x83CC, 0xB5DF},{0x83CE, 0xDB74},{0x83CF, 0xDB5D},{0x83D1, 0xDBA4},{0x83D4, 0xB5E8},{0x83D5, 0xDBA1},{0x83D6, 0xDB75}, - {0x83D7, 0xDBAC},{0x83D8, 0xDB70},{0x83D9, 0xDFC8},{0x83DB, 0xDBAF},{0x83DC, 0xB5E6},{0x83DD, 0xDB6E},{0x83DE, 0xDB7A},{0x83DF, 0xB5E9}, - {0x83E0, 0xB5D4},{0x83E1, 0xDB72},{0x83E2, 0xDBAD},{0x83E3, 0xDB6B},{0x83E4, 0xDB64},{0x83E5, 0xDB6F},{0x83E7, 0xDB63},{0x83E8, 0xDB61}, - {0x83E9, 0xB5D0},{0x83EA, 0xDBA5},{0x83EB, 0xDB6A},{0x83EC, 0xDBA8},{0x83EE, 0xDBA9},{0x83EF, 0xB5D8},{0x83F0, 0xB5DD},{0x83F1, 0xB5D9}, - {0x83F2, 0xB5E1},{0x83F3, 0xDB7E},{0x83F4, 0xB5DA},{0x83F5, 0xDB76},{0x83F6, 0xDB66},{0x83F8, 0xB5D2},{0x83F9, 0xDB5E},{0x83FA, 0xDBA2}, - {0x83FB, 0xDBAB},{0x83FC, 0xDB65},{0x83FD, 0xB5E0},{0x83FE, 0xDBB0},{0x83FF, 0xDB71},{0x8401, 0xDB6D},{0x8403, 0xB5D1},{0x8404, 0xB5E5}, - {0x8406, 0xDB7C},{0x8407, 0xB5E7},{0x8409, 0xDB78},{0x840A, 0xB5DC},{0x840B, 0xB5D6},{0x840C, 0xB5DE},{0x840D, 0xB5D3},{0x840E, 0xB5E4}, - {0x840F, 0xDB79},{0x8410, 0xDB67},{0x8411, 0xDB7B},{0x8412, 0xDB62},{0x8413, 0xDBA6},{0x841B, 0xDBAE},{0x8423, 0xDB5F},{0x8429, 0xDFC7}, - {0x842B, 0xDFDD},{0x842C, 0xB855},{0x842D, 0xDFCC},{0x842F, 0xDFCA},{0x8430, 0xDFB5},{0x8431, 0xB8A9},{0x8432, 0xDFC5},{0x8433, 0xDFD9}, - {0x8434, 0xDFC1},{0x8435, 0xB8B1},{0x8436, 0xDFD8},{0x8437, 0xDFBF},{0x8438, 0xB5E3},{0x8439, 0xDFCF},{0x843A, 0xDFC0},{0x843B, 0xDFD6}, - {0x843C, 0xB8B0},{0x843D, 0xB8A8},{0x843F, 0xDFAA},{0x8440, 0xDFB2},{0x8442, 0xDFCB},{0x8443, 0xDFC3},{0x8444, 0xDFDC},{0x8445, 0xDFC6}, - {0x8446, 0xB8B6},{0x8447, 0xDFD7},{0x8449, 0xB8AD},{0x844B, 0xDFC9},{0x844C, 0xDFD1},{0x844D, 0xDFB6},{0x844E, 0xDFD0},{0x8450, 0xDFE1}, - {0x8451, 0xDFB1},{0x8452, 0xDFD2},{0x8454, 0xDFDF},{0x8456, 0xDFAB},{0x8457, 0xB5DB},{0x8459, 0xDFB9},{0x845A, 0xDFB8},{0x845B, 0xB8AF}, - {0x845D, 0xDFBC},{0x845E, 0xDFBE},{0x845F, 0xDFCD},{0x8460, 0xDFDE},{0x8461, 0xB8B2},{0x8463, 0xB8B3},{0x8465, 0xDFB0},{0x8466, 0xB8AB}, - {0x8467, 0xDFB4},{0x8468, 0xDFDA},{0x8469, 0xB8B4},{0x846B, 0xB8AC},{0x846C, 0xB8AE},{0x846D, 0xB8B5},{0x846E, 0xDFE0},{0x846F, 0xDFD3}, - {0x8470, 0xDFCE},{0x8473, 0xDFBB},{0x8474, 0xDFBA},{0x8475, 0xB8AA},{0x8476, 0xDFAC},{0x8477, 0xB8A7},{0x8478, 0xDFC4},{0x8479, 0xDFAD}, - {0x847A, 0xDFC2},{0x847D, 0xDFB7},{0x847E, 0xDFDB},{0x8482, 0xB8A6},{0x8486, 0xDFB3},{0x848D, 0xDFAF},{0x848E, 0xDFD5},{0x848F, 0xDFAE}, - {0x8490, 0xBB60},{0x8491, 0xE3D3},{0x8494, 0xE3C2},{0x8497, 0xE3AC},{0x8498, 0xE3CA},{0x8499, 0xBB58},{0x849A, 0xE3BB},{0x849B, 0xE3C5}, - {0x849C, 0xBB5B},{0x849D, 0xE3BE},{0x849E, 0xBB59},{0x849F, 0xE3AF},{0x84A0, 0xE3CD},{0x84A1, 0xE3AE},{0x84A2, 0xE3C1},{0x84A4, 0xE3AD}, - {0x84A7, 0xE3BF},{0x84A8, 0xE3C8},{0x84A9, 0xE3C6},{0x84AA, 0xE3BA},{0x84AB, 0xE3B5},{0x84AC, 0xE3B3},{0x84AE, 0xE3B4},{0x84AF, 0xE3C7}, - {0x84B0, 0xE3D2},{0x84B1, 0xE3BC},{0x84B2, 0xBB5A},{0x84B4, 0xE3B7},{0x84B6, 0xE3CB},{0x84B8, 0xBB5D},{0x84B9, 0xE3B6},{0x84BA, 0xE3B0}, - {0x84BB, 0xE3C0},{0x84BC, 0xBB61},{0x84BF, 0xBB55},{0x84C0, 0xBB5E},{0x84C1, 0xE3B8},{0x84C2, 0xE3B2},{0x84C4, 0xBB57},{0x84C5, 0xDFD4}, - {0x84C6, 0xBB56},{0x84C7, 0xE3C3},{0x84C9, 0xBB54},{0x84CA, 0xBB63},{0x84CB, 0xBB5C},{0x84CC, 0xE3C4},{0x84CD, 0xE3B9},{0x84CE, 0xE3B1}, - {0x84CF, 0xE3CC},{0x84D0, 0xE3BD},{0x84D1, 0xBB62},{0x84D2, 0xE3D0},{0x84D3, 0xBB5F},{0x84D4, 0xE3CF},{0x84D6, 0xE3C9},{0x84D7, 0xE3CE}, - {0x84DB, 0xE3D1},{0x84E7, 0xE773},{0x84E8, 0xE774},{0x84E9, 0xE767},{0x84EA, 0xE766},{0x84EB, 0xE762},{0x84EC, 0xBDB4},{0x84EE, 0xBDAC}, - {0x84EF, 0xE776},{0x84F0, 0xE775},{0x84F1, 0xDFA9},{0x84F2, 0xE75F},{0x84F3, 0xE763},{0x84F4, 0xE75D},{0x84F6, 0xE770},{0x84F7, 0xE761}, - {0x84F9, 0xE777},{0x84FA, 0xE75A},{0x84FB, 0xE758},{0x84FC, 0xE764},{0x84FD, 0xE76E},{0x84FE, 0xE769},{0x84FF, 0xBDB6},{0x8500, 0xE74F}, - {0x8502, 0xE76D},{0x8506, 0xBDB7},{0x8507, 0xDFBD},{0x8508, 0xE75B},{0x8509, 0xE752},{0x850A, 0xE755},{0x850B, 0xE77B},{0x850C, 0xE75C}, - {0x850D, 0xE753},{0x850E, 0xE751},{0x850F, 0xE74E},{0x8511, 0xBDB0},{0x8512, 0xE765},{0x8513, 0xBDAF},{0x8514, 0xBDB3},{0x8515, 0xE760}, - {0x8516, 0xE768},{0x8517, 0xBDA9},{0x8518, 0xE778},{0x8519, 0xE77C},{0x851A, 0xBDAB},{0x851C, 0xE757},{0x851D, 0xE76B},{0x851E, 0xE76F}, - {0x851F, 0xE754},{0x8520, 0xE779},{0x8521, 0xBDB2},{0x8523, 0xBDB1},{0x8524, 0xE74C},{0x8525, 0xBDB5},{0x8526, 0xE772},{0x8527, 0xE756}, - {0x8528, 0xE76A},{0x8529, 0xE750},{0x852A, 0xE75E},{0x852B, 0xE759},{0x852C, 0xBDAD},{0x852D, 0xBDAE},{0x852E, 0xE76C},{0x852F, 0xE77D}, - {0x8530, 0xE77A},{0x8531, 0xE771},{0x853B, 0xE74D},{0x853D, 0xBDAA},{0x853E, 0xEB49},{0x8540, 0xEB40},{0x8541, 0xEB43},{0x8543, 0xBFBB}, - {0x8544, 0xEB45},{0x8545, 0xEAF9},{0x8546, 0xEB41},{0x8547, 0xEB47},{0x8548, 0xBFB8},{0x8549, 0xBFBC},{0x854A, 0xBFB6},{0x854D, 0xEAFB}, - {0x854E, 0xEB4C},{0x8551, 0xEB46},{0x8553, 0xEAFC},{0x8554, 0xEB55},{0x8555, 0xEB4F},{0x8556, 0xEAF8},{0x8557, 0xEE46},{0x8558, 0xEAFE}, - {0x8559, 0xBFB7},{0x855B, 0xEB4A},{0x855D, 0xEB54},{0x855E, 0xBFBF},{0x8560, 0xEB51},{0x8561, 0xEAFD},{0x8562, 0xEB44},{0x8563, 0xEB48}, - {0x8564, 0xEB42},{0x8565, 0xEB56},{0x8566, 0xEB53},{0x8567, 0xEB50},{0x8568, 0xBFB9},{0x8569, 0xBFBA},{0x856A, 0xBFBE},{0x856B, 0xEAFA}, - {0x856C, 0xEB57},{0x856D, 0xBFBD},{0x856E, 0xEB4D},{0x8571, 0xEB4B},{0x8575, 0xEB4E},{0x8576, 0xEE53},{0x8577, 0xEE40},{0x8578, 0xEE45}, - {0x8579, 0xEE52},{0x857A, 0xEE44},{0x857B, 0xEDFB},{0x857C, 0xEE41},{0x857E, 0xC1A2},{0x8580, 0xEDF4},{0x8581, 0xEE4D},{0x8582, 0xEE4F}, - {0x8583, 0xEDF3},{0x8584, 0xC1A1},{0x8585, 0xEE51},{0x8586, 0xEE49},{0x8587, 0xC1A8},{0x8588, 0xEE50},{0x8589, 0xEE42},{0x858A, 0xC1AA}, - {0x858B, 0xEDF9},{0x858C, 0xEB52},{0x858D, 0xEE4A},{0x858E, 0xEE47},{0x858F, 0xEDF5},{0x8590, 0xEE55},{0x8591, 0xC1A4},{0x8594, 0xC1A5}, - {0x8595, 0xEDF7},{0x8596, 0xEE48},{0x8598, 0xEE54},{0x8599, 0xEE4B},{0x859A, 0xEDFD},{0x859B, 0xC1A7},{0x859C, 0xC1A3},{0x859D, 0xEE4C}, - {0x859E, 0xEDFE},{0x859F, 0xEE56},{0x85A0, 0xEDF8},{0x85A1, 0xEE43},{0x85A2, 0xEE4E},{0x85A3, 0xEDFA},{0x85A4, 0xEDFC},{0x85A6, 0xC2CB}, - {0x85A7, 0xEDF6},{0x85A8, 0xC1A9},{0x85A9, 0xC2C4},{0x85AA, 0xC17E},{0x85AF, 0xC1A6},{0x85B0, 0xC2C8},{0x85B1, 0xF0B3},{0x85B3, 0xF0A9}, - {0x85B4, 0xF0A4},{0x85B5, 0xF0AA},{0x85B6, 0xF0B4},{0x85B7, 0xF0B8},{0x85B8, 0xF0B7},{0x85B9, 0xC2CA},{0x85BA, 0xC2C9},{0x85BD, 0xF0AB}, - {0x85BE, 0xF0B9},{0x85BF, 0xF0AE},{0x85C0, 0xF0A6},{0x85C2, 0xF0A8},{0x85C3, 0xF0A7},{0x85C4, 0xF0AD},{0x85C5, 0xF0B2},{0x85C6, 0xF0A5}, - {0x85C7, 0xF0AC},{0x85C8, 0xF0B1},{0x85C9, 0xC2C7},{0x85CB, 0xF0AF},{0x85CD, 0xC2C5},{0x85CE, 0xF0B0},{0x85CF, 0xC2C3},{0x85D0, 0xC2C6}, - {0x85D1, 0xF2D5},{0x85D2, 0xF0B5},{0x85D5, 0xC3C2},{0x85D7, 0xF2CD},{0x85D8, 0xF2D1},{0x85D9, 0xF2C9},{0x85DA, 0xF2CC},{0x85DC, 0xF2D4}, - {0x85DD, 0xC3C0},{0x85DE, 0xF2D9},{0x85DF, 0xF2D2},{0x85E1, 0xF2CA},{0x85E2, 0xF2DA},{0x85E3, 0xF2D3},{0x85E4, 0xC3C3},{0x85E5, 0xC3C4}, - {0x85E6, 0xF2D7},{0x85E8, 0xF2CB},{0x85E9, 0xC3BF},{0x85EA, 0xC3C1},{0x85EB, 0xF2C6},{0x85EC, 0xF2CE},{0x85ED, 0xF2C8},{0x85EF, 0xF2D8}, - {0x85F0, 0xF2D6},{0x85F1, 0xF2C7},{0x85F2, 0xF2CF},{0x85F6, 0xF4BE},{0x85F7, 0xC3C5},{0x85F8, 0xF2D0},{0x85F9, 0xC4A7},{0x85FA, 0xC4A9}, - {0x85FB, 0xC4A6},{0x85FD, 0xF4C3},{0x85FE, 0xF4BB},{0x85FF, 0xF4B9},{0x8600, 0xF4BD},{0x8601, 0xF4BA},{0x8604, 0xF4BF},{0x8605, 0xF4C1}, - {0x8606, 0xC4AA},{0x8607, 0xC4AC},{0x8609, 0xF4C0},{0x860A, 0xC4AD},{0x860B, 0xC4AB},{0x860C, 0xF4C2},{0x8611, 0xC4A8},{0x8617, 0xC4F4}, - {0x8618, 0xF5F1},{0x8619, 0xF5F7},{0x861A, 0xC4F6},{0x861B, 0xF4BC},{0x861C, 0xF5F6},{0x861E, 0xF5FD},{0x861F, 0xF5F4},{0x8620, 0xF5FB}, - {0x8621, 0xF5FA},{0x8622, 0xF4B8},{0x8623, 0xF5F5},{0x8624, 0xF0B6},{0x8625, 0xF5FE},{0x8626, 0xF5F3},{0x8627, 0xF5F8},{0x8629, 0xF5FC}, - {0x862A, 0xF5F2},{0x862C, 0xF74A},{0x862D, 0xC4F5},{0x862E, 0xF5F9},{0x8631, 0xF7F4},{0x8632, 0xF74B},{0x8633, 0xF749},{0x8634, 0xF747}, - {0x8635, 0xF748},{0x8636, 0xF74C},{0x8638, 0xC5D9},{0x8639, 0xF7F2},{0x863A, 0xF7F0},{0x863B, 0xF7F5},{0x863C, 0xF7F3},{0x863E, 0xF7F6}, - {0x863F, 0xC5DA},{0x8640, 0xF7F1},{0x8643, 0xF8BC},{0x8646, 0xF945},{0x8647, 0xF946},{0x8648, 0xF947},{0x864B, 0xF9C7},{0x864C, 0xF9BD}, - {0x864D, 0xCA4F},{0x864E, 0xAAEA},{0x8650, 0xAD68},{0x8652, 0xD3B8},{0x8653, 0xD3B7},{0x8654, 0xB040},{0x8655, 0xB342},{0x8656, 0xD77C}, - {0x8659, 0xD77B},{0x865B, 0xB5EA},{0x865C, 0xB8B8},{0x865E, 0xB8B7},{0x865F, 0xB8B9},{0x8661, 0xE3D4},{0x8662, 0xE77E},{0x8663, 0xEB58}, - {0x8664, 0xEB5A},{0x8665, 0xEB59},{0x8667, 0xC1AB},{0x8668, 0xEE57},{0x8669, 0xF0BA},{0x866A, 0xF9A5},{0x866B, 0xA6E4},{0x866D, 0xCDC9}, - {0x866E, 0xCDCA},{0x866F, 0xCDC8},{0x8670, 0xCDC7},{0x8671, 0xAAEB},{0x8673, 0xD0A9},{0x8674, 0xD0A7},{0x8677, 0xD0A6},{0x8679, 0xAD69}, - {0x867A, 0xAD6B},{0x867B, 0xAD6A},{0x867C, 0xD0A8},{0x8685, 0xD3C4},{0x8686, 0xD3C1},{0x8687, 0xD3BF},{0x868A, 0xB041},{0x868B, 0xD3C2}, - {0x868C, 0xB046},{0x868D, 0xD3BC},{0x868E, 0xD3CB},{0x8690, 0xD3CD},{0x8691, 0xD3BD},{0x8693, 0xB043},{0x8694, 0xD3CE},{0x8695, 0xD3C9}, - {0x8696, 0xD3BB},{0x8697, 0xD3C0},{0x8698, 0xD3CA},{0x8699, 0xD3C6},{0x869A, 0xD3C3},{0x869C, 0xB048},{0x869D, 0xD3CC},{0x869E, 0xD3BE}, - {0x86A1, 0xD3C7},{0x86A2, 0xD3B9},{0x86A3, 0xB047},{0x86A4, 0xB044},{0x86A5, 0xD3C5},{0x86A7, 0xD3C8},{0x86A8, 0xD3BA},{0x86A9, 0xB045}, - {0x86AA, 0xB042},{0x86AF, 0xB34C},{0x86B0, 0xD7A5},{0x86B1, 0xB34B},{0x86B3, 0xD7A8},{0x86B4, 0xD7AB},{0x86B5, 0xB348},{0x86B6, 0xB346}, - {0x86B7, 0xD77E},{0x86B8, 0xD7A9},{0x86B9, 0xD7A7},{0x86BA, 0xD7A4},{0x86BB, 0xD7AC},{0x86BC, 0xD7AD},{0x86BD, 0xD7AF},{0x86BE, 0xD7B0}, - {0x86BF, 0xD77D},{0x86C0, 0xB345},{0x86C1, 0xD7A2},{0x86C2, 0xD7A1},{0x86C3, 0xD7AE},{0x86C4, 0xB347},{0x86C5, 0xD7A3},{0x86C6, 0xB349}, - {0x86C7, 0xB344},{0x86C8, 0xD7A6},{0x86C9, 0xB34D},{0x86CB, 0xB34A},{0x86CC, 0xD7AA},{0x86D0, 0xB5F1},{0x86D1, 0xDBBF},{0x86D3, 0xDBB4}, - {0x86D4, 0xB5EE},{0x86D6, 0xDFE7},{0x86D7, 0xDBBD},{0x86D8, 0xDBB1},{0x86D9, 0xB5EC},{0x86DA, 0xDBB6},{0x86DB, 0xB5EF},{0x86DC, 0xDBBA}, - {0x86DD, 0xDBB8},{0x86DE, 0xB5F2},{0x86DF, 0xB5EB},{0x86E2, 0xDBB2},{0x86E3, 0xDBB5},{0x86E4, 0xB5F0},{0x86E6, 0xDBB3},{0x86E8, 0xDBBE}, - {0x86E9, 0xDBBC},{0x86EA, 0xDBB7},{0x86EB, 0xDBB9},{0x86EC, 0xDBBB},{0x86ED, 0xB5ED},{0x86F5, 0xDFE8},{0x86F6, 0xDFEE},{0x86F7, 0xDFE4}, - {0x86F8, 0xDFEA},{0x86F9, 0xB8BA},{0x86FA, 0xDFE6},{0x86FB, 0xB8C0},{0x86FE, 0xB8BF},{0x8700, 0xB8BE},{0x8701, 0xDFED},{0x8702, 0xB8C1}, - {0x8703, 0xB8C2},{0x8704, 0xDFE3},{0x8705, 0xDFF0},{0x8706, 0xB8C3},{0x8707, 0xB8BD},{0x8708, 0xB8BC},{0x8709, 0xDFEC},{0x870A, 0xB8C4}, - {0x870B, 0xDFE2},{0x870C, 0xDFE5},{0x870D, 0xDFEF},{0x870E, 0xDFEB},{0x8711, 0xE3F4},{0x8712, 0xE3E9},{0x8713, 0xB8BB},{0x8718, 0xBB6A}, - {0x8719, 0xE3DD},{0x871A, 0xE3F2},{0x871B, 0xE3DE},{0x871C, 0xBB65},{0x871E, 0xE3DB},{0x8720, 0xE3E4},{0x8721, 0xE3DC},{0x8722, 0xBB67}, - {0x8723, 0xE3D6},{0x8724, 0xE3F1},{0x8725, 0xBB68},{0x8726, 0xE3EE},{0x8727, 0xE3EF},{0x8728, 0xE3D7},{0x8729, 0xBB6D},{0x872A, 0xE3E6}, - {0x872C, 0xE3E0},{0x872D, 0xE3E7},{0x872E, 0xE3DA},{0x8730, 0xE3F3},{0x8731, 0xE3EB},{0x8732, 0xE3E5},{0x8733, 0xE3D5},{0x8734, 0xBB69}, - {0x8735, 0xE3EC},{0x8737, 0xBB6C},{0x8738, 0xE3F0},{0x873A, 0xE3EA},{0x873B, 0xBB66},{0x873C, 0xE3E8},{0x873E, 0xE3E2},{0x873F, 0xBB64}, - {0x8740, 0xE3D9},{0x8741, 0xE3E1},{0x8742, 0xE3ED},{0x8743, 0xE3DF},{0x8746, 0xE3E3},{0x874C, 0xBDC1},{0x874D, 0xDFE9},{0x874E, 0xE7B2}, - {0x874F, 0xE7BB},{0x8750, 0xE7B1},{0x8751, 0xE7AD},{0x8752, 0xE7AA},{0x8753, 0xBDC2},{0x8754, 0xE7A8},{0x8755, 0xBB6B},{0x8756, 0xE7A1}, - {0x8757, 0xBDC0},{0x8758, 0xE7A7},{0x8759, 0xBDBF},{0x875A, 0xE7AC},{0x875B, 0xE7A9},{0x875C, 0xE7B9},{0x875D, 0xE7B4},{0x875E, 0xE7AE}, - {0x875F, 0xE7B3},{0x8760, 0xBDBB},{0x8761, 0xE7AB},{0x8762, 0xE7BE},{0x8763, 0xE7A2},{0x8764, 0xE7A3},{0x8765, 0xE7BA},{0x8766, 0xBDBC}, - {0x8767, 0xE7BF},{0x8768, 0xBDBE},{0x8769, 0xE7C0},{0x876A, 0xE7B0},{0x876B, 0xE3D8},{0x876C, 0xE7B6},{0x876D, 0xE7AF},{0x876E, 0xE7B8}, - {0x876F, 0xE7B5},{0x8773, 0xE7A6},{0x8774, 0xBDB9},{0x8775, 0xE7BD},{0x8776, 0xBDBA},{0x8777, 0xE7A4},{0x8778, 0xBDBD},{0x8779, 0xEB64}, - {0x877A, 0xE7B7},{0x877B, 0xE7BC},{0x8781, 0xEB61},{0x8782, 0xBDB8},{0x8783, 0xBFC0},{0x8784, 0xEB6B},{0x8785, 0xEB67},{0x8787, 0xEB65}, - {0x8788, 0xEB60},{0x8789, 0xEB6F},{0x878D, 0xBFC4},{0x878F, 0xEB5C},{0x8790, 0xEB68},{0x8791, 0xEB69},{0x8792, 0xEB5F},{0x8793, 0xEB5E}, - {0x8794, 0xEB6C},{0x8796, 0xEB62},{0x8797, 0xEB5D},{0x8798, 0xEB63},{0x879A, 0xEB6E},{0x879B, 0xEB5B},{0x879C, 0xEB6D},{0x879D, 0xEB6A}, - {0x879E, 0xBFC2},{0x879F, 0xBFC1},{0x87A2, 0xBFC3},{0x87A3, 0xEB66},{0x87A4, 0xF0CB},{0x87AA, 0xEE59},{0x87AB, 0xC1B1},{0x87AC, 0xEE5D}, - {0x87AD, 0xEE5A},{0x87AE, 0xEE61},{0x87AF, 0xEE67},{0x87B0, 0xEE5C},{0x87B2, 0xEE70},{0x87B3, 0xC1AE},{0x87B4, 0xEE6A},{0x87B5, 0xEE5F}, - {0x87B6, 0xEE6B},{0x87B7, 0xEE66},{0x87B8, 0xEE6D},{0x87B9, 0xEE5E},{0x87BA, 0xC1B3},{0x87BB, 0xC1B2},{0x87BC, 0xEE60},{0x87BD, 0xEE6E}, - {0x87BE, 0xEE58},{0x87BF, 0xEE6C},{0x87C0, 0xC1AC},{0x87C2, 0xEE64},{0x87C3, 0xEE63},{0x87C4, 0xEE68},{0x87C5, 0xEE5B},{0x87C6, 0xC1B0}, - {0x87C8, 0xC1B4},{0x87C9, 0xEE62},{0x87CA, 0xEE69},{0x87CB, 0xC1B5},{0x87CC, 0xEE65},{0x87D1, 0xC1AD},{0x87D2, 0xC1AF},{0x87D3, 0xF0C7}, - {0x87D4, 0xF0C5},{0x87D7, 0xF0CC},{0x87D8, 0xF0C9},{0x87D9, 0xF0CD},{0x87DB, 0xF0BE},{0x87DC, 0xF0C6},{0x87DD, 0xF0D1},{0x87DE, 0xEE6F}, - {0x87DF, 0xF0C2},{0x87E0, 0xC2CF},{0x87E1, 0xE7A5},{0x87E2, 0xF0BD},{0x87E3, 0xF0CA},{0x87E4, 0xF0C4},{0x87E5, 0xF0C1},{0x87E6, 0xF0BC}, - {0x87E7, 0xF0BB},{0x87E8, 0xF0D0},{0x87EA, 0xF0C0},{0x87EB, 0xF0BF},{0x87EC, 0xC2CD},{0x87ED, 0xF0C8},{0x87EF, 0xC2CC},{0x87F2, 0xC2CE}, - {0x87F3, 0xF0C3},{0x87F4, 0xF0CF},{0x87F6, 0xF2DE},{0x87F7, 0xF2DF},{0x87F9, 0xC3C9},{0x87FA, 0xF2DC},{0x87FB, 0xC3C6},{0x87FC, 0xF2E4}, - {0x87FE, 0xC3CA},{0x87FF, 0xF2E6},{0x8800, 0xF2DB},{0x8801, 0xF0CE},{0x8802, 0xF2E8},{0x8803, 0xF2DD},{0x8805, 0xC3C7},{0x8806, 0xF2E3}, - {0x8808, 0xF2E5},{0x8809, 0xF2E0},{0x880A, 0xF2E7},{0x880B, 0xF2E2},{0x880C, 0xF2E1},{0x880D, 0xC3C8},{0x8810, 0xF4C5},{0x8811, 0xF4C6}, - {0x8813, 0xF4C8},{0x8814, 0xC4AE},{0x8815, 0xC4AF},{0x8816, 0xF4C9},{0x8817, 0xF4C7},{0x8819, 0xF4C4},{0x881B, 0xF642},{0x881C, 0xF645}, - {0x881D, 0xF641},{0x881F, 0xC4FA},{0x8820, 0xF643},{0x8821, 0xC4F9},{0x8822, 0xC4F8},{0x8823, 0xC4F7},{0x8824, 0xF644},{0x8825, 0xF751}, - {0x8826, 0xF74F},{0x8828, 0xF74E},{0x8829, 0xF640},{0x882A, 0xF750},{0x882B, 0xF646},{0x882C, 0xF74D},{0x882E, 0xF7F9},{0x882F, 0xF7D7}, - {0x8830, 0xF7F7},{0x8831, 0xC5DB},{0x8832, 0xF7F8},{0x8833, 0xF7FA},{0x8835, 0xF8BF},{0x8836, 0xC5FA},{0x8837, 0xF8BE},{0x8838, 0xF8BD}, - {0x8839, 0xC5FB},{0x883B, 0xC65A},{0x883C, 0xF96E},{0x883D, 0xF9A7},{0x883E, 0xF9A6},{0x883F, 0xF9A8},{0x8840, 0xA6E5},{0x8841, 0xD0AA}, - {0x8843, 0xD3CF},{0x8844, 0xD3D0},{0x8848, 0xDBC0},{0x884A, 0xF647},{0x884B, 0xF8C0},{0x884C, 0xA6E6},{0x884D, 0xAD6C},{0x884E, 0xD0AB}, - {0x8852, 0xD7B1},{0x8853, 0xB34E},{0x8855, 0xDBC2},{0x8856, 0xDBC1},{0x8857, 0xB5F3},{0x8859, 0xB8C5},{0x885A, 0xE7C1},{0x885B, 0xBDC3}, - {0x885D, 0xBDC4},{0x8861, 0xBFC5},{0x8862, 0xC5FC},{0x8863, 0xA6E7},{0x8867, 0xD0AC},{0x8868, 0xAAED},{0x8869, 0xD0AE},{0x886A, 0xD0AD}, - {0x886B, 0xAD6D},{0x886D, 0xD3D1},{0x886F, 0xD3D8},{0x8870, 0xB049},{0x8871, 0xD3D6},{0x8872, 0xD3D4},{0x8874, 0xD3DB},{0x8875, 0xD3D2}, - {0x8876, 0xD3D3},{0x8877, 0xB04A},{0x8879, 0xB04E},{0x887C, 0xD3DC},{0x887D, 0xB04D},{0x887E, 0xD3DA},{0x887F, 0xD3D7},{0x8880, 0xD3D5}, - {0x8881, 0xB04B},{0x8882, 0xB04C},{0x8883, 0xD3D9},{0x8888, 0xB350},{0x8889, 0xD7B2},{0x888B, 0xB355},{0x888C, 0xD7C2},{0x888D, 0xB354}, - {0x888E, 0xD7C4},{0x8891, 0xD7B8},{0x8892, 0xB352},{0x8893, 0xD7C3},{0x8895, 0xD7B3},{0x8896, 0xB353},{0x8897, 0xD7BF},{0x8898, 0xD7BB}, - {0x8899, 0xD7BD},{0x889A, 0xD7B7},{0x889B, 0xD7BE},{0x889E, 0xB34F},{0x889F, 0xD7BA},{0x88A1, 0xD7B9},{0x88A2, 0xD7B5},{0x88A4, 0xD7C0}, - {0x88A7, 0xD7BC},{0x88A8, 0xD7B4},{0x88AA, 0xD7B6},{0x88AB, 0xB351},{0x88AC, 0xD7C1},{0x88B1, 0xB5F6},{0x88B2, 0xDBCD},{0x88B6, 0xDBC9}, - {0x88B7, 0xDBCB},{0x88B8, 0xDBC6},{0x88B9, 0xDBC5},{0x88BA, 0xDBC3},{0x88BC, 0xDBCA},{0x88BD, 0xDBCC},{0x88BE, 0xDBC8},{0x88C0, 0xDBC7}, - {0x88C1, 0xB5F4},{0x88C2, 0xB5F5},{0x88C9, 0xDBCF},{0x88CA, 0xB8CD},{0x88CB, 0xDFF2},{0x88CC, 0xDFF8},{0x88CD, 0xDFF3},{0x88CE, 0xDFF4}, - {0x88D0, 0xDFF9},{0x88D2, 0xB8CF},{0x88D4, 0xB8C7},{0x88D5, 0xB8CE},{0x88D6, 0xDFF1},{0x88D7, 0xDBC4},{0x88D8, 0xB8CA},{0x88D9, 0xB8C8}, - {0x88DA, 0xDFF7},{0x88DB, 0xDFF6},{0x88DC, 0xB8C9},{0x88DD, 0xB8CB},{0x88DE, 0xDFF5},{0x88DF, 0xB8C6},{0x88E1, 0xB8CC},{0x88E7, 0xE3F6}, - {0x88E8, 0xBB74},{0x88EB, 0xE442},{0x88EC, 0xE441},{0x88EE, 0xE3FB},{0x88EF, 0xBB76},{0x88F0, 0xE440},{0x88F1, 0xE3F7},{0x88F2, 0xE3F8}, - {0x88F3, 0xBB6E},{0x88F4, 0xBB70},{0x88F6, 0xE3FD},{0x88F7, 0xE3F5},{0x88F8, 0xBB72},{0x88F9, 0xBB71},{0x88FA, 0xE3F9},{0x88FB, 0xE3FE}, - {0x88FC, 0xE3FC},{0x88FD, 0xBB73},{0x88FE, 0xE3FA},{0x8901, 0xDBCE},{0x8902, 0xBB6F},{0x8905, 0xE7C2},{0x8906, 0xE7C9},{0x8907, 0xBDC6}, - {0x8909, 0xE7CD},{0x890A, 0xBDCA},{0x890B, 0xE7C5},{0x890C, 0xE7C3},{0x890E, 0xE7CC},{0x8910, 0xBDC5},{0x8911, 0xE7CB},{0x8912, 0xBDC7}, - {0x8913, 0xBDC8},{0x8914, 0xE7C4},{0x8915, 0xBDC9},{0x8916, 0xE7CA},{0x8917, 0xE7C6},{0x8918, 0xE7C7},{0x8919, 0xE7C8},{0x891A, 0xBB75}, - {0x891E, 0xEB70},{0x891F, 0xEB7C},{0x8921, 0xBFCA},{0x8922, 0xEB77},{0x8923, 0xEB79},{0x8925, 0xBFC8},{0x8926, 0xEB71},{0x8927, 0xEB75}, - {0x8929, 0xEB78},{0x892A, 0xBFC6},{0x892B, 0xBFC9},{0x892C, 0xEB7B},{0x892D, 0xEB73},{0x892E, 0xEB74},{0x892F, 0xEB7A},{0x8930, 0xEB72}, - {0x8931, 0xEB76},{0x8932, 0xBFC7},{0x8933, 0xEE72},{0x8935, 0xEE71},{0x8936, 0xC1B7},{0x8937, 0xEE77},{0x8938, 0xC1B9},{0x893B, 0xC1B6}, - {0x893C, 0xEE73},{0x893D, 0xC1BA},{0x893E, 0xEE74},{0x8941, 0xEE75},{0x8942, 0xEE78},{0x8944, 0xC1B8},{0x8946, 0xF0D6},{0x8949, 0xF0D9}, - {0x894B, 0xF0D3},{0x894C, 0xF0D5},{0x894F, 0xF0D4},{0x8950, 0xF0D7},{0x8951, 0xF0D8},{0x8952, 0xEE76},{0x8953, 0xF0D2},{0x8956, 0xC3CD}, - {0x8957, 0xF2EC},{0x8958, 0xF2EF},{0x8959, 0xF2F1},{0x895A, 0xF2EA},{0x895B, 0xF2EB},{0x895C, 0xF2EE},{0x895D, 0xF2F0},{0x895E, 0xC3CE}, - {0x895F, 0xC3CC},{0x8960, 0xC3CB},{0x8961, 0xF2ED},{0x8962, 0xF2E9},{0x8963, 0xF4CA},{0x8964, 0xC4B0},{0x8966, 0xF4CB},{0x8969, 0xF649}, - {0x896A, 0xC4FB},{0x896B, 0xF64B},{0x896C, 0xC4FC},{0x896D, 0xF648},{0x896E, 0xF64A},{0x896F, 0xC5A8},{0x8971, 0xF752},{0x8972, 0xC5A7}, - {0x8973, 0xF7FD},{0x8974, 0xF7FC},{0x8976, 0xF7FB},{0x8979, 0xF948},{0x897A, 0xF949},{0x897B, 0xF94B},{0x897C, 0xF94A},{0x897E, 0xCA50}, - {0x897F, 0xA6E8},{0x8981, 0xAD6E},{0x8982, 0xD7C5},{0x8983, 0xB5F7},{0x8985, 0xDFFA},{0x8986, 0xC2D0},{0x8988, 0xF2F2},{0x898B, 0xA8A3}, - {0x898F, 0xB357},{0x8993, 0xB356},{0x8995, 0xDBD0},{0x8996, 0xB5F8},{0x8997, 0xDBD2},{0x8998, 0xDBD1},{0x899B, 0xDFFB},{0x899C, 0xB8D0}, - {0x899D, 0xE443},{0x899E, 0xE446},{0x899F, 0xE445},{0x89A1, 0xE444},{0x89A2, 0xE7CE},{0x89A3, 0xE7D0},{0x89A4, 0xE7CF},{0x89A6, 0xBFCC}, - {0x89AA, 0xBFCB},{0x89AC, 0xC1BB},{0x89AD, 0xEE79},{0x89AE, 0xEE7B},{0x89AF, 0xEE7A},{0x89B2, 0xC2D1},{0x89B6, 0xF2F4},{0x89B7, 0xF2F3}, - {0x89B9, 0xF4CC},{0x89BA, 0xC4B1},{0x89BD, 0xC4FD},{0x89BE, 0xF754},{0x89BF, 0xF753},{0x89C0, 0xC65B},{0x89D2, 0xA8A4},{0x89D3, 0xD0AF}, - {0x89D4, 0xAD6F},{0x89D5, 0xD7C8},{0x89D6, 0xD7C6},{0x89D9, 0xD7C7},{0x89DA, 0xDBD4},{0x89DB, 0xDBD5},{0x89DC, 0xE043},{0x89DD, 0xDBD3}, - {0x89DF, 0xDFFC},{0x89E0, 0xE041},{0x89E1, 0xE040},{0x89E2, 0xE042},{0x89E3, 0xB8D1},{0x89E4, 0xDFFE},{0x89E5, 0xDFFD},{0x89E6, 0xE044}, - {0x89E8, 0xE449},{0x89E9, 0xE447},{0x89EB, 0xE448},{0x89EC, 0xE7D3},{0x89ED, 0xE7D1},{0x89F0, 0xE7D2},{0x89F1, 0xEB7D},{0x89F2, 0xEE7C}, - {0x89F3, 0xEE7D},{0x89F4, 0xC2D2},{0x89F6, 0xF2F5},{0x89F7, 0xF4CD},{0x89F8, 0xC4B2},{0x89FA, 0xF64C},{0x89FB, 0xF755},{0x89FC, 0xC5A9}, - {0x89FE, 0xF7FE},{0x89FF, 0xF94C},{0x8A00, 0xA8A5},{0x8A02, 0xAD71},{0x8A03, 0xAD72},{0x8A04, 0xD0B0},{0x8A07, 0xD0B1},{0x8A08, 0xAD70}, - {0x8A0A, 0xB054},{0x8A0C, 0xB052},{0x8A0E, 0xB051},{0x8A0F, 0xB058},{0x8A10, 0xB050},{0x8A11, 0xB059},{0x8A12, 0xD3DD},{0x8A13, 0xB056}, - {0x8A15, 0xB053},{0x8A16, 0xB057},{0x8A17, 0xB055},{0x8A18, 0xB04F},{0x8A1B, 0xB35F},{0x8A1D, 0xB359},{0x8A1E, 0xD7CC},{0x8A1F, 0xB35E}, - {0x8A22, 0xB360},{0x8A23, 0xB35A},{0x8A25, 0xB35B},{0x8A27, 0xD7CA},{0x8A2A, 0xB358},{0x8A2C, 0xD7CB},{0x8A2D, 0xB35D},{0x8A30, 0xD7C9}, - {0x8A31, 0xB35C},{0x8A34, 0xB644},{0x8A36, 0xB646},{0x8A39, 0xDBD8},{0x8A3A, 0xB645},{0x8A3B, 0xB5F9},{0x8A3C, 0xB5FD},{0x8A3E, 0xB8E4}, - {0x8A3F, 0xE049},{0x8A40, 0xDBDA},{0x8A41, 0xB5FE},{0x8A44, 0xDBDD},{0x8A45, 0xDBDE},{0x8A46, 0xB643},{0x8A48, 0xDBE0},{0x8A4A, 0xDBE2}, - {0x8A4C, 0xDBE3},{0x8A4D, 0xDBD7},{0x8A4E, 0xDBD6},{0x8A4F, 0xDBE4},{0x8A50, 0xB642},{0x8A51, 0xDBE1},{0x8A52, 0xDBDF},{0x8A54, 0xB640}, - {0x8A55, 0xB5FB},{0x8A56, 0xB647},{0x8A57, 0xDBDB},{0x8A58, 0xDBDC},{0x8A59, 0xDBD9},{0x8A5B, 0xB641},{0x8A5E, 0xB5FC},{0x8A60, 0xB5FA}, - {0x8A61, 0xE048},{0x8A62, 0xB8DF},{0x8A63, 0xB8DA},{0x8A66, 0xB8D5},{0x8A68, 0xB8E5},{0x8A69, 0xB8D6},{0x8A6B, 0xB8D2},{0x8A6C, 0xB8E1}, - {0x8A6D, 0xB8DE},{0x8A6E, 0xB8E0},{0x8A70, 0xB8D7},{0x8A71, 0xB8DC},{0x8A72, 0xB8D3},{0x8A73, 0xB8D4},{0x8A74, 0xE050},{0x8A75, 0xE04D}, - {0x8A76, 0xE045},{0x8A77, 0xE04A},{0x8A79, 0xB8E2},{0x8A7A, 0xE051},{0x8A7B, 0xB8E3},{0x8A7C, 0xB8D9},{0x8A7F, 0xE047},{0x8A81, 0xE04F}, - {0x8A82, 0xE04B},{0x8A83, 0xE04E},{0x8A84, 0xE04C},{0x8A85, 0xB8DD},{0x8A86, 0xE046},{0x8A87, 0xB8D8},{0x8A8B, 0xE44C},{0x8A8C, 0xBB78}, - {0x8A8D, 0xBB7B},{0x8A8F, 0xE44E},{0x8A91, 0xBBA5},{0x8A92, 0xE44D},{0x8A93, 0xBB7D},{0x8A95, 0xBDCF},{0x8A96, 0xE44F},{0x8A98, 0xBBA4}, - {0x8A99, 0xE44B},{0x8A9A, 0xBBA6},{0x8A9E, 0xBB79},{0x8AA0, 0xB8DB},{0x8AA1, 0xBB7C},{0x8AA3, 0xBB7A},{0x8AA4, 0xBB7E},{0x8AA5, 0xBBA2}, - {0x8AA6, 0xBB77},{0x8AA7, 0xBBA7},{0x8AA8, 0xBBA3},{0x8AAA, 0xBBA1},{0x8AAB, 0xE44A},{0x8AB0, 0xBDD6},{0x8AB2, 0xBDD2},{0x8AB6, 0xBDD9}, - {0x8AB8, 0xE7D6},{0x8AB9, 0xBDDA},{0x8ABA, 0xE7E2},{0x8ABB, 0xE7DB},{0x8ABC, 0xBDCB},{0x8ABD, 0xE7E3},{0x8ABE, 0xE7DD},{0x8ABF, 0xBDD5}, - {0x8AC0, 0xE7DE},{0x8AC2, 0xBDD4},{0x8AC3, 0xE7E1},{0x8AC4, 0xBDCE},{0x8AC5, 0xE7DF},{0x8AC6, 0xE7D5},{0x8AC7, 0xBDCD},{0x8AC8, 0xEBAA}, - {0x8AC9, 0xBDD3},{0x8ACB, 0xBDD0},{0x8ACD, 0xBDD8},{0x8ACF, 0xE7D4},{0x8AD1, 0xE7D8},{0x8AD2, 0xBDCC},{0x8AD3, 0xE7D7},{0x8AD4, 0xE7D9}, - {0x8AD5, 0xE7DA},{0x8AD6, 0xBDD7},{0x8AD7, 0xE7DC},{0x8AD8, 0xE7E0},{0x8AD9, 0xE7E4},{0x8ADB, 0xBDDB},{0x8ADC, 0xBFD2},{0x8ADD, 0xEBA5}, - {0x8ADE, 0xEBAB},{0x8ADF, 0xEBA8},{0x8AE0, 0xEB7E},{0x8AE1, 0xEBAC},{0x8AE2, 0xEBA1},{0x8AE4, 0xEBA7},{0x8AE6, 0xBFCD},{0x8AE7, 0xBFD3}, - {0x8AE8, 0xEBAD},{0x8AEB, 0xBFCF},{0x8AED, 0xBFD9},{0x8AEE, 0xBFD4},{0x8AEF, 0xEBAF},{0x8AF0, 0xEBA9},{0x8AF1, 0xBFD0},{0x8AF2, 0xEBA2}, - {0x8AF3, 0xBFDA},{0x8AF4, 0xEBA3},{0x8AF5, 0xEBA4},{0x8AF6, 0xBFDB},{0x8AF7, 0xBFD8},{0x8AF8, 0xBDD1},{0x8AFA, 0xBFCE},{0x8AFB, 0xEBB0}, - {0x8AFC, 0xBFDC},{0x8AFE, 0xBFD5},{0x8AFF, 0xEBAE},{0x8B00, 0xBFD1},{0x8B01, 0xBFD6},{0x8B02, 0xBFD7},{0x8B04, 0xC1C3},{0x8B05, 0xEEA4}, - {0x8B06, 0xEEAD},{0x8B07, 0xEEAA},{0x8B08, 0xEEAC},{0x8B0A, 0xC1C0},{0x8B0B, 0xEEA5},{0x8B0D, 0xEEAB},{0x8B0E, 0xC1BC},{0x8B0F, 0xEEA7}, - {0x8B10, 0xC1C4},{0x8B11, 0xEEA3},{0x8B12, 0xEEA8},{0x8B13, 0xEEAF},{0x8B14, 0xEBA6},{0x8B15, 0xEEA9},{0x8B16, 0xEEA2},{0x8B17, 0xC1BD}, - {0x8B18, 0xEEA1},{0x8B19, 0xC1BE},{0x8B1A, 0xEEB0},{0x8B1B, 0xC1BF},{0x8B1C, 0xEEAE},{0x8B1D, 0xC1C2},{0x8B1E, 0xEE7E},{0x8B20, 0xC1C1}, - {0x8B22, 0xEEA6},{0x8B23, 0xF0DC},{0x8B24, 0xF0EA},{0x8B25, 0xF0E5},{0x8B26, 0xF0E7},{0x8B27, 0xF0DB},{0x8B28, 0xC2D3},{0x8B2A, 0xF0DA}, - {0x8B2B, 0xC2D6},{0x8B2C, 0xC2D5},{0x8B2E, 0xF0E9},{0x8B2F, 0xF0E1},{0x8B30, 0xF0DE},{0x8B31, 0xF0E4},{0x8B33, 0xF0DD},{0x8B35, 0xF0DF}, - {0x8B36, 0xF0E8},{0x8B37, 0xF0E6},{0x8B39, 0xC2D4},{0x8B3A, 0xF0ED},{0x8B3B, 0xF0EB},{0x8B3C, 0xF0E2},{0x8B3D, 0xF0EC},{0x8B3E, 0xF0E3}, - {0x8B40, 0xF2F9},{0x8B41, 0xC3CF},{0x8B42, 0xF341},{0x8B45, 0xF64F},{0x8B46, 0xC3D6},{0x8B47, 0xF0E0},{0x8B48, 0xF2F7},{0x8B49, 0xC3D2}, - {0x8B4A, 0xF2F8},{0x8B4B, 0xF2FD},{0x8B4E, 0xC3D4},{0x8B4F, 0xC3D5},{0x8B50, 0xF2F6},{0x8B51, 0xF340},{0x8B52, 0xF342},{0x8B53, 0xF2FA}, - {0x8B54, 0xF2FC},{0x8B55, 0xF2FE},{0x8B56, 0xF2FB},{0x8B57, 0xF343},{0x8B58, 0xC3D1},{0x8B59, 0xC3D7},{0x8B5A, 0xC3D3},{0x8B5C, 0xC3D0}, - {0x8B5D, 0xF4D0},{0x8B5F, 0xC4B7},{0x8B60, 0xF4CE},{0x8B63, 0xF4D2},{0x8B65, 0xF4D3},{0x8B66, 0xC4B5},{0x8B67, 0xF4D4},{0x8B68, 0xF4D1}, - {0x8B6A, 0xF4CF},{0x8B6B, 0xC4B8},{0x8B6C, 0xC4B4},{0x8B6D, 0xF4D5},{0x8B6F, 0xC4B6},{0x8B70, 0xC4B3},{0x8B74, 0xC4FE},{0x8B77, 0xC540}, - {0x8B78, 0xF64E},{0x8B79, 0xF64D},{0x8B7A, 0xF650},{0x8B7B, 0xF651},{0x8B7D, 0xC541},{0x8B7E, 0xF756},{0x8B7F, 0xF75B},{0x8B80, 0xC5AA}, - {0x8B82, 0xF758},{0x8B84, 0xF757},{0x8B85, 0xF75A},{0x8B86, 0xF759},{0x8B88, 0xF843},{0x8B8A, 0xC5DC},{0x8B8B, 0xF842},{0x8B8C, 0xF840}, - {0x8B8E, 0xF841},{0x8B92, 0xC5FE},{0x8B93, 0xC5FD},{0x8B94, 0xF8C1},{0x8B95, 0xF8C2},{0x8B96, 0xC640},{0x8B98, 0xF94D},{0x8B99, 0xF94E}, - {0x8B9A, 0xC667},{0x8B9C, 0xC66D},{0x8B9E, 0xF9A9},{0x8B9F, 0xF9C8},{0x8C37, 0xA8A6},{0x8C39, 0xD7CD},{0x8C3B, 0xD7CE},{0x8C3C, 0xE052}, - {0x8C3D, 0xE450},{0x8C3E, 0xE7E5},{0x8C3F, 0xC1C6},{0x8C41, 0xC1C5},{0x8C42, 0xF0EE},{0x8C43, 0xF344},{0x8C45, 0xF844},{0x8C46, 0xA8A7}, - {0x8C47, 0xD3DE},{0x8C48, 0xB05A},{0x8C49, 0xB361},{0x8C4A, 0xE054},{0x8C4B, 0xE053},{0x8C4C, 0xBDDC},{0x8C4D, 0xE7E6},{0x8C4E, 0xBDDD}, - {0x8C4F, 0xEEB1},{0x8C50, 0xC2D7},{0x8C54, 0xC676},{0x8C55, 0xA8A8},{0x8C56, 0xCDCB},{0x8C57, 0xD3DF},{0x8C5A, 0xB362},{0x8C5C, 0xD7CF}, - {0x8C5D, 0xD7D0},{0x8C5F, 0xDBE5},{0x8C61, 0xB648},{0x8C62, 0xB8E6},{0x8C64, 0xE056},{0x8C65, 0xE055},{0x8C66, 0xE057},{0x8C68, 0xE451}, - {0x8C69, 0xE452},{0x8C6A, 0xBBA8},{0x8C6B, 0xBFDD},{0x8C6C, 0xBDDE},{0x8C6D, 0xBFDE},{0x8C6F, 0xEEB5},{0x8C70, 0xEEB2},{0x8C71, 0xEEB4}, - {0x8C72, 0xEEB3},{0x8C73, 0xC1C7},{0x8C75, 0xF0EF},{0x8C76, 0xF346},{0x8C77, 0xF345},{0x8C78, 0xCBA4},{0x8C79, 0xB05C},{0x8C7A, 0xB05B}, - {0x8C7B, 0xD3E0},{0x8C7D, 0xD7D1},{0x8C80, 0xDBE7},{0x8C81, 0xDBE6},{0x8C82, 0xB649},{0x8C84, 0xE059},{0x8C85, 0xE05A},{0x8C86, 0xE058}, - {0x8C89, 0xB8E8},{0x8C8A, 0xB8E7},{0x8C8C, 0xBBAA},{0x8C8D, 0xBBA9},{0x8C8F, 0xE7E7},{0x8C90, 0xEBB3},{0x8C91, 0xEBB1},{0x8C92, 0xEBB2}, - {0x8C93, 0xBFDF},{0x8C94, 0xEEB7},{0x8C95, 0xEEB6},{0x8C97, 0xF0F2},{0x8C98, 0xF0F1},{0x8C99, 0xF0F0},{0x8C9A, 0xF347},{0x8C9C, 0xF9AA}, - {0x8C9D, 0xA8A9},{0x8C9E, 0xAD73},{0x8CA0, 0xAD74},{0x8CA1, 0xB05D},{0x8CA2, 0xB05E},{0x8CA3, 0xD3E2},{0x8CA4, 0xD3E1},{0x8CA5, 0xD7D2}, - {0x8CA7, 0xB368},{0x8CA8, 0xB366},{0x8CA9, 0xB363},{0x8CAA, 0xB367},{0x8CAB, 0xB365},{0x8CAC, 0xB364},{0x8CAF, 0xB64A},{0x8CB0, 0xDBEA}, - {0x8CB2, 0xB8ED},{0x8CB3, 0xB64C},{0x8CB4, 0xB651},{0x8CB5, 0xDBEC},{0x8CB6, 0xB653},{0x8CB7, 0xB652},{0x8CB8, 0xB655},{0x8CB9, 0xDBEB}, - {0x8CBA, 0xDBE8},{0x8CBB, 0xB64F},{0x8CBC, 0xB64B},{0x8CBD, 0xB64D},{0x8CBE, 0xDBE9},{0x8CBF, 0xB654},{0x8CC0, 0xB650},{0x8CC1, 0xB64E}, - {0x8CC2, 0xB8EF},{0x8CC3, 0xB8EE},{0x8CC4, 0xB8EC},{0x8CC5, 0xB8F0},{0x8CC7, 0xB8EA},{0x8CC8, 0xB8EB},{0x8CCA, 0xB8E9},{0x8CCC, 0xE05B}, - {0x8CCF, 0xE454},{0x8CD1, 0xBBAC},{0x8CD2, 0xBBAD},{0x8CD3, 0xBBAB},{0x8CD5, 0xE453},{0x8CD7, 0xE455},{0x8CD9, 0xE7EA},{0x8CDA, 0xE7EC}, - {0x8CDC, 0xBDE7},{0x8CDD, 0xE7ED},{0x8CDE, 0xBDE0},{0x8CDF, 0xE7E9},{0x8CE0, 0xBDDF},{0x8CE1, 0xBDE9},{0x8CE2, 0xBDE5},{0x8CE3, 0xBDE6}, - {0x8CE4, 0xBDE2},{0x8CE5, 0xE7E8},{0x8CE6, 0xBDE1},{0x8CE7, 0xE7EE},{0x8CE8, 0xE7EB},{0x8CEA, 0xBDE8},{0x8CEC, 0xBDE3},{0x8CED, 0xBDE4}, - {0x8CEE, 0xEBB5},{0x8CF0, 0xEBB7},{0x8CF1, 0xEBB6},{0x8CF3, 0xEBB8},{0x8CF4, 0xBFE0},{0x8CF5, 0xEBB4},{0x8CF8, 0xC1CB},{0x8CF9, 0xEEB8}, - {0x8CFA, 0xC1C8},{0x8CFB, 0xC1CC},{0x8CFC, 0xC1CA},{0x8CFD, 0xC1C9},{0x8CFE, 0xF0F3},{0x8D00, 0xF0F6},{0x8D02, 0xF0F5},{0x8D04, 0xF0F4}, - {0x8D05, 0xC2D8},{0x8D06, 0xF348},{0x8D07, 0xF349},{0x8D08, 0xC3D8},{0x8D09, 0xF34A},{0x8D0A, 0xC3D9},{0x8D0D, 0xC4BA},{0x8D0F, 0xC4B9}, - {0x8D10, 0xF652},{0x8D13, 0xC542},{0x8D14, 0xF653},{0x8D15, 0xF75C},{0x8D16, 0xC5AB},{0x8D17, 0xC5AC},{0x8D19, 0xF845},{0x8D1B, 0xC642}, - {0x8D64, 0xA8AA},{0x8D66, 0xB36A},{0x8D67, 0xB369},{0x8D68, 0xE05C},{0x8D69, 0xE05D},{0x8D6B, 0xBBAE},{0x8D6C, 0xEBB9},{0x8D6D, 0xBDEA}, - {0x8D6E, 0xEBBA},{0x8D6F, 0xEEB9},{0x8D70, 0xA8AB},{0x8D72, 0xD0B2},{0x8D73, 0xAD76},{0x8D74, 0xAD75},{0x8D76, 0xD3E3},{0x8D77, 0xB05F}, - {0x8D78, 0xD3E4},{0x8D79, 0xD7D5},{0x8D7B, 0xD7D4},{0x8D7D, 0xD7D3},{0x8D80, 0xDBEE},{0x8D81, 0xB658},{0x8D84, 0xDBED},{0x8D85, 0xB657}, - {0x8D89, 0xDBEF},{0x8D8A, 0xB656},{0x8D8C, 0xE05F},{0x8D8D, 0xE062},{0x8D8E, 0xE060},{0x8D8F, 0xE061},{0x8D90, 0xE065},{0x8D91, 0xE05E}, - {0x8D92, 0xE066},{0x8D93, 0xE063},{0x8D94, 0xE064},{0x8D95, 0xBBB0},{0x8D96, 0xE456},{0x8D99, 0xBBAF},{0x8D9B, 0xE7F2},{0x8D9C, 0xE7F0}, - {0x8D9F, 0xBDEB},{0x8DA0, 0xE7EF},{0x8DA1, 0xE7F1},{0x8DA3, 0xBDEC},{0x8DA5, 0xEBBB},{0x8DA7, 0xEBBC},{0x8DA8, 0xC1CD},{0x8DAA, 0xF34C}, - {0x8DAB, 0xF34E},{0x8DAC, 0xF34B},{0x8DAD, 0xF34D},{0x8DAE, 0xF4D6},{0x8DAF, 0xF654},{0x8DB2, 0xF96F},{0x8DB3, 0xA8AC},{0x8DB4, 0xAD77}, - {0x8DB5, 0xD3E5},{0x8DB6, 0xD3E7},{0x8DB7, 0xD3E6},{0x8DB9, 0xD7D8},{0x8DBA, 0xB36C},{0x8DBC, 0xD7D6},{0x8DBE, 0xB36B},{0x8DBF, 0xD7D9}, - {0x8DC1, 0xD7DA},{0x8DC2, 0xD7D7},{0x8DC5, 0xDBFB},{0x8DC6, 0xB660},{0x8DC7, 0xDBF3},{0x8DC8, 0xDBF9},{0x8DCB, 0xB65B},{0x8DCC, 0xB65E}, - {0x8DCD, 0xDBF2},{0x8DCE, 0xB659},{0x8DCF, 0xDBF6},{0x8DD0, 0xE06C},{0x8DD1, 0xB65D},{0x8DD3, 0xDBF1},{0x8DD5, 0xDBF7},{0x8DD6, 0xDBF4}, - {0x8DD7, 0xDBFA},{0x8DD8, 0xDBF0},{0x8DD9, 0xDBF8},{0x8DDA, 0xB65C},{0x8DDB, 0xB65F},{0x8DDC, 0xDBF5},{0x8DDD, 0xB65A},{0x8DDF, 0xB8F2}, - {0x8DE0, 0xE068},{0x8DE1, 0xB8F1},{0x8DE2, 0xE06F},{0x8DE3, 0xE06E},{0x8DE4, 0xB8F8},{0x8DE6, 0xB8F9},{0x8DE7, 0xE070},{0x8DE8, 0xB8F3}, - {0x8DE9, 0xE06D},{0x8DEA, 0xB8F7},{0x8DEB, 0xE072},{0x8DEC, 0xE069},{0x8DEE, 0xE06B},{0x8DEF, 0xB8F4},{0x8DF0, 0xE067},{0x8DF1, 0xE06A}, - {0x8DF2, 0xE071},{0x8DF3, 0xB8F5},{0x8DF4, 0xE073},{0x8DFA, 0xB8F6},{0x8DFC, 0xBBB1},{0x8DFD, 0xE45B},{0x8DFE, 0xE461},{0x8DFF, 0xE459}, - {0x8E00, 0xE462},{0x8E02, 0xE458},{0x8E03, 0xE45D},{0x8E04, 0xE463},{0x8E05, 0xE460},{0x8E06, 0xE45F},{0x8E07, 0xE45E},{0x8E09, 0xE457}, - {0x8E0A, 0xE45C},{0x8E0D, 0xE45A},{0x8E0F, 0xBDF1},{0x8E10, 0xBDEE},{0x8E11, 0xE7FB},{0x8E12, 0xE841},{0x8E13, 0xE843},{0x8E14, 0xE840}, - {0x8E15, 0xE7F8},{0x8E16, 0xE7FA},{0x8E17, 0xE845},{0x8E18, 0xE842},{0x8E19, 0xE7FC},{0x8E1A, 0xE846},{0x8E1B, 0xE7F9},{0x8E1C, 0xE844}, - {0x8E1D, 0xBDEF},{0x8E1E, 0xBDF5},{0x8E1F, 0xBDF3},{0x8E20, 0xE7F3},{0x8E21, 0xBDF4},{0x8E22, 0xBDF0},{0x8E23, 0xE7F4},{0x8E24, 0xE7F6}, - {0x8E25, 0xE7F5},{0x8E26, 0xE7FD},{0x8E27, 0xE7FE},{0x8E29, 0xBDF2},{0x8E2B, 0xBDED},{0x8E2E, 0xE7F7},{0x8E30, 0xEBC6},{0x8E31, 0xBFE2}, - {0x8E33, 0xEBBD},{0x8E34, 0xBFE3},{0x8E35, 0xBFE6},{0x8E36, 0xEBC2},{0x8E38, 0xEBBF},{0x8E39, 0xBFE5},{0x8E3C, 0xEBC3},{0x8E3D, 0xEBC4}, - {0x8E3E, 0xEBBE},{0x8E3F, 0xEBC7},{0x8E40, 0xEBC0},{0x8E41, 0xEBC5},{0x8E42, 0xBFE4},{0x8E44, 0xBFE1},{0x8E45, 0xEBC1},{0x8E47, 0xEEBF}, - {0x8E48, 0xC1D0},{0x8E49, 0xC1CE},{0x8E4A, 0xC1D1},{0x8E4B, 0xC1CF},{0x8E4C, 0xEEBE},{0x8E4D, 0xEEBB},{0x8E4E, 0xEEBA},{0x8E50, 0xEEBD}, - {0x8E53, 0xEEBC},{0x8E54, 0xF145},{0x8E55, 0xC2DE},{0x8E56, 0xF0FB},{0x8E57, 0xF0FA},{0x8E59, 0xC2D9},{0x8E5A, 0xF141},{0x8E5B, 0xF140}, - {0x8E5C, 0xF0F7},{0x8E5D, 0xF143},{0x8E5E, 0xF0FC},{0x8E5F, 0xC2DD},{0x8E60, 0xF0F9},{0x8E61, 0xF142},{0x8E62, 0xF0F8},{0x8E63, 0xC2DA}, - {0x8E64, 0xC2DC},{0x8E65, 0xF0FD},{0x8E66, 0xC2DB},{0x8E67, 0xF0FE},{0x8E69, 0xF144},{0x8E6A, 0xF352},{0x8E6C, 0xC3DE},{0x8E6D, 0xF34F}, - {0x8E6F, 0xF353},{0x8E72, 0xC3DB},{0x8E73, 0xF351},{0x8E74, 0xC3E0},{0x8E76, 0xC3DD},{0x8E78, 0xF350},{0x8E7A, 0xC3DF},{0x8E7B, 0xF354}, - {0x8E7C, 0xC3DA},{0x8E81, 0xC4BC},{0x8E82, 0xC4BE},{0x8E84, 0xF4D9},{0x8E85, 0xC4BD},{0x8E86, 0xF4D7},{0x8E87, 0xC3DC},{0x8E88, 0xF4D8}, - {0x8E89, 0xC4BB},{0x8E8A, 0xC543},{0x8E8B, 0xC545},{0x8E8C, 0xF656},{0x8E8D, 0xC544},{0x8E8E, 0xF655},{0x8E90, 0xF761},{0x8E91, 0xC5AD}, - {0x8E92, 0xF760},{0x8E93, 0xC5AE},{0x8E94, 0xF75E},{0x8E95, 0xF75D},{0x8E96, 0xF762},{0x8E97, 0xF763},{0x8E98, 0xF846},{0x8E9A, 0xF75F}, - {0x8E9D, 0xF8C6},{0x8E9E, 0xF8C3},{0x8E9F, 0xF8C4},{0x8EA0, 0xF8C5},{0x8EA1, 0xC65C},{0x8EA3, 0xF951},{0x8EA4, 0xF950},{0x8EA5, 0xF94F}, - {0x8EA6, 0xF970},{0x8EA8, 0xF9BE},{0x8EA9, 0xF9AB},{0x8EAA, 0xC66E},{0x8EAB, 0xA8AD},{0x8EAC, 0xB060},{0x8EB2, 0xB8FA},{0x8EBA, 0xBDF6}, - {0x8EBD, 0xEBC8},{0x8EC0, 0xC2DF},{0x8EC2, 0xF355},{0x8EC9, 0xF9AC},{0x8ECA, 0xA8AE},{0x8ECB, 0xAAEE},{0x8ECC, 0xAD79},{0x8ECD, 0xAD78}, - {0x8ECF, 0xB063},{0x8ED1, 0xD3E8},{0x8ED2, 0xB061},{0x8ED3, 0xD3E9},{0x8ED4, 0xB062},{0x8ED7, 0xD7DF},{0x8ED8, 0xD7DB},{0x8EDB, 0xB36D}, - {0x8EDC, 0xD7DE},{0x8EDD, 0xD7DD},{0x8EDE, 0xD7DC},{0x8EDF, 0xB36E},{0x8EE0, 0xD7E0},{0x8EE1, 0xD7E1},{0x8EE5, 0xDC43},{0x8EE6, 0xDC41}, - {0x8EE7, 0xDC45},{0x8EE8, 0xDC46},{0x8EE9, 0xDC4C},{0x8EEB, 0xDC48},{0x8EEC, 0xDC4A},{0x8EEE, 0xDC42},{0x8EEF, 0xDBFC},{0x8EF1, 0xDC49}, - {0x8EF4, 0xDC4B},{0x8EF5, 0xDC44},{0x8EF6, 0xDC47},{0x8EF7, 0xDBFD},{0x8EF8, 0xB662},{0x8EF9, 0xDC40},{0x8EFA, 0xDBFE},{0x8EFB, 0xB661}, - {0x8EFC, 0xB663},{0x8EFE, 0xB8FD},{0x8EFF, 0xE075},{0x8F00, 0xE077},{0x8F01, 0xE076},{0x8F02, 0xE07B},{0x8F03, 0xB8FB},{0x8F05, 0xE078}, - {0x8F06, 0xE074},{0x8F07, 0xE079},{0x8F08, 0xE07A},{0x8F09, 0xB8FC},{0x8F0A, 0xB8FE},{0x8F0B, 0xE07C},{0x8F0D, 0xE467},{0x8F0E, 0xE466}, - {0x8F10, 0xE464},{0x8F11, 0xE465},{0x8F12, 0xBBB3},{0x8F13, 0xBBB5},{0x8F14, 0xBBB2},{0x8F15, 0xBBB4},{0x8F16, 0xE84D},{0x8F17, 0xE84E}, - {0x8F18, 0xE849},{0x8F1A, 0xE84A},{0x8F1B, 0xBDF8},{0x8F1C, 0xBDFD},{0x8F1D, 0xBDF7},{0x8F1E, 0xBDFE},{0x8F1F, 0xBDF9},{0x8F20, 0xE84B}, - {0x8F23, 0xE84C},{0x8F24, 0xE848},{0x8F25, 0xBE40},{0x8F26, 0xBDFB},{0x8F29, 0xBDFA},{0x8F2A, 0xBDFC},{0x8F2C, 0xE847},{0x8F2E, 0xEBCA}, - {0x8F2F, 0xBFE8},{0x8F32, 0xEBCC},{0x8F33, 0xBFEA},{0x8F34, 0xEBCF},{0x8F35, 0xEBCB},{0x8F36, 0xEBC9},{0x8F37, 0xEBCE},{0x8F38, 0xBFE9}, - {0x8F39, 0xEBCD},{0x8F3B, 0xBFE7},{0x8F3E, 0xC1D3},{0x8F3F, 0xC1D6},{0x8F40, 0xEEC1},{0x8F42, 0xC1D4},{0x8F43, 0xEEC0},{0x8F44, 0xC1D2}, - {0x8F45, 0xC1D5},{0x8F46, 0xF146},{0x8F47, 0xF147},{0x8F48, 0xF148},{0x8F49, 0xC2E0},{0x8F4B, 0xF149},{0x8F4D, 0xC2E1},{0x8F4E, 0xC3E2}, - {0x8F4F, 0xF358},{0x8F50, 0xF359},{0x8F51, 0xF357},{0x8F52, 0xF356},{0x8F53, 0xF35A},{0x8F54, 0xC3E1},{0x8F55, 0xF4DD},{0x8F56, 0xF4DB}, - {0x8F57, 0xF4DC},{0x8F58, 0xF4DE},{0x8F59, 0xF4DA},{0x8F5A, 0xF4DF},{0x8F5B, 0xF658},{0x8F5D, 0xF659},{0x8F5E, 0xF657},{0x8F5F, 0xC546}, - {0x8F60, 0xF764},{0x8F61, 0xC5AF},{0x8F62, 0xF765},{0x8F63, 0xF848},{0x8F64, 0xF847},{0x8F9B, 0xA8AF},{0x8F9C, 0xB664},{0x8F9F, 0xB940}, - {0x8FA3, 0xBBB6},{0x8FA6, 0xBFEC},{0x8FA8, 0xBFEB},{0x8FAD, 0xC3E3},{0x8FAE, 0xC47C},{0x8FAF, 0xC547},{0x8FB0, 0xA8B0},{0x8FB1, 0xB064}, - {0x8FB2, 0xB941},{0x8FB4, 0xF35B},{0x8FBF, 0xCBA6},{0x8FC2, 0xA8B1},{0x8FC4, 0xA8B4},{0x8FC5, 0xA8B3},{0x8FC6, 0xA8B2},{0x8FC9, 0xCBA5}, - {0x8FCB, 0xCDCD},{0x8FCD, 0xCDCF},{0x8FCE, 0xAAEF},{0x8FD1, 0xAAF1},{0x8FD2, 0xCDCC},{0x8FD3, 0xCDCE},{0x8FD4, 0xAAF0},{0x8FD5, 0xCDD1}, - {0x8FD6, 0xCDD0},{0x8FD7, 0xCDD2},{0x8FE0, 0xD0B6},{0x8FE1, 0xD0B4},{0x8FE2, 0xAD7C},{0x8FE3, 0xD0B3},{0x8FE4, 0xADA3},{0x8FE5, 0xAD7E}, - {0x8FE6, 0xAD7B},{0x8FE8, 0xADA4},{0x8FEA, 0xAD7D},{0x8FEB, 0xADA2},{0x8FED, 0xADA1},{0x8FEE, 0xD0B5},{0x8FF0, 0xAD7A},{0x8FF4, 0xB06A}, - {0x8FF5, 0xD3EB},{0x8FF6, 0xD3F1},{0x8FF7, 0xB067},{0x8FF8, 0xB06E},{0x8FFA, 0xB069},{0x8FFB, 0xD3EE},{0x8FFC, 0xD3F0},{0x8FFD, 0xB06C}, - {0x8FFE, 0xD3EA},{0x8FFF, 0xD3ED},{0x9000, 0xB068},{0x9001, 0xB065},{0x9002, 0xD3EC},{0x9003, 0xB06B},{0x9004, 0xD3EF},{0x9005, 0xB06D}, - {0x9006, 0xB066},{0x900B, 0xD7E3},{0x900C, 0xD7E6},{0x900D, 0xB370},{0x900F, 0xB37A},{0x9010, 0xB376},{0x9011, 0xD7E4},{0x9014, 0xB37E}, - {0x9015, 0xB377},{0x9016, 0xB37C},{0x9017, 0xB372},{0x9019, 0xB36F},{0x901A, 0xB371},{0x901B, 0xB37D},{0x901C, 0xD7E5},{0x901D, 0xB375}, - {0x901E, 0xB378},{0x901F, 0xB374},{0x9020, 0xB379},{0x9021, 0xD7E7},{0x9022, 0xB37B},{0x9023, 0xB373},{0x9024, 0xD7E2},{0x902D, 0xDC4D}, - {0x902E, 0xB665},{0x902F, 0xDC4F},{0x9031, 0xB667},{0x9032, 0xB669},{0x9034, 0xDC4E},{0x9035, 0xB666},{0x9036, 0xB66A},{0x9038, 0xB668}, - {0x903C, 0xB947},{0x903D, 0xE0A3},{0x903E, 0xB94F},{0x903F, 0xE07E},{0x9041, 0xB950},{0x9042, 0xB945},{0x9044, 0xE0A1},{0x9047, 0xB94A}, - {0x9049, 0xE0A2},{0x904A, 0xB943},{0x904B, 0xB942},{0x904D, 0xB94D},{0x904E, 0xB94C},{0x904F, 0xB94B},{0x9050, 0xB949},{0x9051, 0xB94E}, - {0x9052, 0xE07D},{0x9053, 0xB944},{0x9054, 0xB946},{0x9055, 0xB948},{0x9058, 0xBBB8},{0x9059, 0xBBBB},{0x905B, 0xBBBF},{0x905C, 0xBBB9}, - {0x905D, 0xBBBE},{0x905E, 0xBBBC},{0x9060, 0xBBB7},{0x9062, 0xBBBD},{0x9063, 0xBBBA},{0x9067, 0xE852},{0x9068, 0xBE43},{0x9069, 0xBE41}, - {0x906B, 0xE853},{0x906D, 0xBE44},{0x906E, 0xBE42},{0x906F, 0xE851},{0x9070, 0xE850},{0x9072, 0xBFF0},{0x9073, 0xE84F},{0x9074, 0xBFEE}, - {0x9075, 0xBFED},{0x9076, 0xEBD0},{0x9077, 0xBE45},{0x9078, 0xBFEF},{0x9079, 0xEBD1},{0x907A, 0xBFF2},{0x907B, 0xEBD2},{0x907C, 0xBFF1}, - {0x907D, 0xC1D8},{0x907E, 0xEEC3},{0x907F, 0xC1D7},{0x9080, 0xC1DC},{0x9081, 0xC1DA},{0x9082, 0xC1DB},{0x9083, 0xC2E3},{0x9084, 0xC1D9}, - {0x9085, 0xEEC2},{0x9086, 0xEBD3},{0x9087, 0xC2E2},{0x9088, 0xC2E4},{0x908A, 0xC3E4},{0x908B, 0xC3E5},{0x908D, 0xF4E0},{0x908F, 0xC5DE}, - {0x9090, 0xC5DD},{0x9091, 0xA8B6},{0x9094, 0xCA55},{0x9095, 0xB06F},{0x9097, 0xCA52},{0x9098, 0xCA53},{0x9099, 0xCA51},{0x909B, 0xCA54}, - {0x909E, 0xCBAA},{0x909F, 0xCBA7},{0x90A0, 0xCBAC},{0x90A1, 0xCBA8},{0x90A2, 0xA8B7},{0x90A3, 0xA8BA},{0x90A5, 0xCBA9},{0x90A6, 0xA8B9}, - {0x90A7, 0xCBAB},{0x90AA, 0xA8B8},{0x90AF, 0xCDD5},{0x90B0, 0xCDD7},{0x90B1, 0xAAF4},{0x90B2, 0xCDD3},{0x90B3, 0xCDD6},{0x90B4, 0xCDD4}, - {0x90B5, 0xAAF2},{0x90B6, 0xAAF5},{0x90B8, 0xAAF3},{0x90BD, 0xD0B8},{0x90BE, 0xD0BC},{0x90BF, 0xD0B9},{0x90C1, 0xADA7},{0x90C3, 0xADA8}, - {0x90C5, 0xD0BB},{0x90C7, 0xD0BD},{0x90C8, 0xD0BF},{0x90CA, 0xADA5},{0x90CB, 0xD0BE},{0x90CE, 0xADA6},{0x90D4, 0xD7EE},{0x90D5, 0xD0BA}, - {0x90D6, 0xD3F2},{0x90D7, 0xD3FB},{0x90D8, 0xD3F9},{0x90D9, 0xD3F4},{0x90DA, 0xD3F5},{0x90DB, 0xD3FA},{0x90DC, 0xD3FC},{0x90DD, 0xB071}, - {0x90DF, 0xD3F7},{0x90E0, 0xD3F3},{0x90E1, 0xB070},{0x90E2, 0xB072},{0x90E3, 0xD3F6},{0x90E4, 0xD3FD},{0x90E5, 0xD3F8},{0x90E8, 0xB3A1}, - {0x90E9, 0xD7F1},{0x90EA, 0xD7E9},{0x90EB, 0xD7EF},{0x90EC, 0xD7F0},{0x90ED, 0xB3A2},{0x90EF, 0xD7E8},{0x90F0, 0xD7EA},{0x90F1, 0xD0B7}, - {0x90F2, 0xD7EC},{0x90F3, 0xD7ED},{0x90F4, 0xD7EB},{0x90F5, 0xB66C},{0x90F9, 0xDC56},{0x90FA, 0xEBD4},{0x90FB, 0xDC57},{0x90FC, 0xDC54}, - {0x90FD, 0xB3A3},{0x90FE, 0xB66E},{0x90FF, 0xDC53},{0x9100, 0xDC59},{0x9101, 0xDC58},{0x9102, 0xB66B},{0x9103, 0xDC5C},{0x9104, 0xDC52}, - {0x9105, 0xDC5B},{0x9106, 0xDC50},{0x9107, 0xDC5A},{0x9108, 0xDC55},{0x9109, 0xB66D},{0x910B, 0xE0AA},{0x910D, 0xE0A5},{0x910E, 0xE0AB}, - {0x910F, 0xE0A6},{0x9110, 0xE0A4},{0x9111, 0xE0A7},{0x9112, 0xB951},{0x9114, 0xE0A9},{0x9116, 0xE0A8},{0x9117, 0xB952},{0x9118, 0xBBC1}, - {0x9119, 0xBBC0},{0x911A, 0xE46E},{0x911B, 0xE471},{0x911C, 0xE469},{0x911D, 0xE46D},{0x911E, 0xBBC2},{0x911F, 0xE46C},{0x9120, 0xE46A}, - {0x9121, 0xE470},{0x9122, 0xE46B},{0x9123, 0xE468},{0x9124, 0xE46F},{0x9126, 0xE859},{0x9127, 0xBE48},{0x9128, 0xF14A},{0x9129, 0xE856}, - {0x912A, 0xE857},{0x912B, 0xE855},{0x912C, 0xDC51},{0x912D, 0xBE47},{0x912E, 0xE85A},{0x912F, 0xE854},{0x9130, 0xBE46},{0x9131, 0xBE49}, - {0x9132, 0xE858},{0x9133, 0xEBD5},{0x9134, 0xBFF3},{0x9135, 0xEBD6},{0x9136, 0xEBD7},{0x9138, 0xEEC4},{0x9139, 0xC1DD},{0x913A, 0xF14B}, - {0x913B, 0xF14C},{0x913E, 0xF14D},{0x913F, 0xF35D},{0x9140, 0xF35C},{0x9141, 0xF4E2},{0x9143, 0xF4E1},{0x9144, 0xF65B},{0x9145, 0xF65C}, - {0x9146, 0xF65A},{0x9147, 0xF766},{0x9148, 0xC5B0},{0x9149, 0xA8BB},{0x914A, 0xADAA},{0x914B, 0xADA9},{0x914C, 0xB075},{0x914D, 0xB074}, - {0x914E, 0xD440},{0x914F, 0xD441},{0x9150, 0xD3FE},{0x9152, 0xB073},{0x9153, 0xD7F5},{0x9155, 0xD7F6},{0x9156, 0xD7F2},{0x9157, 0xB3A4}, - {0x9158, 0xD7F3},{0x915A, 0xD7F4},{0x915F, 0xDC5F},{0x9160, 0xDC61},{0x9161, 0xDC5D},{0x9162, 0xDC60},{0x9163, 0xB66F},{0x9164, 0xDC5E}, - {0x9165, 0xB670},{0x9168, 0xDD73},{0x9169, 0xB955},{0x916A, 0xB954},{0x916C, 0xB953},{0x916E, 0xE0AC},{0x916F, 0xE0AD},{0x9172, 0xE473}, - {0x9173, 0xE475},{0x9174, 0xBBC6},{0x9175, 0xBBC3},{0x9177, 0xBBC5},{0x9178, 0xBBC4},{0x9179, 0xE474},{0x917A, 0xE472},{0x9180, 0xE861}, - {0x9181, 0xE85E},{0x9182, 0xE85F},{0x9183, 0xBE4D},{0x9184, 0xE860},{0x9185, 0xE85B},{0x9186, 0xE85C},{0x9187, 0xBE4A},{0x9189, 0xBE4B}, - {0x918A, 0xE85D},{0x918B, 0xBE4C},{0x918D, 0xEBDB},{0x918F, 0xEBDC},{0x9190, 0xEBD9},{0x9191, 0xEBDA},{0x9192, 0xBFF4},{0x9193, 0xEBD8}, - {0x9199, 0xEEC8},{0x919A, 0xEEC5},{0x919B, 0xEEC7},{0x919C, 0xC1E0},{0x919D, 0xEECB},{0x919E, 0xC1DF},{0x919F, 0xEEC9},{0x91A0, 0xEECC}, - {0x91A1, 0xEECA},{0x91A2, 0xEEC6},{0x91A3, 0xC1DE},{0x91A5, 0xF14F},{0x91A7, 0xF150},{0x91A8, 0xF14E},{0x91AA, 0xF152},{0x91AB, 0xC2E5}, - {0x91AC, 0xC2E6},{0x91AD, 0xF35F},{0x91AE, 0xC3E7},{0x91AF, 0xF151},{0x91B0, 0xF35E},{0x91B1, 0xC3E6},{0x91B2, 0xF4E5},{0x91B3, 0xF4E6}, - {0x91B4, 0xC4BF},{0x91B5, 0xF4E4},{0x91B7, 0xF4E3},{0x91B9, 0xF65D},{0x91BA, 0xC548},{0x91BC, 0xF849},{0x91BD, 0xF8C8},{0x91BE, 0xF8C7}, - {0x91C0, 0xC643},{0x91C1, 0xC65D},{0x91C2, 0xF8C9},{0x91C3, 0xF971},{0x91C5, 0xC66F},{0x91C6, 0xA8BC},{0x91C7, 0xAAF6},{0x91C9, 0xB956}, - {0x91CB, 0xC4C0},{0x91CC, 0xA8BD},{0x91CD, 0xADAB},{0x91CE, 0xB3A5},{0x91CF, 0xB671},{0x91D0, 0xC2E7},{0x91D1, 0xAAF7},{0x91D3, 0xD0C1}, - {0x91D4, 0xD0C0},{0x91D5, 0xD442},{0x91D7, 0xB078},{0x91D8, 0xB076},{0x91D9, 0xB07A},{0x91DA, 0xD444},{0x91DC, 0xB079},{0x91DD, 0xB077}, - {0x91E2, 0xD443},{0x91E3, 0xB3A8},{0x91E4, 0xD7FC},{0x91E6, 0xB3A7},{0x91E7, 0xB3A9},{0x91E8, 0xD842},{0x91E9, 0xB3AB},{0x91EA, 0xD7FE}, - {0x91EB, 0xD840},{0x91EC, 0xD7F7},{0x91ED, 0xB3AA},{0x91EE, 0xD843},{0x91F1, 0xD7F9},{0x91F3, 0xD7FA},{0x91F4, 0xD7F8},{0x91F5, 0xB3A6}, - {0x91F7, 0xD841},{0x91F8, 0xD7FB},{0x91F9, 0xD7FD},{0x91FD, 0xDC6D},{0x91FF, 0xDC6C},{0x9200, 0xDC6A},{0x9201, 0xDC62},{0x9202, 0xDC71}, - {0x9203, 0xDC65},{0x9204, 0xDC6F},{0x9205, 0xDC76},{0x9206, 0xDC6E},{0x9207, 0xB679},{0x9209, 0xB675},{0x920A, 0xDC63},{0x920C, 0xDC69}, - {0x920D, 0xB677},{0x920F, 0xDC68},{0x9210, 0xB678},{0x9211, 0xB67A},{0x9212, 0xDC6B},{0x9214, 0xB672},{0x9215, 0xB673},{0x9216, 0xDC77}, - {0x9217, 0xDC75},{0x9219, 0xDC74},{0x921A, 0xDC66},{0x921C, 0xDC72},{0x921E, 0xB676},{0x9223, 0xB674},{0x9224, 0xDC73},{0x9225, 0xDC64}, - {0x9226, 0xDC67},{0x9227, 0xDC70},{0x922D, 0xE4BA},{0x922E, 0xE0B7},{0x9230, 0xE0B0},{0x9231, 0xE0C3},{0x9232, 0xE0CC},{0x9233, 0xE0B3}, - {0x9234, 0xB961},{0x9236, 0xE0C0},{0x9237, 0xB957},{0x9238, 0xB959},{0x9239, 0xB965},{0x923A, 0xE0B1},{0x923D, 0xB95A},{0x923E, 0xB95C}, - {0x923F, 0xB966},{0x9240, 0xB95B},{0x9245, 0xB964},{0x9246, 0xE0B9},{0x9248, 0xE0AE},{0x9249, 0xB962},{0x924A, 0xE0B8},{0x924B, 0xB95E}, - {0x924C, 0xE0CA},{0x924D, 0xB963},{0x924E, 0xE0C8},{0x924F, 0xE0BC},{0x9250, 0xE0C6},{0x9251, 0xB960},{0x9252, 0xE0AF},{0x9253, 0xE0C9}, - {0x9254, 0xE0C4},{0x9256, 0xE0CB},{0x9257, 0xB958},{0x925A, 0xB967},{0x925B, 0xB95D},{0x925E, 0xE0B5},{0x9260, 0xE0BD},{0x9261, 0xE0C1}, - {0x9263, 0xE0C5},{0x9264, 0xB95F},{0x9265, 0xE0B4},{0x9266, 0xE0B2},{0x9267, 0xE0BE},{0x926C, 0xE0BB},{0x926D, 0xE0BA},{0x926F, 0xE0BF}, - {0x9270, 0xE0C2},{0x9272, 0xE0C7},{0x9276, 0xE478},{0x9278, 0xBBC7},{0x9279, 0xE4A4},{0x927A, 0xE47A},{0x927B, 0xBBCC},{0x927C, 0xBBD0}, - {0x927D, 0xE4AD},{0x927E, 0xE4B5},{0x927F, 0xE4A6},{0x9280, 0xBBC8},{0x9282, 0xE4AA},{0x9283, 0xE0B6},{0x9285, 0xBBC9},{0x9286, 0xE4B1}, - {0x9287, 0xE4B6},{0x9288, 0xE4AE},{0x928A, 0xE4B0},{0x928B, 0xE4B9},{0x928C, 0xE4B2},{0x928D, 0xE47E},{0x928E, 0xE4A9},{0x9291, 0xBBD1}, - {0x9293, 0xBBCD},{0x9294, 0xE47C},{0x9295, 0xE4AB},{0x9296, 0xBBCB},{0x9297, 0xE4A5},{0x9298, 0xBBCA},{0x9299, 0xE4B3},{0x929A, 0xE4A2}, - {0x929B, 0xE479},{0x929C, 0xBBCE},{0x929D, 0xE4B8},{0x92A0, 0xE47B},{0x92A1, 0xE4AF},{0x92A2, 0xE4AC},{0x92A3, 0xE4A7},{0x92A4, 0xE477}, - {0x92A5, 0xE476},{0x92A6, 0xE4A1},{0x92A7, 0xE4B4},{0x92A8, 0xBBCF},{0x92A9, 0xE4B7},{0x92AA, 0xE47D},{0x92AB, 0xE4A3},{0x92AC, 0xBE52}, - {0x92B2, 0xBE5A},{0x92B3, 0xBE55},{0x92B4, 0xE8A4},{0x92B5, 0xE8A1},{0x92B6, 0xE867},{0x92B7, 0xBE50},{0x92BB, 0xBE4F},{0x92BC, 0xBE56}, - {0x92C0, 0xE865},{0x92C1, 0xBE54},{0x92C2, 0xE871},{0x92C3, 0xE863},{0x92C4, 0xE864},{0x92C5, 0xBE4E},{0x92C6, 0xE8A3},{0x92C7, 0xBE58}, - {0x92C8, 0xE874},{0x92C9, 0xE879},{0x92CA, 0xE873},{0x92CB, 0xEBEE},{0x92CC, 0xE86F},{0x92CD, 0xE877},{0x92CE, 0xE875},{0x92CF, 0xE868}, - {0x92D0, 0xE862},{0x92D1, 0xE87D},{0x92D2, 0xBE57},{0x92D3, 0xE87E},{0x92D5, 0xE878},{0x92D7, 0xE86D},{0x92D8, 0xE86B},{0x92D9, 0xE866}, - {0x92DD, 0xE86E},{0x92DE, 0xE87B},{0x92DF, 0xE86A},{0x92E0, 0xE87A},{0x92E1, 0xE8A2},{0x92E4, 0xBE53},{0x92E6, 0xE876},{0x92E7, 0xE87C}, - {0x92E8, 0xE872},{0x92E9, 0xE86C},{0x92EA, 0xBE51},{0x92EE, 0xE4A8},{0x92EF, 0xE870},{0x92F0, 0xBE59},{0x92F1, 0xE869},{0x92F7, 0xEBF4}, - {0x92F8, 0xBFF7},{0x92F9, 0xEBF3},{0x92FA, 0xEBF0},{0x92FB, 0xEC44},{0x92FC, 0xBFFB},{0x92FE, 0xEC41},{0x92FF, 0xEBF8},{0x9300, 0xEC43}, - {0x9301, 0xEBE9},{0x9302, 0xEBF6},{0x9304, 0xBFFD},{0x9306, 0xEBE1},{0x9308, 0xEBDF},{0x9309, 0xEC42},{0x930B, 0xEC40},{0x930C, 0xEBFE}, - {0x930D, 0xEBED},{0x930E, 0xEBEC},{0x930F, 0xEBE2},{0x9310, 0xC040},{0x9312, 0xEBE8},{0x9313, 0xEBF2},{0x9314, 0xEBFD},{0x9315, 0xC043}, - {0x9316, 0xEC45},{0x9318, 0xC1E8},{0x9319, 0xC045},{0x931A, 0xBFFE},{0x931B, 0xEBE6},{0x931D, 0xEBEF},{0x931E, 0xEBDE},{0x931F, 0xEBE0}, - {0x9320, 0xBFF5},{0x9321, 0xC042},{0x9322, 0xBFFA},{0x9323, 0xEBE7},{0x9324, 0xEBF7},{0x9325, 0xEBF1},{0x9326, 0xC041},{0x9327, 0xEBDD}, - {0x9328, 0xC1E3},{0x9329, 0xEBF9},{0x932A, 0xEBFC},{0x932B, 0xBFFC},{0x932D, 0xEBEB},{0x932E, 0xC044},{0x932F, 0xBFF9},{0x9333, 0xBFF8}, - {0x9334, 0xEBF5},{0x9335, 0xEBFB},{0x9336, 0xBFF6},{0x9338, 0xEBE4},{0x9339, 0xEBFA},{0x933C, 0xEBE5},{0x9346, 0xEBEA},{0x9347, 0xEED2}, - {0x9349, 0xEED7},{0x934A, 0xC1E5},{0x934B, 0xC1E7},{0x934C, 0xEEDD},{0x934D, 0xC1E1},{0x934E, 0xEEEC},{0x934F, 0xEEE3},{0x9350, 0xEED8}, - {0x9351, 0xEED9},{0x9352, 0xEEE2},{0x9354, 0xC1EE},{0x9355, 0xEEE1},{0x9356, 0xEED1},{0x9357, 0xEEE0},{0x9358, 0xEED4},{0x9359, 0xEEED}, - {0x935A, 0xC1ED},{0x935B, 0xC1EB},{0x935C, 0xEED5},{0x935E, 0xEEE8},{0x9360, 0xEEDA},{0x9361, 0xEEE7},{0x9363, 0xEEE9},{0x9364, 0xEED0}, - {0x9365, 0xC1E6},{0x9367, 0xEEEA},{0x936A, 0xEEDE},{0x936C, 0xC1EA},{0x936D, 0xEEDB},{0x9370, 0xC1EC},{0x9371, 0xEEE4},{0x9375, 0xC1E4}, - {0x9376, 0xEED6},{0x9377, 0xEEE5},{0x9379, 0xEEDF},{0x937A, 0xEBE3},{0x937B, 0xEEE6},{0x937C, 0xEED3},{0x937E, 0xC1E9},{0x9380, 0xEEEB}, - {0x9382, 0xC1E2},{0x9383, 0xEECE},{0x9388, 0xF160},{0x9389, 0xF159},{0x938A, 0xC2E9},{0x938C, 0xF154},{0x938D, 0xF163},{0x938E, 0xF15B}, - {0x938F, 0xEEDC},{0x9391, 0xF165},{0x9392, 0xF155},{0x9394, 0xC2E8},{0x9395, 0xF15F},{0x9396, 0xC2EA},{0x9397, 0xC2F2},{0x9398, 0xC2F0}, - {0x9399, 0xF161},{0x939A, 0xC2F1},{0x939B, 0xF157},{0x939D, 0xF158},{0x939E, 0xF15D},{0x939F, 0xF162},{0x93A1, 0xEECD},{0x93A2, 0xC2EB}, - {0x93A3, 0xF16A},{0x93A4, 0xF167},{0x93A5, 0xF16B},{0x93A6, 0xF15E},{0x93A7, 0xF15A},{0x93A8, 0xF168},{0x93A9, 0xF36A},{0x93AA, 0xF15C}, - {0x93AC, 0xC2EE},{0x93AE, 0xC2ED},{0x93AF, 0xEECF},{0x93B0, 0xC2EF},{0x93B1, 0xF164},{0x93B2, 0xF166},{0x93B3, 0xC2EC},{0x93B4, 0xF169}, - {0x93B5, 0xF153},{0x93B7, 0xF156},{0x93C0, 0xF373},{0x93C2, 0xF363},{0x93C3, 0xC3EB},{0x93C4, 0xF371},{0x93C7, 0xF361},{0x93C8, 0xC3EC}, - {0x93CA, 0xF36C},{0x93CC, 0xF368},{0x93CD, 0xC3F1},{0x93CE, 0xF372},{0x93CF, 0xF362},{0x93D0, 0xF365},{0x93D1, 0xC3E9},{0x93D2, 0xF374}, - {0x93D4, 0xF36D},{0x93D5, 0xF370},{0x93D6, 0xC3EF},{0x93D7, 0xC3F4},{0x93D8, 0xC3F2},{0x93D9, 0xF369},{0x93DA, 0xF364},{0x93DC, 0xC3ED}, - {0x93DD, 0xC3EE},{0x93DE, 0xF360},{0x93DF, 0xC3EA},{0x93E1, 0xC3E8},{0x93E2, 0xC3F0},{0x93E3, 0xF36F},{0x93E4, 0xC3F3},{0x93E6, 0xF36B}, - {0x93E7, 0xF375},{0x93E8, 0xC3F5},{0x93EC, 0xF367},{0x93EE, 0xF36E},{0x93F5, 0xF4F3},{0x93F6, 0xF542},{0x93F7, 0xF4F5},{0x93F8, 0xF4FC}, - {0x93F9, 0xF366},{0x93FA, 0xF4FA},{0x93FB, 0xF4E9},{0x93FC, 0xF540},{0x93FD, 0xC4C3},{0x93FE, 0xF4ED},{0x93FF, 0xF4FE},{0x9400, 0xF4F4}, - {0x9403, 0xC4C2},{0x9406, 0xF544},{0x9407, 0xF4F6},{0x9409, 0xF4FB},{0x940A, 0xF4FD},{0x940B, 0xF4E7},{0x940C, 0xF541},{0x940D, 0xF4F2}, - {0x940E, 0xF4F7},{0x940F, 0xF4EB},{0x9410, 0xF4EF},{0x9411, 0xF543},{0x9412, 0xF4F9},{0x9413, 0xF4E8},{0x9414, 0xF4EC},{0x9415, 0xF4EE}, - {0x9416, 0xF4F8},{0x9418, 0xC4C1},{0x9419, 0xF4F1},{0x9420, 0xF4EA},{0x9428, 0xF4F0},{0x9429, 0xF661},{0x942A, 0xF666},{0x942B, 0xC54F}, - {0x942C, 0xF668},{0x942E, 0xC549},{0x9430, 0xF664},{0x9431, 0xF66A},{0x9432, 0xC54E},{0x9433, 0xC54A},{0x9435, 0xC54B},{0x9436, 0xF660}, - {0x9437, 0xF667},{0x9438, 0xC54D},{0x9439, 0xF665},{0x943A, 0xC54C},{0x943B, 0xF65F},{0x943C, 0xF663},{0x943D, 0xF662},{0x943F, 0xF65E}, - {0x9440, 0xF669},{0x9444, 0xC5B1},{0x9445, 0xF76D},{0x9446, 0xF770},{0x9447, 0xF76C},{0x9448, 0xF76E},{0x9449, 0xF76F},{0x944A, 0xF769}, - {0x944B, 0xF76A},{0x944C, 0xF767},{0x944F, 0xF76B},{0x9450, 0xF768},{0x9451, 0xC5B2},{0x9452, 0xC5B3},{0x9455, 0xF84B},{0x9457, 0xF84D}, - {0x945D, 0xF84C},{0x945E, 0xF84E},{0x9460, 0xC5E0},{0x9462, 0xF84A},{0x9463, 0xC5DF},{0x9464, 0xC5E1},{0x9468, 0xF8CB},{0x9469, 0xF8CC}, - {0x946A, 0xC644},{0x946B, 0xF8CA},{0x946D, 0xF953},{0x946E, 0xF952},{0x946F, 0xF954},{0x9470, 0xC65F},{0x9471, 0xF955},{0x9472, 0xC65E}, - {0x9473, 0xF956},{0x9474, 0xF972},{0x9475, 0xF975},{0x9476, 0xF974},{0x9477, 0xC668},{0x9478, 0xF973},{0x947C, 0xC672},{0x947D, 0xC670}, - {0x947E, 0xC671},{0x947F, 0xC677},{0x9480, 0xF9C0},{0x9481, 0xF9C1},{0x9482, 0xF9BF},{0x9483, 0xF9C9},{0x9577, 0xAAF8},{0x957A, 0xD844}, - {0x957B, 0xDC78},{0x957C, 0xE8A5},{0x957D, 0xF376},{0x9580, 0xAAF9},{0x9582, 0xADAC},{0x9583, 0xB07B},{0x9586, 0xD845},{0x9588, 0xD846}, - {0x9589, 0xB3AC},{0x958B, 0xB67D},{0x958C, 0xDC7A},{0x958D, 0xDC79},{0x958E, 0xB6A3},{0x958F, 0xB67C},{0x9590, 0xDC7B},{0x9591, 0xB67E}, - {0x9592, 0xB6A2},{0x9593, 0xB6A1},{0x9594, 0xB67B},{0x9598, 0xB968},{0x959B, 0xE0D0},{0x959C, 0xE0CE},{0x959E, 0xE0CF},{0x959F, 0xE0CD}, - {0x95A1, 0xBBD2},{0x95A3, 0xBBD5},{0x95A4, 0xBBD7},{0x95A5, 0xBBD6},{0x95A8, 0xBBD3},{0x95A9, 0xBBD4},{0x95AB, 0xE8A7},{0x95AC, 0xE8A6}, - {0x95AD, 0xBE5B},{0x95AE, 0xE8A8},{0x95B0, 0xE8A9},{0x95B1, 0xBE5C},{0x95B5, 0xEC4D},{0x95B6, 0xEC4B},{0x95B7, 0xEEF3},{0x95B9, 0xEC49}, - {0x95BA, 0xEC4A},{0x95BB, 0xC046},{0x95BC, 0xEC46},{0x95BD, 0xEC4E},{0x95BE, 0xEC48},{0x95BF, 0xEC4C},{0x95C0, 0xEEEF},{0x95C3, 0xEEF1}, - {0x95C5, 0xEEF2},{0x95C6, 0xC1F3},{0x95C7, 0xEEEE},{0x95C8, 0xC1F2},{0x95C9, 0xEEF0},{0x95CA, 0xC1EF},{0x95CB, 0xC1F0},{0x95CC, 0xC1F1}, - {0x95CD, 0xEC47},{0x95D0, 0xC2F5},{0x95D1, 0xF16E},{0x95D2, 0xF16C},{0x95D3, 0xF16D},{0x95D4, 0xC2F3},{0x95D5, 0xC2F6},{0x95D6, 0xC2F4}, - {0x95DA, 0xF377},{0x95DB, 0xF378},{0x95DC, 0xC3F6},{0x95DE, 0xF545},{0x95DF, 0xF547},{0x95E0, 0xF546},{0x95E1, 0xC4C4},{0x95E2, 0xC550}, - {0x95E3, 0xF66D},{0x95E4, 0xF66C},{0x95E5, 0xF66B},{0x961C, 0xAAFA},{0x961E, 0xC9AA},{0x9620, 0xCA58},{0x9621, 0xA6E9},{0x9622, 0xCA56}, - {0x9623, 0xCA59},{0x9624, 0xCA57},{0x9628, 0xCBAE},{0x962A, 0xA8C1},{0x962C, 0xA8C2},{0x962D, 0xCBB0},{0x962E, 0xA8BF},{0x962F, 0xCBAF}, - {0x9630, 0xCBAD},{0x9631, 0xA8C0},{0x9632, 0xA8BE},{0x9639, 0xCDD8},{0x963A, 0xCDDB},{0x963B, 0xAAFD},{0x963C, 0xCDDA},{0x963D, 0xCDD9}, - {0x963F, 0xAAFC},{0x9640, 0xAAFB},{0x9642, 0xAB40},{0x9643, 0xCDDC},{0x9644, 0xAAFE},{0x964A, 0xD0C6},{0x964B, 0xADAE},{0x964C, 0xADAF}, - {0x964D, 0xADB0},{0x964E, 0xD0C7},{0x964F, 0xD0C3},{0x9650, 0xADAD},{0x9651, 0xD0C4},{0x9653, 0xD0C5},{0x9654, 0xD0C2},{0x9658, 0xB0A4}, - {0x965B, 0xB0A1},{0x965C, 0xD445},{0x965D, 0xB0A2},{0x965E, 0xB0A5},{0x965F, 0xD446},{0x9661, 0xB07E},{0x9662, 0xB07C},{0x9663, 0xB07D}, - {0x9664, 0xB0A3},{0x966A, 0xB3AD},{0x966B, 0xD849},{0x966C, 0xB3B5},{0x966D, 0xD848},{0x966F, 0xD84B},{0x9670, 0xB3B1},{0x9671, 0xD84A}, - {0x9672, 0xB6AB},{0x9673, 0xB3AF},{0x9674, 0xB3B2},{0x9675, 0xB3AE},{0x9676, 0xB3B3},{0x9677, 0xB3B4},{0x9678, 0xB3B0},{0x967C, 0xD847}, - {0x967D, 0xB6A7},{0x967E, 0xDC7D},{0x9680, 0xDCA3},{0x9683, 0xDCA2},{0x9684, 0xB6AC},{0x9685, 0xB6A8},{0x9686, 0xB6A9},{0x9687, 0xDC7C}, - {0x9688, 0xDC7E},{0x9689, 0xDCA1},{0x968A, 0xB6A4},{0x968B, 0xB6A6},{0x968D, 0xB6AA},{0x968E, 0xB6A5},{0x9691, 0xE0D3},{0x9692, 0xE0D1}, - {0x9693, 0xE0D2},{0x9694, 0xB96A},{0x9695, 0xB96B},{0x9697, 0xE0D4},{0x9698, 0xB969},{0x9699, 0xBBD8},{0x969B, 0xBBDA},{0x969C, 0xBBD9}, - {0x969E, 0xE4BB},{0x96A1, 0xE4BC},{0x96A2, 0xE8AB},{0x96A4, 0xE8AA},{0x96A7, 0xC047},{0x96A8, 0xC048},{0x96A9, 0xEC4F},{0x96AA, 0xC049}, - {0x96AC, 0xEEF6},{0x96AE, 0xEEF4},{0x96B0, 0xEEF5},{0x96B1, 0xC1F4},{0x96B3, 0xF16F},{0x96B4, 0xC3F7},{0x96B8, 0xC1F5},{0x96B9, 0xAB41}, - {0x96BB, 0xB0A6},{0x96BC, 0xD447},{0x96BF, 0xD84C},{0x96C0, 0xB3B6},{0x96C1, 0xB6AD},{0x96C2, 0xDCA4},{0x96C3, 0xDCA6},{0x96C4, 0xB6AF}, - {0x96C5, 0xB6AE},{0x96C6, 0xB6B0},{0x96C7, 0xB6B1},{0x96C8, 0xDCA5},{0x96C9, 0xB96E},{0x96CA, 0xB96F},{0x96CB, 0xB96D},{0x96CC, 0xBBDB}, - {0x96CD, 0xB96C},{0x96CE, 0xE0D5},{0x96D2, 0xBBDC},{0x96D3, 0xE8AC},{0x96D4, 0xEC50},{0x96D5, 0xC04A},{0x96D6, 0xC1F6},{0x96D7, 0xF170}, - {0x96D8, 0xF174},{0x96D9, 0xC2F9},{0x96DA, 0xF171},{0x96DB, 0xC2FA},{0x96DC, 0xC2F8},{0x96DD, 0xF175},{0x96DE, 0xC2FB},{0x96DF, 0xF173}, - {0x96E1, 0xF379},{0x96E2, 0xC2F7},{0x96E3, 0xC3F8},{0x96E5, 0xF8CD},{0x96E8, 0xAB42},{0x96E9, 0xB3B8},{0x96EA, 0xB3B7},{0x96EF, 0xB6B2}, - {0x96F0, 0xDCA8},{0x96F1, 0xDCA7},{0x96F2, 0xB6B3},{0x96F5, 0xE0D9},{0x96F6, 0xB973},{0x96F7, 0xB970},{0x96F8, 0xE0D8},{0x96F9, 0xB972}, - {0x96FA, 0xE0D6},{0x96FB, 0xB971},{0x96FD, 0xE0D7},{0x96FF, 0xE4BD},{0x9700, 0xBBDD},{0x9702, 0xE8AF},{0x9704, 0xBE5D},{0x9705, 0xE8AD}, - {0x9706, 0xBE5E},{0x9707, 0xBE5F},{0x9708, 0xE8AE},{0x9709, 0xBE60},{0x970B, 0xEC51},{0x970D, 0xC04E},{0x970E, 0xC04B},{0x970F, 0xC050}, - {0x9710, 0xEC53},{0x9711, 0xC04C},{0x9712, 0xEC52},{0x9713, 0xC04F},{0x9716, 0xC04D},{0x9718, 0xEEF9},{0x9719, 0xEEFB},{0x971C, 0xC1F7}, - {0x971D, 0xEEFA},{0x971E, 0xC1F8},{0x971F, 0xEEF8},{0x9720, 0xEEF7},{0x9722, 0xF177},{0x9723, 0xF176},{0x9724, 0xC2FC},{0x9725, 0xF178}, - {0x9726, 0xF37E},{0x9727, 0xC3FA},{0x9728, 0xF37D},{0x9729, 0xF37A},{0x972A, 0xC3F9},{0x972B, 0xF37B},{0x972C, 0xF37C},{0x972E, 0xF548}, - {0x972F, 0xF549},{0x9730, 0xC4C5},{0x9732, 0xC553},{0x9735, 0xF66E},{0x9738, 0xC551},{0x9739, 0xC552},{0x973A, 0xF66F},{0x973D, 0xC5B4}, - {0x973E, 0xC5B5},{0x973F, 0xF771},{0x9742, 0xC645},{0x9743, 0xF8CF},{0x9744, 0xC647},{0x9746, 0xF8CE},{0x9747, 0xF8D0},{0x9748, 0xC646}, - {0x9749, 0xF957},{0x974B, 0xF9AD},{0x9752, 0xAB43},{0x9756, 0xB974},{0x9758, 0xE4BE},{0x975A, 0xE8B0},{0x975B, 0xC051},{0x975C, 0xC052}, - {0x975E, 0xAB44},{0x9760, 0xBE61},{0x9761, 0xC3FB},{0x9762, 0xADB1},{0x9766, 0xC053},{0x9768, 0xC5E2},{0x9769, 0xADB2},{0x976A, 0xD84D}, - {0x976C, 0xDCA9},{0x976E, 0xDCAB},{0x9770, 0xDCAA},{0x9772, 0xE0DD},{0x9773, 0xE0DA},{0x9774, 0xB975},{0x9776, 0xB976},{0x9777, 0xE0DB}, - {0x9778, 0xE0DC},{0x977A, 0xE4C0},{0x977B, 0xE4C5},{0x977C, 0xBBDE},{0x977D, 0xE4BF},{0x977E, 0xE4C1},{0x977F, 0xE4C8},{0x9780, 0xE4C3}, - {0x9781, 0xE4C7},{0x9782, 0xE4C4},{0x9783, 0xE4C2},{0x9784, 0xE4C6},{0x9785, 0xBBDF},{0x9788, 0xE8B3},{0x978A, 0xE8B1},{0x978B, 0xBE63}, - {0x978D, 0xBE62},{0x978E, 0xE8B2},{0x978F, 0xBE64},{0x9794, 0xEC56},{0x9797, 0xEC55},{0x9798, 0xC054},{0x9799, 0xEC54},{0x979A, 0xEEFC}, - {0x979C, 0xEEFE},{0x979D, 0xEF41},{0x979E, 0xEF40},{0x97A0, 0xC1F9},{0x97A1, 0xEEFD},{0x97A2, 0xF1A1},{0x97A3, 0xC2FD},{0x97A4, 0xF17D}, - {0x97A5, 0xF1A2},{0x97A6, 0xC2FE},{0x97A8, 0xF17B},{0x97AA, 0xF17E},{0x97AB, 0xF17C},{0x97AC, 0xF179},{0x97AD, 0xC340},{0x97AE, 0xF17A}, - {0x97B3, 0xF3A1},{0x97B6, 0xF3A3},{0x97B7, 0xF3A2},{0x97B9, 0xF54A},{0x97BB, 0xF54B},{0x97BF, 0xF670},{0x97C1, 0xC5B7},{0x97C3, 0xC5B6}, - {0x97C4, 0xF84F},{0x97C5, 0xF850},{0x97C6, 0xC648},{0x97C7, 0xF8D1},{0x97C9, 0xC669},{0x97CB, 0xADB3},{0x97CC, 0xB6B4},{0x97CD, 0xE4CA}, - {0x97CE, 0xE4C9},{0x97CF, 0xE8B5},{0x97D0, 0xE8B4},{0x97D3, 0xC1FA},{0x97D4, 0xEF43},{0x97D5, 0xEF42},{0x97D6, 0xF1A5},{0x97D7, 0xF1A3}, - {0x97D8, 0xF1A6},{0x97D9, 0xF1A4},{0x97DC, 0xC3FC},{0x97DD, 0xF3A4},{0x97DE, 0xF3A5},{0x97DF, 0xF3A6},{0x97E1, 0xF671},{0x97E3, 0xF772}, - {0x97E5, 0xF8D2},{0x97ED, 0xADB4},{0x97F0, 0xEC57},{0x97F1, 0xEF44},{0x97F3, 0xADB5},{0x97F6, 0xBBE0},{0x97F8, 0xEC58},{0x97F9, 0xC341}, - {0x97FA, 0xF1A7},{0x97FB, 0xC3FD},{0x97FD, 0xF54C},{0x97FE, 0xF54D},{0x97FF, 0xC554},{0x9800, 0xF851},{0x9801, 0xADB6},{0x9802, 0xB3BB}, - {0x9803, 0xB3BC},{0x9804, 0xD84E},{0x9805, 0xB6B5},{0x9806, 0xB6B6},{0x9807, 0xDCAC},{0x9808, 0xB6B7},{0x980A, 0xB97A},{0x980C, 0xB97C}, - {0x980D, 0xE0DF},{0x980E, 0xE0E0},{0x980F, 0xE0DE},{0x9810, 0xB977},{0x9811, 0xB978},{0x9812, 0xB97B},{0x9813, 0xB979},{0x9816, 0xE4CB}, - {0x9817, 0xBBE1},{0x9818, 0xBBE2},{0x981B, 0xE8BC},{0x981C, 0xBE67},{0x981D, 0xE8B7},{0x981E, 0xE8B6},{0x9820, 0xE8BB},{0x9821, 0xBE65}, - {0x9824, 0xC05B},{0x9826, 0xE8B8},{0x9827, 0xE8BD},{0x9828, 0xE8BA},{0x9829, 0xE8B9},{0x982B, 0xBE66},{0x982D, 0xC059},{0x982F, 0xEC5A}, - {0x9830, 0xC055},{0x9832, 0xEC5B},{0x9835, 0xEC59},{0x9837, 0xC058},{0x9838, 0xC056},{0x9839, 0xC05A},{0x983B, 0xC057},{0x9841, 0xEF45}, - {0x9843, 0xEF4A},{0x9844, 0xEF46},{0x9845, 0xEF49},{0x9846, 0xC1FB},{0x9848, 0xEDD4},{0x9849, 0xEF48},{0x984A, 0xEF47},{0x984C, 0xC344}, - {0x984D, 0xC342},{0x984E, 0xC345},{0x984F, 0xC343},{0x9850, 0xF1A8},{0x9851, 0xF1A9},{0x9852, 0xF1AA},{0x9853, 0xC346},{0x9857, 0xF3AA}, - {0x9858, 0xC440},{0x9859, 0xF3A8},{0x985B, 0xC441},{0x985C, 0xF3A7},{0x985D, 0xF3A9},{0x985E, 0xC3FE},{0x985F, 0xF551},{0x9860, 0xF54E}, - {0x9862, 0xF54F},{0x9863, 0xF550},{0x9864, 0xF672},{0x9865, 0xC556},{0x9867, 0xC555},{0x9869, 0xF774},{0x986A, 0xF773},{0x986B, 0xC5B8}, - {0x986F, 0xC5E3},{0x9870, 0xC649},{0x9871, 0xC660},{0x9872, 0xF958},{0x9873, 0xF9AE},{0x9874, 0xF9AF},{0x98A8, 0xADB7},{0x98A9, 0xDCAD}, - {0x98AC, 0xE0E1},{0x98AD, 0xE4CC},{0x98AE, 0xE4CD},{0x98AF, 0xBBE3},{0x98B1, 0xBBE4},{0x98B2, 0xE8BE},{0x98B3, 0xBE68},{0x98B6, 0xC1FC}, - {0x98B8, 0xF1AB},{0x98BA, 0xC347},{0x98BB, 0xF3AD},{0x98BC, 0xC442},{0x98BD, 0xF3AC},{0x98BE, 0xF3AE},{0x98BF, 0xF3AB},{0x98C0, 0xF675}, - {0x98C1, 0xF552},{0x98C2, 0xF553},{0x98C4, 0xC4C6},{0x98C6, 0xF674},{0x98C9, 0xF673},{0x98CB, 0xF775},{0x98CC, 0xF9B0},{0x98DB, 0xADB8}, - {0x98DF, 0xADB9},{0x98E2, 0xB0A7},{0x98E3, 0xD448},{0x98E5, 0xD84F},{0x98E7, 0xB6B8},{0x98E9, 0xB6BB},{0x98EA, 0xB6B9},{0x98EB, 0xDCAE}, - {0x98ED, 0xB6BD},{0x98EF, 0xB6BA},{0x98F2, 0xB6BC},{0x98F4, 0xB97E},{0x98F6, 0xE0E2},{0x98F9, 0xE0E3},{0x98FA, 0xE8C0},{0x98FC, 0xB97D}, - {0x98FD, 0xB9A1},{0x98FE, 0xB9A2},{0x9900, 0xE4CF},{0x9902, 0xE4CE},{0x9903, 0xBBE5},{0x9905, 0xBBE6},{0x9907, 0xE4D0},{0x9908, 0xE8BF}, - {0x9909, 0xBBE8},{0x990A, 0xBE69},{0x990C, 0xBBE7},{0x9910, 0xC05C},{0x9911, 0xE8C1},{0x9912, 0xBE6B},{0x9913, 0xBE6A},{0x9914, 0xE8C2}, - {0x9915, 0xE8C5},{0x9916, 0xE8C3},{0x9917, 0xE8C4},{0x9918, 0xBE6C},{0x991A, 0xC061},{0x991B, 0xC05F},{0x991E, 0xC05E},{0x991F, 0xEC5D}, - {0x9921, 0xC060},{0x9924, 0xEC5C},{0x9925, 0xEF4B},{0x9927, 0xEC5E},{0x9928, 0xC05D},{0x9929, 0xEC5F},{0x992A, 0xEF4E},{0x992B, 0xEF4C}, - {0x992C, 0xEF4D},{0x992D, 0xEF52},{0x992E, 0xC34B},{0x992F, 0xEF51},{0x9930, 0xEF54},{0x9931, 0xEF53},{0x9932, 0xEF50},{0x9933, 0xEF4F}, - {0x9935, 0xC1FD},{0x993A, 0xF1AE},{0x993C, 0xF1AD},{0x993D, 0xC34A},{0x993E, 0xC348},{0x993F, 0xC349},{0x9941, 0xF1AC},{0x9943, 0xF3B1}, - {0x9945, 0xC443},{0x9947, 0xF3B0},{0x9948, 0xF3AF},{0x9949, 0xC444},{0x994B, 0xF558},{0x994C, 0xF557},{0x994E, 0xF555},{0x9950, 0xF554}, - {0x9951, 0xC4C8},{0x9952, 0xC4C7},{0x9953, 0xF559},{0x9954, 0xF776},{0x9955, 0xC5B9},{0x9956, 0xF677},{0x9957, 0xC557},{0x9958, 0xF676}, - {0x9959, 0xF556},{0x995B, 0xF777},{0x995C, 0xC5E4},{0x995E, 0xC661},{0x995F, 0xF959},{0x9961, 0xF9B1},{0x9996, 0xADBA},{0x9997, 0xD850}, - {0x9998, 0xEF55},{0x9999, 0xADBB},{0x999C, 0xE4D2},{0x999D, 0xE4D1},{0x999E, 0xEC60},{0x99A1, 0xEF57},{0x99A3, 0xEF56},{0x99A5, 0xC34C}, - {0x99A6, 0xF3B2},{0x99A7, 0xF3B3},{0x99A8, 0xC4C9},{0x99AB, 0xF9B2},{0x99AC, 0xB0A8},{0x99AD, 0xB6BF},{0x99AE, 0xB6BE},{0x99AF, 0xE0E4}, - {0x99B0, 0xE0E6},{0x99B1, 0xB9A4},{0x99B2, 0xE0E5},{0x99B3, 0xB9A3},{0x99B4, 0xB9A5},{0x99B5, 0xE0E7},{0x99B9, 0xE4D4},{0x99BA, 0xE4D6}, - {0x99BB, 0xE4D5},{0x99BD, 0xE4D8},{0x99C1, 0xBBE9},{0x99C2, 0xE4D7},{0x99C3, 0xE4D3},{0x99C7, 0xE4D9},{0x99C9, 0xE8CC},{0x99CB, 0xE8CF}, - {0x99CC, 0xE8D1},{0x99CD, 0xE8C7},{0x99CE, 0xE8CB},{0x99CF, 0xE8C8},{0x99D0, 0xBE6E},{0x99D1, 0xBE71},{0x99D2, 0xBE73},{0x99D3, 0xE8C9}, - {0x99D4, 0xE8CA},{0x99D5, 0xBE72},{0x99D6, 0xE8CD},{0x99D7, 0xE8D0},{0x99D8, 0xE8CE},{0x99D9, 0xBE74},{0x99DB, 0xBE70},{0x99DC, 0xE8C6}, - {0x99DD, 0xBE6D},{0x99DF, 0xBE6F},{0x99E2, 0xC063},{0x99E3, 0xEC66},{0x99E4, 0xEC64},{0x99E5, 0xEC63},{0x99E7, 0xEC69},{0x99E9, 0xEC68}, - {0x99EA, 0xEC67},{0x99EC, 0xEC62},{0x99ED, 0xC062},{0x99EE, 0xEC61},{0x99F0, 0xEC65},{0x99F1, 0xC064},{0x99F4, 0xEF5A},{0x99F6, 0xEF5E}, - {0x99F7, 0xEF5B},{0x99F8, 0xEF5D},{0x99F9, 0xEF5C},{0x99FA, 0xEF59},{0x99FB, 0xEF5F},{0x99FC, 0xEF62},{0x99FD, 0xEF60},{0x99FE, 0xEF61}, - {0x99FF, 0xC240},{0x9A01, 0xC1FE},{0x9A02, 0xEF58},{0x9A03, 0xEF63},{0x9A04, 0xF1B3},{0x9A05, 0xF1B6},{0x9A06, 0xF1B8},{0x9A07, 0xF1B7}, - {0x9A09, 0xF1B1},{0x9A0A, 0xF1B5},{0x9A0B, 0xF1B0},{0x9A0D, 0xF1B2},{0x9A0E, 0xC34D},{0x9A0F, 0xF1AF},{0x9A11, 0xF1B4},{0x9A14, 0xF3C0}, - {0x9A15, 0xF3B5},{0x9A16, 0xC445},{0x9A19, 0xC446},{0x9A1A, 0xF3B4},{0x9A1B, 0xF3B9},{0x9A1C, 0xF3BF},{0x9A1D, 0xF3B7},{0x9A1E, 0xF3BE}, - {0x9A20, 0xF3BB},{0x9A22, 0xF3BA},{0x9A23, 0xF3BD},{0x9A24, 0xF3B8},{0x9A25, 0xF3B6},{0x9A27, 0xF3BC},{0x9A29, 0xF560},{0x9A2A, 0xF55E}, - {0x9A2B, 0xC4CA},{0x9A2C, 0xF55D},{0x9A2D, 0xF563},{0x9A2E, 0xF561},{0x9A30, 0xC4CB},{0x9A31, 0xF55C},{0x9A32, 0xF55A},{0x9A34, 0xF55B}, - {0x9A35, 0xC4CD},{0x9A36, 0xF55F},{0x9A37, 0xC4CC},{0x9A38, 0xF562},{0x9A39, 0xF678},{0x9A3A, 0xF67E},{0x9A3D, 0xF679},{0x9A3E, 0xC55B}, - {0x9A3F, 0xF6A1},{0x9A40, 0xC55A},{0x9A41, 0xF67D},{0x9A42, 0xF67C},{0x9A43, 0xC559},{0x9A44, 0xF67B},{0x9A45, 0xC558},{0x9A46, 0xF67A}, - {0x9A48, 0xF77D},{0x9A49, 0xF7A1},{0x9A4A, 0xF77E},{0x9A4C, 0xF77B},{0x9A4D, 0xC5BB},{0x9A4E, 0xF778},{0x9A4F, 0xF77C},{0x9A50, 0xF7A3}, - {0x9A52, 0xF7A2},{0x9A53, 0xF779},{0x9A54, 0xF77A},{0x9A55, 0xC5BA},{0x9A56, 0xF852},{0x9A57, 0xC5E7},{0x9A59, 0xF853},{0x9A5A, 0xC5E5}, - {0x9A5B, 0xC5E6},{0x9A5E, 0xF8D3},{0x9A5F, 0xC64A},{0x9A60, 0xF976},{0x9A62, 0xC66A},{0x9A64, 0xF9B3},{0x9A65, 0xC66B},{0x9A66, 0xF9B4}, - {0x9A67, 0xF9B5},{0x9A68, 0xF9C3},{0x9A69, 0xF9C2},{0x9A6A, 0xC67A},{0x9A6B, 0xF9CD},{0x9AA8, 0xB0A9},{0x9AAB, 0xE0E9},{0x9AAD, 0xE0E8}, - {0x9AAF, 0xBBEA},{0x9AB0, 0xBBEB},{0x9AB1, 0xE4DA},{0x9AB3, 0xE8D2},{0x9AB4, 0xEC6C},{0x9AB7, 0xBE75},{0x9AB8, 0xC065},{0x9AB9, 0xEC6A}, - {0x9ABB, 0xEC6D},{0x9ABC, 0xC066},{0x9ABE, 0xEF64},{0x9ABF, 0xEC6B},{0x9AC0, 0xF1B9},{0x9AC1, 0xC34E},{0x9AC2, 0xF3C1},{0x9AC6, 0xF566}, - {0x9AC7, 0xF564},{0x9ACA, 0xF565},{0x9ACD, 0xF6A2},{0x9ACF, 0xC55C},{0x9AD0, 0xF7A4},{0x9AD1, 0xC5EA},{0x9AD2, 0xC5BC},{0x9AD3, 0xC5E8}, - {0x9AD4, 0xC5E9},{0x9AD5, 0xF8D4},{0x9AD6, 0xC662},{0x9AD8, 0xB0AA},{0x9ADC, 0xF1BA},{0x9ADF, 0xD449},{0x9AE1, 0xB9A6},{0x9AE3, 0xE4DB}, - {0x9AE6, 0xBBEC},{0x9AE7, 0xE4DC},{0x9AEB, 0xE8D4},{0x9AEC, 0xE8D3},{0x9AED, 0xC068},{0x9AEE, 0xBE76},{0x9AEF, 0xBE77},{0x9AF1, 0xE8D7}, - {0x9AF2, 0xE8D6},{0x9AF3, 0xE8D5},{0x9AF6, 0xEC6E},{0x9AF7, 0xEC71},{0x9AF9, 0xEC70},{0x9AFA, 0xEC6F},{0x9AFB, 0xC067},{0x9AFC, 0xEF68}, - {0x9AFD, 0xEF66},{0x9AFE, 0xEF65},{0x9B01, 0xEF67},{0x9B03, 0xC34F},{0x9B04, 0xF1BC},{0x9B05, 0xF1BD},{0x9B06, 0xC350},{0x9B08, 0xF1BB}, - {0x9B0A, 0xF3C3},{0x9B0B, 0xF3C2},{0x9B0C, 0xF3C5},{0x9B0D, 0xC447},{0x9B0E, 0xF3C4},{0x9B10, 0xF567},{0x9B11, 0xF569},{0x9B12, 0xF568}, - {0x9B15, 0xF6A3},{0x9B16, 0xF6A6},{0x9B17, 0xF6A4},{0x9B18, 0xF6A5},{0x9B19, 0xF7A5},{0x9B1A, 0xC5BD},{0x9B1E, 0xF854},{0x9B1F, 0xF855}, - {0x9B20, 0xF856},{0x9B22, 0xC64B},{0x9B23, 0xC663},{0x9B24, 0xF9B6},{0x9B25, 0xB0AB},{0x9B27, 0xBE78},{0x9B28, 0xC069},{0x9B29, 0xF1BE}, - {0x9B2B, 0xF7A6},{0x9B2E, 0xF9C4},{0x9B2F, 0xD44A},{0x9B31, 0xC67B},{0x9B32, 0xB0AC},{0x9B33, 0xEC72},{0x9B35, 0xF1BF},{0x9B37, 0xF3C6}, - {0x9B3A, 0xF6A7},{0x9B3B, 0xF7A7},{0x9B3C, 0xB0AD},{0x9B3E, 0xE4DD},{0x9B3F, 0xE4DE},{0x9B41, 0xBBED},{0x9B42, 0xBBEE},{0x9B43, 0xE8D9}, - {0x9B44, 0xBE7A},{0x9B45, 0xBE79},{0x9B46, 0xE8D8},{0x9B48, 0xEF69},{0x9B4A, 0xF1C0},{0x9B4B, 0xF1C2},{0x9B4C, 0xF1C1},{0x9B4D, 0xC353}, - {0x9B4E, 0xC352},{0x9B4F, 0xC351},{0x9B51, 0xC55E},{0x9B52, 0xF6A8},{0x9B54, 0xC55D},{0x9B55, 0xF7A9},{0x9B56, 0xF7A8},{0x9B58, 0xC64C}, - {0x9B59, 0xF8D5},{0x9B5A, 0xB3BD},{0x9B5B, 0xE0EA},{0x9B5F, 0xE4E1},{0x9B60, 0xE4DF},{0x9B61, 0xE4E0},{0x9B64, 0xE8E2},{0x9B66, 0xE8DD}, - {0x9B67, 0xE8DA},{0x9B68, 0xE8E1},{0x9B6C, 0xE8E3},{0x9B6F, 0xBE7C},{0x9B70, 0xE8E0},{0x9B71, 0xE8DC},{0x9B74, 0xE8DB},{0x9B75, 0xE8DF}, - {0x9B76, 0xE8DE},{0x9B77, 0xBE7B},{0x9B7A, 0xEC7D},{0x9B7B, 0xEC78},{0x9B7C, 0xEC76},{0x9B7D, 0xECA1},{0x9B7E, 0xEC77},{0x9B80, 0xEC73}, - {0x9B82, 0xEC79},{0x9B85, 0xEC74},{0x9B86, 0xEF72},{0x9B87, 0xEC75},{0x9B88, 0xECA2},{0x9B90, 0xEC7C},{0x9B91, 0xC06A},{0x9B92, 0xEC7B}, - {0x9B93, 0xEC7A},{0x9B95, 0xEC7E},{0x9B9A, 0xEF6A},{0x9B9B, 0xEF6D},{0x9B9E, 0xEF6C},{0x9BA0, 0xEF74},{0x9BA1, 0xEF6F},{0x9BA2, 0xEF73}, - {0x9BA4, 0xEF71},{0x9BA5, 0xEF70},{0x9BA6, 0xEF6E},{0x9BA8, 0xEF6B},{0x9BAA, 0xC243},{0x9BAB, 0xC242},{0x9BAD, 0xC244},{0x9BAE, 0xC241}, - {0x9BAF, 0xEF75},{0x9BB5, 0xF1C8},{0x9BB6, 0xF1CB},{0x9BB8, 0xF1C9},{0x9BB9, 0xF1CD},{0x9BBD, 0xF1CE},{0x9BBF, 0xF1C6},{0x9BC0, 0xC358}, - {0x9BC1, 0xF1C7},{0x9BC3, 0xF1C5},{0x9BC4, 0xF1CC},{0x9BC6, 0xF1C4},{0x9BC7, 0xF1C3},{0x9BC8, 0xC357},{0x9BC9, 0xC355},{0x9BCA, 0xC354}, - {0x9BD3, 0xF1CA},{0x9BD4, 0xF3CF},{0x9BD5, 0xF3D5},{0x9BD6, 0xC44A},{0x9BD7, 0xF3D0},{0x9BD9, 0xF3D3},{0x9BDA, 0xF3D7},{0x9BDB, 0xC44B}, - {0x9BDC, 0xF3D2},{0x9BDE, 0xF3CA},{0x9BE0, 0xF3C9},{0x9BE1, 0xF3D6},{0x9BE2, 0xF3CD},{0x9BE4, 0xF3CB},{0x9BE5, 0xF3D4},{0x9BE6, 0xF3CC}, - {0x9BE7, 0xC449},{0x9BE8, 0xC448},{0x9BEA, 0xF3C7},{0x9BEB, 0xF3C8},{0x9BEC, 0xF3D1},{0x9BF0, 0xF3CE},{0x9BF7, 0xF56C},{0x9BF8, 0xF56F}, - {0x9BFD, 0xC356},{0x9C05, 0xF56D},{0x9C06, 0xF573},{0x9C07, 0xF571},{0x9C08, 0xF56B},{0x9C09, 0xF576},{0x9C0B, 0xF56A},{0x9C0D, 0xC4CF}, - {0x9C0E, 0xF572},{0x9C12, 0xF56E},{0x9C13, 0xC4CE},{0x9C14, 0xF575},{0x9C17, 0xF574},{0x9C1C, 0xF6AB},{0x9C1D, 0xF6AA},{0x9C21, 0xF6B1}, - {0x9C23, 0xF6AD},{0x9C24, 0xF6B0},{0x9C25, 0xC560},{0x9C28, 0xF6AE},{0x9C29, 0xF6AF},{0x9C2B, 0xF6A9},{0x9C2C, 0xF6AC},{0x9C2D, 0xC55F}, - {0x9C31, 0xC5BF},{0x9C32, 0xF7B4},{0x9C33, 0xF7AF},{0x9C34, 0xF7B3},{0x9C36, 0xF7B6},{0x9C37, 0xF7B2},{0x9C39, 0xF7AE},{0x9C3B, 0xC5C1}, - {0x9C3C, 0xF7B1},{0x9C3D, 0xF7B5},{0x9C3E, 0xC5C0},{0x9C3F, 0xF7AC},{0x9C40, 0xF570},{0x9C41, 0xF7B0},{0x9C44, 0xF7AD},{0x9C46, 0xF7AA}, - {0x9C48, 0xF7AB},{0x9C49, 0xC5BE},{0x9C4A, 0xF85A},{0x9C4B, 0xF85C},{0x9C4C, 0xF85F},{0x9C4D, 0xF85B},{0x9C4E, 0xF860},{0x9C50, 0xF859}, - {0x9C52, 0xF857},{0x9C54, 0xC5EB},{0x9C55, 0xF85D},{0x9C56, 0xC5ED},{0x9C57, 0xC5EC},{0x9C58, 0xF858},{0x9C59, 0xF85E},{0x9C5E, 0xF8DA}, - {0x9C5F, 0xC64D},{0x9C60, 0xF8DB},{0x9C62, 0xF8D9},{0x9C63, 0xF8D6},{0x9C66, 0xF8D8},{0x9C67, 0xF8D7},{0x9C68, 0xF95A},{0x9C6D, 0xF95C}, - {0x9C6E, 0xF95B},{0x9C71, 0xF979},{0x9C73, 0xF978},{0x9C74, 0xF977},{0x9C75, 0xF97A},{0x9C77, 0xC673},{0x9C78, 0xC674},{0x9C79, 0xF9CA}, - {0x9C7A, 0xF9CE},{0x9CE5, 0xB3BE},{0x9CE6, 0xDCAF},{0x9CE7, 0xE0ED},{0x9CE9, 0xB9A7},{0x9CEA, 0xE0EB},{0x9CED, 0xE0EC},{0x9CF1, 0xE4E2}, - {0x9CF2, 0xE4E3},{0x9CF3, 0xBBF1},{0x9CF4, 0xBBEF},{0x9CF5, 0xE4E4},{0x9CF6, 0xBBF0},{0x9CF7, 0xE8E8},{0x9CF9, 0xE8EB},{0x9CFA, 0xE8E5}, - {0x9CFB, 0xE8EC},{0x9CFC, 0xE8E4},{0x9CFD, 0xE8E6},{0x9CFF, 0xE8E7},{0x9D00, 0xE8EA},{0x9D03, 0xBEA1},{0x9D04, 0xE8EF},{0x9D05, 0xE8EE}, - {0x9D06, 0xBE7D},{0x9D07, 0xE8E9},{0x9D08, 0xE8ED},{0x9D09, 0xBE7E},{0x9D10, 0xECAC},{0x9D12, 0xC06F},{0x9D14, 0xECA7},{0x9D15, 0xC06B}, - {0x9D17, 0xECA4},{0x9D18, 0xECAA},{0x9D19, 0xECAD},{0x9D1B, 0xC070},{0x9D1D, 0xECA9},{0x9D1E, 0xECA6},{0x9D1F, 0xECAE},{0x9D20, 0xECA5}, - {0x9D22, 0xECAB},{0x9D23, 0xC06C},{0x9D25, 0xECA3},{0x9D26, 0xC06D},{0x9D28, 0xC06E},{0x9D29, 0xECA8},{0x9D2D, 0xEFA9},{0x9D2E, 0xEF7A}, - {0x9D2F, 0xEF7B},{0x9D30, 0xEF7E},{0x9D31, 0xEF7C},{0x9D33, 0xEF76},{0x9D36, 0xEF79},{0x9D37, 0xEFA5},{0x9D38, 0xEF7D},{0x9D3B, 0xC245}, - {0x9D3D, 0xEFA7},{0x9D3E, 0xEFA4},{0x9D3F, 0xC246},{0x9D40, 0xEFA6},{0x9D41, 0xEF77},{0x9D42, 0xEFA2},{0x9D43, 0xEFA3},{0x9D45, 0xEFA1}, - {0x9D4A, 0xF1D2},{0x9D4B, 0xF1D4},{0x9D4C, 0xF1D7},{0x9D4F, 0xF1D1},{0x9D51, 0xC359},{0x9D52, 0xF1D9},{0x9D53, 0xF1D0},{0x9D54, 0xF1DA}, - {0x9D56, 0xF1D6},{0x9D57, 0xF1D8},{0x9D58, 0xF1DC},{0x9D59, 0xF1D5},{0x9D5A, 0xF1DD},{0x9D5B, 0xF1D3},{0x9D5C, 0xF1CF},{0x9D5D, 0xC35A}, - {0x9D5F, 0xF1DB},{0x9D60, 0xC35B},{0x9D61, 0xC44D},{0x9D67, 0xEF78},{0x9D68, 0xF3F1},{0x9D69, 0xF3E8},{0x9D6A, 0xC44F},{0x9D6B, 0xF3E4}, - {0x9D6C, 0xC450},{0x9D6F, 0xF3ED},{0x9D70, 0xF3E7},{0x9D71, 0xF3DD},{0x9D72, 0xC44E},{0x9D73, 0xF3EA},{0x9D74, 0xF3E5},{0x9D75, 0xF3E6}, - {0x9D77, 0xF3D8},{0x9D78, 0xF3DF},{0x9D79, 0xF3EE},{0x9D7B, 0xF3EB},{0x9D7D, 0xF3E3},{0x9D7F, 0xF3EF},{0x9D80, 0xF3DE},{0x9D81, 0xF3D9}, - {0x9D82, 0xF3EC},{0x9D84, 0xF3DB},{0x9D85, 0xF3E9},{0x9D86, 0xF3E0},{0x9D87, 0xF3F0},{0x9D88, 0xF3DC},{0x9D89, 0xC44C},{0x9D8A, 0xF3DA}, - {0x9D8B, 0xF3E1},{0x9D8C, 0xF3E2},{0x9D90, 0xF57D},{0x9D92, 0xF57B},{0x9D94, 0xF5A2},{0x9D96, 0xF5AE},{0x9D97, 0xF5A5},{0x9D98, 0xF57C}, - {0x9D99, 0xF578},{0x9D9A, 0xF5A7},{0x9D9B, 0xF57E},{0x9D9C, 0xF5A3},{0x9D9D, 0xF57A},{0x9D9E, 0xF5AA},{0x9D9F, 0xF577},{0x9DA0, 0xF5A1}, - {0x9DA1, 0xF5A6},{0x9DA2, 0xF5A8},{0x9DA3, 0xF5AB},{0x9DA4, 0xF579},{0x9DA6, 0xF5AF},{0x9DA7, 0xF5B0},{0x9DA8, 0xF5A9},{0x9DA9, 0xF5AD}, - {0x9DAA, 0xF5A4},{0x9DAC, 0xF6C1},{0x9DAD, 0xF6C4},{0x9DAF, 0xC561},{0x9DB1, 0xF6C3},{0x9DB2, 0xF6C8},{0x9DB3, 0xF6C6},{0x9DB4, 0xC562}, - {0x9DB5, 0xF6BD},{0x9DB6, 0xF6B3},{0x9DB7, 0xF6B2},{0x9DB8, 0xC564},{0x9DB9, 0xF6BF},{0x9DBA, 0xF6C0},{0x9DBB, 0xF6BC},{0x9DBC, 0xF6B4}, - {0x9DBE, 0xF6B9},{0x9DBF, 0xF5AC},{0x9DC1, 0xF6B5},{0x9DC2, 0xC563},{0x9DC3, 0xF6BB},{0x9DC5, 0xF6BA},{0x9DC7, 0xF6B6},{0x9DC8, 0xF6C2}, - {0x9DCA, 0xF6B7},{0x9DCB, 0xF7BB},{0x9DCC, 0xF6C5},{0x9DCD, 0xF6C7},{0x9DCE, 0xF6BE},{0x9DCF, 0xF6B8},{0x9DD0, 0xF7BC},{0x9DD1, 0xF7BE}, - {0x9DD2, 0xF7B8},{0x9DD3, 0xC5C2},{0x9DD5, 0xF7C5},{0x9DD6, 0xF7C3},{0x9DD7, 0xC5C3},{0x9DD8, 0xF7C2},{0x9DD9, 0xF7C1},{0x9DDA, 0xF7BA}, - {0x9DDB, 0xF7B7},{0x9DDC, 0xF7BD},{0x9DDD, 0xF7C6},{0x9DDE, 0xF7B9},{0x9DDF, 0xF7BF},{0x9DE1, 0xF869},{0x9DE2, 0xF86E},{0x9DE3, 0xF864}, - {0x9DE4, 0xF867},{0x9DE5, 0xC5EE},{0x9DE6, 0xF86B},{0x9DE8, 0xF872},{0x9DE9, 0xF7C0},{0x9DEB, 0xF865},{0x9DEC, 0xF86F},{0x9DED, 0xF873}, - {0x9DEE, 0xF86A},{0x9DEF, 0xF863},{0x9DF0, 0xF86D},{0x9DF2, 0xF86C},{0x9DF3, 0xF871},{0x9DF4, 0xF870},{0x9DF5, 0xF7C4},{0x9DF6, 0xF868}, - {0x9DF7, 0xF862},{0x9DF8, 0xF866},{0x9DF9, 0xC64E},{0x9DFA, 0xC64F},{0x9DFB, 0xF861},{0x9DFD, 0xF8E6},{0x9DFE, 0xF8DD},{0x9DFF, 0xF8E5}, - {0x9E00, 0xF8E2},{0x9E01, 0xF8E3},{0x9E02, 0xF8DC},{0x9E03, 0xF8DF},{0x9E04, 0xF8E7},{0x9E05, 0xF8E1},{0x9E06, 0xF8E0},{0x9E07, 0xF8DE}, - {0x9E09, 0xF8E4},{0x9E0B, 0xF95D},{0x9E0D, 0xF95E},{0x9E0F, 0xF960},{0x9E10, 0xF95F},{0x9E11, 0xF962},{0x9E12, 0xF961},{0x9E13, 0xF97C}, - {0x9E14, 0xF97B},{0x9E15, 0xF9B7},{0x9E17, 0xF9B8},{0x9E19, 0xF9C5},{0x9E1A, 0xC678},{0x9E1B, 0xC67C},{0x9E1D, 0xF9CF},{0x9E1E, 0xC67D}, - {0x9E75, 0xB3BF},{0x9E79, 0xC4D0},{0x9E7A, 0xF6C9},{0x9E7C, 0xC650},{0x9E7D, 0xC651},{0x9E7F, 0xB3C0},{0x9E80, 0xE0EE},{0x9E82, 0xB9A8}, - {0x9E83, 0xE8F0},{0x9E86, 0xECB0},{0x9E87, 0xECB1},{0x9E88, 0xECAF},{0x9E89, 0xEFAB},{0x9E8A, 0xEFAA},{0x9E8B, 0xC247},{0x9E8C, 0xF1DF}, - {0x9E8D, 0xEFAC},{0x9E8E, 0xF1DE},{0x9E91, 0xF3F3},{0x9E92, 0xC451},{0x9E93, 0xC453},{0x9E94, 0xF3F2},{0x9E97, 0xC452},{0x9E99, 0xF5B1}, - {0x9E9A, 0xF5B3},{0x9E9B, 0xF5B2},{0x9E9C, 0xF6CA},{0x9E9D, 0xC565},{0x9E9F, 0xC5EF},{0x9EA0, 0xF8E8},{0x9EA1, 0xF963},{0x9EA4, 0xF9D2}, - {0x9EA5, 0xB3C1},{0x9EA7, 0xE4E5},{0x9EA9, 0xBEA2},{0x9EAD, 0xECB3},{0x9EAE, 0xECB2},{0x9EB0, 0xEFAD},{0x9EB4, 0xC454},{0x9EB5, 0xC4D1}, - {0x9EB6, 0xF7C7},{0x9EB7, 0xF9CB},{0x9EBB, 0xB3C2},{0x9EBC, 0xBBF2},{0x9EBE, 0xBEA3},{0x9EC0, 0xF3F4},{0x9EC2, 0xF874},{0x9EC3, 0xB6C0}, - {0x9EC8, 0xEFAE},{0x9ECC, 0xC664},{0x9ECD, 0xB6C1},{0x9ECE, 0xBEA4},{0x9ECF, 0xC248},{0x9ED0, 0xF875},{0x9ED1, 0xB6C2},{0x9ED3, 0xE8F1}, - {0x9ED4, 0xC072},{0x9ED5, 0xECB4},{0x9ED6, 0xECB5},{0x9ED8, 0xC071},{0x9EDA, 0xEFAF},{0x9EDB, 0xC24C},{0x9EDC, 0xC24A},{0x9EDD, 0xC24B}, - {0x9EDE, 0xC249},{0x9EDF, 0xF1E0},{0x9EE0, 0xC35C},{0x9EE4, 0xF5B5},{0x9EE5, 0xF5B4},{0x9EE6, 0xF5B7},{0x9EE7, 0xF5B6},{0x9EE8, 0xC4D2}, - {0x9EEB, 0xF6CB},{0x9EED, 0xF6CD},{0x9EEE, 0xF6CC},{0x9EEF, 0xC566},{0x9EF0, 0xF7C8},{0x9EF2, 0xF876},{0x9EF3, 0xF877},{0x9EF4, 0xC5F0}, - {0x9EF5, 0xF964},{0x9EF6, 0xF97D},{0x9EF7, 0xC675},{0x9EF9, 0xDCB0},{0x9EFA, 0xECB6},{0x9EFB, 0xEFB0},{0x9EFC, 0xF3F5},{0x9EFD, 0xE0EF}, - {0x9EFF, 0xEFB1},{0x9F00, 0xF1E2},{0x9F01, 0xF1E1},{0x9F06, 0xF878},{0x9F07, 0xC652},{0x9F09, 0xF965},{0x9F0A, 0xF97E},{0x9F0E, 0xB9A9}, - {0x9F0F, 0xE8F2},{0x9F10, 0xE8F3},{0x9F12, 0xECB7},{0x9F13, 0xB9AA},{0x9F15, 0xC35D},{0x9F16, 0xF1E3},{0x9F18, 0xF6CF},{0x9F19, 0xC567}, - {0x9F1A, 0xF6D0},{0x9F1B, 0xF6CE},{0x9F1C, 0xF879},{0x9F1E, 0xF8E9},{0x9F20, 0xB9AB},{0x9F22, 0xEFB4},{0x9F23, 0xEFB3},{0x9F24, 0xEFB2}, - {0x9F25, 0xF1E4},{0x9F28, 0xF1E8},{0x9F29, 0xF1E7},{0x9F2A, 0xF1E6},{0x9F2B, 0xF1E5},{0x9F2C, 0xC35E},{0x9F2D, 0xF3F6},{0x9F2E, 0xF5B9}, - {0x9F2F, 0xC4D3},{0x9F30, 0xF5B8},{0x9F31, 0xF6D1},{0x9F32, 0xF7CB},{0x9F33, 0xF7CA},{0x9F34, 0xC5C4},{0x9F35, 0xF7C9},{0x9F36, 0xF87C}, - {0x9F37, 0xF87B},{0x9F38, 0xF87A},{0x9F3B, 0xBBF3},{0x9F3D, 0xECB8},{0x9F3E, 0xC24D},{0x9F40, 0xF3F7},{0x9F41, 0xF3F8},{0x9F42, 0xF7CC}, - {0x9F43, 0xF87D},{0x9F46, 0xF8EA},{0x9F47, 0xF966},{0x9F48, 0xF9B9},{0x9F49, 0xF9D4},{0x9F4A, 0xBBF4},{0x9F4B, 0xC24E},{0x9F4C, 0xF1E9}, - {0x9F4D, 0xF3F9},{0x9F4E, 0xF6D2},{0x9F4F, 0xF87E},{0x9F52, 0xBEA6},{0x9F54, 0xEFB5},{0x9F55, 0xF1EA},{0x9F56, 0xF3FA},{0x9F57, 0xF3FB}, - {0x9F58, 0xF3FC},{0x9F59, 0xF5BE},{0x9F5B, 0xF5BA},{0x9F5C, 0xC568},{0x9F5D, 0xF5BD},{0x9F5E, 0xF5BC},{0x9F5F, 0xC4D4},{0x9F60, 0xF5BB}, - {0x9F61, 0xC4D6},{0x9F63, 0xC4D5},{0x9F64, 0xF6D4},{0x9F65, 0xF6D3},{0x9F66, 0xC569},{0x9F67, 0xC56A},{0x9F6A, 0xC5C6},{0x9F6B, 0xF7CD}, - {0x9F6C, 0xC5C5},{0x9F6E, 0xF8A3},{0x9F6F, 0xF8A4},{0x9F70, 0xF8A2},{0x9F71, 0xF8A1},{0x9F72, 0xC654},{0x9F74, 0xF8EB},{0x9F75, 0xF8EC}, - {0x9F76, 0xF8ED},{0x9F77, 0xC653},{0x9F78, 0xF967},{0x9F79, 0xF96A},{0x9F7A, 0xF969},{0x9F7B, 0xF968},{0x9F7E, 0xF9D3},{0x9F8D, 0xC073}, - {0x9F90, 0xC365},{0x9F91, 0xF5BF},{0x9F92, 0xF6D5},{0x9F94, 0xC5C7},{0x9F95, 0xF7CE},{0x9F98, 0xF9D5},{0x9F9C, 0xC074},{0x9FA0, 0xEFB6}, - {0x9FA2, 0xF7CF},{0x9FA4, 0xF9A1},{0xFA0C, 0xC94A},{0xFA0D, 0xDDFC},{0xFE30, 0xA14A},{0xFE31, 0xA157},{0xFE33, 0xA159},{0xFE34, 0xA15B}, - {0xFE35, 0xA15F},{0xFE36, 0xA160},{0xFE37, 0xA163},{0xFE38, 0xA164},{0xFE39, 0xA167},{0xFE3A, 0xA168},{0xFE3B, 0xA16B},{0xFE3C, 0xA16C}, - {0xFE3D, 0xA16F},{0xFE3E, 0xA170},{0xFE3F, 0xA173},{0xFE40, 0xA174},{0xFE41, 0xA177},{0xFE42, 0xA178},{0xFE43, 0xA17B},{0xFE44, 0xA17C}, - {0xFE49, 0xA1C6},{0xFE4A, 0xA1C7},{0xFE4B, 0xA1CA},{0xFE4C, 0xA1CB},{0xFE4D, 0xA1C8},{0xFE4E, 0xA1C9},{0xFE4F, 0xA15C},{0xFE50, 0xA14D}, - {0xFE52, 0xA14F},{0xFE54, 0xA151},{0xFE55, 0xA152},{0xFE56, 0xA153},{0xFE57, 0xA154},{0xFE59, 0xA17D},{0xFE5A, 0xA17E},{0xFE5B, 0xA1A1}, - {0xFE5C, 0xA1A2},{0xFE5D, 0xA1A3},{0xFE5E, 0xA1A4},{0xFE5F, 0xA1CC},{0xFE60, 0xA1CD},{0xFE61, 0xA1CE},{0xFE62, 0xA1DE},{0xFE63, 0xA1DF}, - {0xFE64, 0xA1E0},{0xFE65, 0xA1E1},{0xFE66, 0xA1E2},{0xFE69, 0xA24C},{0xFE6A, 0xA24D},{0xFE6B, 0xA24E},{0xFF01, 0xA149},{0xFF03, 0xA1AD}, - {0xFF04, 0xA243},{0xFF05, 0xA248},{0xFF06, 0xA1AE},{0xFF08, 0xA15D},{0xFF09, 0xA15E},{0xFF0A, 0xA1AF},{0xFF0B, 0xA1CF},{0xFF0C, 0xA141}, - {0xFF0D, 0xA1D0},{0xFF0E, 0xA144},{0xFF0F, 0xA241},{0xFF10, 0xA2AF},{0xFF11, 0xA2B0},{0xFF12, 0xA2B1},{0xFF13, 0xA2B2},{0xFF14, 0xA2B3}, - {0xFF15, 0xA2B4},{0xFF16, 0xA2B5},{0xFF17, 0xA2B6},{0xFF18, 0xA2B7},{0xFF19, 0xA2B8},{0xFF1A, 0xA147},{0xFF1B, 0xA146},{0xFF1C, 0xA1D5}, - {0xFF1D, 0xA1D7},{0xFF1E, 0xA1D6},{0xFF1F, 0xA148},{0xFF20, 0xA249},{0xFF21, 0xA2CF},{0xFF22, 0xA2D0},{0xFF23, 0xA2D1},{0xFF24, 0xA2D2}, - {0xFF25, 0xA2D3},{0xFF26, 0xA2D4},{0xFF27, 0xA2D5},{0xFF28, 0xA2D6},{0xFF29, 0xA2D7},{0xFF2A, 0xA2D8},{0xFF2B, 0xA2D9},{0xFF2C, 0xA2DA}, - {0xFF2D, 0xA2DB},{0xFF2E, 0xA2DC},{0xFF2F, 0xA2DD},{0xFF30, 0xA2DE},{0xFF31, 0xA2DF},{0xFF32, 0xA2E0},{0xFF33, 0xA2E1},{0xFF34, 0xA2E2}, - {0xFF35, 0xA2E3},{0xFF36, 0xA2E4},{0xFF37, 0xA2E5},{0xFF38, 0xA2E6},{0xFF39, 0xA2E7},{0xFF3A, 0xA2E8},{0xFF3C, 0xA242},{0xFF3F, 0xA1C4}, - {0xFF41, 0xA2E9},{0xFF42, 0xA2EA},{0xFF43, 0xA2EB},{0xFF44, 0xA2EC},{0xFF45, 0xA2ED},{0xFF46, 0xA2EE},{0xFF47, 0xA2EF},{0xFF48, 0xA2F0}, - {0xFF49, 0xA2F1},{0xFF4A, 0xA2F2},{0xFF4B, 0xA2F3},{0xFF4C, 0xA2F4},{0xFF4D, 0xA2F5},{0xFF4E, 0xA2F6},{0xFF4F, 0xA2F7},{0xFF50, 0xA2F8}, - {0xFF51, 0xA2F9},{0xFF52, 0xA2FA},{0xFF53, 0xA2FB},{0xFF54, 0xA2FC},{0xFF55, 0xA2FD},{0xFF56, 0xA2FE},{0xFF57, 0xA340},{0xFF58, 0xA341}, - {0xFF59, 0xA342},{0xFF5A, 0xA343},{0xFF5B, 0xA161},{0xFF5C, 0xA155},{0xFF5D, 0xA162},{0xFF64, 0xA14E} -}; diff --git a/vcl/source/fontsubset/u2johab.inc b/vcl/source/fontsubset/u2johab.inc deleted file mode 100644 index f7a75afaf503..000000000000 --- a/vcl/source/fontsubset/u2johab.inc +++ /dev/null @@ -1,2174 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// use generic RTL_TEXTENCODING_JOHAB to get rid of this file - -sal_uInt16pair xlat_1_6[17141] = { - {0x0020, 0x0020},{0x0021, 0x0021},{0x0022, 0x0022},{0x0023, 0x0023},{0x0024, 0x0024},{0x0025, 0x0025},{0x0026, 0x0026},{0x0027, 0x0027}, - {0x0028, 0x0028},{0x0029, 0x0029},{0x002A, 0x002A},{0x002B, 0x002B},{0x002C, 0x002C},{0x002D, 0x002D},{0x002E, 0x002E},{0x002F, 0x002F}, - {0x0030, 0x0030},{0x0031, 0x0031},{0x0032, 0x0032},{0x0033, 0x0033},{0x0034, 0x0034},{0x0035, 0x0035},{0x0036, 0x0036},{0x0037, 0x0037}, - {0x0038, 0x0038},{0x0039, 0x0039},{0x003A, 0x003A},{0x003B, 0x003B},{0x003C, 0x003C},{0x003D, 0x003D},{0x003E, 0x003E},{0x003F, 0x003F}, - {0x0040, 0x0040},{0x0041, 0x0041},{0x0042, 0x0042},{0x0043, 0x0043},{0x0044, 0x0044},{0x0045, 0x0045},{0x0046, 0x0046},{0x0047, 0x0047}, - {0x0048, 0x0048},{0x0049, 0x0049},{0x004A, 0x004A},{0x004B, 0x004B},{0x004C, 0x004C},{0x004D, 0x004D},{0x004E, 0x004E},{0x004F, 0x004F}, - {0x0050, 0x0050},{0x0051, 0x0051},{0x0052, 0x0052},{0x0053, 0x0053},{0x0054, 0x0054},{0x0055, 0x0055},{0x0056, 0x0056},{0x0057, 0x0057}, - {0x0058, 0x0058},{0x0059, 0x0059},{0x005A, 0x005A},{0x005B, 0x005B},{0x005C, 0x005C},{0x005D, 0x005D},{0x005E, 0x005E},{0x005F, 0x005F}, - {0x0060, 0x0060},{0x0061, 0x0061},{0x0062, 0x0062},{0x0063, 0x0063},{0x0064, 0x0064},{0x0065, 0x0065},{0x0066, 0x0066},{0x0067, 0x0067}, - {0x0068, 0x0068},{0x0069, 0x0069},{0x006A, 0x006A},{0x006B, 0x006B},{0x006C, 0x006C},{0x006D, 0x006D},{0x006E, 0x006E},{0x006F, 0x006F}, - {0x0070, 0x0070},{0x0071, 0x0071},{0x0072, 0x0072},{0x0073, 0x0073},{0x0074, 0x0074},{0x0075, 0x0075},{0x0076, 0x0076},{0x0077, 0x0077}, - {0x0078, 0x0078},{0x0079, 0x0079},{0x007A, 0x007A},{0x007B, 0x007B},{0x007C, 0x007C},{0x007D, 0x007D},{0x007E, 0x007E},{0x00A1, 0xA2AE}, - {0x00A4, 0xA2B4},{0x00A7, 0xA1D7},{0x00A8, 0xA1A7},{0x00AA, 0xA8A3},{0x00AD, 0xA1A9},{0x00B0, 0xA1C6},{0x00B1, 0xA1BE},{0x00B2, 0xA9F7}, - {0x00B3, 0xA9F8},{0x00B4, 0xA2A5},{0x00B6, 0xA2D2},{0x00B7, 0xA1A4},{0x00B8, 0xA2AC},{0x00B9, 0xA9F6},{0x00BA, 0xA8AC},{0x00BC, 0xA8F9}, - {0x00BD, 0xA8F6},{0x00BE, 0xA8FA},{0x00BF, 0xA2AF},{0x00C6, 0xA8A1},{0x00D0, 0xA8A2},{0x00D7, 0xA1BF},{0x00D8, 0xA8AA},{0x00DE, 0xA8AD}, - {0x00DF, 0xA9AC},{0x00E6, 0xA9A1},{0x00F0, 0xA9A3},{0x00F7, 0xA1C0},{0x00F8, 0xA9AA},{0x00FE, 0xA9AD},{0x0111, 0xA9A2},{0x0126, 0xA8A4}, - {0x0127, 0xA9A4},{0x0131, 0xA9A5},{0x0132, 0xA8A6},{0x0133, 0xA9A6},{0x0138, 0xA9A7},{0x013F, 0xA8A8},{0x0140, 0xA9A8},{0x0141, 0xA8A9}, - {0x0142, 0xA9A9},{0x0149, 0xA9B0},{0x014A, 0xA8AF},{0x014B, 0xA9AF},{0x0152, 0xA8AB},{0x0153, 0xA9AB},{0x0166, 0xA8AE},{0x0167, 0xA9AE}, - {0x02C7, 0xA2A7},{0x02D0, 0xA2B0},{0x02D8, 0xA2A8},{0x02D9, 0xA2AB},{0x02DA, 0xA2AA},{0x02DB, 0xA2AD},{0x02DD, 0xA2A9},{0x0391, 0xA5C1}, - {0x0392, 0xA5C2},{0x0393, 0xA5C3},{0x0394, 0xA5C4},{0x0395, 0xA5C5},{0x0396, 0xA5C6},{0x0397, 0xA5C7},{0x0398, 0xA5C8},{0x0399, 0xA5C9}, - {0x039A, 0xA5CA},{0x039B, 0xA5CB},{0x039C, 0xA5CC},{0x039D, 0xA5CD},{0x039E, 0xA5CE},{0x039F, 0xA5CF},{0x03A0, 0xA5D0},{0x03A1, 0xA5D1}, - {0x03A3, 0xA5D2},{0x03A4, 0xA5D3},{0x03A5, 0xA5D4},{0x03A6, 0xA5D5},{0x03A7, 0xA5D6},{0x03A8, 0xA5D7},{0x03A9, 0xA5D8},{0x03B1, 0xA5E1}, - {0x03B2, 0xA5E2},{0x03B3, 0xA5E3},{0x03B4, 0xA5E4},{0x03B5, 0xA5E5},{0x03B6, 0xA5E6},{0x03B7, 0xA5E7},{0x03B8, 0xA5E8},{0x03B9, 0xA5E9}, - {0x03BA, 0xA5EA},{0x03BB, 0xA5EB},{0x03BC, 0xA5EC},{0x03BD, 0xA5ED},{0x03BE, 0xA5EE},{0x03BF, 0xA5EF},{0x03C0, 0xA5F0},{0x03C1, 0xA5F1}, - {0x03C3, 0xA5F2},{0x03C4, 0xA5F3},{0x03C5, 0xA5F4},{0x03C6, 0xA5F5},{0x03C7, 0xA5F6},{0x03C8, 0xA5F7},{0x03C9, 0xA5F8},{0x0401, 0xACA7}, - {0x0410, 0xACA1},{0x0411, 0xACA2},{0x0412, 0xACA3},{0x0413, 0xACA4},{0x0414, 0xACA5},{0x0415, 0xACA6},{0x0416, 0xACA8},{0x0417, 0xACA9}, - {0x0418, 0xACAA},{0x0419, 0xACAB},{0x041A, 0xACAC},{0x041B, 0xACAD},{0x041C, 0xACAE},{0x041D, 0xACAF},{0x041E, 0xACB0},{0x041F, 0xACB1}, - {0x0420, 0xACB2},{0x0421, 0xACB3},{0x0422, 0xACB4},{0x0423, 0xACB5},{0x0424, 0xACB6},{0x0425, 0xACB7},{0x0426, 0xACB8},{0x0427, 0xACB9}, - {0x0428, 0xACBA},{0x0429, 0xACBB},{0x042A, 0xACBC},{0x042B, 0xACBD},{0x042C, 0xACBE},{0x042D, 0xACBF},{0x042E, 0xACC0},{0x042F, 0xACC1}, - {0x0430, 0xACD1},{0x0431, 0xACD2},{0x0432, 0xACD3},{0x0433, 0xACD4},{0x0434, 0xACD5},{0x0435, 0xACD6},{0x0436, 0xACD8},{0x0437, 0xACD9}, - {0x0438, 0xACDA},{0x0439, 0xACDB},{0x043A, 0xACDC},{0x043B, 0xACDD},{0x043C, 0xACDE},{0x043D, 0xACDF},{0x043E, 0xACE0},{0x043F, 0xACE1}, - {0x0440, 0xACE2},{0x0441, 0xACE3},{0x0442, 0xACE4},{0x0443, 0xACE5},{0x0444, 0xACE6},{0x0445, 0xACE7},{0x0446, 0xACE8},{0x0447, 0xACE9}, - {0x0448, 0xACEA},{0x0449, 0xACEB},{0x044A, 0xACEC},{0x044B, 0xACED},{0x044C, 0xACEE},{0x044D, 0xACEF},{0x044E, 0xACF0},{0x044F, 0xACF1}, - {0x0451, 0xACD7},{0x2015, 0xA1AA},{0x2018, 0xA1AE},{0x2019, 0xA1AF},{0x201C, 0xA1B0},{0x201D, 0xA1B1},{0x2020, 0xA2D3},{0x2021, 0xA2D4}, - {0x2025, 0xA1A5},{0x2026, 0xA1A6},{0x2030, 0xA2B6},{0x2032, 0xA1C7},{0x2033, 0xA1C8},{0x203B, 0xA1D8},{0x2074, 0xA9F9},{0x207F, 0xA9FA}, - {0x2081, 0xA9FB},{0x2082, 0xA9FC},{0x2083, 0xA9FD},{0x2084, 0xA9FE},{0x2103, 0xA1C9},{0x2109, 0xA2B5},{0x2113, 0xA7A4},{0x2116, 0xA2E0}, - {0x2121, 0xA2E5},{0x2122, 0xA2E2},{0x2126, 0xA7D9},{0x212B, 0xA1CA},{0x2153, 0xA8F7},{0x2154, 0xA8F8},{0x215B, 0xA8FB},{0x215C, 0xA8FC}, - {0x215D, 0xA8FD},{0x215E, 0xA8FE},{0x2160, 0xA5B0},{0x2161, 0xA5B1},{0x2162, 0xA5B2},{0x2163, 0xA5B3},{0x2164, 0xA5B4},{0x2165, 0xA5B5}, - {0x2166, 0xA5B6},{0x2167, 0xA5B7},{0x2168, 0xA5B8},{0x2169, 0xA5B9},{0x2170, 0xA5A1},{0x2171, 0xA5A2},{0x2172, 0xA5A3},{0x2173, 0xA5A4}, - {0x2174, 0xA5A5},{0x2175, 0xA5A6},{0x2176, 0xA5A7},{0x2177, 0xA5A8},{0x2178, 0xA5A9},{0x2179, 0xA5AA},{0x2190, 0xA1E7},{0x2191, 0xA1E8}, - {0x2192, 0xA1E6},{0x2193, 0xA1E9},{0x2194, 0xA1EA},{0x2195, 0xA2D5},{0x2196, 0xA2D8},{0x2197, 0xA2D6},{0x2198, 0xA2D9},{0x2199, 0xA2D7}, - {0x21D2, 0xA2A1},{0x21D4, 0xA2A2},{0x2200, 0xA2A3},{0x2202, 0xA1D3},{0x2203, 0xA2A4},{0x2207, 0xA1D4},{0x2208, 0xA1F4},{0x220B, 0xA1F5}, - {0x220F, 0xA2B3},{0x2211, 0xA2B2},{0x221A, 0xA1EE},{0x221D, 0xA1F0},{0x221E, 0xA1C4},{0x2220, 0xA1D0},{0x2225, 0xA1AB},{0x2227, 0xA1FC}, - {0x2228, 0xA1FD},{0x2229, 0xA1FB},{0x222A, 0xA1FA},{0x222B, 0xA1F2},{0x222C, 0xA1F3},{0x222E, 0xA2B1},{0x2234, 0xA1C5},{0x2235, 0xA1F1}, - {0x223C, 0xA1AD},{0x223D, 0xA1EF},{0x2252, 0xA1D6},{0x2260, 0xA1C1},{0x2261, 0xA1D5},{0x2264, 0xA1C2},{0x2265, 0xA1C3},{0x226A, 0xA1EC}, - {0x226B, 0xA1ED},{0x2282, 0xA1F8},{0x2283, 0xA1F9},{0x2286, 0xA1F6},{0x2287, 0xA1F7},{0x2299, 0xA2C1},{0x22A5, 0xA1D1},{0x2312, 0xA1D2}, - {0x2460, 0xA8E7},{0x2461, 0xA8E8},{0x2462, 0xA8E9},{0x2463, 0xA8EA},{0x2464, 0xA8EB},{0x2465, 0xA8EC},{0x2466, 0xA8ED},{0x2467, 0xA8EE}, - {0x2468, 0xA8EF},{0x2469, 0xA8F0},{0x246A, 0xA8F1},{0x246B, 0xA8F2},{0x246C, 0xA8F3},{0x246D, 0xA8F4},{0x246E, 0xA8F5},{0x2474, 0xA9E7}, - {0x2475, 0xA9E8},{0x2476, 0xA9E9},{0x2477, 0xA9EA},{0x2478, 0xA9EB},{0x2479, 0xA9EC},{0x247A, 0xA9ED},{0x247B, 0xA9EE},{0x247C, 0xA9EF}, - {0x247D, 0xA9F0},{0x247E, 0xA9F1},{0x247F, 0xA9F2},{0x2480, 0xA9F3},{0x2481, 0xA9F4},{0x2482, 0xA9F5},{0x249C, 0xA9CD},{0x249D, 0xA9CE}, - {0x249E, 0xA9CF},{0x249F, 0xA9D0},{0x24A0, 0xA9D1},{0x24A1, 0xA9D2},{0x24A2, 0xA9D3},{0x24A3, 0xA9D4},{0x24A4, 0xA9D5},{0x24A5, 0xA9D6}, - {0x24A6, 0xA9D7},{0x24A7, 0xA9D8},{0x24A8, 0xA9D9},{0x24A9, 0xA9DA},{0x24AA, 0xA9DB},{0x24AB, 0xA9DC},{0x24AC, 0xA9DD},{0x24AD, 0xA9DE}, - {0x24AE, 0xA9DF},{0x24AF, 0xA9E0},{0x24B0, 0xA9E1},{0x24B1, 0xA9E2},{0x24B2, 0xA9E3},{0x24B3, 0xA9E4},{0x24B4, 0xA9E5},{0x24B5, 0xA9E6}, - {0x24D0, 0xA8CD},{0x24D1, 0xA8CE},{0x24D2, 0xA8CF},{0x24D3, 0xA8D0},{0x24D4, 0xA8D1},{0x24D5, 0xA8D2},{0x24D6, 0xA8D3},{0x24D7, 0xA8D4}, - {0x24D8, 0xA8D5},{0x24D9, 0xA8D6},{0x24DA, 0xA8D7},{0x24DB, 0xA8D8},{0x24DC, 0xA8D9},{0x24DD, 0xA8DA},{0x24DE, 0xA8DB},{0x24DF, 0xA8DC}, - {0x24E0, 0xA8DD},{0x24E1, 0xA8DE},{0x24E2, 0xA8DF},{0x24E3, 0xA8E0},{0x24E4, 0xA8E1},{0x24E5, 0xA8E2},{0x24E6, 0xA8E3},{0x24E7, 0xA8E4}, - {0x24E8, 0xA8E5},{0x24E9, 0xA8E6},{0x2500, 0xA6A1},{0x2501, 0xA6AC},{0x2502, 0xA6A2},{0x2503, 0xA6AD},{0x250C, 0xA6A3},{0x250D, 0xA6C8}, - {0x250E, 0xA6C7},{0x250F, 0xA6AE},{0x2510, 0xA6A4},{0x2511, 0xA6C2},{0x2512, 0xA6C1},{0x2513, 0xA6AF},{0x2514, 0xA6A6},{0x2515, 0xA6C6}, - {0x2516, 0xA6C5},{0x2517, 0xA6B1},{0x2518, 0xA6A5},{0x2519, 0xA6C4},{0x251A, 0xA6C3},{0x251B, 0xA6B0},{0x251C, 0xA6A7},{0x251D, 0xA6BC}, - {0x251E, 0xA6C9},{0x251F, 0xA6CA},{0x2520, 0xA6B7},{0x2521, 0xA6CB},{0x2522, 0xA6CC},{0x2523, 0xA6B2},{0x2524, 0xA6A9},{0x2525, 0xA6BE}, - {0x2526, 0xA6CD},{0x2527, 0xA6CE},{0x2528, 0xA6B9},{0x2529, 0xA6CF},{0x252A, 0xA6D0},{0x252B, 0xA6B4},{0x252C, 0xA6A8},{0x252D, 0xA6D1}, - {0x252E, 0xA6D2},{0x252F, 0xA6B8},{0x2530, 0xA6BD},{0x2531, 0xA6D3},{0x2532, 0xA6D4},{0x2533, 0xA6B3},{0x2534, 0xA6AA},{0x2535, 0xA6D5}, - {0x2536, 0xA6D6},{0x2537, 0xA6BA},{0x2538, 0xA6BF},{0x2539, 0xA6D7},{0x253A, 0xA6D8},{0x253B, 0xA6B5},{0x253C, 0xA6AB},{0x253D, 0xA6D9}, - {0x253E, 0xA6DA},{0x253F, 0xA6BB},{0x2540, 0xA6DB},{0x2541, 0xA6DC},{0x2542, 0xA6C0},{0x2543, 0xA6DD},{0x2544, 0xA6DE},{0x2545, 0xA6DF}, - {0x2546, 0xA6E0},{0x2547, 0xA6E1},{0x2548, 0xA6E2},{0x2549, 0xA6E3},{0x254A, 0xA6E4},{0x254B, 0xA6B6},{0x2592, 0xA2C6},{0x25A0, 0xA1E1}, - {0x25A1, 0xA1E0},{0x25A3, 0xA2C3},{0x25A4, 0xA2C7},{0x25A5, 0xA2C8},{0x25A6, 0xA2CB},{0x25A7, 0xA2CA},{0x25A8, 0xA2C9},{0x25A9, 0xA2CC}, - {0x25B2, 0xA1E3},{0x25B3, 0xA1E2},{0x25B6, 0xA2BA},{0x25B7, 0xA2B9},{0x25BC, 0xA1E5},{0x25BD, 0xA1E4},{0x25C0, 0xA2B8},{0x25C1, 0xA2B7}, - {0x25C6, 0xA1DF},{0x25C7, 0xA1DE},{0x25C8, 0xA2C2},{0x25CB, 0xA1DB},{0x25CE, 0xA1DD},{0x25CF, 0xA1DC},{0x25D0, 0xA2C4},{0x25D1, 0xA2C5}, - {0x2605, 0xA1DA},{0x2606, 0xA1D9},{0x260E, 0xA2CF},{0x260F, 0xA2CE},{0x261C, 0xA2D0},{0x261E, 0xA2D1},{0x2640, 0xA1CF},{0x2642, 0xA1CE}, - {0x2660, 0xA2BC},{0x2661, 0xA2BD},{0x2663, 0xA2C0},{0x2664, 0xA2BB},{0x2665, 0xA2BE},{0x2667, 0xA2BF},{0x2668, 0xA2CD},{0x2669, 0xA2DB}, - {0x266A, 0xA2DC},{0x266C, 0xA2DD},{0x266D, 0xA2DA},{0x3000, 0xA1A1},{0x3001, 0xA1A2},{0x3002, 0xA1A3},{0x3003, 0xA1A8},{0x3008, 0xA1B4}, - {0x3009, 0xA1B5},{0x300A, 0xA1B6},{0x300B, 0xA1B7},{0x300C, 0xA1B8},{0x300D, 0xA1B9},{0x300E, 0xA1BA},{0x300F, 0xA1BB},{0x3010, 0xA1BC}, - {0x3011, 0xA1BD},{0x3013, 0xA1EB},{0x3014, 0xA1B2},{0x3015, 0xA1B3},{0x3041, 0xAAA1},{0x3042, 0xAAA2},{0x3043, 0xAAA3},{0x3044, 0xAAA4}, - {0x3045, 0xAAA5},{0x3046, 0xAAA6},{0x3047, 0xAAA7},{0x3048, 0xAAA8},{0x3049, 0xAAA9},{0x304A, 0xAAAA},{0x304B, 0xAAAB},{0x304C, 0xAAAC}, - {0x304D, 0xAAAD},{0x304E, 0xAAAE},{0x304F, 0xAAAF},{0x3050, 0xAAB0},{0x3051, 0xAAB1},{0x3052, 0xAAB2},{0x3053, 0xAAB3},{0x3054, 0xAAB4}, - {0x3055, 0xAAB5},{0x3056, 0xAAB6},{0x3057, 0xAAB7},{0x3058, 0xAAB8},{0x3059, 0xAAB9},{0x305A, 0xAABA},{0x305B, 0xAABB},{0x305C, 0xAABC}, - {0x305D, 0xAABD},{0x305E, 0xAABE},{0x305F, 0xAABF},{0x3060, 0xAAC0},{0x3061, 0xAAC1},{0x3062, 0xAAC2},{0x3063, 0xAAC3},{0x3064, 0xAAC4}, - {0x3065, 0xAAC5},{0x3066, 0xAAC6},{0x3067, 0xAAC7},{0x3068, 0xAAC8},{0x3069, 0xAAC9},{0x306A, 0xAACA},{0x306B, 0xAACB},{0x306C, 0xAACC}, - {0x306D, 0xAACD},{0x306E, 0xAACE},{0x306F, 0xAACF},{0x3070, 0xAAD0},{0x3071, 0xAAD1},{0x3072, 0xAAD2},{0x3073, 0xAAD3},{0x3074, 0xAAD4}, - {0x3075, 0xAAD5},{0x3076, 0xAAD6},{0x3077, 0xAAD7},{0x3078, 0xAAD8},{0x3079, 0xAAD9},{0x307A, 0xAADA},{0x307B, 0xAADB},{0x307C, 0xAADC}, - {0x307D, 0xAADD},{0x307E, 0xAADE},{0x307F, 0xAADF},{0x3080, 0xAAE0},{0x3081, 0xAAE1},{0x3082, 0xAAE2},{0x3083, 0xAAE3},{0x3084, 0xAAE4}, - {0x3085, 0xAAE5},{0x3086, 0xAAE6},{0x3087, 0xAAE7},{0x3088, 0xAAE8},{0x3089, 0xAAE9},{0x308A, 0xAAEA},{0x308B, 0xAAEB},{0x308C, 0xAAEC}, - {0x308D, 0xAAED},{0x308E, 0xAAEE},{0x308F, 0xAAEF},{0x3090, 0xAAF0},{0x3091, 0xAAF1},{0x3092, 0xAAF2},{0x3093, 0xAAF3},{0x30A1, 0xABA1}, - {0x30A2, 0xABA2},{0x30A3, 0xABA3},{0x30A4, 0xABA4},{0x30A5, 0xABA5},{0x30A6, 0xABA6},{0x30A7, 0xABA7},{0x30A8, 0xABA8},{0x30A9, 0xABA9}, - {0x30AA, 0xABAA},{0x30AB, 0xABAB},{0x30AC, 0xABAC},{0x30AD, 0xABAD},{0x30AE, 0xABAE},{0x30AF, 0xABAF},{0x30B0, 0xABB0},{0x30B1, 0xABB1}, - {0x30B2, 0xABB2},{0x30B3, 0xABB3},{0x30B4, 0xABB4},{0x30B5, 0xABB5},{0x30B6, 0xABB6},{0x30B7, 0xABB7},{0x30B8, 0xABB8},{0x30B9, 0xABB9}, - {0x30BA, 0xABBA},{0x30BB, 0xABBB},{0x30BC, 0xABBC},{0x30BD, 0xABBD},{0x30BE, 0xABBE},{0x30BF, 0xABBF},{0x30C0, 0xABC0},{0x30C1, 0xABC1}, - {0x30C2, 0xABC2},{0x30C3, 0xABC3},{0x30C4, 0xABC4},{0x30C5, 0xABC5},{0x30C6, 0xABC6},{0x30C7, 0xABC7},{0x30C8, 0xABC8},{0x30C9, 0xABC9}, - {0x30CA, 0xABCA},{0x30CB, 0xABCB},{0x30CC, 0xABCC},{0x30CD, 0xABCD},{0x30CE, 0xABCE},{0x30CF, 0xABCF},{0x30D0, 0xABD0},{0x30D1, 0xABD1}, - {0x30D2, 0xABD2},{0x30D3, 0xABD3},{0x30D4, 0xABD4},{0x30D5, 0xABD5},{0x30D6, 0xABD6},{0x30D7, 0xABD7},{0x30D8, 0xABD8},{0x30D9, 0xABD9}, - {0x30DA, 0xABDA},{0x30DB, 0xABDB},{0x30DC, 0xABDC},{0x30DD, 0xABDD},{0x30DE, 0xABDE},{0x30DF, 0xABDF},{0x30E0, 0xABE0},{0x30E1, 0xABE1}, - {0x30E2, 0xABE2},{0x30E3, 0xABE3},{0x30E4, 0xABE4},{0x30E5, 0xABE5},{0x30E6, 0xABE6},{0x30E7, 0xABE7},{0x30E8, 0xABE8},{0x30E9, 0xABE9}, - {0x30EA, 0xABEA},{0x30EB, 0xABEB},{0x30EC, 0xABEC},{0x30ED, 0xABED},{0x30EE, 0xABEE},{0x30EF, 0xABEF},{0x30F0, 0xABF0},{0x30F1, 0xABF1}, - {0x30F2, 0xABF2},{0x30F3, 0xABF3},{0x30F4, 0xABF4},{0x30F5, 0xABF5},{0x30F6, 0xABF6},{0x3131, 0xA4A1},{0x3132, 0xA4A2},{0x3133, 0xA4A3}, - {0x3134, 0xA4A4},{0x3135, 0xA4A5},{0x3136, 0xA4A6},{0x3137, 0xA4A7},{0x3138, 0xA4A8},{0x3139, 0xA4A9},{0x313A, 0xA4AA},{0x313B, 0xA4AB}, - {0x313C, 0xA4AC},{0x313D, 0xA4AD},{0x313E, 0xA4AE},{0x313F, 0xA4AF},{0x3140, 0xA4B0},{0x3141, 0xA4B1},{0x3142, 0xA4B2},{0x3143, 0xA4B3}, - {0x3144, 0xA4B4},{0x3145, 0xA4B5},{0x3146, 0xA4B6},{0x3147, 0xA4B7},{0x3148, 0xA4B8},{0x3149, 0xA4B9},{0x314A, 0xA4BA},{0x314B, 0xA4BB}, - {0x314C, 0xA4BC},{0x314D, 0xA4BD},{0x314E, 0xA4BE},{0x314F, 0xA4BF},{0x3150, 0xA4C0},{0x3151, 0xA4C1},{0x3152, 0xA4C2},{0x3153, 0xA4C3}, - {0x3154, 0xA4C4},{0x3155, 0xA4C5},{0x3156, 0xA4C6},{0x3157, 0xA4C7},{0x3158, 0xA4C8},{0x3159, 0xA4C9},{0x315A, 0xA4CA},{0x315B, 0xA4CB}, - {0x315C, 0xA4CC},{0x315D, 0xA4CD},{0x315E, 0xA4CE},{0x315F, 0xA4CF},{0x3160, 0xA4D0},{0x3161, 0xA4D1},{0x3162, 0xA4D2},{0x3163, 0xA4D3}, - {0x3164, 0xA4D4},{0x3165, 0xA4D5},{0x3166, 0xA4D6},{0x3167, 0xA4D7},{0x3168, 0xA4D8},{0x3169, 0xA4D9},{0x316A, 0xA4DA},{0x316B, 0xA4DB}, - {0x316C, 0xA4DC},{0x316D, 0xA4DD},{0x316E, 0xA4DE},{0x316F, 0xA4DF},{0x3170, 0xA4E0},{0x3171, 0xA4E1},{0x3172, 0xA4E2},{0x3173, 0xA4E3}, - {0x3174, 0xA4E4},{0x3175, 0xA4E5},{0x3176, 0xA4E6},{0x3177, 0xA4E7},{0x3178, 0xA4E8},{0x3179, 0xA4E9},{0x317A, 0xA4EA},{0x317B, 0xA4EB}, - {0x317C, 0xA4EC},{0x317D, 0xA4ED},{0x317E, 0xA4EE},{0x317F, 0xA4EF},{0x3180, 0xA4F0},{0x3181, 0xA4F1},{0x3182, 0xA4F2},{0x3183, 0xA4F3}, - {0x3184, 0xA4F4},{0x3185, 0xA4F5},{0x3186, 0xA4F6},{0x3187, 0xA4F7},{0x3188, 0xA4F8},{0x3189, 0xA4F9},{0x318A, 0xA4FA},{0x318B, 0xA4FB}, - {0x318C, 0xA4FC},{0x318D, 0xA4FD},{0x318E, 0xA4FE},{0x3200, 0xA9B1},{0x3201, 0xA9B2},{0x3202, 0xA9B3},{0x3203, 0xA9B4},{0x3204, 0xA9B5}, - {0x3205, 0xA9B6},{0x3206, 0xA9B7},{0x3207, 0xA9B8},{0x3208, 0xA9B9},{0x3209, 0xA9BA},{0x320A, 0xA9BB},{0x320B, 0xA9BC},{0x320C, 0xA9BD}, - {0x320D, 0xA9BE},{0x320E, 0xA9BF},{0x320F, 0xA9C0},{0x3210, 0xA9C1},{0x3211, 0xA9C2},{0x3212, 0xA9C3},{0x3213, 0xA9C4},{0x3214, 0xA9C5}, - {0x3215, 0xA9C6},{0x3216, 0xA9C7},{0x3217, 0xA9C8},{0x3218, 0xA9C9},{0x3219, 0xA9CA},{0x321A, 0xA9CB},{0x321B, 0xA9CC},{0x321C, 0xA2DF}, - {0x3260, 0xA8B1},{0x3261, 0xA8B2},{0x3262, 0xA8B3},{0x3263, 0xA8B4},{0x3264, 0xA8B5},{0x3265, 0xA8B6},{0x3266, 0xA8B7},{0x3267, 0xA8B8}, - {0x3268, 0xA8B9},{0x3269, 0xA8BA},{0x326A, 0xA8BB},{0x326B, 0xA8BC},{0x326C, 0xA8BD},{0x326D, 0xA8BE},{0x326E, 0xA8BF},{0x326F, 0xA8C0}, - {0x3270, 0xA8C1},{0x3271, 0xA8C2},{0x3272, 0xA8C3},{0x3273, 0xA8C4},{0x3274, 0xA8C5},{0x3275, 0xA8C6},{0x3276, 0xA8C7},{0x3277, 0xA8C8}, - {0x3278, 0xA8C9},{0x3279, 0xA8CA},{0x327A, 0xA8CB},{0x327B, 0xA8CC},{0x327F, 0xA2DE},{0x3380, 0xA7C9},{0x3381, 0xA7CA},{0x3382, 0xA7CB}, - {0x3383, 0xA7CC},{0x3384, 0xA7CD},{0x3388, 0xA7BA},{0x3389, 0xA7BB},{0x338A, 0xA7DC},{0x338B, 0xA7DD},{0x338C, 0xA7DE},{0x338D, 0xA7B6}, - {0x338E, 0xA7B7},{0x338F, 0xA7B8},{0x3390, 0xA7D4},{0x3391, 0xA7D5},{0x3392, 0xA7D6},{0x3393, 0xA7D7},{0x3394, 0xA7D8},{0x3395, 0xA7A1}, - {0x3396, 0xA7A2},{0x3397, 0xA7A3},{0x3398, 0xA7A5},{0x3399, 0xA7AB},{0x339A, 0xA7AC},{0x339B, 0xA7AD},{0x339C, 0xA7AE},{0x339D, 0xA7AF}, - {0x339E, 0xA7B0},{0x339F, 0xA7B1},{0x33A0, 0xA7B2},{0x33A1, 0xA7B3},{0x33A2, 0xA7B4},{0x33A3, 0xA7A7},{0x33A4, 0xA7A8},{0x33A5, 0xA7A9}, - {0x33A6, 0xA7AA},{0x33A7, 0xA7BD},{0x33A8, 0xA7BE},{0x33A9, 0xA7E5},{0x33AA, 0xA7E6},{0x33AB, 0xA7E7},{0x33AC, 0xA7E8},{0x33AD, 0xA7E1}, - {0x33AE, 0xA7E2},{0x33AF, 0xA7E3},{0x33B0, 0xA7BF},{0x33B1, 0xA7C0},{0x33B2, 0xA7C1},{0x33B3, 0xA7C2},{0x33B4, 0xA7C3},{0x33B5, 0xA7C4}, - {0x33B6, 0xA7C5},{0x33B7, 0xA7C6},{0x33B8, 0xA7C7},{0x33B9, 0xA7C8},{0x33BA, 0xA7CE},{0x33BB, 0xA7CF},{0x33BC, 0xA7D0},{0x33BD, 0xA7D1}, - {0x33BE, 0xA7D2},{0x33BF, 0xA7D3},{0x33C0, 0xA7DA},{0x33C1, 0xA7DB},{0x33C2, 0xA2E3},{0x33C3, 0xA7EC},{0x33C4, 0xA7A6},{0x33C5, 0xA7E0}, - {0x33C6, 0xA7EF},{0x33C7, 0xA2E1},{0x33C8, 0xA7BC},{0x33C9, 0xA7ED},{0x33CA, 0xA7B5},{0x33CF, 0xA7B9},{0x33D0, 0xA7EA},{0x33D3, 0xA7EB}, - {0x33D6, 0xA7DF},{0x33D8, 0xA2E4},{0x33DB, 0xA7E4},{0x33DC, 0xA7EE},{0x33DD, 0xA7E9},{0x4E00, 0xECE9},{0x4E01, 0xEFCB},{0x4E03, 0xF6D2}, - {0x4E07, 0xD8B2},{0x4E08, 0xEDDB},{0x4E09, 0xDFB2},{0x4E0A, 0xDFBE},{0x4E0B, 0xF9BB},{0x4E0D, 0xDCF4},{0x4E11, 0xF5E4},{0x4E14, 0xF3A6}, - {0x4E15, 0xDDE0},{0x4E16, 0xE1A6},{0x4E18, 0xCEF8},{0x4E19, 0xDCB0},{0x4E1E, 0xE3AA},{0x4E2D, 0xF1E9},{0x4E32, 0xCDFA},{0x4E38, 0xFCAF}, - {0x4E39, 0xD3A1},{0x4E3B, 0xF1AB},{0x4E42, 0xE7D1},{0x4E43, 0xD2AC},{0x4E45, 0xCEF9},{0x4E4B, 0xF1FD},{0x4E4D, 0xDEBF},{0x4E4E, 0xFBBA}, - {0x4E4F, 0xF9B9},{0x4E56, 0xCED2},{0x4E58, 0xE3AB},{0x4E59, 0xEBE0},{0x4E5D, 0xCEFA},{0x4E5E, 0xCBF7},{0x4E5F, 0xE5A5},{0x4E6B, 0xCAE1}, - {0x4E6D, 0xD4CC},{0x4E73, 0xEAE1},{0x4E76, 0xDCE3},{0x4E77, 0xDFAD},{0x4E7E, 0xCBEB},{0x4E82, 0xD5AF},{0x4E86, 0xD6F5},{0x4E88, 0xE5F8}, - {0x4E8B, 0xDEC0},{0x4E8C, 0xECA3},{0x4E8E, 0xE9CD},{0x4E90, 0xEAA7},{0x4E91, 0xE9F6},{0x4E92, 0xFBBB},{0x4E94, 0xE7E9},{0x4E95, 0xEFCC}, - {0x4E98, 0xD0E6},{0x4E9B, 0xDEC1},{0x4E9E, 0xE4AC},{0x4EA1, 0xD8CC},{0x4EA2, 0xF9F1},{0x4EA4, 0xCEDF},{0x4EA5, 0xFAA4},{0x4EA6, 0xE6B2}, - {0x4EA8, 0xFAFB},{0x4EAB, 0xFABD},{0x4EAC, 0xCCC8},{0x4EAD, 0xEFCD},{0x4EAE, 0xD5D5},{0x4EB6, 0xD3A2},{0x4EBA, 0xECD1},{0x4EC0, 0xE4A7}, - {0x4EC1, 0xECD2},{0x4EC4, 0xF6B1},{0x4EC7, 0xCEFB},{0x4ECA, 0xD0D1},{0x4ECB, 0xCBBF},{0x4ECD, 0xEDA4},{0x4ED4, 0xEDA8},{0x4ED5, 0xDEC2}, - {0x4ED6, 0xF6E2},{0x4ED7, 0xEDDC},{0x4ED8, 0xDCF5},{0x4ED9, 0xE0B9},{0x4EDD, 0xD4CE},{0x4EDF, 0xF4B5},{0x4EE3, 0xD3DB},{0x4EE4, 0xD6B5}, - {0x4EE5, 0xECA4},{0x4EF0, 0xE4E6},{0x4EF2, 0xF1EA},{0x4EF6, 0xCBEC},{0x4EF7, 0xCBC0},{0x4EFB, 0xECF2},{0x4F01, 0xD0EA},{0x4F09, 0xF9F2}, - {0x4F0A, 0xECA5},{0x4F0B, 0xD0DF},{0x4F0D, 0xE7EA},{0x4F0E, 0xD0EB},{0x4F0F, 0xDCD1},{0x4F10, 0xDBE9},{0x4F11, 0xFDCC},{0x4F2F, 0xDBD7}, - {0x4F34, 0xDAE1},{0x4F36, 0xD6B6},{0x4F38, 0xE3DF},{0x4F3A, 0xDEC3},{0x4F3C, 0xDEC4},{0x4F3D, 0xCAA1},{0x4F43, 0xEEEC},{0x4F46, 0xD3A3}, - {0x4F47, 0xEEB7},{0x4F48, 0xF8CF},{0x4F4D, 0xEAC8},{0x4F4E, 0xEEB8},{0x4F4F, 0xF1AC},{0x4F50, 0xF1A5},{0x4F51, 0xE9CE},{0x4F55, 0xF9BC}, - {0x4F59, 0xE5F9},{0x4F5A, 0xECEA},{0x4F5B, 0xDDD6},{0x4F5C, 0xEDC2},{0x4F69, 0xF8A5},{0x4F6F, 0xE5BA},{0x4F70, 0xDBD8},{0x4F73, 0xCAA2}, - {0x4F76, 0xD1CD},{0x4F7A, 0xEEED},{0x4F7E, 0xECEB},{0x4F7F, 0xDEC5},{0x4F81, 0xE3E0},{0x4F83, 0xCAC9},{0x4F84, 0xF2E9},{0x4F86, 0xD5CE}, - {0x4F88, 0xF6B6},{0x4F8A, 0xCEC2},{0x4F8B, 0xD6C7},{0x4F8D, 0xE3B4},{0x4F8F, 0xF1AD},{0x4F91, 0xEAE2},{0x4F96, 0xD7C2},{0x4F98, 0xF3A7}, - {0x4F9B, 0xCDEA},{0x4F9D, 0xEBEE},{0x4FAE, 0xD9B2},{0x4FAF, 0xFDA5},{0x4FB5, 0xF6D5},{0x4FB6, 0xD5E2},{0x4FBF, 0xF8B5},{0x4FC2, 0xCCF5}, - {0x4FC3, 0xF5B5},{0x4FC4, 0xE4AD},{0x4FC9, 0xE7EB},{0x4FCA, 0xF1D5},{0x4FCE, 0xF0BB},{0x4FD1, 0xE9B5},{0x4FD3, 0xCCC9},{0x4FD4, 0xFAD5}, - {0x4FD7, 0xE1D4},{0x4FDA, 0xD7D6},{0x4FDD, 0xDCC1},{0x4FDF, 0xDEC6},{0x4FE0, 0xFAEF},{0x4FE1, 0xE3E1},{0x4FEE, 0xE1F3},{0x4FEF, 0xDCF6}, - {0x4FF1, 0xCEFC},{0x4FF3, 0xDBC4},{0x4FF5, 0xF8F1},{0x4FF8, 0xDCE4},{0x4FFA, 0xE5EF},{0x5002, 0xDCB1},{0x5006, 0xD5D6},{0x5009, 0xF3DA}, - {0x500B, 0xCBC1},{0x500D, 0xDBC3},{0x5011, 0xD9FA},{0x5012, 0xD3EE},{0x5016, 0xFAB8},{0x5019, 0xFDA6},{0x501A, 0xEBEF},{0x501C, 0xF4A6}, - {0x501E, 0xCCCA},{0x501F, 0xF3A8},{0x5021, 0xF3DB},{0x5023, 0xDBA7},{0x5024, 0xF6B7},{0x5026, 0xCFE6},{0x5027, 0xF0F2},{0x5028, 0xCBDA}, - {0x502A, 0xE7D2},{0x502B, 0xD7C3},{0x502C, 0xF6F0},{0x502D, 0xE8DE},{0x503B, 0xE5A6},{0x5043, 0xE5E7},{0x5047, 0xCAA3},{0x5048, 0xCCA7}, - {0x5049, 0xEAC9},{0x504F, 0xF8B6},{0x5055, 0xFAA5},{0x505A, 0xF1AE},{0x505C, 0xEFCE},{0x5065, 0xCBED},{0x5074, 0xF6B0},{0x5075, 0xEFCF}, - {0x5076, 0xE9CF},{0x5078, 0xF7DE},{0x5080, 0xCED3},{0x5085, 0xDCF7},{0x508D, 0xDBA8},{0x5091, 0xCBF8},{0x5098, 0xDFA1},{0x5099, 0xDDE1}, - {0x50AC, 0xF5CA},{0x50AD, 0xE9B6},{0x50B2, 0xE7EC},{0x50B3, 0xEEEE},{0x50B5, 0xF3F0},{0x50B7, 0xDFBF},{0x50BE, 0xCCCB},{0x50C5, 0xD0C1}, - {0x50C9, 0xF4D2},{0x50CA, 0xE0BA},{0x50CF, 0xDFC0},{0x50D1, 0xCEE0},{0x50D5, 0xDCD2},{0x50D6, 0xFDEA},{0x50DA, 0xD6F6},{0x50DE, 0xEACA}, - {0x50E5, 0xE8E9},{0x50E7, 0xE3AC},{0x50ED, 0xF3D0},{0x50F9, 0xCAA4},{0x50FB, 0xDBF8},{0x50FF, 0xDEC7},{0x5100, 0xEBF0},{0x5101, 0xF1D6}, - {0x5104, 0xE5E2},{0x5106, 0xCCCC},{0x5109, 0xCBFB},{0x5112, 0xEAE3},{0x511F, 0xDFC1},{0x5121, 0xD6ED},{0x512A, 0xE9D0},{0x5132, 0xEEB9}, - {0x5137, 0xD5E3},{0x513A, 0xD1D3},{0x513C, 0xE5F0},{0x5140, 0xE8B4},{0x5141, 0xEBC3},{0x5143, 0xEAAA},{0x5144, 0xFAFC},{0x5145, 0xF5F6}, - {0x5146, 0xF0BC},{0x5147, 0xFDD4},{0x5148, 0xE0BB},{0x5149, 0xCEC3},{0x514B, 0xD0BA},{0x514C, 0xF7BA},{0x514D, 0xD8F3},{0x514E, 0xF7CD}, - {0x5152, 0xE4AE},{0x515C, 0xD4DF},{0x5162, 0xD0E7},{0x5165, 0xECFD},{0x5167, 0xD2AE},{0x5168, 0xEEEF},{0x5169, 0xD5D7},{0x516A, 0xEAE4}, - {0x516B, 0xF8A2},{0x516C, 0xCDEB},{0x516D, 0xD7BF},{0x516E, 0xFBB1},{0x5171, 0xCDEC},{0x5175, 0xDCB2},{0x5176, 0xD0EC},{0x5177, 0xCEFD}, - {0x5178, 0xEEF0},{0x517C, 0xCCC2},{0x5180, 0xD0ED},{0x5186, 0xE5F7},{0x518A, 0xF3FC},{0x518D, 0xEEA2},{0x5192, 0xD9B3},{0x5195, 0xD8F4}, - {0x5197, 0xE9B7},{0x51A0, 0xCEAE},{0x51A5, 0xD9A2},{0x51AA, 0xD8F1},{0x51AC, 0xD4CF},{0x51B6, 0xE5A7},{0x51B7, 0xD5D2},{0x51BD, 0xD6A9}, - {0x51C4, 0xF4A2},{0x51C6, 0xF1D7},{0x51C9, 0xD5D8},{0x51CB, 0xF0BD},{0x51CC, 0xD7D0},{0x51CD, 0xD4D0},{0x51DC, 0xD7CF},{0x51DD, 0xEBEA}, - {0x51DE, 0xFDEB},{0x51E1, 0xDBED},{0x51F0, 0xFCC5},{0x51F1, 0xCBC2},{0x51F6, 0xFDD5},{0x51F8, 0xF4C8},{0x51F9, 0xE8EA},{0x51FA, 0xF5F3}, - {0x51FD, 0xF9DE},{0x5200, 0xD3EF},{0x5203, 0xECD3},{0x5206, 0xDDC2},{0x5207, 0xEFB7},{0x5208, 0xE7D4},{0x520A, 0xCACA},{0x520E, 0xD9FB}, - {0x5211, 0xFAFD},{0x5217, 0xD6AA},{0x521D, 0xF4F8},{0x5224, 0xF7F7},{0x5225, 0xDCAC},{0x5229, 0xD7D7},{0x522A, 0xDFA2},{0x522E, 0xCEBE}, - {0x5230, 0xD3F0},{0x5236, 0xF0A4},{0x5237, 0xE1EC},{0x5238, 0xCFE7},{0x5239, 0xF3CB},{0x523A, 0xEDA9},{0x523B, 0xCABE},{0x5243, 0xF4EF}, - {0x5247, 0xF6CE},{0x524A, 0xDEFB},{0x524B, 0xD0BB},{0x524C, 0xD5B7},{0x524D, 0xEEF1},{0x5254, 0xF4A8},{0x5256, 0xDCF8},{0x525B, 0xCBA7}, - {0x525D, 0xDACE},{0x5261, 0xE0E6},{0x5269, 0xEDA5},{0x526A, 0xEEF2},{0x526F, 0xDCF9},{0x5272, 0xF9DC},{0x5275, 0xF3DC},{0x527D, 0xF8F2}, - {0x527F, 0xF4F9},{0x5283, 0xFCF1},{0x5287, 0xD0BC},{0x5288, 0xDBF9},{0x5289, 0xD7B1},{0x528D, 0xCBFC},{0x5291, 0xF0A5},{0x5292, 0xCBFD}, - {0x529B, 0xD5F4},{0x529F, 0xCDED},{0x52A0, 0xCAA5},{0x52A3, 0xD6AB},{0x52A4, 0xD0C2},{0x52A9, 0xF0BE},{0x52AA, 0xD2BD},{0x52AB, 0xCCA4}, - {0x52BE, 0xFAB6},{0x52C1, 0xCCCD},{0x52C3, 0xDAFA},{0x52C5, 0xF6CF},{0x52C7, 0xE9B8},{0x52C9, 0xD8F5},{0x52CD, 0xCCCE},{0x52D2, 0xD7CD}, - {0x52D5, 0xD4D1},{0x52D6, 0xE9ED},{0x52D8, 0xCAEB},{0x52D9, 0xD9E2},{0x52DB, 0xFDB2},{0x52DD, 0xE3AD},{0x52DE, 0xD6CC},{0x52DF, 0xD9B4}, - {0x52E2, 0xE1A7},{0x52E3, 0xEED3},{0x52E4, 0xD0C3},{0x52F3, 0xFDB3},{0x52F5, 0xD5E4},{0x52F8, 0xCFE8},{0x52FA, 0xEDC3},{0x52FB, 0xD0B2}, - {0x52FE, 0xCEFE},{0x52FF, 0xDAA8},{0x5305, 0xF8D0},{0x5308, 0xFDD6},{0x530D, 0xF8D1},{0x530F, 0xF8D2},{0x5310, 0xDCD3},{0x5315, 0xDDE2}, - {0x5316, 0xFBF9},{0x5317, 0xDDC1},{0x5319, 0xE3B5},{0x5320, 0xEDDD},{0x5321, 0xCEC4},{0x5323, 0xCBA1},{0x532A, 0xDDE3},{0x532F, 0xFCDD}, - {0x5339, 0xF9AF},{0x533F, 0xD2FB},{0x5340, 0xCFA1},{0x5341, 0xE4A8},{0x5343, 0xF4B6},{0x5344, 0xECFE},{0x5347, 0xE3AE},{0x5348, 0xE7ED}, - {0x5349, 0xFDC1},{0x534A, 0xDAE2},{0x534D, 0xD8B3},{0x5351, 0xDDE4},{0x5352, 0xF0EF},{0x5353, 0xF6F1},{0x5354, 0xFAF0},{0x5357, 0xD1F5}, - {0x535A, 0xDACF},{0x535C, 0xDCD4},{0x535E, 0xDCA6},{0x5360, 0xEFBF},{0x5366, 0xCECF},{0x5368, 0xE0D9},{0x536F, 0xD9D6},{0x5370, 0xECD4}, - {0x5371, 0xEACB},{0x5374, 0xCABF},{0x5375, 0xD5B0},{0x5377, 0xCFE9},{0x537D, 0xF1ED},{0x537F, 0xCCCF},{0x5384, 0xE4F8},{0x5393, 0xE4ED}, - {0x5398, 0xD7D8},{0x539A, 0xFDA7},{0x539F, 0xEAAB},{0x53A0, 0xF6B2},{0x53A5, 0xCFF0},{0x53A6, 0xF9BD},{0x53AD, 0xE6F4},{0x53BB, 0xCBDB}, - {0x53C3, 0xF3D1},{0x53C8, 0xE9D1},{0x53C9, 0xF3A9},{0x53CA, 0xD0E0},{0x53CB, 0xE9D2},{0x53CD, 0xDAE3},{0x53D4, 0xE2D2},{0x53D6, 0xF6A2}, - {0x53D7, 0xE1F4},{0x53DB, 0xDAE4},{0x53E1, 0xE7D5},{0x53E2, 0xF5BF},{0x53E3, 0xCFA2},{0x53E4, 0xCDAF},{0x53E5, 0xCFA3},{0x53E9, 0xCDB0}, - {0x53EA, 0xF1FE},{0x53EB, 0xD0A3},{0x53EC, 0xE1AF},{0x53ED, 0xF8A3},{0x53EF, 0xCAA6},{0x53F0, 0xF7BB},{0x53F1, 0xF2EA},{0x53F2, 0xDEC8}, - {0x53F3, 0xE9D3},{0x53F8, 0xDEC9},{0x5403, 0xFDDE},{0x5404, 0xCAC0},{0x5408, 0xF9EA},{0x5409, 0xD1CE},{0x540A, 0xEED4},{0x540C, 0xD4D2}, - {0x540D, 0xD9A3},{0x540E, 0xFDA8},{0x540F, 0xD7D9},{0x5410, 0xF7CE},{0x5411, 0xFABE},{0x541B, 0xCFD6},{0x541D, 0xD7F0},{0x541F, 0xEBE1}, - {0x5420, 0xF8C5},{0x5426, 0xDCFA},{0x5429, 0xDDC3},{0x542B, 0xF9DF},{0x5433, 0xE7EF},{0x5438, 0xFDE5},{0x5439, 0xF6A3},{0x543B, 0xD9FC}, - {0x543C, 0xFDA9},{0x543E, 0xE7EE},{0x5442, 0xD5E5},{0x5448, 0xEFD0},{0x544A, 0xCDB1},{0x5451, 0xF7A2},{0x5468, 0xF1B2},{0x546A, 0xF1B1}, - {0x5471, 0xCDB2},{0x5473, 0xDAAB},{0x5475, 0xCAA7},{0x547B, 0xE3E2},{0x547C, 0xFBBC},{0x547D, 0xD9A4},{0x5480, 0xEEBA},{0x5486, 0xF8D3}, - {0x548C, 0xFBFA},{0x548E, 0xCFA4},{0x5490, 0xDCFB},{0x54A4, 0xF6E3},{0x54A8, 0xEDAA},{0x54AB, 0xF2A1},{0x54AC, 0xCEE1},{0x54B3, 0xFAA6}, - {0x54B8, 0xF9E0},{0x54BD, 0xECD6},{0x54C0, 0xE4EE},{0x54C1, 0xF9A1},{0x54C4, 0xFBEF},{0x54C8, 0xF9EB},{0x54C9, 0xEEA3},{0x54E1, 0xEAAC}, - {0x54E5, 0xCAA8},{0x54E8, 0xF4FA},{0x54ED, 0xCDD6},{0x54EE, 0xFCF6},{0x54F2, 0xF4C9},{0x54FA, 0xF8D4},{0x5504, 0xF8A6},{0x5506, 0xDECA}, - {0x5507, 0xF2C6},{0x550E, 0xD7DA},{0x5510, 0xD3D0},{0x551C, 0xD8C5},{0x552F, 0xEAE6},{0x5531, 0xF3DD},{0x5535, 0xE4DA},{0x553E, 0xF6E4}, - {0x5544, 0xF6F2},{0x5546, 0xDFC2},{0x554F, 0xD9FD},{0x5553, 0xCCF6},{0x5556, 0xD3BA},{0x555E, 0xE4AF},{0x5563, 0xF9E1},{0x557C, 0xF0A6}, - {0x5580, 0xCBD3},{0x5584, 0xE0BC},{0x5586, 0xF4CA},{0x5587, 0xD4FA},{0x5589, 0xFDAA},{0x558A, 0xF9E2},{0x5598, 0xF4B7},{0x5599, 0xFDC2}, - {0x559A, 0xFCB0},{0x559C, 0xFDEC},{0x559D, 0xCAE2},{0x55A7, 0xFDBD},{0x55A9, 0xEAE7},{0x55AA, 0xDFC3},{0x55AB, 0xD1D2},{0x55AC, 0xCEE2}, - {0x55AE, 0xD3A4},{0x55C5, 0xFDAB},{0x55C7, 0xDFE0},{0x55D4, 0xF2C7},{0x55DA, 0xE7F0},{0x55DC, 0xD0EE},{0x55DF, 0xF3AA},{0x55E3, 0xDECB}, - {0x55E4, 0xF6B8},{0x55FD, 0xE1F5},{0x55FE, 0xF1B3},{0x5606, 0xF7A3},{0x5609, 0xCAA9},{0x5614, 0xCFA5},{0x5617, 0xDFC4},{0x562F, 0xE1B0}, - {0x5632, 0xF0BF},{0x5634, 0xF6A4},{0x5636, 0xE3B6},{0x5653, 0xFAC6},{0x5668, 0xD0EF},{0x566B, 0xFDED},{0x5674, 0xDDC4},{0x5686, 0xFCF7}, - {0x56A5, 0xE6BF},{0x56AC, 0xDEAD},{0x56AE, 0xFABF},{0x56B4, 0xE5F1},{0x56BC, 0xEDC4},{0x56CA, 0xD2A5},{0x56CD, 0xFDEE},{0x56D1, 0xF5B6}, - {0x56DA, 0xE1F6},{0x56DB, 0xDECC},{0x56DE, 0xFCDE},{0x56E0, 0xECD7},{0x56F0, 0xCDDD},{0x56F9, 0xD6B7},{0x56FA, 0xCDB3},{0x5703, 0xF8D5}, - {0x5704, 0xE5D8},{0x5708, 0xCFEA},{0x570B, 0xCFD0},{0x570D, 0xEACC},{0x5712, 0xEAAE},{0x5713, 0xEAAD},{0x5716, 0xD3F1},{0x5718, 0xD3A5}, - {0x571F, 0xF7CF},{0x5728, 0xEEA4},{0x572D, 0xD0A4},{0x5730, 0xF2A2},{0x573B, 0xD0F0},{0x5740, 0xF2A3},{0x5742, 0xF7F8},{0x5747, 0xD0B3}, - {0x574A, 0xDBA9},{0x574D, 0xD3BB},{0x574E, 0xCAEC},{0x5750, 0xF1A6},{0x5751, 0xCBD5},{0x5761, 0xF7E7},{0x5764, 0xCDDE},{0x5766, 0xF7A4}, - {0x576A, 0xF8C0},{0x576E, 0xD3DD},{0x5770, 0xCCD0},{0x5775, 0xCFA6},{0x577C, 0xF6F3},{0x5782, 0xE1F7},{0x5788, 0xD3DC},{0x578B, 0xFAFE}, - {0x5793, 0xFAA7},{0x57A0, 0xEBD9},{0x57A2, 0xCFA7},{0x57A3, 0xEAAF},{0x57C3, 0xE4EF},{0x57C7, 0xE9B9},{0x57C8, 0xF1D8},{0x57CB, 0xD8D8}, - {0x57CE, 0xE0F2},{0x57DF, 0xE6B4},{0x57E0, 0xDCFC},{0x57F0, 0xF3F1},{0x57F4, 0xE3D0},{0x57F7, 0xF2FB},{0x57F9, 0xDBC6},{0x57FA, 0xD0F1}, - {0x57FC, 0xD0F2},{0x5800, 0xCFDC},{0x5802, 0xD3D1},{0x5805, 0xCCB1},{0x5806, 0xF7D8},{0x5808, 0xCBA8},{0x5809, 0xEBBC},{0x580A, 0xE4BE}, - {0x581E, 0xF4DC},{0x5821, 0xDCC2},{0x5824, 0xF0A7},{0x5827, 0xE6C0},{0x582A, 0xCAED},{0x582F, 0xE8EB},{0x5830, 0xE5E8},{0x5831, 0xDCC3}, - {0x5834, 0xEDDE},{0x5835, 0xD3F2},{0x583A, 0xCCF7},{0x584A, 0xCED4},{0x584B, 0xE7AB},{0x584F, 0xCBC3},{0x5851, 0xE1B1},{0x5854, 0xF7B2}, - {0x5857, 0xD3F3},{0x5858, 0xD3D2},{0x585A, 0xF5C0},{0x585E, 0xDFDD},{0x5861, 0xEEF3},{0x5862, 0xE7F1},{0x5864, 0xFDB4},{0x5875, 0xF2C8}, - {0x5879, 0xF3D2},{0x587C, 0xEEF4},{0x587E, 0xE2D3},{0x5883, 0xCCD1},{0x5885, 0xDFEA},{0x5889, 0xE9BA},{0x5893, 0xD9D7},{0x589C, 0xF5CD}, - {0x589E, 0xF1F2},{0x589F, 0xFAC7},{0x58A8, 0xD9F8},{0x58A9, 0xD4C2},{0x58AE, 0xF6E5},{0x58B3, 0xDDC5},{0x58BA, 0xE7F2},{0x58BB, 0xEDDF}, - {0x58BE, 0xCACB},{0x58C1, 0xDBFA},{0x58C5, 0xE8B5},{0x58C7, 0xD3A6},{0x58CE, 0xFDB5},{0x58D1, 0xF9C9},{0x58D3, 0xE4E2},{0x58D5, 0xFBBD}, - {0x58D8, 0xD7A4},{0x58D9, 0xCEC5},{0x58DE, 0xCED5},{0x58DF, 0xD6E6},{0x58E4, 0xE5BD},{0x58EB, 0xDECD},{0x58EC, 0xECF3},{0x58EF, 0xEDE0}, - {0x58F9, 0xECEC},{0x58FA, 0xFBBE},{0x58FB, 0xDFEB},{0x58FD, 0xE1F8},{0x590F, 0xF9BE},{0x5914, 0xD0F3},{0x5915, 0xE0AA},{0x5916, 0xE8E2}, - {0x5919, 0xE2D4},{0x591A, 0xD2FD},{0x591C, 0xE5A8},{0x5922, 0xD9D3},{0x5927, 0xD3DE},{0x5929, 0xF4B8},{0x592A, 0xF7BC},{0x592B, 0xDCFD}, - {0x592D, 0xE8EC},{0x592E, 0xE4E7},{0x5931, 0xE3F7},{0x5937, 0xECA8},{0x593E, 0xFAF1},{0x5944, 0xE5F2},{0x5947, 0xD0F4},{0x5948, 0xD2AF}, - {0x5949, 0xDCE5},{0x594E, 0xD0A5},{0x594F, 0xF1B4},{0x5950, 0xFCB1},{0x5951, 0xCCF8},{0x5954, 0xDDC6},{0x5955, 0xFAD1},{0x5957, 0xF7DF}, - {0x595A, 0xFAA8},{0x5960, 0xEEF5},{0x5962, 0xDECE},{0x5967, 0xE7F3},{0x596A, 0xF7AC},{0x596B, 0xEBC4},{0x596C, 0xEDE1},{0x596D, 0xE0AB}, - {0x596E, 0xDDC7},{0x5973, 0xD2B3},{0x5974, 0xD2BF},{0x5978, 0xCACC},{0x597D, 0xFBBF},{0x5982, 0xE5FD},{0x5983, 0xDDE5},{0x5984, 0xD8CD}, - {0x598A, 0xECF4},{0x5993, 0xD0F5},{0x5996, 0xE8ED},{0x5997, 0xD0D2},{0x5999, 0xD9D8},{0x59A5, 0xF6E6},{0x59A8, 0xDBAA},{0x59AC, 0xF7E0}, - {0x59B9, 0xD8D9},{0x59BB, 0xF4A3},{0x59BE, 0xF4DD},{0x59C3, 0xEFD1},{0x59C6, 0xD9B5},{0x59C9, 0xEDAB},{0x59CB, 0xE3B7},{0x59D0, 0xEEBB}, - {0x59D1, 0xCDB4},{0x59D3, 0xE0F3},{0x59D4, 0xEACD},{0x59D9, 0xECF5},{0x59DA, 0xE8EE},{0x59DC, 0xCBA9},{0x59DD, 0xF1AF},{0x59E6, 0xCACD}, - {0x59E8, 0xECA9},{0x59EA, 0xF2EB},{0x59EC, 0xFDEF},{0x59EE, 0xF9F3},{0x59F8, 0xE6C1},{0x59FB, 0xECD8},{0x59FF, 0xEDAC},{0x5A01, 0xEACE}, - {0x5A03, 0xE8DF},{0x5A11, 0xDECF},{0x5A18, 0xD2A6},{0x5A1B, 0xE7F4},{0x5A1C, 0xD1D6},{0x5A1F, 0xE6C2},{0x5A20, 0xE3E3},{0x5A25, 0xE4B0}, - {0x5A29, 0xD8B4},{0x5A36, 0xF6A5},{0x5A3C, 0xF3DE},{0x5A41, 0xD7A5},{0x5A46, 0xF7E8},{0x5A49, 0xE8C6},{0x5A5A, 0xFBE6},{0x5A62, 0xDDE6}, - {0x5A66, 0xDCFE},{0x5A92, 0xD8DA},{0x5A9A, 0xDAAC},{0x5A9B, 0xEAB0},{0x5AA4, 0xE3B8},{0x5AC1, 0xCAAA},{0x5AC2, 0xE1F9},{0x5AC4, 0xEAB1}, - {0x5AC9, 0xF2EC},{0x5ACC, 0xFAEE},{0x5AE1, 0xEED5},{0x5AE6, 0xF9F4},{0x5AE9, 0xD2EC},{0x5B05, 0xFBFB},{0x5B09, 0xFDF0},{0x5B0B, 0xE0BD}, - {0x5B0C, 0xCEE3},{0x5B16, 0xF8C6},{0x5B2A, 0xDEAE},{0x5B40, 0xDFC5},{0x5B43, 0xE5BE},{0x5B50, 0xEDAD},{0x5B51, 0xFAEA},{0x5B54, 0xCDEE}, - {0x5B55, 0xEDA6},{0x5B57, 0xEDAE},{0x5B58, 0xF0ED},{0x5B5A, 0xDDA1},{0x5B5C, 0xEDAF},{0x5B5D, 0xFCF8},{0x5B5F, 0xD8EB},{0x5B63, 0xCCF9}, - {0x5B64, 0xCDB5},{0x5B69, 0xFAA9},{0x5B6B, 0xE1DD},{0x5B70, 0xE2D5},{0x5B71, 0xEDCF},{0x5B75, 0xDDA2},{0x5B78, 0xF9CA},{0x5B7A, 0xEAE8}, - {0x5B7C, 0xE5ED},{0x5B85, 0xD3EB},{0x5B87, 0xE9D4},{0x5B88, 0xE1FA},{0x5B89, 0xE4CC},{0x5B8B, 0xE1E4},{0x5B8C, 0xE8C7},{0x5B8F, 0xCEDB}, - {0x5B93, 0xDCD5},{0x5B95, 0xF7B5},{0x5B96, 0xFCF3},{0x5B97, 0xF0F3},{0x5B98, 0xCEAF},{0x5B99, 0xF1B5},{0x5B9A, 0xEFD2},{0x5B9B, 0xE8C8}, - {0x5B9C, 0xEBF1},{0x5BA2, 0xCBD4},{0x5BA3, 0xE0BE},{0x5BA4, 0xE3F8},{0x5BA5, 0xEAE9},{0x5BA6, 0xFCB2},{0x5BAC, 0xE0F4},{0x5BAE, 0xCFE0}, - {0x5BB0, 0xEEA5},{0x5BB3, 0xFAAA},{0x5BB4, 0xE6C3},{0x5BB5, 0xE1B2},{0x5BB6, 0xCAAB},{0x5BB8, 0xE3E4},{0x5BB9, 0xE9BB},{0x5BBF, 0xE2D6}, - {0x5BC0, 0xF3F2},{0x5BC2, 0xEED6},{0x5BC3, 0xEAB2},{0x5BC4, 0xD0F6},{0x5BC5, 0xECD9},{0x5BC6, 0xDACB},{0x5BC7, 0xCFA8},{0x5BCC, 0xDDA3}, - {0x5BD0, 0xD8DB},{0x5BD2, 0xF9CE},{0x5BD3, 0xE9D5},{0x5BD4, 0xE3D1},{0x5BD7, 0xD2BC},{0x5BDE, 0xD8AC},{0x5BDF, 0xF3CC},{0x5BE1, 0xCDFB}, - {0x5BE2, 0xF6D6},{0x5BE4, 0xE7F5},{0x5BE5, 0xE8EF},{0x5BE6, 0xE3F9},{0x5BE7, 0xD2BB},{0x5BE8, 0xF3F3},{0x5BE9, 0xE3FB},{0x5BEB, 0xDED0}, - {0x5BEC, 0xCEB0},{0x5BEE, 0xD6F7},{0x5BEF, 0xF1D9},{0x5BF5, 0xF5C1},{0x5BF6, 0xDCC4},{0x5BF8, 0xF5BB},{0x5BFA, 0xDED1},{0x5C01, 0xDCE6}, - {0x5C04, 0xDED2},{0x5C07, 0xEDE2},{0x5C08, 0xEEF6},{0x5C09, 0xEACF},{0x5C0A, 0xF0EE},{0x5C0B, 0xE3FC},{0x5C0D, 0xD3DF},{0x5C0E, 0xD3F4}, - {0x5C0F, 0xE1B3},{0x5C11, 0xE1B4},{0x5C16, 0xF4D3},{0x5C19, 0xDFC6},{0x5C24, 0xE9D6},{0x5C28, 0xDBAB},{0x5C31, 0xF6A6},{0x5C38, 0xE3B9}, - {0x5C39, 0xEBC5},{0x5C3A, 0xF4A9},{0x5C3B, 0xCDB6},{0x5C3C, 0xD2F9},{0x5C3E, 0xDAAD},{0x5C3F, 0xD2E3},{0x5C40, 0xCFD1},{0x5C45, 0xCBDC}, - {0x5C46, 0xCCFA},{0x5C48, 0xCFDD},{0x5C4B, 0xE8A9},{0x5C4D, 0xE3BB},{0x5C4E, 0xE3BA},{0x5C51, 0xE0DA},{0x5C55, 0xEEF7},{0x5C5B, 0xDCB3}, - {0x5C60, 0xD3F5},{0x5C62, 0xD7A6},{0x5C64, 0xF6B5},{0x5C65, 0xD7DB},{0x5C6C, 0xE1D5},{0x5C6F, 0xD4EA},{0x5C71, 0xDFA3},{0x5C79, 0xFDDF}, - {0x5C90, 0xD0F7},{0x5C91, 0xEDD4},{0x5CA1, 0xCBAA},{0x5CA9, 0xE4DB},{0x5CAB, 0xE1FB},{0x5CAC, 0xCBA2},{0x5CB1, 0xD3E0},{0x5CB3, 0xE4BF}, - {0x5CB5, 0xFBC0},{0x5CB7, 0xDABE},{0x5CB8, 0xE4CD},{0x5CBA, 0xD6B9},{0x5CBE, 0xEFC0},{0x5CC0, 0xE1FC},{0x5CD9, 0xF6B9},{0x5CE0, 0xDFC7}, - {0x5CE8, 0xE4B1},{0x5CEF, 0xDCE7},{0x5CF0, 0xDCE8},{0x5CF4, 0xFAD6},{0x5CF6, 0xD3F6},{0x5CFB, 0xF1DA},{0x5CFD, 0xFAF2},{0x5D07, 0xE2FD}, - {0x5D0D, 0xD5CF},{0x5D0E, 0xD0F8},{0x5D11, 0xCDDF},{0x5D14, 0xF5CB},{0x5D16, 0xE4F0},{0x5D17, 0xCBAB},{0x5D19, 0xD7C4},{0x5D27, 0xE2FE}, - {0x5D29, 0xDDDA},{0x5D4B, 0xDAAE},{0x5D4C, 0xCAEE},{0x5D50, 0xD5B9},{0x5D69, 0xE3A1},{0x5D6C, 0xE8E3},{0x5D6F, 0xF3AB},{0x5D87, 0xCFA9}, - {0x5D8B, 0xD3F7},{0x5D9D, 0xD4F1},{0x5DA0, 0xCEE4},{0x5DA2, 0xE8F2},{0x5DAA, 0xE5F5},{0x5DB8, 0xE7AE},{0x5DBA, 0xD6BA},{0x5DBC, 0xDFEC}, - {0x5DBD, 0xE4C0},{0x5DCD, 0xE8E4},{0x5DD2, 0xD8B5},{0x5DD6, 0xE4DC},{0x5DDD, 0xF4B9},{0x5DDE, 0xF1B6},{0x5DE1, 0xE2DE},{0x5DE2, 0xE1B5}, - {0x5DE5, 0xCDEF},{0x5DE6, 0xF1A7},{0x5DE7, 0xCEE5},{0x5DE8, 0xCBDD},{0x5DEB, 0xD9E3},{0x5DEE, 0xF3AC},{0x5DF1, 0xD0F9},{0x5DF2, 0xECAB}, - {0x5DF3, 0xDED3},{0x5DF4, 0xF7E9},{0x5DF7, 0xF9F5},{0x5DFD, 0xE1DE},{0x5DFE, 0xCBEE},{0x5E02, 0xE3BC},{0x5E03, 0xF8D6},{0x5E06, 0xDBEE}, - {0x5E0C, 0xFDF1},{0x5E11, 0xF7B6},{0x5E16, 0xF4DE},{0x5E19, 0xF2ED},{0x5E1B, 0xDBD9},{0x5E1D, 0xF0A8},{0x5E25, 0xE1FD},{0x5E2B, 0xDED4}, - {0x5E2D, 0xE0AC},{0x5E33, 0xEDE3},{0x5E36, 0xD3E1},{0x5E38, 0xDFC8},{0x5E3D, 0xD9B6},{0x5E3F, 0xFDAC},{0x5E40, 0xEFD3},{0x5E44, 0xE4C1}, - {0x5E45, 0xF8EB},{0x5E47, 0xDBAC},{0x5E4C, 0xFCC6},{0x5E55, 0xD8AD},{0x5E5F, 0xF6BA},{0x5E61, 0xDBDF},{0x5E62, 0xD3D3},{0x5E63, 0xF8C7}, - {0x5E72, 0xCACE},{0x5E73, 0xF8C1},{0x5E74, 0xD2B4},{0x5E77, 0xDCB4},{0x5E78, 0xFAB9},{0x5E79, 0xCACF},{0x5E7B, 0xFCB3},{0x5E7C, 0xEAEA}, - {0x5E7D, 0xEAEB},{0x5E7E, 0xD0FA},{0x5E84, 0xEDE4},{0x5E87, 0xDDE7},{0x5E8A, 0xDFC9},{0x5E8F, 0xDFED},{0x5E95, 0xEEBC},{0x5E97, 0xEFC1}, - {0x5E9A, 0xCCD2},{0x5E9C, 0xDDA4},{0x5EA0, 0xDFCA},{0x5EA6, 0xD3F8},{0x5EA7, 0xF1A8},{0x5EAB, 0xCDB7},{0x5EAD, 0xEFD4},{0x5EB5, 0xE4DD}, - {0x5EB6, 0xDFEE},{0x5EB7, 0xCBAC},{0x5EB8, 0xE9BC},{0x5EBE, 0xEAEC},{0x5EC2, 0xDFCB},{0x5EC8, 0xF9BF},{0x5EC9, 0xD6AF},{0x5ECA, 0xD5C6}, - {0x5ED0, 0xCFAA},{0x5ED3, 0xCEA9},{0x5ED6, 0xD6F8},{0x5EDA, 0xF1B7},{0x5EDB, 0xEEF8},{0x5EDF, 0xD9D9},{0x5EE0, 0xF3DF},{0x5EE2, 0xF8C8}, - {0x5EE3, 0xCEC6},{0x5EEC, 0xD5E6},{0x5EF3, 0xF4E6},{0x5EF6, 0xE6C5},{0x5EF7, 0xEFD5},{0x5EFA, 0xCBEF},{0x5EFB, 0xFCDF},{0x5F01, 0xDCA7}, - {0x5F04, 0xD6E7},{0x5F0A, 0xF8C9},{0x5F0F, 0xE3D2},{0x5F11, 0xE3BD},{0x5F13, 0xCFE1},{0x5F14, 0xF0C0},{0x5F15, 0xECDA},{0x5F17, 0xDDD7}, - {0x5F18, 0xFBF0},{0x5F1B, 0xECAC},{0x5F1F, 0xF0A9},{0x5F26, 0xFAD7},{0x5F27, 0xFBC1},{0x5F29, 0xD2C0},{0x5F31, 0xE5B0},{0x5F35, 0xEDE5}, - {0x5F3A, 0xCBAD},{0x5F3C, 0xF9B0},{0x5F48, 0xF7A5},{0x5F4A, 0xCBAE},{0x5F4C, 0xDAAF},{0x5F4E, 0xD8B6},{0x5F56, 0xD3A7},{0x5F57, 0xFBB2}, - {0x5F59, 0xFDC4},{0x5F5B, 0xECAD},{0x5F62, 0xFBA1},{0x5F66, 0xE5E9},{0x5F67, 0xE9EE},{0x5F69, 0xF3F4},{0x5F6A, 0xF8F3},{0x5F6B, 0xF0C1}, - {0x5F6C, 0xDEAF},{0x5F6D, 0xF8B0},{0x5F70, 0xF3E0},{0x5F71, 0xE7AF},{0x5F77, 0xDBAD},{0x5F79, 0xE6B5},{0x5F7C, 0xF9A8},{0x5F7F, 0xDDD8}, - {0x5F80, 0xE8D9},{0x5F81, 0xEFD6},{0x5F85, 0xD3E2},{0x5F87, 0xE2DF},{0x5F8A, 0xFCE0},{0x5F8B, 0xD7C8},{0x5F8C, 0xFDAD},{0x5F90, 0xDFEF}, - {0x5F91, 0xCCD3},{0x5F92, 0xD3F9},{0x5F97, 0xD4F0},{0x5F98, 0xDBC7},{0x5F99, 0xDED5},{0x5F9E, 0xF0F4},{0x5FA0, 0xD5D0},{0x5FA1, 0xE5D9}, - {0x5FA8, 0xFCC7},{0x5FA9, 0xDCD6},{0x5FAA, 0xE2E0},{0x5FAE, 0xDAB0},{0x5FB5, 0xF3A3},{0x5FB7, 0xD3EC},{0x5FB9, 0xF4CB},{0x5FBD, 0xFDC5}, - {0x5FC3, 0xE3FD},{0x5FC5, 0xF9B1},{0x5FCC, 0xD0FB},{0x5FCD, 0xECDB},{0x5FD6, 0xF5BC},{0x5FD7, 0xF2A4},{0x5FD8, 0xD8CE},{0x5FD9, 0xD8CF}, - {0x5FE0, 0xF5F7},{0x5FEB, 0xF6E1},{0x5FF5, 0xD2B7},{0x5FFD, 0xFBEC},{0x5FFF, 0xDDC8},{0x600F, 0xE4E8},{0x6012, 0xD2C1},{0x6016, 0xF8D7}, - {0x601C, 0xD6BB},{0x601D, 0xDED6},{0x6020, 0xF7BD},{0x6021, 0xECAE},{0x6025, 0xD0E1},{0x6027, 0xE0F5},{0x6028, 0xEAB3},{0x602A, 0xCED6}, - {0x602F, 0xCCA5},{0x6041, 0xECF6},{0x6042, 0xE2E1},{0x6043, 0xE3BE},{0x604D, 0xFCC8},{0x6050, 0xCDF0},{0x6052, 0xF9F6},{0x6055, 0xDFF0}, - {0x6059, 0xE5BF},{0x605D, 0xCEBF},{0x6062, 0xFCE1},{0x6063, 0xEDB0},{0x6064, 0xFDD1},{0x6065, 0xF6BB},{0x6068, 0xF9CF},{0x6069, 0xEBDA}, - {0x606A, 0xCAC1},{0x606C, 0xD2B8},{0x606D, 0xCDF1},{0x606F, 0xE3D3},{0x6070, 0xFDE6},{0x6085, 0xE6ED},{0x6089, 0xE3FA},{0x608C, 0xF0AA}, - {0x608D, 0xF9D0},{0x6094, 0xFCE2},{0x6096, 0xF8A7},{0x609A, 0xE1E5},{0x609B, 0xEEF9},{0x609F, 0xE7F6},{0x60A0, 0xEAED},{0x60A3, 0xFCB4}, - {0x60A4, 0xF5C2},{0x60A7, 0xD7DC},{0x60B0, 0xF0F5},{0x60B2, 0xDDE8},{0x60B3, 0xD3ED},{0x60B4, 0xF5FC},{0x60B6, 0xDABF},{0x60B8, 0xCCFB}, - {0x60BC, 0xD3FA},{0x60BD, 0xF4A4},{0x60C5, 0xEFD7},{0x60C7, 0xD4C3},{0x60D1, 0xFBE3},{0x60DA, 0xFBED},{0x60DC, 0xE0AD},{0x60DF, 0xEAEE}, - {0x60E0, 0xFBB3},{0x60E1, 0xE4C2},{0x60F0, 0xF6E7},{0x60F1, 0xD2DD},{0x60F3, 0xDFCC},{0x60F6, 0xFCC9},{0x60F9, 0xE5A9},{0x60FA, 0xE0F6}, - {0x60FB, 0xF6B3},{0x6101, 0xE1FE},{0x6106, 0xCBF0},{0x6108, 0xEAEF},{0x6109, 0xEAF0},{0x610D, 0xDAC0},{0x610E, 0xF8B4},{0x610F, 0xEBF2}, - {0x6115, 0xE4C3},{0x611A, 0xE9D7},{0x611B, 0xE4F1},{0x611F, 0xCAEF},{0x6127, 0xCED7},{0x6130, 0xFCCA},{0x6134, 0xF3E1},{0x6137, 0xCBC4}, - {0x613C, 0xE3E5},{0x613E, 0xCBC5},{0x613F, 0xEAB4},{0x6142, 0xE9BD},{0x6144, 0xD7C9},{0x6147, 0xEBDB},{0x6148, 0xEDB1},{0x614A, 0xCCC3}, - {0x614B, 0xF7BE},{0x614C, 0xFCCB},{0x6153, 0xF8F4},{0x6155, 0xD9B7},{0x6158, 0xF3D3},{0x6159, 0xF3D4},{0x615D, 0xF7E4},{0x615F, 0xF7D1}, - {0x6162, 0xD8B7},{0x6163, 0xCEB1},{0x6164, 0xCAC2},{0x6167, 0xFBB4},{0x6168, 0xCBC6},{0x616B, 0xF0F6},{0x616E, 0xD5E7},{0x6170, 0xEAD0}, - {0x6176, 0xCCD4},{0x6177, 0xCBAF},{0x617D, 0xF4AA},{0x617E, 0xE9AF},{0x6181, 0xF5C3},{0x6182, 0xE9D8},{0x618A, 0xDDE9},{0x618E, 0xF1F3}, - {0x6190, 0xD5FB},{0x6191, 0xDEBB},{0x6194, 0xF4FB},{0x6198, 0xFDF3},{0x6199, 0xFDF2},{0x619A, 0xF7A6},{0x61A4, 0xDDC9},{0x61A7, 0xD4D3}, - {0x61A9, 0xCCA8},{0x61AB, 0xDAC1},{0x61AC, 0xCCD5},{0x61AE, 0xD9E4},{0x61B2, 0xFACA},{0x61B6, 0xE5E3},{0x61BA, 0xD3BC},{0x61BE, 0xCAF0}, - {0x61C3, 0xD0C4},{0x61C7, 0xCAD0},{0x61C8, 0xFAAB},{0x61C9, 0xEBEB},{0x61CA, 0xE7F8},{0x61CB, 0xD9E5},{0x61E6, 0xD1D7},{0x61F2, 0xF3A4}, - {0x61F6, 0xD4FB},{0x61F7, 0xFCE3},{0x61F8, 0xFAD8},{0x61FA, 0xF3D5},{0x61FC, 0xCFAB},{0x61FF, 0xEBF3},{0x6200, 0xD5FC},{0x6207, 0xD3D4}, - {0x6208, 0xCDFC},{0x620A, 0xD9E6},{0x620C, 0xE2F9},{0x620D, 0xE2A1},{0x620E, 0xEBD4},{0x6210, 0xE0F7},{0x6211, 0xE4B2},{0x6212, 0xCCFC}, - {0x6216, 0xFBE4},{0x621A, 0xF4AB},{0x621F, 0xD0BD},{0x6221, 0xCAF1},{0x622A, 0xEFB8},{0x622E, 0xD7C0},{0x6230, 0xEEFA},{0x6231, 0xFDF4}, - {0x6234, 0xD3E3},{0x6236, 0xFBC2},{0x623E, 0xD5E8},{0x623F, 0xDBAE},{0x6240, 0xE1B6},{0x6241, 0xF8B7},{0x6247, 0xE0BF},{0x6248, 0xFBC3}, - {0x6249, 0xDDEA},{0x624B, 0xE2A2},{0x624D, 0xEEA6},{0x6253, 0xF6E8},{0x6258, 0xF6F5},{0x626E, 0xDDCA},{0x6271, 0xD0E2},{0x6276, 0xDDA6}, - {0x6279, 0xDDEB},{0x627C, 0xE4F9},{0x627F, 0xE3AF},{0x6280, 0xD0FC},{0x6284, 0xF4FC},{0x6289, 0xCCBC},{0x628A, 0xF7EA},{0x6291, 0xE5E4}, - {0x6292, 0xDFF1},{0x6295, 0xF7E1},{0x6297, 0xF9F7},{0x6298, 0xEFB9},{0x629B, 0xF8D8},{0x62AB, 0xF9A9},{0x62B1, 0xF8D9},{0x62B5, 0xEEBD}, - {0x62B9, 0xD8C6},{0x62BC, 0xE4E3},{0x62BD, 0xF5CE},{0x62C2, 0xDDD9},{0x62C7, 0xD9E7},{0x62C8, 0xD2B9},{0x62C9, 0xD5C3},{0x62CC, 0xDAE5}, - {0x62CD, 0xDAD0},{0x62CF, 0xD1D9},{0x62D0, 0xCED8},{0x62D2, 0xCBDE},{0x62D3, 0xF4AC},{0x62D4, 0xDAFB},{0x62D6, 0xF6E9},{0x62D7, 0xE8F3}, - {0x62D8, 0xCFAC},{0x62D9, 0xF0F0},{0x62DB, 0xF4FD},{0x62DC, 0xDBC8},{0x62EC, 0xCEC0},{0x62ED, 0xE3D4},{0x62EE, 0xD1CF},{0x62EF, 0xF1F5}, - {0x62F1, 0xCDF2},{0x62F3, 0xCFEB},{0x62F7, 0xCDB8},{0x62FE, 0xE3A6},{0x62FF, 0xD1DA},{0x6301, 0xF2A5},{0x6307, 0xF2A6},{0x6309, 0xE4CE}, - {0x6311, 0xD3FB},{0x632B, 0xF1A9},{0x632F, 0xF2C9},{0x633A, 0xEFD8},{0x633B, 0xE6C9},{0x633D, 0xD8B8},{0x633E, 0xFAF3},{0x6349, 0xF3B5}, - {0x634C, 0xF8A4},{0x634F, 0xD1F3},{0x6350, 0xE6C8},{0x6355, 0xF8DA},{0x6367, 0xDCE9},{0x6368, 0xDED7},{0x636E, 0xCBDF},{0x6372, 0xCFEC}, - {0x6377, 0xF4DF},{0x637A, 0xD1F4},{0x637B, 0xD2BA},{0x637F, 0xDFF2},{0x6383, 0xE1B7},{0x6388, 0xE2A3},{0x6389, 0xD3FC},{0x638C, 0xEDE6}, - {0x6392, 0xDBC9},{0x6396, 0xE4FA},{0x6398, 0xCFDE},{0x639B, 0xCED0},{0x63A0, 0xD5D3},{0x63A1, 0xF3F5},{0x63A2, 0xF7AE},{0x63A5, 0xEFC8}, - {0x63A7, 0xCDF3},{0x63A8, 0xF5CF},{0x63A9, 0xE5F3},{0x63AA, 0xF0C2},{0x63C0, 0xCAD1},{0x63C4, 0xEAF1},{0x63C6, 0xD0A6},{0x63CF, 0xD9DA}, - {0x63D0, 0xF0AB},{0x63D6, 0xEBE7},{0x63DA, 0xE5C0},{0x63DB, 0xFCB5},{0x63E1, 0xE4C4},{0x63ED, 0xCCA9},{0x63EE, 0xFDC6},{0x63F4, 0xEAB5}, - {0x63F6, 0xE5AA},{0x63F7, 0xDFBA},{0x640D, 0xE1DF},{0x640F, 0xDAD1},{0x6414, 0xE1B8},{0x6416, 0xE8F4},{0x6417, 0xD3FD},{0x641C, 0xE2A4}, - {0x6422, 0xF2CA},{0x642C, 0xDAE6},{0x642D, 0xF7B3},{0x643A, 0xFDCD},{0x643E, 0xF3B6},{0x6458, 0xEED7},{0x6460, 0xF5C4},{0x6469, 0xD8A4}, - {0x646F, 0xF2A7},{0x6478, 0xD9B8},{0x6479, 0xD9B9},{0x647A, 0xEFC9},{0x6488, 0xD6CE},{0x6491, 0xF7CB},{0x6492, 0xDFAE},{0x6493, 0xE8F5}, - {0x649A, 0xD2B5},{0x649E, 0xD3D5},{0x64A4, 0xF4CC},{0x64A5, 0xDAFC},{0x64AB, 0xD9E8},{0x64AD, 0xF7EB},{0x64AE, 0xF5C9},{0x64B0, 0xF3BC}, - {0x64B2, 0xDAD2},{0x64BB, 0xD3B5},{0x64C1, 0xE8B6},{0x64C4, 0xD6CF},{0x64C5, 0xF4BA},{0x64C7, 0xF7C9},{0x64CA, 0xCCAA},{0x64CD, 0xF0C3}, - {0x64CE, 0xCCD6},{0x64D2, 0xD0D3},{0x64D4, 0xD3BD},{0x64D8, 0xDBFB},{0x64DA, 0xCBE0},{0x64E1, 0xD3E4},{0x64E2, 0xF6F7},{0x64E5, 0xD5BA}, - {0x64E6, 0xF3CD},{0x64E7, 0xCBE1},{0x64EC, 0xEBF4},{0x64F2, 0xF4AD},{0x64F4, 0xFCAA},{0x64FA, 0xF7EC},{0x64FE, 0xE8F6},{0x6500, 0xDAE7}, - {0x6504, 0xF7CC},{0x6518, 0xE5C1},{0x651D, 0xE0EE},{0x6523, 0xD5FD},{0x652A, 0xCEE6},{0x652B, 0xFCAB},{0x652C, 0xD5BB},{0x652F, 0xF2A8}, - {0x6536, 0xE2A5},{0x6537, 0xCDB9},{0x6538, 0xEAF2},{0x6539, 0xCBC7},{0x653B, 0xCDF4},{0x653E, 0xDBAF},{0x653F, 0xEFD9},{0x6545, 0xCDBA}, - {0x6548, 0xFCF9},{0x654D, 0xDFF3},{0x654E, 0xCEE7},{0x654F, 0xDAC2},{0x6551, 0xCFAD},{0x6556, 0xE7F9},{0x6557, 0xF8A8},{0x655E, 0xF3E2}, - {0x6562, 0xCAF2},{0x6563, 0xDFA4},{0x6566, 0xD4C4},{0x656C, 0xCCD7},{0x656D, 0xE5C2},{0x6572, 0xCDBB},{0x6574, 0xEFDA},{0x6575, 0xEED8}, - {0x6577, 0xDDA7},{0x6578, 0xE2A6},{0x657E, 0xE0C0},{0x6582, 0xD6B0},{0x6583, 0xF8CA},{0x6585, 0xFCFA},{0x6587, 0xD9FE},{0x658C, 0xDEB0}, - {0x6590, 0xDDEC},{0x6591, 0xDAE8},{0x6597, 0xD4E0},{0x6599, 0xD6F9},{0x659B, 0xCDD7},{0x659C, 0xDED8},{0x659F, 0xF2F8},{0x65A1, 0xE4D6}, - {0x65A4, 0xD0C5},{0x65A5, 0xF4AE},{0x65A7, 0xDDA8},{0x65AB, 0xEDC5},{0x65AC, 0xF3D6},{0x65AF, 0xDED9},{0x65B0, 0xE3E6},{0x65B7, 0xD3A8}, - {0x65B9, 0xDBB0},{0x65BC, 0xE5DA},{0x65BD, 0xE3BF},{0x65C1, 0xDBB1},{0x65C5, 0xD5E9},{0x65CB, 0xE0C1},{0x65CC, 0xEFDB},{0x65CF, 0xF0E9}, - {0x65D2, 0xD7B2},{0x65D7, 0xD0FD},{0x65E0, 0xD9E9},{0x65E3, 0xD0FE},{0x65E5, 0xECED},{0x65E6, 0xD3A9},{0x65E8, 0xF2A9},{0x65E9, 0xF0C4}, - {0x65EC, 0xE2E2},{0x65ED, 0xE9EF},{0x65F1, 0xF9D1},{0x65F4, 0xE9D9},{0x65FA, 0xE8DA},{0x65FB, 0xDAC3},{0x65FC, 0xDAC4},{0x65FD, 0xD4C5}, - {0x65FF, 0xE7FA},{0x6606, 0xCDE0},{0x6607, 0xE3B0},{0x6609, 0xDBB2},{0x660A, 0xFBC4},{0x660C, 0xF3E3},{0x660E, 0xD9A5},{0x660F, 0xFBE7}, - {0x6610, 0xDDCB},{0x6611, 0xD0D4},{0x6613, 0xE6B6},{0x6614, 0xE0AE},{0x6615, 0xFDDA},{0x661E, 0xDCB5},{0x661F, 0xE0F8},{0x6620, 0xE7B1}, - {0x6625, 0xF5F0},{0x6627, 0xD8DC},{0x6628, 0xEDC6},{0x662D, 0xE1B9},{0x662F, 0xE3C0},{0x6630, 0xF9C0},{0x6631, 0xE9F0},{0x6634, 0xD9DB}, - {0x6636, 0xF3E4},{0x663A, 0xDCB6},{0x663B, 0xE4E9},{0x6641, 0xF0C5},{0x6642, 0xE3C1},{0x6643, 0xFCCC},{0x6644, 0xFCCD},{0x6649, 0xF2CB}, - {0x664B, 0xF2CC},{0x664F, 0xE4CF},{0x6659, 0xF1DB},{0x665B, 0xFAD9},{0x665D, 0xF1B8},{0x665E, 0xFDF5},{0x665F, 0xE0F9},{0x6664, 0xE7FB}, - {0x6665, 0xFCB7},{0x6666, 0xFCE4},{0x6667, 0xFBC5},{0x6668, 0xE3E7},{0x6669, 0xD8B9},{0x666B, 0xF6F8},{0x666E, 0xDCC5},{0x666F, 0xCCD8}, - {0x6673, 0xE0AF},{0x6674, 0xF4E7},{0x6676, 0xEFDC},{0x6677, 0xCFFC},{0x6678, 0xEFDD},{0x667A, 0xF2AA},{0x6684, 0xFDBE},{0x6687, 0xCAAC}, - {0x6688, 0xFDBB},{0x6689, 0xFDC7},{0x668E, 0xE7B2},{0x6690, 0xEAD1},{0x6691, 0xDFF4},{0x6696, 0xD1EC},{0x6697, 0xE4DE},{0x6698, 0xE5C3}, - {0x669D, 0xD9A6},{0x66A0, 0xCDBC},{0x66A2, 0xF3E5},{0x66AB, 0xEDD5},{0x66AE, 0xD9BA},{0x66B2, 0xEDE7},{0x66B3, 0xFBB5},{0x66B4, 0xF8EC}, - {0x66B9, 0xE0E7},{0x66BB, 0xCCD9},{0x66BE, 0xD4C6},{0x66C4, 0xE7A5},{0x66C6, 0xD5F5},{0x66C7, 0xD3BE},{0x66C9, 0xFCFB},{0x66D6, 0xE4F2}, - {0x66D9, 0xDFF5},{0x66DC, 0xE8F8},{0x66DD, 0xF8ED},{0x66E0, 0xCEC7},{0x66E6, 0xFDF6},{0x66F0, 0xE8D8},{0x66F2, 0xCDD8},{0x66F3, 0xE7D6}, - {0x66F4, 0xCCDA},{0x66F7, 0xCAE3},{0x66F8, 0xDFF6},{0x66F9, 0xF0C7},{0x66FA, 0xF0C6},{0x66FC, 0xD8BA},{0x66FE, 0xF1F4},{0x66FF, 0xF4F0}, - {0x6700, 0xF5CC},{0x6703, 0xFCE5},{0x6708, 0xEAC5},{0x6709, 0xEAF3},{0x670B, 0xDDDB},{0x670D, 0xDCD7},{0x6714, 0xDEFD},{0x6715, 0xF2F9}, - {0x6717, 0xD5C7},{0x671B, 0xD8D0},{0x671D, 0xF0C8},{0x671E, 0xD1A1},{0x671F, 0xD1A2},{0x6726, 0xD9D4},{0x6727, 0xD6E8},{0x6728, 0xD9CA}, - {0x672A, 0xDAB1},{0x672B, 0xD8C7},{0x672C, 0xDCE2},{0x672D, 0xF3CE},{0x672E, 0xF5F4},{0x6731, 0xF1B9},{0x6734, 0xDAD3},{0x6736, 0xF6EA}, - {0x673A, 0xCFF5},{0x673D, 0xFDAE},{0x6746, 0xCAD2},{0x6749, 0xDFB4},{0x674E, 0xD7DD},{0x674F, 0xFABA},{0x6750, 0xEEA7},{0x6751, 0xF5BD}, - {0x6753, 0xF8F5},{0x6756, 0xEDE8},{0x675C, 0xD4E1},{0x675E, 0xD1A3},{0x675F, 0xE1D6},{0x676D, 0xF9F8},{0x676F, 0xDBCA},{0x6770, 0xCBF9}, - {0x6771, 0xD4D4},{0x6773, 0xD9DC},{0x6775, 0xEEBE},{0x6777, 0xF7ED},{0x677B, 0xD2EE},{0x677E, 0xE1E6},{0x677F, 0xF7F9},{0x6787, 0xDDED}, - {0x6789, 0xE8DB},{0x678B, 0xDBB3},{0x678F, 0xD1F7},{0x6790, 0xE0B0},{0x6793, 0xD4E2},{0x6795, 0xF6D7},{0x6797, 0xD7F9},{0x679A, 0xD8DD}, - {0x679C, 0xCDFD},{0x679D, 0xF2AB},{0x67AF, 0xCDBD},{0x67B0, 0xF8C2},{0x67B3, 0xF2AC},{0x67B6, 0xCAAD},{0x67B7, 0xCAAE},{0x67B8, 0xCFAE}, - {0x67BE, 0xE3C2},{0x67C4, 0xDCB7},{0x67CF, 0xDBDA},{0x67D0, 0xD9BB},{0x67D1, 0xCAF3},{0x67D2, 0xF6D3},{0x67D3, 0xE6F8},{0x67D4, 0xEAF5}, - {0x67DA, 0xEAF6},{0x67DD, 0xF6F9},{0x67E9, 0xCFAF},{0x67EC, 0xCAD3},{0x67EF, 0xCAAF},{0x67F0, 0xD2B0},{0x67F1, 0xF1BA},{0x67F3, 0xD7B3}, - {0x67F4, 0xE3C3},{0x67F5, 0xF3FD},{0x67F6, 0xDEDA},{0x67FB, 0xDEDB},{0x67FE, 0xEFDE},{0x6812, 0xE2E3},{0x6813, 0xEEFB},{0x6816, 0xDFF7}, - {0x6817, 0xD7CA},{0x6821, 0xCEE8},{0x6822, 0xDBDB},{0x682A, 0xF1BB},{0x682F, 0xE9F1},{0x6838, 0xFAB7},{0x6839, 0xD0C6},{0x683C, 0xCCAB}, - {0x683D, 0xEEA8},{0x6840, 0xCBFA},{0x6841, 0xF9F9},{0x6842, 0xCCFD},{0x6843, 0xD3FE},{0x6848, 0xE4D0},{0x684E, 0xF2EE},{0x6850, 0xD4D5}, - {0x6851, 0xDFCD},{0x6853, 0xFCB8},{0x6854, 0xD1D0},{0x686D, 0xF2CD},{0x6876, 0xF7D2},{0x687F, 0xCAD4},{0x6881, 0xD5D9},{0x6885, 0xD8DE}, - {0x688F, 0xCDD9},{0x6893, 0xEEA9},{0x6894, 0xF6BC},{0x6897, 0xCCDB},{0x689D, 0xF0C9},{0x689F, 0xFCFC},{0x68A1, 0xE8C9},{0x68A2, 0xF4FE}, - {0x68A7, 0xE7FC},{0x68A8, 0xD7DE},{0x68AD, 0xDEDC},{0x68AF, 0xF0AC},{0x68B0, 0xCCFE},{0x68B1, 0xCDE1},{0x68B3, 0xE1BA},{0x68B5, 0xDBEF}, - {0x68B6, 0xDAB2},{0x68C4, 0xD1A5},{0x68C5, 0xDCB8},{0x68C9, 0xD8F6},{0x68CB, 0xD1A4},{0x68CD, 0xCDE2},{0x68D2, 0xDCEA},{0x68D5, 0xF0F7}, - {0x68D7, 0xF0CA},{0x68D8, 0xD0BE},{0x68DA, 0xDDDC},{0x68DF, 0xD4D6},{0x68E0, 0xD3D6},{0x68E7, 0xEDD0},{0x68E8, 0xCDA1},{0x68EE, 0xDFB5}, - {0x68F2, 0xDFF8},{0x68F9, 0xD4A1},{0x68FA, 0xCEB2},{0x6900, 0xE8CA},{0x6905, 0xEBF5},{0x690D, 0xE3D5},{0x690E, 0xF5D0},{0x6912, 0xF5A1}, - {0x6927, 0xD9A7},{0x6930, 0xE5AB},{0x693D, 0xE6CB},{0x693F, 0xF5F1},{0x694A, 0xE5C5},{0x6953, 0xF9A3},{0x6954, 0xE0DB},{0x6955, 0xF6EB}, - {0x6957, 0xCBF1},{0x6959, 0xD9EA},{0x695A, 0xF5A2},{0x695E, 0xD7D1},{0x6960, 0xD1F8},{0x6961, 0xEAF8},{0x6962, 0xEAF9},{0x6963, 0xDAB3}, - {0x6968, 0xEFDF},{0x696B, 0xF1EF},{0x696D, 0xE5F6},{0x696E, 0xEEBF},{0x696F, 0xE2E4},{0x6975, 0xD0BF},{0x6977, 0xFAAC},{0x6978, 0xF5D1}, - {0x6979, 0xE7B3},{0x6995, 0xE9BE},{0x699B, 0xF2CE},{0x699C, 0xDBB4},{0x69A5, 0xFCCE},{0x69A7, 0xDDEE},{0x69AE, 0xE7B4},{0x69B4, 0xD7B4}, - {0x69BB, 0xF7B4},{0x69C1, 0xCDBE},{0x69C3, 0xDAE9},{0x69CB, 0xCFB0},{0x69CC, 0xF7D9},{0x69CD, 0xF3E6},{0x69D0, 0xCED9},{0x69E8, 0xCEAA}, - {0x69EA, 0xCBC8},{0x69FB, 0xD0A7},{0x69FD, 0xF0CB},{0x69FF, 0xD0C7},{0x6A02, 0xE4C5},{0x6A0A, 0xDBE0},{0x6A11, 0xD5DA},{0x6A13, 0xD7A7}, - {0x6A17, 0xEEC0},{0x6A19, 0xF8F6},{0x6A1E, 0xF5D2},{0x6A1F, 0xEDE9},{0x6A21, 0xD9BC},{0x6A23, 0xE5C6},{0x6A35, 0xF5A3},{0x6A38, 0xDAD4}, - {0x6A39, 0xE2A7},{0x6A3A, 0xFBFC},{0x6A3D, 0xF1DC},{0x6A44, 0xCAF4},{0x6A48, 0xE8FA},{0x6A4B, 0xCEE9},{0x6A52, 0xE9F8},{0x6A53, 0xE2E5}, - {0x6A58, 0xD0B9},{0x6A59, 0xD4F2},{0x6A5F, 0xD1A6},{0x6A61, 0xDFCE},{0x6A6B, 0xFCF4},{0x6A80, 0xD3AA},{0x6A84, 0xCCAC},{0x6A89, 0xEFE0}, - {0x6A8D, 0xE5E5},{0x6A8E, 0xD0D5},{0x6A97, 0xDBFC},{0x6A9C, 0xFCE6},{0x6AA2, 0xCBFE},{0x6AA3, 0xEDEA},{0x6AB3, 0xDEB1},{0x6ABB, 0xF9E3}, - {0x6AC2, 0xD4A2},{0x6AC3, 0xCFF6},{0x6AD3, 0xD6D0},{0x6ADA, 0xD5EA},{0x6ADB, 0xF1EE},{0x6AF6, 0xFACB},{0x6AFB, 0xE5A1},{0x6B04, 0xD5B1}, - {0x6B0A, 0xCFED},{0x6B0C, 0xEDEB},{0x6B12, 0xD5B2},{0x6B16, 0xD5BC},{0x6B20, 0xFDE2},{0x6B21, 0xF3AD},{0x6B23, 0xFDDB},{0x6B32, 0xE9B0}, - {0x6B3A, 0xD1A7},{0x6B3D, 0xFDE3},{0x6B3E, 0xCEB3},{0x6B46, 0xFDE4},{0x6B47, 0xFACE},{0x6B4C, 0xCAB0},{0x6B4E, 0xF7A7},{0x6B50, 0xCFB1}, - {0x6B5F, 0xE6A2},{0x6B61, 0xFCB6},{0x6B62, 0xF2AD},{0x6B63, 0xEFE1},{0x6B64, 0xF3AE},{0x6B65, 0xDCC6},{0x6B66, 0xD9EB},{0x6B6A, 0xE8E0}, - {0x6B72, 0xE1A8},{0x6B77, 0xD5F6},{0x6B78, 0xCFFD},{0x6B7B, 0xDEDD},{0x6B7F, 0xD9D1},{0x6B83, 0xE4EA},{0x6B84, 0xF2CF},{0x6B86, 0xF7BF}, - {0x6B89, 0xE2E6},{0x6B8A, 0xE2A8},{0x6B96, 0xE3D6},{0x6B98, 0xEDD1},{0x6B9E, 0xE9F9},{0x6BAE, 0xD6B1},{0x6BAF, 0xDEB2},{0x6BB2, 0xE0E8}, - {0x6BB5, 0xD3AB},{0x6BB7, 0xEBDC},{0x6BBA, 0xDFAF},{0x6BBC, 0xCAC3},{0x6BBF, 0xEEFC},{0x6BC1, 0xFDC3},{0x6BC5, 0xEBF6},{0x6BC6, 0xCFB2}, - {0x6BCB, 0xD9EC},{0x6BCD, 0xD9BD},{0x6BCF, 0xD8DF},{0x6BD2, 0xD4B8},{0x6BD3, 0xEBBE},{0x6BD4, 0xDDEF},{0x6BD6, 0xDDF0},{0x6BD7, 0xDDF1}, - {0x6BD8, 0xDDF2},{0x6BDB, 0xD9BE},{0x6BEB, 0xFBC6},{0x6BEC, 0xCFB3},{0x6C08, 0xEEFD},{0x6C0F, 0xE4AB},{0x6C11, 0xDAC5},{0x6C13, 0xD8EC}, - {0x6C23, 0xD1A8},{0x6C34, 0xE2A9},{0x6C37, 0xDEBC},{0x6C38, 0xE7B5},{0x6C3E, 0xDBF0},{0x6C40, 0xEFE2},{0x6C41, 0xF1F0},{0x6C42, 0xCFB4}, - {0x6C4E, 0xDBF1},{0x6C50, 0xE0B1},{0x6C55, 0xDFA5},{0x6C57, 0xF9D2},{0x6C5A, 0xE7FD},{0x6C5D, 0xE6A3},{0x6C5E, 0xFBF1},{0x6C5F, 0xCBB0}, - {0x6C60, 0xF2AE},{0x6C68, 0xCDE7},{0x6C6A, 0xE8DC},{0x6C6D, 0xE7D7},{0x6C70, 0xF7C0},{0x6C72, 0xD0E3},{0x6C76, 0xDAA1},{0x6C7A, 0xCCBD}, - {0x6C7D, 0xD1A9},{0x6C7E, 0xDDCC},{0x6C81, 0xE3FE},{0x6C82, 0xD1AA},{0x6C83, 0xE8AA},{0x6C85, 0xEAB6},{0x6C86, 0xF9FA},{0x6C87, 0xE6CC}, - {0x6C88, 0xF6D8},{0x6C8C, 0xD4C7},{0x6C90, 0xD9CB},{0x6C92, 0xD9D2},{0x6C93, 0xD3CB},{0x6C94, 0xD8F7},{0x6C95, 0xDAA9},{0x6C96, 0xF5F8}, - {0x6C99, 0xDEDE},{0x6C9A, 0xF2AF},{0x6C9B, 0xF8A9},{0x6CAB, 0xD8C8},{0x6CAE, 0xEEC1},{0x6CB3, 0xF9C1},{0x6CB8, 0xDDF3},{0x6CB9, 0xEAFA}, - {0x6CBB, 0xF6BD},{0x6CBC, 0xE1BB},{0x6CBD, 0xCDBF},{0x6CBE, 0xF4D4},{0x6CBF, 0xE6CD},{0x6CC1, 0xFCCF},{0x6CC2, 0xFBA2},{0x6CC4, 0xE0DC}, - {0x6CC9, 0xF4BB},{0x6CCA, 0xDAD5},{0x6CCC, 0xF9B2},{0x6CD3, 0xFBF2},{0x6CD5, 0xDBF6},{0x6CD7, 0xDEDF},{0x6CDB, 0xDBF2},{0x6CE1, 0xF8DC}, - {0x6CE2, 0xF7EE},{0x6CE3, 0xEBE8},{0x6CE5, 0xD2FA},{0x6CE8, 0xF1BC},{0x6CEB, 0xFADA},{0x6CEE, 0xDAEA},{0x6CEF, 0xDAC6},{0x6CF0, 0xF7C1}, - {0x6CF3, 0xE7B6},{0x6D0B, 0xE5C7},{0x6D0C, 0xD6AC},{0x6D11, 0xDCC7},{0x6D17, 0xE1A9},{0x6D19, 0xE2AA},{0x6D1B, 0xD5A6},{0x6D1E, 0xD4D7}, - {0x6D25, 0xF2D0},{0x6D27, 0xEAFB},{0x6D29, 0xE0DD},{0x6D2A, 0xFBF3},{0x6D32, 0xF1BD},{0x6D35, 0xE2E7},{0x6D36, 0xFDD7},{0x6D38, 0xCEC8}, - {0x6D39, 0xEAB7},{0x6D3B, 0xFCC0},{0x6D3D, 0xFDE7},{0x6D3E, 0xF7EF},{0x6D41, 0xD7B5},{0x6D59, 0xEFBA},{0x6D5A, 0xF1DD},{0x6D5C, 0xDEB3}, - {0x6D63, 0xE8CB},{0x6D66, 0xF8DD},{0x6D69, 0xFBC7},{0x6D6A, 0xD5C8},{0x6D6C, 0xD7DF},{0x6D6E, 0xDDA9},{0x6D74, 0xE9B1},{0x6D77, 0xFAAD}, - {0x6D78, 0xF6D9},{0x6D79, 0xFAF4},{0x6D7F, 0xF8AA},{0x6D85, 0xE6EE},{0x6D87, 0xCCDC},{0x6D88, 0xE1BC},{0x6D89, 0xE0EF},{0x6D8C, 0xE9BF}, - {0x6D8D, 0xFCFD},{0x6D8E, 0xE6CE},{0x6D91, 0xE1D7},{0x6D93, 0xE6CF},{0x6D95, 0xF4F1},{0x6DAF, 0xE4F3},{0x6DB2, 0xE4FB},{0x6DB5, 0xF9E4}, - {0x6DC0, 0xEFE3},{0x6DC3, 0xCFEE},{0x6DC4, 0xF6BE},{0x6DC5, 0xE0B2},{0x6DC6, 0xFCFE},{0x6DC7, 0xD1AB},{0x6DCB, 0xD7FA},{0x6DCF, 0xFBC8}, - {0x6DD1, 0xE2D7},{0x6DD8, 0xD4A3},{0x6DD9, 0xF0F8},{0x6DDA, 0xD7A8},{0x6DDE, 0xE1E7},{0x6DE1, 0xD3BF},{0x6DE8, 0xEFE4},{0x6DEA, 0xD7C5}, - {0x6DEB, 0xEBE2},{0x6DEE, 0xFCE7},{0x6DF1, 0xE4A2},{0x6DF3, 0xE2E8},{0x6DF5, 0xE6D0},{0x6DF7, 0xFBE8},{0x6DF8, 0xF4E8},{0x6DF9, 0xE5F4}, - {0x6DFA, 0xF4BC},{0x6DFB, 0xF4D5},{0x6E17, 0xDFB6},{0x6E19, 0xFCB9},{0x6E1A, 0xEEC2},{0x6E1B, 0xCAF5},{0x6E1F, 0xEFE5},{0x6E20, 0xCBE2}, - {0x6E21, 0xD4A4},{0x6E23, 0xDEE0},{0x6E24, 0xDAFD},{0x6E25, 0xE4C6},{0x6E26, 0xE8BE},{0x6E2B, 0xE0DE},{0x6E2C, 0xF6B4},{0x6E2D, 0xEAD2}, - {0x6E2F, 0xF9FB},{0x6E32, 0xE0C2},{0x6E34, 0xCAE4},{0x6E36, 0xE7B7},{0x6E38, 0xEAFD},{0x6E3A, 0xD9DD},{0x6E3C, 0xDAB4},{0x6E3D, 0xEEAA}, - {0x6E3E, 0xFBE9},{0x6E43, 0xDBCB},{0x6E44, 0xDAB5},{0x6E4A, 0xF1BE},{0x6E4D, 0xD3AC},{0x6E56, 0xFBC9},{0x6E58, 0xDFCF},{0x6E5B, 0xD3C0}, - {0x6E5C, 0xE3D7},{0x6E5E, 0xEFE6},{0x6E5F, 0xFCD0},{0x6E67, 0xE9C0},{0x6E6B, 0xF5D3},{0x6E6E, 0xECDC},{0x6E6F, 0xF7B7},{0x6E72, 0xEAB8}, - {0x6E73, 0xD1F9},{0x6E7A, 0xDCC8},{0x6E90, 0xEAB9},{0x6E96, 0xF1DE},{0x6E9C, 0xD7B6},{0x6E9D, 0xCFB5},{0x6E9F, 0xD9A8},{0x6EA2, 0xECEE}, - {0x6EA5, 0xDDAA},{0x6EAA, 0xCDA2},{0x6EAB, 0xE8AE},{0x6EAF, 0xE1BD},{0x6EB1, 0xF2D1},{0x6EB6, 0xE9C1},{0x6EBA, 0xD2FC},{0x6EC2, 0xDBB5}, - {0x6EC4, 0xF3E7},{0x6EC5, 0xD8FE},{0x6EC9, 0xFCD1},{0x6ECB, 0xEDB2},{0x6ECC, 0xF4AF},{0x6ECE, 0xFBA3},{0x6ED1, 0xFCC1},{0x6ED3, 0xEEAB}, - {0x6ED4, 0xD4A5},{0x6EEF, 0xF4F2},{0x6EF4, 0xEED9},{0x6EF8, 0xFBCA},{0x6EFE, 0xCDE3},{0x6EFF, 0xD8BB},{0x6F01, 0xE5DB},{0x6F02, 0xF8F7}, - {0x6F06, 0xF6D4},{0x6F0F, 0xD7A9},{0x6F11, 0xCBC9},{0x6F14, 0xE6D1},{0x6F15, 0xF0CC},{0x6F20, 0xD8AE},{0x6F22, 0xF9D3},{0x6F23, 0xD5FE}, - {0x6F2B, 0xD8BC},{0x6F2C, 0xF2B0},{0x6F31, 0xE2AB},{0x6F32, 0xF3E8},{0x6F38, 0xEFC2},{0x6F3F, 0xEDEC},{0x6F41, 0xE7B8},{0x6F51, 0xDAFE}, - {0x6F54, 0xCCBE},{0x6F57, 0xF2FC},{0x6F58, 0xDAEB},{0x6F5A, 0xE2D8},{0x6F5B, 0xEDD6},{0x6F5E, 0xD6D1},{0x6F5F, 0xE0B3},{0x6F62, 0xFCD2}, - {0x6F64, 0xEBC8},{0x6F6D, 0xD3C1},{0x6F6E, 0xF0CD},{0x6F70, 0xCFF7},{0x6F7A, 0xEDD2},{0x6F7C, 0xD4D8},{0x6F7D, 0xDCC9},{0x6F7E, 0xD7F1}, - {0x6F81, 0xDFBB},{0x6F84, 0xF3A5},{0x6F88, 0xF4CD},{0x6F8D, 0xF1BF},{0x6F8E, 0xF8B1},{0x6F90, 0xE9FA},{0x6F94, 0xFBCB},{0x6F97, 0xCAD5}, - {0x6FA3, 0xF9D4},{0x6FA4, 0xF7CA},{0x6FA7, 0xD6C8},{0x6FAE, 0xFCE8},{0x6FAF, 0xF3BD},{0x6FB1, 0xEEFE},{0x6FB3, 0xE7FE},{0x6FB9, 0xD3C2}, - {0x6FBE, 0xD3B6},{0x6FC0, 0xCCAD},{0x6FC1, 0xF6FA},{0x6FC2, 0xD6B2},{0x6FC3, 0xD2D8},{0x6FCA, 0xE7D8},{0x6FD5, 0xE3A5},{0x6FDA, 0xE7B9}, - {0x6FDF, 0xF0AD},{0x6FE0, 0xFBCC},{0x6FE1, 0xEBA1},{0x6FE4, 0xD4A6},{0x6FE9, 0xFBCD},{0x6FEB, 0xD5BD},{0x6FEC, 0xF1DF},{0x6FEF, 0xF6FB}, - {0x6FF1, 0xDEB4},{0x6FFE, 0xD5EB},{0x7001, 0xE5C8},{0x7005, 0xFBA4},{0x7006, 0xD4B9},{0x7009, 0xDEE1},{0x700B, 0xE4A3},{0x700F, 0xD7B7}, - {0x7011, 0xF8EE},{0x7015, 0xDEB5},{0x7018, 0xD6D2},{0x701A, 0xF9D5},{0x701B, 0xE7BA},{0x701C, 0xEBD5},{0x701D, 0xD5F7},{0x701E, 0xEFE7}, - {0x701F, 0xE1BE},{0x7023, 0xFAAE},{0x7027, 0xD6E9},{0x7028, 0xD6EE},{0x702F, 0xE7BB},{0x7037, 0xECCB},{0x703E, 0xD5B3},{0x704C, 0xCEB4}, - {0x7050, 0xFBA5},{0x7051, 0xE1EE},{0x7058, 0xF7A8},{0x705D, 0xFBCE},{0x7063, 0xD8BD},{0x706B, 0xFBFD},{0x7070, 0xFCE9},{0x7078, 0xCFB6}, - {0x707C, 0xEDC7},{0x707D, 0xEEAC},{0x7085, 0xCCDD},{0x708A, 0xF6A7},{0x708E, 0xE6FA},{0x7092, 0xF5A4},{0x7098, 0xFDDC},{0x7099, 0xEDB3}, - {0x709A, 0xCEC9},{0x70A1, 0xEFE8},{0x70A4, 0xE1BF},{0x70AB, 0xFADB},{0x70AC, 0xCBE3},{0x70AD, 0xF7A9},{0x70AF, 0xFBA6},{0x70B3, 0xDCB9}, - {0x70B7, 0xF1C0},{0x70B8, 0xEDC8},{0x70B9, 0xEFC3},{0x70C8, 0xD6AD},{0x70CB, 0xFDCE},{0x70CF, 0xE8A1},{0x70D8, 0xFBF4},{0x70D9, 0xD5A7}, - {0x70DD, 0xF1F6},{0x70DF, 0xE6D3},{0x70F1, 0xCCDE},{0x70F9, 0xF8B2},{0x70FD, 0xDCEB},{0x7104, 0xFDB6},{0x7109, 0xE5EA},{0x710C, 0xF1E0}, - {0x7119, 0xDBCC},{0x711A, 0xDDCD},{0x711E, 0xD4C8},{0x7121, 0xD9ED},{0x7126, 0xF5A5},{0x7130, 0xE6FB},{0x7136, 0xE6D4},{0x7147, 0xFDC8}, - {0x7149, 0xD6A1},{0x714A, 0xFDBF},{0x714C, 0xFCD3},{0x714E, 0xEFA1},{0x7150, 0xE7BC},{0x7156, 0xD1EE},{0x7159, 0xE6D5},{0x715C, 0xE9F2}, - {0x715E, 0xDFB0},{0x7164, 0xD8E0},{0x7165, 0xFCBA},{0x7166, 0xFDAF},{0x7167, 0xF0CE},{0x7169, 0xDBE1},{0x716C, 0xE5C9},{0x716E, 0xEDB4}, - {0x717D, 0xE0C3},{0x7184, 0xE3D8},{0x7189, 0xE9FB},{0x718A, 0xEAA8},{0x718F, 0xFDB7},{0x7192, 0xFBA7},{0x7194, 0xE9C2},{0x7199, 0xFDF7}, - {0x719F, 0xE2D9},{0x71A2, 0xDCEC},{0x71AC, 0xE8A2},{0x71B1, 0xE6F0},{0x71B9, 0xFDF8},{0x71BA, 0xFDF9},{0x71BE, 0xF6BF},{0x71C1, 0xE7A7}, - {0x71C3, 0xE6D7},{0x71C8, 0xD4F3},{0x71C9, 0xD4C9},{0x71CE, 0xD6FA},{0x71D0, 0xD7F2},{0x71D2, 0xE1C0},{0x71D4, 0xDBE2},{0x71D5, 0xE6D8}, - {0x71DF, 0xE7BD},{0x71E5, 0xF0CF},{0x71E6, 0xF3BE},{0x71E7, 0xE2AC},{0x71ED, 0xF5B7},{0x71EE, 0xE0F0},{0x71FB, 0xFDB8},{0x71FC, 0xE3E8}, - {0x71FE, 0xD4A7},{0x71FF, 0xE8FC},{0x7200, 0xFAD2},{0x7206, 0xF8EF},{0x7210, 0xD6D3},{0x721B, 0xD5B4},{0x722A, 0xF0D0},{0x722C, 0xF7F0}, - {0x722D, 0xEEB3},{0x7230, 0xEABA},{0x7232, 0xEAD3},{0x7235, 0xEDC9},{0x7236, 0xDDAB},{0x723A, 0xE5AC},{0x723B, 0xFDA1},{0x723D, 0xDFD0}, - {0x723E, 0xECB3},{0x7240, 0xDFD1},{0x7246, 0xEDED},{0x7247, 0xF8B8},{0x7248, 0xF7FA},{0x724C, 0xF8AB},{0x7252, 0xF4E0},{0x7258, 0xD4BA}, - {0x7259, 0xE4B3},{0x725B, 0xE9DA},{0x725D, 0xDEB6},{0x725F, 0xD9BF},{0x7261, 0xD9C0},{0x7262, 0xD6EF},{0x7267, 0xD9CC},{0x7269, 0xDAAA}, - {0x7272, 0xDFE5},{0x7279, 0xF7E5},{0x727D, 0xCCB2},{0x7280, 0xDFF9},{0x7281, 0xD7E0},{0x72A2, 0xD4BB},{0x72A7, 0xFDFA},{0x72AC, 0xCCB3}, - {0x72AF, 0xDBF3},{0x72C0, 0xDFD2},{0x72C2, 0xCECA},{0x72C4, 0xEEDA},{0x72CE, 0xE4E4},{0x72D0, 0xFBCF},{0x72D7, 0xCFB7},{0x72D9, 0xEEC3}, - {0x72E1, 0xCEEA},{0x72E9, 0xE2AD},{0x72F8, 0xD7E1},{0x72F9, 0xFAF5},{0x72FC, 0xD5C9},{0x72FD, 0xF8AC},{0x730A, 0xE7D9},{0x7316, 0xF3E9}, - {0x731B, 0xD8ED},{0x731C, 0xE3C4},{0x731D, 0xF0F1},{0x7325, 0xE8E5},{0x7329, 0xE0FA},{0x732A, 0xEEC4},{0x732B, 0xD9DE},{0x7336, 0xEBA2}, - {0x7337, 0xEBA3},{0x733E, 0xFCC2},{0x733F, 0xEABB},{0x7344, 0xE8AB},{0x7345, 0xDEE2},{0x7350, 0xEDEF},{0x7352, 0xE8A3},{0x7357, 0xCFF1}, - {0x7368, 0xD4BC},{0x736A, 0xFCEA},{0x7370, 0xE7BE},{0x7372, 0xFCF2},{0x7375, 0xD6B4},{0x7378, 0xE2AE},{0x737A, 0xD3B7},{0x737B, 0xFACC}, - {0x7384, 0xFADC},{0x7386, 0xEDB5},{0x7387, 0xE1E3},{0x7389, 0xE8AC},{0x738B, 0xE8DD},{0x738E, 0xEFE9},{0x7394, 0xF4BD},{0x7396, 0xCFB8}, - {0x7397, 0xE9DB},{0x7398, 0xD1AC},{0x739F, 0xDAC7},{0x73A7, 0xEBC9},{0x73A9, 0xE8CC},{0x73AD, 0xDEB7},{0x73B2, 0xD6BC},{0x73B3, 0xD3E5}, - {0x73B9, 0xFADD},{0x73C0, 0xDAD6},{0x73C2, 0xCAB1},{0x73C9, 0xDAC8},{0x73CA, 0xDFA6},{0x73CC, 0xF9B3},{0x73CD, 0xF2D2},{0x73CF, 0xCAC4}, - {0x73D6, 0xCECB},{0x73D9, 0xCDF5},{0x73DD, 0xFDB0},{0x73DE, 0xD5A8},{0x73E0, 0xF1C1},{0x73E3, 0xE2E9},{0x73E4, 0xDCCA},{0x73E5, 0xECB4}, - {0x73E6, 0xFAC0},{0x73E9, 0xFBA8},{0x73EA, 0xD0A8},{0x73ED, 0xDAEC},{0x73F7, 0xD9EE},{0x73F9, 0xE0FB},{0x73FD, 0xEFEA},{0x73FE, 0xFADE}, - {0x7401, 0xE0C4},{0x7403, 0xCFB9},{0x7405, 0xD5CA},{0x7406, 0xD7E2},{0x7407, 0xE2AF},{0x7409, 0xD7B8},{0x7413, 0xE8CD},{0x741B, 0xF6DA}, - {0x7420, 0xEFA2},{0x7421, 0xE2DA},{0x7422, 0xF6FC},{0x7425, 0xFBD0},{0x7426, 0xD1AD},{0x7428, 0xCDE4},{0x742A, 0xD1AE},{0x742B, 0xDCED}, - {0x742C, 0xE8CE},{0x742E, 0xF0F9},{0x742F, 0xCEB5},{0x7430, 0xE6FC},{0x7433, 0xD7FB},{0x7434, 0xD0D6},{0x7435, 0xDDF5},{0x7436, 0xF7F1}, - {0x7438, 0xF6FD},{0x743A, 0xDBF7},{0x743F, 0xFBEA},{0x7440, 0xE9DC},{0x7441, 0xD9C1},{0x7443, 0xF5F2},{0x7444, 0xE0C5},{0x744B, 0xEAD4}, - {0x7455, 0xF9C2},{0x7457, 0xEABC},{0x7459, 0xD2C5},{0x745A, 0xFBD1},{0x745B, 0xE7C0},{0x745C, 0xEBA5},{0x745E, 0xDFFA},{0x745F, 0xE3A2}, - {0x7460, 0xD7B9},{0x7462, 0xE9C3},{0x7464, 0xE8FD},{0x7465, 0xE8AF},{0x7468, 0xF2D3},{0x7469, 0xFBA9},{0x746A, 0xD8A5},{0x746F, 0xD5CB}, - {0x747E, 0xD0C8},{0x7482, 0xD1AF},{0x7483, 0xD7E3},{0x7487, 0xE0C6},{0x7489, 0xD6A2},{0x748B, 0xEDF0},{0x7498, 0xD7F3},{0x749C, 0xFCD4}, - {0x749E, 0xDAD7},{0x749F, 0xCCDF},{0x74A1, 0xF2D4},{0x74A3, 0xD1B0},{0x74A5, 0xCCE0},{0x74A7, 0xDBFD},{0x74A8, 0xF3BF},{0x74AA, 0xF0D1}, - {0x74B0, 0xFCBB},{0x74B2, 0xE2B0},{0x74B5, 0xE6A5},{0x74B9, 0xE2DB},{0x74BD, 0xDFDE},{0x74BF, 0xE0C7},{0x74C6, 0xF2EF},{0x74CA, 0xCCE1}, - {0x74CF, 0xD6EA},{0x74D4, 0xE7C2},{0x74D8, 0xCEB6},{0x74DA, 0xF3C0},{0x74DC, 0xCDFE},{0x74E0, 0xFBD2},{0x74E2, 0xF8F8},{0x74E3, 0xF7FB}, - {0x74E6, 0xE8BF},{0x74EE, 0xE8B7},{0x74F7, 0xEDB6},{0x7501, 0xDCBA},{0x7504, 0xCCB4},{0x7511, 0xF1F7},{0x7515, 0xE8B8},{0x7518, 0xCAF6}, - {0x751A, 0xE4A4},{0x751B, 0xF4D6},{0x751F, 0xDFE6},{0x7523, 0xDFA7},{0x7525, 0xDFE7},{0x7526, 0xE1C1},{0x7528, 0xE9C4},{0x752B, 0xDCCB}, - {0x752C, 0xE9C5},{0x7530, 0xEFA3},{0x7531, 0xEBA6},{0x7532, 0xCBA3},{0x7533, 0xE3E9},{0x7537, 0xD1FB},{0x7538, 0xEFA4},{0x753A, 0xEFEB}, - {0x7547, 0xD0B4},{0x754C, 0xCDA3},{0x754F, 0xE8E6},{0x7551, 0xEFA5},{0x7553, 0xD3CC},{0x7554, 0xDAED},{0x7559, 0xD7BA},{0x755B, 0xF2D5}, - {0x755C, 0xF5E5},{0x755D, 0xD9EF},{0x7562, 0xF9B4},{0x7565, 0xD5D4},{0x7566, 0xFDCF},{0x756A, 0xDBE3},{0x756F, 0xF1E1},{0x7570, 0xECB6}, - {0x7575, 0xFBFE},{0x7576, 0xD3D7},{0x7578, 0xD1B1},{0x757A, 0xCBB1},{0x757F, 0xD1B2},{0x7586, 0xCBB2},{0x7587, 0xF1C2},{0x758A, 0xF4E1}, - {0x758B, 0xF9B5},{0x758E, 0xE1C3},{0x758F, 0xE1C2},{0x7591, 0xEBF7},{0x759D, 0xDFA8},{0x75A5, 0xCBCA},{0x75AB, 0xE6B9},{0x75B1, 0xF8DE}, - {0x75B2, 0xF9AA},{0x75B3, 0xCAF7},{0x75B5, 0xEDB7},{0x75B8, 0xD3B8},{0x75B9, 0xF2D6},{0x75BC, 0xD4D9},{0x75BD, 0xEEC5},{0x75BE, 0xF2F0}, - {0x75C2, 0xCAB2},{0x75C5, 0xDCBB},{0x75C7, 0xF1F8},{0x75CD, 0xECB7},{0x75D2, 0xE5CA},{0x75D4, 0xF6C0},{0x75D5, 0xFDDD},{0x75D8, 0xD4E3}, - {0x75D9, 0xCCE2},{0x75DB, 0xF7D4},{0x75E2, 0xD7E5},{0x75F0, 0xD3C3},{0x75F2, 0xD8A6},{0x75F4, 0xF6C1},{0x75FA, 0xDDF6},{0x75FC, 0xCDC0}, - {0x7600, 0xE5DC},{0x760D, 0xE5CB},{0x7619, 0xE1C4},{0x761F, 0xE8B0},{0x7620, 0xF4B0},{0x7621, 0xF3EA},{0x7622, 0xDAEE},{0x7624, 0xD7BB}, - {0x7626, 0xE2B1},{0x763B, 0xD7AA},{0x7642, 0xD6FB},{0x764C, 0xE4DF},{0x764E, 0xCAD6},{0x7652, 0xEBA8},{0x7656, 0xDBFE},{0x7661, 0xF6C2}, - {0x7664, 0xEFBB},{0x7669, 0xD4FD},{0x766C, 0xE0C8},{0x7670, 0xE8B9},{0x7672, 0xEFA6},{0x7678, 0xCDA4},{0x767B, 0xD4F4},{0x767C, 0xDBA1}, - {0x767D, 0xDBDC},{0x767E, 0xDBDD},{0x7684, 0xEEDC},{0x7686, 0xCBCB},{0x7687, 0xFCD5},{0x768E, 0xCEEB},{0x7690, 0xCDC1},{0x7693, 0xFBD3}, - {0x76AE, 0xF9AB},{0x76BA, 0xF5D4},{0x76BF, 0xD9A9},{0x76C2, 0xE9DD},{0x76C3, 0xDBCD},{0x76C6, 0xDDCE},{0x76C8, 0xE7C3},{0x76CA, 0xECCC}, - {0x76D2, 0xF9EC},{0x76D6, 0xCBCC},{0x76DB, 0xE0FC},{0x76DC, 0xD4A8},{0x76DE, 0xEDD3},{0x76DF, 0xD8EF},{0x76E1, 0xF2D7},{0x76E3, 0xCAF8}, - {0x76E4, 0xDAEF},{0x76E7, 0xD6D4},{0x76EE, 0xD9CD},{0x76F2, 0xD8EE},{0x76F4, 0xF2C1},{0x76F8, 0xDFD3},{0x76FC, 0xDAF0},{0x76FE, 0xE2EA}, - {0x7701, 0xE0FD},{0x7704, 0xD8F8},{0x7708, 0xF7AF},{0x7709, 0xDAB6},{0x770B, 0xCAD7},{0x771E, 0xF2D8},{0x7720, 0xD8F9},{0x7729, 0xFADF}, - {0x7737, 0xCFEF},{0x7738, 0xD9C2},{0x773A, 0xF0D2},{0x773C, 0xE4D1},{0x7740, 0xF3B7},{0x774D, 0xFAE0},{0x775B, 0xEFEC},{0x7761, 0xE2B2}, - {0x7763, 0xD4BD},{0x7766, 0xD9CE},{0x776B, 0xF4E2},{0x7779, 0xD4A9},{0x777E, 0xCDC2},{0x777F, 0xE7DA},{0x778B, 0xF2D9},{0x7791, 0xD9AA}, - {0x779E, 0xD8BE},{0x77A5, 0xDCAD},{0x77AC, 0xE2EB},{0x77AD, 0xD6FC},{0x77B0, 0xCAF9},{0x77B3, 0xD4DA},{0x77BB, 0xF4D7},{0x77BC, 0xCCA1}, - {0x77BF, 0xCFBA},{0x77D7, 0xF5B8},{0x77DB, 0xD9C3},{0x77DC, 0xD0E8},{0x77E2, 0xE3C5},{0x77E3, 0xEBF8},{0x77E5, 0xF2B1},{0x77E9, 0xCFBB}, - {0x77ED, 0xD3AD},{0x77EE, 0xE8E1},{0x77EF, 0xCEEC},{0x77F3, 0xE0B4},{0x7802, 0xDEE3},{0x7812, 0xDDF7},{0x7825, 0xF2B2},{0x7826, 0xF3F6}, - {0x7827, 0xF6DB},{0x782C, 0xD7FE},{0x7832, 0xF8DF},{0x7834, 0xF7F2},{0x7845, 0xD0A9},{0x784F, 0xE6DA},{0x785D, 0xF5A6},{0x786B, 0xD7BC}, - {0x786C, 0xCCE3},{0x786F, 0xE6DB},{0x787C, 0xDDDD},{0x7881, 0xD1B3},{0x7887, 0xEFED},{0x788C, 0xD6DE},{0x788D, 0xE4F4},{0x788E, 0xE1EF}, - {0x7891, 0xDDF8},{0x7897, 0xE8CF},{0x78A3, 0xCAE5},{0x78A7, 0xDCA1},{0x78A9, 0xE0B5},{0x78BA, 0xFCAC},{0x78BB, 0xFCAD},{0x78BC, 0xD8A7}, - {0x78C1, 0xEDB8},{0x78C5, 0xDBB6},{0x78CA, 0xD6F0},{0x78CB, 0xF3AF},{0x78CE, 0xCDA5},{0x78D0, 0xDAF1},{0x78E8, 0xD8A8},{0x78EC, 0xCCE4}, - {0x78EF, 0xD1B4},{0x78F5, 0xCAD8},{0x78FB, 0xDAF2},{0x7901, 0xF5A7},{0x790E, 0xF5A8},{0x7916, 0xE6A6},{0x792A, 0xD5EC},{0x792B, 0xD5F8}, - {0x792C, 0xDAF3},{0x793A, 0xE3C6},{0x793E, 0xDEE4},{0x7940, 0xDEE5},{0x7941, 0xD1B5},{0x7947, 0xD1B6},{0x7948, 0xD1B7},{0x7949, 0xF2B3}, - {0x7950, 0xE9DE},{0x7956, 0xF0D3},{0x7957, 0xF2B4},{0x795A, 0xF0D4},{0x795B, 0xCBE4},{0x795C, 0xFBD4},{0x795D, 0xF5E6},{0x795E, 0xE3EA}, - {0x7960, 0xDEE6},{0x7965, 0xDFD4},{0x7968, 0xF8F9},{0x796D, 0xF0AE},{0x797A, 0xD1B8},{0x797F, 0xD6DF},{0x7981, 0xD0D7},{0x798D, 0xFCA1}, - {0x798E, 0xEFEE},{0x798F, 0xDCD8},{0x7991, 0xE9DF},{0x79A6, 0xE5DD},{0x79A7, 0xFDFB},{0x79AA, 0xE0C9},{0x79AE, 0xD6C9},{0x79B1, 0xD4AA}, - {0x79B3, 0xE5CC},{0x79B9, 0xE9E0},{0x79BD, 0xD0D8},{0x79BE, 0xFCA2},{0x79BF, 0xD4BE},{0x79C0, 0xE2B3},{0x79C1, 0xDEE7},{0x79C9, 0xDCBC}, - {0x79CA, 0xD2B6},{0x79CB, 0xF5D5},{0x79D1, 0xCEA1},{0x79D2, 0xF5A9},{0x79D5, 0xDDF9},{0x79D8, 0xDDFA},{0x79DF, 0xF0D5},{0x79E4, 0xF6DF}, - {0x79E6, 0xF2DA},{0x79E7, 0xE4EB},{0x79E9, 0xF2F1},{0x79FB, 0xECB9},{0x7A00, 0xFDFC},{0x7A05, 0xE1AA},{0x7A08, 0xCAD9},{0x7A0B, 0xEFEF}, - {0x7A0D, 0xF5AA},{0x7A14, 0xECF9},{0x7A17, 0xF8AD},{0x7A19, 0xF2C2},{0x7A1A, 0xF6C3},{0x7A1C, 0xD7D2},{0x7A1F, 0xF9A2},{0x7A20, 0xF0D6}, - {0x7A2E, 0xF0FA},{0x7A31, 0xF6E0},{0x7A36, 0xE9F3},{0x7A37, 0xF2C3},{0x7A3B, 0xD4AB},{0x7A3C, 0xCAB3},{0x7A3D, 0xCDA6},{0x7A3F, 0xCDC3}, - {0x7A40, 0xCDDA},{0x7A46, 0xD9CF},{0x7A49, 0xF6C4},{0x7A4D, 0xEEDD},{0x7A4E, 0xE7C4},{0x7A57, 0xE2B4},{0x7A61, 0xDFE2},{0x7A62, 0xE7DB}, - {0x7A69, 0xE8B1},{0x7A6B, 0xFCAE},{0x7A70, 0xE5CD},{0x7A74, 0xFAEB},{0x7A76, 0xCFBC},{0x7A79, 0xCFE2},{0x7A7A, 0xCDF6},{0x7A7D, 0xEFF0}, - {0x7A7F, 0xF4BE},{0x7A81, 0xD4CD},{0x7A84, 0xF3B8},{0x7A88, 0xE9A1},{0x7A92, 0xF2F2},{0x7A93, 0xF3EB},{0x7A95, 0xF0D7},{0x7A98, 0xCFD7}, - {0x7A9F, 0xCFDF},{0x7AA9, 0xE8C0},{0x7AAA, 0xE8C1},{0x7AAE, 0xCFE3},{0x7AAF, 0xE9A2},{0x7ABA, 0xD0AA},{0x7AC4, 0xF3C1},{0x7AC5, 0xD0AB}, - {0x7AC7, 0xD4E4},{0x7ACA, 0xEFBC},{0x7ACB, 0xD8A1},{0x7AD7, 0xD9DF},{0x7AD9, 0xF3D7},{0x7ADD, 0xDCBD},{0x7ADF, 0xCCE5},{0x7AE0, 0xEDF1}, - {0x7AE3, 0xF1E2},{0x7AE5, 0xD4DB},{0x7AEA, 0xE2B5},{0x7AED, 0xCAE6},{0x7AEF, 0xD3AE},{0x7AF6, 0xCCE6},{0x7AF9, 0xF1D3},{0x7AFA, 0xF5E7}, - {0x7AFF, 0xCADA},{0x7B0F, 0xFBEE},{0x7B11, 0xE1C5},{0x7B19, 0xDFE9},{0x7B1B, 0xEEDE},{0x7B1E, 0xF7C2},{0x7B20, 0xD8A2},{0x7B26, 0xDDAC}, - {0x7B2C, 0xF0AF},{0x7B2D, 0xD6BD},{0x7B39, 0xE1AB},{0x7B46, 0xF9B6},{0x7B49, 0xD4F5},{0x7B4B, 0xD0C9},{0x7B4C, 0xEFA7},{0x7B4D, 0xE2EC}, - {0x7B4F, 0xDBEA},{0x7B50, 0xCECC},{0x7B51, 0xF5E8},{0x7B52, 0xF7D5},{0x7B54, 0xD3CD},{0x7B56, 0xF3FE},{0x7B60, 0xD0B5},{0x7B6C, 0xE0FE}, - {0x7B6E, 0xDFFB},{0x7B75, 0xE6DD},{0x7B7D, 0xE8A4},{0x7B87, 0xCBCD},{0x7B8B, 0xEFA8},{0x7B8F, 0xEEB4},{0x7B94, 0xDAD8},{0x7B95, 0xD1B9}, - {0x7B97, 0xDFA9},{0x7B9A, 0xF3B0},{0x7B9D, 0xCCC4},{0x7BA1, 0xCEB7},{0x7BAD, 0xEFA9},{0x7BB1, 0xDFD5},{0x7BB4, 0xEDD7},{0x7BB8, 0xEEC6}, - {0x7BC0, 0xEFBD},{0x7BC1, 0xFCD6},{0x7BC4, 0xDBF4},{0x7BC6, 0xEFAA},{0x7BC7, 0xF8B9},{0x7BC9, 0xF5E9},{0x7BD2, 0xE3D9},{0x7BE0, 0xE1C6}, - {0x7BE4, 0xD4BF},{0x7BE9, 0xDEE8},{0x7C07, 0xF0EA},{0x7C12, 0xF3C2},{0x7C1E, 0xD3AF},{0x7C21, 0xCADB},{0x7C27, 0xFCD7},{0x7C2A, 0xEDD8}, - {0x7C2B, 0xE1C7},{0x7C3D, 0xF4D8},{0x7C3E, 0xD6B3},{0x7C3F, 0xDDAD},{0x7C43, 0xD5BE},{0x7C4C, 0xF1C3},{0x7C4D, 0xEEDF},{0x7C60, 0xD6EB}, - {0x7C64, 0xF4D9},{0x7C6C, 0xD7E6},{0x7C73, 0xDAB7},{0x7C83, 0xDDFB},{0x7C89, 0xDDCF},{0x7C92, 0xD8A3},{0x7C95, 0xDAD9},{0x7C97, 0xF0D8}, - {0x7C98, 0xEFC4},{0x7C9F, 0xE1D8},{0x7CA5, 0xF1D4},{0x7CA7, 0xEDF2},{0x7CAE, 0xD5DB},{0x7CB1, 0xD5DC},{0x7CB2, 0xF3C4},{0x7CB3, 0xCBD7}, - {0x7CB9, 0xE2B6},{0x7CBE, 0xEFF1},{0x7CCA, 0xFBD5},{0x7CD6, 0xD3D8},{0x7CDE, 0xDDD0},{0x7CDF, 0xF0D9},{0x7CE0, 0xCBB3},{0x7CE7, 0xD5DD}, - {0x7CFB, 0xCDA7},{0x7CFE, 0xD0AC},{0x7D00, 0xD1BA},{0x7D02, 0xF1C4},{0x7D04, 0xE5B3},{0x7D05, 0xFBF5},{0x7D06, 0xE9E1},{0x7D07, 0xFDE0}, - {0x7D08, 0xFCBC},{0x7D0A, 0xDAA2},{0x7D0B, 0xDAA3},{0x7D0D, 0xD2A1},{0x7D10, 0xD2EF},{0x7D14, 0xE2ED},{0x7D17, 0xDEE9},{0x7D18, 0xCEDC}, - {0x7D19, 0xF2B5},{0x7D1A, 0xD0E4},{0x7D1B, 0xDDD1},{0x7D20, 0xE1C8},{0x7D21, 0xDBB7},{0x7D22, 0xDFE3},{0x7D2B, 0xEDB9},{0x7D2C, 0xF1C5}, - {0x7D2E, 0xF3CF},{0x7D2F, 0xD7AB},{0x7D30, 0xE1AC},{0x7D33, 0xE3EB},{0x7D35, 0xEEC7},{0x7D39, 0xE1C9},{0x7D3A, 0xCAFA},{0x7D42, 0xF0FB}, - {0x7D43, 0xFAE1},{0x7D44, 0xF0DA},{0x7D45, 0xCCE7},{0x7D46, 0xDAF4},{0x7D50, 0xCCBF},{0x7D5E, 0xCEED},{0x7D61, 0xD5A9},{0x7D62, 0xFAE2}, - {0x7D66, 0xD0E5},{0x7D68, 0xEBD6},{0x7D6A, 0xECDF},{0x7D6E, 0xDFFC},{0x7D71, 0xF7D6},{0x7D72, 0xDEEA},{0x7D73, 0xCBB4},{0x7D76, 0xEFBE}, - {0x7D79, 0xCCB5},{0x7D7F, 0xCFBD},{0x7D8E, 0xEFF2},{0x7D8F, 0xE2B7},{0x7D93, 0xCCE8},{0x7D9C, 0xF0FC},{0x7DA0, 0xD6E0},{0x7DA2, 0xF1C6}, - {0x7DAC, 0xE2B8},{0x7DAD, 0xEBAB},{0x7DB1, 0xCBB5},{0x7DB2, 0xD8D1},{0x7DB4, 0xF4CE},{0x7DB5, 0xF3F7},{0x7DB8, 0xD7C6},{0x7DBA, 0xD1BB}, - {0x7DBB, 0xF7AA},{0x7DBD, 0xEDCA},{0x7DBE, 0xD7D3},{0x7DBF, 0xD8FA},{0x7DC7, 0xF6C5},{0x7DCA, 0xD1CC},{0x7DCB, 0xDDFC},{0x7DD6, 0xDFFD}, - {0x7DD8, 0xF9E5},{0x7DDA, 0xE0CA},{0x7DDD, 0xF2FD},{0x7DDE, 0xD3B0},{0x7DE0, 0xF4F3},{0x7DE1, 0xDAC9},{0x7DE3, 0xE6DE},{0x7DE8, 0xF8BA}, - {0x7DE9, 0xE8D0},{0x7DEC, 0xD8FB},{0x7DEF, 0xEAD5},{0x7DF4, 0xD6A3},{0x7DFB, 0xF6C6},{0x7E09, 0xF2DB},{0x7E0A, 0xE4FC},{0x7E15, 0xE8B2}, - {0x7E1B, 0xDADA},{0x7E1D, 0xF2DC},{0x7E1E, 0xFBD6},{0x7E1F, 0xE9B2},{0x7E21, 0xEEAD},{0x7E23, 0xFAE3},{0x7E2B, 0xDCEE},{0x7E2E, 0xF5EA}, - {0x7E2F, 0xE6E0},{0x7E31, 0xF0FD},{0x7E37, 0xD7AC},{0x7E3D, 0xF5C5},{0x7E3E, 0xEEE0},{0x7E41, 0xDBE5},{0x7E43, 0xDDDE},{0x7E46, 0xD9F0}, - {0x7E47, 0xE9A3},{0x7E52, 0xF1F9},{0x7E54, 0xF2C4},{0x7E55, 0xE0CB},{0x7E5E, 0xE9A4},{0x7E61, 0xE2B9},{0x7E69, 0xE3B1},{0x7E6A, 0xFCEB}, - {0x7E6B, 0xCDA8},{0x7E6D, 0xCCB6},{0x7E70, 0xF0DB},{0x7E79, 0xE6BA},{0x7E7C, 0xCDA9},{0x7E82, 0xF3C3},{0x7E8C, 0xE1D9},{0x7E8F, 0xEFAB}, - {0x7E93, 0xE7C5},{0x7E96, 0xE0E9},{0x7E98, 0xF3C5},{0x7E9B, 0xD4C0},{0x7E9C, 0xD5BF},{0x7F36, 0xDDAE},{0x7F38, 0xF9FC},{0x7F3A, 0xCCC0}, - {0x7F4C, 0xE5A2},{0x7F50, 0xCEB8},{0x7F54, 0xD8D2},{0x7F55, 0xF9D6},{0x7F6A, 0xF1AA},{0x7F6B, 0xCED1},{0x7F6E, 0xF6C7},{0x7F70, 0xDBEB}, - {0x7F72, 0xDFFE},{0x7F75, 0xD8E1},{0x7F77, 0xF7F3},{0x7F79, 0xD7E7},{0x7F85, 0xD4FE},{0x7F88, 0xD1BC},{0x7F8A, 0xE5CF},{0x7F8C, 0xCBB6}, - {0x7F8E, 0xDAB8},{0x7F94, 0xCDC4},{0x7F9A, 0xD6BE},{0x7F9E, 0xE2BA},{0x7FA4, 0xCFD8},{0x7FA8, 0xE0CC},{0x7FA9, 0xEBF9},{0x7FB2, 0xFDFD}, - {0x7FB8, 0xD7E8},{0x7FB9, 0xCBD8},{0x7FBD, 0xE9E2},{0x7FC1, 0xE8BA},{0x7FC5, 0xE3C7},{0x7FCA, 0xECCD},{0x7FCC, 0xECCE},{0x7FCE, 0xD6BF}, - {0x7FD2, 0xE3A7},{0x7FD4, 0xDFD6},{0x7FD5, 0xFDE8},{0x7FDF, 0xEEE1},{0x7FE0, 0xF6A8},{0x7FE1, 0xDDFD},{0x7FE9, 0xF8BB},{0x7FEB, 0xE8D1}, - {0x7FF0, 0xF9D7},{0x7FF9, 0xCEEE},{0x7FFC, 0xECCF},{0x8000, 0xE9A5},{0x8001, 0xD6D5},{0x8003, 0xCDC5},{0x8005, 0xEDBA},{0x8006, 0xD1BD}, - {0x8009, 0xCFBE},{0x800C, 0xECBB},{0x8010, 0xD2B1},{0x8015, 0xCCE9},{0x8017, 0xD9C4},{0x8018, 0xE9FC},{0x802D, 0xD1BE},{0x8033, 0xECBC}, - {0x8036, 0xE5AD},{0x803D, 0xF7B0},{0x803F, 0xCCEA},{0x8043, 0xD3C4},{0x8046, 0xD6C0},{0x804A, 0xD6FD},{0x8056, 0xE1A1},{0x8058, 0xDEBD}, - {0x805A, 0xF6A9},{0x805E, 0xDAA4},{0x806F, 0xD6A4},{0x8070, 0xF5C6},{0x8072, 0xE1A2},{0x8073, 0xE9C6},{0x8077, 0xF2C5},{0x807D, 0xF4E9}, - {0x807E, 0xD6EC},{0x807F, 0xEBD3},{0x8084, 0xECBD},{0x8085, 0xE2DC},{0x8086, 0xDEEB},{0x8087, 0xF0DC},{0x8089, 0xEBBF},{0x808B, 0xD7CE}, - {0x808C, 0xD1BF},{0x8096, 0xF5AB},{0x809B, 0xF9FD},{0x809D, 0xCADC},{0x80A1, 0xCDC6},{0x80A2, 0xF2B6},{0x80A5, 0xDDFE},{0x80A9, 0xCCB7}, - {0x80AA, 0xDBB8},{0x80AF, 0xD0E9},{0x80B1, 0xCEDD},{0x80B2, 0xEBC0},{0x80B4, 0xFDA2},{0x80BA, 0xF8CB},{0x80C3, 0xEAD6},{0x80C4, 0xF1B0}, - {0x80CC, 0xDBCE},{0x80CE, 0xF7C3},{0x80DA, 0xDBCF},{0x80DB, 0xCBA4},{0x80DE, 0xF8E0},{0x80E1, 0xFBD7},{0x80E4, 0xEBCA},{0x80E5, 0xE0A1}, - {0x80F1, 0xCECD},{0x80F4, 0xD4DC},{0x80F8, 0xFDD8},{0x80FD, 0xD2F6},{0x8102, 0xF2B7},{0x8105, 0xFAF6},{0x8106, 0xF6AA},{0x8107, 0xFAF7}, - {0x8108, 0xD8E6},{0x810A, 0xF4B1},{0x8118, 0xE8D2},{0x811A, 0xCAC5},{0x811B, 0xCCEB},{0x8123, 0xE2EE},{0x8129, 0xE2BB},{0x812B, 0xF7AD}, - {0x812F, 0xF8E1},{0x8139, 0xF3EC},{0x813E, 0xDEA1},{0x814B, 0xE4FD},{0x814E, 0xE3EC},{0x8150, 0xDDAF},{0x8151, 0xDDB0},{0x8154, 0xCBB7}, - {0x8155, 0xE8D3},{0x8165, 0xE1A3},{0x8166, 0xD2E0},{0x816B, 0xF0FE},{0x8170, 0xE9A6},{0x8171, 0xCBF2},{0x8178, 0xEDF3},{0x8179, 0xDCD9}, - {0x817A, 0xE0CD},{0x817F, 0xF7DA},{0x8180, 0xDBB9},{0x8188, 0xCCAE},{0x818A, 0xDADB},{0x818F, 0xCDC7},{0x819A, 0xDDB1},{0x819C, 0xD8AF}, - {0x819D, 0xE3A3},{0x81A0, 0xCEEF},{0x81A3, 0xF2F3},{0x81A8, 0xF8B3},{0x81B3, 0xE0CE},{0x81B5, 0xF5FD},{0x81BA, 0xEBEC},{0x81BD, 0xD3C5}, - {0x81BE, 0xFCEC},{0x81BF, 0xD2DB},{0x81C0, 0xD4EB},{0x81C2, 0xDEA2},{0x81C6, 0xE5E6},{0x81CD, 0xF0B0},{0x81D8, 0xD5C4},{0x81DF, 0xEDF4}, - {0x81E3, 0xE3ED},{0x81E5, 0xE8C2},{0x81E7, 0xEDF5},{0x81E8, 0xD7FC},{0x81EA, 0xEDBB},{0x81ED, 0xF6AB},{0x81F3, 0xF2B8},{0x81F4, 0xF6C8}, - {0x81FA, 0xD3E6},{0x81FB, 0xF2DD},{0x81FC, 0xCFBF},{0x81FE, 0xEBAC},{0x8205, 0xCFC0},{0x8207, 0xE6A8},{0x8208, 0xFDE9},{0x820A, 0xCFC1}, - {0x820C, 0xE0DF},{0x820D, 0xDEEC},{0x8212, 0xE0A2},{0x821B, 0xF4BF},{0x821C, 0xE2EF},{0x821E, 0xD9F1},{0x821F, 0xF1C7},{0x8221, 0xCBB8}, - {0x822A, 0xF9FE},{0x822B, 0xDBBA},{0x822C, 0xDAF5},{0x8235, 0xF6EC},{0x8236, 0xDADC},{0x8237, 0xFAE4},{0x8239, 0xE0CF},{0x8240, 0xDDB2}, - {0x8245, 0xE6A9},{0x8247, 0xEFF3},{0x8259, 0xF3ED},{0x8264, 0xEBFA},{0x8266, 0xF9E6},{0x826E, 0xCADD},{0x826F, 0xD5DE},{0x8271, 0xCADE}, - {0x8272, 0xDFE4},{0x8276, 0xE6FD},{0x8278, 0xF5AC},{0x827E, 0xE4F5},{0x828B, 0xE9E3},{0x828D, 0xEDCB},{0x828E, 0xCFE4},{0x8292, 0xD8D3}, - {0x8299, 0xDDB3},{0x829A, 0xD4EC},{0x829D, 0xF2B9},{0x829F, 0xDFB7},{0x82A5, 0xCBCE},{0x82A6, 0xFBD8},{0x82A9, 0xD0D9},{0x82AC, 0xDDD2}, - {0x82AD, 0xF7F4},{0x82AE, 0xE7DC},{0x82AF, 0xE4A5},{0x82B1, 0xFCA3},{0x82B3, 0xDBBB},{0x82B7, 0xF2BA},{0x82B8, 0xE9FD},{0x82B9, 0xD0CA}, - {0x82BB, 0xF5D6},{0x82BC, 0xD9C5},{0x82BD, 0xE4B4},{0x82BF, 0xEDA7},{0x82D1, 0xEABD},{0x82D2, 0xE6FE},{0x82D4, 0xF7C4},{0x82D5, 0xF5AD}, - {0x82D7, 0xD9E0},{0x82DB, 0xCAB4},{0x82DE, 0xF8E2},{0x82DF, 0xCFC2},{0x82E1, 0xECBE},{0x82E5, 0xE5B4},{0x82E6, 0xCDC8},{0x82E7, 0xEEC8}, - {0x82F1, 0xE7C8},{0x82FD, 0xCDC9},{0x82FE, 0xF9B7},{0x8301, 0xF1E8},{0x8302, 0xD9F2},{0x8303, 0xDBF5},{0x8304, 0xCAB5},{0x8305, 0xD9C6}, - {0x8309, 0xD8C9},{0x8317, 0xD9AB},{0x8328, 0xEDBC},{0x832B, 0xD8D4},{0x832F, 0xDCDA},{0x8331, 0xE2BC},{0x8334, 0xFCED},{0x8335, 0xECE0}, - {0x8336, 0xD2FE},{0x8338, 0xE9C7},{0x8339, 0xE6AA},{0x8340, 0xE2F0},{0x8347, 0xFABB},{0x8349, 0xF5AE},{0x834A, 0xFBAA},{0x834F, 0xECFB}, - {0x8351, 0xECBF},{0x8352, 0xFCD8},{0x8373, 0xD4E5},{0x8377, 0xF9C3},{0x837B, 0xEEE2},{0x8389, 0xD7E9},{0x838A, 0xEDF6},{0x838E, 0xDEED}, - {0x8396, 0xCCEC},{0x8398, 0xE3EE},{0x839E, 0xE8D4},{0x83A2, 0xFAF8},{0x83A9, 0xDDB4},{0x83AA, 0xE4B5},{0x83AB, 0xD8B0},{0x83BD, 0xD8D5}, - {0x83C1, 0xF4EA},{0x83C5, 0xCEB9},{0x83C9, 0xD6E1},{0x83CA, 0xCFD2},{0x83CC, 0xD0B6},{0x83D3, 0xCEA2},{0x83D6, 0xF3EE},{0x83DC, 0xF3F8}, - {0x83E9, 0xDCCC},{0x83EB, 0xD0CB},{0x83EF, 0xFCA4},{0x83F0, 0xCDCA},{0x83F1, 0xD7D4},{0x83F2, 0xDEA3},{0x83F4, 0xE4E0},{0x83F9, 0xEEC9}, - {0x83FD, 0xE2DD},{0x8403, 0xF5FE},{0x8404, 0xD4AC},{0x840A, 0xD5D1},{0x840C, 0xD8F0},{0x840D, 0xF8C3},{0x840E, 0xEAD7},{0x8429, 0xF5D7}, - {0x842C, 0xD8BF},{0x8431, 0xFDC0},{0x8438, 0xEBAD},{0x843D, 0xD5AA},{0x8449, 0xE7A8},{0x8457, 0xEECA},{0x845B, 0xCAE7},{0x8461, 0xF8E3}, - {0x8463, 0xD4DD},{0x8466, 0xEAD8},{0x846B, 0xFBD9},{0x846C, 0xEDF7},{0x846F, 0xE5B5},{0x8475, 0xD0AD},{0x847A, 0xF1F1},{0x8490, 0xE2BD}, - {0x8494, 0xE3C8},{0x8499, 0xD9D5},{0x849C, 0xDFAA},{0x84A1, 0xDBBC},{0x84B2, 0xF8E4},{0x84B8, 0xF1FA},{0x84BB, 0xE5B6},{0x84BC, 0xF3EF}, - {0x84BF, 0xFBDA},{0x84C0, 0xE1E0},{0x84C2, 0xD9AC},{0x84C4, 0xF5EB},{0x84C6, 0xE0B6},{0x84C9, 0xE9C8},{0x84CB, 0xCBCF},{0x84CD, 0xE3C9}, - {0x84D1, 0xDEEE},{0x84DA, 0xE2BE},{0x84EC, 0xDCEF},{0x84EE, 0xD6A5},{0x84F4, 0xE2F1},{0x84FC, 0xD6FE},{0x8511, 0xD9A1},{0x8513, 0xD8C0}, - {0x8514, 0xDCDB},{0x8517, 0xEDBD},{0x8518, 0xDFB8},{0x851A, 0xEAA5},{0x851E, 0xD7AD},{0x8521, 0xF3F9},{0x8523, 0xEDF8},{0x8525, 0xF5C7}, - {0x852C, 0xE1CA},{0x852D, 0xEBE3},{0x852F, 0xF2DE},{0x853D, 0xF8CC},{0x853F, 0xEAD9},{0x8541, 0xD3C6},{0x8543, 0xDBE6},{0x8549, 0xF5AF}, - {0x854E, 0xCEF0},{0x8553, 0xE9FE},{0x8559, 0xFBB6},{0x8563, 0xE2F2},{0x8568, 0xCFF2},{0x8569, 0xF7B9},{0x856A, 0xD9F3},{0x856D, 0xE1CB}, - {0x8584, 0xDADD},{0x8587, 0xDAB9},{0x858F, 0xEBFB},{0x8591, 0xCBB9},{0x8594, 0xEDF9},{0x859B, 0xE0E0},{0x85A6, 0xF4C0},{0x85A8, 0xFDBC}, - {0x85A9, 0xDFB1},{0x85AA, 0xE3EF},{0x85AF, 0xE0A3},{0x85B0, 0xFDB9},{0x85BA, 0xF0B1},{0x85C1, 0xCDCB},{0x85C9, 0xEDBE},{0x85CD, 0xD5C0}, - {0x85CE, 0xE3F0},{0x85CF, 0xEDFA},{0x85D5, 0xE9E4},{0x85DC, 0xD5ED},{0x85DD, 0xE7DD},{0x85E4, 0xD4F6},{0x85E5, 0xE5B7},{0x85E9, 0xDBE7}, - {0x85EA, 0xE2BF},{0x85F7, 0xEECB},{0x85FA, 0xD7F4},{0x85FB, 0xF0DD},{0x85FF, 0xCEAB},{0x8602, 0xE7DE},{0x8606, 0xD6D6},{0x8607, 0xE1CC}, - {0x860A, 0xE8B3},{0x8616, 0xE5EE},{0x8617, 0xDCA2},{0x861A, 0xE0D0},{0x862D, 0xD5B5},{0x863F, 0xD5A1},{0x864E, 0xFBDB},{0x8650, 0xF9CB}, - {0x8654, 0xCBF3},{0x8655, 0xF4A5},{0x865B, 0xFAC8},{0x865C, 0xD6D7},{0x865E, 0xE9E5},{0x865F, 0xFBDC},{0x8667, 0xFDD0},{0x8679, 0xFBF6}, - {0x868A, 0xDAA5},{0x868C, 0xDBBD},{0x8693, 0xECE2},{0x86A3, 0xCDF7},{0x86A4, 0xF0DE},{0x86A9, 0xF6C9},{0x86C7, 0xDEEF},{0x86CB, 0xD3B1}, - {0x86D4, 0xFCEE},{0x86D9, 0xE8C3},{0x86DB, 0xF1C8},{0x86DF, 0xCEF1},{0x86E4, 0xF9ED},{0x86ED, 0xF2F4},{0x86FE, 0xE4B6},{0x8700, 0xF5B9}, - {0x8702, 0xDCF0},{0x8703, 0xE3F1},{0x8708, 0xE8A5},{0x8718, 0xF2BB},{0x871A, 0xDEA4},{0x871C, 0xDACC},{0x874E, 0xCAE9},{0x8755, 0xE3DA}, - {0x8757, 0xFCD9},{0x875F, 0xEADA},{0x8766, 0xF9C4},{0x8768, 0xE3A4},{0x8774, 0xFBDD},{0x8776, 0xEFCA},{0x8778, 0xE8C4},{0x8782, 0xD5CC}, - {0x878D, 0xEBD7},{0x879F, 0xD9AD},{0x87A2, 0xFBAB},{0x87B3, 0xD3D9},{0x87BA, 0xD5A2},{0x87C4, 0xF6DE},{0x87E0, 0xDAF6},{0x87EC, 0xE0D1}, - {0x87EF, 0xE9A8},{0x87F2, 0xF5F9},{0x87F9, 0xFAAF},{0x87FB, 0xEBFC},{0x87FE, 0xE0EA},{0x8805, 0xE3B2},{0x881F, 0xD5C5},{0x8822, 0xF1E3}, - {0x8823, 0xD5EE},{0x8831, 0xCDCC},{0x8836, 0xEDD9},{0x883B, 0xD8C1},{0x8840, 0xFAEC},{0x8846, 0xF1EB},{0x884C, 0xFABC},{0x884D, 0xE6E2}, - {0x8852, 0xFAE5},{0x8853, 0xE2FA},{0x8857, 0xCAB6},{0x8859, 0xE4B7},{0x885B, 0xEADB},{0x885D, 0xF5FA},{0x8861, 0xFBAC},{0x8862, 0xCFC3}, - {0x8863, 0xEBFD},{0x8868, 0xF8FA},{0x886B, 0xDFB9},{0x8870, 0xE1F1},{0x8872, 0xD2A4},{0x8877, 0xF5FB},{0x887E, 0xD0DA},{0x887F, 0xD0DB}, - {0x8881, 0xEABE},{0x8882, 0xD9B1},{0x8888, 0xCAB7},{0x888B, 0xD3E7},{0x888D, 0xF8E5},{0x8892, 0xD3B2},{0x8896, 0xE2C0},{0x8897, 0xF2DF}, - {0x889E, 0xCDE5},{0x88AB, 0xF9AC},{0x88B4, 0xCDCD},{0x88C1, 0xEEAE},{0x88C2, 0xD6AE},{0x88CF, 0xD7EA},{0x88D4, 0xE7E0},{0x88D5, 0xEBAE}, - {0x88D9, 0xCFD9},{0x88DC, 0xDCCD},{0x88DD, 0xEDFB},{0x88DF, 0xDEF0},{0x88E1, 0xD7EB},{0x88E8, 0xDEA5},{0x88F3, 0xDFD7},{0x88F4, 0xDBD0}, - {0x88F5, 0xDBD1},{0x88F8, 0xD5A3},{0x88FD, 0xF0B2},{0x8907, 0xDCDC},{0x8910, 0xCAE8},{0x8912, 0xF8E6},{0x8913, 0xDCCE},{0x8918, 0xEADC}, - {0x8919, 0xDBD2},{0x8925, 0xE9B3},{0x892A, 0xF7DB},{0x8936, 0xE3A8},{0x8938, 0xD7AE},{0x893B, 0xE0E1},{0x8941, 0xCBBA},{0x8944, 0xE5D1}, - {0x895F, 0xD0DC},{0x8964, 0xD5C1},{0x896A, 0xD8CA},{0x8972, 0xE3A9},{0x897F, 0xE0A4},{0x8981, 0xE9A9},{0x8983, 0xD3C7},{0x8986, 0xDCDD}, - {0x8987, 0xF8AE},{0x898B, 0xCCB8},{0x898F, 0xD0AE},{0x8993, 0xD8F2},{0x8996, 0xE3CA},{0x89A1, 0xCCAF},{0x89A9, 0xD4AD},{0x89AA, 0xF6D1}, - {0x89B2, 0xD0CC},{0x89BA, 0xCAC6},{0x89BD, 0xD5C2},{0x89C0, 0xCEBA},{0x89D2, 0xCAC7},{0x89E3, 0xFAB0},{0x89F4, 0xDFD8},{0x89F8, 0xF5BA}, - {0x8A00, 0xE5EB},{0x8A02, 0xEFF4},{0x8A03, 0xDDB5},{0x8A08, 0xCDAA},{0x8A0A, 0xE3F2},{0x8A0C, 0xFBF7},{0x8A0E, 0xF7D0},{0x8A13, 0xFDBA}, - {0x8A16, 0xFDE1},{0x8A17, 0xF6FE},{0x8A18, 0xD1C0},{0x8A1B, 0xE8C5},{0x8A1D, 0xE4B8},{0x8A1F, 0xE1E8},{0x8A23, 0xCCC1},{0x8A25, 0xD2ED}, - {0x8A2A, 0xDBBE},{0x8A2D, 0xE0E2},{0x8A31, 0xFAC9},{0x8A34, 0xE1CD},{0x8A36, 0xCAB8},{0x8A3A, 0xF2E0},{0x8A3B, 0xF1C9},{0x8A50, 0xDEF1}, - {0x8A54, 0xF0DF},{0x8A55, 0xF8C4},{0x8A5B, 0xEECC},{0x8A5E, 0xDEF2},{0x8A60, 0xE7C9},{0x8A62, 0xE2F3},{0x8A63, 0xE7E1},{0x8A66, 0xE3CB}, - {0x8A69, 0xE3CC},{0x8A6D, 0xCFF8},{0x8A6E, 0xEFAC},{0x8A70, 0xFDFE},{0x8A71, 0xFCA5},{0x8A72, 0xFAB1},{0x8A73, 0xDFD9},{0x8A75, 0xE0D2}, - {0x8A79, 0xF4DA},{0x8A85, 0xF1CA},{0x8A87, 0xCEA3},{0x8A8C, 0xF2BC},{0x8A8D, 0xECE3},{0x8A93, 0xE0A5},{0x8A95, 0xF7AB},{0x8A98, 0xEBAF}, - {0x8A9E, 0xE5DE},{0x8AA0, 0xE1A4},{0x8AA1, 0xCDAB},{0x8AA3, 0xD9F4},{0x8AA4, 0xE8A6},{0x8AA5, 0xCDCE},{0x8AA6, 0xE1E9},{0x8AA8, 0xFCEF}, - {0x8AAA, 0xE0E3},{0x8AB0, 0xE2C1},{0x8AB2, 0xCEA4},{0x8AB9, 0xDEA6},{0x8ABC, 0xEBFE},{0x8ABE, 0xEBDD},{0x8ABF, 0xF0E0},{0x8AC2, 0xF4DB}, - {0x8AC4, 0xE2F4},{0x8AC7, 0xD3C8},{0x8ACB, 0xF4EB},{0x8ACD, 0xEEB5},{0x8ACF, 0xF5D8},{0x8AD2, 0xD5DF},{0x8AD6, 0xD6E5},{0x8ADB, 0xEBB0}, - {0x8ADC, 0xF4E3},{0x8AE1, 0xE3CD},{0x8AE6, 0xF4F4},{0x8AE7, 0xFAB2},{0x8AEA, 0xEFF5},{0x8AEB, 0xCADF},{0x8AED, 0xEBB1},{0x8AEE, 0xEDBF}, - {0x8AF1, 0xFDC9},{0x8AF6, 0xE4A6},{0x8AF7, 0xF9A4},{0x8AF8, 0xF0B3},{0x8AFA, 0xE5EC},{0x8AFE, 0xD1E7},{0x8B00, 0xD9C7},{0x8B01, 0xE4D7}, - {0x8B02, 0xEADD},{0x8B04, 0xD4F7},{0x8B0E, 0xDABA},{0x8B10, 0xDACD},{0x8B14, 0xF9CC},{0x8B16, 0xE1DA},{0x8B17, 0xDBBF},{0x8B19, 0xCCC5}, - {0x8B1A, 0xECD0},{0x8B1B, 0xCBBB},{0x8B1D, 0xDEF3},{0x8B20, 0xE9AA},{0x8B28, 0xD9C8},{0x8B2B, 0xEEE3},{0x8B2C, 0xD7BD},{0x8B33, 0xCFC4}, - {0x8B39, 0xD0CD},{0x8B41, 0xFCA6},{0x8B49, 0xF1FB},{0x8B4E, 0xFDD2},{0x8B4F, 0xD1C1},{0x8B58, 0xE3DB},{0x8B5A, 0xD3C9},{0x8B5C, 0xDCCF}, - {0x8B66, 0xCCED},{0x8B6C, 0xDEA7},{0x8B6F, 0xE6BB},{0x8B70, 0xECA1},{0x8B74, 0xCCB9},{0x8B77, 0xFBDE},{0x8B7D, 0xE7E2},{0x8B80, 0xD4C1}, - {0x8B8A, 0xDCA8},{0x8B90, 0xE2C2},{0x8B92, 0xF3D8},{0x8B93, 0xE5D3},{0x8B96, 0xF3D9},{0x8B9A, 0xF3C6},{0x8C37, 0xCDDB},{0x8C3F, 0xCDAC}, - {0x8C41, 0xFCC3},{0x8C46, 0xD4E7},{0x8C48, 0xD1C2},{0x8C4A, 0xF9A5},{0x8C4C, 0xE8D5},{0x8C55, 0xE3CE},{0x8C5A, 0xD4CA},{0x8C61, 0xDFDA}, - {0x8C6A, 0xFBDF},{0x8C6B, 0xE7E3},{0x8C79, 0xF8FB},{0x8C7A, 0xE3CF},{0x8C82, 0xF5B0},{0x8C8A, 0xD8E7},{0x8C8C, 0xD9C9},{0x8C9D, 0xF8AF}, - {0x8C9E, 0xEFF6},{0x8CA0, 0xDDB6},{0x8CA1, 0xEEAF},{0x8CA2, 0xCDF8},{0x8CA7, 0xDEB8},{0x8CA8, 0xFCA7},{0x8CA9, 0xF7FC},{0x8CAA, 0xF7B1}, - {0x8CAB, 0xCEBB},{0x8CAC, 0xF4A1},{0x8CAF, 0xEECD},{0x8CB0, 0xE1AE},{0x8CB3, 0xECC3},{0x8CB4, 0xCFFE},{0x8CB6, 0xF8BF},{0x8CB7, 0xD8E2}, - {0x8CB8, 0xD3E8},{0x8CBB, 0xDEA8},{0x8CBC, 0xF4E4},{0x8CBD, 0xECC2},{0x8CBF, 0xD9F5},{0x8CC0, 0xF9C5},{0x8CC1, 0xDDD3},{0x8CC2, 0xD6F1}, - {0x8CC3, 0xECFC},{0x8CC4, 0xFCF0},{0x8CC7, 0xEDC0},{0x8CC8, 0xCAB9},{0x8CCA, 0xEEE4},{0x8CD1, 0xF2E1},{0x8CD3, 0xDEB9},{0x8CDA, 0xD6F2}, - {0x8CDC, 0xDEF4},{0x8CDE, 0xDFDB},{0x8CE0, 0xDBD3},{0x8CE2, 0xFAE7},{0x8CE3, 0xD8E3},{0x8CE4, 0xF4C1},{0x8CE6, 0xDDB7},{0x8CEA, 0xF2F5}, - {0x8CED, 0xD4AE},{0x8CF4, 0xD6F3},{0x8CFB, 0xDDB8},{0x8CFC, 0xCFC5},{0x8CFD, 0xDFDF},{0x8D04, 0xF2BE},{0x8D05, 0xF6A1},{0x8D07, 0xEBCB}, - {0x8D08, 0xF1FC},{0x8D0A, 0xF3C7},{0x8D0D, 0xE0EB},{0x8D13, 0xEDFC},{0x8D16, 0xE1DB},{0x8D64, 0xEEE5},{0x8D66, 0xDEF5},{0x8D6B, 0xFAD3}, - {0x8D70, 0xF1CB},{0x8D73, 0xD0AF},{0x8D74, 0xDDB9},{0x8D77, 0xD1C3},{0x8D85, 0xF5B1},{0x8D8A, 0xEAC6},{0x8D99, 0xF0E1},{0x8DA3, 0xF6AC}, - {0x8DA8, 0xF5D9},{0x8DB3, 0xF0EB},{0x8DBA, 0xDDBA},{0x8DBE, 0xF2BF},{0x8DC6, 0xF7C5},{0x8DCB, 0xDBA2},{0x8DCC, 0xF2F6},{0x8DCF, 0xCABA}, - {0x8DDB, 0xF7F5},{0x8DDD, 0xCBE5},{0x8DE1, 0xEEE6},{0x8DE3, 0xE0D3},{0x8DE8, 0xCEA5},{0x8DEF, 0xD6D8},{0x8DF3, 0xD4AF},{0x8E0A, 0xE9C9}, - {0x8E0F, 0xD3CE},{0x8E10, 0xF4C2},{0x8E1E, 0xCBE6},{0x8E2A, 0xF1A1},{0x8E30, 0xEBB2},{0x8E35, 0xF1A2},{0x8E42, 0xEBB3},{0x8E44, 0xF0B4}, - {0x8E47, 0xCBF4},{0x8E48, 0xD4B0},{0x8E49, 0xF3B2},{0x8E4A, 0xFBB7},{0x8E59, 0xF5EC},{0x8E5F, 0xEEE7},{0x8E60, 0xF4B2},{0x8E74, 0xF5ED}, - {0x8E76, 0xCFF3},{0x8E81, 0xF0E2},{0x8E87, 0xEECE},{0x8E8A, 0xF1CC},{0x8E8D, 0xE5B8},{0x8EAA, 0xD7F5},{0x8EAB, 0xE3F3},{0x8EAC, 0xCFE5}, - {0x8EC0, 0xCFC6},{0x8ECA, 0xF3B3},{0x8ECB, 0xE4D8},{0x8ECC, 0xCFF9},{0x8ECD, 0xCFDA},{0x8ED2, 0xFACD},{0x8EDF, 0xE6E3},{0x8EEB, 0xF2E2}, - {0x8EF8, 0xF5EE},{0x8EFB, 0xCABB},{0x8EFE, 0xE3DC},{0x8F03, 0xCEF2},{0x8F05, 0xD6D9},{0x8F09, 0xEEB0},{0x8F12, 0xF4E5},{0x8F13, 0xD8C2}, - {0x8F14, 0xDCD0},{0x8F15, 0xCCEE},{0x8F1B, 0xD5E0},{0x8F1C, 0xF6CA},{0x8F1D, 0xFDCA},{0x8F1E, 0xD8D6},{0x8F1F, 0xF4CF},{0x8F26, 0xD6A6}, - {0x8F27, 0xDCBE},{0x8F29, 0xDBD4},{0x8F2A, 0xD7C7},{0x8F2F, 0xF2FE},{0x8F33, 0xF1CD},{0x8F38, 0xE2C3},{0x8F39, 0xDCDE},{0x8F3B, 0xDCDF}, - {0x8F3E, 0xEFAD},{0x8F3F, 0xE6AB},{0x8F44, 0xF9DD},{0x8F45, 0xEABF},{0x8F49, 0xEFAE},{0x8F4D, 0xF4D0},{0x8F4E, 0xCEF3},{0x8F5D, 0xE6AC}, - {0x8F5F, 0xCEDE},{0x8F62, 0xD5F9},{0x8F9B, 0xE3F4},{0x8F9C, 0xCDD0},{0x8FA3, 0xD5B8},{0x8FA6, 0xF7FD},{0x8FA8, 0xDCA9},{0x8FAD, 0xDEF6}, - {0x8FAF, 0xDCAA},{0x8FB0, 0xF2E3},{0x8FB1, 0xE9B4},{0x8FB2, 0xD2DC},{0x8FC2, 0xE9E6},{0x8FC5, 0xE3F6},{0x8FCE, 0xE7CA},{0x8FD1, 0xD0CE}, - {0x8FD4, 0xDAF7},{0x8FE6, 0xCABC},{0x8FEA, 0xEEE8},{0x8FEB, 0xDADE},{0x8FED, 0xF2F7},{0x8FF0, 0xE2FB},{0x8FF2, 0xCCA6},{0x8FF7, 0xDABB}, - {0x8FF9, 0xEEE9},{0x8FFD, 0xF5DA},{0x9000, 0xF7DC},{0x9001, 0xE1EA},{0x9002, 0xCEC1},{0x9003, 0xD4B1},{0x9005, 0xFDB1},{0x9006, 0xE6BD}, - {0x9008, 0xFBAD},{0x900B, 0xF8E7},{0x900D, 0xE1CE},{0x900F, 0xF7E2},{0x9010, 0xF5EF},{0x9011, 0xCFC7},{0x9014, 0xD4B2},{0x9015, 0xCCEF}, - {0x9017, 0xD4E8},{0x9019, 0xEECF},{0x901A, 0xF7D7},{0x901D, 0xE0A6},{0x901E, 0xD6C1},{0x901F, 0xE1DC},{0x9020, 0xF0E3},{0x9021, 0xF1E4}, - {0x9022, 0xDCF1},{0x9023, 0xD6A7},{0x902E, 0xF4F5},{0x9031, 0xF1CE},{0x9032, 0xF2E4},{0x9035, 0xD0B0},{0x9038, 0xECEF},{0x903C, 0xF9BA}, - {0x903E, 0xEBB5},{0x9041, 0xD4ED},{0x9042, 0xE2C4},{0x9047, 0xE9E7},{0x904A, 0xEBB4},{0x904B, 0xEAA1},{0x904D, 0xF8BC},{0x904E, 0xCEA6}, - {0x9050, 0xF9C6},{0x9051, 0xFCDA},{0x9053, 0xD4B3},{0x9054, 0xD3B9},{0x9055, 0xEADE},{0x9059, 0xE9AB},{0x905C, 0xE1E1},{0x905D, 0xD3CF}, - {0x905E, 0xF4F6},{0x9060, 0xEAC0},{0x9061, 0xE1CF},{0x9063, 0xCCBA},{0x9069, 0xEEEA},{0x906D, 0xF0E4},{0x906E, 0xF3B4},{0x906F, 0xD4EE}, - {0x9072, 0xF2C0},{0x9075, 0xF1E5},{0x9077, 0xF4C3},{0x9078, 0xE0D4},{0x907A, 0xEBB6},{0x907C, 0xD7A1},{0x907D, 0xCBE8},{0x907F, 0xF9AD}, - {0x9080, 0xE9AD},{0x9081, 0xD8E4},{0x9082, 0xFAB3},{0x9083, 0xE2C5},{0x9084, 0xFCBD},{0x9087, 0xECC4},{0x9088, 0xD8B1},{0x908A, 0xDCAB}, - {0x908F, 0xD5A4},{0x9091, 0xEBE9},{0x9095, 0xE8BB},{0x9099, 0xD8D7},{0x90A2, 0xFBAE},{0x90A3, 0xD1E1},{0x90A6, 0xDBC0},{0x90A8, 0xF5BE}, - {0x90AA, 0xDEF7},{0x90AF, 0xCAFB},{0x90B0, 0xF7C6},{0x90B1, 0xCFC8},{0x90B5, 0xE1D0},{0x90B8, 0xEED0},{0x90C1, 0xE9F4},{0x90CA, 0xCEF4}, - {0x90DE, 0xD5CD},{0x90E1, 0xCFDB},{0x90E8, 0xDDBB},{0x90ED, 0xCEAC},{0x90F5, 0xE9E8},{0x90FD, 0xD4B4},{0x9102, 0xE4C7},{0x9112, 0xF5DB}, - {0x9115, 0xFAC1},{0x9119, 0xDEA9},{0x9127, 0xD4F8},{0x912D, 0xEFF7},{0x9132, 0xD3B3},{0x9149, 0xEBB7},{0x914A, 0xEFF8},{0x914B, 0xF5DC}, - {0x914C, 0xEDCC},{0x914D, 0xDBD5},{0x914E, 0xF1CF},{0x9152, 0xF1D0},{0x9162, 0xF5B2},{0x9169, 0xD9AE},{0x916A, 0xD5AC},{0x916C, 0xE2C6}, - {0x9175, 0xFDA3},{0x9177, 0xFBE5},{0x9178, 0xDFAB},{0x9187, 0xE2F5},{0x9189, 0xF6AD},{0x918B, 0xF5B3},{0x918D, 0xF0B5},{0x9192, 0xE1A5}, - {0x919C, 0xF5DD},{0x91AB, 0xECA2},{0x91AC, 0xEDFD},{0x91AE, 0xF5B4},{0x91AF, 0xFBB8},{0x91B1, 0xDBA3},{0x91B4, 0xD6CA},{0x91B5, 0xCBD9}, - {0x91C0, 0xE5D4},{0x91C7, 0xF3FA},{0x91C9, 0xEBB8},{0x91CB, 0xE0B7},{0x91CC, 0xD7EC},{0x91CD, 0xF1EC},{0x91CE, 0xE5AF},{0x91CF, 0xD5E1}, - {0x91D0, 0xD7ED},{0x91D1, 0xD1D1},{0x91D7, 0xE1F2},{0x91D8, 0xEFF9},{0x91DC, 0xDDBC},{0x91DD, 0xF6DC},{0x91E3, 0xF0E5},{0x91E7, 0xF4C4}, - {0x91EA, 0xE9E9},{0x91F5, 0xF3FB},{0x920D, 0xD4EF},{0x9210, 0xCCA2},{0x9211, 0xF7FE},{0x9212, 0xDFBC},{0x9217, 0xEBCD},{0x921E, 0xD0B7}, - {0x9234, 0xD6C2},{0x923A, 0xE8AD},{0x923F, 0xEFAF},{0x9240, 0xCBA5},{0x9245, 0xCBE9},{0x9249, 0xFAE8},{0x9257, 0xCCC6},{0x925B, 0xE6E7}, - {0x925E, 0xEAC7},{0x9262, 0xDBA4},{0x9264, 0xCFC9},{0x9265, 0xE2FC},{0x9266, 0xEFFA},{0x9280, 0xEBDE},{0x9283, 0xF5C8},{0x9285, 0xD4DE}, - {0x9291, 0xE0D5},{0x9293, 0xEFB0},{0x9296, 0xE2C7},{0x9298, 0xD9AF},{0x929C, 0xF9E7},{0x92B3, 0xE7E5},{0x92B6, 0xCFCA},{0x92B7, 0xE1D1}, - {0x92B9, 0xE2C8},{0x92CC, 0xEFFB},{0x92CF, 0xFAF9},{0x92D2, 0xDCF2},{0x92E4, 0xE0A7},{0x92EA, 0xF8E8},{0x92F8, 0xCBEA},{0x92FC, 0xCBBC}, - {0x9304, 0xD6E2},{0x9310, 0xF5DE},{0x9318, 0xF5DF},{0x931A, 0xEEB6},{0x931E, 0xE2F6},{0x931F, 0xD3CA},{0x9320, 0xEFFC},{0x9321, 0xD1C4}, - {0x9322, 0xEFB1},{0x9324, 0xD1C5},{0x9326, 0xD0DE},{0x9328, 0xD9E1},{0x932B, 0xE0B8},{0x932E, 0xCDD1},{0x932F, 0xF3B9},{0x9348, 0xE7CC}, - {0x934A, 0xD6A8},{0x934B, 0xCEA7},{0x934D, 0xD4B5},{0x9354, 0xE4C8},{0x935B, 0xD3B4},{0x936E, 0xEBB9},{0x9375, 0xCBF5},{0x937C, 0xF6DD}, - {0x937E, 0xF1A3},{0x938C, 0xCCC7},{0x9394, 0xE9CA},{0x9396, 0xE1F0},{0x939A, 0xF5E0},{0x93A3, 0xFBAF},{0x93A7, 0xCBD1},{0x93AC, 0xFBE0}, - {0x93AD, 0xF2E5},{0x93B0, 0xECF0},{0x93C3, 0xF0EC},{0x93D1, 0xEEEB},{0x93DE, 0xE9CB},{0x93E1, 0xCCF0},{0x93E4, 0xD7AF},{0x93F6, 0xF3A1}, - {0x9404, 0xFCF5},{0x9418, 0xF1A4},{0x9425, 0xE0D6},{0x942B, 0xEFB2},{0x9435, 0xF4D1},{0x9438, 0xF7A1},{0x9444, 0xF1D1},{0x9451, 0xCAFC}, - {0x9452, 0xCAFD},{0x945B, 0xCECE},{0x947D, 0xF3C8},{0x947F, 0xF3BA},{0x9577, 0xEDFE},{0x9580, 0xDAA6},{0x9583, 0xE0EC},{0x9589, 0xF8CD}, - {0x958B, 0xCBD2},{0x958F, 0xEBCE},{0x9591, 0xF9D8},{0x9592, 0xF9D9},{0x9593, 0xCAE0},{0x9594, 0xDACA},{0x9598, 0xCBA6},{0x95A3, 0xCAC8}, - {0x95A4, 0xF9EE},{0x95A5, 0xDBEC},{0x95A8, 0xD0B1},{0x95AD, 0xD5EF},{0x95B1, 0xE6F3},{0x95BB, 0xE7A2},{0x95BC, 0xE4D9},{0x95C7, 0xE4E1}, - {0x95CA, 0xFCC4},{0x95D4, 0xF9EF},{0x95D5, 0xCFF4},{0x95D6, 0xF7E6},{0x95DC, 0xCEBC},{0x95E1, 0xF4C5},{0x95E2, 0xDCA3},{0x961C, 0xDDBD}, - {0x9621, 0xF4C6},{0x962A, 0xF8A1},{0x962E, 0xE8D6},{0x9632, 0xDBC1},{0x963B, 0xF0E6},{0x963F, 0xE4B9},{0x9640, 0xF6ED},{0x9642, 0xF9AE}, - {0x9644, 0xDDBE},{0x964B, 0xD7B0},{0x964C, 0xD8E8},{0x964D, 0xCBBD},{0x9650, 0xF9DA},{0x965B, 0xF8CE},{0x965C, 0xF9F0},{0x965D, 0xE0ED}, - {0x965E, 0xE3B3},{0x965F, 0xF4B3},{0x9662, 0xEAC2},{0x9663, 0xF2E6},{0x9664, 0xF0B6},{0x966A, 0xDBD6},{0x9670, 0xEBE4},{0x9673, 0xF2E7}, - {0x9675, 0xD7D5},{0x9676, 0xD4B6},{0x9677, 0xF9E8},{0x9678, 0xD7C1},{0x967D, 0xE5D5},{0x9685, 0xE9EA},{0x9686, 0xD7CC},{0x968A, 0xD3E9}, - {0x968B, 0xE2C9},{0x968D, 0xFCDB},{0x968E, 0xCDAD},{0x9694, 0xCCB0},{0x9695, 0xEAA2},{0x9698, 0xE4F6},{0x9699, 0xD0C0},{0x969B, 0xF0B7}, - {0x969C, 0xEEA1},{0x96A3, 0xD7F6},{0x96A7, 0xE2CA},{0x96A8, 0xE2CB},{0x96AA, 0xFACF},{0x96B1, 0xEBDF},{0x96B7, 0xD6CB},{0x96BB, 0xF4B4}, - {0x96C0, 0xEDCD},{0x96C1, 0xE4D2},{0x96C4, 0xEAA9},{0x96C5, 0xE4BA},{0x96C6, 0xF3A2},{0x96C7, 0xCDD2},{0x96C9, 0xF6CB},{0x96CB, 0xF1E6}, - {0x96CC, 0xEDC1},{0x96CD, 0xE8BC},{0x96CE, 0xEED1},{0x96D5, 0xF0E7},{0x96D6, 0xE2CC},{0x96D9, 0xE4AA},{0x96DB, 0xF5E1},{0x96DC, 0xEDDA}, - {0x96E2, 0xD7EE},{0x96E3, 0xD1F1},{0x96E8, 0xE9EB},{0x96E9, 0xE9EC},{0x96EA, 0xE0E4},{0x96EF, 0xDAA7},{0x96F0, 0xDDD4},{0x96F2, 0xEAA3}, - {0x96F6, 0xD6C3},{0x96F7, 0xD6F4},{0x96F9, 0xDADF},{0x96FB, 0xEFB3},{0x9700, 0xE2CD},{0x9706, 0xEFFD},{0x9707, 0xF2E8},{0x9711, 0xEFC5}, - {0x9713, 0xE7E7},{0x9716, 0xD7FD},{0x9719, 0xE7CE},{0x971C, 0xDFDC},{0x971E, 0xF9C7},{0x9727, 0xD9F6},{0x9730, 0xDFAC},{0x9732, 0xD6DA}, - {0x9739, 0xDCA4},{0x973D, 0xF0B8},{0x9742, 0xD5FA},{0x9744, 0xE4F7},{0x9748, 0xD6C4},{0x9751, 0xF4EC},{0x9756, 0xEFFE},{0x975C, 0xF0A1}, - {0x975E, 0xDEAA},{0x9761, 0xDABC},{0x9762, 0xD8FC},{0x9769, 0xFAD4},{0x976D, 0xECE5},{0x9774, 0xFCA8},{0x9777, 0xECE6},{0x977A, 0xD8CB}, - {0x978B, 0xFBB9},{0x978D, 0xE4D3},{0x978F, 0xCDF9},{0x97A0, 0xCFD3},{0x97A8, 0xCAEA},{0x97AB, 0xCFD4},{0x97AD, 0xF8BD},{0x97C6, 0xF4C7}, - {0x97CB, 0xEADF},{0x97D3, 0xF9DB},{0x97DC, 0xD4B7},{0x97F3, 0xEBE5},{0x97F6, 0xE1D2},{0x97FB, 0xEAA4},{0x97FF, 0xFAC2},{0x9800, 0xFBE1}, - {0x9801, 0xFAED},{0x9802, 0xF0A2},{0x9803, 0xCCF1},{0x9805, 0xFAA3},{0x9806, 0xE2F7},{0x9808, 0xE2CE},{0x980A, 0xE9F5},{0x980C, 0xE1EB}, - {0x9810, 0xE7E8},{0x9811, 0xE8D7},{0x9812, 0xDAF8},{0x9813, 0xD4CB},{0x9817, 0xF7F6},{0x9818, 0xD6C5},{0x982D, 0xD4E9},{0x9830, 0xFAFA}, - {0x9838, 0xCCF2},{0x9839, 0xF7DD},{0x983B, 0xDEBA},{0x9846, 0xCEA8},{0x984C, 0xF0B9},{0x984D, 0xE4FE},{0x984E, 0xE4C9},{0x9854, 0xE4D4}, - {0x9858, 0xEAC3},{0x985A, 0xEFB4},{0x985E, 0xD7BE},{0x9865, 0xFBE2},{0x9867, 0xCDD3},{0x986B, 0xEFB5},{0x986F, 0xFAE9},{0x98A8, 0xF9A6}, - {0x98AF, 0xDFBD},{0x98B1, 0xF7C7},{0x98C4, 0xF8FD},{0x98C7, 0xF8FC},{0x98DB, 0xDEAB},{0x98DC, 0xDBE8},{0x98DF, 0xE3DD},{0x98E1, 0xE1E2}, - {0x98E2, 0xD1C6},{0x98ED, 0xF6D0},{0x98EE, 0xEBE6},{0x98EF, 0xDAF9},{0x98F4, 0xECC7},{0x98FC, 0xDEF8},{0x98FD, 0xF8E9},{0x98FE, 0xE3DE}, - {0x9903, 0xCEF5},{0x9909, 0xFAC3},{0x990A, 0xE5D7},{0x990C, 0xECC8},{0x9910, 0xF3C9},{0x9913, 0xE4BB},{0x9918, 0xE6AE},{0x991E, 0xEFB6}, - {0x9920, 0xDCBF},{0x9928, 0xCEBD},{0x9945, 0xD8C3},{0x9949, 0xD0CF},{0x994B, 0xCFFA},{0x994C, 0xF3CA},{0x994D, 0xE0D7},{0x9951, 0xD1C7}, - {0x9952, 0xE9AE},{0x9954, 0xE8BD},{0x9957, 0xFAC4},{0x9996, 0xE2CF},{0x9999, 0xFAC5},{0x999D, 0xF9B8},{0x99A5, 0xDCE0},{0x99A8, 0xFBB0}, - {0x99AC, 0xD8A9},{0x99AD, 0xE5DF},{0x99AE, 0xF9A7},{0x99B1, 0xF6EE},{0x99B3, 0xF6CC},{0x99B4, 0xE2F8},{0x99B9, 0xECF1},{0x99C1, 0xDAE0}, - {0x99D0, 0xF1D2},{0x99D1, 0xD2CC},{0x99D2, 0xCFCB},{0x99D5, 0xCABD},{0x99D9, 0xDDBF},{0x99DD, 0xF6EF},{0x99DF, 0xDEF9},{0x99ED, 0xFAB4}, - {0x99F1, 0xD5AD},{0x99FF, 0xF1E7},{0x9A01, 0xDEBE},{0x9A08, 0xDCC0},{0x9A0E, 0xD1C8},{0x9A0F, 0xD1C9},{0x9A19, 0xF8BE},{0x9A2B, 0xCBF6}, - {0x9A30, 0xD4F9},{0x9A36, 0xF5E2},{0x9A37, 0xE1D3},{0x9A40, 0xD8E9},{0x9A43, 0xF8FE},{0x9A45, 0xCFCC},{0x9A4D, 0xFDA4},{0x9A55, 0xCEF6}, - {0x9A57, 0xFAD0},{0x9A5A, 0xCCF3},{0x9A5B, 0xE6BE},{0x9A5F, 0xF6AE},{0x9A62, 0xD5F0},{0x9A65, 0xD1CA},{0x9A69, 0xFCBE},{0x9A6A, 0xD5F1}, - {0x9AA8, 0xCDE9},{0x9AB8, 0xFAB5},{0x9AD3, 0xE2D0},{0x9AD4, 0xF4F7},{0x9AD8, 0xCDD4},{0x9AE5, 0xE7A3},{0x9AEE, 0xDBA5},{0x9B1A, 0xE2D1}, - {0x9B27, 0xD7A2},{0x9B2A, 0xF7E3},{0x9B31, 0xEAA6},{0x9B3C, 0xD0A1},{0x9B41, 0xCEDA},{0x9B42, 0xFBEB},{0x9B43, 0xDBA6},{0x9B44, 0xDBDE}, - {0x9B45, 0xD8E5},{0x9B4F, 0xEAE0},{0x9B54, 0xD8AA},{0x9B5A, 0xE5E0},{0x9B6F, 0xD6DB},{0x9B8E, 0xEFC6},{0x9B91, 0xF8EA},{0x9B9F, 0xE4D5}, - {0x9BAB, 0xCEF7},{0x9BAE, 0xE0D8},{0x9BC9, 0xD7EF},{0x9BD6, 0xF4ED},{0x9BE4, 0xCDE6},{0x9BE8, 0xCCF4},{0x9C0D, 0xF5E3},{0x9C10, 0xE4CA}, - {0x9C12, 0xDCE1},{0x9C15, 0xF9C8},{0x9C25, 0xFCBF},{0x9C32, 0xE8A7},{0x9C3B, 0xD8C4},{0x9C47, 0xCBBE},{0x9C49, 0xDCAE},{0x9C57, 0xD7F7}, - {0x9CE5, 0xF0E8},{0x9CE7, 0xDDC0},{0x9CE9, 0xCFCD},{0x9CF3, 0xDCF3},{0x9CF4, 0xD9B0},{0x9CF6, 0xE6E9},{0x9D09, 0xE4BC},{0x9D1B, 0xEAC4}, - {0x9D26, 0xE4EC},{0x9D28, 0xE4E5},{0x9D3B, 0xFBF8},{0x9D51, 0xCCBB},{0x9D5D, 0xE4BD},{0x9D60, 0xCDDC},{0x9D61, 0xD9F7},{0x9D6C, 0xDDDF}, - {0x9D72, 0xEDCE},{0x9DA9, 0xD9D0},{0x9DAF, 0xE5A3},{0x9DB4, 0xF9CD},{0x9DC4, 0xCDAE},{0x9DD7, 0xCFCE},{0x9DF2, 0xF6AF},{0x9DF8, 0xFDD3}, - {0x9DF9, 0xEBED},{0x9DFA, 0xD6DC},{0x9E1A, 0xE5A4},{0x9E1E, 0xD5B6},{0x9E75, 0xD6DD},{0x9E79, 0xF9E9},{0x9E7D, 0xE7A4},{0x9E7F, 0xD6E3}, - {0x9E92, 0xD1CB},{0x9E93, 0xD6E4},{0x9E97, 0xD5F2},{0x9E9D, 0xDEFA},{0x9E9F, 0xD7F8},{0x9EA5, 0xD8EA},{0x9EB4, 0xCFD5},{0x9EB5, 0xD8FD}, - {0x9EBB, 0xD8AB},{0x9EBE, 0xFDCB},{0x9EC3, 0xFCDC},{0x9ECD, 0xE0A8},{0x9ECE, 0xD5F3},{0x9ED1, 0xFDD9},{0x9ED4, 0xCCA3},{0x9ED8, 0xD9F9}, - {0x9EDB, 0xD3EA},{0x9EDC, 0xF5F5},{0x9EDE, 0xEFC7},{0x9EE8, 0xD3DA},{0x9EF4, 0xDABD},{0x9F07, 0xE8A8},{0x9F08, 0xDCAF},{0x9F0E, 0xF0A3}, - {0x9F13, 0xCDD5},{0x9F20, 0xE0A9},{0x9F3B, 0xDEAC},{0x9F4A, 0xF0BA},{0x9F4B, 0xEEB1},{0x9F4E, 0xEEB2},{0x9F52, 0xF6CD},{0x9F5F, 0xEED2}, - {0x9F61, 0xD6C6},{0x9F67, 0xE0E5},{0x9F6A, 0xF3BB},{0x9F6C, 0xE5E1},{0x9F77, 0xE4CB},{0x9F8D, 0xD7A3},{0x9F90, 0xDBC2},{0x9F95, 0xCAFE}, - {0x9F9C, 0xCFCF},{0xAC00, 0xB0A1},{0xAC01, 0xB0A2},{0xAC02, 0x8141},{0xAC03, 0x8142},{0xAC04, 0xB0A3},{0xAC05, 0x8143},{0xAC06, 0x8144}, - {0xAC07, 0xB0A4},{0xAC08, 0xB0A5},{0xAC09, 0xB0A6},{0xAC0A, 0xB0A7},{0xAC0B, 0x8145},{0xAC0C, 0x8146},{0xAC0D, 0x8147},{0xAC0E, 0x8148}, - {0xAC0F, 0x8149},{0xAC10, 0xB0A8},{0xAC11, 0xB0A9},{0xAC12, 0xB0AA},{0xAC13, 0xB0AB},{0xAC14, 0xB0AC},{0xAC15, 0xB0AD},{0xAC16, 0xB0AE}, - {0xAC17, 0xB0AF},{0xAC18, 0x814A},{0xAC19, 0xB0B0},{0xAC1A, 0xB0B1},{0xAC1B, 0xB0B2},{0xAC1C, 0xB0B3},{0xAC1D, 0xB0B4},{0xAC1E, 0x814B}, - {0xAC1F, 0x814C},{0xAC20, 0xB0B5},{0xAC21, 0x814D},{0xAC22, 0x814E},{0xAC23, 0x814F},{0xAC24, 0xB0B6},{0xAC25, 0x8150},{0xAC26, 0x8151}, - {0xAC27, 0x8152},{0xAC28, 0x8153},{0xAC29, 0x8154},{0xAC2A, 0x8155},{0xAC2B, 0x8156},{0xAC2C, 0xB0B7},{0xAC2D, 0xB0B8},{0xAC2E, 0x8157}, - {0xAC2F, 0xB0B9},{0xAC30, 0xB0BA},{0xAC31, 0xB0BB},{0xAC32, 0x8158},{0xAC33, 0x8159},{0xAC34, 0x815A},{0xAC35, 0x8161},{0xAC36, 0x8162}, - {0xAC37, 0x8163},{0xAC38, 0xB0BC},{0xAC39, 0xB0BD},{0xAC3A, 0x8164},{0xAC3B, 0x8165},{0xAC3C, 0xB0BE},{0xAC3D, 0x8166},{0xAC3E, 0x8167}, - {0xAC3F, 0x8168},{0xAC40, 0xB0BF},{0xAC41, 0x8169},{0xAC42, 0x816A},{0xAC43, 0x816B},{0xAC44, 0x816C},{0xAC45, 0x816D},{0xAC46, 0x816E}, - {0xAC47, 0x816F},{0xAC48, 0x8170},{0xAC49, 0x8171},{0xAC4A, 0x8172},{0xAC4B, 0xB0C0},{0xAC4C, 0x8173},{0xAC4D, 0xB0C1},{0xAC4E, 0x8174}, - {0xAC4F, 0x8175},{0xAC50, 0x8176},{0xAC51, 0x8177},{0xAC52, 0x8178},{0xAC53, 0x8179},{0xAC54, 0xB0C2},{0xAC55, 0x817A},{0xAC56, 0x8181}, - {0xAC57, 0x8182},{0xAC58, 0xB0C3},{0xAC59, 0x8183},{0xAC5A, 0x8184},{0xAC5B, 0x8185},{0xAC5C, 0xB0C4},{0xAC5D, 0x8186},{0xAC5E, 0x8187}, - {0xAC5F, 0x8188},{0xAC60, 0x8189},{0xAC61, 0x818A},{0xAC62, 0x818B},{0xAC63, 0x818C},{0xAC64, 0x818D},{0xAC65, 0x818E},{0xAC66, 0x818F}, - {0xAC67, 0x8190},{0xAC68, 0x8191},{0xAC69, 0x8192},{0xAC6A, 0x8193},{0xAC6B, 0x8194},{0xAC6C, 0x8195},{0xAC6D, 0x8196},{0xAC6E, 0x8197}, - {0xAC6F, 0x8198},{0xAC70, 0xB0C5},{0xAC71, 0xB0C6},{0xAC72, 0x8199},{0xAC73, 0x819A},{0xAC74, 0xB0C7},{0xAC75, 0x819B},{0xAC76, 0x819C}, - {0xAC77, 0xB0C8},{0xAC78, 0xB0C9},{0xAC79, 0x819D},{0xAC7A, 0xB0CA},{0xAC7B, 0x819E},{0xAC7C, 0x819F},{0xAC7D, 0x81A0},{0xAC7E, 0x81A1}, - {0xAC7F, 0x81A2},{0xAC80, 0xB0CB},{0xAC81, 0xB0CC},{0xAC82, 0x81A3},{0xAC83, 0xB0CD},{0xAC84, 0xB0CE},{0xAC85, 0xB0CF},{0xAC86, 0xB0D0}, - {0xAC87, 0x81A4},{0xAC88, 0x81A5},{0xAC89, 0xB0D1},{0xAC8A, 0xB0D2},{0xAC8B, 0xB0D3},{0xAC8C, 0xB0D4},{0xAC8D, 0x81A6},{0xAC8E, 0x81A7}, - {0xAC8F, 0x81A8},{0xAC90, 0xB0D5},{0xAC91, 0x81A9},{0xAC92, 0x81AA},{0xAC93, 0x81AB},{0xAC94, 0xB0D6},{0xAC95, 0x81AC},{0xAC96, 0x81AD}, - {0xAC97, 0x81AE},{0xAC98, 0x81AF},{0xAC99, 0x81B0},{0xAC9A, 0x81B1},{0xAC9B, 0x81B2},{0xAC9C, 0xB0D7},{0xAC9D, 0xB0D8},{0xAC9E, 0x81B3}, - {0xAC9F, 0xB0D9},{0xACA0, 0xB0DA},{0xACA1, 0xB0DB},{0xACA2, 0x81B4},{0xACA3, 0x81B5},{0xACA4, 0x81B6},{0xACA5, 0x81B7},{0xACA6, 0x81B8}, - {0xACA7, 0x81B9},{0xACA8, 0xB0DC},{0xACA9, 0xB0DD},{0xACAA, 0xB0DE},{0xACAB, 0x81BA},{0xACAC, 0xB0DF},{0xACAD, 0x81BB},{0xACAE, 0x81BC}, - {0xACAF, 0xB0E0},{0xACB0, 0xB0E1},{0xACB1, 0x81BD},{0xACB2, 0x81BE},{0xACB3, 0x81BF},{0xACB4, 0x81C0},{0xACB5, 0x81C1},{0xACB6, 0x81C2}, - {0xACB7, 0x81C3},{0xACB8, 0xB0E2},{0xACB9, 0xB0E3},{0xACBA, 0x81C4},{0xACBB, 0xB0E4},{0xACBC, 0xB0E5},{0xACBD, 0xB0E6},{0xACBE, 0x81C5}, - {0xACBF, 0x81C6},{0xACC0, 0x81C7},{0xACC1, 0xB0E7},{0xACC2, 0x81C8},{0xACC3, 0x81C9},{0xACC4, 0xB0E8},{0xACC5, 0x81CA},{0xACC6, 0x81CB}, - {0xACC7, 0x81CC},{0xACC8, 0xB0E9},{0xACC9, 0x81CD},{0xACCA, 0x81CE},{0xACCB, 0x81CF},{0xACCC, 0xB0EA},{0xACCD, 0x81D0},{0xACCE, 0x81D1}, - {0xACCF, 0x81D2},{0xACD0, 0x81D3},{0xACD1, 0x81D4},{0xACD2, 0x81D5},{0xACD3, 0x81D6},{0xACD4, 0x81D7},{0xACD5, 0xB0EB},{0xACD6, 0x81D8}, - {0xACD7, 0xB0EC},{0xACD8, 0x81D9},{0xACD9, 0x81DA},{0xACDA, 0x81DB},{0xACDB, 0x81DC},{0xACDC, 0x81DD},{0xACDD, 0x81DE},{0xACDE, 0x81DF}, - {0xACDF, 0x81E0},{0xACE0, 0xB0ED},{0xACE1, 0xB0EE},{0xACE2, 0x81E1},{0xACE3, 0x81E2},{0xACE4, 0xB0EF},{0xACE5, 0x81E3},{0xACE6, 0x81E4}, - {0xACE7, 0xB0F0},{0xACE8, 0xB0F1},{0xACE9, 0x81E5},{0xACEA, 0xB0F2},{0xACEB, 0x81E6},{0xACEC, 0xB0F3},{0xACED, 0x81E7},{0xACEE, 0x81E8}, - {0xACEF, 0xB0F4},{0xACF0, 0xB0F5},{0xACF1, 0xB0F6},{0xACF2, 0x81E9},{0xACF3, 0xB0F7},{0xACF4, 0x81EA},{0xACF5, 0xB0F8},{0xACF6, 0xB0F9}, - {0xACF7, 0x81EB},{0xACF8, 0x81EC},{0xACF9, 0x81ED},{0xACFA, 0x81EE},{0xACFB, 0x81EF},{0xACFC, 0xB0FA},{0xACFD, 0xB0FB},{0xACFE, 0x81F0}, - {0xACFF, 0x81F1},{0xAD00, 0xB0FC},{0xAD01, 0x81F2},{0xAD02, 0x81F3},{0xAD03, 0x81F4},{0xAD04, 0xB0FD},{0xAD05, 0x81F5},{0xAD06, 0xB0FE}, - {0xAD07, 0x81F6},{0xAD08, 0x81F7},{0xAD09, 0x81F8},{0xAD0A, 0x81F9},{0xAD0B, 0x81FA},{0xAD0C, 0xB1A1},{0xAD0D, 0xB1A2},{0xAD0E, 0x81FB}, - {0xAD0F, 0xB1A3},{0xAD10, 0x81FC},{0xAD11, 0xB1A4},{0xAD12, 0x81FD},{0xAD13, 0x81FE},{0xAD14, 0x8241},{0xAD15, 0x8242},{0xAD16, 0x8243}, - {0xAD17, 0x8244},{0xAD18, 0xB1A5},{0xAD19, 0x8245},{0xAD1A, 0x8246},{0xAD1B, 0x8247},{0xAD1C, 0xB1A6},{0xAD1D, 0x8248},{0xAD1E, 0x8249}, - {0xAD1F, 0x824A},{0xAD20, 0xB1A7},{0xAD21, 0x824B},{0xAD22, 0x824C},{0xAD23, 0x824D},{0xAD24, 0x824E},{0xAD25, 0x824F},{0xAD26, 0x8250}, - {0xAD27, 0x8251},{0xAD28, 0x8252},{0xAD29, 0xB1A8},{0xAD2A, 0x8253},{0xAD2B, 0x8254},{0xAD2C, 0xB1A9},{0xAD2D, 0xB1AA},{0xAD2E, 0x8255}, - {0xAD2F, 0x8256},{0xAD30, 0x8257},{0xAD31, 0x8258},{0xAD32, 0x8259},{0xAD33, 0x825A},{0xAD34, 0xB1AB},{0xAD35, 0xB1AC},{0xAD36, 0x8261}, - {0xAD37, 0x8262},{0xAD38, 0xB1AD},{0xAD39, 0x8263},{0xAD3A, 0x8264},{0xAD3B, 0x8265},{0xAD3C, 0xB1AE},{0xAD3D, 0x8266},{0xAD3E, 0x8267}, - {0xAD3F, 0x8268},{0xAD40, 0x8269},{0xAD41, 0x826A},{0xAD42, 0x826B},{0xAD43, 0x826C},{0xAD44, 0xB1AF},{0xAD45, 0xB1B0},{0xAD46, 0x826D}, - {0xAD47, 0xB1B1},{0xAD48, 0x826E},{0xAD49, 0xB1B2},{0xAD4A, 0x826F},{0xAD4B, 0x8270},{0xAD4C, 0x8271},{0xAD4D, 0x8272},{0xAD4E, 0x8273}, - {0xAD4F, 0x8274},{0xAD50, 0xB1B3},{0xAD51, 0x8275},{0xAD52, 0x8276},{0xAD53, 0x8277},{0xAD54, 0xB1B4},{0xAD55, 0x8278},{0xAD56, 0x8279}, - {0xAD57, 0x827A},{0xAD58, 0xB1B5},{0xAD59, 0x8281},{0xAD5A, 0x8282},{0xAD5B, 0x8283},{0xAD5C, 0x8284},{0xAD5D, 0x8285},{0xAD5E, 0x8286}, - {0xAD5F, 0x8287},{0xAD60, 0x8288},{0xAD61, 0xB1B6},{0xAD62, 0x8289},{0xAD63, 0xB1B7},{0xAD64, 0x828A},{0xAD65, 0x828B},{0xAD66, 0x828C}, - {0xAD67, 0x828D},{0xAD68, 0x828E},{0xAD69, 0x828F},{0xAD6A, 0x8290},{0xAD6B, 0x8291},{0xAD6C, 0xB1B8},{0xAD6D, 0xB1B9},{0xAD6E, 0x8292}, - {0xAD6F, 0x8293},{0xAD70, 0xB1BA},{0xAD71, 0x8294},{0xAD72, 0x8295},{0xAD73, 0xB1BB},{0xAD74, 0xB1BC},{0xAD75, 0xB1BD},{0xAD76, 0xB1BE}, - {0xAD77, 0x8296},{0xAD78, 0x8297},{0xAD79, 0x8298},{0xAD7A, 0x8299},{0xAD7B, 0xB1BF},{0xAD7C, 0xB1C0},{0xAD7D, 0xB1C1},{0xAD7E, 0x829A}, - {0xAD7F, 0xB1C2},{0xAD80, 0x829B},{0xAD81, 0xB1C3},{0xAD82, 0xB1C4},{0xAD83, 0x829C},{0xAD84, 0x829D},{0xAD85, 0x829E},{0xAD86, 0x829F}, - {0xAD87, 0x82A0},{0xAD88, 0xB1C5},{0xAD89, 0xB1C6},{0xAD8A, 0x82A1},{0xAD8B, 0x82A2},{0xAD8C, 0xB1C7},{0xAD8D, 0x82A3},{0xAD8E, 0x82A4}, - {0xAD8F, 0x82A5},{0xAD90, 0xB1C8},{0xAD91, 0x82A6},{0xAD92, 0x82A7},{0xAD93, 0x82A8},{0xAD94, 0x82A9},{0xAD95, 0x82AA},{0xAD96, 0x82AB}, - {0xAD97, 0x82AC},{0xAD98, 0x82AD},{0xAD99, 0x82AE},{0xAD9A, 0x82AF},{0xAD9B, 0x82B0},{0xAD9C, 0xB1C9},{0xAD9D, 0xB1CA},{0xAD9E, 0x82B1}, - {0xAD9F, 0x82B2},{0xADA0, 0x82B3},{0xADA1, 0x82B4},{0xADA2, 0x82B5},{0xADA3, 0x82B6},{0xADA4, 0xB1CB},{0xADA5, 0x82B7},{0xADA6, 0x82B8}, - {0xADA7, 0x82B9},{0xADA8, 0x82BA},{0xADA9, 0x82BB},{0xADAA, 0x82BC},{0xADAB, 0x82BD},{0xADAC, 0x82BE},{0xADAD, 0x82BF},{0xADAE, 0x82C0}, - {0xADAF, 0x82C1},{0xADB0, 0x82C2},{0xADB1, 0x82C3},{0xADB2, 0x82C4},{0xADB3, 0x82C5},{0xADB4, 0x82C6},{0xADB5, 0x82C7},{0xADB6, 0x82C8}, - {0xADB7, 0xB1CC},{0xADB8, 0x82C9},{0xADB9, 0x82CA},{0xADBA, 0x82CB},{0xADBB, 0x82CC},{0xADBC, 0x82CD},{0xADBD, 0x82CE},{0xADBE, 0x82CF}, - {0xADBF, 0x82D0},{0xADC0, 0xB1CD},{0xADC1, 0xB1CE},{0xADC2, 0x82D1},{0xADC3, 0x82D2},{0xADC4, 0xB1CF},{0xADC5, 0x82D3},{0xADC6, 0x82D4}, - {0xADC7, 0x82D5},{0xADC8, 0xB1D0},{0xADC9, 0x82D6},{0xADCA, 0x82D7},{0xADCB, 0x82D8},{0xADCC, 0x82D9},{0xADCD, 0x82DA},{0xADCE, 0x82DB}, - {0xADCF, 0x82DC},{0xADD0, 0xB1D1},{0xADD1, 0xB1D2},{0xADD2, 0x82DD},{0xADD3, 0xB1D3},{0xADD4, 0x82DE},{0xADD5, 0x82DF},{0xADD6, 0x82E0}, - {0xADD7, 0x82E1},{0xADD8, 0x82E2},{0xADD9, 0x82E3},{0xADDA, 0x82E4},{0xADDB, 0x82E5},{0xADDC, 0xB1D4},{0xADDD, 0x82E6},{0xADDE, 0x82E7}, - {0xADDF, 0x82E8},{0xADE0, 0xB1D5},{0xADE1, 0x82E9},{0xADE2, 0x82EA},{0xADE3, 0x82EB},{0xADE4, 0xB1D6},{0xADE5, 0x82EC},{0xADE6, 0x82ED}, - {0xADE7, 0x82EE},{0xADE8, 0x82EF},{0xADE9, 0x82F0},{0xADEA, 0x82F1},{0xADEB, 0x82F2},{0xADEC, 0x82F3},{0xADED, 0x82F4},{0xADEE, 0x82F5}, - {0xADEF, 0x82F6},{0xADF0, 0x82F7},{0xADF1, 0x82F8},{0xADF2, 0x82F9},{0xADF3, 0x82FA},{0xADF4, 0x82FB},{0xADF5, 0x82FC},{0xADF6, 0x82FD}, - {0xADF7, 0x82FE},{0xADF8, 0xB1D7},{0xADF9, 0xB1D8},{0xADFA, 0x8341},{0xADFB, 0x8342},{0xADFC, 0xB1D9},{0xADFD, 0x8343},{0xADFE, 0x8344}, - {0xADFF, 0xB1DA},{0xAE00, 0xB1DB},{0xAE01, 0xB1DC},{0xAE02, 0x8345},{0xAE03, 0x8346},{0xAE04, 0x8347},{0xAE05, 0x8348},{0xAE06, 0x8349}, - {0xAE07, 0x834A},{0xAE08, 0xB1DD},{0xAE09, 0xB1DE},{0xAE0A, 0x834B},{0xAE0B, 0xB1DF},{0xAE0C, 0x834C},{0xAE0D, 0xB1E0},{0xAE0E, 0x834D}, - {0xAE0F, 0x834E},{0xAE10, 0x834F},{0xAE11, 0x8350},{0xAE12, 0x8351},{0xAE13, 0x8352},{0xAE14, 0xB1E1},{0xAE15, 0x8353},{0xAE16, 0x8354}, - {0xAE17, 0x8355},{0xAE18, 0x8356},{0xAE19, 0x8357},{0xAE1A, 0x8358},{0xAE1B, 0x8359},{0xAE1C, 0x835A},{0xAE1D, 0x8361},{0xAE1E, 0x8362}, - {0xAE1F, 0x8363},{0xAE20, 0x8364},{0xAE21, 0x8365},{0xAE22, 0x8366},{0xAE23, 0x8367},{0xAE24, 0x8368},{0xAE25, 0x8369},{0xAE26, 0x836A}, - {0xAE27, 0x836B},{0xAE28, 0x836C},{0xAE29, 0x836D},{0xAE2A, 0x836E},{0xAE2B, 0x836F},{0xAE2C, 0x8370},{0xAE2D, 0x8371},{0xAE2E, 0x8372}, - {0xAE2F, 0x8373},{0xAE30, 0xB1E2},{0xAE31, 0xB1E3},{0xAE32, 0x8374},{0xAE33, 0x8375},{0xAE34, 0xB1E4},{0xAE35, 0x8376},{0xAE36, 0x8377}, - {0xAE37, 0xB1E5},{0xAE38, 0xB1E6},{0xAE39, 0x8378},{0xAE3A, 0xB1E7},{0xAE3B, 0x8379},{0xAE3C, 0x837A},{0xAE3D, 0x8381},{0xAE3E, 0x8382}, - {0xAE3F, 0x8383},{0xAE40, 0xB1E8},{0xAE41, 0xB1E9},{0xAE42, 0x8384},{0xAE43, 0xB1EA},{0xAE44, 0x8385},{0xAE45, 0xB1EB},{0xAE46, 0xB1EC}, - {0xAE47, 0x8386},{0xAE48, 0x8387},{0xAE49, 0x8388},{0xAE4A, 0xB1ED},{0xAE4B, 0x8389},{0xAE4C, 0xB1EE},{0xAE4D, 0xB1EF},{0xAE4E, 0xB1F0}, - {0xAE4F, 0x838A},{0xAE50, 0xB1F1},{0xAE51, 0x838B},{0xAE52, 0x838C},{0xAE53, 0x838D},{0xAE54, 0xB1F2},{0xAE55, 0x838E},{0xAE56, 0xB1F3}, - {0xAE57, 0x838F},{0xAE58, 0x8390},{0xAE59, 0x8391},{0xAE5A, 0x8392},{0xAE5B, 0x8393},{0xAE5C, 0xB1F4},{0xAE5D, 0xB1F5},{0xAE5E, 0x8394}, - {0xAE5F, 0xB1F6},{0xAE60, 0xB1F7},{0xAE61, 0xB1F8},{0xAE62, 0x8395},{0xAE63, 0x8396},{0xAE64, 0x8397},{0xAE65, 0xB1F9},{0xAE66, 0x8398}, - {0xAE67, 0x8399},{0xAE68, 0xB1FA},{0xAE69, 0xB1FB},{0xAE6A, 0x839A},{0xAE6B, 0x839B},{0xAE6C, 0xB1FC},{0xAE6D, 0x839C},{0xAE6E, 0x839D}, - {0xAE6F, 0x839E},{0xAE70, 0xB1FD},{0xAE71, 0x839F},{0xAE72, 0x83A0},{0xAE73, 0x83A1},{0xAE74, 0x83A2},{0xAE75, 0x83A3},{0xAE76, 0x83A4}, - {0xAE77, 0x83A5},{0xAE78, 0xB1FE},{0xAE79, 0xB2A1},{0xAE7A, 0x83A6},{0xAE7B, 0xB2A2},{0xAE7C, 0xB2A3},{0xAE7D, 0xB2A4},{0xAE7E, 0x83A7}, - {0xAE7F, 0x83A8},{0xAE80, 0x83A9},{0xAE81, 0x83AA},{0xAE82, 0x83AB},{0xAE83, 0x83AC},{0xAE84, 0xB2A5},{0xAE85, 0xB2A6},{0xAE86, 0x83AD}, - {0xAE87, 0x83AE},{0xAE88, 0x83AF},{0xAE89, 0x83B0},{0xAE8A, 0x83B1},{0xAE8B, 0x83B2},{0xAE8C, 0xB2A7},{0xAE8D, 0x83B3},{0xAE8E, 0x83B4}, - {0xAE8F, 0x83B5},{0xAE90, 0x83B6},{0xAE91, 0x83B7},{0xAE92, 0x83B8},{0xAE93, 0x83B9},{0xAE94, 0x83BA},{0xAE95, 0x83BB},{0xAE96, 0x83BC}, - {0xAE97, 0x83BD},{0xAE98, 0x83BE},{0xAE99, 0x83BF},{0xAE9A, 0x83C0},{0xAE9B, 0x83C1},{0xAE9C, 0x83C2},{0xAE9D, 0x83C3},{0xAE9E, 0x83C4}, - {0xAE9F, 0x83C5},{0xAEA0, 0x83C6},{0xAEA1, 0x83C7},{0xAEA2, 0x83C8},{0xAEA3, 0x83C9},{0xAEA4, 0x83CA},{0xAEA5, 0x83CB},{0xAEA6, 0x83CC}, - {0xAEA7, 0x83CD},{0xAEA8, 0x83CE},{0xAEA9, 0x83CF},{0xAEAA, 0x83D0},{0xAEAB, 0x83D1},{0xAEAC, 0x83D2},{0xAEAD, 0x83D3},{0xAEAE, 0x83D4}, - {0xAEAF, 0x83D5},{0xAEB0, 0x83D6},{0xAEB1, 0x83D7},{0xAEB2, 0x83D8},{0xAEB3, 0x83D9},{0xAEB4, 0x83DA},{0xAEB5, 0x83DB},{0xAEB6, 0x83DC}, - {0xAEB7, 0x83DD},{0xAEB8, 0x83DE},{0xAEB9, 0x83DF},{0xAEBA, 0x83E0},{0xAEBB, 0x83E1},{0xAEBC, 0xB2A8},{0xAEBD, 0xB2A9},{0xAEBE, 0xB2AA}, - {0xAEBF, 0x83E2},{0xAEC0, 0xB2AB},{0xAEC1, 0x83E3},{0xAEC2, 0x83E4},{0xAEC3, 0x83E5},{0xAEC4, 0xB2AC},{0xAEC5, 0x83E6},{0xAEC6, 0x83E7}, - {0xAEC7, 0x83E8},{0xAEC8, 0x83E9},{0xAEC9, 0x83EA},{0xAECA, 0x83EB},{0xAECB, 0x83EC},{0xAECC, 0xB2AD},{0xAECD, 0xB2AE},{0xAECE, 0x83ED}, - {0xAECF, 0xB2AF},{0xAED0, 0xB2B0},{0xAED1, 0xB2B1},{0xAED2, 0x83EE},{0xAED3, 0x83EF},{0xAED4, 0x83F0},{0xAED5, 0x83F1},{0xAED6, 0x83F2}, - {0xAED7, 0x83F3},{0xAED8, 0xB2B2},{0xAED9, 0xB2B3},{0xAEDA, 0x83F4},{0xAEDB, 0x83F5},{0xAEDC, 0xB2B4},{0xAEDD, 0x83F6},{0xAEDE, 0x83F7}, - {0xAEDF, 0x83F8},{0xAEE0, 0x83F9},{0xAEE1, 0x83FA},{0xAEE2, 0x83FB},{0xAEE3, 0x83FC},{0xAEE4, 0x83FD},{0xAEE5, 0x83FE},{0xAEE6, 0x8441}, - {0xAEE7, 0x8442},{0xAEE8, 0xB2B5},{0xAEE9, 0x8443},{0xAEEA, 0x8444},{0xAEEB, 0xB2B6},{0xAEEC, 0x8445},{0xAEED, 0xB2B7},{0xAEEE, 0x8446}, - {0xAEEF, 0x8447},{0xAEF0, 0x8448},{0xAEF1, 0x8449},{0xAEF2, 0x844A},{0xAEF3, 0x844B},{0xAEF4, 0xB2B8},{0xAEF5, 0x844C},{0xAEF6, 0x844D}, - {0xAEF7, 0x844E},{0xAEF8, 0xB2B9},{0xAEF9, 0x844F},{0xAEFA, 0x8450},{0xAEFB, 0x8451},{0xAEFC, 0xB2BA},{0xAEFD, 0x8452},{0xAEFE, 0x8453}, - {0xAEFF, 0x8454},{0xAF00, 0x8455},{0xAF01, 0x8456},{0xAF02, 0x8457},{0xAF03, 0x8458},{0xAF04, 0x8459},{0xAF05, 0x845A},{0xAF06, 0x8461}, - {0xAF07, 0xB2BB},{0xAF08, 0xB2BC},{0xAF09, 0x8462},{0xAF0A, 0x8463},{0xAF0B, 0x8464},{0xAF0C, 0x8465},{0xAF0D, 0xB2BD},{0xAF0E, 0x8466}, - {0xAF0F, 0x8467},{0xAF10, 0xB2BE},{0xAF11, 0x8468},{0xAF12, 0x8469},{0xAF13, 0x846A},{0xAF14, 0x846B},{0xAF15, 0x846C},{0xAF16, 0x846D}, - {0xAF17, 0x846E},{0xAF18, 0x846F},{0xAF19, 0x8470},{0xAF1A, 0x8471},{0xAF1B, 0x8472},{0xAF1C, 0x8473},{0xAF1D, 0x8474},{0xAF1E, 0x8475}, - {0xAF1F, 0x8476},{0xAF20, 0x8477},{0xAF21, 0x8478},{0xAF22, 0x8479},{0xAF23, 0x847A},{0xAF24, 0x8481},{0xAF25, 0x8482},{0xAF26, 0x8483}, - {0xAF27, 0x8484},{0xAF28, 0x8485},{0xAF29, 0x8486},{0xAF2A, 0x8487},{0xAF2B, 0x8488},{0xAF2C, 0xB2BF},{0xAF2D, 0xB2C0},{0xAF2E, 0x8489}, - {0xAF2F, 0x848A},{0xAF30, 0xB2C1},{0xAF31, 0x848B},{0xAF32, 0xB2C2},{0xAF33, 0x848C},{0xAF34, 0xB2C3},{0xAF35, 0x848D},{0xAF36, 0x848E}, - {0xAF37, 0x848F},{0xAF38, 0x8490},{0xAF39, 0x8491},{0xAF3A, 0x8492},{0xAF3B, 0x8493},{0xAF3C, 0xB2C4},{0xAF3D, 0xB2C5},{0xAF3E, 0x8494}, - {0xAF3F, 0xB2C6},{0xAF40, 0x8495},{0xAF41, 0xB2C7},{0xAF42, 0xB2C8},{0xAF43, 0xB2C9},{0xAF44, 0x8496},{0xAF45, 0x8497},{0xAF46, 0x8498}, - {0xAF47, 0x8499},{0xAF48, 0xB2CA},{0xAF49, 0xB2CB},{0xAF4A, 0x849A},{0xAF4B, 0x849B},{0xAF4C, 0x849C},{0xAF4D, 0x849D},{0xAF4E, 0x849E}, - {0xAF4F, 0x849F},{0xAF50, 0xB2CC},{0xAF51, 0x84A0},{0xAF52, 0x84A1},{0xAF53, 0x84A2},{0xAF54, 0x84A3},{0xAF55, 0x84A4},{0xAF56, 0x84A5}, - {0xAF57, 0x84A6},{0xAF58, 0x84A7},{0xAF59, 0x84A8},{0xAF5A, 0x84A9},{0xAF5B, 0x84AA},{0xAF5C, 0xB2CD},{0xAF5D, 0xB2CE},{0xAF5E, 0x84AB}, - {0xAF5F, 0x84AC},{0xAF60, 0x84AD},{0xAF61, 0x84AE},{0xAF62, 0x84AF},{0xAF63, 0x84B0},{0xAF64, 0xB2CF},{0xAF65, 0xB2D0},{0xAF66, 0x84B1}, - {0xAF67, 0x84B2},{0xAF68, 0x84B3},{0xAF69, 0x84B4},{0xAF6A, 0x84B5},{0xAF6B, 0x84B6},{0xAF6C, 0x84B7},{0xAF6D, 0x84B8},{0xAF6E, 0x84B9}, - {0xAF6F, 0x84BA},{0xAF70, 0x84BB},{0xAF71, 0x84BC},{0xAF72, 0x84BD},{0xAF73, 0x84BE},{0xAF74, 0x84BF},{0xAF75, 0x84C0},{0xAF76, 0x84C1}, - {0xAF77, 0x84C2},{0xAF78, 0x84C3},{0xAF79, 0xB2D1},{0xAF7A, 0x84C4},{0xAF7B, 0x84C5},{0xAF7C, 0x84C6},{0xAF7D, 0x84C7},{0xAF7E, 0x84C8}, - {0xAF7F, 0x84C9},{0xAF80, 0xB2D2},{0xAF81, 0x84CA},{0xAF82, 0x84CB},{0xAF83, 0x84CC},{0xAF84, 0xB2D3},{0xAF85, 0x84CD},{0xAF86, 0x84CE}, - {0xAF87, 0x84CF},{0xAF88, 0xB2D4},{0xAF89, 0x84D0},{0xAF8A, 0x84D1},{0xAF8B, 0x84D2},{0xAF8C, 0x84D3},{0xAF8D, 0x84D4},{0xAF8E, 0x84D5}, - {0xAF8F, 0x84D6},{0xAF90, 0xB2D5},{0xAF91, 0xB2D6},{0xAF92, 0x84D7},{0xAF93, 0x84D8},{0xAF94, 0x84D9},{0xAF95, 0xB2D7},{0xAF96, 0x84DA}, - {0xAF97, 0x84DB},{0xAF98, 0x84DC},{0xAF99, 0x84DD},{0xAF9A, 0x84DE},{0xAF9B, 0x84DF},{0xAF9C, 0xB2D8},{0xAF9D, 0x84E0},{0xAF9E, 0x84E1}, - {0xAF9F, 0x84E2},{0xAFA0, 0x84E3},{0xAFA1, 0x84E4},{0xAFA2, 0x84E5},{0xAFA3, 0x84E6},{0xAFA4, 0x84E7},{0xAFA5, 0x84E8},{0xAFA6, 0x84E9}, - {0xAFA7, 0x84EA},{0xAFA8, 0x84EB},{0xAFA9, 0x84EC},{0xAFAA, 0x84ED},{0xAFAB, 0x84EE},{0xAFAC, 0x84EF},{0xAFAD, 0x84F0},{0xAFAE, 0x84F1}, - {0xAFAF, 0x84F2},{0xAFB0, 0x84F3},{0xAFB1, 0x84F4},{0xAFB2, 0x84F5},{0xAFB3, 0x84F6},{0xAFB4, 0x84F7},{0xAFB5, 0x84F8},{0xAFB6, 0x84F9}, - {0xAFB7, 0x84FA},{0xAFB8, 0xB2D9},{0xAFB9, 0xB2DA},{0xAFBA, 0x84FB},{0xAFBB, 0x84FC},{0xAFBC, 0xB2DB},{0xAFBD, 0x84FD},{0xAFBE, 0x84FE}, - {0xAFBF, 0x8541},{0xAFC0, 0xB2DC},{0xAFC1, 0x8542},{0xAFC2, 0x8543},{0xAFC3, 0x8544},{0xAFC4, 0x8545},{0xAFC5, 0x8546},{0xAFC6, 0x8547}, - {0xAFC7, 0xB2DD},{0xAFC8, 0xB2DE},{0xAFC9, 0xB2DF},{0xAFCA, 0x8548},{0xAFCB, 0xB2E0},{0xAFCC, 0x8549},{0xAFCD, 0xB2E1},{0xAFCE, 0xB2E2}, - {0xAFCF, 0x854A},{0xAFD0, 0x854B},{0xAFD1, 0x854C},{0xAFD2, 0x854D},{0xAFD3, 0x854E},{0xAFD4, 0xB2E3},{0xAFD5, 0x854F},{0xAFD6, 0x8550}, - {0xAFD7, 0x8551},{0xAFD8, 0x8552},{0xAFD9, 0x8553},{0xAFDA, 0x8554},{0xAFDB, 0x8555},{0xAFDC, 0xB2E4},{0xAFDD, 0x8556},{0xAFDE, 0x8557}, - {0xAFDF, 0x8558},{0xAFE0, 0x8559},{0xAFE1, 0x855A},{0xAFE2, 0x8561},{0xAFE3, 0x8562},{0xAFE4, 0x8563},{0xAFE5, 0x8564},{0xAFE6, 0x8565}, - {0xAFE7, 0x8566},{0xAFE8, 0xB2E5},{0xAFE9, 0xB2E6},{0xAFEA, 0x8567},{0xAFEB, 0x8568},{0xAFEC, 0x8569},{0xAFED, 0x856A},{0xAFEE, 0x856B}, - {0xAFEF, 0x856C},{0xAFF0, 0xB2E7},{0xAFF1, 0xB2E8},{0xAFF2, 0x856D},{0xAFF3, 0x856E},{0xAFF4, 0xB2E9},{0xAFF5, 0x856F},{0xAFF6, 0x8570}, - {0xAFF7, 0x8571},{0xAFF8, 0xB2EA},{0xAFF9, 0x8572},{0xAFFA, 0x8573},{0xAFFB, 0x8574},{0xAFFC, 0x8575},{0xAFFD, 0x8576},{0xAFFE, 0x8577}, - {0xAFFF, 0x8578},{0xB000, 0xB2EB},{0xB001, 0xB2EC},{0xB002, 0x8579},{0xB003, 0x857A},{0xB004, 0xB2ED},{0xB005, 0x8581},{0xB006, 0x8582}, - {0xB007, 0x8583},{0xB008, 0x8584},{0xB009, 0x8585},{0xB00A, 0x8586},{0xB00B, 0x8587},{0xB00C, 0xB2EE},{0xB00D, 0x8588},{0xB00E, 0x8589}, - {0xB00F, 0x858A},{0xB010, 0xB2EF},{0xB011, 0x858B},{0xB012, 0x858C},{0xB013, 0x858D},{0xB014, 0xB2F0},{0xB015, 0x858E},{0xB016, 0x858F}, - {0xB017, 0x8590},{0xB018, 0x8591},{0xB019, 0x8592},{0xB01A, 0x8593},{0xB01B, 0x8594},{0xB01C, 0xB2F1},{0xB01D, 0xB2F2},{0xB01E, 0x8595}, - {0xB01F, 0x8596},{0xB020, 0x8597},{0xB021, 0x8598},{0xB022, 0x8599},{0xB023, 0x859A},{0xB024, 0x859B},{0xB025, 0x859C},{0xB026, 0x859D}, - {0xB027, 0x859E},{0xB028, 0xB2F3},{0xB029, 0x859F},{0xB02A, 0x85A0},{0xB02B, 0x85A1},{0xB02C, 0x85A2},{0xB02D, 0x85A3},{0xB02E, 0x85A4}, - {0xB02F, 0x85A5},{0xB030, 0x85A6},{0xB031, 0x85A7},{0xB032, 0x85A8},{0xB033, 0x85A9},{0xB034, 0x85AA},{0xB035, 0x85AB},{0xB036, 0x85AC}, - {0xB037, 0x85AD},{0xB038, 0x85AE},{0xB039, 0x85AF},{0xB03A, 0x85B0},{0xB03B, 0x85B1},{0xB03C, 0x85B2},{0xB03D, 0x85B3},{0xB03E, 0x85B4}, - {0xB03F, 0x85B5},{0xB040, 0x85B6},{0xB041, 0x85B7},{0xB042, 0x85B8},{0xB043, 0x85B9},{0xB044, 0xB2F4},{0xB045, 0xB2F5},{0xB046, 0x85BA}, - {0xB047, 0x85BB},{0xB048, 0xB2F6},{0xB049, 0x85BC},{0xB04A, 0xB2F7},{0xB04B, 0x85BD},{0xB04C, 0xB2F8},{0xB04D, 0x85BE},{0xB04E, 0xB2F9}, - {0xB04F, 0x85BF},{0xB050, 0x85C0},{0xB051, 0x85C1},{0xB052, 0x85C2},{0xB053, 0xB2FA},{0xB054, 0xB2FB},{0xB055, 0xB2FC},{0xB056, 0x85C3}, - {0xB057, 0xB2FD},{0xB058, 0x85C4},{0xB059, 0xB2FE},{0xB05A, 0x85C5},{0xB05B, 0x85C6},{0xB05C, 0x85C7},{0xB05D, 0xB3A1},{0xB05E, 0x85C8}, - {0xB05F, 0x85C9},{0xB060, 0x85CA},{0xB061, 0x85CB},{0xB062, 0x85CC},{0xB063, 0x85CD},{0xB064, 0x85CE},{0xB065, 0x85CF},{0xB066, 0x85D0}, - {0xB067, 0x85D1},{0xB068, 0x85D2},{0xB069, 0x85D3},{0xB06A, 0x85D4},{0xB06B, 0x85D5},{0xB06C, 0x85D6},{0xB06D, 0x85D7},{0xB06E, 0x85D8}, - {0xB06F, 0x85D9},{0xB070, 0x85DA},{0xB071, 0x85DB},{0xB072, 0x85DC},{0xB073, 0x85DD},{0xB074, 0x85DE},{0xB075, 0x85DF},{0xB076, 0x85E0}, - {0xB077, 0x85E1},{0xB078, 0x85E2},{0xB079, 0x85E3},{0xB07A, 0x85E4},{0xB07B, 0x85E5},{0xB07C, 0xB3A2},{0xB07D, 0xB3A3},{0xB07E, 0x85E6}, - {0xB07F, 0x85E7},{0xB080, 0xB3A4},{0xB081, 0x85E8},{0xB082, 0x85E9},{0xB083, 0x85EA},{0xB084, 0xB3A5},{0xB085, 0x85EB},{0xB086, 0x85EC}, - {0xB087, 0x85ED},{0xB088, 0x85EE},{0xB089, 0x85EF},{0xB08A, 0x85F0},{0xB08B, 0x85F1},{0xB08C, 0xB3A6},{0xB08D, 0xB3A7},{0xB08E, 0x85F2}, - {0xB08F, 0xB3A8},{0xB090, 0x85F3},{0xB091, 0xB3A9},{0xB092, 0x85F4},{0xB093, 0x85F5},{0xB094, 0x85F6},{0xB095, 0x85F7},{0xB096, 0x85F8}, - {0xB097, 0x85F9},{0xB098, 0xB3AA},{0xB099, 0xB3AB},{0xB09A, 0xB3AC},{0xB09B, 0x85FA},{0xB09C, 0xB3AD},{0xB09D, 0x85FB},{0xB09E, 0x85FC}, - {0xB09F, 0xB3AE},{0xB0A0, 0xB3AF},{0xB0A1, 0xB3B0},{0xB0A2, 0xB3B1},{0xB0A3, 0x85FD},{0xB0A4, 0x85FE},{0xB0A5, 0x8641},{0xB0A6, 0x8642}, - {0xB0A7, 0x8643},{0xB0A8, 0xB3B2},{0xB0A9, 0xB3B3},{0xB0AA, 0x8644},{0xB0AB, 0xB3B4},{0xB0AC, 0xB3B5},{0xB0AD, 0xB3B6},{0xB0AE, 0xB3B7}, - {0xB0AF, 0xB3B8},{0xB0B0, 0x8645},{0xB0B1, 0xB3B9},{0xB0B2, 0x8646},{0xB0B3, 0xB3BA},{0xB0B4, 0xB3BB},{0xB0B5, 0xB3BC},{0xB0B6, 0x8647}, - {0xB0B7, 0x8648},{0xB0B8, 0xB3BD},{0xB0B9, 0x8649},{0xB0BA, 0x864A},{0xB0BB, 0x864B},{0xB0BC, 0xB3BE},{0xB0BD, 0x864C},{0xB0BE, 0x864D}, - {0xB0BF, 0x864E},{0xB0C0, 0x864F},{0xB0C1, 0x8650},{0xB0C2, 0x8651},{0xB0C3, 0x8652},{0xB0C4, 0xB3BF},{0xB0C5, 0xB3C0},{0xB0C6, 0x8653}, - {0xB0C7, 0xB3C1},{0xB0C8, 0xB3C2},{0xB0C9, 0xB3C3},{0xB0CA, 0x8654},{0xB0CB, 0x8655},{0xB0CC, 0x8656},{0xB0CD, 0x8657},{0xB0CE, 0x8658}, - {0xB0CF, 0x8659},{0xB0D0, 0xB3C4},{0xB0D1, 0xB3C5},{0xB0D2, 0x865A},{0xB0D3, 0x8661},{0xB0D4, 0xB3C6},{0xB0D5, 0x8662},{0xB0D6, 0x8663}, - {0xB0D7, 0x8664},{0xB0D8, 0xB3C7},{0xB0D9, 0x8665},{0xB0DA, 0x8666},{0xB0DB, 0x8667},{0xB0DC, 0x8668},{0xB0DD, 0x8669},{0xB0DE, 0x866A}, - {0xB0DF, 0x866B},{0xB0E0, 0xB3C8},{0xB0E1, 0x866C},{0xB0E2, 0x866D},{0xB0E3, 0x866E},{0xB0E4, 0x866F},{0xB0E5, 0xB3C9},{0xB0E6, 0x8670}, - {0xB0E7, 0x8671},{0xB0E8, 0x8672},{0xB0E9, 0x8673},{0xB0EA, 0x8674},{0xB0EB, 0x8675},{0xB0EC, 0x8676},{0xB0ED, 0x8677},{0xB0EE, 0x8678}, - {0xB0EF, 0x8679},{0xB0F0, 0x867A},{0xB0F1, 0x8681},{0xB0F2, 0x8682},{0xB0F3, 0x8683},{0xB0F4, 0x8684},{0xB0F5, 0x8685},{0xB0F6, 0x8686}, - {0xB0F7, 0x8687},{0xB0F8, 0x8688},{0xB0F9, 0x8689},{0xB0FA, 0x868A},{0xB0FB, 0x868B},{0xB0FC, 0x868C},{0xB0FD, 0x868D},{0xB0FE, 0x868E}, - {0xB0FF, 0x868F},{0xB100, 0x8690},{0xB101, 0x8691},{0xB102, 0x8692},{0xB103, 0x8693},{0xB104, 0x8694},{0xB105, 0x8695},{0xB106, 0x8696}, - {0xB107, 0x8697},{0xB108, 0xB3CA},{0xB109, 0xB3CB},{0xB10A, 0x8698},{0xB10B, 0xB3CC},{0xB10C, 0xB3CD},{0xB10D, 0x8699},{0xB10E, 0x869A}, - {0xB10F, 0x869B},{0xB110, 0xB3CE},{0xB111, 0x869C},{0xB112, 0xB3CF},{0xB113, 0xB3D0},{0xB114, 0x869D},{0xB115, 0x869E},{0xB116, 0x869F}, - {0xB117, 0x86A0},{0xB118, 0xB3D1},{0xB119, 0xB3D2},{0xB11A, 0x86A1},{0xB11B, 0xB3D3},{0xB11C, 0xB3D4},{0xB11D, 0xB3D5},{0xB11E, 0x86A2}, - {0xB11F, 0x86A3},{0xB120, 0x86A4},{0xB121, 0x86A5},{0xB122, 0x86A6},{0xB123, 0xB3D6},{0xB124, 0xB3D7},{0xB125, 0xB3D8},{0xB126, 0x86A7}, - {0xB127, 0x86A8},{0xB128, 0xB3D9},{0xB129, 0x86A9},{0xB12A, 0x86AA},{0xB12B, 0x86AB},{0xB12C, 0xB3DA},{0xB12D, 0x86AC},{0xB12E, 0x86AD}, - {0xB12F, 0x86AE},{0xB130, 0x86AF},{0xB131, 0x86B0},{0xB132, 0x86B1},{0xB133, 0x86B2},{0xB134, 0xB3DB},{0xB135, 0xB3DC},{0xB136, 0x86B3}, - {0xB137, 0xB3DD},{0xB138, 0xB3DE},{0xB139, 0xB3DF},{0xB13A, 0x86B4},{0xB13B, 0x86B5},{0xB13C, 0x86B6},{0xB13D, 0x86B7},{0xB13E, 0x86B8}, - {0xB13F, 0x86B9},{0xB140, 0xB3E0},{0xB141, 0xB3E1},{0xB142, 0x86BA},{0xB143, 0x86BB},{0xB144, 0xB3E2},{0xB145, 0x86BC},{0xB146, 0x86BD}, - {0xB147, 0x86BE},{0xB148, 0xB3E3},{0xB149, 0x86BF},{0xB14A, 0x86C0},{0xB14B, 0x86C1},{0xB14C, 0x86C2},{0xB14D, 0x86C3},{0xB14E, 0x86C4}, - {0xB14F, 0x86C5},{0xB150, 0xB3E4},{0xB151, 0xB3E5},{0xB152, 0x86C6},{0xB153, 0x86C7},{0xB154, 0xB3E6},{0xB155, 0xB3E7},{0xB156, 0x86C8}, - {0xB157, 0x86C9},{0xB158, 0xB3E8},{0xB159, 0x86CA},{0xB15A, 0x86CB},{0xB15B, 0x86CC},{0xB15C, 0xB3E9},{0xB15D, 0x86CD},{0xB15E, 0x86CE}, - {0xB15F, 0x86CF},{0xB160, 0xB3EA},{0xB161, 0x86D0},{0xB162, 0x86D1},{0xB163, 0x86D2},{0xB164, 0x86D3},{0xB165, 0x86D4},{0xB166, 0x86D5}, - {0xB167, 0x86D6},{0xB168, 0x86D7},{0xB169, 0x86D8},{0xB16A, 0x86D9},{0xB16B, 0x86DA},{0xB16C, 0x86DB},{0xB16D, 0x86DC},{0xB16E, 0x86DD}, - {0xB16F, 0x86DE},{0xB170, 0x86DF},{0xB171, 0x86E0},{0xB172, 0x86E1},{0xB173, 0x86E2},{0xB174, 0x86E3},{0xB175, 0x86E4},{0xB176, 0x86E5}, - {0xB177, 0x86E6},{0xB178, 0xB3EB},{0xB179, 0xB3EC},{0xB17A, 0x86E7},{0xB17B, 0x86E8},{0xB17C, 0xB3ED},{0xB17D, 0x86E9},{0xB17E, 0x86EA}, - {0xB17F, 0x86EB},{0xB180, 0xB3EE},{0xB181, 0x86EC},{0xB182, 0xB3EF},{0xB183, 0x86ED},{0xB184, 0x86EE},{0xB185, 0x86EF},{0xB186, 0x86F0}, - {0xB187, 0x86F1},{0xB188, 0xB3F0},{0xB189, 0xB3F1},{0xB18A, 0x86F2},{0xB18B, 0xB3F2},{0xB18C, 0x86F3},{0xB18D, 0xB3F3},{0xB18E, 0x86F4}, - {0xB18F, 0x86F5},{0xB190, 0x86F6},{0xB191, 0x86F7},{0xB192, 0xB3F4},{0xB193, 0xB3F5},{0xB194, 0xB3F6},{0xB195, 0x86F8},{0xB196, 0x86F9}, - {0xB197, 0x86FA},{0xB198, 0xB3F7},{0xB199, 0x86FB},{0xB19A, 0x86FC},{0xB19B, 0x86FD},{0xB19C, 0xB3F8},{0xB19D, 0x86FE},{0xB19E, 0x8741}, - {0xB19F, 0x8742},{0xB1A0, 0x8743},{0xB1A1, 0x8744},{0xB1A2, 0x8745},{0xB1A3, 0x8746},{0xB1A4, 0x8747},{0xB1A5, 0x8748},{0xB1A6, 0x8749}, - {0xB1A7, 0x874A},{0xB1A8, 0xB3F9},{0xB1A9, 0x874B},{0xB1AA, 0x874C},{0xB1AB, 0x874D},{0xB1AC, 0x874E},{0xB1AD, 0x874F},{0xB1AE, 0x8750}, - {0xB1AF, 0x8751},{0xB1B0, 0x8752},{0xB1B1, 0x8753},{0xB1B2, 0x8754},{0xB1B3, 0x8755},{0xB1B4, 0x8756},{0xB1B5, 0x8757},{0xB1B6, 0x8758}, - {0xB1B7, 0x8759},{0xB1B8, 0x875A},{0xB1B9, 0x8761},{0xB1BA, 0x8762},{0xB1BB, 0x8763},{0xB1BC, 0x8764},{0xB1BD, 0x8765},{0xB1BE, 0x8766}, - {0xB1BF, 0x8767},{0xB1C0, 0x8768},{0xB1C1, 0x8769},{0xB1C2, 0x876A},{0xB1C3, 0x876B},{0xB1C4, 0x876C},{0xB1C5, 0x876D},{0xB1C6, 0x876E}, - {0xB1C7, 0x876F},{0xB1C8, 0x8770},{0xB1C9, 0x8771},{0xB1CA, 0x8772},{0xB1CB, 0x8773},{0xB1CC, 0xB3FA},{0xB1CD, 0x8774},{0xB1CE, 0x8775}, - {0xB1CF, 0x8776},{0xB1D0, 0xB3FB},{0xB1D1, 0x8777},{0xB1D2, 0x8778},{0xB1D3, 0x8779},{0xB1D4, 0xB3FC},{0xB1D5, 0x877A},{0xB1D6, 0x8781}, - {0xB1D7, 0x8782},{0xB1D8, 0x8783},{0xB1D9, 0x8784},{0xB1DA, 0x8785},{0xB1DB, 0x8786},{0xB1DC, 0xB3FD},{0xB1DD, 0xB3FE},{0xB1DE, 0x8787}, - {0xB1DF, 0xB4A1},{0xB1E0, 0x8788},{0xB1E1, 0x8789},{0xB1E2, 0x878A},{0xB1E3, 0x878B},{0xB1E4, 0x878C},{0xB1E5, 0x878D},{0xB1E6, 0x878E}, - {0xB1E7, 0x878F},{0xB1E8, 0xB4A2},{0xB1E9, 0xB4A3},{0xB1EA, 0x8790},{0xB1EB, 0x8791},{0xB1EC, 0xB4A4},{0xB1ED, 0x8792},{0xB1EE, 0x8793}, - {0xB1EF, 0x8794},{0xB1F0, 0xB4A5},{0xB1F1, 0x8795},{0xB1F2, 0x8796},{0xB1F3, 0x8797},{0xB1F4, 0x8798},{0xB1F5, 0x8799},{0xB1F6, 0x879A}, - {0xB1F7, 0x879B},{0xB1F8, 0x879C},{0xB1F9, 0xB4A6},{0xB1FA, 0x879D},{0xB1FB, 0xB4A7},{0xB1FC, 0x879E},{0xB1FD, 0xB4A8},{0xB1FE, 0x879F}, - {0xB1FF, 0x87A0},{0xB200, 0x87A1},{0xB201, 0x87A2},{0xB202, 0x87A3},{0xB203, 0x87A4},{0xB204, 0xB4A9},{0xB205, 0xB4AA},{0xB206, 0x87A5}, - {0xB207, 0x87A6},{0xB208, 0xB4AB},{0xB209, 0x87A7},{0xB20A, 0x87A8},{0xB20B, 0xB4AC},{0xB20C, 0xB4AD},{0xB20D, 0x87A9},{0xB20E, 0x87AA}, - {0xB20F, 0x87AB},{0xB210, 0x87AC},{0xB211, 0x87AD},{0xB212, 0x87AE},{0xB213, 0x87AF},{0xB214, 0xB4AE},{0xB215, 0xB4AF},{0xB216, 0x87B0}, - {0xB217, 0xB4B0},{0xB218, 0x87B1},{0xB219, 0xB4B1},{0xB21A, 0x87B2},{0xB21B, 0x87B3},{0xB21C, 0x87B4},{0xB21D, 0x87B5},{0xB21E, 0x87B6}, - {0xB21F, 0x87B7},{0xB220, 0xB4B2},{0xB221, 0x87B8},{0xB222, 0x87B9},{0xB223, 0x87BA},{0xB224, 0x87BB},{0xB225, 0x87BC},{0xB226, 0x87BD}, - {0xB227, 0x87BE},{0xB228, 0x87BF},{0xB229, 0x87C0},{0xB22A, 0x87C1},{0xB22B, 0x87C2},{0xB22C, 0x87C3},{0xB22D, 0x87C4},{0xB22E, 0x87C5}, - {0xB22F, 0x87C6},{0xB230, 0x87C7},{0xB231, 0x87C8},{0xB232, 0x87C9},{0xB233, 0x87CA},{0xB234, 0xB4B3},{0xB235, 0x87CB},{0xB236, 0x87CC}, - {0xB237, 0x87CD},{0xB238, 0x87CE},{0xB239, 0x87CF},{0xB23A, 0x87D0},{0xB23B, 0x87D1},{0xB23C, 0xB4B4},{0xB23D, 0x87D2},{0xB23E, 0x87D3}, - {0xB23F, 0x87D4},{0xB240, 0x87D5},{0xB241, 0x87D6},{0xB242, 0x87D7},{0xB243, 0x87D8},{0xB244, 0x87D9},{0xB245, 0x87DA},{0xB246, 0x87DB}, - {0xB247, 0x87DC},{0xB248, 0x87DD},{0xB249, 0x87DE},{0xB24A, 0x87DF},{0xB24B, 0x87E0},{0xB24C, 0x87E1},{0xB24D, 0x87E2},{0xB24E, 0x87E3}, - {0xB24F, 0x87E4},{0xB250, 0x87E5},{0xB251, 0x87E6},{0xB252, 0x87E7},{0xB253, 0x87E8},{0xB254, 0x87E9},{0xB255, 0x87EA},{0xB256, 0x87EB}, - {0xB257, 0x87EC},{0xB258, 0xB4B5},{0xB259, 0x87ED},{0xB25A, 0x87EE},{0xB25B, 0x87EF},{0xB25C, 0xB4B6},{0xB25D, 0x87F0},{0xB25E, 0x87F1}, - {0xB25F, 0x87F2},{0xB260, 0xB4B7},{0xB261, 0x87F3},{0xB262, 0x87F4},{0xB263, 0x87F5},{0xB264, 0x87F6},{0xB265, 0x87F7},{0xB266, 0x87F8}, - {0xB267, 0x87F9},{0xB268, 0xB4B8},{0xB269, 0xB4B9},{0xB26A, 0x87FA},{0xB26B, 0x87FB},{0xB26C, 0x87FC},{0xB26D, 0x87FD},{0xB26E, 0x87FE}, - {0xB26F, 0x8841},{0xB270, 0x8842},{0xB271, 0x8843},{0xB272, 0x8844},{0xB273, 0x8845},{0xB274, 0xB4BA},{0xB275, 0xB4BB},{0xB276, 0x8846}, - {0xB277, 0x8847},{0xB278, 0x8848},{0xB279, 0x8849},{0xB27A, 0x884A},{0xB27B, 0x884B},{0xB27C, 0xB4BC},{0xB27D, 0x884C},{0xB27E, 0x884D}, - {0xB27F, 0x884E},{0xB280, 0x884F},{0xB281, 0x8850},{0xB282, 0x8851},{0xB283, 0x8852},{0xB284, 0xB4BD},{0xB285, 0xB4BE},{0xB286, 0x8853}, - {0xB287, 0x8854},{0xB288, 0x8855},{0xB289, 0xB4BF},{0xB28A, 0x8856},{0xB28B, 0x8857},{0xB28C, 0x8858},{0xB28D, 0x8859},{0xB28E, 0x885A}, - {0xB28F, 0x8861},{0xB290, 0xB4C0},{0xB291, 0xB4C1},{0xB292, 0x8862},{0xB293, 0x8863},{0xB294, 0xB4C2},{0xB295, 0x8864},{0xB296, 0x8865}, - {0xB297, 0x8866},{0xB298, 0xB4C3},{0xB299, 0xB4C4},{0xB29A, 0xB4C5},{0xB29B, 0x8867},{0xB29C, 0x8868},{0xB29D, 0x8869},{0xB29E, 0x886A}, - {0xB29F, 0x886B},{0xB2A0, 0xB4C6},{0xB2A1, 0xB4C7},{0xB2A2, 0x886C},{0xB2A3, 0xB4C8},{0xB2A4, 0x886D},{0xB2A5, 0xB4C9},{0xB2A6, 0xB4CA}, - {0xB2A7, 0x886E},{0xB2A8, 0x886F},{0xB2A9, 0x8870},{0xB2AA, 0xB4CB},{0xB2AB, 0x8871},{0xB2AC, 0xB4CC},{0xB2AD, 0x8872},{0xB2AE, 0x8873}, - {0xB2AF, 0x8874},{0xB2B0, 0xB4CD},{0xB2B1, 0x8875},{0xB2B2, 0x8876},{0xB2B3, 0x8877},{0xB2B4, 0xB4CE},{0xB2B5, 0x8878},{0xB2B6, 0x8879}, - {0xB2B7, 0x887A},{0xB2B8, 0x8881},{0xB2B9, 0x8882},{0xB2BA, 0x8883},{0xB2BB, 0x8884},{0xB2BC, 0x8885},{0xB2BD, 0x8886},{0xB2BE, 0x8887}, - {0xB2BF, 0x8888},{0xB2C0, 0x8889},{0xB2C1, 0x888A},{0xB2C2, 0x888B},{0xB2C3, 0x888C},{0xB2C4, 0x888D},{0xB2C5, 0x888E},{0xB2C6, 0x888F}, - {0xB2C7, 0x8890},{0xB2C8, 0xB4CF},{0xB2C9, 0xB4D0},{0xB2CA, 0x8891},{0xB2CB, 0x8892},{0xB2CC, 0xB4D1},{0xB2CD, 0x8893},{0xB2CE, 0x8894}, - {0xB2CF, 0x8895},{0xB2D0, 0xB4D2},{0xB2D1, 0x8896},{0xB2D2, 0xB4D3},{0xB2D3, 0x8897},{0xB2D4, 0x8898},{0xB2D5, 0x8899},{0xB2D6, 0x889A}, - {0xB2D7, 0x889B},{0xB2D8, 0xB4D4},{0xB2D9, 0xB4D5},{0xB2DA, 0x889C},{0xB2DB, 0xB4D6},{0xB2DC, 0x889D},{0xB2DD, 0xB4D7},{0xB2DE, 0x889E}, - {0xB2DF, 0x889F},{0xB2E0, 0x88A0},{0xB2E1, 0x88A1},{0xB2E2, 0xB4D8},{0xB2E3, 0x88A2},{0xB2E4, 0xB4D9},{0xB2E5, 0xB4DA},{0xB2E6, 0xB4DB}, - {0xB2E7, 0x88A3},{0xB2E8, 0xB4DC},{0xB2E9, 0x88A4},{0xB2EA, 0x88A5},{0xB2EB, 0xB4DD},{0xB2EC, 0xB4DE},{0xB2ED, 0xB4DF},{0xB2EE, 0xB4E0}, - {0xB2EF, 0xB4E1},{0xB2F0, 0x88A6},{0xB2F1, 0x88A7},{0xB2F2, 0x88A8},{0xB2F3, 0xB4E2},{0xB2F4, 0xB4E3},{0xB2F5, 0xB4E4},{0xB2F6, 0x88A9}, - {0xB2F7, 0xB4E5},{0xB2F8, 0xB4E6},{0xB2F9, 0xB4E7},{0xB2FA, 0xB4E8},{0xB2FB, 0xB4E9},{0xB2FC, 0x88AA},{0xB2FD, 0x88AB},{0xB2FE, 0x88AC}, - {0xB2FF, 0xB4EA},{0xB300, 0xB4EB},{0xB301, 0xB4EC},{0xB302, 0x88AD},{0xB303, 0x88AE},{0xB304, 0xB4ED},{0xB305, 0x88AF},{0xB306, 0x88B0}, - {0xB307, 0x88B1},{0xB308, 0xB4EE},{0xB309, 0x88B2},{0xB30A, 0x88B3},{0xB30B, 0x88B4},{0xB30C, 0x88B5},{0xB30D, 0x88B6},{0xB30E, 0x88B7}, - {0xB30F, 0x88B8},{0xB310, 0xB4EF},{0xB311, 0xB4F0},{0xB312, 0x88B9},{0xB313, 0xB4F1},{0xB314, 0xB4F2},{0xB315, 0xB4F3},{0xB316, 0x88BA}, - {0xB317, 0x88BB},{0xB318, 0x88BC},{0xB319, 0x88BD},{0xB31A, 0x88BE},{0xB31B, 0x88BF},{0xB31C, 0xB4F4},{0xB31D, 0x88C0},{0xB31E, 0x88C1}, - {0xB31F, 0x88C2},{0xB320, 0x88C3},{0xB321, 0x88C4},{0xB322, 0x88C5},{0xB323, 0x88C6},{0xB324, 0x88C7},{0xB325, 0x88C8},{0xB326, 0x88C9}, - {0xB327, 0x88CA},{0xB328, 0x88CB},{0xB329, 0x88CC},{0xB32A, 0x88CD},{0xB32B, 0x88CE},{0xB32C, 0x88CF},{0xB32D, 0x88D0},{0xB32E, 0x88D1}, - {0xB32F, 0x88D2},{0xB330, 0x88D3},{0xB331, 0x88D4},{0xB332, 0x88D5},{0xB333, 0x88D6},{0xB334, 0x88D7},{0xB335, 0x88D8},{0xB336, 0x88D9}, - {0xB337, 0x88DA},{0xB338, 0x88DB},{0xB339, 0x88DC},{0xB33A, 0x88DD},{0xB33B, 0x88DE},{0xB33C, 0x88DF},{0xB33D, 0x88E0},{0xB33E, 0x88E1}, - {0xB33F, 0x88E2},{0xB340, 0x88E3},{0xB341, 0x88E4},{0xB342, 0x88E5},{0xB343, 0x88E6},{0xB344, 0x88E7},{0xB345, 0x88E8},{0xB346, 0x88E9}, - {0xB347, 0x88EA},{0xB348, 0x88EB},{0xB349, 0x88EC},{0xB34A, 0x88ED},{0xB34B, 0x88EE},{0xB34C, 0x88EF},{0xB34D, 0x88F0},{0xB34E, 0x88F1}, - {0xB34F, 0x88F2},{0xB350, 0x88F3},{0xB351, 0x88F4},{0xB352, 0x88F5},{0xB353, 0x88F6},{0xB354, 0xB4F5},{0xB355, 0xB4F6},{0xB356, 0xB4F7}, - {0xB357, 0x88F7},{0xB358, 0xB4F8},{0xB359, 0x88F8},{0xB35A, 0x88F9},{0xB35B, 0xB4F9},{0xB35C, 0xB4FA},{0xB35D, 0x88FA},{0xB35E, 0xB4FB}, - {0xB35F, 0xB4FC},{0xB360, 0x88FB},{0xB361, 0x88FC},{0xB362, 0x88FD},{0xB363, 0x88FE},{0xB364, 0xB4FD},{0xB365, 0xB4FE},{0xB366, 0x8941}, - {0xB367, 0xB5A1},{0xB368, 0x8942},{0xB369, 0xB5A2},{0xB36A, 0x8943},{0xB36B, 0xB5A3},{0xB36C, 0x8944},{0xB36D, 0x8945},{0xB36E, 0xB5A4}, - {0xB36F, 0x8946},{0xB370, 0xB5A5},{0xB371, 0xB5A6},{0xB372, 0x8947},{0xB373, 0x8948},{0xB374, 0xB5A7},{0xB375, 0x8949},{0xB376, 0x894A}, - {0xB377, 0x894B},{0xB378, 0xB5A8},{0xB379, 0x894C},{0xB37A, 0x894D},{0xB37B, 0x894E},{0xB37C, 0x894F},{0xB37D, 0x8950},{0xB37E, 0x8951}, - {0xB37F, 0x8952},{0xB380, 0xB5A9},{0xB381, 0xB5AA},{0xB382, 0x8953},{0xB383, 0xB5AB},{0xB384, 0xB5AC},{0xB385, 0xB5AD},{0xB386, 0x8954}, - {0xB387, 0x8955},{0xB388, 0x8956},{0xB389, 0x8957},{0xB38A, 0x8958},{0xB38B, 0x8959},{0xB38C, 0xB5AE},{0xB38D, 0x895A},{0xB38E, 0x8961}, - {0xB38F, 0x8962},{0xB390, 0xB5AF},{0xB391, 0x8963},{0xB392, 0x8964},{0xB393, 0x8965},{0xB394, 0xB5B0},{0xB395, 0x8966},{0xB396, 0x8967}, - {0xB397, 0x8968},{0xB398, 0x8969},{0xB399, 0x896A},{0xB39A, 0x896B},{0xB39B, 0x896C},{0xB39C, 0x896D},{0xB39D, 0x896E},{0xB39E, 0x896F}, - {0xB39F, 0x8970},{0xB3A0, 0xB5B1},{0xB3A1, 0xB5B2},{0xB3A2, 0x8971},{0xB3A3, 0x8972},{0xB3A4, 0x8973},{0xB3A5, 0x8974},{0xB3A6, 0x8975}, - {0xB3A7, 0x8976},{0xB3A8, 0xB5B3},{0xB3A9, 0x8977},{0xB3AA, 0x8978},{0xB3AB, 0x8979},{0xB3AC, 0xB5B4},{0xB3AD, 0x897A},{0xB3AE, 0x8981}, - {0xB3AF, 0x8982},{0xB3B0, 0x8983},{0xB3B1, 0x8984},{0xB3B2, 0x8985},{0xB3B3, 0x8986},{0xB3B4, 0x8987},{0xB3B5, 0x8988},{0xB3B6, 0x8989}, - {0xB3B7, 0x898A},{0xB3B8, 0x898B},{0xB3B9, 0x898C},{0xB3BA, 0x898D},{0xB3BB, 0x898E},{0xB3BC, 0x898F},{0xB3BD, 0x8990},{0xB3BE, 0x8991}, - {0xB3BF, 0x8992},{0xB3C0, 0x8993},{0xB3C1, 0x8994},{0xB3C2, 0x8995},{0xB3C3, 0x8996},{0xB3C4, 0xB5B5},{0xB3C5, 0xB5B6},{0xB3C6, 0x8997}, - {0xB3C7, 0x8998},{0xB3C8, 0xB5B7},{0xB3C9, 0x8999},{0xB3CA, 0x899A},{0xB3CB, 0xB5B8},{0xB3CC, 0xB5B9},{0xB3CD, 0x899B},{0xB3CE, 0xB5BA}, - {0xB3CF, 0x899C},{0xB3D0, 0xB5BB},{0xB3D1, 0x899D},{0xB3D2, 0x899E},{0xB3D3, 0x899F},{0xB3D4, 0xB5BC},{0xB3D5, 0xB5BD},{0xB3D6, 0x89A0}, - {0xB3D7, 0xB5BE},{0xB3D8, 0x89A1},{0xB3D9, 0xB5BF},{0xB3DA, 0x89A2},{0xB3DB, 0xB5C0},{0xB3DC, 0x89A3},{0xB3DD, 0xB5C1},{0xB3DE, 0x89A4}, - {0xB3DF, 0x89A5},{0xB3E0, 0xB5C2},{0xB3E1, 0x89A6},{0xB3E2, 0x89A7},{0xB3E3, 0x89A8},{0xB3E4, 0xB5C3},{0xB3E5, 0x89A9},{0xB3E6, 0x89AA}, - {0xB3E7, 0x89AB},{0xB3E8, 0xB5C4},{0xB3E9, 0x89AC},{0xB3EA, 0x89AD},{0xB3EB, 0x89AE},{0xB3EC, 0x89AF},{0xB3ED, 0x89B0},{0xB3EE, 0x89B1}, - {0xB3EF, 0x89B2},{0xB3F0, 0x89B3},{0xB3F1, 0x89B4},{0xB3F2, 0x89B5},{0xB3F3, 0x89B6},{0xB3F4, 0x89B7},{0xB3F5, 0x89B8},{0xB3F6, 0x89B9}, - {0xB3F7, 0x89BA},{0xB3F8, 0x89BB},{0xB3F9, 0x89BC},{0xB3FA, 0x89BD},{0xB3FB, 0x89BE},{0xB3FC, 0xB5C5},{0xB3FD, 0x89BF},{0xB3FE, 0x89C0}, - {0xB3FF, 0x89C1},{0xB400, 0x89C2},{0xB401, 0x89C3},{0xB402, 0x89C4},{0xB403, 0x89C5},{0xB404, 0x89C6},{0xB405, 0x89C7},{0xB406, 0x89C8}, - {0xB407, 0x89C9},{0xB408, 0x89CA},{0xB409, 0x89CB},{0xB40A, 0x89CC},{0xB40B, 0x89CD},{0xB40C, 0x89CE},{0xB40D, 0x89CF},{0xB40E, 0x89D0}, - {0xB40F, 0x89D1},{0xB410, 0xB5C6},{0xB411, 0x89D2},{0xB412, 0x89D3},{0xB413, 0x89D4},{0xB414, 0x89D5},{0xB415, 0x89D6},{0xB416, 0x89D7}, - {0xB417, 0x89D8},{0xB418, 0xB5C7},{0xB419, 0x89D9},{0xB41A, 0x89DA},{0xB41B, 0x89DB},{0xB41C, 0xB5C8},{0xB41D, 0x89DC},{0xB41E, 0x89DD}, - {0xB41F, 0x89DE},{0xB420, 0xB5C9},{0xB421, 0x89DF},{0xB422, 0x89E0},{0xB423, 0x89E1},{0xB424, 0x89E2},{0xB425, 0x89E3},{0xB426, 0x89E4}, - {0xB427, 0x89E5},{0xB428, 0xB5CA},{0xB429, 0xB5CB},{0xB42A, 0x89E6},{0xB42B, 0xB5CC},{0xB42C, 0x89E7},{0xB42D, 0x89E8},{0xB42E, 0x89E9}, - {0xB42F, 0x89EA},{0xB430, 0x89EB},{0xB431, 0x89EC},{0xB432, 0x89ED},{0xB433, 0x89EE},{0xB434, 0xB5CD},{0xB435, 0x89EF},{0xB436, 0x89F0}, - {0xB437, 0x89F1},{0xB438, 0x89F2},{0xB439, 0x89F3},{0xB43A, 0x89F4},{0xB43B, 0x89F5},{0xB43C, 0x89F6},{0xB43D, 0x89F7},{0xB43E, 0x89F8}, - {0xB43F, 0x89F9},{0xB440, 0x89FA},{0xB441, 0x89FB},{0xB442, 0x89FC},{0xB443, 0x89FD},{0xB444, 0x89FE},{0xB445, 0x8A41},{0xB446, 0x8A42}, - {0xB447, 0x8A43},{0xB448, 0x8A44},{0xB449, 0x8A45},{0xB44A, 0x8A46},{0xB44B, 0x8A47},{0xB44C, 0x8A48},{0xB44D, 0x8A49},{0xB44E, 0x8A4A}, - {0xB44F, 0x8A4B},{0xB450, 0xB5CE},{0xB451, 0xB5CF},{0xB452, 0x8A4C},{0xB453, 0x8A4D},{0xB454, 0xB5D0},{0xB455, 0x8A4E},{0xB456, 0x8A4F}, - {0xB457, 0x8A50},{0xB458, 0xB5D1},{0xB459, 0x8A51},{0xB45A, 0x8A52},{0xB45B, 0x8A53},{0xB45C, 0x8A54},{0xB45D, 0x8A55},{0xB45E, 0x8A56}, - {0xB45F, 0x8A57},{0xB460, 0xB5D2},{0xB461, 0xB5D3},{0xB462, 0x8A58},{0xB463, 0xB5D4},{0xB464, 0x8A59},{0xB465, 0xB5D5},{0xB466, 0x8A5A}, - {0xB467, 0x8A61},{0xB468, 0x8A62},{0xB469, 0x8A63},{0xB46A, 0x8A64},{0xB46B, 0x8A65},{0xB46C, 0xB5D6},{0xB46D, 0x8A66},{0xB46E, 0x8A67}, - {0xB46F, 0x8A68},{0xB470, 0x8A69},{0xB471, 0x8A6A},{0xB472, 0x8A6B},{0xB473, 0x8A6C},{0xB474, 0x8A6D},{0xB475, 0x8A6E},{0xB476, 0x8A6F}, - {0xB477, 0x8A70},{0xB478, 0x8A71},{0xB479, 0x8A72},{0xB47A, 0x8A73},{0xB47B, 0x8A74},{0xB47C, 0x8A75},{0xB47D, 0x8A76},{0xB47E, 0x8A77}, - {0xB47F, 0x8A78},{0xB480, 0xB5D7},{0xB481, 0x8A79},{0xB482, 0x8A7A},{0xB483, 0x8A81},{0xB484, 0x8A82},{0xB485, 0x8A83},{0xB486, 0x8A84}, - {0xB487, 0x8A85},{0xB488, 0xB5D8},{0xB489, 0x8A86},{0xB48A, 0x8A87},{0xB48B, 0x8A88},{0xB48C, 0x8A89},{0xB48D, 0x8A8A},{0xB48E, 0x8A8B}, - {0xB48F, 0x8A8C},{0xB490, 0x8A8D},{0xB491, 0x8A8E},{0xB492, 0x8A8F},{0xB493, 0x8A90},{0xB494, 0x8A91},{0xB495, 0x8A92},{0xB496, 0x8A93}, - {0xB497, 0x8A94},{0xB498, 0x8A95},{0xB499, 0x8A96},{0xB49A, 0x8A97},{0xB49B, 0x8A98},{0xB49C, 0x8A99},{0xB49D, 0xB5D9},{0xB49E, 0x8A9A}, - {0xB49F, 0x8A9B},{0xB4A0, 0x8A9C},{0xB4A1, 0x8A9D},{0xB4A2, 0x8A9E},{0xB4A3, 0x8A9F},{0xB4A4, 0xB5DA},{0xB4A5, 0x8AA0},{0xB4A6, 0x8AA1}, - {0xB4A7, 0x8AA2},{0xB4A8, 0xB5DB},{0xB4A9, 0x8AA3},{0xB4AA, 0x8AA4},{0xB4AB, 0x8AA5},{0xB4AC, 0xB5DC},{0xB4AD, 0x8AA6},{0xB4AE, 0x8AA7}, - {0xB4AF, 0x8AA8},{0xB4B0, 0x8AA9},{0xB4B1, 0x8AAA},{0xB4B2, 0x8AAB},{0xB4B3, 0x8AAC},{0xB4B4, 0x8AAD},{0xB4B5, 0xB5DD},{0xB4B6, 0x8AAE}, - {0xB4B7, 0xB5DE},{0xB4B8, 0x8AAF},{0xB4B9, 0xB5DF},{0xB4BA, 0x8AB0},{0xB4BB, 0x8AB1},{0xB4BC, 0x8AB2},{0xB4BD, 0x8AB3},{0xB4BE, 0x8AB4}, - {0xB4BF, 0x8AB5},{0xB4C0, 0xB5E0},{0xB4C1, 0x8AB6},{0xB4C2, 0x8AB7},{0xB4C3, 0x8AB8},{0xB4C4, 0xB5E1},{0xB4C5, 0x8AB9},{0xB4C6, 0x8ABA}, - {0xB4C7, 0x8ABB},{0xB4C8, 0xB5E2},{0xB4C9, 0x8ABC},{0xB4CA, 0x8ABD},{0xB4CB, 0x8ABE},{0xB4CC, 0x8ABF},{0xB4CD, 0x8AC0},{0xB4CE, 0x8AC1}, - {0xB4CF, 0x8AC2},{0xB4D0, 0xB5E3},{0xB4D1, 0x8AC3},{0xB4D2, 0x8AC4},{0xB4D3, 0x8AC5},{0xB4D4, 0x8AC6},{0xB4D5, 0xB5E4},{0xB4D6, 0x8AC7}, - {0xB4D7, 0x8AC8},{0xB4D8, 0x8AC9},{0xB4D9, 0x8ACA},{0xB4DA, 0x8ACB},{0xB4DB, 0x8ACC},{0xB4DC, 0xB5E5},{0xB4DD, 0xB5E6},{0xB4DE, 0x8ACD}, - {0xB4DF, 0x8ACE},{0xB4E0, 0xB5E7},{0xB4E1, 0x8ACF},{0xB4E2, 0x8AD0},{0xB4E3, 0xB5E8},{0xB4E4, 0xB5E9},{0xB4E5, 0x8AD1},{0xB4E6, 0xB5EA}, - {0xB4E7, 0x8AD2},{0xB4E8, 0x8AD3},{0xB4E9, 0x8AD4},{0xB4EA, 0x8AD5},{0xB4EB, 0x8AD6},{0xB4EC, 0xB5EB},{0xB4ED, 0xB5EC},{0xB4EE, 0x8AD7}, - {0xB4EF, 0xB5ED},{0xB4F0, 0x8AD8},{0xB4F1, 0xB5EE},{0xB4F2, 0x8AD9},{0xB4F3, 0x8ADA},{0xB4F4, 0x8ADB},{0xB4F5, 0x8ADC},{0xB4F6, 0x8ADD}, - {0xB4F7, 0x8ADE},{0xB4F8, 0xB5EF},{0xB4F9, 0x8ADF},{0xB4FA, 0x8AE0},{0xB4FB, 0x8AE1},{0xB4FC, 0x8AE2},{0xB4FD, 0x8AE3},{0xB4FE, 0x8AE4}, - {0xB4FF, 0x8AE5},{0xB500, 0x8AE6},{0xB501, 0x8AE7},{0xB502, 0x8AE8},{0xB503, 0x8AE9},{0xB504, 0x8AEA},{0xB505, 0x8AEB},{0xB506, 0x8AEC}, - {0xB507, 0x8AED},{0xB508, 0x8AEE},{0xB509, 0x8AEF},{0xB50A, 0x8AF0},{0xB50B, 0x8AF1},{0xB50C, 0x8AF2},{0xB50D, 0x8AF3},{0xB50E, 0x8AF4}, - {0xB50F, 0x8AF5},{0xB510, 0x8AF6},{0xB511, 0x8AF7},{0xB512, 0x8AF8},{0xB513, 0x8AF9},{0xB514, 0xB5F0},{0xB515, 0xB5F1},{0xB516, 0x8AFA}, - {0xB517, 0x8AFB},{0xB518, 0xB5F2},{0xB519, 0x8AFC},{0xB51A, 0x8AFD},{0xB51B, 0xB5F3},{0xB51C, 0xB5F4},{0xB51D, 0x8AFE},{0xB51E, 0x8B41}, - {0xB51F, 0x8B42},{0xB520, 0x8B43},{0xB521, 0x8B44},{0xB522, 0x8B45},{0xB523, 0x8B46},{0xB524, 0xB5F5},{0xB525, 0xB5F6},{0xB526, 0x8B47}, - {0xB527, 0xB5F7},{0xB528, 0xB5F8},{0xB529, 0xB5F9},{0xB52A, 0xB5FA},{0xB52B, 0x8B48},{0xB52C, 0x8B49},{0xB52D, 0x8B4A},{0xB52E, 0x8B4B}, - {0xB52F, 0x8B4C},{0xB530, 0xB5FB},{0xB531, 0xB5FC},{0xB532, 0x8B4D},{0xB533, 0x8B4E},{0xB534, 0xB5FD},{0xB535, 0x8B4F},{0xB536, 0x8B50}, - {0xB537, 0x8B51},{0xB538, 0xB5FE},{0xB539, 0x8B52},{0xB53A, 0x8B53},{0xB53B, 0x8B54},{0xB53C, 0x8B55},{0xB53D, 0x8B56},{0xB53E, 0x8B57}, - {0xB53F, 0x8B58},{0xB540, 0xB6A1},{0xB541, 0xB6A2},{0xB542, 0x8B59},{0xB543, 0xB6A3},{0xB544, 0xB6A4},{0xB545, 0xB6A5},{0xB546, 0x8B5A}, - {0xB547, 0x8B61},{0xB548, 0x8B62},{0xB549, 0x8B63},{0xB54A, 0x8B64},{0xB54B, 0xB6A6},{0xB54C, 0xB6A7},{0xB54D, 0xB6A8},{0xB54E, 0x8B65}, - {0xB54F, 0x8B66},{0xB550, 0xB6A9},{0xB551, 0x8B67},{0xB552, 0x8B68},{0xB553, 0x8B69},{0xB554, 0xB6AA},{0xB555, 0x8B6A},{0xB556, 0x8B6B}, - {0xB557, 0x8B6C},{0xB558, 0x8B6D},{0xB559, 0x8B6E},{0xB55A, 0x8B6F},{0xB55B, 0x8B70},{0xB55C, 0xB6AB},{0xB55D, 0xB6AC},{0xB55E, 0x8B71}, - {0xB55F, 0xB6AD},{0xB560, 0xB6AE},{0xB561, 0xB6AF},{0xB562, 0x8B72},{0xB563, 0x8B73},{0xB564, 0x8B74},{0xB565, 0x8B75},{0xB566, 0x8B76}, - {0xB567, 0x8B77},{0xB568, 0x8B78},{0xB569, 0x8B79},{0xB56A, 0x8B7A},{0xB56B, 0x8B81},{0xB56C, 0x8B82},{0xB56D, 0x8B83},{0xB56E, 0x8B84}, - {0xB56F, 0x8B85},{0xB570, 0x8B86},{0xB571, 0x8B87},{0xB572, 0x8B88},{0xB573, 0x8B89},{0xB574, 0x8B8A},{0xB575, 0x8B8B},{0xB576, 0x8B8C}, - {0xB577, 0x8B8D},{0xB578, 0x8B8E},{0xB579, 0x8B8F},{0xB57A, 0x8B90},{0xB57B, 0x8B91},{0xB57C, 0x8B92},{0xB57D, 0x8B93},{0xB57E, 0x8B94}, - {0xB57F, 0x8B95},{0xB580, 0x8B96},{0xB581, 0x8B97},{0xB582, 0x8B98},{0xB583, 0x8B99},{0xB584, 0x8B9A},{0xB585, 0x8B9B},{0xB586, 0x8B9C}, - {0xB587, 0x8B9D},{0xB588, 0x8B9E},{0xB589, 0x8B9F},{0xB58A, 0x8BA0},{0xB58B, 0x8BA1},{0xB58C, 0x8BA2},{0xB58D, 0x8BA3},{0xB58E, 0x8BA4}, - {0xB58F, 0x8BA5},{0xB590, 0x8BA6},{0xB591, 0x8BA7},{0xB592, 0x8BA8},{0xB593, 0x8BA9},{0xB594, 0x8BAA},{0xB595, 0x8BAB},{0xB596, 0x8BAC}, - {0xB597, 0x8BAD},{0xB598, 0x8BAE},{0xB599, 0x8BAF},{0xB59A, 0x8BB0},{0xB59B, 0x8BB1},{0xB59C, 0x8BB2},{0xB59D, 0x8BB3},{0xB59E, 0x8BB4}, - {0xB59F, 0x8BB5},{0xB5A0, 0xB6B0},{0xB5A1, 0xB6B1},{0xB5A2, 0x8BB6},{0xB5A3, 0x8BB7},{0xB5A4, 0xB6B2},{0xB5A5, 0x8BB8},{0xB5A6, 0x8BB9}, - {0xB5A7, 0x8BBA},{0xB5A8, 0xB6B3},{0xB5A9, 0x8BBB},{0xB5AA, 0xB6B4},{0xB5AB, 0xB6B5},{0xB5AC, 0x8BBC},{0xB5AD, 0x8BBD},{0xB5AE, 0x8BBE}, - {0xB5AF, 0x8BBF},{0xB5B0, 0xB6B6},{0xB5B1, 0xB6B7},{0xB5B2, 0x8BC0},{0xB5B3, 0xB6B8},{0xB5B4, 0xB6B9},{0xB5B5, 0xB6BA},{0xB5B6, 0x8BC1}, - {0xB5B7, 0x8BC2},{0xB5B8, 0x8BC3},{0xB5B9, 0x8BC4},{0xB5BA, 0x8BC5},{0xB5BB, 0xB6BB},{0xB5BC, 0xB6BC},{0xB5BD, 0xB6BD},{0xB5BE, 0x8BC6}, - {0xB5BF, 0x8BC7},{0xB5C0, 0xB6BE},{0xB5C1, 0x8BC8},{0xB5C2, 0x8BC9},{0xB5C3, 0x8BCA},{0xB5C4, 0xB6BF},{0xB5C5, 0x8BCB},{0xB5C6, 0x8BCC}, - {0xB5C7, 0x8BCD},{0xB5C8, 0x8BCE},{0xB5C9, 0x8BCF},{0xB5CA, 0x8BD0},{0xB5CB, 0x8BD1},{0xB5CC, 0xB6C0},{0xB5CD, 0xB6C1},{0xB5CE, 0x8BD2}, - {0xB5CF, 0xB6C2},{0xB5D0, 0xB6C3},{0xB5D1, 0xB6C4},{0xB5D2, 0x8BD3},{0xB5D3, 0x8BD4},{0xB5D4, 0x8BD5},{0xB5D5, 0x8BD6},{0xB5D6, 0x8BD7}, - {0xB5D7, 0x8BD8},{0xB5D8, 0xB6C5},{0xB5D9, 0x8BD9},{0xB5DA, 0x8BDA},{0xB5DB, 0x8BDB},{0xB5DC, 0x8BDC},{0xB5DD, 0x8BDD},{0xB5DE, 0x8BDE}, - {0xB5DF, 0x8BDF},{0xB5E0, 0x8BE0},{0xB5E1, 0x8BE1},{0xB5E2, 0x8BE2},{0xB5E3, 0x8BE3},{0xB5E4, 0x8BE4},{0xB5E5, 0x8BE5},{0xB5E6, 0x8BE6}, - {0xB5E7, 0x8BE7},{0xB5E8, 0x8BE8},{0xB5E9, 0x8BE9},{0xB5EA, 0x8BEA},{0xB5EB, 0x8BEB},{0xB5EC, 0xB6C6},{0xB5ED, 0x8BEC},{0xB5EE, 0x8BED}, - {0xB5EF, 0x8BEE},{0xB5F0, 0x8BEF},{0xB5F1, 0x8BF0},{0xB5F2, 0x8BF1},{0xB5F3, 0x8BF2},{0xB5F4, 0x8BF3},{0xB5F5, 0x8BF4},{0xB5F6, 0x8BF5}, - {0xB5F7, 0x8BF6},{0xB5F8, 0x8BF7},{0xB5F9, 0x8BF8},{0xB5FA, 0x8BF9},{0xB5FB, 0x8BFA},{0xB5FC, 0x8BFB},{0xB5FD, 0x8BFC},{0xB5FE, 0x8BFD}, - {0xB5FF, 0x8BFE},{0xB600, 0x8C41},{0xB601, 0x8C42},{0xB602, 0x8C43},{0xB603, 0x8C44},{0xB604, 0x8C45},{0xB605, 0x8C46},{0xB606, 0x8C47}, - {0xB607, 0x8C48},{0xB608, 0x8C49},{0xB609, 0x8C4A},{0xB60A, 0x8C4B},{0xB60B, 0x8C4C},{0xB60C, 0x8C4D},{0xB60D, 0x8C4E},{0xB60E, 0x8C4F}, - {0xB60F, 0x8C50},{0xB610, 0xB6C7},{0xB611, 0xB6C8},{0xB612, 0x8C51},{0xB613, 0x8C52},{0xB614, 0xB6C9},{0xB615, 0x8C53},{0xB616, 0x8C54}, - {0xB617, 0x8C55},{0xB618, 0xB6CA},{0xB619, 0x8C56},{0xB61A, 0x8C57},{0xB61B, 0x8C58},{0xB61C, 0x8C59},{0xB61D, 0x8C5A},{0xB61E, 0x8C61}, - {0xB61F, 0x8C62},{0xB620, 0x8C63},{0xB621, 0x8C64},{0xB622, 0x8C65},{0xB623, 0x8C66},{0xB624, 0x8C67},{0xB625, 0xB6CB},{0xB626, 0x8C68}, - {0xB627, 0x8C69},{0xB628, 0x8C6A},{0xB629, 0x8C6B},{0xB62A, 0x8C6C},{0xB62B, 0x8C6D},{0xB62C, 0xB6CC},{0xB62D, 0x8C6E},{0xB62E, 0x8C6F}, - {0xB62F, 0x8C70},{0xB630, 0x8C71},{0xB631, 0x8C72},{0xB632, 0x8C73},{0xB633, 0x8C74},{0xB634, 0xB6CD},{0xB635, 0x8C75},{0xB636, 0x8C76}, - {0xB637, 0x8C77},{0xB638, 0x8C78},{0xB639, 0x8C79},{0xB63A, 0x8C7A},{0xB63B, 0x8C81},{0xB63C, 0x8C82},{0xB63D, 0x8C83},{0xB63E, 0x8C84}, - {0xB63F, 0x8C85},{0xB640, 0x8C86},{0xB641, 0x8C87},{0xB642, 0x8C88},{0xB643, 0x8C89},{0xB644, 0x8C8A},{0xB645, 0x8C8B},{0xB646, 0x8C8C}, - {0xB647, 0x8C8D},{0xB648, 0xB6CE},{0xB649, 0x8C8E},{0xB64A, 0x8C8F},{0xB64B, 0x8C90},{0xB64C, 0x8C91},{0xB64D, 0x8C92},{0xB64E, 0x8C93}, - {0xB64F, 0x8C94},{0xB650, 0x8C95},{0xB651, 0x8C96},{0xB652, 0x8C97},{0xB653, 0x8C98},{0xB654, 0x8C99},{0xB655, 0x8C9A},{0xB656, 0x8C9B}, - {0xB657, 0x8C9C},{0xB658, 0x8C9D},{0xB659, 0x8C9E},{0xB65A, 0x8C9F},{0xB65B, 0x8CA0},{0xB65C, 0x8CA1},{0xB65D, 0x8CA2},{0xB65E, 0x8CA3}, - {0xB65F, 0x8CA4},{0xB660, 0x8CA5},{0xB661, 0x8CA6},{0xB662, 0x8CA7},{0xB663, 0x8CA8},{0xB664, 0xB6CF},{0xB665, 0x8CA9},{0xB666, 0x8CAA}, - {0xB667, 0x8CAB},{0xB668, 0xB6D0},{0xB669, 0x8CAC},{0xB66A, 0x8CAD},{0xB66B, 0x8CAE},{0xB66C, 0x8CAF},{0xB66D, 0x8CB0},{0xB66E, 0x8CB1}, - {0xB66F, 0x8CB2},{0xB670, 0x8CB3},{0xB671, 0x8CB4},{0xB672, 0x8CB5},{0xB673, 0x8CB6},{0xB674, 0x8CB7},{0xB675, 0x8CB8},{0xB676, 0x8CB9}, - {0xB677, 0x8CBA},{0xB678, 0x8CBB},{0xB679, 0x8CBC},{0xB67A, 0x8CBD},{0xB67B, 0x8CBE},{0xB67C, 0x8CBF},{0xB67D, 0x8CC0},{0xB67E, 0x8CC1}, - {0xB67F, 0x8CC2},{0xB680, 0x8CC3},{0xB681, 0x8CC4},{0xB682, 0x8CC5},{0xB683, 0x8CC6},{0xB684, 0x8CC7},{0xB685, 0x8CC8},{0xB686, 0x8CC9}, - {0xB687, 0x8CCA},{0xB688, 0x8CCB},{0xB689, 0x8CCC},{0xB68A, 0x8CCD},{0xB68B, 0x8CCE},{0xB68C, 0x8CCF},{0xB68D, 0x8CD0},{0xB68E, 0x8CD1}, - {0xB68F, 0x8CD2},{0xB690, 0x8CD3},{0xB691, 0x8CD4},{0xB692, 0x8CD5},{0xB693, 0x8CD6},{0xB694, 0x8CD7},{0xB695, 0x8CD8},{0xB696, 0x8CD9}, - {0xB697, 0x8CDA},{0xB698, 0x8CDB},{0xB699, 0x8CDC},{0xB69A, 0x8CDD},{0xB69B, 0x8CDE},{0xB69C, 0xB6D1},{0xB69D, 0xB6D2},{0xB69E, 0x8CDF}, - {0xB69F, 0x8CE0},{0xB6A0, 0xB6D3},{0xB6A1, 0x8CE1},{0xB6A2, 0x8CE2},{0xB6A3, 0x8CE3},{0xB6A4, 0xB6D4},{0xB6A5, 0x8CE4},{0xB6A6, 0x8CE5}, - {0xB6A7, 0x8CE6},{0xB6A8, 0x8CE7},{0xB6A9, 0x8CE8},{0xB6AA, 0x8CE9},{0xB6AB, 0xB6D5},{0xB6AC, 0xB6D6},{0xB6AD, 0x8CEA},{0xB6AE, 0x8CEB}, - {0xB6AF, 0x8CEC},{0xB6B0, 0x8CED},{0xB6B1, 0xB6D7},{0xB6B2, 0x8CEE},{0xB6B3, 0x8CEF},{0xB6B4, 0x8CF0},{0xB6B5, 0x8CF1},{0xB6B6, 0x8CF2}, - {0xB6B7, 0x8CF3},{0xB6B8, 0x8CF4},{0xB6B9, 0x8CF5},{0xB6BA, 0x8CF6},{0xB6BB, 0x8CF7},{0xB6BC, 0x8CF8},{0xB6BD, 0x8CF9},{0xB6BE, 0x8CFA}, - {0xB6BF, 0x8CFB},{0xB6C0, 0x8CFC},{0xB6C1, 0x8CFD},{0xB6C2, 0x8CFE},{0xB6C3, 0x8D41},{0xB6C4, 0x8D42},{0xB6C5, 0x8D43},{0xB6C6, 0x8D44}, - {0xB6C7, 0x8D45},{0xB6C8, 0x8D46},{0xB6C9, 0x8D47},{0xB6CA, 0x8D48},{0xB6CB, 0x8D49},{0xB6CC, 0x8D4A},{0xB6CD, 0x8D4B},{0xB6CE, 0x8D4C}, - {0xB6CF, 0x8D4D},{0xB6D0, 0x8D4E},{0xB6D1, 0x8D4F},{0xB6D2, 0x8D50},{0xB6D3, 0x8D51},{0xB6D4, 0xB6D8},{0xB6D5, 0x8D52},{0xB6D6, 0x8D53}, - {0xB6D7, 0x8D54},{0xB6D8, 0x8D55},{0xB6D9, 0x8D56},{0xB6DA, 0x8D57},{0xB6DB, 0x8D58},{0xB6DC, 0x8D59},{0xB6DD, 0x8D5A},{0xB6DE, 0x8D61}, - {0xB6DF, 0x8D62},{0xB6E0, 0x8D63},{0xB6E1, 0x8D64},{0xB6E2, 0x8D65},{0xB6E3, 0x8D66},{0xB6E4, 0x8D67},{0xB6E5, 0x8D68},{0xB6E6, 0x8D69}, - {0xB6E7, 0x8D6A},{0xB6E8, 0x8D6B},{0xB6E9, 0x8D6C},{0xB6EA, 0x8D6D},{0xB6EB, 0x8D6E},{0xB6EC, 0x8D6F},{0xB6ED, 0x8D70},{0xB6EE, 0x8D71}, - {0xB6EF, 0x8D72},{0xB6F0, 0xB6D9},{0xB6F1, 0x8D73},{0xB6F2, 0x8D74},{0xB6F3, 0x8D75},{0xB6F4, 0xB6DA},{0xB6F5, 0x8D76},{0xB6F6, 0x8D77}, - {0xB6F7, 0x8D78},{0xB6F8, 0xB6DB},{0xB6F9, 0x8D79},{0xB6FA, 0x8D7A},{0xB6FB, 0x8D81},{0xB6FC, 0x8D82},{0xB6FD, 0x8D83},{0xB6FE, 0x8D84}, - {0xB6FF, 0x8D85},{0xB700, 0xB6DC},{0xB701, 0xB6DD},{0xB702, 0x8D86},{0xB703, 0x8D87},{0xB704, 0x8D88},{0xB705, 0xB6DE},{0xB706, 0x8D89}, - {0xB707, 0x8D8A},{0xB708, 0x8D8B},{0xB709, 0x8D8C},{0xB70A, 0x8D8D},{0xB70B, 0x8D8E},{0xB70C, 0x8D8F},{0xB70D, 0x8D90},{0xB70E, 0x8D91}, - {0xB70F, 0x8D92},{0xB710, 0x8D93},{0xB711, 0x8D94},{0xB712, 0x8D95},{0xB713, 0x8D96},{0xB714, 0x8D97},{0xB715, 0x8D98},{0xB716, 0x8D99}, - {0xB717, 0x8D9A},{0xB718, 0x8D9B},{0xB719, 0x8D9C},{0xB71A, 0x8D9D},{0xB71B, 0x8D9E},{0xB71C, 0x8D9F},{0xB71D, 0x8DA0},{0xB71E, 0x8DA1}, - {0xB71F, 0x8DA2},{0xB720, 0x8DA3},{0xB721, 0x8DA4},{0xB722, 0x8DA5},{0xB723, 0x8DA6},{0xB724, 0x8DA7},{0xB725, 0x8DA8},{0xB726, 0x8DA9}, - {0xB727, 0x8DAA},{0xB728, 0xB6DF},{0xB729, 0xB6E0},{0xB72A, 0x8DAB},{0xB72B, 0x8DAC},{0xB72C, 0xB6E1},{0xB72D, 0x8DAD},{0xB72E, 0x8DAE}, - {0xB72F, 0xB6E2},{0xB730, 0xB6E3},{0xB731, 0x8DAF},{0xB732, 0x8DB0},{0xB733, 0x8DB1},{0xB734, 0x8DB2},{0xB735, 0x8DB3},{0xB736, 0x8DB4}, - {0xB737, 0x8DB5},{0xB738, 0xB6E4},{0xB739, 0xB6E5},{0xB73A, 0x8DB6},{0xB73B, 0xB6E6},{0xB73C, 0x8DB7},{0xB73D, 0x8DB8},{0xB73E, 0x8DB9}, - {0xB73F, 0x8DBA},{0xB740, 0x8DBB},{0xB741, 0x8DBC},{0xB742, 0x8DBD},{0xB743, 0x8DBE},{0xB744, 0xB6E7},{0xB745, 0x8DBF},{0xB746, 0x8DC0}, - {0xB747, 0x8DC1},{0xB748, 0xB6E8},{0xB749, 0x8DC2},{0xB74A, 0x8DC3},{0xB74B, 0x8DC4},{0xB74C, 0xB6E9},{0xB74D, 0x8DC5},{0xB74E, 0x8DC6}, - {0xB74F, 0x8DC7},{0xB750, 0x8DC8},{0xB751, 0x8DC9},{0xB752, 0x8DCA},{0xB753, 0x8DCB},{0xB754, 0xB6EA},{0xB755, 0xB6EB},{0xB756, 0x8DCC}, - {0xB757, 0x8DCD},{0xB758, 0x8DCE},{0xB759, 0x8DCF},{0xB75A, 0x8DD0},{0xB75B, 0x8DD1},{0xB75C, 0x8DD2},{0xB75D, 0x8DD3},{0xB75E, 0x8DD4}, - {0xB75F, 0x8DD5},{0xB760, 0xB6EC},{0xB761, 0x8DD6},{0xB762, 0x8DD7},{0xB763, 0x8DD8},{0xB764, 0xB6ED},{0xB765, 0x8DD9},{0xB766, 0x8DDA}, - {0xB767, 0x8DDB},{0xB768, 0xB6EE},{0xB769, 0x8DDC},{0xB76A, 0x8DDD},{0xB76B, 0x8DDE},{0xB76C, 0x8DDF},{0xB76D, 0x8DE0},{0xB76E, 0x8DE1}, - {0xB76F, 0x8DE2},{0xB770, 0xB6EF},{0xB771, 0xB6F0},{0xB772, 0x8DE3},{0xB773, 0xB6F1},{0xB774, 0x8DE4},{0xB775, 0xB6F2},{0xB776, 0x8DE5}, - {0xB777, 0x8DE6},{0xB778, 0x8DE7},{0xB779, 0x8DE8},{0xB77A, 0x8DE9},{0xB77B, 0x8DEA},{0xB77C, 0xB6F3},{0xB77D, 0xB6F4},{0xB77E, 0x8DEB}, - {0xB77F, 0x8DEC},{0xB780, 0xB6F5},{0xB781, 0x8DED},{0xB782, 0x8DEE},{0xB783, 0x8DEF},{0xB784, 0xB6F6},{0xB785, 0x8DF0},{0xB786, 0x8DF1}, - {0xB787, 0x8DF2},{0xB788, 0x8DF3},{0xB789, 0x8DF4},{0xB78A, 0x8DF5},{0xB78B, 0x8DF6},{0xB78C, 0xB6F7},{0xB78D, 0xB6F8},{0xB78E, 0x8DF7}, - {0xB78F, 0xB6F9},{0xB790, 0xB6FA},{0xB791, 0xB6FB},{0xB792, 0xB6FC},{0xB793, 0x8DF8},{0xB794, 0x8DF9},{0xB795, 0x8DFA},{0xB796, 0xB6FD}, - {0xB797, 0xB6FE},{0xB798, 0xB7A1},{0xB799, 0xB7A2},{0xB79A, 0x8DFB},{0xB79B, 0x8DFC},{0xB79C, 0xB7A3},{0xB79D, 0x8DFD},{0xB79E, 0x8DFE}, - {0xB79F, 0x8E41},{0xB7A0, 0xB7A4},{0xB7A1, 0x8E42},{0xB7A2, 0x8E43},{0xB7A3, 0x8E44},{0xB7A4, 0x8E45},{0xB7A5, 0x8E46},{0xB7A6, 0x8E47}, - {0xB7A7, 0x8E48},{0xB7A8, 0xB7A5},{0xB7A9, 0xB7A6},{0xB7AA, 0x8E49},{0xB7AB, 0xB7A7},{0xB7AC, 0xB7A8},{0xB7AD, 0xB7A9},{0xB7AE, 0x8E4A}, - {0xB7AF, 0x8E4B},{0xB7B0, 0x8E4C},{0xB7B1, 0x8E4D},{0xB7B2, 0x8E4E},{0xB7B3, 0x8E4F},{0xB7B4, 0xB7AA},{0xB7B5, 0xB7AB},{0xB7B6, 0x8E50}, - {0xB7B7, 0x8E51},{0xB7B8, 0xB7AC},{0xB7B9, 0x8E52},{0xB7BA, 0x8E53},{0xB7BB, 0x8E54},{0xB7BC, 0x8E55},{0xB7BD, 0x8E56},{0xB7BE, 0x8E57}, - {0xB7BF, 0x8E58},{0xB7C0, 0x8E59},{0xB7C1, 0x8E5A},{0xB7C2, 0x8E61},{0xB7C3, 0x8E62},{0xB7C4, 0x8E63},{0xB7C5, 0x8E64},{0xB7C6, 0x8E65}, - {0xB7C7, 0xB7AD},{0xB7C8, 0x8E66},{0xB7C9, 0xB7AE},{0xB7CA, 0x8E67},{0xB7CB, 0x8E68},{0xB7CC, 0x8E69},{0xB7CD, 0x8E6A},{0xB7CE, 0x8E6B}, - {0xB7CF, 0x8E6C},{0xB7D0, 0x8E6D},{0xB7D1, 0x8E6E},{0xB7D2, 0x8E6F},{0xB7D3, 0x8E70},{0xB7D4, 0x8E71},{0xB7D5, 0x8E72},{0xB7D6, 0x8E73}, - {0xB7D7, 0x8E74},{0xB7D8, 0x8E75},{0xB7D9, 0x8E76},{0xB7DA, 0x8E77},{0xB7DB, 0x8E78},{0xB7DC, 0x8E79},{0xB7DD, 0x8E7A},{0xB7DE, 0x8E81}, - {0xB7DF, 0x8E82},{0xB7E0, 0x8E83},{0xB7E1, 0x8E84},{0xB7E2, 0x8E85},{0xB7E3, 0x8E86},{0xB7E4, 0x8E87},{0xB7E5, 0x8E88},{0xB7E6, 0x8E89}, - {0xB7E7, 0x8E8A},{0xB7E8, 0x8E8B},{0xB7E9, 0x8E8C},{0xB7EA, 0x8E8D},{0xB7EB, 0x8E8E},{0xB7EC, 0xB7AF},{0xB7ED, 0xB7B0},{0xB7EE, 0x8E8F}, - {0xB7EF, 0x8E90},{0xB7F0, 0xB7B1},{0xB7F1, 0x8E91},{0xB7F2, 0x8E92},{0xB7F3, 0x8E93},{0xB7F4, 0xB7B2},{0xB7F5, 0x8E94},{0xB7F6, 0x8E95}, - {0xB7F7, 0x8E96},{0xB7F8, 0x8E97},{0xB7F9, 0x8E98},{0xB7FA, 0x8E99},{0xB7FB, 0x8E9A},{0xB7FC, 0xB7B3},{0xB7FD, 0xB7B4},{0xB7FE, 0x8E9B}, - {0xB7FF, 0xB7B5},{0xB800, 0xB7B6},{0xB801, 0xB7B7},{0xB802, 0x8E9C},{0xB803, 0x8E9D},{0xB804, 0x8E9E},{0xB805, 0x8E9F},{0xB806, 0x8EA0}, - {0xB807, 0xB7B8},{0xB808, 0xB7B9},{0xB809, 0xB7BA},{0xB80A, 0x8EA1},{0xB80B, 0x8EA2},{0xB80C, 0xB7BB},{0xB80D, 0x8EA3},{0xB80E, 0x8EA4}, - {0xB80F, 0x8EA5},{0xB810, 0xB7BC},{0xB811, 0x8EA6},{0xB812, 0x8EA7},{0xB813, 0x8EA8},{0xB814, 0x8EA9},{0xB815, 0x8EAA},{0xB816, 0x8EAB}, - {0xB817, 0x8EAC},{0xB818, 0xB7BD},{0xB819, 0xB7BE},{0xB81A, 0x8EAD},{0xB81B, 0xB7BF},{0xB81C, 0x8EAE},{0xB81D, 0xB7C0},{0xB81E, 0x8EAF}, - {0xB81F, 0x8EB0},{0xB820, 0x8EB1},{0xB821, 0x8EB2},{0xB822, 0x8EB3},{0xB823, 0x8EB4},{0xB824, 0xB7C1},{0xB825, 0xB7C2},{0xB826, 0x8EB5}, - {0xB827, 0x8EB6},{0xB828, 0xB7C3},{0xB829, 0x8EB7},{0xB82A, 0x8EB8},{0xB82B, 0x8EB9},{0xB82C, 0xB7C4},{0xB82D, 0x8EBA},{0xB82E, 0x8EBB}, - {0xB82F, 0x8EBC},{0xB830, 0x8EBD},{0xB831, 0x8EBE},{0xB832, 0x8EBF},{0xB833, 0x8EC0},{0xB834, 0xB7C5},{0xB835, 0xB7C6},{0xB836, 0x8EC1}, - {0xB837, 0xB7C7},{0xB838, 0xB7C8},{0xB839, 0xB7C9},{0xB83A, 0x8EC2},{0xB83B, 0x8EC3},{0xB83C, 0x8EC4},{0xB83D, 0x8EC5},{0xB83E, 0x8EC6}, - {0xB83F, 0x8EC7},{0xB840, 0xB7CA},{0xB841, 0x8EC8},{0xB842, 0x8EC9},{0xB843, 0x8ECA},{0xB844, 0xB7CB},{0xB845, 0x8ECB},{0xB846, 0x8ECC}, - {0xB847, 0x8ECD},{0xB848, 0x8ECE},{0xB849, 0x8ECF},{0xB84A, 0x8ED0},{0xB84B, 0x8ED1},{0xB84C, 0x8ED2},{0xB84D, 0x8ED3},{0xB84E, 0x8ED4}, - {0xB84F, 0x8ED5},{0xB850, 0x8ED6},{0xB851, 0xB7CC},{0xB852, 0x8ED7},{0xB853, 0xB7CD},{0xB854, 0x8ED8},{0xB855, 0x8ED9},{0xB856, 0x8EDA}, - {0xB857, 0x8EDB},{0xB858, 0x8EDC},{0xB859, 0x8EDD},{0xB85A, 0x8EDE},{0xB85B, 0x8EDF},{0xB85C, 0xB7CE},{0xB85D, 0xB7CF},{0xB85E, 0x8EE0}, - {0xB85F, 0x8EE1},{0xB860, 0xB7D0},{0xB861, 0x8EE2},{0xB862, 0x8EE3},{0xB863, 0x8EE4},{0xB864, 0xB7D1},{0xB865, 0x8EE5},{0xB866, 0x8EE6}, - {0xB867, 0x8EE7},{0xB868, 0x8EE8},{0xB869, 0x8EE9},{0xB86A, 0x8EEA},{0xB86B, 0x8EEB},{0xB86C, 0xB7D2},{0xB86D, 0xB7D3},{0xB86E, 0x8EEC}, - {0xB86F, 0xB7D4},{0xB870, 0x8EED},{0xB871, 0xB7D5},{0xB872, 0x8EEE},{0xB873, 0x8EEF},{0xB874, 0x8EF0},{0xB875, 0x8EF1},{0xB876, 0x8EF2}, - {0xB877, 0x8EF3},{0xB878, 0xB7D6},{0xB879, 0x8EF4},{0xB87A, 0x8EF5},{0xB87B, 0x8EF6},{0xB87C, 0xB7D7},{0xB87D, 0x8EF7},{0xB87E, 0x8EF8}, - {0xB87F, 0x8EF9},{0xB880, 0x8EFA},{0xB881, 0x8EFB},{0xB882, 0x8EFC},{0xB883, 0x8EFD},{0xB884, 0x8EFE},{0xB885, 0x8F41},{0xB886, 0x8F42}, - {0xB887, 0x8F43},{0xB888, 0x8F44},{0xB889, 0x8F45},{0xB88A, 0x8F46},{0xB88B, 0x8F47},{0xB88C, 0x8F48},{0xB88D, 0xB7D8},{0xB88E, 0x8F49}, - {0xB88F, 0x8F4A},{0xB890, 0x8F4B},{0xB891, 0x8F4C},{0xB892, 0x8F4D},{0xB893, 0x8F4E},{0xB894, 0x8F4F},{0xB895, 0x8F50},{0xB896, 0x8F51}, - {0xB897, 0x8F52},{0xB898, 0x8F53},{0xB899, 0x8F54},{0xB89A, 0x8F55},{0xB89B, 0x8F56},{0xB89C, 0x8F57},{0xB89D, 0x8F58},{0xB89E, 0x8F59}, - {0xB89F, 0x8F5A},{0xB8A0, 0x8F61},{0xB8A1, 0x8F62},{0xB8A2, 0x8F63},{0xB8A3, 0x8F64},{0xB8A4, 0x8F65},{0xB8A5, 0x8F66},{0xB8A6, 0x8F67}, - {0xB8A7, 0x8F68},{0xB8A8, 0xB7D9},{0xB8A9, 0x8F69},{0xB8AA, 0x8F6A},{0xB8AB, 0x8F6B},{0xB8AC, 0x8F6C},{0xB8AD, 0x8F6D},{0xB8AE, 0x8F6E}, - {0xB8AF, 0x8F6F},{0xB8B0, 0xB7DA},{0xB8B1, 0x8F70},{0xB8B2, 0x8F71},{0xB8B3, 0x8F72},{0xB8B4, 0xB7DB},{0xB8B5, 0x8F73},{0xB8B6, 0x8F74}, - {0xB8B7, 0x8F75},{0xB8B8, 0xB7DC},{0xB8B9, 0x8F76},{0xB8BA, 0x8F77},{0xB8BB, 0x8F78},{0xB8BC, 0x8F79},{0xB8BD, 0x8F7A},{0xB8BE, 0x8F81}, - {0xB8BF, 0x8F82},{0xB8C0, 0xB7DD},{0xB8C1, 0xB7DE},{0xB8C2, 0x8F83},{0xB8C3, 0xB7DF},{0xB8C4, 0x8F84},{0xB8C5, 0xB7E0},{0xB8C6, 0x8F85}, - {0xB8C7, 0x8F86},{0xB8C8, 0x8F87},{0xB8C9, 0x8F88},{0xB8CA, 0x8F89},{0xB8CB, 0x8F8A},{0xB8CC, 0xB7E1},{0xB8CD, 0x8F8B},{0xB8CE, 0x8F8C}, - {0xB8CF, 0x8F8D},{0xB8D0, 0xB7E2},{0xB8D1, 0x8F8E},{0xB8D2, 0x8F8F},{0xB8D3, 0x8F90},{0xB8D4, 0xB7E3},{0xB8D5, 0x8F91},{0xB8D6, 0x8F92}, - {0xB8D7, 0x8F93},{0xB8D8, 0x8F94},{0xB8D9, 0x8F95},{0xB8DA, 0x8F96},{0xB8DB, 0x8F97},{0xB8DC, 0x8F98},{0xB8DD, 0xB7E4},{0xB8DE, 0x8F99}, - {0xB8DF, 0xB7E5},{0xB8E0, 0x8F9A},{0xB8E1, 0xB7E6},{0xB8E2, 0x8F9B},{0xB8E3, 0x8F9C},{0xB8E4, 0x8F9D},{0xB8E5, 0x8F9E},{0xB8E6, 0x8F9F}, - {0xB8E7, 0x8FA0},{0xB8E8, 0xB7E7},{0xB8E9, 0xB7E8},{0xB8EA, 0x8FA1},{0xB8EB, 0x8FA2},{0xB8EC, 0xB7E9},{0xB8ED, 0x8FA3},{0xB8EE, 0x8FA4}, - {0xB8EF, 0x8FA5},{0xB8F0, 0xB7EA},{0xB8F1, 0x8FA6},{0xB8F2, 0x8FA7},{0xB8F3, 0x8FA8},{0xB8F4, 0x8FA9},{0xB8F5, 0x8FAA},{0xB8F6, 0x8FAB}, - {0xB8F7, 0x8FAC},{0xB8F8, 0xB7EB},{0xB8F9, 0xB7EC},{0xB8FA, 0x8FAD},{0xB8FB, 0xB7ED},{0xB8FC, 0x8FAE},{0xB8FD, 0xB7EE},{0xB8FE, 0x8FAF}, - {0xB8FF, 0x8FB0},{0xB900, 0x8FB1},{0xB901, 0x8FB2},{0xB902, 0x8FB3},{0xB903, 0x8FB4},{0xB904, 0xB7EF},{0xB905, 0x8FB5},{0xB906, 0x8FB6}, - {0xB907, 0x8FB7},{0xB908, 0x8FB8},{0xB909, 0x8FB9},{0xB90A, 0x8FBA},{0xB90B, 0x8FBB},{0xB90C, 0x8FBC},{0xB90D, 0x8FBD},{0xB90E, 0x8FBE}, - {0xB90F, 0x8FBF},{0xB910, 0x8FC0},{0xB911, 0x8FC1},{0xB912, 0x8FC2},{0xB913, 0x8FC3},{0xB914, 0x8FC4},{0xB915, 0x8FC5},{0xB916, 0x8FC6}, - {0xB917, 0x8FC7},{0xB918, 0xB7F0},{0xB919, 0x8FC8},{0xB91A, 0x8FC9},{0xB91B, 0x8FCA},{0xB91C, 0x8FCB},{0xB91D, 0x8FCC},{0xB91E, 0x8FCD}, - {0xB91F, 0x8FCE},{0xB920, 0xB7F1},{0xB921, 0x8FCF},{0xB922, 0x8FD0},{0xB923, 0x8FD1},{0xB924, 0x8FD2},{0xB925, 0x8FD3},{0xB926, 0x8FD4}, - {0xB927, 0x8FD5},{0xB928, 0x8FD6},{0xB929, 0x8FD7},{0xB92A, 0x8FD8},{0xB92B, 0x8FD9},{0xB92C, 0x8FDA},{0xB92D, 0x8FDB},{0xB92E, 0x8FDC}, - {0xB92F, 0x8FDD},{0xB930, 0x8FDE},{0xB931, 0x8FDF},{0xB932, 0x8FE0},{0xB933, 0x8FE1},{0xB934, 0x8FE2},{0xB935, 0x8FE3},{0xB936, 0x8FE4}, - {0xB937, 0x8FE5},{0xB938, 0x8FE6},{0xB939, 0x8FE7},{0xB93A, 0x8FE8},{0xB93B, 0x8FE9},{0xB93C, 0xB7F2},{0xB93D, 0xB7F3},{0xB93E, 0x8FEA}, - {0xB93F, 0x8FEB},{0xB940, 0xB7F4},{0xB941, 0x8FEC},{0xB942, 0x8FED},{0xB943, 0x8FEE},{0xB944, 0xB7F5},{0xB945, 0x8FEF},{0xB946, 0x8FF0}, - {0xB947, 0x8FF1},{0xB948, 0x8FF2},{0xB949, 0x8FF3},{0xB94A, 0x8FF4},{0xB94B, 0x8FF5},{0xB94C, 0xB7F6},{0xB94D, 0x8FF6},{0xB94E, 0x8FF7}, - {0xB94F, 0xB7F7},{0xB950, 0x8FF8},{0xB951, 0xB7F8},{0xB952, 0x8FF9},{0xB953, 0x8FFA},{0xB954, 0x8FFB},{0xB955, 0x8FFC},{0xB956, 0x8FFD}, - {0xB957, 0x8FFE},{0xB958, 0xB7F9},{0xB959, 0xB7FA},{0xB95A, 0x9041},{0xB95B, 0x9042},{0xB95C, 0xB7FB},{0xB95D, 0x9043},{0xB95E, 0x9044}, - {0xB95F, 0x9045},{0xB960, 0xB7FC},{0xB961, 0x9046},{0xB962, 0x9047},{0xB963, 0x9048},{0xB964, 0x9049},{0xB965, 0x904A},{0xB966, 0x904B}, - {0xB967, 0x904C},{0xB968, 0xB7FD},{0xB969, 0xB7FE},{0xB96A, 0x904D},{0xB96B, 0xB8A1},{0xB96C, 0x904E},{0xB96D, 0xB8A2},{0xB96E, 0x904F}, - {0xB96F, 0x9050},{0xB970, 0x9051},{0xB971, 0x9052},{0xB972, 0x9053},{0xB973, 0x9054},{0xB974, 0xB8A3},{0xB975, 0xB8A4},{0xB976, 0x9055}, - {0xB977, 0x9056},{0xB978, 0xB8A5},{0xB979, 0x9057},{0xB97A, 0x9058},{0xB97B, 0x9059},{0xB97C, 0xB8A6},{0xB97D, 0x905A},{0xB97E, 0x9061}, - {0xB97F, 0x9062},{0xB980, 0x9063},{0xB981, 0x9064},{0xB982, 0x9065},{0xB983, 0x9066},{0xB984, 0xB8A7},{0xB985, 0xB8A8},{0xB986, 0x9067}, - {0xB987, 0xB8A9},{0xB988, 0x9068},{0xB989, 0xB8AA},{0xB98A, 0xB8AB},{0xB98B, 0x9069},{0xB98C, 0x906A},{0xB98D, 0xB8AC},{0xB98E, 0xB8AD}, - {0xB98F, 0x906B},{0xB990, 0x906C},{0xB991, 0x906D},{0xB992, 0x906E},{0xB993, 0x906F},{0xB994, 0x9070},{0xB995, 0x9071},{0xB996, 0x9072}, - {0xB997, 0x9073},{0xB998, 0x9074},{0xB999, 0x9075},{0xB99A, 0x9076},{0xB99B, 0x9077},{0xB99C, 0x9078},{0xB99D, 0x9079},{0xB99E, 0x907A}, - {0xB99F, 0x9081},{0xB9A0, 0x9082},{0xB9A1, 0x9083},{0xB9A2, 0x9084},{0xB9A3, 0x9085},{0xB9A4, 0x9086},{0xB9A5, 0x9087},{0xB9A6, 0x9088}, - {0xB9A7, 0x9089},{0xB9A8, 0x908A},{0xB9A9, 0x908B},{0xB9AA, 0x908C},{0xB9AB, 0x908D},{0xB9AC, 0xB8AE},{0xB9AD, 0xB8AF},{0xB9AE, 0x908E}, - {0xB9AF, 0x908F},{0xB9B0, 0xB8B0},{0xB9B1, 0x9090},{0xB9B2, 0x9091},{0xB9B3, 0x9092},{0xB9B4, 0xB8B1},{0xB9B5, 0x9093},{0xB9B6, 0x9094}, - {0xB9B7, 0x9095},{0xB9B8, 0x9096},{0xB9B9, 0x9097},{0xB9BA, 0x9098},{0xB9BB, 0x9099},{0xB9BC, 0xB8B2},{0xB9BD, 0xB8B3},{0xB9BE, 0x909A}, - {0xB9BF, 0xB8B4},{0xB9C0, 0x909B},{0xB9C1, 0xB8B5},{0xB9C2, 0x909C},{0xB9C3, 0x909D},{0xB9C4, 0x909E},{0xB9C5, 0x909F},{0xB9C6, 0x90A0}, - {0xB9C7, 0x90A1},{0xB9C8, 0xB8B6},{0xB9C9, 0xB8B7},{0xB9CA, 0x90A2},{0xB9CB, 0x90A3},{0xB9CC, 0xB8B8},{0xB9CD, 0x90A4},{0xB9CE, 0xB8B9}, - {0xB9CF, 0xB8BA},{0xB9D0, 0xB8BB},{0xB9D1, 0xB8BC},{0xB9D2, 0xB8BD},{0xB9D3, 0x90A5},{0xB9D4, 0x90A6},{0xB9D5, 0x90A7},{0xB9D6, 0x90A8}, - {0xB9D7, 0x90A9},{0xB9D8, 0xB8BE},{0xB9D9, 0xB8BF},{0xB9DA, 0x90AA},{0xB9DB, 0xB8C0},{0xB9DC, 0x90AB},{0xB9DD, 0xB8C1},{0xB9DE, 0xB8C2}, - {0xB9DF, 0x90AC},{0xB9E0, 0x90AD},{0xB9E1, 0xB8C3},{0xB9E2, 0x90AE},{0xB9E3, 0xB8C4},{0xB9E4, 0xB8C5},{0xB9E5, 0xB8C6},{0xB9E6, 0x90AF}, - {0xB9E7, 0x90B0},{0xB9E8, 0xB8C7},{0xB9E9, 0x90B1},{0xB9EA, 0x90B2},{0xB9EB, 0x90B3},{0xB9EC, 0xB8C8},{0xB9ED, 0x90B4},{0xB9EE, 0x90B5}, - {0xB9EF, 0x90B6},{0xB9F0, 0x90B7},{0xB9F1, 0x90B8},{0xB9F2, 0x90B9},{0xB9F3, 0x90BA},{0xB9F4, 0xB8C9},{0xB9F5, 0xB8CA},{0xB9F6, 0x90BB}, - {0xB9F7, 0xB8CB},{0xB9F8, 0xB8CC},{0xB9F9, 0xB8CD},{0xB9FA, 0xB8CE},{0xB9FB, 0x90BC},{0xB9FC, 0x90BD},{0xB9FD, 0x90BE},{0xB9FE, 0x90BF}, - {0xB9FF, 0x90C0},{0xBA00, 0xB8CF},{0xBA01, 0xB8D0},{0xBA02, 0x90C1},{0xBA03, 0x90C2},{0xBA04, 0x90C3},{0xBA05, 0x90C4},{0xBA06, 0x90C5}, - {0xBA07, 0x90C6},{0xBA08, 0xB8D1},{0xBA09, 0x90C7},{0xBA0A, 0x90C8},{0xBA0B, 0x90C9},{0xBA0C, 0x90CA},{0xBA0D, 0x90CB},{0xBA0E, 0x90CC}, - {0xBA0F, 0x90CD},{0xBA10, 0x90CE},{0xBA11, 0x90CF},{0xBA12, 0x90D0},{0xBA13, 0x90D1},{0xBA14, 0x90D2},{0xBA15, 0xB8D2},{0xBA16, 0x90D3}, - {0xBA17, 0x90D4},{0xBA18, 0x90D5},{0xBA19, 0x90D6},{0xBA1A, 0x90D7},{0xBA1B, 0x90D8},{0xBA1C, 0x90D9},{0xBA1D, 0x90DA},{0xBA1E, 0x90DB}, - {0xBA1F, 0x90DC},{0xBA20, 0x90DD},{0xBA21, 0x90DE},{0xBA22, 0x90DF},{0xBA23, 0x90E0},{0xBA24, 0x90E1},{0xBA25, 0x90E2},{0xBA26, 0x90E3}, - {0xBA27, 0x90E4},{0xBA28, 0x90E5},{0xBA29, 0x90E6},{0xBA2A, 0x90E7},{0xBA2B, 0x90E8},{0xBA2C, 0x90E9},{0xBA2D, 0x90EA},{0xBA2E, 0x90EB}, - {0xBA2F, 0x90EC},{0xBA30, 0x90ED},{0xBA31, 0x90EE},{0xBA32, 0x90EF},{0xBA33, 0x90F0},{0xBA34, 0x90F1},{0xBA35, 0x90F2},{0xBA36, 0x90F3}, - {0xBA37, 0x90F4},{0xBA38, 0xB8D3},{0xBA39, 0xB8D4},{0xBA3A, 0x90F5},{0xBA3B, 0x90F6},{0xBA3C, 0xB8D5},{0xBA3D, 0x90F7},{0xBA3E, 0x90F8}, - {0xBA3F, 0x90F9},{0xBA40, 0xB8D6},{0xBA41, 0x90FA},{0xBA42, 0xB8D7},{0xBA43, 0x90FB},{0xBA44, 0x90FC},{0xBA45, 0x90FD},{0xBA46, 0x90FE}, - {0xBA47, 0x9141},{0xBA48, 0xB8D8},{0xBA49, 0xB8D9},{0xBA4A, 0x9142},{0xBA4B, 0xB8DA},{0xBA4C, 0x9143},{0xBA4D, 0xB8DB},{0xBA4E, 0xB8DC}, - {0xBA4F, 0x9144},{0xBA50, 0x9145},{0xBA51, 0x9146},{0xBA52, 0x9147},{0xBA53, 0xB8DD},{0xBA54, 0xB8DE},{0xBA55, 0xB8DF},{0xBA56, 0x9148}, - {0xBA57, 0x9149},{0xBA58, 0xB8E0},{0xBA59, 0x914A},{0xBA5A, 0x914B},{0xBA5B, 0x914C},{0xBA5C, 0xB8E1},{0xBA5D, 0x914D},{0xBA5E, 0x914E}, - {0xBA5F, 0x914F},{0xBA60, 0x9150},{0xBA61, 0x9151},{0xBA62, 0x9152},{0xBA63, 0x9153},{0xBA64, 0xB8E2},{0xBA65, 0xB8E3},{0xBA66, 0x9154}, - {0xBA67, 0xB8E4},{0xBA68, 0xB8E5},{0xBA69, 0xB8E6},{0xBA6A, 0x9155},{0xBA6B, 0x9156},{0xBA6C, 0x9157},{0xBA6D, 0x9158},{0xBA6E, 0x9159}, - {0xBA6F, 0x915A},{0xBA70, 0xB8E7},{0xBA71, 0xB8E8},{0xBA72, 0x9161},{0xBA73, 0x9162},{0xBA74, 0xB8E9},{0xBA75, 0x9163},{0xBA76, 0x9164}, - {0xBA77, 0x9165},{0xBA78, 0xB8EA},{0xBA79, 0x9166},{0xBA7A, 0x9167},{0xBA7B, 0x9168},{0xBA7C, 0x9169},{0xBA7D, 0x916A},{0xBA7E, 0x916B}, - {0xBA7F, 0x916C},{0xBA80, 0x916D},{0xBA81, 0x916E},{0xBA82, 0x916F},{0xBA83, 0xB8EB},{0xBA84, 0xB8EC},{0xBA85, 0xB8ED},{0xBA86, 0x9170}, - {0xBA87, 0xB8EE},{0xBA88, 0x9171},{0xBA89, 0x9172},{0xBA8A, 0x9173},{0xBA8B, 0x9174},{0xBA8C, 0xB8EF},{0xBA8D, 0x9175},{0xBA8E, 0x9176}, - {0xBA8F, 0x9177},{0xBA90, 0x9178},{0xBA91, 0x9179},{0xBA92, 0x917A},{0xBA93, 0x9181},{0xBA94, 0x9182},{0xBA95, 0x9183},{0xBA96, 0x9184}, - {0xBA97, 0x9185},{0xBA98, 0x9186},{0xBA99, 0x9187},{0xBA9A, 0x9188},{0xBA9B, 0x9189},{0xBA9C, 0x918A},{0xBA9D, 0x918B},{0xBA9E, 0x918C}, - {0xBA9F, 0x918D},{0xBAA0, 0x918E},{0xBAA1, 0x918F},{0xBAA2, 0x9190},{0xBAA3, 0x9191},{0xBAA4, 0x9192},{0xBAA5, 0x9193},{0xBAA6, 0x9194}, - {0xBAA7, 0x9195},{0xBAA8, 0xB8F0},{0xBAA9, 0xB8F1},{0xBAAA, 0x9196},{0xBAAB, 0xB8F2},{0xBAAC, 0xB8F3},{0xBAAD, 0x9197},{0xBAAE, 0x9198}, - {0xBAAF, 0x9199},{0xBAB0, 0xB8F4},{0xBAB1, 0x919A},{0xBAB2, 0xB8F5},{0xBAB3, 0x919B},{0xBAB4, 0x919C},{0xBAB5, 0x919D},{0xBAB6, 0x919E}, - {0xBAB7, 0x919F},{0xBAB8, 0xB8F6},{0xBAB9, 0xB8F7},{0xBABA, 0x91A0},{0xBABB, 0xB8F8},{0xBABC, 0x91A1},{0xBABD, 0xB8F9},{0xBABE, 0x91A2}, - {0xBABF, 0x91A3},{0xBAC0, 0x91A4},{0xBAC1, 0x91A5},{0xBAC2, 0x91A6},{0xBAC3, 0x91A7},{0xBAC4, 0xB8FA},{0xBAC5, 0x91A8},{0xBAC6, 0x91A9}, - {0xBAC7, 0x91AA},{0xBAC8, 0xB8FB},{0xBAC9, 0x91AB},{0xBACA, 0x91AC},{0xBACB, 0x91AD},{0xBACC, 0x91AE},{0xBACD, 0x91AF},{0xBACE, 0x91B0}, - {0xBACF, 0x91B1},{0xBAD0, 0x91B2},{0xBAD1, 0x91B3},{0xBAD2, 0x91B4},{0xBAD3, 0x91B5},{0xBAD4, 0x91B6},{0xBAD5, 0x91B7},{0xBAD6, 0x91B8}, - {0xBAD7, 0x91B9},{0xBAD8, 0xB8FC},{0xBAD9, 0xB8FD},{0xBADA, 0x91BA},{0xBADB, 0x91BB},{0xBADC, 0x91BC},{0xBADD, 0x91BD},{0xBADE, 0x91BE}, - {0xBADF, 0x91BF},{0xBAE0, 0x91C0},{0xBAE1, 0x91C1},{0xBAE2, 0x91C2},{0xBAE3, 0x91C3},{0xBAE4, 0x91C4},{0xBAE5, 0x91C5},{0xBAE6, 0x91C6}, - {0xBAE7, 0x91C7},{0xBAE8, 0x91C8},{0xBAE9, 0x91C9},{0xBAEA, 0x91CA},{0xBAEB, 0x91CB},{0xBAEC, 0x91CC},{0xBAED, 0x91CD},{0xBAEE, 0x91CE}, - {0xBAEF, 0x91CF},{0xBAF0, 0x91D0},{0xBAF1, 0x91D1},{0xBAF2, 0x91D2},{0xBAF3, 0x91D3},{0xBAF4, 0x91D4},{0xBAF5, 0x91D5},{0xBAF6, 0x91D6}, - {0xBAF7, 0x91D7},{0xBAF8, 0x91D8},{0xBAF9, 0x91D9},{0xBAFA, 0x91DA},{0xBAFB, 0x91DB},{0xBAFC, 0xB8FE},{0xBAFD, 0x91DC},{0xBAFE, 0x91DD}, - {0xBAFF, 0x91DE},{0xBB00, 0xB9A1},{0xBB01, 0x91DF},{0xBB02, 0x91E0},{0xBB03, 0x91E1},{0xBB04, 0xB9A2},{0xBB05, 0x91E2},{0xBB06, 0x91E3}, - {0xBB07, 0x91E4},{0xBB08, 0x91E5},{0xBB09, 0x91E6},{0xBB0A, 0x91E7},{0xBB0B, 0x91E8},{0xBB0C, 0x91E9},{0xBB0D, 0xB9A3},{0xBB0E, 0x91EA}, - {0xBB0F, 0xB9A4},{0xBB10, 0x91EB},{0xBB11, 0xB9A5},{0xBB12, 0x91EC},{0xBB13, 0x91ED},{0xBB14, 0x91EE},{0xBB15, 0x91EF},{0xBB16, 0x91F0}, - {0xBB17, 0x91F1},{0xBB18, 0xB9A6},{0xBB19, 0x91F2},{0xBB1A, 0x91F3},{0xBB1B, 0x91F4},{0xBB1C, 0xB9A7},{0xBB1D, 0x91F5},{0xBB1E, 0x91F6}, - {0xBB1F, 0x91F7},{0xBB20, 0xB9A8},{0xBB21, 0x91F8},{0xBB22, 0x91F9},{0xBB23, 0x91FA},{0xBB24, 0x91FB},{0xBB25, 0x91FC},{0xBB26, 0x91FD}, - {0xBB27, 0x91FE},{0xBB28, 0x9241},{0xBB29, 0xB9A9},{0xBB2A, 0x9242},{0xBB2B, 0xB9AA},{0xBB2C, 0x9243},{0xBB2D, 0x9244},{0xBB2E, 0x9245}, - {0xBB2F, 0x9246},{0xBB30, 0x9247},{0xBB31, 0x9248},{0xBB32, 0x9249},{0xBB33, 0x924A},{0xBB34, 0xB9AB},{0xBB35, 0xB9AC},{0xBB36, 0xB9AD}, - {0xBB37, 0x924B},{0xBB38, 0xB9AE},{0xBB39, 0x924C},{0xBB3A, 0x924D},{0xBB3B, 0xB9AF},{0xBB3C, 0xB9B0},{0xBB3D, 0xB9B1},{0xBB3E, 0xB9B2}, - {0xBB3F, 0x924E},{0xBB40, 0x924F},{0xBB41, 0x9250},{0xBB42, 0x9251},{0xBB43, 0x9252},{0xBB44, 0xB9B3},{0xBB45, 0xB9B4},{0xBB46, 0x9253}, - {0xBB47, 0xB9B5},{0xBB48, 0x9254},{0xBB49, 0xB9B6},{0xBB4A, 0x9255},{0xBB4B, 0x9256},{0xBB4C, 0x9257},{0xBB4D, 0xB9B7},{0xBB4E, 0x9258}, - {0xBB4F, 0xB9B8},{0xBB50, 0xB9B9},{0xBB51, 0x9259},{0xBB52, 0x925A},{0xBB53, 0x9261},{0xBB54, 0xB9BA},{0xBB55, 0x9262},{0xBB56, 0x9263}, - {0xBB57, 0x9264},{0xBB58, 0xB9BB},{0xBB59, 0x9265},{0xBB5A, 0x9266},{0xBB5B, 0x9267},{0xBB5C, 0x9268},{0xBB5D, 0x9269},{0xBB5E, 0x926A}, - {0xBB5F, 0x926B},{0xBB60, 0x926C},{0xBB61, 0xB9BC},{0xBB62, 0x926D},{0xBB63, 0xB9BD},{0xBB64, 0x926E},{0xBB65, 0x926F},{0xBB66, 0x9270}, - {0xBB67, 0x9271},{0xBB68, 0x9272},{0xBB69, 0x9273},{0xBB6A, 0x9274},{0xBB6B, 0x9275},{0xBB6C, 0xB9BE},{0xBB6D, 0x9276},{0xBB6E, 0x9277}, - {0xBB6F, 0x9278},{0xBB70, 0x9279},{0xBB71, 0x927A},{0xBB72, 0x9281},{0xBB73, 0x9282},{0xBB74, 0x9283},{0xBB75, 0x9284},{0xBB76, 0x9285}, - {0xBB77, 0x9286},{0xBB78, 0x9287},{0xBB79, 0x9288},{0xBB7A, 0x9289},{0xBB7B, 0x928A},{0xBB7C, 0x928B},{0xBB7D, 0x928C},{0xBB7E, 0x928D}, - {0xBB7F, 0x928E},{0xBB80, 0x928F},{0xBB81, 0x9290},{0xBB82, 0x9291},{0xBB83, 0x9292},{0xBB84, 0x9293},{0xBB85, 0x9294},{0xBB86, 0x9295}, - {0xBB87, 0x9296},{0xBB88, 0xB9BF},{0xBB89, 0x9297},{0xBB8A, 0x9298},{0xBB8B, 0x9299},{0xBB8C, 0xB9C0},{0xBB8D, 0x929A},{0xBB8E, 0x929B}, - {0xBB8F, 0x929C},{0xBB90, 0xB9C1},{0xBB91, 0x929D},{0xBB92, 0x929E},{0xBB93, 0x929F},{0xBB94, 0x92A0},{0xBB95, 0x92A1},{0xBB96, 0x92A2}, - {0xBB97, 0x92A3},{0xBB98, 0x92A4},{0xBB99, 0x92A5},{0xBB9A, 0x92A6},{0xBB9B, 0x92A7},{0xBB9C, 0x92A8},{0xBB9D, 0x92A9},{0xBB9E, 0x92AA}, - {0xBB9F, 0x92AB},{0xBBA0, 0x92AC},{0xBBA1, 0x92AD},{0xBBA2, 0x92AE},{0xBBA3, 0x92AF},{0xBBA4, 0xB9C2},{0xBBA5, 0x92B0},{0xBBA6, 0x92B1}, - {0xBBA7, 0x92B2},{0xBBA8, 0xB9C3},{0xBBA9, 0x92B3},{0xBBAA, 0x92B4},{0xBBAB, 0x92B5},{0xBBAC, 0xB9C4},{0xBBAD, 0x92B6},{0xBBAE, 0x92B7}, - {0xBBAF, 0x92B8},{0xBBB0, 0x92B9},{0xBBB1, 0x92BA},{0xBBB2, 0x92BB},{0xBBB3, 0x92BC},{0xBBB4, 0xB9C5},{0xBBB5, 0x92BD},{0xBBB6, 0x92BE}, - {0xBBB7, 0xB9C6},{0xBBB8, 0x92BF},{0xBBB9, 0x92C0},{0xBBBA, 0x92C1},{0xBBBB, 0x92C2},{0xBBBC, 0x92C3},{0xBBBD, 0x92C4},{0xBBBE, 0x92C5}, - {0xBBBF, 0x92C6},{0xBBC0, 0xB9C7},{0xBBC1, 0x92C7},{0xBBC2, 0x92C8},{0xBBC3, 0x92C9},{0xBBC4, 0xB9C8},{0xBBC5, 0x92CA},{0xBBC6, 0x92CB}, - {0xBBC7, 0x92CC},{0xBBC8, 0xB9C9},{0xBBC9, 0x92CD},{0xBBCA, 0x92CE},{0xBBCB, 0x92CF},{0xBBCC, 0x92D0},{0xBBCD, 0x92D1},{0xBBCE, 0x92D2}, - {0xBBCF, 0x92D3},{0xBBD0, 0xB9CA},{0xBBD1, 0x92D4},{0xBBD2, 0x92D5},{0xBBD3, 0xB9CB},{0xBBD4, 0x92D6},{0xBBD5, 0x92D7},{0xBBD6, 0x92D8}, - {0xBBD7, 0x92D9},{0xBBD8, 0x92DA},{0xBBD9, 0x92DB},{0xBBDA, 0x92DC},{0xBBDB, 0x92DD},{0xBBDC, 0x92DE},{0xBBDD, 0x92DF},{0xBBDE, 0x92E0}, - {0xBBDF, 0x92E1},{0xBBE0, 0x92E2},{0xBBE1, 0x92E3},{0xBBE2, 0x92E4},{0xBBE3, 0x92E5},{0xBBE4, 0x92E6},{0xBBE5, 0x92E7},{0xBBE6, 0x92E8}, - {0xBBE7, 0x92E9},{0xBBE8, 0x92EA},{0xBBE9, 0x92EB},{0xBBEA, 0x92EC},{0xBBEB, 0x92ED},{0xBBEC, 0x92EE},{0xBBED, 0x92EF},{0xBBEE, 0x92F0}, - {0xBBEF, 0x92F1},{0xBBF0, 0x92F2},{0xBBF1, 0x92F3},{0xBBF2, 0x92F4},{0xBBF3, 0x92F5},{0xBBF4, 0x92F6},{0xBBF5, 0x92F7},{0xBBF6, 0x92F8}, - {0xBBF7, 0x92F9},{0xBBF8, 0xB9CC},{0xBBF9, 0xB9CD},{0xBBFA, 0x92FA},{0xBBFB, 0x92FB},{0xBBFC, 0xB9CE},{0xBBFD, 0x92FC},{0xBBFE, 0x92FD}, - {0xBBFF, 0xB9CF},{0xBC00, 0xB9D0},{0xBC01, 0x92FE},{0xBC02, 0xB9D1},{0xBC03, 0x9341},{0xBC04, 0x9342},{0xBC05, 0x9343},{0xBC06, 0x9344}, - {0xBC07, 0x9345},{0xBC08, 0xB9D2},{0xBC09, 0xB9D3},{0xBC0A, 0x9346},{0xBC0B, 0xB9D4},{0xBC0C, 0xB9D5},{0xBC0D, 0xB9D6},{0xBC0E, 0x9347}, - {0xBC0F, 0xB9D7},{0xBC10, 0x9348},{0xBC11, 0xB9D8},{0xBC12, 0x9349},{0xBC13, 0x934A},{0xBC14, 0xB9D9},{0xBC15, 0xB9DA},{0xBC16, 0xB9DB}, - {0xBC17, 0xB9DC},{0xBC18, 0xB9DD},{0xBC19, 0x934B},{0xBC1A, 0x934C},{0xBC1B, 0xB9DE},{0xBC1C, 0xB9DF},{0xBC1D, 0xB9E0},{0xBC1E, 0xB9E1}, - {0xBC1F, 0xB9E2},{0xBC20, 0x934D},{0xBC21, 0x934E},{0xBC22, 0x934F},{0xBC23, 0x9350},{0xBC24, 0xB9E3},{0xBC25, 0xB9E4},{0xBC26, 0x9351}, - {0xBC27, 0xB9E5},{0xBC28, 0x9352},{0xBC29, 0xB9E6},{0xBC2A, 0x9353},{0xBC2B, 0x9354},{0xBC2C, 0x9355},{0xBC2D, 0xB9E7},{0xBC2E, 0x9356}, - {0xBC2F, 0x9357},{0xBC30, 0xB9E8},{0xBC31, 0xB9E9},{0xBC32, 0x9358},{0xBC33, 0x9359},{0xBC34, 0xB9EA},{0xBC35, 0x935A},{0xBC36, 0x9361}, - {0xBC37, 0x9362},{0xBC38, 0xB9EB},{0xBC39, 0x9363},{0xBC3A, 0x9364},{0xBC3B, 0x9365},{0xBC3C, 0x9366},{0xBC3D, 0x9367},{0xBC3E, 0x9368}, - {0xBC3F, 0x9369},{0xBC40, 0xB9EC},{0xBC41, 0xB9ED},{0xBC42, 0x936A},{0xBC43, 0xB9EE},{0xBC44, 0xB9EF},{0xBC45, 0xB9F0},{0xBC46, 0x936B}, - {0xBC47, 0x936C},{0xBC48, 0x936D},{0xBC49, 0xB9F1},{0xBC4A, 0x936E},{0xBC4B, 0x936F},{0xBC4C, 0xB9F2},{0xBC4D, 0xB9F3},{0xBC4E, 0x9370}, - {0xBC4F, 0x9371},{0xBC50, 0xB9F4},{0xBC51, 0x9372},{0xBC52, 0x9373},{0xBC53, 0x9374},{0xBC54, 0x9375},{0xBC55, 0x9376},{0xBC56, 0x9377}, - {0xBC57, 0x9378},{0xBC58, 0x9379},{0xBC59, 0x937A},{0xBC5A, 0x9381},{0xBC5B, 0x9382},{0xBC5C, 0x9383},{0xBC5D, 0xB9F5},{0xBC5E, 0x9384}, - {0xBC5F, 0x9385},{0xBC60, 0x9386},{0xBC61, 0x9387},{0xBC62, 0x9388},{0xBC63, 0x9389},{0xBC64, 0x938A},{0xBC65, 0x938B},{0xBC66, 0x938C}, - {0xBC67, 0x938D},{0xBC68, 0x938E},{0xBC69, 0x938F},{0xBC6A, 0x9390},{0xBC6B, 0x9391},{0xBC6C, 0x9392},{0xBC6D, 0x9393},{0xBC6E, 0x9394}, - {0xBC6F, 0x9395},{0xBC70, 0x9396},{0xBC71, 0x9397},{0xBC72, 0x9398},{0xBC73, 0x9399},{0xBC74, 0x939A},{0xBC75, 0x939B},{0xBC76, 0x939C}, - {0xBC77, 0x939D},{0xBC78, 0x939E},{0xBC79, 0x939F},{0xBC7A, 0x93A0},{0xBC7B, 0x93A1},{0xBC7C, 0x93A2},{0xBC7D, 0x93A3},{0xBC7E, 0x93A4}, - {0xBC7F, 0x93A5},{0xBC80, 0x93A6},{0xBC81, 0x93A7},{0xBC82, 0x93A8},{0xBC83, 0x93A9},{0xBC84, 0xB9F6},{0xBC85, 0xB9F7},{0xBC86, 0x93AA}, - {0xBC87, 0x93AB},{0xBC88, 0xB9F8},{0xBC89, 0x93AC},{0xBC8A, 0x93AD},{0xBC8B, 0xB9F9},{0xBC8C, 0xB9FA},{0xBC8D, 0x93AE},{0xBC8E, 0xB9FB}, - {0xBC8F, 0x93AF},{0xBC90, 0x93B0},{0xBC91, 0x93B1},{0xBC92, 0x93B2},{0xBC93, 0x93B3},{0xBC94, 0xB9FC},{0xBC95, 0xB9FD},{0xBC96, 0x93B4}, - {0xBC97, 0xB9FE},{0xBC98, 0x93B5},{0xBC99, 0xBAA1},{0xBC9A, 0xBAA2},{0xBC9B, 0x93B6},{0xBC9C, 0x93B7},{0xBC9D, 0x93B8},{0xBC9E, 0x93B9}, - {0xBC9F, 0x93BA},{0xBCA0, 0xBAA3},{0xBCA1, 0xBAA4},{0xBCA2, 0x93BB},{0xBCA3, 0x93BC},{0xBCA4, 0xBAA5},{0xBCA5, 0x93BD},{0xBCA6, 0x93BE}, - {0xBCA7, 0xBAA6},{0xBCA8, 0xBAA7},{0xBCA9, 0x93BF},{0xBCAA, 0x93C0},{0xBCAB, 0x93C1},{0xBCAC, 0x93C2},{0xBCAD, 0x93C3},{0xBCAE, 0x93C4}, - {0xBCAF, 0x93C5},{0xBCB0, 0xBAA8},{0xBCB1, 0xBAA9},{0xBCB2, 0x93C6},{0xBCB3, 0xBAAA},{0xBCB4, 0xBAAB},{0xBCB5, 0xBAAC},{0xBCB6, 0x93C7}, - {0xBCB7, 0x93C8},{0xBCB8, 0x93C9},{0xBCB9, 0x93CA},{0xBCBA, 0x93CB},{0xBCBB, 0x93CC},{0xBCBC, 0xBAAD},{0xBCBD, 0xBAAE},{0xBCBE, 0x93CD}, - {0xBCBF, 0x93CE},{0xBCC0, 0xBAAF},{0xBCC1, 0x93CF},{0xBCC2, 0x93D0},{0xBCC3, 0x93D1},{0xBCC4, 0xBAB0},{0xBCC5, 0x93D2},{0xBCC6, 0x93D3}, - {0xBCC7, 0x93D4},{0xBCC8, 0x93D5},{0xBCC9, 0x93D6},{0xBCCA, 0x93D7},{0xBCCB, 0x93D8},{0xBCCC, 0x93D9},{0xBCCD, 0xBAB1},{0xBCCE, 0x93DA}, - {0xBCCF, 0xBAB2},{0xBCD0, 0xBAB3},{0xBCD1, 0xBAB4},{0xBCD2, 0x93DB},{0xBCD3, 0x93DC},{0xBCD4, 0x93DD},{0xBCD5, 0xBAB5},{0xBCD6, 0x93DE}, - {0xBCD7, 0x93DF},{0xBCD8, 0xBAB6},{0xBCD9, 0x93E0},{0xBCDA, 0x93E1},{0xBCDB, 0x93E2},{0xBCDC, 0xBAB7},{0xBCDD, 0x93E3},{0xBCDE, 0x93E4}, - {0xBCDF, 0x93E5},{0xBCE0, 0x93E6},{0xBCE1, 0x93E7},{0xBCE2, 0x93E8},{0xBCE3, 0x93E9},{0xBCE4, 0x93EA},{0xBCE5, 0x93EB},{0xBCE6, 0x93EC}, - {0xBCE7, 0x93ED},{0xBCE8, 0x93EE},{0xBCE9, 0x93EF},{0xBCEA, 0x93F0},{0xBCEB, 0x93F1},{0xBCEC, 0x93F2},{0xBCED, 0x93F3},{0xBCEE, 0x93F4}, - {0xBCEF, 0x93F5},{0xBCF0, 0x93F6},{0xBCF1, 0x93F7},{0xBCF2, 0x93F8},{0xBCF3, 0x93F9},{0xBCF4, 0xBAB8},{0xBCF5, 0xBAB9},{0xBCF6, 0xBABA}, - {0xBCF7, 0x93FA},{0xBCF8, 0xBABB},{0xBCF9, 0x93FB},{0xBCFA, 0x93FC},{0xBCFB, 0x93FD},{0xBCFC, 0xBABC},{0xBCFD, 0x93FE},{0xBCFE, 0x9441}, - {0xBCFF, 0x9442},{0xBD00, 0x9443},{0xBD01, 0x9444},{0xBD02, 0x9445},{0xBD03, 0x9446},{0xBD04, 0xBABD},{0xBD05, 0xBABE},{0xBD06, 0x9447}, - {0xBD07, 0xBABF},{0xBD08, 0x9448},{0xBD09, 0xBAC0},{0xBD0A, 0x9449},{0xBD0B, 0x944A},{0xBD0C, 0x944B},{0xBD0D, 0x944C},{0xBD0E, 0x944D}, - {0xBD0F, 0x944E},{0xBD10, 0xBAC1},{0xBD11, 0x944F},{0xBD12, 0x9450},{0xBD13, 0x9451},{0xBD14, 0xBAC2},{0xBD15, 0x9452},{0xBD16, 0x9453}, - {0xBD17, 0x9454},{0xBD18, 0x9455},{0xBD19, 0x9456},{0xBD1A, 0x9457},{0xBD1B, 0x9458},{0xBD1C, 0x9459},{0xBD1D, 0x945A},{0xBD1E, 0x9461}, - {0xBD1F, 0x9462},{0xBD20, 0x9463},{0xBD21, 0x9464},{0xBD22, 0x9465},{0xBD23, 0x9466},{0xBD24, 0xBAC3},{0xBD25, 0x9467},{0xBD26, 0x9468}, - {0xBD27, 0x9469},{0xBD28, 0x946A},{0xBD29, 0x946B},{0xBD2A, 0x946C},{0xBD2B, 0x946D},{0xBD2C, 0xBAC4},{0xBD2D, 0x946E},{0xBD2E, 0x946F}, - {0xBD2F, 0x9470},{0xBD30, 0x9471},{0xBD31, 0x9472},{0xBD32, 0x9473},{0xBD33, 0x9474},{0xBD34, 0x9475},{0xBD35, 0x9476},{0xBD36, 0x9477}, - {0xBD37, 0x9478},{0xBD38, 0x9479},{0xBD39, 0x947A},{0xBD3A, 0x9481},{0xBD3B, 0x9482},{0xBD3C, 0x9483},{0xBD3D, 0x9484},{0xBD3E, 0x9485}, - {0xBD3F, 0x9486},{0xBD40, 0xBAC5},{0xBD41, 0x9487},{0xBD42, 0x9488},{0xBD43, 0x9489},{0xBD44, 0x948A},{0xBD45, 0x948B},{0xBD46, 0x948C}, - {0xBD47, 0x948D},{0xBD48, 0xBAC6},{0xBD49, 0xBAC7},{0xBD4A, 0x948E},{0xBD4B, 0x948F},{0xBD4C, 0xBAC8},{0xBD4D, 0x9490},{0xBD4E, 0x9491}, - {0xBD4F, 0x9492},{0xBD50, 0xBAC9},{0xBD51, 0x9493},{0xBD52, 0x9494},{0xBD53, 0x9495},{0xBD54, 0x9496},{0xBD55, 0x9497},{0xBD56, 0x9498}, - {0xBD57, 0x9499},{0xBD58, 0xBACA},{0xBD59, 0xBACB},{0xBD5A, 0x949A},{0xBD5B, 0x949B},{0xBD5C, 0x949C},{0xBD5D, 0x949D},{0xBD5E, 0x949E}, - {0xBD5F, 0x949F},{0xBD60, 0x94A0},{0xBD61, 0x94A1},{0xBD62, 0x94A2},{0xBD63, 0x94A3},{0xBD64, 0xBACC},{0xBD65, 0x94A4},{0xBD66, 0x94A5}, - {0xBD67, 0x94A6},{0xBD68, 0xBACD},{0xBD69, 0x94A7},{0xBD6A, 0x94A8},{0xBD6B, 0x94A9},{0xBD6C, 0x94AA},{0xBD6D, 0x94AB},{0xBD6E, 0x94AC}, - {0xBD6F, 0x94AD},{0xBD70, 0x94AE},{0xBD71, 0x94AF},{0xBD72, 0x94B0},{0xBD73, 0x94B1},{0xBD74, 0x94B2},{0xBD75, 0x94B3},{0xBD76, 0x94B4}, - {0xBD77, 0x94B5},{0xBD78, 0x94B6},{0xBD79, 0x94B7},{0xBD7A, 0x94B8},{0xBD7B, 0x94B9},{0xBD7C, 0x94BA},{0xBD7D, 0x94BB},{0xBD7E, 0x94BC}, - {0xBD7F, 0x94BD},{0xBD80, 0xBACE},{0xBD81, 0xBACF},{0xBD82, 0x94BE},{0xBD83, 0x94BF},{0xBD84, 0xBAD0},{0xBD85, 0x94C0},{0xBD86, 0x94C1}, - {0xBD87, 0xBAD1},{0xBD88, 0xBAD2},{0xBD89, 0xBAD3},{0xBD8A, 0xBAD4},{0xBD8B, 0x94C2},{0xBD8C, 0x94C3},{0xBD8D, 0x94C4},{0xBD8E, 0x94C5}, - {0xBD8F, 0x94C6},{0xBD90, 0xBAD5},{0xBD91, 0xBAD6},{0xBD92, 0x94C7},{0xBD93, 0xBAD7},{0xBD94, 0x94C8},{0xBD95, 0xBAD8},{0xBD96, 0x94C9}, - {0xBD97, 0x94CA},{0xBD98, 0x94CB},{0xBD99, 0xBAD9},{0xBD9A, 0xBADA},{0xBD9B, 0x94CC},{0xBD9C, 0xBADB},{0xBD9D, 0x94CD},{0xBD9E, 0x94CE}, - {0xBD9F, 0x94CF},{0xBDA0, 0x94D0},{0xBDA1, 0x94D1},{0xBDA2, 0x94D2},{0xBDA3, 0x94D3},{0xBDA4, 0xBADC},{0xBDA5, 0x94D4},{0xBDA6, 0x94D5}, - {0xBDA7, 0x94D6},{0xBDA8, 0x94D7},{0xBDA9, 0x94D8},{0xBDAA, 0x94D9},{0xBDAB, 0x94DA},{0xBDAC, 0x94DB},{0xBDAD, 0x94DC},{0xBDAE, 0x94DD}, - {0xBDAF, 0x94DE},{0xBDB0, 0xBADD},{0xBDB1, 0x94DF},{0xBDB2, 0x94E0},{0xBDB3, 0x94E1},{0xBDB4, 0x94E2},{0xBDB5, 0x94E3},{0xBDB6, 0x94E4}, - {0xBDB7, 0x94E5},{0xBDB8, 0xBADE},{0xBDB9, 0x94E6},{0xBDBA, 0x94E7},{0xBDBB, 0x94E8},{0xBDBC, 0x94E9},{0xBDBD, 0x94EA},{0xBDBE, 0x94EB}, - {0xBDBF, 0x94EC},{0xBDC0, 0x94ED},{0xBDC1, 0x94EE},{0xBDC2, 0x94EF},{0xBDC3, 0x94F0},{0xBDC4, 0x94F1},{0xBDC5, 0x94F2},{0xBDC6, 0x94F3}, - {0xBDC7, 0x94F4},{0xBDC8, 0x94F5},{0xBDC9, 0x94F6},{0xBDCA, 0x94F7},{0xBDCB, 0x94F8},{0xBDCC, 0x94F9},{0xBDCD, 0x94FA},{0xBDCE, 0x94FB}, - {0xBDCF, 0x94FC},{0xBDD0, 0x94FD},{0xBDD1, 0x94FE},{0xBDD2, 0x9541},{0xBDD3, 0x9542},{0xBDD4, 0xBADF},{0xBDD5, 0xBAE0},{0xBDD6, 0x9543}, - {0xBDD7, 0x9544},{0xBDD8, 0xBAE1},{0xBDD9, 0x9545},{0xBDDA, 0x9546},{0xBDDB, 0x9547},{0xBDDC, 0xBAE2},{0xBDDD, 0x9548},{0xBDDE, 0x9549}, - {0xBDDF, 0x954A},{0xBDE0, 0x954B},{0xBDE1, 0x954C},{0xBDE2, 0x954D},{0xBDE3, 0x954E},{0xBDE4, 0x954F},{0xBDE5, 0x9550},{0xBDE6, 0x9551}, - {0xBDE7, 0x9552},{0xBDE8, 0x9553},{0xBDE9, 0xBAE3},{0xBDEA, 0x9554},{0xBDEB, 0x9555},{0xBDEC, 0x9556},{0xBDED, 0x9557},{0xBDEE, 0x9558}, - {0xBDEF, 0x9559},{0xBDF0, 0xBAE4},{0xBDF1, 0x955A},{0xBDF2, 0x9561},{0xBDF3, 0x9562},{0xBDF4, 0xBAE5},{0xBDF5, 0x9563},{0xBDF6, 0x9564}, - {0xBDF7, 0x9565},{0xBDF8, 0xBAE6},{0xBDF9, 0x9566},{0xBDFA, 0x9567},{0xBDFB, 0x9568},{0xBDFC, 0x9569},{0xBDFD, 0x956A},{0xBDFE, 0x956B}, - {0xBDFF, 0x956C},{0xBE00, 0xBAE7},{0xBE01, 0x956D},{0xBE02, 0x956E},{0xBE03, 0xBAE8},{0xBE04, 0x956F},{0xBE05, 0xBAE9},{0xBE06, 0x9570}, - {0xBE07, 0x9571},{0xBE08, 0x9572},{0xBE09, 0x9573},{0xBE0A, 0x9574},{0xBE0B, 0x9575},{0xBE0C, 0xBAEA},{0xBE0D, 0xBAEB},{0xBE0E, 0x9576}, - {0xBE0F, 0x9577},{0xBE10, 0xBAEC},{0xBE11, 0x9578},{0xBE12, 0x9579},{0xBE13, 0x957A},{0xBE14, 0xBAED},{0xBE15, 0x9581},{0xBE16, 0x9582}, - {0xBE17, 0x9583},{0xBE18, 0x9584},{0xBE19, 0x9585},{0xBE1A, 0x9586},{0xBE1B, 0x9587},{0xBE1C, 0xBAEE},{0xBE1D, 0xBAEF},{0xBE1E, 0x9588}, - {0xBE1F, 0xBAF0},{0xBE20, 0x9589},{0xBE21, 0x958A},{0xBE22, 0x958B},{0xBE23, 0x958C},{0xBE24, 0x958D},{0xBE25, 0x958E},{0xBE26, 0x958F}, - {0xBE27, 0x9590},{0xBE28, 0x9591},{0xBE29, 0x9592},{0xBE2A, 0x9593},{0xBE2B, 0x9594},{0xBE2C, 0x9595},{0xBE2D, 0x9596},{0xBE2E, 0x9597}, - {0xBE2F, 0x9598},{0xBE30, 0x9599},{0xBE31, 0x959A},{0xBE32, 0x959B},{0xBE33, 0x959C},{0xBE34, 0x959D},{0xBE35, 0x959E},{0xBE36, 0x959F}, - {0xBE37, 0x95A0},{0xBE38, 0x95A1},{0xBE39, 0x95A2},{0xBE3A, 0x95A3},{0xBE3B, 0x95A4},{0xBE3C, 0x95A5},{0xBE3D, 0x95A6},{0xBE3E, 0x95A7}, - {0xBE3F, 0x95A8},{0xBE40, 0x95A9},{0xBE41, 0x95AA},{0xBE42, 0x95AB},{0xBE43, 0x95AC},{0xBE44, 0xBAF1},{0xBE45, 0xBAF2},{0xBE46, 0x95AD}, - {0xBE47, 0x95AE},{0xBE48, 0xBAF3},{0xBE49, 0x95AF},{0xBE4A, 0x95B0},{0xBE4B, 0x95B1},{0xBE4C, 0xBAF4},{0xBE4D, 0x95B2},{0xBE4E, 0xBAF5}, - {0xBE4F, 0x95B3},{0xBE50, 0x95B4},{0xBE51, 0x95B5},{0xBE52, 0x95B6},{0xBE53, 0x95B7},{0xBE54, 0xBAF6},{0xBE55, 0xBAF7},{0xBE56, 0x95B8}, - {0xBE57, 0xBAF8},{0xBE58, 0x95B9},{0xBE59, 0xBAF9},{0xBE5A, 0xBAFA},{0xBE5B, 0xBAFB},{0xBE5C, 0x95BA},{0xBE5D, 0x95BB},{0xBE5E, 0x95BC}, - {0xBE5F, 0x95BD},{0xBE60, 0xBAFC},{0xBE61, 0xBAFD},{0xBE62, 0x95BE},{0xBE63, 0x95BF},{0xBE64, 0xBAFE},{0xBE65, 0x95C0},{0xBE66, 0x95C1}, - {0xBE67, 0x95C2},{0xBE68, 0xBBA1},{0xBE69, 0x95C3},{0xBE6A, 0xBBA2},{0xBE6B, 0x95C4},{0xBE6C, 0x95C5},{0xBE6D, 0x95C6},{0xBE6E, 0x95C7}, - {0xBE6F, 0x95C8},{0xBE70, 0xBBA3},{0xBE71, 0xBBA4},{0xBE72, 0x95C9},{0xBE73, 0xBBA5},{0xBE74, 0xBBA6},{0xBE75, 0xBBA7},{0xBE76, 0x95CA}, - {0xBE77, 0x95CB},{0xBE78, 0x95CC},{0xBE79, 0x95CD},{0xBE7A, 0x95CE},{0xBE7B, 0xBBA8},{0xBE7C, 0xBBA9},{0xBE7D, 0xBBAA},{0xBE7E, 0x95CF}, - {0xBE7F, 0x95D0},{0xBE80, 0xBBAB},{0xBE81, 0x95D1},{0xBE82, 0x95D2},{0xBE83, 0x95D3},{0xBE84, 0xBBAC},{0xBE85, 0x95D4},{0xBE86, 0x95D5}, - {0xBE87, 0x95D6},{0xBE88, 0x95D7},{0xBE89, 0x95D8},{0xBE8A, 0x95D9},{0xBE8B, 0x95DA},{0xBE8C, 0xBBAD},{0xBE8D, 0xBBAE},{0xBE8E, 0x95DB}, - {0xBE8F, 0xBBAF},{0xBE90, 0xBBB0},{0xBE91, 0xBBB1},{0xBE92, 0x95DC},{0xBE93, 0x95DD},{0xBE94, 0x95DE},{0xBE95, 0x95DF},{0xBE96, 0x95E0}, - {0xBE97, 0x95E1},{0xBE98, 0xBBB2},{0xBE99, 0xBBB3},{0xBE9A, 0x95E2},{0xBE9B, 0x95E3},{0xBE9C, 0x95E4},{0xBE9D, 0x95E5},{0xBE9E, 0x95E6}, - {0xBE9F, 0x95E7},{0xBEA0, 0x95E8},{0xBEA1, 0x95E9},{0xBEA2, 0x95EA},{0xBEA3, 0x95EB},{0xBEA4, 0x95EC},{0xBEA5, 0x95ED},{0xBEA6, 0x95EE}, - {0xBEA7, 0x95EF},{0xBEA8, 0xBBB4},{0xBEA9, 0x95F0},{0xBEAA, 0x95F1},{0xBEAB, 0x95F2},{0xBEAC, 0x95F3},{0xBEAD, 0x95F4},{0xBEAE, 0x95F5}, - {0xBEAF, 0x95F6},{0xBEB0, 0x95F7},{0xBEB1, 0x95F8},{0xBEB2, 0x95F9},{0xBEB3, 0x95FA},{0xBEB4, 0x95FB},{0xBEB5, 0x95FC},{0xBEB6, 0x95FD}, - {0xBEB7, 0x95FE},{0xBEB8, 0x9641},{0xBEB9, 0x9642},{0xBEBA, 0x9643},{0xBEBB, 0x9644},{0xBEBC, 0x9645},{0xBEBD, 0x9646},{0xBEBE, 0x9647}, - {0xBEBF, 0x9648},{0xBEC0, 0x9649},{0xBEC1, 0x964A},{0xBEC2, 0x964B},{0xBEC3, 0x964C},{0xBEC4, 0x964D},{0xBEC5, 0x964E},{0xBEC6, 0x964F}, - {0xBEC7, 0x9650},{0xBEC8, 0x9651},{0xBEC9, 0x9652},{0xBECA, 0x9653},{0xBECB, 0x9654},{0xBECC, 0x9655},{0xBECD, 0x9656},{0xBECE, 0x9657}, - {0xBECF, 0x9658},{0xBED0, 0xBBB5},{0xBED1, 0xBBB6},{0xBED2, 0x9659},{0xBED3, 0x965A},{0xBED4, 0xBBB7},{0xBED5, 0x9661},{0xBED6, 0x9662}, - {0xBED7, 0xBBB8},{0xBED8, 0xBBB9},{0xBED9, 0x9663},{0xBEDA, 0x9664},{0xBEDB, 0x9665},{0xBEDC, 0x9666},{0xBEDD, 0x9667},{0xBEDE, 0x9668}, - {0xBEDF, 0x9669},{0xBEE0, 0xBBBA},{0xBEE1, 0x966A},{0xBEE2, 0x966B},{0xBEE3, 0xBBBB},{0xBEE4, 0xBBBC},{0xBEE5, 0xBBBD},{0xBEE6, 0x966C}, - {0xBEE7, 0x966D},{0xBEE8, 0x966E},{0xBEE9, 0x966F},{0xBEEA, 0x9670},{0xBEEB, 0x9671},{0xBEEC, 0xBBBE},{0xBEED, 0x9672},{0xBEEE, 0x9673}, - {0xBEEF, 0x9674},{0xBEF0, 0x9675},{0xBEF1, 0x9676},{0xBEF2, 0x9677},{0xBEF3, 0x9678},{0xBEF4, 0x9679},{0xBEF5, 0x967A},{0xBEF6, 0x9681}, - {0xBEF7, 0x9682},{0xBEF8, 0x9683},{0xBEF9, 0x9684},{0xBEFA, 0x9685},{0xBEFB, 0x9686},{0xBEFC, 0x9687},{0xBEFD, 0x9688},{0xBEFE, 0x9689}, - {0xBEFF, 0x968A},{0xBF00, 0x968B},{0xBF01, 0xBBBF},{0xBF02, 0x968C},{0xBF03, 0x968D},{0xBF04, 0x968E},{0xBF05, 0x968F},{0xBF06, 0x9690}, - {0xBF07, 0x9691},{0xBF08, 0xBBC0},{0xBF09, 0xBBC1},{0xBF0A, 0x9692},{0xBF0B, 0x9693},{0xBF0C, 0x9694},{0xBF0D, 0x9695},{0xBF0E, 0x9696}, - {0xBF0F, 0x9697},{0xBF10, 0x9698},{0xBF11, 0x9699},{0xBF12, 0x969A},{0xBF13, 0x969B},{0xBF14, 0x969C},{0xBF15, 0x969D},{0xBF16, 0x969E}, - {0xBF17, 0x969F},{0xBF18, 0xBBC2},{0xBF19, 0xBBC3},{0xBF1A, 0x96A0},{0xBF1B, 0xBBC4},{0xBF1C, 0xBBC5},{0xBF1D, 0xBBC6},{0xBF1E, 0x96A1}, - {0xBF1F, 0x96A2},{0xBF20, 0x96A3},{0xBF21, 0x96A4},{0xBF22, 0x96A5},{0xBF23, 0x96A6},{0xBF24, 0x96A7},{0xBF25, 0x96A8},{0xBF26, 0x96A9}, - {0xBF27, 0x96AA},{0xBF28, 0x96AB},{0xBF29, 0x96AC},{0xBF2A, 0x96AD},{0xBF2B, 0x96AE},{0xBF2C, 0x96AF},{0xBF2D, 0x96B0},{0xBF2E, 0x96B1}, - {0xBF2F, 0x96B2},{0xBF30, 0x96B3},{0xBF31, 0x96B4},{0xBF32, 0x96B5},{0xBF33, 0x96B6},{0xBF34, 0x96B7},{0xBF35, 0x96B8},{0xBF36, 0x96B9}, - {0xBF37, 0x96BA},{0xBF38, 0x96BB},{0xBF39, 0x96BC},{0xBF3A, 0x96BD},{0xBF3B, 0x96BE},{0xBF3C, 0x96BF},{0xBF3D, 0x96C0},{0xBF3E, 0x96C1}, - {0xBF3F, 0x96C2},{0xBF40, 0xBBC7},{0xBF41, 0xBBC8},{0xBF42, 0x96C3},{0xBF43, 0x96C4},{0xBF44, 0xBBC9},{0xBF45, 0x96C5},{0xBF46, 0x96C6}, - {0xBF47, 0x96C7},{0xBF48, 0xBBCA},{0xBF49, 0x96C8},{0xBF4A, 0x96C9},{0xBF4B, 0x96CA},{0xBF4C, 0x96CB},{0xBF4D, 0x96CC},{0xBF4E, 0x96CD}, - {0xBF4F, 0x96CE},{0xBF50, 0xBBCB},{0xBF51, 0xBBCC},{0xBF52, 0x96CF},{0xBF53, 0x96D0},{0xBF54, 0x96D1},{0xBF55, 0xBBCD},{0xBF56, 0x96D2}, - {0xBF57, 0x96D3},{0xBF58, 0x96D4},{0xBF59, 0x96D5},{0xBF5A, 0x96D6},{0xBF5B, 0x96D7},{0xBF5C, 0x96D8},{0xBF5D, 0x96D9},{0xBF5E, 0x96DA}, - {0xBF5F, 0x96DB},{0xBF60, 0x96DC},{0xBF61, 0x96DD},{0xBF62, 0x96DE},{0xBF63, 0x96DF},{0xBF64, 0x96E0},{0xBF65, 0x96E1},{0xBF66, 0x96E2}, - {0xBF67, 0x96E3},{0xBF68, 0x96E4},{0xBF69, 0x96E5},{0xBF6A, 0x96E6},{0xBF6B, 0x96E7},{0xBF6C, 0x96E8},{0xBF6D, 0x96E9},{0xBF6E, 0x96EA}, - {0xBF6F, 0x96EB},{0xBF70, 0x96EC},{0xBF71, 0x96ED},{0xBF72, 0x96EE},{0xBF73, 0x96EF},{0xBF74, 0x96F0},{0xBF75, 0x96F1},{0xBF76, 0x96F2}, - {0xBF77, 0x96F3},{0xBF78, 0x96F4},{0xBF79, 0x96F5},{0xBF7A, 0x96F6},{0xBF7B, 0x96F7},{0xBF7C, 0x96F8},{0xBF7D, 0x96F9},{0xBF7E, 0x96FA}, - {0xBF7F, 0x96FB},{0xBF80, 0x96FC},{0xBF81, 0x96FD},{0xBF82, 0x96FE},{0xBF83, 0x9741},{0xBF84, 0x9742},{0xBF85, 0x9743},{0xBF86, 0x9744}, - {0xBF87, 0x9745},{0xBF88, 0x9746},{0xBF89, 0x9747},{0xBF8A, 0x9748},{0xBF8B, 0x9749},{0xBF8C, 0x974A},{0xBF8D, 0x974B},{0xBF8E, 0x974C}, - {0xBF8F, 0x974D},{0xBF90, 0x974E},{0xBF91, 0x974F},{0xBF92, 0x9750},{0xBF93, 0x9751},{0xBF94, 0xBBCE},{0xBF95, 0x9752},{0xBF96, 0x9753}, - {0xBF97, 0x9754},{0xBF98, 0x9755},{0xBF99, 0x9756},{0xBF9A, 0x9757},{0xBF9B, 0x9758},{0xBF9C, 0x9759},{0xBF9D, 0x975A},{0xBF9E, 0x9761}, - {0xBF9F, 0x9762},{0xBFA0, 0x9763},{0xBFA1, 0x9764},{0xBFA2, 0x9765},{0xBFA3, 0x9766},{0xBFA4, 0x9767},{0xBFA5, 0x9768},{0xBFA6, 0x9769}, - {0xBFA7, 0x976A},{0xBFA8, 0x976B},{0xBFA9, 0x976C},{0xBFAA, 0x976D},{0xBFAB, 0x976E},{0xBFAC, 0x976F},{0xBFAD, 0x9770},{0xBFAE, 0x9771}, - {0xBFAF, 0x9772},{0xBFB0, 0xBBCF},{0xBFB1, 0x9773},{0xBFB2, 0x9774},{0xBFB3, 0x9775},{0xBFB4, 0x9776},{0xBFB5, 0x9777},{0xBFB6, 0x9778}, - {0xBFB7, 0x9779},{0xBFB8, 0x977A},{0xBFB9, 0x9781},{0xBFBA, 0x9782},{0xBFBB, 0x9783},{0xBFBC, 0x9784},{0xBFBD, 0x9785},{0xBFBE, 0x9786}, - {0xBFBF, 0x9787},{0xBFC0, 0x9788},{0xBFC1, 0x9789},{0xBFC2, 0x978A},{0xBFC3, 0x978B},{0xBFC4, 0x978C},{0xBFC5, 0xBBD0},{0xBFC6, 0x978D}, - {0xBFC7, 0x978E},{0xBFC8, 0x978F},{0xBFC9, 0x9790},{0xBFCA, 0x9791},{0xBFCB, 0x9792},{0xBFCC, 0xBBD1},{0xBFCD, 0xBBD2},{0xBFCE, 0x9793}, - {0xBFCF, 0x9794},{0xBFD0, 0xBBD3},{0xBFD1, 0x9795},{0xBFD2, 0x9796},{0xBFD3, 0x9797},{0xBFD4, 0xBBD4},{0xBFD5, 0x9798},{0xBFD6, 0x9799}, - {0xBFD7, 0x979A},{0xBFD8, 0x979B},{0xBFD9, 0x979C},{0xBFDA, 0x979D},{0xBFDB, 0x979E},{0xBFDC, 0xBBD5},{0xBFDD, 0x979F},{0xBFDE, 0x97A0}, - {0xBFDF, 0xBBD6},{0xBFE0, 0x97A1},{0xBFE1, 0xBBD7},{0xBFE2, 0x97A2},{0xBFE3, 0x97A3},{0xBFE4, 0x97A4},{0xBFE5, 0x97A5},{0xBFE6, 0x97A6}, - {0xBFE7, 0x97A7},{0xBFE8, 0x97A8},{0xBFE9, 0x97A9},{0xBFEA, 0x97AA},{0xBFEB, 0x97AB},{0xBFEC, 0x97AC},{0xBFED, 0x97AD},{0xBFEE, 0x97AE}, - {0xBFEF, 0x97AF},{0xBFF0, 0x97B0},{0xBFF1, 0x97B1},{0xBFF2, 0x97B2},{0xBFF3, 0x97B3},{0xBFF4, 0x97B4},{0xBFF5, 0x97B5},{0xBFF6, 0x97B6}, - {0xBFF7, 0x97B7},{0xBFF8, 0x97B8},{0xBFF9, 0x97B9},{0xBFFA, 0x97BA},{0xBFFB, 0x97BB},{0xBFFC, 0x97BC},{0xBFFD, 0x97BD},{0xBFFE, 0x97BE}, - {0xBFFF, 0x97BF},{0xC000, 0x97C0},{0xC001, 0x97C1},{0xC002, 0x97C2},{0xC003, 0x97C3},{0xC004, 0x97C4},{0xC005, 0x97C5},{0xC006, 0x97C6}, - {0xC007, 0x97C7},{0xC008, 0x97C8},{0xC009, 0x97C9},{0xC00A, 0x97CA},{0xC00B, 0x97CB},{0xC00C, 0x97CC},{0xC00D, 0x97CD},{0xC00E, 0x97CE}, - {0xC00F, 0x97CF},{0xC010, 0x97D0},{0xC011, 0x97D1},{0xC012, 0x97D2},{0xC013, 0x97D3},{0xC014, 0x97D4},{0xC015, 0x97D5},{0xC016, 0x97D6}, - {0xC017, 0x97D7},{0xC018, 0x97D8},{0xC019, 0x97D9},{0xC01A, 0x97DA},{0xC01B, 0x97DB},{0xC01C, 0x97DC},{0xC01D, 0x97DD},{0xC01E, 0x97DE}, - {0xC01F, 0x97DF},{0xC020, 0x97E0},{0xC021, 0x97E1},{0xC022, 0x97E2},{0xC023, 0x97E3},{0xC024, 0x97E4},{0xC025, 0x97E5},{0xC026, 0x97E6}, - {0xC027, 0x97E7},{0xC028, 0x97E8},{0xC029, 0x97E9},{0xC02A, 0x97EA},{0xC02B, 0x97EB},{0xC02C, 0x97EC},{0xC02D, 0x97ED},{0xC02E, 0x97EE}, - {0xC02F, 0x97EF},{0xC030, 0x97F0},{0xC031, 0x97F1},{0xC032, 0x97F2},{0xC033, 0x97F3},{0xC034, 0x97F4},{0xC035, 0x97F5},{0xC036, 0x97F6}, - {0xC037, 0x97F7},{0xC038, 0x97F8},{0xC039, 0x97F9},{0xC03A, 0x97FA},{0xC03B, 0x97FB},{0xC03C, 0xBBD8},{0xC03D, 0x97FC},{0xC03E, 0x97FD}, - {0xC03F, 0x97FE},{0xC040, 0x9841},{0xC041, 0x9842},{0xC042, 0x9843},{0xC043, 0x9844},{0xC044, 0x9845},{0xC045, 0x9846},{0xC046, 0x9847}, - {0xC047, 0x9848},{0xC048, 0x9849},{0xC049, 0x984A},{0xC04A, 0x984B},{0xC04B, 0x984C},{0xC04C, 0x984D},{0xC04D, 0x984E},{0xC04E, 0x984F}, - {0xC04F, 0x9850},{0xC050, 0x9851},{0xC051, 0xBBD9},{0xC052, 0x9852},{0xC053, 0x9853},{0xC054, 0x9854},{0xC055, 0x9855},{0xC056, 0x9856}, - {0xC057, 0x9857},{0xC058, 0xBBDA},{0xC059, 0x9858},{0xC05A, 0x9859},{0xC05B, 0x985A},{0xC05C, 0xBBDB},{0xC05D, 0x9861},{0xC05E, 0x9862}, - {0xC05F, 0x9863},{0xC060, 0xBBDC},{0xC061, 0x9864},{0xC062, 0x9865},{0xC063, 0x9866},{0xC064, 0x9867},{0xC065, 0x9868},{0xC066, 0x9869}, - {0xC067, 0x986A},{0xC068, 0xBBDD},{0xC069, 0xBBDE},{0xC06A, 0x986B},{0xC06B, 0x986C},{0xC06C, 0x986D},{0xC06D, 0x986E},{0xC06E, 0x986F}, - {0xC06F, 0x9870},{0xC070, 0x9871},{0xC071, 0x9872},{0xC072, 0x9873},{0xC073, 0x9874},{0xC074, 0x9875},{0xC075, 0x9876},{0xC076, 0x9877}, - {0xC077, 0x9878},{0xC078, 0x9879},{0xC079, 0x987A},{0xC07A, 0x9881},{0xC07B, 0x9882},{0xC07C, 0x9883},{0xC07D, 0x9884},{0xC07E, 0x9885}, - {0xC07F, 0x9886},{0xC080, 0x9887},{0xC081, 0x9888},{0xC082, 0x9889},{0xC083, 0x988A},{0xC084, 0x988B},{0xC085, 0x988C},{0xC086, 0x988D}, - {0xC087, 0x988E},{0xC088, 0x988F},{0xC089, 0x9890},{0xC08A, 0x9891},{0xC08B, 0x9892},{0xC08C, 0x9893},{0xC08D, 0x9894},{0xC08E, 0x9895}, - {0xC08F, 0x9896},{0xC090, 0xBBDF},{0xC091, 0xBBE0},{0xC092, 0x9897},{0xC093, 0x9898},{0xC094, 0xBBE1},{0xC095, 0x9899},{0xC096, 0x989A}, - {0xC097, 0x989B},{0xC098, 0xBBE2},{0xC099, 0x989C},{0xC09A, 0x989D},{0xC09B, 0x989E},{0xC09C, 0x989F},{0xC09D, 0x98A0},{0xC09E, 0x98A1}, - {0xC09F, 0x98A2},{0xC0A0, 0xBBE3},{0xC0A1, 0xBBE4},{0xC0A2, 0x98A3},{0xC0A3, 0xBBE5},{0xC0A4, 0x98A4},{0xC0A5, 0xBBE6},{0xC0A6, 0x98A5}, - {0xC0A7, 0x98A6},{0xC0A8, 0x98A7},{0xC0A9, 0x98A8},{0xC0AA, 0x98A9},{0xC0AB, 0x98AA},{0xC0AC, 0xBBE7},{0xC0AD, 0xBBE8},{0xC0AE, 0x98AB}, - {0xC0AF, 0xBBE9},{0xC0B0, 0xBBEA},{0xC0B1, 0x98AC},{0xC0B2, 0x98AD},{0xC0B3, 0xBBEB},{0xC0B4, 0xBBEC},{0xC0B5, 0xBBED},{0xC0B6, 0xBBEE}, - {0xC0B7, 0x98AE},{0xC0B8, 0x98AF},{0xC0B9, 0x98B0},{0xC0BA, 0x98B1},{0xC0BB, 0x98B2},{0xC0BC, 0xBBEF},{0xC0BD, 0xBBF0},{0xC0BE, 0x98B3}, - {0xC0BF, 0xBBF1},{0xC0C0, 0xBBF2},{0xC0C1, 0xBBF3},{0xC0C2, 0x98B4},{0xC0C3, 0x98B5},{0xC0C4, 0x98B6},{0xC0C5, 0xBBF4},{0xC0C6, 0x98B7}, - {0xC0C7, 0x98B8},{0xC0C8, 0xBBF5},{0xC0C9, 0xBBF6},{0xC0CA, 0x98B9},{0xC0CB, 0x98BA},{0xC0CC, 0xBBF7},{0xC0CD, 0x98BB},{0xC0CE, 0x98BC}, - {0xC0CF, 0x98BD},{0xC0D0, 0xBBF8},{0xC0D1, 0x98BE},{0xC0D2, 0x98BF},{0xC0D3, 0x98C0},{0xC0D4, 0x98C1},{0xC0D5, 0x98C2},{0xC0D6, 0x98C3}, - {0xC0D7, 0x98C4},{0xC0D8, 0xBBF9},{0xC0D9, 0xBBFA},{0xC0DA, 0x98C5},{0xC0DB, 0xBBFB},{0xC0DC, 0xBBFC},{0xC0DD, 0xBBFD},{0xC0DE, 0x98C6}, - {0xC0DF, 0x98C7},{0xC0E0, 0x98C8},{0xC0E1, 0x98C9},{0xC0E2, 0x98CA},{0xC0E3, 0x98CB},{0xC0E4, 0xBBFE},{0xC0E5, 0xBCA1},{0xC0E6, 0x98CC}, - {0xC0E7, 0x98CD},{0xC0E8, 0xBCA2},{0xC0E9, 0x98CE},{0xC0EA, 0x98CF},{0xC0EB, 0x98D0},{0xC0EC, 0xBCA3},{0xC0ED, 0x98D1},{0xC0EE, 0x98D2}, - {0xC0EF, 0x98D3},{0xC0F0, 0x98D4},{0xC0F1, 0x98D5},{0xC0F2, 0x98D6},{0xC0F3, 0x98D7},{0xC0F4, 0xBCA4},{0xC0F5, 0xBCA5},{0xC0F6, 0x98D8}, - {0xC0F7, 0xBCA6},{0xC0F8, 0x98D9},{0xC0F9, 0xBCA7},{0xC0FA, 0x98DA},{0xC0FB, 0x98DB},{0xC0FC, 0x98DC},{0xC0FD, 0x98DD},{0xC0FE, 0x98DE}, - {0xC0FF, 0x98DF},{0xC100, 0xBCA8},{0xC101, 0x98E0},{0xC102, 0x98E1},{0xC103, 0x98E2},{0xC104, 0xBCA9},{0xC105, 0x98E3},{0xC106, 0x98E4}, - {0xC107, 0x98E5},{0xC108, 0xBCAA},{0xC109, 0x98E6},{0xC10A, 0x98E7},{0xC10B, 0x98E8},{0xC10C, 0x98E9},{0xC10D, 0x98EA},{0xC10E, 0x98EB}, - {0xC10F, 0x98EC},{0xC110, 0xBCAB},{0xC111, 0x98ED},{0xC112, 0x98EE},{0xC113, 0x98EF},{0xC114, 0x98F0},{0xC115, 0xBCAC},{0xC116, 0x98F1}, - {0xC117, 0x98F2},{0xC118, 0x98F3},{0xC119, 0x98F4},{0xC11A, 0x98F5},{0xC11B, 0x98F6},{0xC11C, 0xBCAD},{0xC11D, 0xBCAE},{0xC11E, 0xBCAF}, - {0xC11F, 0xBCB0},{0xC120, 0xBCB1},{0xC121, 0x98F7},{0xC122, 0x98F8},{0xC123, 0xBCB2},{0xC124, 0xBCB3},{0xC125, 0x98F9},{0xC126, 0xBCB4}, - {0xC127, 0xBCB5},{0xC128, 0x98FA},{0xC129, 0x98FB},{0xC12A, 0x98FC},{0xC12B, 0x98FD},{0xC12C, 0xBCB6},{0xC12D, 0xBCB7},{0xC12E, 0x98FE}, - {0xC12F, 0xBCB8},{0xC130, 0xBCB9},{0xC131, 0xBCBA},{0xC132, 0x9941},{0xC133, 0x9942},{0xC134, 0x9943},{0xC135, 0x9944},{0xC136, 0xBCBB}, - {0xC137, 0x9945},{0xC138, 0xBCBC},{0xC139, 0xBCBD},{0xC13A, 0x9946},{0xC13B, 0x9947},{0xC13C, 0xBCBE},{0xC13D, 0x9948},{0xC13E, 0x9949}, - {0xC13F, 0x994A},{0xC140, 0xBCBF},{0xC141, 0x994B},{0xC142, 0x994C},{0xC143, 0x994D},{0xC144, 0x994E},{0xC145, 0x994F},{0xC146, 0x9950}, - {0xC147, 0x9951},{0xC148, 0xBCC0},{0xC149, 0xBCC1},{0xC14A, 0x9952},{0xC14B, 0xBCC2},{0xC14C, 0xBCC3},{0xC14D, 0xBCC4},{0xC14E, 0x9953}, - {0xC14F, 0x9954},{0xC150, 0x9955},{0xC151, 0x9956},{0xC152, 0x9957},{0xC153, 0x9958},{0xC154, 0xBCC5},{0xC155, 0xBCC6},{0xC156, 0x9959}, - {0xC157, 0x995A},{0xC158, 0xBCC7},{0xC159, 0x9961},{0xC15A, 0x9962},{0xC15B, 0x9963},{0xC15C, 0xBCC8},{0xC15D, 0x9964},{0xC15E, 0x9965}, - {0xC15F, 0x9966},{0xC160, 0x9967},{0xC161, 0x9968},{0xC162, 0x9969},{0xC163, 0x996A},{0xC164, 0xBCC9},{0xC165, 0xBCCA},{0xC166, 0x996B}, - {0xC167, 0xBCCB},{0xC168, 0xBCCC},{0xC169, 0xBCCD},{0xC16A, 0x996C},{0xC16B, 0x996D},{0xC16C, 0x996E},{0xC16D, 0x996F},{0xC16E, 0x9970}, - {0xC16F, 0x9971},{0xC170, 0xBCCE},{0xC171, 0x9972},{0xC172, 0x9973},{0xC173, 0x9974},{0xC174, 0xBCCF},{0xC175, 0x9975},{0xC176, 0x9976}, - {0xC177, 0x9977},{0xC178, 0xBCD0},{0xC179, 0x9978},{0xC17A, 0x9979},{0xC17B, 0x997A},{0xC17C, 0x9981},{0xC17D, 0x9982},{0xC17E, 0x9983}, - {0xC17F, 0x9984},{0xC180, 0x9985},{0xC181, 0x9986},{0xC182, 0x9987},{0xC183, 0x9988},{0xC184, 0x9989},{0xC185, 0xBCD1},{0xC186, 0x998A}, - {0xC187, 0x998B},{0xC188, 0x998C},{0xC189, 0x998D},{0xC18A, 0x998E},{0xC18B, 0x998F},{0xC18C, 0xBCD2},{0xC18D, 0xBCD3},{0xC18E, 0xBCD4}, - {0xC18F, 0x9990},{0xC190, 0xBCD5},{0xC191, 0x9991},{0xC192, 0x9992},{0xC193, 0x9993},{0xC194, 0xBCD6},{0xC195, 0x9994},{0xC196, 0xBCD7}, - {0xC197, 0x9995},{0xC198, 0x9996},{0xC199, 0x9997},{0xC19A, 0x9998},{0xC19B, 0x9999},{0xC19C, 0xBCD8},{0xC19D, 0xBCD9},{0xC19E, 0x999A}, - {0xC19F, 0xBCDA},{0xC1A0, 0x999B},{0xC1A1, 0xBCDB},{0xC1A2, 0x999C},{0xC1A3, 0x999D},{0xC1A4, 0x999E},{0xC1A5, 0xBCDC},{0xC1A6, 0x999F}, - {0xC1A7, 0x99A0},{0xC1A8, 0xBCDD},{0xC1A9, 0xBCDE},{0xC1AA, 0x99A1},{0xC1AB, 0x99A2},{0xC1AC, 0xBCDF},{0xC1AD, 0x99A3},{0xC1AE, 0x99A4}, - {0xC1AF, 0x99A5},{0xC1B0, 0xBCE0},{0xC1B1, 0x99A6},{0xC1B2, 0x99A7},{0xC1B3, 0x99A8},{0xC1B4, 0x99A9},{0xC1B5, 0x99AA},{0xC1B6, 0x99AB}, - {0xC1B7, 0x99AC},{0xC1B8, 0x99AD},{0xC1B9, 0x99AE},{0xC1BA, 0x99AF},{0xC1BB, 0x99B0},{0xC1BC, 0x99B1},{0xC1BD, 0xBCE1},{0xC1BE, 0x99B2}, - {0xC1BF, 0x99B3},{0xC1C0, 0x99B4},{0xC1C1, 0x99B5},{0xC1C2, 0x99B6},{0xC1C3, 0x99B7},{0xC1C4, 0xBCE2},{0xC1C5, 0x99B8},{0xC1C6, 0x99B9}, - {0xC1C7, 0x99BA},{0xC1C8, 0xBCE3},{0xC1C9, 0x99BB},{0xC1CA, 0x99BC},{0xC1CB, 0x99BD},{0xC1CC, 0xBCE4},{0xC1CD, 0x99BE},{0xC1CE, 0x99BF}, - {0xC1CF, 0x99C0},{0xC1D0, 0x99C1},{0xC1D1, 0x99C2},{0xC1D2, 0x99C3},{0xC1D3, 0x99C4},{0xC1D4, 0xBCE5},{0xC1D5, 0x99C5},{0xC1D6, 0x99C6}, - {0xC1D7, 0xBCE6},{0xC1D8, 0xBCE7},{0xC1D9, 0x99C7},{0xC1DA, 0x99C8},{0xC1DB, 0x99C9},{0xC1DC, 0x99CA},{0xC1DD, 0x99CB},{0xC1DE, 0x99CC}, - {0xC1DF, 0x99CD},{0xC1E0, 0xBCE8},{0xC1E1, 0x99CE},{0xC1E2, 0x99CF},{0xC1E3, 0x99D0},{0xC1E4, 0xBCE9},{0xC1E5, 0x99D1},{0xC1E6, 0x99D2}, - {0xC1E7, 0x99D3},{0xC1E8, 0xBCEA},{0xC1E9, 0x99D4},{0xC1EA, 0x99D5},{0xC1EB, 0x99D6},{0xC1EC, 0x99D7},{0xC1ED, 0x99D8},{0xC1EE, 0x99D9}, - {0xC1EF, 0x99DA},{0xC1F0, 0xBCEB},{0xC1F1, 0xBCEC},{0xC1F2, 0x99DB},{0xC1F3, 0xBCED},{0xC1F4, 0x99DC},{0xC1F5, 0x99DD},{0xC1F6, 0x99DE}, - {0xC1F7, 0x99DF},{0xC1F8, 0x99E0},{0xC1F9, 0x99E1},{0xC1FA, 0x99E2},{0xC1FB, 0x99E3},{0xC1FC, 0xBCEE},{0xC1FD, 0xBCEF},{0xC1FE, 0x99E4}, - {0xC1FF, 0x99E5},{0xC200, 0xBCF0},{0xC201, 0x99E6},{0xC202, 0x99E7},{0xC203, 0x99E8},{0xC204, 0xBCF1},{0xC205, 0x99E9},{0xC206, 0x99EA}, - {0xC207, 0x99EB},{0xC208, 0x99EC},{0xC209, 0x99ED},{0xC20A, 0x99EE},{0xC20B, 0x99EF},{0xC20C, 0xBCF2},{0xC20D, 0xBCF3},{0xC20E, 0x99F0}, - {0xC20F, 0xBCF4},{0xC210, 0x99F1},{0xC211, 0xBCF5},{0xC212, 0x99F2},{0xC213, 0x99F3},{0xC214, 0x99F4},{0xC215, 0x99F5},{0xC216, 0x99F6}, - {0xC217, 0x99F7},{0xC218, 0xBCF6},{0xC219, 0xBCF7},{0xC21A, 0x99F8},{0xC21B, 0x99F9},{0xC21C, 0xBCF8},{0xC21D, 0x99FA},{0xC21E, 0x99FB}, - {0xC21F, 0xBCF9},{0xC220, 0xBCFA},{0xC221, 0x99FC},{0xC222, 0x99FD},{0xC223, 0x99FE},{0xC224, 0x9A41},{0xC225, 0x9A42},{0xC226, 0x9A43}, - {0xC227, 0x9A44},{0xC228, 0xBCFB},{0xC229, 0xBCFC},{0xC22A, 0x9A45},{0xC22B, 0xBCFD},{0xC22C, 0x9A46},{0xC22D, 0xBCFE},{0xC22E, 0x9A47}, - {0xC22F, 0xBDA1},{0xC230, 0x9A48},{0xC231, 0xBDA2},{0xC232, 0xBDA3},{0xC233, 0x9A49},{0xC234, 0xBDA4},{0xC235, 0x9A4A},{0xC236, 0x9A4B}, - {0xC237, 0x9A4C},{0xC238, 0x9A4D},{0xC239, 0x9A4E},{0xC23A, 0x9A4F},{0xC23B, 0x9A50},{0xC23C, 0x9A51},{0xC23D, 0x9A52},{0xC23E, 0x9A53}, - {0xC23F, 0x9A54},{0xC240, 0x9A55},{0xC241, 0x9A56},{0xC242, 0x9A57},{0xC243, 0x9A58},{0xC244, 0x9A59},{0xC245, 0x9A5A},{0xC246, 0x9A61}, - {0xC247, 0x9A62},{0xC248, 0xBDA5},{0xC249, 0x9A63},{0xC24A, 0x9A64},{0xC24B, 0x9A65},{0xC24C, 0x9A66},{0xC24D, 0x9A67},{0xC24E, 0x9A68}, - {0xC24F, 0x9A69},{0xC250, 0xBDA6},{0xC251, 0xBDA7},{0xC252, 0x9A6A},{0xC253, 0x9A6B},{0xC254, 0xBDA8},{0xC255, 0x9A6C},{0xC256, 0x9A6D}, - {0xC257, 0x9A6E},{0xC258, 0xBDA9},{0xC259, 0x9A6F},{0xC25A, 0x9A70},{0xC25B, 0x9A71},{0xC25C, 0x9A72},{0xC25D, 0x9A73},{0xC25E, 0x9A74}, - {0xC25F, 0x9A75},{0xC260, 0xBDAA},{0xC261, 0x9A76},{0xC262, 0x9A77},{0xC263, 0x9A78},{0xC264, 0x9A79},{0xC265, 0xBDAB},{0xC266, 0x9A7A}, - {0xC267, 0x9A81},{0xC268, 0x9A82},{0xC269, 0x9A83},{0xC26A, 0x9A84},{0xC26B, 0x9A85},{0xC26C, 0xBDAC},{0xC26D, 0xBDAD},{0xC26E, 0x9A86}, - {0xC26F, 0x9A87},{0xC270, 0xBDAE},{0xC271, 0x9A88},{0xC272, 0x9A89},{0xC273, 0x9A8A},{0xC274, 0xBDAF},{0xC275, 0x9A8B},{0xC276, 0x9A8C}, - {0xC277, 0x9A8D},{0xC278, 0x9A8E},{0xC279, 0x9A8F},{0xC27A, 0x9A90},{0xC27B, 0x9A91},{0xC27C, 0xBDB0},{0xC27D, 0xBDB1},{0xC27E, 0x9A92}, - {0xC27F, 0xBDB2},{0xC280, 0x9A93},{0xC281, 0xBDB3},{0xC282, 0x9A94},{0xC283, 0x9A95},{0xC284, 0x9A96},{0xC285, 0x9A97},{0xC286, 0x9A98}, - {0xC287, 0x9A99},{0xC288, 0xBDB4},{0xC289, 0xBDB5},{0xC28A, 0x9A9A},{0xC28B, 0x9A9B},{0xC28C, 0x9A9C},{0xC28D, 0x9A9D},{0xC28E, 0x9A9E}, - {0xC28F, 0x9A9F},{0xC290, 0xBDB6},{0xC291, 0x9AA0},{0xC292, 0x9AA1},{0xC293, 0x9AA2},{0xC294, 0x9AA3},{0xC295, 0x9AA4},{0xC296, 0x9AA5}, - {0xC297, 0x9AA6},{0xC298, 0xBDB7},{0xC299, 0x9AA7},{0xC29A, 0x9AA8},{0xC29B, 0xBDB8},{0xC29C, 0x9AA9},{0xC29D, 0xBDB9},{0xC29E, 0x9AAA}, - {0xC29F, 0x9AAB},{0xC2A0, 0x9AAC},{0xC2A1, 0x9AAD},{0xC2A2, 0x9AAE},{0xC2A3, 0x9AAF},{0xC2A4, 0xBDBA},{0xC2A5, 0xBDBB},{0xC2A6, 0x9AB0}, - {0xC2A7, 0x9AB1},{0xC2A8, 0xBDBC},{0xC2A9, 0x9AB2},{0xC2AA, 0x9AB3},{0xC2AB, 0x9AB4},{0xC2AC, 0xBDBD},{0xC2AD, 0xBDBE},{0xC2AE, 0x9AB5}, - {0xC2AF, 0x9AB6},{0xC2B0, 0x9AB7},{0xC2B1, 0x9AB8},{0xC2B2, 0x9AB9},{0xC2B3, 0x9ABA},{0xC2B4, 0xBDBF},{0xC2B5, 0xBDC0},{0xC2B6, 0x9ABB}, - {0xC2B7, 0xBDC1},{0xC2B8, 0x9ABC},{0xC2B9, 0xBDC2},{0xC2BA, 0x9ABD},{0xC2BB, 0x9ABE},{0xC2BC, 0x9ABF},{0xC2BD, 0x9AC0},{0xC2BE, 0x9AC1}, - {0xC2BF, 0x9AC2},{0xC2C0, 0x9AC3},{0xC2C1, 0x9AC4},{0xC2C2, 0x9AC5},{0xC2C3, 0x9AC6},{0xC2C4, 0x9AC7},{0xC2C5, 0x9AC8},{0xC2C6, 0x9AC9}, - {0xC2C7, 0x9ACA},{0xC2C8, 0x9ACB},{0xC2C9, 0x9ACC},{0xC2CA, 0x9ACD},{0xC2CB, 0x9ACE},{0xC2CC, 0x9ACF},{0xC2CD, 0x9AD0},{0xC2CE, 0x9AD1}, - {0xC2CF, 0x9AD2},{0xC2D0, 0x9AD3},{0xC2D1, 0x9AD4},{0xC2D2, 0x9AD5},{0xC2D3, 0x9AD6},{0xC2D4, 0x9AD7},{0xC2D5, 0x9AD8},{0xC2D6, 0x9AD9}, - {0xC2D7, 0x9ADA},{0xC2D8, 0x9ADB},{0xC2D9, 0x9ADC},{0xC2DA, 0x9ADD},{0xC2DB, 0x9ADE},{0xC2DC, 0xBDC3},{0xC2DD, 0xBDC4},{0xC2DE, 0x9ADF}, - {0xC2DF, 0x9AE0},{0xC2E0, 0xBDC5},{0xC2E1, 0x9AE1},{0xC2E2, 0x9AE2},{0xC2E3, 0xBDC6},{0xC2E4, 0xBDC7},{0xC2E5, 0x9AE3},{0xC2E6, 0x9AE4}, - {0xC2E7, 0x9AE5},{0xC2E8, 0x9AE6},{0xC2E9, 0x9AE7},{0xC2EA, 0x9AE8},{0xC2EB, 0xBDC8},{0xC2EC, 0xBDC9},{0xC2ED, 0xBDCA},{0xC2EE, 0x9AE9}, - {0xC2EF, 0xBDCB},{0xC2F0, 0x9AEA},{0xC2F1, 0xBDCC},{0xC2F2, 0x9AEB},{0xC2F3, 0x9AEC},{0xC2F4, 0x9AED},{0xC2F5, 0x9AEE},{0xC2F6, 0xBDCD}, - {0xC2F7, 0x9AEF},{0xC2F8, 0xBDCE},{0xC2F9, 0xBDCF},{0xC2FA, 0x9AF0},{0xC2FB, 0xBDD0},{0xC2FC, 0xBDD1},{0xC2FD, 0x9AF1},{0xC2FE, 0x9AF2}, - {0xC2FF, 0x9AF3},{0xC300, 0xBDD2},{0xC301, 0x9AF4},{0xC302, 0x9AF5},{0xC303, 0x9AF6},{0xC304, 0x9AF7},{0xC305, 0x9AF8},{0xC306, 0x9AF9}, - {0xC307, 0x9AFA},{0xC308, 0xBDD3},{0xC309, 0xBDD4},{0xC30A, 0x9AFB},{0xC30B, 0x9AFC},{0xC30C, 0xBDD5},{0xC30D, 0xBDD6},{0xC30E, 0x9AFD}, - {0xC30F, 0x9AFE},{0xC310, 0x9B41},{0xC311, 0x9B42},{0xC312, 0x9B43},{0xC313, 0xBDD7},{0xC314, 0xBDD8},{0xC315, 0xBDD9},{0xC316, 0x9B44}, - {0xC317, 0x9B45},{0xC318, 0xBDDA},{0xC319, 0x9B46},{0xC31A, 0x9B47},{0xC31B, 0x9B48},{0xC31C, 0xBDDB},{0xC31D, 0x9B49},{0xC31E, 0x9B4A}, - {0xC31F, 0x9B4B},{0xC320, 0x9B4C},{0xC321, 0x9B4D},{0xC322, 0x9B4E},{0xC323, 0x9B4F},{0xC324, 0xBDDC},{0xC325, 0xBDDD},{0xC326, 0x9B50}, - {0xC327, 0x9B51},{0xC328, 0xBDDE},{0xC329, 0xBDDF},{0xC32A, 0x9B52},{0xC32B, 0x9B53},{0xC32C, 0x9B54},{0xC32D, 0x9B55},{0xC32E, 0x9B56}, - {0xC32F, 0x9B57},{0xC330, 0x9B58},{0xC331, 0x9B59},{0xC332, 0x9B5A},{0xC333, 0x9B61},{0xC334, 0x9B62},{0xC335, 0x9B63},{0xC336, 0x9B64}, - {0xC337, 0x9B65},{0xC338, 0x9B66},{0xC339, 0x9B67},{0xC33A, 0x9B68},{0xC33B, 0x9B69},{0xC33C, 0x9B6A},{0xC33D, 0x9B6B},{0xC33E, 0x9B6C}, - {0xC33F, 0x9B6D},{0xC340, 0x9B6E},{0xC341, 0x9B6F},{0xC342, 0x9B70},{0xC343, 0x9B71},{0xC344, 0x9B72},{0xC345, 0xBDE0},{0xC346, 0x9B73}, - {0xC347, 0x9B74},{0xC348, 0x9B75},{0xC349, 0x9B76},{0xC34A, 0x9B77},{0xC34B, 0x9B78},{0xC34C, 0x9B79},{0xC34D, 0x9B7A},{0xC34E, 0x9B81}, - {0xC34F, 0x9B82},{0xC350, 0x9B83},{0xC351, 0x9B84},{0xC352, 0x9B85},{0xC353, 0x9B86},{0xC354, 0x9B87},{0xC355, 0x9B88},{0xC356, 0x9B89}, - {0xC357, 0x9B8A},{0xC358, 0x9B8B},{0xC359, 0x9B8C},{0xC35A, 0x9B8D},{0xC35B, 0x9B8E},{0xC35C, 0x9B8F},{0xC35D, 0x9B90},{0xC35E, 0x9B91}, - {0xC35F, 0x9B92},{0xC360, 0x9B93},{0xC361, 0x9B94},{0xC362, 0x9B95},{0xC363, 0x9B96},{0xC364, 0x9B97},{0xC365, 0x9B98},{0xC366, 0x9B99}, - {0xC367, 0x9B9A},{0xC368, 0xBDE1},{0xC369, 0xBDE2},{0xC36A, 0x9B9B},{0xC36B, 0x9B9C},{0xC36C, 0xBDE3},{0xC36D, 0x9B9D},{0xC36E, 0x9B9E}, - {0xC36F, 0x9B9F},{0xC370, 0xBDE4},{0xC371, 0x9BA0},{0xC372, 0xBDE5},{0xC373, 0x9BA1},{0xC374, 0x9BA2},{0xC375, 0x9BA3},{0xC376, 0x9BA4}, - {0xC377, 0x9BA5},{0xC378, 0xBDE6},{0xC379, 0xBDE7},{0xC37A, 0x9BA6},{0xC37B, 0x9BA7},{0xC37C, 0xBDE8},{0xC37D, 0xBDE9},{0xC37E, 0x9BA8}, - {0xC37F, 0x9BA9},{0xC380, 0x9BAA},{0xC381, 0x9BAB},{0xC382, 0x9BAC},{0xC383, 0x9BAD},{0xC384, 0xBDEA},{0xC385, 0x9BAE},{0xC386, 0x9BAF}, - {0xC387, 0x9BB0},{0xC388, 0xBDEB},{0xC389, 0x9BB1},{0xC38A, 0x9BB2},{0xC38B, 0x9BB3},{0xC38C, 0xBDEC},{0xC38D, 0x9BB4},{0xC38E, 0x9BB5}, - {0xC38F, 0x9BB6},{0xC390, 0x9BB7},{0xC391, 0x9BB8},{0xC392, 0x9BB9},{0xC393, 0x9BBA},{0xC394, 0x9BBB},{0xC395, 0x9BBC},{0xC396, 0x9BBD}, - {0xC397, 0x9BBE},{0xC398, 0x9BBF},{0xC399, 0x9BC0},{0xC39A, 0x9BC1},{0xC39B, 0x9BC2},{0xC39C, 0x9BC3},{0xC39D, 0x9BC4},{0xC39E, 0x9BC5}, - {0xC39F, 0x9BC6},{0xC3A0, 0x9BC7},{0xC3A1, 0x9BC8},{0xC3A2, 0x9BC9},{0xC3A3, 0x9BCA},{0xC3A4, 0x9BCB},{0xC3A5, 0x9BCC},{0xC3A6, 0x9BCD}, - {0xC3A7, 0x9BCE},{0xC3A8, 0x9BCF},{0xC3A9, 0x9BD0},{0xC3AA, 0x9BD1},{0xC3AB, 0x9BD2},{0xC3AC, 0x9BD3},{0xC3AD, 0x9BD4},{0xC3AE, 0x9BD5}, - {0xC3AF, 0x9BD6},{0xC3B0, 0x9BD7},{0xC3B1, 0x9BD8},{0xC3B2, 0x9BD9},{0xC3B3, 0x9BDA},{0xC3B4, 0x9BDB},{0xC3B5, 0x9BDC},{0xC3B6, 0x9BDD}, - {0xC3B7, 0x9BDE},{0xC3B8, 0x9BDF},{0xC3B9, 0x9BE0},{0xC3BA, 0x9BE1},{0xC3BB, 0x9BE2},{0xC3BC, 0x9BE3},{0xC3BD, 0x9BE4},{0xC3BE, 0x9BE5}, - {0xC3BF, 0x9BE6},{0xC3C0, 0xBDED},{0xC3C1, 0x9BE7},{0xC3C2, 0x9BE8},{0xC3C3, 0x9BE9},{0xC3C4, 0x9BEA},{0xC3C5, 0x9BEB},{0xC3C6, 0x9BEC}, - {0xC3C7, 0x9BED},{0xC3C8, 0x9BEE},{0xC3C9, 0x9BEF},{0xC3CA, 0x9BF0},{0xC3CB, 0x9BF1},{0xC3CC, 0x9BF2},{0xC3CD, 0x9BF3},{0xC3CE, 0x9BF4}, - {0xC3CF, 0x9BF5},{0xC3D0, 0x9BF6},{0xC3D1, 0x9BF7},{0xC3D2, 0x9BF8},{0xC3D3, 0x9BF9},{0xC3D4, 0x9BFA},{0xC3D5, 0x9BFB},{0xC3D6, 0x9BFC}, - {0xC3D7, 0x9BFD},{0xC3D8, 0xBDEE},{0xC3D9, 0xBDEF},{0xC3DA, 0x9BFE},{0xC3DB, 0x9C41},{0xC3DC, 0xBDF0},{0xC3DD, 0x9C42},{0xC3DE, 0x9C43}, - {0xC3DF, 0xBDF1},{0xC3E0, 0xBDF2},{0xC3E1, 0x9C44},{0xC3E2, 0xBDF3},{0xC3E3, 0x9C45},{0xC3E4, 0x9C46},{0xC3E5, 0x9C47},{0xC3E6, 0x9C48}, - {0xC3E7, 0x9C49},{0xC3E8, 0xBDF4},{0xC3E9, 0xBDF5},{0xC3EA, 0x9C4A},{0xC3EB, 0x9C4B},{0xC3EC, 0x9C4C},{0xC3ED, 0xBDF6},{0xC3EE, 0x9C4D}, - {0xC3EF, 0x9C4E},{0xC3F0, 0x9C4F},{0xC3F1, 0x9C50},{0xC3F2, 0x9C51},{0xC3F3, 0x9C52},{0xC3F4, 0xBDF7},{0xC3F5, 0xBDF8},{0xC3F6, 0x9C53}, - {0xC3F7, 0x9C54},{0xC3F8, 0xBDF9},{0xC3F9, 0x9C55},{0xC3FA, 0x9C56},{0xC3FB, 0x9C57},{0xC3FC, 0x9C58},{0xC3FD, 0x9C59},{0xC3FE, 0x9C5A}, - {0xC3FF, 0x9C61},{0xC400, 0x9C62},{0xC401, 0x9C63},{0xC402, 0x9C64},{0xC403, 0x9C65},{0xC404, 0x9C66},{0xC405, 0x9C67},{0xC406, 0x9C68}, - {0xC407, 0x9C69},{0xC408, 0xBDFA},{0xC409, 0x9C6A},{0xC40A, 0x9C6B},{0xC40B, 0x9C6C},{0xC40C, 0x9C6D},{0xC40D, 0x9C6E},{0xC40E, 0x9C6F}, - {0xC40F, 0x9C70},{0xC410, 0xBDFB},{0xC411, 0x9C71},{0xC412, 0x9C72},{0xC413, 0x9C73},{0xC414, 0x9C74},{0xC415, 0x9C75},{0xC416, 0x9C76}, - {0xC417, 0x9C77},{0xC418, 0x9C78},{0xC419, 0x9C79},{0xC41A, 0x9C7A},{0xC41B, 0x9C81},{0xC41C, 0x9C82},{0xC41D, 0x9C83},{0xC41E, 0x9C84}, - {0xC41F, 0x9C85},{0xC420, 0x9C86},{0xC421, 0x9C87},{0xC422, 0x9C88},{0xC423, 0x9C89},{0xC424, 0xBDFC},{0xC425, 0x9C8A},{0xC426, 0x9C8B}, - {0xC427, 0x9C8C},{0xC428, 0x9C8D},{0xC429, 0x9C8E},{0xC42A, 0x9C8F},{0xC42B, 0x9C90},{0xC42C, 0xBDFD},{0xC42D, 0x9C91},{0xC42E, 0x9C92}, - {0xC42F, 0x9C93},{0xC430, 0xBDFE},{0xC431, 0x9C94},{0xC432, 0x9C95},{0xC433, 0x9C96},{0xC434, 0xBEA1},{0xC435, 0x9C97},{0xC436, 0x9C98}, - {0xC437, 0x9C99},{0xC438, 0x9C9A},{0xC439, 0x9C9B},{0xC43A, 0x9C9C},{0xC43B, 0x9C9D},{0xC43C, 0xBEA2},{0xC43D, 0xBEA3},{0xC43E, 0x9C9E}, - {0xC43F, 0x9C9F},{0xC440, 0x9CA0},{0xC441, 0x9CA1},{0xC442, 0x9CA2},{0xC443, 0x9CA3},{0xC444, 0x9CA4},{0xC445, 0x9CA5},{0xC446, 0x9CA6}, - {0xC447, 0x9CA7},{0xC448, 0xBEA4},{0xC449, 0x9CA8},{0xC44A, 0x9CA9},{0xC44B, 0x9CAA},{0xC44C, 0x9CAB},{0xC44D, 0x9CAC},{0xC44E, 0x9CAD}, - {0xC44F, 0x9CAE},{0xC450, 0x9CAF},{0xC451, 0x9CB0},{0xC452, 0x9CB1},{0xC453, 0x9CB2},{0xC454, 0x9CB3},{0xC455, 0x9CB4},{0xC456, 0x9CB5}, - {0xC457, 0x9CB6},{0xC458, 0x9CB7},{0xC459, 0x9CB8},{0xC45A, 0x9CB9},{0xC45B, 0x9CBA},{0xC45C, 0x9CBB},{0xC45D, 0x9CBC},{0xC45E, 0x9CBD}, - {0xC45F, 0x9CBE},{0xC460, 0x9CBF},{0xC461, 0x9CC0},{0xC462, 0x9CC1},{0xC463, 0x9CC2},{0xC464, 0xBEA5},{0xC465, 0xBEA6},{0xC466, 0x9CC3}, - {0xC467, 0x9CC4},{0xC468, 0xBEA7},{0xC469, 0x9CC5},{0xC46A, 0x9CC6},{0xC46B, 0x9CC7},{0xC46C, 0xBEA8},{0xC46D, 0x9CC8},{0xC46E, 0x9CC9}, - {0xC46F, 0x9CCA},{0xC470, 0x9CCB},{0xC471, 0x9CCC},{0xC472, 0x9CCD},{0xC473, 0x9CCE},{0xC474, 0xBEA9},{0xC475, 0xBEAA},{0xC476, 0x9CCF}, - {0xC477, 0x9CD0},{0xC478, 0x9CD1},{0xC479, 0xBEAB},{0xC47A, 0x9CD2},{0xC47B, 0x9CD3},{0xC47C, 0x9CD4},{0xC47D, 0x9CD5},{0xC47E, 0x9CD6}, - {0xC47F, 0x9CD7},{0xC480, 0xBEAC},{0xC481, 0x9CD8},{0xC482, 0x9CD9},{0xC483, 0x9CDA},{0xC484, 0x9CDB},{0xC485, 0x9CDC},{0xC486, 0x9CDD}, - {0xC487, 0x9CDE},{0xC488, 0x9CDF},{0xC489, 0x9CE0},{0xC48A, 0x9CE1},{0xC48B, 0x9CE2},{0xC48C, 0x9CE3},{0xC48D, 0x9CE4},{0xC48E, 0x9CE5}, - {0xC48F, 0x9CE6},{0xC490, 0x9CE7},{0xC491, 0x9CE8},{0xC492, 0x9CE9},{0xC493, 0x9CEA},{0xC494, 0xBEAD},{0xC495, 0x9CEB},{0xC496, 0x9CEC}, - {0xC497, 0x9CED},{0xC498, 0x9CEE},{0xC499, 0x9CEF},{0xC49A, 0x9CF0},{0xC49B, 0x9CF1},{0xC49C, 0xBEAE},{0xC49D, 0x9CF2},{0xC49E, 0x9CF3}, - {0xC49F, 0x9CF4},{0xC4A0, 0x9CF5},{0xC4A1, 0x9CF6},{0xC4A2, 0x9CF7},{0xC4A3, 0x9CF8},{0xC4A4, 0x9CF9},{0xC4A5, 0x9CFA},{0xC4A6, 0x9CFB}, - {0xC4A7, 0x9CFC},{0xC4A8, 0x9CFD},{0xC4A9, 0x9CFE},{0xC4AA, 0x9D41},{0xC4AB, 0x9D42},{0xC4AC, 0x9D43},{0xC4AD, 0x9D44},{0xC4AE, 0x9D45}, - {0xC4AF, 0x9D46},{0xC4B0, 0x9D47},{0xC4B1, 0x9D48},{0xC4B2, 0x9D49},{0xC4B3, 0x9D4A},{0xC4B4, 0x9D4B},{0xC4B5, 0x9D4C},{0xC4B6, 0x9D4D}, - {0xC4B7, 0x9D4E},{0xC4B8, 0xBEAF},{0xC4B9, 0x9D4F},{0xC4BA, 0x9D50},{0xC4BB, 0x9D51},{0xC4BC, 0xBEB0},{0xC4BD, 0x9D52},{0xC4BE, 0x9D53}, - {0xC4BF, 0x9D54},{0xC4C0, 0x9D55},{0xC4C1, 0x9D56},{0xC4C2, 0x9D57},{0xC4C3, 0x9D58},{0xC4C4, 0x9D59},{0xC4C5, 0x9D5A},{0xC4C6, 0x9D61}, - {0xC4C7, 0x9D62},{0xC4C8, 0x9D63},{0xC4C9, 0x9D64},{0xC4CA, 0x9D65},{0xC4CB, 0x9D66},{0xC4CC, 0x9D67},{0xC4CD, 0x9D68},{0xC4CE, 0x9D69}, - {0xC4CF, 0x9D6A},{0xC4D0, 0x9D6B},{0xC4D1, 0x9D6C},{0xC4D2, 0x9D6D},{0xC4D3, 0x9D6E},{0xC4D4, 0x9D6F},{0xC4D5, 0x9D70},{0xC4D6, 0x9D71}, - {0xC4D7, 0x9D72},{0xC4D8, 0x9D73},{0xC4D9, 0x9D74},{0xC4DA, 0x9D75},{0xC4DB, 0x9D76},{0xC4DC, 0x9D77},{0xC4DD, 0x9D78},{0xC4DE, 0x9D79}, - {0xC4DF, 0x9D7A},{0xC4E0, 0x9D81},{0xC4E1, 0x9D82},{0xC4E2, 0x9D83},{0xC4E3, 0x9D84},{0xC4E4, 0x9D85},{0xC4E5, 0x9D86},{0xC4E6, 0x9D87}, - {0xC4E7, 0x9D88},{0xC4E8, 0x9D89},{0xC4E9, 0xBEB1},{0xC4EA, 0x9D8A},{0xC4EB, 0x9D8B},{0xC4EC, 0x9D8C},{0xC4ED, 0x9D8D},{0xC4EE, 0x9D8E}, - {0xC4EF, 0x9D8F},{0xC4F0, 0xBEB2},{0xC4F1, 0xBEB3},{0xC4F2, 0x9D90},{0xC4F3, 0x9D91},{0xC4F4, 0xBEB4},{0xC4F5, 0x9D92},{0xC4F6, 0x9D93}, - {0xC4F7, 0x9D94},{0xC4F8, 0xBEB5},{0xC4F9, 0x9D95},{0xC4FA, 0xBEB6},{0xC4FB, 0x9D96},{0xC4FC, 0x9D97},{0xC4FD, 0x9D98},{0xC4FE, 0x9D99}, - {0xC4FF, 0xBEB7},{0xC500, 0xBEB8},{0xC501, 0xBEB9},{0xC502, 0x9D9A},{0xC503, 0x9D9B},{0xC504, 0x9D9C},{0xC505, 0x9D9D},{0xC506, 0x9D9E}, - {0xC507, 0x9D9F},{0xC508, 0x9DA0},{0xC509, 0x9DA1},{0xC50A, 0x9DA2},{0xC50B, 0x9DA3},{0xC50C, 0xBEBA},{0xC50D, 0x9DA4},{0xC50E, 0x9DA5}, - {0xC50F, 0x9DA6},{0xC510, 0xBEBB},{0xC511, 0x9DA7},{0xC512, 0x9DA8},{0xC513, 0x9DA9},{0xC514, 0xBEBC},{0xC515, 0x9DAA},{0xC516, 0x9DAB}, - {0xC517, 0x9DAC},{0xC518, 0x9DAD},{0xC519, 0x9DAE},{0xC51A, 0x9DAF},{0xC51B, 0x9DB0},{0xC51C, 0xBEBD},{0xC51D, 0x9DB1},{0xC51E, 0x9DB2}, - {0xC51F, 0x9DB3},{0xC520, 0x9DB4},{0xC521, 0x9DB5},{0xC522, 0x9DB6},{0xC523, 0x9DB7},{0xC524, 0x9DB8},{0xC525, 0x9DB9},{0xC526, 0x9DBA}, - {0xC527, 0x9DBB},{0xC528, 0xBEBE},{0xC529, 0xBEBF},{0xC52A, 0x9DBC},{0xC52B, 0x9DBD},{0xC52C, 0xBEC0},{0xC52D, 0x9DBE},{0xC52E, 0x9DBF}, - {0xC52F, 0x9DC0},{0xC530, 0xBEC1},{0xC531, 0x9DC1},{0xC532, 0x9DC2},{0xC533, 0x9DC3},{0xC534, 0x9DC4},{0xC535, 0x9DC5},{0xC536, 0x9DC6}, - {0xC537, 0x9DC7},{0xC538, 0xBEC2},{0xC539, 0xBEC3},{0xC53A, 0x9DC8},{0xC53B, 0xBEC4},{0xC53C, 0x9DC9},{0xC53D, 0xBEC5},{0xC53E, 0x9DCA}, - {0xC53F, 0x9DCB},{0xC540, 0x9DCC},{0xC541, 0x9DCD},{0xC542, 0x9DCE},{0xC543, 0x9DCF},{0xC544, 0xBEC6},{0xC545, 0xBEC7},{0xC546, 0x9DD0}, - {0xC547, 0x9DD1},{0xC548, 0xBEC8},{0xC549, 0xBEC9},{0xC54A, 0xBECA},{0xC54B, 0x9DD2},{0xC54C, 0xBECB},{0xC54D, 0xBECC},{0xC54E, 0xBECD}, - {0xC54F, 0x9DD3},{0xC550, 0x9DD4},{0xC551, 0x9DD5},{0xC552, 0x9DD6},{0xC553, 0xBECE},{0xC554, 0xBECF},{0xC555, 0xBED0},{0xC556, 0x9DD7}, - {0xC557, 0xBED1},{0xC558, 0xBED2},{0xC559, 0xBED3},{0xC55A, 0x9DD8},{0xC55B, 0x9DD9},{0xC55C, 0x9DDA},{0xC55D, 0xBED4},{0xC55E, 0xBED5}, - {0xC55F, 0x9DDB},{0xC560, 0xBED6},{0xC561, 0xBED7},{0xC562, 0x9DDC},{0xC563, 0x9DDD},{0xC564, 0xBED8},{0xC565, 0x9DDE},{0xC566, 0x9DDF}, - {0xC567, 0x9DE0},{0xC568, 0xBED9},{0xC569, 0x9DE1},{0xC56A, 0x9DE2},{0xC56B, 0x9DE3},{0xC56C, 0x9DE4},{0xC56D, 0x9DE5},{0xC56E, 0x9DE6}, - {0xC56F, 0x9DE7},{0xC570, 0xBEDA},{0xC571, 0xBEDB},{0xC572, 0x9DE8},{0xC573, 0xBEDC},{0xC574, 0xBEDD},{0xC575, 0xBEDE},{0xC576, 0x9DE9}, - {0xC577, 0x9DEA},{0xC578, 0x9DEB},{0xC579, 0x9DEC},{0xC57A, 0x9DED},{0xC57B, 0x9DEE},{0xC57C, 0xBEDF},{0xC57D, 0xBEE0},{0xC57E, 0x9DEF}, - {0xC57F, 0x9DF0},{0xC580, 0xBEE1},{0xC581, 0x9DF1},{0xC582, 0x9DF2},{0xC583, 0x9DF3},{0xC584, 0xBEE2},{0xC585, 0x9DF4},{0xC586, 0x9DF5}, - {0xC587, 0xBEE3},{0xC588, 0x9DF6},{0xC589, 0x9DF7},{0xC58A, 0x9DF8},{0xC58B, 0x9DF9},{0xC58C, 0xBEE4},{0xC58D, 0xBEE5},{0xC58E, 0x9DFA}, - {0xC58F, 0xBEE6},{0xC590, 0x9DFB},{0xC591, 0xBEE7},{0xC592, 0x9DFC},{0xC593, 0x9DFD},{0xC594, 0x9DFE},{0xC595, 0xBEE8},{0xC596, 0x9E41}, - {0xC597, 0xBEE9},{0xC598, 0xBEEA},{0xC599, 0x9E42},{0xC59A, 0x9E43},{0xC59B, 0x9E44},{0xC59C, 0xBEEB},{0xC59D, 0x9E45},{0xC59E, 0x9E46}, - {0xC59F, 0x9E47},{0xC5A0, 0xBEEC},{0xC5A1, 0x9E48},{0xC5A2, 0x9E49},{0xC5A3, 0x9E4A},{0xC5A4, 0x9E4B},{0xC5A5, 0x9E4C},{0xC5A6, 0x9E4D}, - {0xC5A7, 0x9E4E},{0xC5A8, 0x9E4F},{0xC5A9, 0xBEED},{0xC5AA, 0x9E50},{0xC5AB, 0x9E51},{0xC5AC, 0x9E52},{0xC5AD, 0x9E53},{0xC5AE, 0x9E54}, - {0xC5AF, 0x9E55},{0xC5B0, 0x9E56},{0xC5B1, 0x9E57},{0xC5B2, 0x9E58},{0xC5B3, 0x9E59},{0xC5B4, 0xBEEE},{0xC5B5, 0xBEEF},{0xC5B6, 0x9E5A}, - {0xC5B7, 0x9E61},{0xC5B8, 0xBEF0},{0xC5B9, 0xBEF1},{0xC5BA, 0x9E62},{0xC5BB, 0xBEF2},{0xC5BC, 0xBEF3},{0xC5BD, 0xBEF4},{0xC5BE, 0xBEF5}, - {0xC5BF, 0x9E63},{0xC5C0, 0x9E64},{0xC5C1, 0x9E65},{0xC5C2, 0x9E66},{0xC5C3, 0x9E67},{0xC5C4, 0xBEF6},{0xC5C5, 0xBEF7},{0xC5C6, 0xBEF8}, - {0xC5C7, 0xBEF9},{0xC5C8, 0xBEFA},{0xC5C9, 0xBEFB},{0xC5CA, 0xBEFC},{0xC5CB, 0x9E68},{0xC5CC, 0xBEFD},{0xC5CD, 0x9E69},{0xC5CE, 0xBEFE}, - {0xC5CF, 0x9E6A},{0xC5D0, 0xBFA1},{0xC5D1, 0xBFA2},{0xC5D2, 0x9E6B},{0xC5D3, 0x9E6C},{0xC5D4, 0xBFA3},{0xC5D5, 0x9E6D},{0xC5D6, 0x9E6E}, - {0xC5D7, 0x9E6F},{0xC5D8, 0xBFA4},{0xC5D9, 0x9E70},{0xC5DA, 0x9E71},{0xC5DB, 0x9E72},{0xC5DC, 0x9E73},{0xC5DD, 0x9E74},{0xC5DE, 0x9E75}, - {0xC5DF, 0x9E76},{0xC5E0, 0xBFA5},{0xC5E1, 0xBFA6},{0xC5E2, 0x9E77},{0xC5E3, 0xBFA7},{0xC5E4, 0x9E78},{0xC5E5, 0xBFA8},{0xC5E6, 0x9E79}, - {0xC5E7, 0x9E7A},{0xC5E8, 0x9E81},{0xC5E9, 0x9E82},{0xC5EA, 0x9E83},{0xC5EB, 0x9E84},{0xC5EC, 0xBFA9},{0xC5ED, 0xBFAA},{0xC5EE, 0xBFAB}, - {0xC5EF, 0x9E85},{0xC5F0, 0xBFAC},{0xC5F1, 0x9E86},{0xC5F2, 0x9E87},{0xC5F3, 0x9E88},{0xC5F4, 0xBFAD},{0xC5F5, 0x9E89},{0xC5F6, 0xBFAE}, - {0xC5F7, 0xBFAF},{0xC5F8, 0x9E8A},{0xC5F9, 0x9E8B},{0xC5FA, 0x9E8C},{0xC5FB, 0x9E8D},{0xC5FC, 0xBFB0},{0xC5FD, 0xBFB1},{0xC5FE, 0xBFB2}, - {0xC5FF, 0xBFB3},{0xC600, 0xBFB4},{0xC601, 0xBFB5},{0xC602, 0x9E8E},{0xC603, 0x9E8F},{0xC604, 0x9E90},{0xC605, 0xBFB6},{0xC606, 0xBFB7}, - {0xC607, 0xBFB8},{0xC608, 0xBFB9},{0xC609, 0x9E91},{0xC60A, 0x9E92},{0xC60B, 0x9E93},{0xC60C, 0xBFBA},{0xC60D, 0x9E94},{0xC60E, 0x9E95}, - {0xC60F, 0x9E96},{0xC610, 0xBFBB},{0xC611, 0x9E97},{0xC612, 0x9E98},{0xC613, 0x9E99},{0xC614, 0x9E9A},{0xC615, 0x9E9B},{0xC616, 0x9E9C}, - {0xC617, 0x9E9D},{0xC618, 0xBFBC},{0xC619, 0xBFBD},{0xC61A, 0x9E9E},{0xC61B, 0xBFBE},{0xC61C, 0xBFBF},{0xC61D, 0x9E9F},{0xC61E, 0x9EA0}, - {0xC61F, 0x9EA1},{0xC620, 0x9EA2},{0xC621, 0x9EA3},{0xC622, 0x9EA4},{0xC623, 0x9EA5},{0xC624, 0xBFC0},{0xC625, 0xBFC1},{0xC626, 0x9EA6}, - {0xC627, 0x9EA7},{0xC628, 0xBFC2},{0xC629, 0x9EA8},{0xC62A, 0x9EA9},{0xC62B, 0x9EAA},{0xC62C, 0xBFC3},{0xC62D, 0xBFC4},{0xC62E, 0xBFC5}, - {0xC62F, 0x9EAB},{0xC630, 0xBFC6},{0xC631, 0x9EAC},{0xC632, 0x9EAD},{0xC633, 0xBFC7},{0xC634, 0xBFC8},{0xC635, 0xBFC9},{0xC636, 0x9EAE}, - {0xC637, 0xBFCA},{0xC638, 0x9EAF},{0xC639, 0xBFCB},{0xC63A, 0x9EB0},{0xC63B, 0xBFCC},{0xC63C, 0x9EB1},{0xC63D, 0x9EB2},{0xC63E, 0x9EB3}, - {0xC63F, 0x9EB4},{0xC640, 0xBFCD},{0xC641, 0xBFCE},{0xC642, 0x9EB5},{0xC643, 0x9EB6},{0xC644, 0xBFCF},{0xC645, 0x9EB7},{0xC646, 0x9EB8}, - {0xC647, 0x9EB9},{0xC648, 0xBFD0},{0xC649, 0x9EBA},{0xC64A, 0x9EBB},{0xC64B, 0x9EBC},{0xC64C, 0x9EBD},{0xC64D, 0x9EBE},{0xC64E, 0x9EBF}, - {0xC64F, 0x9EC0},{0xC650, 0xBFD1},{0xC651, 0xBFD2},{0xC652, 0x9EC1},{0xC653, 0xBFD3},{0xC654, 0xBFD4},{0xC655, 0xBFD5},{0xC656, 0x9EC2}, - {0xC657, 0x9EC3},{0xC658, 0x9EC4},{0xC659, 0x9EC5},{0xC65A, 0x9EC6},{0xC65B, 0x9EC7},{0xC65C, 0xBFD6},{0xC65D, 0xBFD7},{0xC65E, 0x9EC8}, - {0xC65F, 0x9EC9},{0xC660, 0xBFD8},{0xC661, 0x9ECA},{0xC662, 0x9ECB},{0xC663, 0x9ECC},{0xC664, 0x9ECD},{0xC665, 0x9ECE},{0xC666, 0x9ECF}, - {0xC667, 0x9ED0},{0xC668, 0x9ED1},{0xC669, 0x9ED2},{0xC66A, 0x9ED3},{0xC66B, 0x9ED4},{0xC66C, 0xBFD9},{0xC66D, 0x9ED5},{0xC66E, 0x9ED6}, - {0xC66F, 0xBFDA},{0xC670, 0x9ED7},{0xC671, 0xBFDB},{0xC672, 0x9ED8},{0xC673, 0x9ED9},{0xC674, 0x9EDA},{0xC675, 0x9EDB},{0xC676, 0x9EDC}, - {0xC677, 0x9EDD},{0xC678, 0xBFDC},{0xC679, 0xBFDD},{0xC67A, 0x9EDE},{0xC67B, 0x9EDF},{0xC67C, 0xBFDE},{0xC67D, 0x9EE0},{0xC67E, 0x9EE1}, - {0xC67F, 0x9EE2},{0xC680, 0xBFDF},{0xC681, 0x9EE3},{0xC682, 0x9EE4},{0xC683, 0x9EE5},{0xC684, 0x9EE6},{0xC685, 0x9EE7},{0xC686, 0x9EE8}, - {0xC687, 0x9EE9},{0xC688, 0xBFE0},{0xC689, 0xBFE1},{0xC68A, 0x9EEA},{0xC68B, 0xBFE2},{0xC68C, 0x9EEB},{0xC68D, 0xBFE3},{0xC68E, 0x9EEC}, - {0xC68F, 0x9EED},{0xC690, 0x9EEE},{0xC691, 0x9EEF},{0xC692, 0x9EF0},{0xC693, 0x9EF1},{0xC694, 0xBFE4},{0xC695, 0xBFE5},{0xC696, 0x9EF2}, - {0xC697, 0x9EF3},{0xC698, 0xBFE6},{0xC699, 0x9EF4},{0xC69A, 0x9EF5},{0xC69B, 0x9EF6},{0xC69C, 0xBFE7},{0xC69D, 0x9EF7},{0xC69E, 0x9EF8}, - {0xC69F, 0x9EF9},{0xC6A0, 0x9EFA},{0xC6A1, 0x9EFB},{0xC6A2, 0x9EFC},{0xC6A3, 0x9EFD},{0xC6A4, 0xBFE8},{0xC6A5, 0xBFE9},{0xC6A6, 0x9EFE}, - {0xC6A7, 0xBFEA},{0xC6A8, 0x9F41},{0xC6A9, 0xBFEB},{0xC6AA, 0x9F42},{0xC6AB, 0x9F43},{0xC6AC, 0x9F44},{0xC6AD, 0x9F45},{0xC6AE, 0x9F46}, - {0xC6AF, 0x9F47},{0xC6B0, 0xBFEC},{0xC6B1, 0xBFED},{0xC6B2, 0x9F48},{0xC6B3, 0x9F49},{0xC6B4, 0xBFEE},{0xC6B5, 0x9F4A},{0xC6B6, 0x9F4B}, - {0xC6B7, 0x9F4C},{0xC6B8, 0xBFEF},{0xC6B9, 0xBFF0},{0xC6BA, 0xBFF1},{0xC6BB, 0x9F4D},{0xC6BC, 0x9F4E},{0xC6BD, 0x9F4F},{0xC6BE, 0x9F50}, - {0xC6BF, 0x9F51},{0xC6C0, 0xBFF2},{0xC6C1, 0xBFF3},{0xC6C2, 0x9F52},{0xC6C3, 0xBFF4},{0xC6C4, 0x9F53},{0xC6C5, 0xBFF5},{0xC6C6, 0x9F54}, - {0xC6C7, 0x9F55},{0xC6C8, 0x9F56},{0xC6C9, 0x9F57},{0xC6CA, 0x9F58},{0xC6CB, 0x9F59},{0xC6CC, 0xBFF6},{0xC6CD, 0xBFF7},{0xC6CE, 0x9F5A}, - {0xC6CF, 0x9F61},{0xC6D0, 0xBFF8},{0xC6D1, 0x9F62},{0xC6D2, 0x9F63},{0xC6D3, 0x9F64},{0xC6D4, 0xBFF9},{0xC6D5, 0x9F65},{0xC6D6, 0x9F66}, - {0xC6D7, 0x9F67},{0xC6D8, 0x9F68},{0xC6D9, 0x9F69},{0xC6DA, 0x9F6A},{0xC6DB, 0x9F6B},{0xC6DC, 0xBFFA},{0xC6DD, 0xBFFB},{0xC6DE, 0x9F6C}, - {0xC6DF, 0x9F6D},{0xC6E0, 0xBFFC},{0xC6E1, 0xBFFD},{0xC6E2, 0x9F6E},{0xC6E3, 0x9F6F},{0xC6E4, 0x9F70},{0xC6E5, 0x9F71},{0xC6E6, 0x9F72}, - {0xC6E7, 0x9F73},{0xC6E8, 0xBFFE},{0xC6E9, 0xC0A1},{0xC6EA, 0x9F74},{0xC6EB, 0x9F75},{0xC6EC, 0xC0A2},{0xC6ED, 0x9F76},{0xC6EE, 0x9F77}, - {0xC6EF, 0x9F78},{0xC6F0, 0xC0A3},{0xC6F1, 0x9F79},{0xC6F2, 0x9F7A},{0xC6F3, 0x9F81},{0xC6F4, 0x9F82},{0xC6F5, 0x9F83},{0xC6F6, 0x9F84}, - {0xC6F7, 0x9F85},{0xC6F8, 0xC0A4},{0xC6F9, 0xC0A5},{0xC6FA, 0x9F86},{0xC6FB, 0x9F87},{0xC6FC, 0x9F88},{0xC6FD, 0xC0A6},{0xC6FE, 0x9F89}, - {0xC6FF, 0x9F8A},{0xC700, 0x9F8B},{0xC701, 0x9F8C},{0xC702, 0x9F8D},{0xC703, 0x9F8E},{0xC704, 0xC0A7},{0xC705, 0xC0A8},{0xC706, 0x9F8F}, - {0xC707, 0x9F90},{0xC708, 0xC0A9},{0xC709, 0x9F91},{0xC70A, 0x9F92},{0xC70B, 0x9F93},{0xC70C, 0xC0AA},{0xC70D, 0x9F94},{0xC70E, 0x9F95}, - {0xC70F, 0x9F96},{0xC710, 0x9F97},{0xC711, 0x9F98},{0xC712, 0x9F99},{0xC713, 0x9F9A},{0xC714, 0xC0AB},{0xC715, 0xC0AC},{0xC716, 0x9F9B}, - {0xC717, 0xC0AD},{0xC718, 0x9F9C},{0xC719, 0xC0AE},{0xC71A, 0x9F9D},{0xC71B, 0x9F9E},{0xC71C, 0x9F9F},{0xC71D, 0x9FA0},{0xC71E, 0x9FA1}, - {0xC71F, 0x9FA2},{0xC720, 0xC0AF},{0xC721, 0xC0B0},{0xC722, 0x9FA3},{0xC723, 0x9FA4},{0xC724, 0xC0B1},{0xC725, 0x9FA5},{0xC726, 0x9FA6}, - {0xC727, 0x9FA7},{0xC728, 0xC0B2},{0xC729, 0x9FA8},{0xC72A, 0x9FA9},{0xC72B, 0x9FAA},{0xC72C, 0x9FAB},{0xC72D, 0x9FAC},{0xC72E, 0x9FAD}, - {0xC72F, 0x9FAE},{0xC730, 0xC0B3},{0xC731, 0xC0B4},{0xC732, 0x9FAF},{0xC733, 0xC0B5},{0xC734, 0x9FB0},{0xC735, 0xC0B6},{0xC736, 0x9FB1}, - {0xC737, 0xC0B7},{0xC738, 0x9FB2},{0xC739, 0x9FB3},{0xC73A, 0x9FB4},{0xC73B, 0x9FB5},{0xC73C, 0xC0B8},{0xC73D, 0xC0B9},{0xC73E, 0x9FB6}, - {0xC73F, 0x9FB7},{0xC740, 0xC0BA},{0xC741, 0x9FB8},{0xC742, 0x9FB9},{0xC743, 0x9FBA},{0xC744, 0xC0BB},{0xC745, 0x9FBB},{0xC746, 0x9FBC}, - {0xC747, 0x9FBD},{0xC748, 0x9FBE},{0xC749, 0x9FBF},{0xC74A, 0xC0BC},{0xC74B, 0x9FC0},{0xC74C, 0xC0BD},{0xC74D, 0xC0BE},{0xC74E, 0x9FC1}, - {0xC74F, 0xC0BF},{0xC750, 0x9FC2},{0xC751, 0xC0C0},{0xC752, 0xC0C1},{0xC753, 0xC0C2},{0xC754, 0xC0C3},{0xC755, 0xC0C4},{0xC756, 0xC0C5}, - {0xC757, 0xC0C6},{0xC758, 0xC0C7},{0xC759, 0x9FC3},{0xC75A, 0x9FC4},{0xC75B, 0x9FC5},{0xC75C, 0xC0C8},{0xC75D, 0x9FC6},{0xC75E, 0x9FC7}, - {0xC75F, 0x9FC8},{0xC760, 0xC0C9},{0xC761, 0x9FC9},{0xC762, 0x9FCA},{0xC763, 0x9FCB},{0xC764, 0x9FCC},{0xC765, 0x9FCD},{0xC766, 0x9FCE}, - {0xC767, 0x9FCF},{0xC768, 0xC0CA},{0xC769, 0x9FD0},{0xC76A, 0x9FD1},{0xC76B, 0xC0CB},{0xC76C, 0x9FD2},{0xC76D, 0x9FD3},{0xC76E, 0x9FD4}, - {0xC76F, 0x9FD5},{0xC770, 0x9FD6},{0xC771, 0x9FD7},{0xC772, 0x9FD8},{0xC773, 0x9FD9},{0xC774, 0xC0CC},{0xC775, 0xC0CD},{0xC776, 0x9FDA}, - {0xC777, 0x9FDB},{0xC778, 0xC0CE},{0xC779, 0x9FDC},{0xC77A, 0x9FDD},{0xC77B, 0x9FDE},{0xC77C, 0xC0CF},{0xC77D, 0xC0D0},{0xC77E, 0xC0D1}, - {0xC77F, 0x9FDF},{0xC780, 0x9FE0},{0xC781, 0x9FE1},{0xC782, 0x9FE2},{0xC783, 0xC0D2},{0xC784, 0xC0D3},{0xC785, 0xC0D4},{0xC786, 0x9FE3}, - {0xC787, 0xC0D5},{0xC788, 0xC0D6},{0xC789, 0xC0D7},{0xC78A, 0xC0D8},{0xC78B, 0x9FE4},{0xC78C, 0x9FE5},{0xC78D, 0x9FE6},{0xC78E, 0xC0D9}, - {0xC78F, 0x9FE7},{0xC790, 0xC0DA},{0xC791, 0xC0DB},{0xC792, 0x9FE8},{0xC793, 0x9FE9},{0xC794, 0xC0DC},{0xC795, 0x9FEA},{0xC796, 0xC0DD}, - {0xC797, 0xC0DE},{0xC798, 0xC0DF},{0xC799, 0x9FEB},{0xC79A, 0xC0E0},{0xC79B, 0x9FEC},{0xC79C, 0x9FED},{0xC79D, 0x9FEE},{0xC79E, 0x9FEF}, - {0xC79F, 0x9FF0},{0xC7A0, 0xC0E1},{0xC7A1, 0xC0E2},{0xC7A2, 0x9FF1},{0xC7A3, 0xC0E3},{0xC7A4, 0xC0E4},{0xC7A5, 0xC0E5},{0xC7A6, 0xC0E6}, - {0xC7A7, 0x9FF2},{0xC7A8, 0x9FF3},{0xC7A9, 0x9FF4},{0xC7AA, 0x9FF5},{0xC7AB, 0x9FF6},{0xC7AC, 0xC0E7},{0xC7AD, 0xC0E8},{0xC7AE, 0x9FF7}, - {0xC7AF, 0x9FF8},{0xC7B0, 0xC0E9},{0xC7B1, 0x9FF9},{0xC7B2, 0x9FFA},{0xC7B3, 0x9FFB},{0xC7B4, 0xC0EA},{0xC7B5, 0x9FFC},{0xC7B6, 0x9FFD}, - {0xC7B7, 0x9FFE},{0xC7B8, 0xA041},{0xC7B9, 0xA042},{0xC7BA, 0xA043},{0xC7BB, 0xA044},{0xC7BC, 0xC0EB},{0xC7BD, 0xC0EC},{0xC7BE, 0xA045}, - {0xC7BF, 0xC0ED},{0xC7C0, 0xC0EE},{0xC7C1, 0xC0EF},{0xC7C2, 0xA046},{0xC7C3, 0xA047},{0xC7C4, 0xA048},{0xC7C5, 0xA049},{0xC7C6, 0xA04A}, - {0xC7C7, 0xA04B},{0xC7C8, 0xC0F0},{0xC7C9, 0xC0F1},{0xC7CA, 0xA04C},{0xC7CB, 0xA04D},{0xC7CC, 0xC0F2},{0xC7CD, 0xA04E},{0xC7CE, 0xC0F3}, - {0xC7CF, 0xA04F},{0xC7D0, 0xC0F4},{0xC7D1, 0xA050},{0xC7D2, 0xA051},{0xC7D3, 0xA052},{0xC7D4, 0xA053},{0xC7D5, 0xA054},{0xC7D6, 0xA055}, - {0xC7D7, 0xA056},{0xC7D8, 0xC0F5},{0xC7D9, 0xA057},{0xC7DA, 0xA058},{0xC7DB, 0xA059},{0xC7DC, 0xA05A},{0xC7DD, 0xC0F6},{0xC7DE, 0xA061}, - {0xC7DF, 0xA062},{0xC7E0, 0xA063},{0xC7E1, 0xA064},{0xC7E2, 0xA065},{0xC7E3, 0xA066},{0xC7E4, 0xC0F7},{0xC7E5, 0xA067},{0xC7E6, 0xA068}, - {0xC7E7, 0xA069},{0xC7E8, 0xC0F8},{0xC7E9, 0xA06A},{0xC7EA, 0xA06B},{0xC7EB, 0xA06C},{0xC7EC, 0xC0F9},{0xC7ED, 0xA06D},{0xC7EE, 0xA06E}, - {0xC7EF, 0xA06F},{0xC7F0, 0xA070},{0xC7F1, 0xA071},{0xC7F2, 0xA072},{0xC7F3, 0xA073},{0xC7F4, 0xA074},{0xC7F5, 0xA075},{0xC7F6, 0xA076}, - {0xC7F7, 0xA077},{0xC7F8, 0xA078},{0xC7F9, 0xA079},{0xC7FA, 0xA07A},{0xC7FB, 0xA081},{0xC7FC, 0xA082},{0xC7FD, 0xA083},{0xC7FE, 0xA084}, - {0xC7FF, 0xA085},{0xC800, 0xC0FA},{0xC801, 0xC0FB},{0xC802, 0xA086},{0xC803, 0xA087},{0xC804, 0xC0FC},{0xC805, 0xA088},{0xC806, 0xA089}, - {0xC807, 0xA08A},{0xC808, 0xC0FD},{0xC809, 0xA08B},{0xC80A, 0xC0FE},{0xC80B, 0xA08C},{0xC80C, 0xA08D},{0xC80D, 0xA08E},{0xC80E, 0xA08F}, - {0xC80F, 0xA090},{0xC810, 0xC1A1},{0xC811, 0xC1A2},{0xC812, 0xA091},{0xC813, 0xC1A3},{0xC814, 0xA092},{0xC815, 0xC1A4},{0xC816, 0xC1A5}, - {0xC817, 0xA093},{0xC818, 0xA094},{0xC819, 0xA095},{0xC81A, 0xA096},{0xC81B, 0xA097},{0xC81C, 0xC1A6},{0xC81D, 0xC1A7},{0xC81E, 0xA098}, - {0xC81F, 0xA099},{0xC820, 0xC1A8},{0xC821, 0xA09A},{0xC822, 0xA09B},{0xC823, 0xA09C},{0xC824, 0xC1A9},{0xC825, 0xA09D},{0xC826, 0xA09E}, - {0xC827, 0xA09F},{0xC828, 0xA0A0},{0xC829, 0xA0A1},{0xC82A, 0xA0A2},{0xC82B, 0xA0A3},{0xC82C, 0xC1AA},{0xC82D, 0xC1AB},{0xC82E, 0xA0A4}, - {0xC82F, 0xC1AC},{0xC830, 0xA0A5},{0xC831, 0xC1AD},{0xC832, 0xA0A6},{0xC833, 0xA0A7},{0xC834, 0xA0A8},{0xC835, 0xA0A9},{0xC836, 0xA0AA}, - {0xC837, 0xA0AB},{0xC838, 0xC1AE},{0xC839, 0xA0AC},{0xC83A, 0xA0AD},{0xC83B, 0xA0AE},{0xC83C, 0xC1AF},{0xC83D, 0xA0AF},{0xC83E, 0xA0B0}, - {0xC83F, 0xA0B1},{0xC840, 0xC1B0},{0xC841, 0xA0B2},{0xC842, 0xA0B3},{0xC843, 0xA0B4},{0xC844, 0xA0B5},{0xC845, 0xA0B6},{0xC846, 0xA0B7}, - {0xC847, 0xA0B8},{0xC848, 0xC1B1},{0xC849, 0xC1B2},{0xC84A, 0xA0B9},{0xC84B, 0xA0BA},{0xC84C, 0xC1B3},{0xC84D, 0xC1B4},{0xC84E, 0xA0BB}, - {0xC84F, 0xA0BC},{0xC850, 0xA0BD},{0xC851, 0xA0BE},{0xC852, 0xA0BF},{0xC853, 0xA0C0},{0xC854, 0xC1B5},{0xC855, 0xA0C1},{0xC856, 0xA0C2}, - {0xC857, 0xA0C3},{0xC858, 0xA0C4},{0xC859, 0xA0C5},{0xC85A, 0xA0C6},{0xC85B, 0xA0C7},{0xC85C, 0xA0C8},{0xC85D, 0xA0C9},{0xC85E, 0xA0CA}, - {0xC85F, 0xA0CB},{0xC860, 0xA0CC},{0xC861, 0xA0CD},{0xC862, 0xA0CE},{0xC863, 0xA0CF},{0xC864, 0xA0D0},{0xC865, 0xA0D1},{0xC866, 0xA0D2}, - {0xC867, 0xA0D3},{0xC868, 0xA0D4},{0xC869, 0xA0D5},{0xC86A, 0xA0D6},{0xC86B, 0xA0D7},{0xC86C, 0xA0D8},{0xC86D, 0xA0D9},{0xC86E, 0xA0DA}, - {0xC86F, 0xA0DB},{0xC870, 0xC1B6},{0xC871, 0xC1B7},{0xC872, 0xA0DC},{0xC873, 0xA0DD},{0xC874, 0xC1B8},{0xC875, 0xA0DE},{0xC876, 0xA0DF}, - {0xC877, 0xA0E0},{0xC878, 0xC1B9},{0xC879, 0xA0E1},{0xC87A, 0xC1BA},{0xC87B, 0xA0E2},{0xC87C, 0xA0E3},{0xC87D, 0xA0E4},{0xC87E, 0xA0E5}, - {0xC87F, 0xA0E6},{0xC880, 0xC1BB},{0xC881, 0xC1BC},{0xC882, 0xA0E7},{0xC883, 0xC1BD},{0xC884, 0xA0E8},{0xC885, 0xC1BE},{0xC886, 0xC1BF}, - {0xC887, 0xC1C0},{0xC888, 0xA0E9},{0xC889, 0xA0EA},{0xC88A, 0xA0EB},{0xC88B, 0xC1C1},{0xC88C, 0xC1C2},{0xC88D, 0xC1C3},{0xC88E, 0xA0EC}, - {0xC88F, 0xA0ED},{0xC890, 0xA0EE},{0xC891, 0xA0EF},{0xC892, 0xA0F0},{0xC893, 0xA0F1},{0xC894, 0xC1C4},{0xC895, 0xA0F2},{0xC896, 0xA0F3}, - {0xC897, 0xA0F4},{0xC898, 0xA0F5},{0xC899, 0xA0F6},{0xC89A, 0xA0F7},{0xC89B, 0xA0F8},{0xC89C, 0xA0F9},{0xC89D, 0xC1C5},{0xC89E, 0xA0FA}, - {0xC89F, 0xC1C6},{0xC8A0, 0xA0FB},{0xC8A1, 0xC1C7},{0xC8A2, 0xA0FC},{0xC8A3, 0xA0FD},{0xC8A4, 0xA0FE},{0xC8A5, 0xA141},{0xC8A6, 0xA142}, - {0xC8A7, 0xA143},{0xC8A8, 0xC1C8},{0xC8A9, 0xA144},{0xC8AA, 0xA145},{0xC8AB, 0xA146},{0xC8AC, 0xA147},{0xC8AD, 0xA148},{0xC8AE, 0xA149}, - {0xC8AF, 0xA14A},{0xC8B0, 0xA14B},{0xC8B1, 0xA14C},{0xC8B2, 0xA14D},{0xC8B3, 0xA14E},{0xC8B4, 0xA14F},{0xC8B5, 0xA150},{0xC8B6, 0xA151}, - {0xC8B7, 0xA152},{0xC8B8, 0xA153},{0xC8B9, 0xA154},{0xC8BA, 0xA155},{0xC8BB, 0xA156},{0xC8BC, 0xC1C9},{0xC8BD, 0xC1CA},{0xC8BE, 0xA157}, - {0xC8BF, 0xA158},{0xC8C0, 0xA159},{0xC8C1, 0xA15A},{0xC8C2, 0xA161},{0xC8C3, 0xA162},{0xC8C4, 0xC1CB},{0xC8C5, 0xA163},{0xC8C6, 0xA164}, - {0xC8C7, 0xA165},{0xC8C8, 0xC1CC},{0xC8C9, 0xA166},{0xC8CA, 0xA167},{0xC8CB, 0xA168},{0xC8CC, 0xC1CD},{0xC8CD, 0xA169},{0xC8CE, 0xA16A}, - {0xC8CF, 0xA16B},{0xC8D0, 0xA16C},{0xC8D1, 0xA16D},{0xC8D2, 0xA16E},{0xC8D3, 0xA16F},{0xC8D4, 0xC1CE},{0xC8D5, 0xC1CF},{0xC8D6, 0xA170}, - {0xC8D7, 0xC1D0},{0xC8D8, 0xA171},{0xC8D9, 0xC1D1},{0xC8DA, 0xA172},{0xC8DB, 0xA173},{0xC8DC, 0xA174},{0xC8DD, 0xA175},{0xC8DE, 0xA176}, - {0xC8DF, 0xA177},{0xC8E0, 0xC1D2},{0xC8E1, 0xC1D3},{0xC8E2, 0xA178},{0xC8E3, 0xA179},{0xC8E4, 0xC1D4},{0xC8E5, 0xA17A},{0xC8E6, 0xA181}, - {0xC8E7, 0xA182},{0xC8E8, 0xA183},{0xC8E9, 0xA184},{0xC8EA, 0xA185},{0xC8EB, 0xA186},{0xC8EC, 0xA187},{0xC8ED, 0xA188},{0xC8EE, 0xA189}, - {0xC8EF, 0xA18A},{0xC8F0, 0xA18B},{0xC8F1, 0xA18C},{0xC8F2, 0xA18D},{0xC8F3, 0xA18E},{0xC8F4, 0xA18F},{0xC8F5, 0xC1D5},{0xC8F6, 0xA190}, - {0xC8F7, 0xA191},{0xC8F8, 0xA192},{0xC8F9, 0xA193},{0xC8FA, 0xA194},{0xC8FB, 0xA195},{0xC8FC, 0xC1D6},{0xC8FD, 0xC1D7},{0xC8FE, 0xA196}, - {0xC8FF, 0xA197},{0xC900, 0xC1D8},{0xC901, 0xA198},{0xC902, 0xA199},{0xC903, 0xA19A},{0xC904, 0xC1D9},{0xC905, 0xC1DA},{0xC906, 0xC1DB}, - {0xC907, 0xA19B},{0xC908, 0xA19C},{0xC909, 0xA19D},{0xC90A, 0xA19E},{0xC90B, 0xA19F},{0xC90C, 0xC1DC},{0xC90D, 0xC1DD},{0xC90E, 0xA1A0}, - {0xC90F, 0xC1DE},{0xC910, 0xA241},{0xC911, 0xC1DF},{0xC912, 0xA242},{0xC913, 0xA243},{0xC914, 0xA244},{0xC915, 0xA245},{0xC916, 0xA246}, - {0xC917, 0xA247},{0xC918, 0xC1E0},{0xC919, 0xA248},{0xC91A, 0xA249},{0xC91B, 0xA24A},{0xC91C, 0xA24B},{0xC91D, 0xA24C},{0xC91E, 0xA24D}, - {0xC91F, 0xA24E},{0xC920, 0xA24F},{0xC921, 0xA250},{0xC922, 0xA251},{0xC923, 0xA252},{0xC924, 0xA253},{0xC925, 0xA254},{0xC926, 0xA255}, - {0xC927, 0xA256},{0xC928, 0xA257},{0xC929, 0xA258},{0xC92A, 0xA259},{0xC92B, 0xA25A},{0xC92C, 0xC1E1},{0xC92D, 0xA261},{0xC92E, 0xA262}, - {0xC92F, 0xA263},{0xC930, 0xA264},{0xC931, 0xA265},{0xC932, 0xA266},{0xC933, 0xA267},{0xC934, 0xC1E2},{0xC935, 0xA268},{0xC936, 0xA269}, - {0xC937, 0xA26A},{0xC938, 0xA26B},{0xC939, 0xA26C},{0xC93A, 0xA26D},{0xC93B, 0xA26E},{0xC93C, 0xA26F},{0xC93D, 0xA270},{0xC93E, 0xA271}, - {0xC93F, 0xA272},{0xC940, 0xA273},{0xC941, 0xA274},{0xC942, 0xA275},{0xC943, 0xA276},{0xC944, 0xA277},{0xC945, 0xA278},{0xC946, 0xA279}, - {0xC947, 0xA27A},{0xC948, 0xA281},{0xC949, 0xA282},{0xC94A, 0xA283},{0xC94B, 0xA284},{0xC94C, 0xA285},{0xC94D, 0xA286},{0xC94E, 0xA287}, - {0xC94F, 0xA288},{0xC950, 0xC1E3},{0xC951, 0xC1E4},{0xC952, 0xA289},{0xC953, 0xA28A},{0xC954, 0xC1E5},{0xC955, 0xA28B},{0xC956, 0xA28C}, - {0xC957, 0xA28D},{0xC958, 0xC1E6},{0xC959, 0xA28E},{0xC95A, 0xA28F},{0xC95B, 0xA290},{0xC95C, 0xA291},{0xC95D, 0xA292},{0xC95E, 0xA293}, - {0xC95F, 0xA294},{0xC960, 0xC1E7},{0xC961, 0xC1E8},{0xC962, 0xA295},{0xC963, 0xC1E9},{0xC964, 0xA296},{0xC965, 0xA297},{0xC966, 0xA298}, - {0xC967, 0xA299},{0xC968, 0xA29A},{0xC969, 0xA29B},{0xC96A, 0xA29C},{0xC96B, 0xA29D},{0xC96C, 0xC1EA},{0xC96D, 0xA29E},{0xC96E, 0xA29F}, - {0xC96F, 0xA2A0},{0xC970, 0xC1EB},{0xC971, 0xA341},{0xC972, 0xA342},{0xC973, 0xA343},{0xC974, 0xC1EC},{0xC975, 0xA344},{0xC976, 0xA345}, - {0xC977, 0xA346},{0xC978, 0xA347},{0xC979, 0xA348},{0xC97A, 0xA349},{0xC97B, 0xA34A},{0xC97C, 0xC1ED},{0xC97D, 0xA34B},{0xC97E, 0xA34C}, - {0xC97F, 0xA34D},{0xC980, 0xA34E},{0xC981, 0xA34F},{0xC982, 0xA350},{0xC983, 0xA351},{0xC984, 0xA352},{0xC985, 0xA353},{0xC986, 0xA354}, - {0xC987, 0xA355},{0xC988, 0xC1EE},{0xC989, 0xC1EF},{0xC98A, 0xA356},{0xC98B, 0xA357},{0xC98C, 0xC1F0},{0xC98D, 0xA358},{0xC98E, 0xA359}, - {0xC98F, 0xA35A},{0xC990, 0xC1F1},{0xC991, 0xA361},{0xC992, 0xA362},{0xC993, 0xA363},{0xC994, 0xA364},{0xC995, 0xA365},{0xC996, 0xA366}, - {0xC997, 0xA367},{0xC998, 0xC1F2},{0xC999, 0xC1F3},{0xC99A, 0xA368},{0xC99B, 0xC1F4},{0xC99C, 0xA369},{0xC99D, 0xC1F5},{0xC99E, 0xA36A}, - {0xC99F, 0xA36B},{0xC9A0, 0xA36C},{0xC9A1, 0xA36D},{0xC9A2, 0xA36E},{0xC9A3, 0xA36F},{0xC9A4, 0xA370},{0xC9A5, 0xA371},{0xC9A6, 0xA372}, - {0xC9A7, 0xA373},{0xC9A8, 0xA374},{0xC9A9, 0xA375},{0xC9AA, 0xA376},{0xC9AB, 0xA377},{0xC9AC, 0xA378},{0xC9AD, 0xA379},{0xC9AE, 0xA37A}, - {0xC9AF, 0xA381},{0xC9B0, 0xA382},{0xC9B1, 0xA383},{0xC9B2, 0xA384},{0xC9B3, 0xA385},{0xC9B4, 0xA386},{0xC9B5, 0xA387},{0xC9B6, 0xA388}, - {0xC9B7, 0xA389},{0xC9B8, 0xA38A},{0xC9B9, 0xA38B},{0xC9BA, 0xA38C},{0xC9BB, 0xA38D},{0xC9BC, 0xA38E},{0xC9BD, 0xA38F},{0xC9BE, 0xA390}, - {0xC9BF, 0xA391},{0xC9C0, 0xC1F6},{0xC9C1, 0xC1F7},{0xC9C2, 0xA392},{0xC9C3, 0xA393},{0xC9C4, 0xC1F8},{0xC9C5, 0xA394},{0xC9C6, 0xA395}, - {0xC9C7, 0xC1F9},{0xC9C8, 0xC1FA},{0xC9C9, 0xA396},{0xC9CA, 0xC1FB},{0xC9CB, 0xA397},{0xC9CC, 0xA398},{0xC9CD, 0xA399},{0xC9CE, 0xA39A}, - {0xC9CF, 0xA39B},{0xC9D0, 0xC1FC},{0xC9D1, 0xC1FD},{0xC9D2, 0xA39C},{0xC9D3, 0xC1FE},{0xC9D4, 0xA39D},{0xC9D5, 0xC2A1},{0xC9D6, 0xC2A2}, - {0xC9D7, 0xA39E},{0xC9D8, 0xA39F},{0xC9D9, 0xC2A3},{0xC9DA, 0xC2A4},{0xC9DB, 0xA3A0},{0xC9DC, 0xC2A5},{0xC9DD, 0xC2A6},{0xC9DE, 0xA441}, - {0xC9DF, 0xA442},{0xC9E0, 0xC2A7},{0xC9E1, 0xA443},{0xC9E2, 0xC2A8},{0xC9E3, 0xA444},{0xC9E4, 0xC2A9},{0xC9E5, 0xA445},{0xC9E6, 0xA446}, - {0xC9E7, 0xC2AA},{0xC9E8, 0xA447},{0xC9E9, 0xA448},{0xC9EA, 0xA449},{0xC9EB, 0xA44A},{0xC9EC, 0xC2AB},{0xC9ED, 0xC2AC},{0xC9EE, 0xA44B}, - {0xC9EF, 0xC2AD},{0xC9F0, 0xC2AE},{0xC9F1, 0xC2AF},{0xC9F2, 0xA44C},{0xC9F3, 0xA44D},{0xC9F4, 0xA44E},{0xC9F5, 0xA44F},{0xC9F6, 0xA450}, - {0xC9F7, 0xA451},{0xC9F8, 0xC2B0},{0xC9F9, 0xC2B1},{0xC9FA, 0xA452},{0xC9FB, 0xA453},{0xC9FC, 0xC2B2},{0xC9FD, 0xA454},{0xC9FE, 0xA455}, - {0xC9FF, 0xA456},{0xCA00, 0xC2B3},{0xCA01, 0xA457},{0xCA02, 0xA458},{0xCA03, 0xA459},{0xCA04, 0xA45A},{0xCA05, 0xA461},{0xCA06, 0xA462}, - {0xCA07, 0xA463},{0xCA08, 0xC2B4},{0xCA09, 0xC2B5},{0xCA0A, 0xA464},{0xCA0B, 0xC2B6},{0xCA0C, 0xC2B7},{0xCA0D, 0xC2B8},{0xCA0E, 0xA465}, - {0xCA0F, 0xA466},{0xCA10, 0xA467},{0xCA11, 0xA468},{0xCA12, 0xA469},{0xCA13, 0xA46A},{0xCA14, 0xC2B9},{0xCA15, 0xA46B},{0xCA16, 0xA46C}, - {0xCA17, 0xA46D},{0xCA18, 0xC2BA},{0xCA19, 0xA46E},{0xCA1A, 0xA46F},{0xCA1B, 0xA470},{0xCA1C, 0xA471},{0xCA1D, 0xA472},{0xCA1E, 0xA473}, - {0xCA1F, 0xA474},{0xCA20, 0xA475},{0xCA21, 0xA476},{0xCA22, 0xA477},{0xCA23, 0xA478},{0xCA24, 0xA479},{0xCA25, 0xA47A},{0xCA26, 0xA481}, - {0xCA27, 0xA482},{0xCA28, 0xA483},{0xCA29, 0xC2BB},{0xCA2A, 0xA484},{0xCA2B, 0xA485},{0xCA2C, 0xA486},{0xCA2D, 0xA487},{0xCA2E, 0xA488}, - {0xCA2F, 0xA489},{0xCA30, 0xA48A},{0xCA31, 0xA48B},{0xCA32, 0xA48C},{0xCA33, 0xA48D},{0xCA34, 0xA48E},{0xCA35, 0xA48F},{0xCA36, 0xA490}, - {0xCA37, 0xA491},{0xCA38, 0xA492},{0xCA39, 0xA493},{0xCA3A, 0xA494},{0xCA3B, 0xA495},{0xCA3C, 0xA496},{0xCA3D, 0xA497},{0xCA3E, 0xA498}, - {0xCA3F, 0xA499},{0xCA40, 0xA49A},{0xCA41, 0xA49B},{0xCA42, 0xA49C},{0xCA43, 0xA49D},{0xCA44, 0xA49E},{0xCA45, 0xA49F},{0xCA46, 0xA4A0}, - {0xCA47, 0xA541},{0xCA48, 0xA542},{0xCA49, 0xA543},{0xCA4A, 0xA544},{0xCA4B, 0xA545},{0xCA4C, 0xC2BC},{0xCA4D, 0xC2BD},{0xCA4E, 0xA546}, - {0xCA4F, 0xA547},{0xCA50, 0xC2BE},{0xCA51, 0xA548},{0xCA52, 0xA549},{0xCA53, 0xA54A},{0xCA54, 0xC2BF},{0xCA55, 0xA54B},{0xCA56, 0xA54C}, - {0xCA57, 0xA54D},{0xCA58, 0xA54E},{0xCA59, 0xA54F},{0xCA5A, 0xA550},{0xCA5B, 0xA551},{0xCA5C, 0xC2C0},{0xCA5D, 0xC2C1},{0xCA5E, 0xA552}, - {0xCA5F, 0xC2C2},{0xCA60, 0xC2C3},{0xCA61, 0xC2C4},{0xCA62, 0xA553},{0xCA63, 0xA554},{0xCA64, 0xA555},{0xCA65, 0xA556},{0xCA66, 0xA557}, - {0xCA67, 0xA558},{0xCA68, 0xC2C5},{0xCA69, 0xA559},{0xCA6A, 0xA55A},{0xCA6B, 0xA561},{0xCA6C, 0xA562},{0xCA6D, 0xA563},{0xCA6E, 0xA564}, - {0xCA6F, 0xA565},{0xCA70, 0xA566},{0xCA71, 0xA567},{0xCA72, 0xA568},{0xCA73, 0xA569},{0xCA74, 0xA56A},{0xCA75, 0xA56B},{0xCA76, 0xA56C}, - {0xCA77, 0xA56D},{0xCA78, 0xA56E},{0xCA79, 0xA56F},{0xCA7A, 0xA570},{0xCA7B, 0xA571},{0xCA7C, 0xA572},{0xCA7D, 0xC2C6},{0xCA7E, 0xA573}, - {0xCA7F, 0xA574},{0xCA80, 0xA575},{0xCA81, 0xA576},{0xCA82, 0xA577},{0xCA83, 0xA578},{0xCA84, 0xC2C7},{0xCA85, 0xA579},{0xCA86, 0xA57A}, - {0xCA87, 0xA581},{0xCA88, 0xA582},{0xCA89, 0xA583},{0xCA8A, 0xA584},{0xCA8B, 0xA585},{0xCA8C, 0xA586},{0xCA8D, 0xA587},{0xCA8E, 0xA588}, - {0xCA8F, 0xA589},{0xCA90, 0xA58A},{0xCA91, 0xA58B},{0xCA92, 0xA58C},{0xCA93, 0xA58D},{0xCA94, 0xA58E},{0xCA95, 0xA58F},{0xCA96, 0xA590}, - {0xCA97, 0xA591},{0xCA98, 0xC2C8},{0xCA99, 0xA592},{0xCA9A, 0xA593},{0xCA9B, 0xA594},{0xCA9C, 0xA595},{0xCA9D, 0xA596},{0xCA9E, 0xA597}, - {0xCA9F, 0xA598},{0xCAA0, 0xA599},{0xCAA1, 0xA59A},{0xCAA2, 0xA59B},{0xCAA3, 0xA59C},{0xCAA4, 0xA59D},{0xCAA5, 0xA59E},{0xCAA6, 0xA59F}, - {0xCAA7, 0xA5A0},{0xCAA8, 0xA641},{0xCAA9, 0xA642},{0xCAAA, 0xA643},{0xCAAB, 0xA644},{0xCAAC, 0xA645},{0xCAAD, 0xA646},{0xCAAE, 0xA647}, - {0xCAAF, 0xA648},{0xCAB0, 0xA649},{0xCAB1, 0xA64A},{0xCAB2, 0xA64B},{0xCAB3, 0xA64C},{0xCAB4, 0xA64D},{0xCAB5, 0xA64E},{0xCAB6, 0xA64F}, - {0xCAB7, 0xA650},{0xCAB8, 0xA651},{0xCAB9, 0xA652},{0xCABA, 0xA653},{0xCABB, 0xA654},{0xCABC, 0xC2C9},{0xCABD, 0xC2CA},{0xCABE, 0xA655}, - {0xCABF, 0xA656},{0xCAC0, 0xC2CB},{0xCAC1, 0xA657},{0xCAC2, 0xA658},{0xCAC3, 0xA659},{0xCAC4, 0xC2CC},{0xCAC5, 0xA65A},{0xCAC6, 0xA661}, - {0xCAC7, 0xA662},{0xCAC8, 0xA663},{0xCAC9, 0xA664},{0xCACA, 0xA665},{0xCACB, 0xA666},{0xCACC, 0xC2CD},{0xCACD, 0xC2CE},{0xCACE, 0xA667}, - {0xCACF, 0xC2CF},{0xCAD0, 0xA668},{0xCAD1, 0xC2D0},{0xCAD2, 0xA669},{0xCAD3, 0xC2D1},{0xCAD4, 0xA66A},{0xCAD5, 0xA66B},{0xCAD6, 0xA66C}, - {0xCAD7, 0xA66D},{0xCAD8, 0xC2D2},{0xCAD9, 0xC2D3},{0xCADA, 0xA66E},{0xCADB, 0xA66F},{0xCADC, 0xA670},{0xCADD, 0xA671},{0xCADE, 0xA672}, - {0xCADF, 0xA673},{0xCAE0, 0xC2D4},{0xCAE1, 0xA674},{0xCAE2, 0xA675},{0xCAE3, 0xA676},{0xCAE4, 0xA677},{0xCAE5, 0xA678},{0xCAE6, 0xA679}, - {0xCAE7, 0xA67A},{0xCAE8, 0xA681},{0xCAE9, 0xA682},{0xCAEA, 0xA683},{0xCAEB, 0xA684},{0xCAEC, 0xC2D5},{0xCAED, 0xA685},{0xCAEE, 0xA686}, - {0xCAEF, 0xA687},{0xCAF0, 0xA688},{0xCAF1, 0xA689},{0xCAF2, 0xA68A},{0xCAF3, 0xA68B},{0xCAF4, 0xC2D6},{0xCAF5, 0xA68C},{0xCAF6, 0xA68D}, - {0xCAF7, 0xA68E},{0xCAF8, 0xA68F},{0xCAF9, 0xA690},{0xCAFA, 0xA691},{0xCAFB, 0xA692},{0xCAFC, 0xA693},{0xCAFD, 0xA694},{0xCAFE, 0xA695}, - {0xCAFF, 0xA696},{0xCB00, 0xA697},{0xCB01, 0xA698},{0xCB02, 0xA699},{0xCB03, 0xA69A},{0xCB04, 0xA69B},{0xCB05, 0xA69C},{0xCB06, 0xA69D}, - {0xCB07, 0xA69E},{0xCB08, 0xC2D7},{0xCB09, 0xA69F},{0xCB0A, 0xA6A0},{0xCB0B, 0xA741},{0xCB0C, 0xA742},{0xCB0D, 0xA743},{0xCB0E, 0xA744}, - {0xCB0F, 0xA745},{0xCB10, 0xC2D8},{0xCB11, 0xA746},{0xCB12, 0xA747},{0xCB13, 0xA748},{0xCB14, 0xC2D9},{0xCB15, 0xA749},{0xCB16, 0xA74A}, - {0xCB17, 0xA74B},{0xCB18, 0xC2DA},{0xCB19, 0xA74C},{0xCB1A, 0xA74D},{0xCB1B, 0xA74E},{0xCB1C, 0xA74F},{0xCB1D, 0xA750},{0xCB1E, 0xA751}, - {0xCB1F, 0xA752},{0xCB20, 0xC2DB},{0xCB21, 0xC2DC},{0xCB22, 0xA753},{0xCB23, 0xA754},{0xCB24, 0xA755},{0xCB25, 0xA756},{0xCB26, 0xA757}, - {0xCB27, 0xA758},{0xCB28, 0xA759},{0xCB29, 0xA75A},{0xCB2A, 0xA761},{0xCB2B, 0xA762},{0xCB2C, 0xA763},{0xCB2D, 0xA764},{0xCB2E, 0xA765}, - {0xCB2F, 0xA766},{0xCB30, 0xA767},{0xCB31, 0xA768},{0xCB32, 0xA769},{0xCB33, 0xA76A},{0xCB34, 0xA76B},{0xCB35, 0xA76C},{0xCB36, 0xA76D}, - {0xCB37, 0xA76E},{0xCB38, 0xA76F},{0xCB39, 0xA770},{0xCB3A, 0xA771},{0xCB3B, 0xA772},{0xCB3C, 0xA773},{0xCB3D, 0xA774},{0xCB3E, 0xA775}, - {0xCB3F, 0xA776},{0xCB40, 0xA777},{0xCB41, 0xC2DD},{0xCB42, 0xA778},{0xCB43, 0xA779},{0xCB44, 0xA77A},{0xCB45, 0xA781},{0xCB46, 0xA782}, - {0xCB47, 0xA783},{0xCB48, 0xC2DE},{0xCB49, 0xC2DF},{0xCB4A, 0xA784},{0xCB4B, 0xA785},{0xCB4C, 0xC2E0},{0xCB4D, 0xA786},{0xCB4E, 0xA787}, - {0xCB4F, 0xA788},{0xCB50, 0xC2E1},{0xCB51, 0xA789},{0xCB52, 0xA78A},{0xCB53, 0xA78B},{0xCB54, 0xA78C},{0xCB55, 0xA78D},{0xCB56, 0xA78E}, - {0xCB57, 0xA78F},{0xCB58, 0xC2E2},{0xCB59, 0xC2E3},{0xCB5A, 0xA790},{0xCB5B, 0xA791},{0xCB5C, 0xA792},{0xCB5D, 0xC2E4},{0xCB5E, 0xA793}, - {0xCB5F, 0xA794},{0xCB60, 0xA795},{0xCB61, 0xA796},{0xCB62, 0xA797},{0xCB63, 0xA798},{0xCB64, 0xC2E5},{0xCB65, 0xA799},{0xCB66, 0xA79A}, - {0xCB67, 0xA79B},{0xCB68, 0xA79C},{0xCB69, 0xA79D},{0xCB6A, 0xA79E},{0xCB6B, 0xA79F},{0xCB6C, 0xA7A0},{0xCB6D, 0xA841},{0xCB6E, 0xA842}, - {0xCB6F, 0xA843},{0xCB70, 0xA844},{0xCB71, 0xA845},{0xCB72, 0xA846},{0xCB73, 0xA847},{0xCB74, 0xA848},{0xCB75, 0xA849},{0xCB76, 0xA84A}, - {0xCB77, 0xA84B},{0xCB78, 0xC2E6},{0xCB79, 0xC2E7},{0xCB7A, 0xA84C},{0xCB7B, 0xA84D},{0xCB7C, 0xA84E},{0xCB7D, 0xA84F},{0xCB7E, 0xA850}, - {0xCB7F, 0xA851},{0xCB80, 0xA852},{0xCB81, 0xA853},{0xCB82, 0xA854},{0xCB83, 0xA855},{0xCB84, 0xA856},{0xCB85, 0xA857},{0xCB86, 0xA858}, - {0xCB87, 0xA859},{0xCB88, 0xA85A},{0xCB89, 0xA861},{0xCB8A, 0xA862},{0xCB8B, 0xA863},{0xCB8C, 0xA864},{0xCB8D, 0xA865},{0xCB8E, 0xA866}, - {0xCB8F, 0xA867},{0xCB90, 0xA868},{0xCB91, 0xA869},{0xCB92, 0xA86A},{0xCB93, 0xA86B},{0xCB94, 0xA86C},{0xCB95, 0xA86D},{0xCB96, 0xA86E}, - {0xCB97, 0xA86F},{0xCB98, 0xA870},{0xCB99, 0xA871},{0xCB9A, 0xA872},{0xCB9B, 0xA873},{0xCB9C, 0xC2E8},{0xCB9D, 0xA874},{0xCB9E, 0xA875}, - {0xCB9F, 0xA876},{0xCBA0, 0xA877},{0xCBA1, 0xA878},{0xCBA2, 0xA879},{0xCBA3, 0xA87A},{0xCBA4, 0xA881},{0xCBA5, 0xA882},{0xCBA6, 0xA883}, - {0xCBA7, 0xA884},{0xCBA8, 0xA885},{0xCBA9, 0xA886},{0xCBAA, 0xA887},{0xCBAB, 0xA888},{0xCBAC, 0xA889},{0xCBAD, 0xA88A},{0xCBAE, 0xA88B}, - {0xCBAF, 0xA88C},{0xCBB0, 0xA88D},{0xCBB1, 0xA88E},{0xCBB2, 0xA88F},{0xCBB3, 0xA890},{0xCBB4, 0xA891},{0xCBB5, 0xA892},{0xCBB6, 0xA893}, - {0xCBB7, 0xA894},{0xCBB8, 0xC2E9},{0xCBB9, 0xA895},{0xCBBA, 0xA896},{0xCBBB, 0xA897},{0xCBBC, 0xA898},{0xCBBD, 0xA899},{0xCBBE, 0xA89A}, - {0xCBBF, 0xA89B},{0xCBC0, 0xA89C},{0xCBC1, 0xA89D},{0xCBC2, 0xA89E},{0xCBC3, 0xA89F},{0xCBC4, 0xA8A0},{0xCBC5, 0xA941},{0xCBC6, 0xA942}, - {0xCBC7, 0xA943},{0xCBC8, 0xA944},{0xCBC9, 0xA945},{0xCBCA, 0xA946},{0xCBCB, 0xA947},{0xCBCC, 0xA948},{0xCBCD, 0xA949},{0xCBCE, 0xA94A}, - {0xCBCF, 0xA94B},{0xCBD0, 0xA94C},{0xCBD1, 0xA94D},{0xCBD2, 0xA94E},{0xCBD3, 0xA94F},{0xCBD4, 0xC2EA},{0xCBD5, 0xA950},{0xCBD6, 0xA951}, - {0xCBD7, 0xA952},{0xCBD8, 0xA953},{0xCBD9, 0xA954},{0xCBDA, 0xA955},{0xCBDB, 0xA956},{0xCBDC, 0xA957},{0xCBDD, 0xA958},{0xCBDE, 0xA959}, - {0xCBDF, 0xA95A},{0xCBE0, 0xA961},{0xCBE1, 0xA962},{0xCBE2, 0xA963},{0xCBE3, 0xA964},{0xCBE4, 0xC2EB},{0xCBE5, 0xA965},{0xCBE6, 0xA966}, - {0xCBE7, 0xC2EC},{0xCBE8, 0xA967},{0xCBE9, 0xC2ED},{0xCBEA, 0xA968},{0xCBEB, 0xA969},{0xCBEC, 0xA96A},{0xCBED, 0xA96B},{0xCBEE, 0xA96C}, - {0xCBEF, 0xA96D},{0xCBF0, 0xA96E},{0xCBF1, 0xA96F},{0xCBF2, 0xA970},{0xCBF3, 0xA971},{0xCBF4, 0xA972},{0xCBF5, 0xA973},{0xCBF6, 0xA974}, - {0xCBF7, 0xA975},{0xCBF8, 0xA976},{0xCBF9, 0xA977},{0xCBFA, 0xA978},{0xCBFB, 0xA979},{0xCBFC, 0xA97A},{0xCBFD, 0xA981},{0xCBFE, 0xA982}, - {0xCBFF, 0xA983},{0xCC00, 0xA984},{0xCC01, 0xA985},{0xCC02, 0xA986},{0xCC03, 0xA987},{0xCC04, 0xA988},{0xCC05, 0xA989},{0xCC06, 0xA98A}, - {0xCC07, 0xA98B},{0xCC08, 0xA98C},{0xCC09, 0xA98D},{0xCC0A, 0xA98E},{0xCC0B, 0xA98F},{0xCC0C, 0xC2EE},{0xCC0D, 0xC2EF},{0xCC0E, 0xA990}, - {0xCC0F, 0xA991},{0xCC10, 0xC2F0},{0xCC11, 0xA992},{0xCC12, 0xA993},{0xCC13, 0xA994},{0xCC14, 0xC2F1},{0xCC15, 0xA995},{0xCC16, 0xA996}, - {0xCC17, 0xA997},{0xCC18, 0xA998},{0xCC19, 0xA999},{0xCC1A, 0xA99A},{0xCC1B, 0xA99B},{0xCC1C, 0xC2F2},{0xCC1D, 0xC2F3},{0xCC1E, 0xA99C}, - {0xCC1F, 0xA99D},{0xCC20, 0xA99E},{0xCC21, 0xC2F4},{0xCC22, 0xC2F5},{0xCC23, 0xA99F},{0xCC24, 0xA9A0},{0xCC25, 0xAA41},{0xCC26, 0xAA42}, - {0xCC27, 0xC2F6},{0xCC28, 0xC2F7},{0xCC29, 0xC2F8},{0xCC2A, 0xAA43},{0xCC2B, 0xAA44},{0xCC2C, 0xC2F9},{0xCC2D, 0xAA45},{0xCC2E, 0xC2FA}, - {0xCC2F, 0xAA46},{0xCC30, 0xC2FB},{0xCC31, 0xAA47},{0xCC32, 0xAA48},{0xCC33, 0xAA49},{0xCC34, 0xAA4A},{0xCC35, 0xAA4B},{0xCC36, 0xAA4C}, - {0xCC37, 0xAA4D},{0xCC38, 0xC2FC},{0xCC39, 0xC2FD},{0xCC3A, 0xAA4E},{0xCC3B, 0xC2FE},{0xCC3C, 0xC3A1},{0xCC3D, 0xC3A2},{0xCC3E, 0xC3A3}, - {0xCC3F, 0xAA4F},{0xCC40, 0xAA50},{0xCC41, 0xAA51},{0xCC42, 0xAA52},{0xCC43, 0xAA53},{0xCC44, 0xC3A4},{0xCC45, 0xC3A5},{0xCC46, 0xAA54}, - {0xCC47, 0xAA55},{0xCC48, 0xC3A6},{0xCC49, 0xAA56},{0xCC4A, 0xAA57},{0xCC4B, 0xAA58},{0xCC4C, 0xC3A7},{0xCC4D, 0xAA59},{0xCC4E, 0xAA5A}, - {0xCC4F, 0xAA61},{0xCC50, 0xAA62},{0xCC51, 0xAA63},{0xCC52, 0xAA64},{0xCC53, 0xAA65},{0xCC54, 0xC3A8},{0xCC55, 0xC3A9},{0xCC56, 0xAA66}, - {0xCC57, 0xC3AA},{0xCC58, 0xC3AB},{0xCC59, 0xC3AC},{0xCC5A, 0xAA67},{0xCC5B, 0xAA68},{0xCC5C, 0xAA69},{0xCC5D, 0xAA6A},{0xCC5E, 0xAA6B}, - {0xCC5F, 0xAA6C},{0xCC60, 0xC3AD},{0xCC61, 0xAA6D},{0xCC62, 0xAA6E},{0xCC63, 0xAA6F},{0xCC64, 0xC3AE},{0xCC65, 0xAA70},{0xCC66, 0xC3AF}, - {0xCC67, 0xAA71},{0xCC68, 0xC3B0},{0xCC69, 0xAA72},{0xCC6A, 0xAA73},{0xCC6B, 0xAA74},{0xCC6C, 0xAA75},{0xCC6D, 0xAA76},{0xCC6E, 0xAA77}, - {0xCC6F, 0xAA78},{0xCC70, 0xC3B1},{0xCC71, 0xAA79},{0xCC72, 0xAA7A},{0xCC73, 0xAA81},{0xCC74, 0xAA82},{0xCC75, 0xC3B2},{0xCC76, 0xAA83}, - {0xCC77, 0xAA84},{0xCC78, 0xAA85},{0xCC79, 0xAA86},{0xCC7A, 0xAA87},{0xCC7B, 0xAA88},{0xCC7C, 0xAA89},{0xCC7D, 0xAA8A},{0xCC7E, 0xAA8B}, - {0xCC7F, 0xAA8C},{0xCC80, 0xAA8D},{0xCC81, 0xAA8E},{0xCC82, 0xAA8F},{0xCC83, 0xAA90},{0xCC84, 0xAA91},{0xCC85, 0xAA92},{0xCC86, 0xAA93}, - {0xCC87, 0xAA94},{0xCC88, 0xAA95},{0xCC89, 0xAA96},{0xCC8A, 0xAA97},{0xCC8B, 0xAA98},{0xCC8C, 0xAA99},{0xCC8D, 0xAA9A},{0xCC8E, 0xAA9B}, - {0xCC8F, 0xAA9C},{0xCC90, 0xAA9D},{0xCC91, 0xAA9E},{0xCC92, 0xAA9F},{0xCC93, 0xAAA0},{0xCC94, 0xAB41},{0xCC95, 0xAB42},{0xCC96, 0xAB43}, - {0xCC97, 0xAB44},{0xCC98, 0xC3B3},{0xCC99, 0xC3B4},{0xCC9A, 0xAB45},{0xCC9B, 0xAB46},{0xCC9C, 0xC3B5},{0xCC9D, 0xAB47},{0xCC9E, 0xAB48}, - {0xCC9F, 0xAB49},{0xCCA0, 0xC3B6},{0xCCA1, 0xAB4A},{0xCCA2, 0xAB4B},{0xCCA3, 0xAB4C},{0xCCA4, 0xAB4D},{0xCCA5, 0xAB4E},{0xCCA6, 0xAB4F}, - {0xCCA7, 0xAB50},{0xCCA8, 0xC3B7},{0xCCA9, 0xC3B8},{0xCCAA, 0xAB51},{0xCCAB, 0xC3B9},{0xCCAC, 0xC3BA},{0xCCAD, 0xC3BB},{0xCCAE, 0xAB52}, - {0xCCAF, 0xAB53},{0xCCB0, 0xAB54},{0xCCB1, 0xAB55},{0xCCB2, 0xAB56},{0xCCB3, 0xAB57},{0xCCB4, 0xC3BC},{0xCCB5, 0xC3BD},{0xCCB6, 0xAB58}, - {0xCCB7, 0xAB59},{0xCCB8, 0xC3BE},{0xCCB9, 0xAB5A},{0xCCBA, 0xAB61},{0xCCBB, 0xAB62},{0xCCBC, 0xC3BF},{0xCCBD, 0xAB63},{0xCCBE, 0xAB64}, - {0xCCBF, 0xAB65},{0xCCC0, 0xAB66},{0xCCC1, 0xAB67},{0xCCC2, 0xAB68},{0xCCC3, 0xAB69},{0xCCC4, 0xC3C0},{0xCCC5, 0xC3C1},{0xCCC6, 0xAB6A}, - {0xCCC7, 0xC3C2},{0xCCC8, 0xAB6B},{0xCCC9, 0xC3C3},{0xCCCA, 0xAB6C},{0xCCCB, 0xAB6D},{0xCCCC, 0xAB6E},{0xCCCD, 0xAB6F},{0xCCCE, 0xAB70}, - {0xCCCF, 0xAB71},{0xCCD0, 0xC3C4},{0xCCD1, 0xAB72},{0xCCD2, 0xAB73},{0xCCD3, 0xAB74},{0xCCD4, 0xC3C5},{0xCCD5, 0xAB75},{0xCCD6, 0xAB76}, - {0xCCD7, 0xAB77},{0xCCD8, 0xAB78},{0xCCD9, 0xAB79},{0xCCDA, 0xAB7A},{0xCCDB, 0xAB81},{0xCCDC, 0xAB82},{0xCCDD, 0xAB83},{0xCCDE, 0xAB84}, - {0xCCDF, 0xAB85},{0xCCE0, 0xAB86},{0xCCE1, 0xAB87},{0xCCE2, 0xAB88},{0xCCE3, 0xAB89},{0xCCE4, 0xC3C6},{0xCCE5, 0xAB8A},{0xCCE6, 0xAB8B}, - {0xCCE7, 0xAB8C},{0xCCE8, 0xAB8D},{0xCCE9, 0xAB8E},{0xCCEA, 0xAB8F},{0xCCEB, 0xAB90},{0xCCEC, 0xC3C7},{0xCCED, 0xAB91},{0xCCEE, 0xAB92}, - {0xCCEF, 0xAB93},{0xCCF0, 0xC3C8},{0xCCF1, 0xAB94},{0xCCF2, 0xAB95},{0xCCF3, 0xAB96},{0xCCF4, 0xAB97},{0xCCF5, 0xAB98},{0xCCF6, 0xAB99}, - {0xCCF7, 0xAB9A},{0xCCF8, 0xAB9B},{0xCCF9, 0xAB9C},{0xCCFA, 0xAB9D},{0xCCFB, 0xAB9E},{0xCCFC, 0xAB9F},{0xCCFD, 0xABA0},{0xCCFE, 0xAC41}, - {0xCCFF, 0xAC42},{0xCD00, 0xAC43},{0xCD01, 0xC3C9},{0xCD02, 0xAC44},{0xCD03, 0xAC45},{0xCD04, 0xAC46},{0xCD05, 0xAC47},{0xCD06, 0xAC48}, - {0xCD07, 0xAC49},{0xCD08, 0xC3CA},{0xCD09, 0xC3CB},{0xCD0A, 0xAC4A},{0xCD0B, 0xAC4B},{0xCD0C, 0xC3CC},{0xCD0D, 0xAC4C},{0xCD0E, 0xAC4D}, - {0xCD0F, 0xAC4E},{0xCD10, 0xC3CD},{0xCD11, 0xAC4F},{0xCD12, 0xAC50},{0xCD13, 0xAC51},{0xCD14, 0xAC52},{0xCD15, 0xAC53},{0xCD16, 0xAC54}, - {0xCD17, 0xAC55},{0xCD18, 0xC3CE},{0xCD19, 0xC3CF},{0xCD1A, 0xAC56},{0xCD1B, 0xC3D0},{0xCD1C, 0xAC57},{0xCD1D, 0xC3D1},{0xCD1E, 0xAC58}, - {0xCD1F, 0xAC59},{0xCD20, 0xAC5A},{0xCD21, 0xAC61},{0xCD22, 0xAC62},{0xCD23, 0xAC63},{0xCD24, 0xC3D2},{0xCD25, 0xAC64},{0xCD26, 0xAC65}, - {0xCD27, 0xAC66},{0xCD28, 0xC3D3},{0xCD29, 0xAC67},{0xCD2A, 0xAC68},{0xCD2B, 0xAC69},{0xCD2C, 0xC3D4},{0xCD2D, 0xAC6A},{0xCD2E, 0xAC6B}, - {0xCD2F, 0xAC6C},{0xCD30, 0xAC6D},{0xCD31, 0xAC6E},{0xCD32, 0xAC6F},{0xCD33, 0xAC70},{0xCD34, 0xAC71},{0xCD35, 0xAC72},{0xCD36, 0xAC73}, - {0xCD37, 0xAC74},{0xCD38, 0xAC75},{0xCD39, 0xC3D5},{0xCD3A, 0xAC76},{0xCD3B, 0xAC77},{0xCD3C, 0xAC78},{0xCD3D, 0xAC79},{0xCD3E, 0xAC7A}, - {0xCD3F, 0xAC81},{0xCD40, 0xAC82},{0xCD41, 0xAC83},{0xCD42, 0xAC84},{0xCD43, 0xAC85},{0xCD44, 0xAC86},{0xCD45, 0xAC87},{0xCD46, 0xAC88}, - {0xCD47, 0xAC89},{0xCD48, 0xAC8A},{0xCD49, 0xAC8B},{0xCD4A, 0xAC8C},{0xCD4B, 0xAC8D},{0xCD4C, 0xAC8E},{0xCD4D, 0xAC8F},{0xCD4E, 0xAC90}, - {0xCD4F, 0xAC91},{0xCD50, 0xAC92},{0xCD51, 0xAC93},{0xCD52, 0xAC94},{0xCD53, 0xAC95},{0xCD54, 0xAC96},{0xCD55, 0xAC97},{0xCD56, 0xAC98}, - {0xCD57, 0xAC99},{0xCD58, 0xAC9A},{0xCD59, 0xAC9B},{0xCD5A, 0xAC9C},{0xCD5B, 0xAC9D},{0xCD5C, 0xC3D6},{0xCD5D, 0xAC9E},{0xCD5E, 0xAC9F}, - {0xCD5F, 0xACA0},{0xCD60, 0xC3D7},{0xCD61, 0xAD41},{0xCD62, 0xAD42},{0xCD63, 0xAD43},{0xCD64, 0xC3D8},{0xCD65, 0xAD44},{0xCD66, 0xAD45}, - {0xCD67, 0xAD46},{0xCD68, 0xAD47},{0xCD69, 0xAD48},{0xCD6A, 0xAD49},{0xCD6B, 0xAD4A},{0xCD6C, 0xC3D9},{0xCD6D, 0xC3DA},{0xCD6E, 0xAD4B}, - {0xCD6F, 0xC3DB},{0xCD70, 0xAD4C},{0xCD71, 0xC3DC},{0xCD72, 0xAD4D},{0xCD73, 0xAD4E},{0xCD74, 0xAD4F},{0xCD75, 0xAD50},{0xCD76, 0xAD51}, - {0xCD77, 0xAD52},{0xCD78, 0xC3DD},{0xCD79, 0xAD53},{0xCD7A, 0xAD54},{0xCD7B, 0xAD55},{0xCD7C, 0xAD56},{0xCD7D, 0xAD57},{0xCD7E, 0xAD58}, - {0xCD7F, 0xAD59},{0xCD80, 0xAD5A},{0xCD81, 0xAD61},{0xCD82, 0xAD62},{0xCD83, 0xAD63},{0xCD84, 0xAD64},{0xCD85, 0xAD65},{0xCD86, 0xAD66}, - {0xCD87, 0xAD67},{0xCD88, 0xC3DE},{0xCD89, 0xAD68},{0xCD8A, 0xAD69},{0xCD8B, 0xAD6A},{0xCD8C, 0xAD6B},{0xCD8D, 0xAD6C},{0xCD8E, 0xAD6D}, - {0xCD8F, 0xAD6E},{0xCD90, 0xAD6F},{0xCD91, 0xAD70},{0xCD92, 0xAD71},{0xCD93, 0xAD72},{0xCD94, 0xC3DF},{0xCD95, 0xC3E0},{0xCD96, 0xAD73}, - {0xCD97, 0xAD74},{0xCD98, 0xC3E1},{0xCD99, 0xAD75},{0xCD9A, 0xAD76},{0xCD9B, 0xAD77},{0xCD9C, 0xC3E2},{0xCD9D, 0xAD78},{0xCD9E, 0xAD79}, - {0xCD9F, 0xAD7A},{0xCDA0, 0xAD81},{0xCDA1, 0xAD82},{0xCDA2, 0xAD83},{0xCDA3, 0xAD84},{0xCDA4, 0xC3E3},{0xCDA5, 0xC3E4},{0xCDA6, 0xAD85}, - {0xCDA7, 0xC3E5},{0xCDA8, 0xAD86},{0xCDA9, 0xC3E6},{0xCDAA, 0xAD87},{0xCDAB, 0xAD88},{0xCDAC, 0xAD89},{0xCDAD, 0xAD8A},{0xCDAE, 0xAD8B}, - {0xCDAF, 0xAD8C},{0xCDB0, 0xC3E7},{0xCDB1, 0xAD8D},{0xCDB2, 0xAD8E},{0xCDB3, 0xAD8F},{0xCDB4, 0xAD90},{0xCDB5, 0xAD91},{0xCDB6, 0xAD92}, - {0xCDB7, 0xAD93},{0xCDB8, 0xAD94},{0xCDB9, 0xAD95},{0xCDBA, 0xAD96},{0xCDBB, 0xAD97},{0xCDBC, 0xAD98},{0xCDBD, 0xAD99},{0xCDBE, 0xAD9A}, - {0xCDBF, 0xAD9B},{0xCDC0, 0xAD9C},{0xCDC1, 0xAD9D},{0xCDC2, 0xAD9E},{0xCDC3, 0xAD9F},{0xCDC4, 0xC3E8},{0xCDC5, 0xADA0},{0xCDC6, 0xAE41}, - {0xCDC7, 0xAE42},{0xCDC8, 0xAE43},{0xCDC9, 0xAE44},{0xCDCA, 0xAE45},{0xCDCB, 0xAE46},{0xCDCC, 0xC3E9},{0xCDCD, 0xAE47},{0xCDCE, 0xAE48}, - {0xCDCF, 0xAE49},{0xCDD0, 0xC3EA},{0xCDD1, 0xAE4A},{0xCDD2, 0xAE4B},{0xCDD3, 0xAE4C},{0xCDD4, 0xAE4D},{0xCDD5, 0xAE4E},{0xCDD6, 0xAE4F}, - {0xCDD7, 0xAE50},{0xCDD8, 0xAE51},{0xCDD9, 0xAE52},{0xCDDA, 0xAE53},{0xCDDB, 0xAE54},{0xCDDC, 0xAE55},{0xCDDD, 0xAE56},{0xCDDE, 0xAE57}, - {0xCDDF, 0xAE58},{0xCDE0, 0xAE59},{0xCDE1, 0xAE5A},{0xCDE2, 0xAE61},{0xCDE3, 0xAE62},{0xCDE4, 0xAE63},{0xCDE5, 0xAE64},{0xCDE6, 0xAE65}, - {0xCDE7, 0xAE66},{0xCDE8, 0xC3EB},{0xCDE9, 0xAE67},{0xCDEA, 0xAE68},{0xCDEB, 0xAE69},{0xCDEC, 0xC3EC},{0xCDED, 0xAE6A},{0xCDEE, 0xAE6B}, - {0xCDEF, 0xAE6C},{0xCDF0, 0xC3ED},{0xCDF1, 0xAE6D},{0xCDF2, 0xAE6E},{0xCDF3, 0xAE6F},{0xCDF4, 0xAE70},{0xCDF5, 0xAE71},{0xCDF6, 0xAE72}, - {0xCDF7, 0xAE73},{0xCDF8, 0xC3EE},{0xCDF9, 0xC3EF},{0xCDFA, 0xAE74},{0xCDFB, 0xC3F0},{0xCDFC, 0xAE75},{0xCDFD, 0xC3F1},{0xCDFE, 0xAE76}, - {0xCDFF, 0xAE77},{0xCE00, 0xAE78},{0xCE01, 0xAE79},{0xCE02, 0xAE7A},{0xCE03, 0xAE81},{0xCE04, 0xC3F2},{0xCE05, 0xAE82},{0xCE06, 0xAE83}, - {0xCE07, 0xAE84},{0xCE08, 0xC3F3},{0xCE09, 0xAE85},{0xCE0A, 0xAE86},{0xCE0B, 0xAE87},{0xCE0C, 0xC3F4},{0xCE0D, 0xAE88},{0xCE0E, 0xAE89}, - {0xCE0F, 0xAE8A},{0xCE10, 0xAE8B},{0xCE11, 0xAE8C},{0xCE12, 0xAE8D},{0xCE13, 0xAE8E},{0xCE14, 0xC3F5},{0xCE15, 0xAE8F},{0xCE16, 0xAE90}, - {0xCE17, 0xAE91},{0xCE18, 0xAE92},{0xCE19, 0xC3F6},{0xCE1A, 0xAE93},{0xCE1B, 0xAE94},{0xCE1C, 0xAE95},{0xCE1D, 0xAE96},{0xCE1E, 0xAE97}, - {0xCE1F, 0xAE98},{0xCE20, 0xC3F7},{0xCE21, 0xC3F8},{0xCE22, 0xAE99},{0xCE23, 0xAE9A},{0xCE24, 0xC3F9},{0xCE25, 0xAE9B},{0xCE26, 0xAE9C}, - {0xCE27, 0xAE9D},{0xCE28, 0xC3FA},{0xCE29, 0xAE9E},{0xCE2A, 0xAE9F},{0xCE2B, 0xAEA0},{0xCE2C, 0xAF41},{0xCE2D, 0xAF42},{0xCE2E, 0xAF43}, - {0xCE2F, 0xAF44},{0xCE30, 0xC3FB},{0xCE31, 0xC3FC},{0xCE32, 0xAF45},{0xCE33, 0xC3FD},{0xCE34, 0xAF46},{0xCE35, 0xC3FE},{0xCE36, 0xAF47}, - {0xCE37, 0xAF48},{0xCE38, 0xAF49},{0xCE39, 0xAF4A},{0xCE3A, 0xAF4B},{0xCE3B, 0xAF4C},{0xCE3C, 0xAF4D},{0xCE3D, 0xAF4E},{0xCE3E, 0xAF4F}, - {0xCE3F, 0xAF50},{0xCE40, 0xAF51},{0xCE41, 0xAF52},{0xCE42, 0xAF53},{0xCE43, 0xAF54},{0xCE44, 0xAF55},{0xCE45, 0xAF56},{0xCE46, 0xAF57}, - {0xCE47, 0xAF58},{0xCE48, 0xAF59},{0xCE49, 0xAF5A},{0xCE4A, 0xAF61},{0xCE4B, 0xAF62},{0xCE4C, 0xAF63},{0xCE4D, 0xAF64},{0xCE4E, 0xAF65}, - {0xCE4F, 0xAF66},{0xCE50, 0xAF67},{0xCE51, 0xAF68},{0xCE52, 0xAF69},{0xCE53, 0xAF6A},{0xCE54, 0xAF6B},{0xCE55, 0xAF6C},{0xCE56, 0xAF6D}, - {0xCE57, 0xAF6E},{0xCE58, 0xC4A1},{0xCE59, 0xC4A2},{0xCE5A, 0xAF6F},{0xCE5B, 0xAF70},{0xCE5C, 0xC4A3},{0xCE5D, 0xAF71},{0xCE5E, 0xAF72}, - {0xCE5F, 0xC4A4},{0xCE60, 0xC4A5},{0xCE61, 0xC4A6},{0xCE62, 0xAF73},{0xCE63, 0xAF74},{0xCE64, 0xAF75},{0xCE65, 0xAF76},{0xCE66, 0xAF77}, - {0xCE67, 0xAF78},{0xCE68, 0xC4A7},{0xCE69, 0xC4A8},{0xCE6A, 0xAF79},{0xCE6B, 0xC4A9},{0xCE6C, 0xAF7A},{0xCE6D, 0xC4AA},{0xCE6E, 0xAF81}, - {0xCE6F, 0xAF82},{0xCE70, 0xAF83},{0xCE71, 0xAF84},{0xCE72, 0xAF85},{0xCE73, 0xAF86},{0xCE74, 0xC4AB},{0xCE75, 0xC4AC},{0xCE76, 0xAF87}, - {0xCE77, 0xAF88},{0xCE78, 0xC4AD},{0xCE79, 0xAF89},{0xCE7A, 0xAF8A},{0xCE7B, 0xAF8B},{0xCE7C, 0xC4AE},{0xCE7D, 0xAF8C},{0xCE7E, 0xAF8D}, - {0xCE7F, 0xAF8E},{0xCE80, 0xAF8F},{0xCE81, 0xAF90},{0xCE82, 0xAF91},{0xCE83, 0xAF92},{0xCE84, 0xC4AF},{0xCE85, 0xC4B0},{0xCE86, 0xAF93}, - {0xCE87, 0xC4B1},{0xCE88, 0xAF94},{0xCE89, 0xC4B2},{0xCE8A, 0xAF95},{0xCE8B, 0xAF96},{0xCE8C, 0xAF97},{0xCE8D, 0xAF98},{0xCE8E, 0xAF99}, - {0xCE8F, 0xAF9A},{0xCE90, 0xC4B3},{0xCE91, 0xC4B4},{0xCE92, 0xAF9B},{0xCE93, 0xAF9C},{0xCE94, 0xC4B5},{0xCE95, 0xAF9D},{0xCE96, 0xAF9E}, - {0xCE97, 0xAF9F},{0xCE98, 0xC4B6},{0xCE99, 0xAFA0},{0xCE9A, 0xB041},{0xCE9B, 0xB042},{0xCE9C, 0xB043},{0xCE9D, 0xB044},{0xCE9E, 0xB045}, - {0xCE9F, 0xB046},{0xCEA0, 0xC4B7},{0xCEA1, 0xC4B8},{0xCEA2, 0xB047},{0xCEA3, 0xC4B9},{0xCEA4, 0xC4BA},{0xCEA5, 0xC4BB},{0xCEA6, 0xB048}, - {0xCEA7, 0xB049},{0xCEA8, 0xB04A},{0xCEA9, 0xB04B},{0xCEAA, 0xB04C},{0xCEAB, 0xB04D},{0xCEAC, 0xC4BC},{0xCEAD, 0xC4BD},{0xCEAE, 0xB04E}, - {0xCEAF, 0xB04F},{0xCEB0, 0xB050},{0xCEB1, 0xB051},{0xCEB2, 0xB052},{0xCEB3, 0xB053},{0xCEB4, 0xB054},{0xCEB5, 0xB055},{0xCEB6, 0xB056}, - {0xCEB7, 0xB057},{0xCEB8, 0xB058},{0xCEB9, 0xB059},{0xCEBA, 0xB05A},{0xCEBB, 0xB061},{0xCEBC, 0xB062},{0xCEBD, 0xB063},{0xCEBE, 0xB064}, - {0xCEBF, 0xB065},{0xCEC0, 0xB066},{0xCEC1, 0xC4BE},{0xCEC2, 0xB067},{0xCEC3, 0xB068},{0xCEC4, 0xB069},{0xCEC5, 0xB06A},{0xCEC6, 0xB06B}, - {0xCEC7, 0xB06C},{0xCEC8, 0xB06D},{0xCEC9, 0xB06E},{0xCECA, 0xB06F},{0xCECB, 0xB070},{0xCECC, 0xB071},{0xCECD, 0xB072},{0xCECE, 0xB073}, - {0xCECF, 0xB074},{0xCED0, 0xB075},{0xCED1, 0xB076},{0xCED2, 0xB077},{0xCED3, 0xB078},{0xCED4, 0xB079},{0xCED5, 0xB07A},{0xCED6, 0xB081}, - {0xCED7, 0xB082},{0xCED8, 0xB083},{0xCED9, 0xB084},{0xCEDA, 0xB085},{0xCEDB, 0xB086},{0xCEDC, 0xB087},{0xCEDD, 0xB088},{0xCEDE, 0xB089}, - {0xCEDF, 0xB08A},{0xCEE0, 0xB08B},{0xCEE1, 0xB08C},{0xCEE2, 0xB08D},{0xCEE3, 0xB08E},{0xCEE4, 0xC4BF},{0xCEE5, 0xC4C0},{0xCEE6, 0xB08F}, - {0xCEE7, 0xB090},{0xCEE8, 0xC4C1},{0xCEE9, 0xB091},{0xCEEA, 0xB092},{0xCEEB, 0xC4C2},{0xCEEC, 0xC4C3},{0xCEED, 0xB093},{0xCEEE, 0xB094}, - {0xCEEF, 0xB095},{0xCEF0, 0xB096},{0xCEF1, 0xB097},{0xCEF2, 0xB098},{0xCEF3, 0xB099},{0xCEF4, 0xC4C4},{0xCEF5, 0xC4C5},{0xCEF6, 0xB09A}, - {0xCEF7, 0xC4C6},{0xCEF8, 0xC4C7},{0xCEF9, 0xC4C8},{0xCEFA, 0xB09B},{0xCEFB, 0xB09C},{0xCEFC, 0xB09D},{0xCEFD, 0xB09E},{0xCEFE, 0xB09F}, - {0xCEFF, 0xB0A0},{0xCF00, 0xC4C9},{0xCF01, 0xC4CA},{0xCF02, 0xB141},{0xCF03, 0xB142},{0xCF04, 0xC4CB},{0xCF05, 0xB143},{0xCF06, 0xB144}, - {0xCF07, 0xB145},{0xCF08, 0xC4CC},{0xCF09, 0xB146},{0xCF0A, 0xB147},{0xCF0B, 0xB148},{0xCF0C, 0xB149},{0xCF0D, 0xB14A},{0xCF0E, 0xB14B}, - {0xCF0F, 0xB14C},{0xCF10, 0xC4CD},{0xCF11, 0xC4CE},{0xCF12, 0xB14D},{0xCF13, 0xC4CF},{0xCF14, 0xB14E},{0xCF15, 0xC4D0},{0xCF16, 0xB14F}, - {0xCF17, 0xB150},{0xCF18, 0xB151},{0xCF19, 0xB152},{0xCF1A, 0xB153},{0xCF1B, 0xB154},{0xCF1C, 0xC4D1},{0xCF1D, 0xB155},{0xCF1E, 0xB156}, - {0xCF1F, 0xB157},{0xCF20, 0xC4D2},{0xCF21, 0xB158},{0xCF22, 0xB159},{0xCF23, 0xB15A},{0xCF24, 0xC4D3},{0xCF25, 0xB161},{0xCF26, 0xB162}, - {0xCF27, 0xB163},{0xCF28, 0xB164},{0xCF29, 0xB165},{0xCF2A, 0xB166},{0xCF2B, 0xB167},{0xCF2C, 0xC4D4},{0xCF2D, 0xC4D5},{0xCF2E, 0xB168}, - {0xCF2F, 0xC4D6},{0xCF30, 0xC4D7},{0xCF31, 0xC4D8},{0xCF32, 0xB169},{0xCF33, 0xB16A},{0xCF34, 0xB16B},{0xCF35, 0xB16C},{0xCF36, 0xB16D}, - {0xCF37, 0xB16E},{0xCF38, 0xC4D9},{0xCF39, 0xB16F},{0xCF3A, 0xB170},{0xCF3B, 0xB171},{0xCF3C, 0xB172},{0xCF3D, 0xB173},{0xCF3E, 0xB174}, - {0xCF3F, 0xB175},{0xCF40, 0xB176},{0xCF41, 0xB177},{0xCF42, 0xB178},{0xCF43, 0xB179},{0xCF44, 0xB17A},{0xCF45, 0xB181},{0xCF46, 0xB182}, - {0xCF47, 0xB183},{0xCF48, 0xB184},{0xCF49, 0xB185},{0xCF4A, 0xB186},{0xCF4B, 0xB187},{0xCF4C, 0xB188},{0xCF4D, 0xB189},{0xCF4E, 0xB18A}, - {0xCF4F, 0xB18B},{0xCF50, 0xB18C},{0xCF51, 0xB18D},{0xCF52, 0xB18E},{0xCF53, 0xB18F},{0xCF54, 0xC4DA},{0xCF55, 0xC4DB},{0xCF56, 0xB190}, - {0xCF57, 0xB191},{0xCF58, 0xC4DC},{0xCF59, 0xB192},{0xCF5A, 0xB193},{0xCF5B, 0xB194},{0xCF5C, 0xC4DD},{0xCF5D, 0xB195},{0xCF5E, 0xB196}, - {0xCF5F, 0xB197},{0xCF60, 0xB198},{0xCF61, 0xB199},{0xCF62, 0xB19A},{0xCF63, 0xB19B},{0xCF64, 0xC4DE},{0xCF65, 0xC4DF},{0xCF66, 0xB19C}, - {0xCF67, 0xC4E0},{0xCF68, 0xB19D},{0xCF69, 0xC4E1},{0xCF6A, 0xB19E},{0xCF6B, 0xB19F},{0xCF6C, 0xB1A0},{0xCF6D, 0xB241},{0xCF6E, 0xB242}, - {0xCF6F, 0xB243},{0xCF70, 0xC4E2},{0xCF71, 0xC4E3},{0xCF72, 0xB244},{0xCF73, 0xB245},{0xCF74, 0xC4E4},{0xCF75, 0xB246},{0xCF76, 0xB247}, - {0xCF77, 0xB248},{0xCF78, 0xC4E5},{0xCF79, 0xB249},{0xCF7A, 0xB24A},{0xCF7B, 0xB24B},{0xCF7C, 0xB24C},{0xCF7D, 0xB24D},{0xCF7E, 0xB24E}, - {0xCF7F, 0xB24F},{0xCF80, 0xC4E6},{0xCF81, 0xB250},{0xCF82, 0xB251},{0xCF83, 0xB252},{0xCF84, 0xB253},{0xCF85, 0xC4E7},{0xCF86, 0xB254}, - {0xCF87, 0xB255},{0xCF88, 0xB256},{0xCF89, 0xB257},{0xCF8A, 0xB258},{0xCF8B, 0xB259},{0xCF8C, 0xC4E8},{0xCF8D, 0xB25A},{0xCF8E, 0xB261}, - {0xCF8F, 0xB262},{0xCF90, 0xB263},{0xCF91, 0xB264},{0xCF92, 0xB265},{0xCF93, 0xB266},{0xCF94, 0xB267},{0xCF95, 0xB268},{0xCF96, 0xB269}, - {0xCF97, 0xB26A},{0xCF98, 0xB26B},{0xCF99, 0xB26C},{0xCF9A, 0xB26D},{0xCF9B, 0xB26E},{0xCF9C, 0xB26F},{0xCF9D, 0xB270},{0xCF9E, 0xB271}, - {0xCF9F, 0xB272},{0xCFA0, 0xB273},{0xCFA1, 0xC4E9},{0xCFA2, 0xB274},{0xCFA3, 0xB275},{0xCFA4, 0xB276},{0xCFA5, 0xB277},{0xCFA6, 0xB278}, - {0xCFA7, 0xB279},{0xCFA8, 0xC4EA},{0xCFA9, 0xB27A},{0xCFAA, 0xB281},{0xCFAB, 0xB282},{0xCFAC, 0xB283},{0xCFAD, 0xB284},{0xCFAE, 0xB285}, - {0xCFAF, 0xB286},{0xCFB0, 0xC4EB},{0xCFB1, 0xB287},{0xCFB2, 0xB288},{0xCFB3, 0xB289},{0xCFB4, 0xB28A},{0xCFB5, 0xB28B},{0xCFB6, 0xB28C}, - {0xCFB7, 0xB28D},{0xCFB8, 0xB28E},{0xCFB9, 0xB28F},{0xCFBA, 0xB290},{0xCFBB, 0xB291},{0xCFBC, 0xB292},{0xCFBD, 0xB293},{0xCFBE, 0xB294}, - {0xCFBF, 0xB295},{0xCFC0, 0xB296},{0xCFC1, 0xB297},{0xCFC2, 0xB298},{0xCFC3, 0xB299},{0xCFC4, 0xC4EC},{0xCFC5, 0xB29A},{0xCFC6, 0xB29B}, - {0xCFC7, 0xB29C},{0xCFC8, 0xB29D},{0xCFC9, 0xB29E},{0xCFCA, 0xB29F},{0xCFCB, 0xB2A0},{0xCFCC, 0xB341},{0xCFCD, 0xB342},{0xCFCE, 0xB343}, - {0xCFCF, 0xB344},{0xCFD0, 0xB345},{0xCFD1, 0xB346},{0xCFD2, 0xB347},{0xCFD3, 0xB348},{0xCFD4, 0xB349},{0xCFD5, 0xB34A},{0xCFD6, 0xB34B}, - {0xCFD7, 0xB34C},{0xCFD8, 0xB34D},{0xCFD9, 0xB34E},{0xCFDA, 0xB34F},{0xCFDB, 0xB350},{0xCFDC, 0xB351},{0xCFDD, 0xB352},{0xCFDE, 0xB353}, - {0xCFDF, 0xB354},{0xCFE0, 0xC4ED},{0xCFE1, 0xC4EE},{0xCFE2, 0xB355},{0xCFE3, 0xB356},{0xCFE4, 0xC4EF},{0xCFE5, 0xB357},{0xCFE6, 0xB358}, - {0xCFE7, 0xB359},{0xCFE8, 0xC4F0},{0xCFE9, 0xB35A},{0xCFEA, 0xB361},{0xCFEB, 0xB362},{0xCFEC, 0xB363},{0xCFED, 0xB364},{0xCFEE, 0xB365}, - {0xCFEF, 0xB366},{0xCFF0, 0xC4F1},{0xCFF1, 0xC4F2},{0xCFF2, 0xB367},{0xCFF3, 0xC4F3},{0xCFF4, 0xB368},{0xCFF5, 0xC4F4},{0xCFF6, 0xB369}, - {0xCFF7, 0xB36A},{0xCFF8, 0xB36B},{0xCFF9, 0xB36C},{0xCFFA, 0xB36D},{0xCFFB, 0xB36E},{0xCFFC, 0xC4F5},{0xCFFD, 0xB36F},{0xCFFE, 0xB370}, - {0xCFFF, 0xB371},{0xD000, 0xC4F6},{0xD001, 0xB372},{0xD002, 0xB373},{0xD003, 0xB374},{0xD004, 0xC4F7},{0xD005, 0xB375},{0xD006, 0xB376}, - {0xD007, 0xB377},{0xD008, 0xB378},{0xD009, 0xB379},{0xD00A, 0xB37A},{0xD00B, 0xB381},{0xD00C, 0xB382},{0xD00D, 0xB383},{0xD00E, 0xB384}, - {0xD00F, 0xB385},{0xD010, 0xB386},{0xD011, 0xC4F8},{0xD012, 0xB387},{0xD013, 0xB388},{0xD014, 0xB389},{0xD015, 0xB38A},{0xD016, 0xB38B}, - {0xD017, 0xB38C},{0xD018, 0xC4F9},{0xD019, 0xB38D},{0xD01A, 0xB38E},{0xD01B, 0xB38F},{0xD01C, 0xB390},{0xD01D, 0xB391},{0xD01E, 0xB392}, - {0xD01F, 0xB393},{0xD020, 0xB394},{0xD021, 0xB395},{0xD022, 0xB396},{0xD023, 0xB397},{0xD024, 0xB398},{0xD025, 0xB399},{0xD026, 0xB39A}, - {0xD027, 0xB39B},{0xD028, 0xB39C},{0xD029, 0xB39D},{0xD02A, 0xB39E},{0xD02B, 0xB39F},{0xD02C, 0xB3A0},{0xD02D, 0xC4FA},{0xD02E, 0xB441}, - {0xD02F, 0xB442},{0xD030, 0xB443},{0xD031, 0xB444},{0xD032, 0xB445},{0xD033, 0xB446},{0xD034, 0xC4FB},{0xD035, 0xC4FC},{0xD036, 0xB447}, - {0xD037, 0xB448},{0xD038, 0xC4FD},{0xD039, 0xB449},{0xD03A, 0xB44A},{0xD03B, 0xB44B},{0xD03C, 0xC4FE},{0xD03D, 0xB44C},{0xD03E, 0xB44D}, - {0xD03F, 0xB44E},{0xD040, 0xB44F},{0xD041, 0xB450},{0xD042, 0xB451},{0xD043, 0xB452},{0xD044, 0xC5A1},{0xD045, 0xC5A2},{0xD046, 0xB453}, - {0xD047, 0xC5A3},{0xD048, 0xB454},{0xD049, 0xC5A4},{0xD04A, 0xB455},{0xD04B, 0xB456},{0xD04C, 0xB457},{0xD04D, 0xB458},{0xD04E, 0xB459}, - {0xD04F, 0xB45A},{0xD050, 0xC5A5},{0xD051, 0xB461},{0xD052, 0xB462},{0xD053, 0xB463},{0xD054, 0xC5A6},{0xD055, 0xB464},{0xD056, 0xB465}, - {0xD057, 0xB466},{0xD058, 0xC5A7},{0xD059, 0xB467},{0xD05A, 0xB468},{0xD05B, 0xB469},{0xD05C, 0xB46A},{0xD05D, 0xB46B},{0xD05E, 0xB46C}, - {0xD05F, 0xB46D},{0xD060, 0xC5A8},{0xD061, 0xB46E},{0xD062, 0xB46F},{0xD063, 0xB470},{0xD064, 0xB471},{0xD065, 0xB472},{0xD066, 0xB473}, - {0xD067, 0xB474},{0xD068, 0xB475},{0xD069, 0xB476},{0xD06A, 0xB477},{0xD06B, 0xB478},{0xD06C, 0xC5A9},{0xD06D, 0xC5AA},{0xD06E, 0xB479}, - {0xD06F, 0xB47A},{0xD070, 0xC5AB},{0xD071, 0xB481},{0xD072, 0xB482},{0xD073, 0xB483},{0xD074, 0xC5AC},{0xD075, 0xB484},{0xD076, 0xB485}, - {0xD077, 0xB486},{0xD078, 0xB487},{0xD079, 0xB488},{0xD07A, 0xB489},{0xD07B, 0xB48A},{0xD07C, 0xC5AD},{0xD07D, 0xC5AE},{0xD07E, 0xB48B}, - {0xD07F, 0xB48C},{0xD080, 0xB48D},{0xD081, 0xC5AF},{0xD082, 0xB48E},{0xD083, 0xB48F},{0xD084, 0xB490},{0xD085, 0xB491},{0xD086, 0xB492}, - {0xD087, 0xB493},{0xD088, 0xB494},{0xD089, 0xB495},{0xD08A, 0xB496},{0xD08B, 0xB497},{0xD08C, 0xB498},{0xD08D, 0xB499},{0xD08E, 0xB49A}, - {0xD08F, 0xB49B},{0xD090, 0xB49C},{0xD091, 0xB49D},{0xD092, 0xB49E},{0xD093, 0xB49F},{0xD094, 0xB4A0},{0xD095, 0xB541},{0xD096, 0xB542}, - {0xD097, 0xB543},{0xD098, 0xB544},{0xD099, 0xB545},{0xD09A, 0xB546},{0xD09B, 0xB547},{0xD09C, 0xB548},{0xD09D, 0xB549},{0xD09E, 0xB54A}, - {0xD09F, 0xB54B},{0xD0A0, 0xB54C},{0xD0A1, 0xB54D},{0xD0A2, 0xB54E},{0xD0A3, 0xB54F},{0xD0A4, 0xC5B0},{0xD0A5, 0xC5B1},{0xD0A6, 0xB550}, - {0xD0A7, 0xB551},{0xD0A8, 0xC5B2},{0xD0A9, 0xB552},{0xD0AA, 0xB553},{0xD0AB, 0xB554},{0xD0AC, 0xC5B3},{0xD0AD, 0xB555},{0xD0AE, 0xB556}, - {0xD0AF, 0xB557},{0xD0B0, 0xB558},{0xD0B1, 0xB559},{0xD0B2, 0xB55A},{0xD0B3, 0xB561},{0xD0B4, 0xC5B4},{0xD0B5, 0xC5B5},{0xD0B6, 0xB562}, - {0xD0B7, 0xC5B6},{0xD0B8, 0xB563},{0xD0B9, 0xC5B7},{0xD0BA, 0xB564},{0xD0BB, 0xB565},{0xD0BC, 0xB566},{0xD0BD, 0xB567},{0xD0BE, 0xB568}, - {0xD0BF, 0xB569},{0xD0C0, 0xC5B8},{0xD0C1, 0xC5B9},{0xD0C2, 0xB56A},{0xD0C3, 0xB56B},{0xD0C4, 0xC5BA},{0xD0C5, 0xB56C},{0xD0C6, 0xB56D}, - {0xD0C7, 0xB56E},{0xD0C8, 0xC5BB},{0xD0C9, 0xC5BC},{0xD0CA, 0xB56F},{0xD0CB, 0xB570},{0xD0CC, 0xB571},{0xD0CD, 0xB572},{0xD0CE, 0xB573}, - {0xD0CF, 0xB574},{0xD0D0, 0xC5BD},{0xD0D1, 0xC5BE},{0xD0D2, 0xB575},{0xD0D3, 0xC5BF},{0xD0D4, 0xC5C0},{0xD0D5, 0xC5C1},{0xD0D6, 0xB576}, - {0xD0D7, 0xB577},{0xD0D8, 0xB578},{0xD0D9, 0xB579},{0xD0DA, 0xB57A},{0xD0DB, 0xB581},{0xD0DC, 0xC5C2},{0xD0DD, 0xC5C3},{0xD0DE, 0xB582}, - {0xD0DF, 0xB583},{0xD0E0, 0xC5C4},{0xD0E1, 0xB584},{0xD0E2, 0xB585},{0xD0E3, 0xB586},{0xD0E4, 0xC5C5},{0xD0E5, 0xB587},{0xD0E6, 0xB588}, - {0xD0E7, 0xB589},{0xD0E8, 0xB58A},{0xD0E9, 0xB58B},{0xD0EA, 0xB58C},{0xD0EB, 0xB58D},{0xD0EC, 0xC5C6},{0xD0ED, 0xC5C7},{0xD0EE, 0xB58E}, - {0xD0EF, 0xC5C8},{0xD0F0, 0xC5C9},{0xD0F1, 0xC5CA},{0xD0F2, 0xB58F},{0xD0F3, 0xB590},{0xD0F4, 0xB591},{0xD0F5, 0xB592},{0xD0F6, 0xB593}, - {0xD0F7, 0xB594},{0xD0F8, 0xC5CB},{0xD0F9, 0xB595},{0xD0FA, 0xB596},{0xD0FB, 0xB597},{0xD0FC, 0xB598},{0xD0FD, 0xB599},{0xD0FE, 0xB59A}, - {0xD0FF, 0xB59B},{0xD100, 0xB59C},{0xD101, 0xB59D},{0xD102, 0xB59E},{0xD103, 0xB59F},{0xD104, 0xB5A0},{0xD105, 0xB641},{0xD106, 0xB642}, - {0xD107, 0xB643},{0xD108, 0xB644},{0xD109, 0xB645},{0xD10A, 0xB646},{0xD10B, 0xB647},{0xD10C, 0xB648},{0xD10D, 0xC5CC},{0xD10E, 0xB649}, - {0xD10F, 0xB64A},{0xD110, 0xB64B},{0xD111, 0xB64C},{0xD112, 0xB64D},{0xD113, 0xB64E},{0xD114, 0xB64F},{0xD115, 0xB650},{0xD116, 0xB651}, - {0xD117, 0xB652},{0xD118, 0xB653},{0xD119, 0xB654},{0xD11A, 0xB655},{0xD11B, 0xB656},{0xD11C, 0xB657},{0xD11D, 0xB658},{0xD11E, 0xB659}, - {0xD11F, 0xB65A},{0xD120, 0xB661},{0xD121, 0xB662},{0xD122, 0xB663},{0xD123, 0xB664},{0xD124, 0xB665},{0xD125, 0xB666},{0xD126, 0xB667}, - {0xD127, 0xB668},{0xD128, 0xB669},{0xD129, 0xB66A},{0xD12A, 0xB66B},{0xD12B, 0xB66C},{0xD12C, 0xB66D},{0xD12D, 0xB66E},{0xD12E, 0xB66F}, - {0xD12F, 0xB670},{0xD130, 0xC5CD},{0xD131, 0xC5CE},{0xD132, 0xB671},{0xD133, 0xB672},{0xD134, 0xC5CF},{0xD135, 0xB673},{0xD136, 0xB674}, - {0xD137, 0xB675},{0xD138, 0xC5D0},{0xD139, 0xB676},{0xD13A, 0xC5D1},{0xD13B, 0xB677},{0xD13C, 0xB678},{0xD13D, 0xB679},{0xD13E, 0xB67A}, - {0xD13F, 0xB681},{0xD140, 0xC5D2},{0xD141, 0xC5D3},{0xD142, 0xB682},{0xD143, 0xC5D4},{0xD144, 0xC5D5},{0xD145, 0xC5D6},{0xD146, 0xB683}, - {0xD147, 0xB684},{0xD148, 0xB685},{0xD149, 0xB686},{0xD14A, 0xB687},{0xD14B, 0xB688},{0xD14C, 0xC5D7},{0xD14D, 0xC5D8},{0xD14E, 0xB689}, - {0xD14F, 0xB68A},{0xD150, 0xC5D9},{0xD151, 0xB68B},{0xD152, 0xB68C},{0xD153, 0xB68D},{0xD154, 0xC5DA},{0xD155, 0xB68E},{0xD156, 0xB68F}, - {0xD157, 0xB690},{0xD158, 0xB691},{0xD159, 0xB692},{0xD15A, 0xB693},{0xD15B, 0xB694},{0xD15C, 0xC5DB},{0xD15D, 0xC5DC},{0xD15E, 0xB695}, - {0xD15F, 0xC5DD},{0xD160, 0xB696},{0xD161, 0xC5DE},{0xD162, 0xB697},{0xD163, 0xB698},{0xD164, 0xB699},{0xD165, 0xB69A},{0xD166, 0xB69B}, - {0xD167, 0xB69C},{0xD168, 0xC5DF},{0xD169, 0xB69D},{0xD16A, 0xB69E},{0xD16B, 0xB69F},{0xD16C, 0xC5E0},{0xD16D, 0xB6A0},{0xD16E, 0xB741}, - {0xD16F, 0xB742},{0xD170, 0xB743},{0xD171, 0xB744},{0xD172, 0xB745},{0xD173, 0xB746},{0xD174, 0xB747},{0xD175, 0xB748},{0xD176, 0xB749}, - {0xD177, 0xB74A},{0xD178, 0xB74B},{0xD179, 0xB74C},{0xD17A, 0xB74D},{0xD17B, 0xB74E},{0xD17C, 0xC5E1},{0xD17D, 0xB74F},{0xD17E, 0xB750}, - {0xD17F, 0xB751},{0xD180, 0xB752},{0xD181, 0xB753},{0xD182, 0xB754},{0xD183, 0xB755},{0xD184, 0xC5E2},{0xD185, 0xB756},{0xD186, 0xB757}, - {0xD187, 0xB758},{0xD188, 0xC5E3},{0xD189, 0xB759},{0xD18A, 0xB75A},{0xD18B, 0xB761},{0xD18C, 0xB762},{0xD18D, 0xB763},{0xD18E, 0xB764}, - {0xD18F, 0xB765},{0xD190, 0xB766},{0xD191, 0xB767},{0xD192, 0xB768},{0xD193, 0xB769},{0xD194, 0xB76A},{0xD195, 0xB76B},{0xD196, 0xB76C}, - {0xD197, 0xB76D},{0xD198, 0xB76E},{0xD199, 0xB76F},{0xD19A, 0xB770},{0xD19B, 0xB771},{0xD19C, 0xB772},{0xD19D, 0xB773},{0xD19E, 0xB774}, - {0xD19F, 0xB775},{0xD1A0, 0xC5E4},{0xD1A1, 0xC5E5},{0xD1A2, 0xB776},{0xD1A3, 0xB777},{0xD1A4, 0xC5E6},{0xD1A5, 0xB778},{0xD1A6, 0xB779}, - {0xD1A7, 0xB77A},{0xD1A8, 0xC5E7},{0xD1A9, 0xB781},{0xD1AA, 0xB782},{0xD1AB, 0xB783},{0xD1AC, 0xB784},{0xD1AD, 0xB785},{0xD1AE, 0xB786}, - {0xD1AF, 0xB787},{0xD1B0, 0xC5E8},{0xD1B1, 0xC5E9},{0xD1B2, 0xB788},{0xD1B3, 0xC5EA},{0xD1B4, 0xB789},{0xD1B5, 0xC5EB},{0xD1B6, 0xB78A}, - {0xD1B7, 0xB78B},{0xD1B8, 0xB78C},{0xD1B9, 0xB78D},{0xD1BA, 0xC5EC},{0xD1BB, 0xB78E},{0xD1BC, 0xC5ED},{0xD1BD, 0xB78F},{0xD1BE, 0xB790}, - {0xD1BF, 0xB791},{0xD1C0, 0xC5EE},{0xD1C1, 0xB792},{0xD1C2, 0xB793},{0xD1C3, 0xB794},{0xD1C4, 0xB795},{0xD1C5, 0xB796},{0xD1C6, 0xB797}, - {0xD1C7, 0xB798},{0xD1C8, 0xB799},{0xD1C9, 0xB79A},{0xD1CA, 0xB79B},{0xD1CB, 0xB79C},{0xD1CC, 0xB79D},{0xD1CD, 0xB79E},{0xD1CE, 0xB79F}, - {0xD1CF, 0xB7A0},{0xD1D0, 0xB841},{0xD1D1, 0xB842},{0xD1D2, 0xB843},{0xD1D3, 0xB844},{0xD1D4, 0xB845},{0xD1D5, 0xB846},{0xD1D6, 0xB847}, - {0xD1D7, 0xB848},{0xD1D8, 0xC5EF},{0xD1D9, 0xB849},{0xD1DA, 0xB84A},{0xD1DB, 0xB84B},{0xD1DC, 0xB84C},{0xD1DD, 0xB84D},{0xD1DE, 0xB84E}, - {0xD1DF, 0xB84F},{0xD1E0, 0xB850},{0xD1E1, 0xB851},{0xD1E2, 0xB852},{0xD1E3, 0xB853},{0xD1E4, 0xB854},{0xD1E5, 0xB855},{0xD1E6, 0xB856}, - {0xD1E7, 0xB857},{0xD1E8, 0xB858},{0xD1E9, 0xB859},{0xD1EA, 0xB85A},{0xD1EB, 0xB861},{0xD1EC, 0xB862},{0xD1ED, 0xB863},{0xD1EE, 0xB864}, - {0xD1EF, 0xB865},{0xD1F0, 0xB866},{0xD1F1, 0xB867},{0xD1F2, 0xB868},{0xD1F3, 0xB869},{0xD1F4, 0xC5F0},{0xD1F5, 0xB86A},{0xD1F6, 0xB86B}, - {0xD1F7, 0xB86C},{0xD1F8, 0xC5F1},{0xD1F9, 0xB86D},{0xD1FA, 0xB86E},{0xD1FB, 0xB86F},{0xD1FC, 0xB870},{0xD1FD, 0xB871},{0xD1FE, 0xB872}, - {0xD1FF, 0xB873},{0xD200, 0xB874},{0xD201, 0xB875},{0xD202, 0xB876},{0xD203, 0xB877},{0xD204, 0xB878},{0xD205, 0xB879},{0xD206, 0xB87A}, - {0xD207, 0xC5F2},{0xD208, 0xB881},{0xD209, 0xC5F3},{0xD20A, 0xB882},{0xD20B, 0xB883},{0xD20C, 0xB884},{0xD20D, 0xB885},{0xD20E, 0xB886}, - {0xD20F, 0xB887},{0xD210, 0xC5F4},{0xD211, 0xB888},{0xD212, 0xB889},{0xD213, 0xB88A},{0xD214, 0xB88B},{0xD215, 0xB88C},{0xD216, 0xB88D}, - {0xD217, 0xB88E},{0xD218, 0xB88F},{0xD219, 0xB890},{0xD21A, 0xB891},{0xD21B, 0xB892},{0xD21C, 0xB893},{0xD21D, 0xB894},{0xD21E, 0xB895}, - {0xD21F, 0xB896},{0xD220, 0xB897},{0xD221, 0xB898},{0xD222, 0xB899},{0xD223, 0xB89A},{0xD224, 0xB89B},{0xD225, 0xB89C},{0xD226, 0xB89D}, - {0xD227, 0xB89E},{0xD228, 0xB89F},{0xD229, 0xB8A0},{0xD22A, 0xB941},{0xD22B, 0xB942},{0xD22C, 0xC5F5},{0xD22D, 0xC5F6},{0xD22E, 0xB943}, - {0xD22F, 0xB944},{0xD230, 0xC5F7},{0xD231, 0xB945},{0xD232, 0xB946},{0xD233, 0xB947},{0xD234, 0xC5F8},{0xD235, 0xB948},{0xD236, 0xB949}, - {0xD237, 0xB94A},{0xD238, 0xB94B},{0xD239, 0xB94C},{0xD23A, 0xB94D},{0xD23B, 0xB94E},{0xD23C, 0xC5F9},{0xD23D, 0xC5FA},{0xD23E, 0xB94F}, - {0xD23F, 0xC5FB},{0xD240, 0xB950},{0xD241, 0xC5FC},{0xD242, 0xB951},{0xD243, 0xB952},{0xD244, 0xB953},{0xD245, 0xB954},{0xD246, 0xB955}, - {0xD247, 0xB956},{0xD248, 0xC5FD},{0xD249, 0xB957},{0xD24A, 0xB958},{0xD24B, 0xB959},{0xD24C, 0xB95A},{0xD24D, 0xB961},{0xD24E, 0xB962}, - {0xD24F, 0xB963},{0xD250, 0xB964},{0xD251, 0xB965},{0xD252, 0xB966},{0xD253, 0xB967},{0xD254, 0xB968},{0xD255, 0xB969},{0xD256, 0xB96A}, - {0xD257, 0xB96B},{0xD258, 0xB96C},{0xD259, 0xB96D},{0xD25A, 0xB96E},{0xD25B, 0xB96F},{0xD25C, 0xC5FE},{0xD25D, 0xB970},{0xD25E, 0xB971}, - {0xD25F, 0xB972},{0xD260, 0xB973},{0xD261, 0xB974},{0xD262, 0xB975},{0xD263, 0xB976},{0xD264, 0xC6A1},{0xD265, 0xB977},{0xD266, 0xB978}, - {0xD267, 0xB979},{0xD268, 0xB97A},{0xD269, 0xB981},{0xD26A, 0xB982},{0xD26B, 0xB983},{0xD26C, 0xB984},{0xD26D, 0xB985},{0xD26E, 0xB986}, - {0xD26F, 0xB987},{0xD270, 0xB988},{0xD271, 0xB989},{0xD272, 0xB98A},{0xD273, 0xB98B},{0xD274, 0xB98C},{0xD275, 0xB98D},{0xD276, 0xB98E}, - {0xD277, 0xB98F},{0xD278, 0xB990},{0xD279, 0xB991},{0xD27A, 0xB992},{0xD27B, 0xB993},{0xD27C, 0xB994},{0xD27D, 0xB995},{0xD27E, 0xB996}, - {0xD27F, 0xB997},{0xD280, 0xC6A2},{0xD281, 0xC6A3},{0xD282, 0xB998},{0xD283, 0xB999},{0xD284, 0xC6A4},{0xD285, 0xB99A},{0xD286, 0xB99B}, - {0xD287, 0xB99C},{0xD288, 0xC6A5},{0xD289, 0xB99D},{0xD28A, 0xB99E},{0xD28B, 0xB99F},{0xD28C, 0xB9A0},{0xD28D, 0xBA41},{0xD28E, 0xBA42}, - {0xD28F, 0xBA43},{0xD290, 0xC6A6},{0xD291, 0xC6A7},{0xD292, 0xBA44},{0xD293, 0xBA45},{0xD294, 0xBA46},{0xD295, 0xC6A8},{0xD296, 0xBA47}, - {0xD297, 0xBA48},{0xD298, 0xBA49},{0xD299, 0xBA4A},{0xD29A, 0xBA4B},{0xD29B, 0xBA4C},{0xD29C, 0xC6A9},{0xD29D, 0xBA4D},{0xD29E, 0xBA4E}, - {0xD29F, 0xBA4F},{0xD2A0, 0xC6AA},{0xD2A1, 0xBA50},{0xD2A2, 0xBA51},{0xD2A3, 0xBA52},{0xD2A4, 0xC6AB},{0xD2A5, 0xBA53},{0xD2A6, 0xBA54}, - {0xD2A7, 0xBA55},{0xD2A8, 0xBA56},{0xD2A9, 0xBA57},{0xD2AA, 0xBA58},{0xD2AB, 0xBA59},{0xD2AC, 0xC6AC},{0xD2AD, 0xBA5A},{0xD2AE, 0xBA61}, - {0xD2AF, 0xBA62},{0xD2B0, 0xBA63},{0xD2B1, 0xC6AD},{0xD2B2, 0xBA64},{0xD2B3, 0xBA65},{0xD2B4, 0xBA66},{0xD2B5, 0xBA67},{0xD2B6, 0xBA68}, - {0xD2B7, 0xBA69},{0xD2B8, 0xC6AE},{0xD2B9, 0xC6AF},{0xD2BA, 0xBA6A},{0xD2BB, 0xBA6B},{0xD2BC, 0xC6B0},{0xD2BD, 0xBA6C},{0xD2BE, 0xBA6D}, - {0xD2BF, 0xC6B1},{0xD2C0, 0xC6B2},{0xD2C1, 0xBA6E},{0xD2C2, 0xC6B3},{0xD2C3, 0xBA6F},{0xD2C4, 0xBA70},{0xD2C5, 0xBA71},{0xD2C6, 0xBA72}, - {0xD2C7, 0xBA73},{0xD2C8, 0xC6B4},{0xD2C9, 0xC6B5},{0xD2CA, 0xBA74},{0xD2CB, 0xC6B6},{0xD2CC, 0xBA75},{0xD2CD, 0xBA76},{0xD2CE, 0xBA77}, - {0xD2CF, 0xBA78},{0xD2D0, 0xBA79},{0xD2D1, 0xBA7A},{0xD2D2, 0xBA81},{0xD2D3, 0xBA82},{0xD2D4, 0xC6B7},{0xD2D5, 0xBA83},{0xD2D6, 0xBA84}, - {0xD2D7, 0xBA85},{0xD2D8, 0xC6B8},{0xD2D9, 0xBA86},{0xD2DA, 0xBA87},{0xD2DB, 0xBA88},{0xD2DC, 0xC6B9},{0xD2DD, 0xBA89},{0xD2DE, 0xBA8A}, - {0xD2DF, 0xBA8B},{0xD2E0, 0xBA8C},{0xD2E1, 0xBA8D},{0xD2E2, 0xBA8E},{0xD2E3, 0xBA8F},{0xD2E4, 0xC6BA},{0xD2E5, 0xC6BB},{0xD2E6, 0xBA90}, - {0xD2E7, 0xBA91},{0xD2E8, 0xBA92},{0xD2E9, 0xBA93},{0xD2EA, 0xBA94},{0xD2EB, 0xBA95},{0xD2EC, 0xBA96},{0xD2ED, 0xBA97},{0xD2EE, 0xBA98}, - {0xD2EF, 0xBA99},{0xD2F0, 0xC6BC},{0xD2F1, 0xC6BD},{0xD2F2, 0xBA9A},{0xD2F3, 0xBA9B},{0xD2F4, 0xC6BE},{0xD2F5, 0xBA9C},{0xD2F6, 0xBA9D}, - {0xD2F7, 0xBA9E},{0xD2F8, 0xC6BF},{0xD2F9, 0xBA9F},{0xD2FA, 0xBAA0},{0xD2FB, 0xBB41},{0xD2FC, 0xBB42},{0xD2FD, 0xBB43},{0xD2FE, 0xBB44}, - {0xD2FF, 0xBB45},{0xD300, 0xC6C0},{0xD301, 0xC6C1},{0xD302, 0xBB46},{0xD303, 0xC6C2},{0xD304, 0xBB47},{0xD305, 0xC6C3},{0xD306, 0xBB48}, - {0xD307, 0xBB49},{0xD308, 0xBB4A},{0xD309, 0xBB4B},{0xD30A, 0xBB4C},{0xD30B, 0xBB4D},{0xD30C, 0xC6C4},{0xD30D, 0xC6C5},{0xD30E, 0xC6C6}, - {0xD30F, 0xBB4E},{0xD310, 0xC6C7},{0xD311, 0xBB4F},{0xD312, 0xBB50},{0xD313, 0xBB51},{0xD314, 0xC6C8},{0xD315, 0xBB52},{0xD316, 0xC6C9}, - {0xD317, 0xBB53},{0xD318, 0xBB54},{0xD319, 0xBB55},{0xD31A, 0xBB56},{0xD31B, 0xBB57},{0xD31C, 0xC6CA},{0xD31D, 0xC6CB},{0xD31E, 0xBB58}, - {0xD31F, 0xC6CC},{0xD320, 0xC6CD},{0xD321, 0xC6CE},{0xD322, 0xBB59},{0xD323, 0xBB5A},{0xD324, 0xBB61},{0xD325, 0xC6CF},{0xD326, 0xBB62}, - {0xD327, 0xBB63},{0xD328, 0xC6D0},{0xD329, 0xC6D1},{0xD32A, 0xBB64},{0xD32B, 0xBB65},{0xD32C, 0xC6D2},{0xD32D, 0xBB66},{0xD32E, 0xBB67}, - {0xD32F, 0xBB68},{0xD330, 0xC6D3},{0xD331, 0xBB69},{0xD332, 0xBB6A},{0xD333, 0xBB6B},{0xD334, 0xBB6C},{0xD335, 0xBB6D},{0xD336, 0xBB6E}, - {0xD337, 0xBB6F},{0xD338, 0xC6D4},{0xD339, 0xC6D5},{0xD33A, 0xBB70},{0xD33B, 0xC6D6},{0xD33C, 0xC6D7},{0xD33D, 0xC6D8},{0xD33E, 0xBB71}, - {0xD33F, 0xBB72},{0xD340, 0xBB73},{0xD341, 0xBB74},{0xD342, 0xBB75},{0xD343, 0xBB76},{0xD344, 0xC6D9},{0xD345, 0xC6DA},{0xD346, 0xBB77}, - {0xD347, 0xBB78},{0xD348, 0xBB79},{0xD349, 0xBB7A},{0xD34A, 0xBB81},{0xD34B, 0xBB82},{0xD34C, 0xBB83},{0xD34D, 0xBB84},{0xD34E, 0xBB85}, - {0xD34F, 0xBB86},{0xD350, 0xBB87},{0xD351, 0xBB88},{0xD352, 0xBB89},{0xD353, 0xBB8A},{0xD354, 0xBB8B},{0xD355, 0xBB8C},{0xD356, 0xBB8D}, - {0xD357, 0xBB8E},{0xD358, 0xBB8F},{0xD359, 0xBB90},{0xD35A, 0xBB91},{0xD35B, 0xBB92},{0xD35C, 0xBB93},{0xD35D, 0xBB94},{0xD35E, 0xBB95}, - {0xD35F, 0xBB96},{0xD360, 0xBB97},{0xD361, 0xBB98},{0xD362, 0xBB99},{0xD363, 0xBB9A},{0xD364, 0xBB9B},{0xD365, 0xBB9C},{0xD366, 0xBB9D}, - {0xD367, 0xBB9E},{0xD368, 0xBB9F},{0xD369, 0xBBA0},{0xD36A, 0xBC41},{0xD36B, 0xBC42},{0xD36C, 0xBC43},{0xD36D, 0xBC44},{0xD36E, 0xBC45}, - {0xD36F, 0xBC46},{0xD370, 0xBC47},{0xD371, 0xBC48},{0xD372, 0xBC49},{0xD373, 0xBC4A},{0xD374, 0xBC4B},{0xD375, 0xBC4C},{0xD376, 0xBC4D}, - {0xD377, 0xBC4E},{0xD378, 0xBC4F},{0xD379, 0xBC50},{0xD37A, 0xBC51},{0xD37B, 0xBC52},{0xD37C, 0xC6DB},{0xD37D, 0xC6DC},{0xD37E, 0xBC53}, - {0xD37F, 0xBC54},{0xD380, 0xC6DD},{0xD381, 0xBC55},{0xD382, 0xBC56},{0xD383, 0xBC57},{0xD384, 0xC6DE},{0xD385, 0xBC58},{0xD386, 0xBC59}, - {0xD387, 0xBC5A},{0xD388, 0xBC61},{0xD389, 0xBC62},{0xD38A, 0xBC63},{0xD38B, 0xBC64},{0xD38C, 0xC6DF},{0xD38D, 0xC6E0},{0xD38E, 0xBC65}, - {0xD38F, 0xC6E1},{0xD390, 0xC6E2},{0xD391, 0xC6E3},{0xD392, 0xBC66},{0xD393, 0xBC67},{0xD394, 0xBC68},{0xD395, 0xBC69},{0xD396, 0xBC6A}, - {0xD397, 0xBC6B},{0xD398, 0xC6E4},{0xD399, 0xC6E5},{0xD39A, 0xBC6C},{0xD39B, 0xBC6D},{0xD39C, 0xC6E6},{0xD39D, 0xBC6E},{0xD39E, 0xBC6F}, - {0xD39F, 0xBC70},{0xD3A0, 0xC6E7},{0xD3A1, 0xBC71},{0xD3A2, 0xBC72},{0xD3A3, 0xBC73},{0xD3A4, 0xBC74},{0xD3A5, 0xBC75},{0xD3A6, 0xBC76}, - {0xD3A7, 0xBC77},{0xD3A8, 0xC6E8},{0xD3A9, 0xC6E9},{0xD3AA, 0xBC78},{0xD3AB, 0xC6EA},{0xD3AC, 0xBC79},{0xD3AD, 0xC6EB},{0xD3AE, 0xBC7A}, - {0xD3AF, 0xBC81},{0xD3B0, 0xBC82},{0xD3B1, 0xBC83},{0xD3B2, 0xBC84},{0xD3B3, 0xBC85},{0xD3B4, 0xC6EC},{0xD3B5, 0xBC86},{0xD3B6, 0xBC87}, - {0xD3B7, 0xBC88},{0xD3B8, 0xC6ED},{0xD3B9, 0xBC89},{0xD3BA, 0xBC8A},{0xD3BB, 0xBC8B},{0xD3BC, 0xC6EE},{0xD3BD, 0xBC8C},{0xD3BE, 0xBC8D}, - {0xD3BF, 0xBC8E},{0xD3C0, 0xBC8F},{0xD3C1, 0xBC90},{0xD3C2, 0xBC91},{0xD3C3, 0xBC92},{0xD3C4, 0xC6EF},{0xD3C5, 0xC6F0},{0xD3C6, 0xBC93}, - {0xD3C7, 0xBC94},{0xD3C8, 0xC6F1},{0xD3C9, 0xC6F2},{0xD3CA, 0xBC95},{0xD3CB, 0xBC96},{0xD3CC, 0xBC97},{0xD3CD, 0xBC98},{0xD3CE, 0xBC99}, - {0xD3CF, 0xBC9A},{0xD3D0, 0xC6F3},{0xD3D1, 0xBC9B},{0xD3D2, 0xBC9C},{0xD3D3, 0xBC9D},{0xD3D4, 0xBC9E},{0xD3D5, 0xBC9F},{0xD3D6, 0xBCA0}, - {0xD3D7, 0xBD41},{0xD3D8, 0xC6F4},{0xD3D9, 0xBD42},{0xD3DA, 0xBD43},{0xD3DB, 0xBD44},{0xD3DC, 0xBD45},{0xD3DD, 0xBD46},{0xD3DE, 0xBD47}, - {0xD3DF, 0xBD48},{0xD3E0, 0xBD49},{0xD3E1, 0xC6F5},{0xD3E2, 0xBD4A},{0xD3E3, 0xC6F6},{0xD3E4, 0xBD4B},{0xD3E5, 0xBD4C},{0xD3E6, 0xBD4D}, - {0xD3E7, 0xBD4E},{0xD3E8, 0xBD4F},{0xD3E9, 0xBD50},{0xD3EA, 0xBD51},{0xD3EB, 0xBD52},{0xD3EC, 0xC6F7},{0xD3ED, 0xC6F8},{0xD3EE, 0xBD53}, - {0xD3EF, 0xBD54},{0xD3F0, 0xC6F9},{0xD3F1, 0xBD55},{0xD3F2, 0xBD56},{0xD3F3, 0xBD57},{0xD3F4, 0xC6FA},{0xD3F5, 0xBD58},{0xD3F6, 0xBD59}, - {0xD3F7, 0xBD5A},{0xD3F8, 0xBD61},{0xD3F9, 0xBD62},{0xD3FA, 0xBD63},{0xD3FB, 0xBD64},{0xD3FC, 0xC6FB},{0xD3FD, 0xC6FC},{0xD3FE, 0xBD65}, - {0xD3FF, 0xC6FD},{0xD400, 0xBD66},{0xD401, 0xC6FE},{0xD402, 0xBD67},{0xD403, 0xBD68},{0xD404, 0xBD69},{0xD405, 0xBD6A},{0xD406, 0xBD6B}, - {0xD407, 0xBD6C},{0xD408, 0xC7A1},{0xD409, 0xBD6D},{0xD40A, 0xBD6E},{0xD40B, 0xBD6F},{0xD40C, 0xBD70},{0xD40D, 0xBD71},{0xD40E, 0xBD72}, - {0xD40F, 0xBD73},{0xD410, 0xBD74},{0xD411, 0xBD75},{0xD412, 0xBD76},{0xD413, 0xBD77},{0xD414, 0xBD78},{0xD415, 0xBD79},{0xD416, 0xBD7A}, - {0xD417, 0xBD81},{0xD418, 0xBD82},{0xD419, 0xBD83},{0xD41A, 0xBD84},{0xD41B, 0xBD85},{0xD41C, 0xBD86},{0xD41D, 0xC7A2},{0xD41E, 0xBD87}, - {0xD41F, 0xBD88},{0xD420, 0xBD89},{0xD421, 0xBD8A},{0xD422, 0xBD8B},{0xD423, 0xBD8C},{0xD424, 0xBD8D},{0xD425, 0xBD8E},{0xD426, 0xBD8F}, - {0xD427, 0xBD90},{0xD428, 0xBD91},{0xD429, 0xBD92},{0xD42A, 0xBD93},{0xD42B, 0xBD94},{0xD42C, 0xBD95},{0xD42D, 0xBD96},{0xD42E, 0xBD97}, - {0xD42F, 0xBD98},{0xD430, 0xBD99},{0xD431, 0xBD9A},{0xD432, 0xBD9B},{0xD433, 0xBD9C},{0xD434, 0xBD9D},{0xD435, 0xBD9E},{0xD436, 0xBD9F}, - {0xD437, 0xBDA0},{0xD438, 0xBE41},{0xD439, 0xBE42},{0xD43A, 0xBE43},{0xD43B, 0xBE44},{0xD43C, 0xBE45},{0xD43D, 0xBE46},{0xD43E, 0xBE47}, - {0xD43F, 0xBE48},{0xD440, 0xC7A3},{0xD441, 0xBE49},{0xD442, 0xBE4A},{0xD443, 0xBE4B},{0xD444, 0xC7A4},{0xD445, 0xBE4C},{0xD446, 0xBE4D}, - {0xD447, 0xBE4E},{0xD448, 0xBE4F},{0xD449, 0xBE50},{0xD44A, 0xBE51},{0xD44B, 0xBE52},{0xD44C, 0xBE53},{0xD44D, 0xBE54},{0xD44E, 0xBE55}, - {0xD44F, 0xBE56},{0xD450, 0xBE57},{0xD451, 0xBE58},{0xD452, 0xBE59},{0xD453, 0xBE5A},{0xD454, 0xBE61},{0xD455, 0xBE62},{0xD456, 0xBE63}, - {0xD457, 0xBE64},{0xD458, 0xBE65},{0xD459, 0xBE66},{0xD45A, 0xBE67},{0xD45B, 0xBE68},{0xD45C, 0xC7A5},{0xD45D, 0xBE69},{0xD45E, 0xBE6A}, - {0xD45F, 0xBE6B},{0xD460, 0xC7A6},{0xD461, 0xBE6C},{0xD462, 0xBE6D},{0xD463, 0xBE6E},{0xD464, 0xC7A7},{0xD465, 0xBE6F},{0xD466, 0xBE70}, - {0xD467, 0xBE71},{0xD468, 0xBE72},{0xD469, 0xBE73},{0xD46A, 0xBE74},{0xD46B, 0xBE75},{0xD46C, 0xBE76},{0xD46D, 0xC7A8},{0xD46E, 0xBE77}, - {0xD46F, 0xC7A9},{0xD470, 0xBE78},{0xD471, 0xBE79},{0xD472, 0xBE7A},{0xD473, 0xBE81},{0xD474, 0xBE82},{0xD475, 0xBE83},{0xD476, 0xBE84}, - {0xD477, 0xBE85},{0xD478, 0xC7AA},{0xD479, 0xC7AB},{0xD47A, 0xBE86},{0xD47B, 0xBE87},{0xD47C, 0xC7AC},{0xD47D, 0xBE88},{0xD47E, 0xBE89}, - {0xD47F, 0xC7AD},{0xD480, 0xC7AE},{0xD481, 0xBE8A},{0xD482, 0xC7AF},{0xD483, 0xBE8B},{0xD484, 0xBE8C},{0xD485, 0xBE8D},{0xD486, 0xBE8E}, - {0xD487, 0xBE8F},{0xD488, 0xC7B0},{0xD489, 0xC7B1},{0xD48A, 0xBE90},{0xD48B, 0xC7B2},{0xD48C, 0xBE91},{0xD48D, 0xC7B3},{0xD48E, 0xBE92}, - {0xD48F, 0xBE93},{0xD490, 0xBE94},{0xD491, 0xBE95},{0xD492, 0xBE96},{0xD493, 0xBE97},{0xD494, 0xC7B4},{0xD495, 0xBE98},{0xD496, 0xBE99}, - {0xD497, 0xBE9A},{0xD498, 0xBE9B},{0xD499, 0xBE9C},{0xD49A, 0xBE9D},{0xD49B, 0xBE9E},{0xD49C, 0xBE9F},{0xD49D, 0xBEA0},{0xD49E, 0xBF41}, - {0xD49F, 0xBF42},{0xD4A0, 0xBF43},{0xD4A1, 0xBF44},{0xD4A2, 0xBF45},{0xD4A3, 0xBF46},{0xD4A4, 0xBF47},{0xD4A5, 0xBF48},{0xD4A6, 0xBF49}, - {0xD4A7, 0xBF4A},{0xD4A8, 0xBF4B},{0xD4A9, 0xC7B5},{0xD4AA, 0xBF4C},{0xD4AB, 0xBF4D},{0xD4AC, 0xBF4E},{0xD4AD, 0xBF4F},{0xD4AE, 0xBF50}, - {0xD4AF, 0xBF51},{0xD4B0, 0xBF52},{0xD4B1, 0xBF53},{0xD4B2, 0xBF54},{0xD4B3, 0xBF55},{0xD4B4, 0xBF56},{0xD4B5, 0xBF57},{0xD4B6, 0xBF58}, - {0xD4B7, 0xBF59},{0xD4B8, 0xBF5A},{0xD4B9, 0xBF61},{0xD4BA, 0xBF62},{0xD4BB, 0xBF63},{0xD4BC, 0xBF64},{0xD4BD, 0xBF65},{0xD4BE, 0xBF66}, - {0xD4BF, 0xBF67},{0xD4C0, 0xBF68},{0xD4C1, 0xBF69},{0xD4C2, 0xBF6A},{0xD4C3, 0xBF6B},{0xD4C4, 0xBF6C},{0xD4C5, 0xBF6D},{0xD4C6, 0xBF6E}, - {0xD4C7, 0xBF6F},{0xD4C8, 0xBF70},{0xD4C9, 0xBF71},{0xD4CA, 0xBF72},{0xD4CB, 0xBF73},{0xD4CC, 0xC7B6},{0xD4CD, 0xBF74},{0xD4CE, 0xBF75}, - {0xD4CF, 0xBF76},{0xD4D0, 0xC7B7},{0xD4D1, 0xBF77},{0xD4D2, 0xBF78},{0xD4D3, 0xBF79},{0xD4D4, 0xC7B8},{0xD4D5, 0xBF7A},{0xD4D6, 0xBF81}, - {0xD4D7, 0xBF82},{0xD4D8, 0xBF83},{0xD4D9, 0xBF84},{0xD4DA, 0xBF85},{0xD4DB, 0xBF86},{0xD4DC, 0xC7B9},{0xD4DD, 0xBF87},{0xD4DE, 0xBF88}, - {0xD4DF, 0xC7BA},{0xD4E0, 0xBF89},{0xD4E1, 0xBF8A},{0xD4E2, 0xBF8B},{0xD4E3, 0xBF8C},{0xD4E4, 0xBF8D},{0xD4E5, 0xBF8E},{0xD4E6, 0xBF8F}, - {0xD4E7, 0xBF90},{0xD4E8, 0xC7BB},{0xD4E9, 0xBF91},{0xD4EA, 0xBF92},{0xD4EB, 0xBF93},{0xD4EC, 0xC7BC},{0xD4ED, 0xBF94},{0xD4EE, 0xBF95}, - {0xD4EF, 0xBF96},{0xD4F0, 0xC7BD},{0xD4F1, 0xBF97},{0xD4F2, 0xBF98},{0xD4F3, 0xBF99},{0xD4F4, 0xBF9A},{0xD4F5, 0xBF9B},{0xD4F6, 0xBF9C}, - {0xD4F7, 0xBF9D},{0xD4F8, 0xC7BE},{0xD4F9, 0xBF9E},{0xD4FA, 0xBF9F},{0xD4FB, 0xC7BF},{0xD4FC, 0xBFA0},{0xD4FD, 0xC7C0},{0xD4FE, 0xC041}, - {0xD4FF, 0xC042},{0xD500, 0xC043},{0xD501, 0xC044},{0xD502, 0xC045},{0xD503, 0xC046},{0xD504, 0xC7C1},{0xD505, 0xC047},{0xD506, 0xC048}, - {0xD507, 0xC049},{0xD508, 0xC7C2},{0xD509, 0xC04A},{0xD50A, 0xC04B},{0xD50B, 0xC04C},{0xD50C, 0xC7C3},{0xD50D, 0xC04D},{0xD50E, 0xC04E}, - {0xD50F, 0xC04F},{0xD510, 0xC050},{0xD511, 0xC051},{0xD512, 0xC052},{0xD513, 0xC053},{0xD514, 0xC7C4},{0xD515, 0xC7C5},{0xD516, 0xC054}, - {0xD517, 0xC7C6},{0xD518, 0xC055},{0xD519, 0xC056},{0xD51A, 0xC057},{0xD51B, 0xC058},{0xD51C, 0xC059},{0xD51D, 0xC05A},{0xD51E, 0xC061}, - {0xD51F, 0xC062},{0xD520, 0xC063},{0xD521, 0xC064},{0xD522, 0xC065},{0xD523, 0xC066},{0xD524, 0xC067},{0xD525, 0xC068},{0xD526, 0xC069}, - {0xD527, 0xC06A},{0xD528, 0xC06B},{0xD529, 0xC06C},{0xD52A, 0xC06D},{0xD52B, 0xC06E},{0xD52C, 0xC06F},{0xD52D, 0xC070},{0xD52E, 0xC071}, - {0xD52F, 0xC072},{0xD530, 0xC073},{0xD531, 0xC074},{0xD532, 0xC075},{0xD533, 0xC076},{0xD534, 0xC077},{0xD535, 0xC078},{0xD536, 0xC079}, - {0xD537, 0xC07A},{0xD538, 0xC081},{0xD539, 0xC082},{0xD53A, 0xC083},{0xD53B, 0xC084},{0xD53C, 0xC7C7},{0xD53D, 0xC7C8},{0xD53E, 0xC085}, - {0xD53F, 0xC086},{0xD540, 0xC7C9},{0xD541, 0xC087},{0xD542, 0xC088},{0xD543, 0xC089},{0xD544, 0xC7CA},{0xD545, 0xC08A},{0xD546, 0xC08B}, - {0xD547, 0xC08C},{0xD548, 0xC08D},{0xD549, 0xC08E},{0xD54A, 0xC08F},{0xD54B, 0xC090},{0xD54C, 0xC7CB},{0xD54D, 0xC7CC},{0xD54E, 0xC091}, - {0xD54F, 0xC7CD},{0xD550, 0xC092},{0xD551, 0xC7CE},{0xD552, 0xC093},{0xD553, 0xC094},{0xD554, 0xC095},{0xD555, 0xC096},{0xD556, 0xC097}, - {0xD557, 0xC098},{0xD558, 0xC7CF},{0xD559, 0xC7D0},{0xD55A, 0xC099},{0xD55B, 0xC09A},{0xD55C, 0xC7D1},{0xD55D, 0xC09B},{0xD55E, 0xC09C}, - {0xD55F, 0xC09D},{0xD560, 0xC7D2},{0xD561, 0xC09E},{0xD562, 0xC09F},{0xD563, 0xC0A0},{0xD564, 0xC141},{0xD565, 0xC7D3},{0xD566, 0xC142}, - {0xD567, 0xC143},{0xD568, 0xC7D4},{0xD569, 0xC7D5},{0xD56A, 0xC144},{0xD56B, 0xC7D6},{0xD56C, 0xC145},{0xD56D, 0xC7D7},{0xD56E, 0xC146}, - {0xD56F, 0xC147},{0xD570, 0xC148},{0xD571, 0xC149},{0xD572, 0xC14A},{0xD573, 0xC14B},{0xD574, 0xC7D8},{0xD575, 0xC7D9},{0xD576, 0xC14C}, - {0xD577, 0xC14D},{0xD578, 0xC7DA},{0xD579, 0xC14E},{0xD57A, 0xC14F},{0xD57B, 0xC150},{0xD57C, 0xC7DB},{0xD57D, 0xC151},{0xD57E, 0xC152}, - {0xD57F, 0xC153},{0xD580, 0xC154},{0xD581, 0xC155},{0xD582, 0xC156},{0xD583, 0xC157},{0xD584, 0xC7DC},{0xD585, 0xC7DD},{0xD586, 0xC158}, - {0xD587, 0xC7DE},{0xD588, 0xC7DF},{0xD589, 0xC7E0},{0xD58A, 0xC159},{0xD58B, 0xC15A},{0xD58C, 0xC161},{0xD58D, 0xC162},{0xD58E, 0xC163}, - {0xD58F, 0xC164},{0xD590, 0xC7E1},{0xD591, 0xC165},{0xD592, 0xC166},{0xD593, 0xC167},{0xD594, 0xC168},{0xD595, 0xC169},{0xD596, 0xC16A}, - {0xD597, 0xC16B},{0xD598, 0xC16C},{0xD599, 0xC16D},{0xD59A, 0xC16E},{0xD59B, 0xC16F},{0xD59C, 0xC170},{0xD59D, 0xC171},{0xD59E, 0xC172}, - {0xD59F, 0xC173},{0xD5A0, 0xC174},{0xD5A1, 0xC175},{0xD5A2, 0xC176},{0xD5A3, 0xC177},{0xD5A4, 0xC178},{0xD5A5, 0xC7E2},{0xD5A6, 0xC179}, - {0xD5A7, 0xC17A},{0xD5A8, 0xC181},{0xD5A9, 0xC182},{0xD5AA, 0xC183},{0xD5AB, 0xC184},{0xD5AC, 0xC185},{0xD5AD, 0xC186},{0xD5AE, 0xC187}, - {0xD5AF, 0xC188},{0xD5B0, 0xC189},{0xD5B1, 0xC18A},{0xD5B2, 0xC18B},{0xD5B3, 0xC18C},{0xD5B4, 0xC18D},{0xD5B5, 0xC18E},{0xD5B6, 0xC18F}, - {0xD5B7, 0xC190},{0xD5B8, 0xC191},{0xD5B9, 0xC192},{0xD5BA, 0xC193},{0xD5BB, 0xC194},{0xD5BC, 0xC195},{0xD5BD, 0xC196},{0xD5BE, 0xC197}, - {0xD5BF, 0xC198},{0xD5C0, 0xC199},{0xD5C1, 0xC19A},{0xD5C2, 0xC19B},{0xD5C3, 0xC19C},{0xD5C4, 0xC19D},{0xD5C5, 0xC19E},{0xD5C6, 0xC19F}, - {0xD5C7, 0xC1A0},{0xD5C8, 0xC7E3},{0xD5C9, 0xC7E4},{0xD5CA, 0xC241},{0xD5CB, 0xC242},{0xD5CC, 0xC7E5},{0xD5CD, 0xC243},{0xD5CE, 0xC244}, - {0xD5CF, 0xC245},{0xD5D0, 0xC7E6},{0xD5D1, 0xC246},{0xD5D2, 0xC7E7},{0xD5D3, 0xC247},{0xD5D4, 0xC248},{0xD5D5, 0xC249},{0xD5D6, 0xC24A}, - {0xD5D7, 0xC24B},{0xD5D8, 0xC7E8},{0xD5D9, 0xC7E9},{0xD5DA, 0xC24C},{0xD5DB, 0xC7EA},{0xD5DC, 0xC24D},{0xD5DD, 0xC7EB},{0xD5DE, 0xC24E}, - {0xD5DF, 0xC24F},{0xD5E0, 0xC250},{0xD5E1, 0xC251},{0xD5E2, 0xC252},{0xD5E3, 0xC253},{0xD5E4, 0xC7EC},{0xD5E5, 0xC7ED},{0xD5E6, 0xC254}, - {0xD5E7, 0xC255},{0xD5E8, 0xC7EE},{0xD5E9, 0xC256},{0xD5EA, 0xC257},{0xD5EB, 0xC258},{0xD5EC, 0xC7EF},{0xD5ED, 0xC259},{0xD5EE, 0xC25A}, - {0xD5EF, 0xC261},{0xD5F0, 0xC262},{0xD5F1, 0xC263},{0xD5F2, 0xC264},{0xD5F3, 0xC265},{0xD5F4, 0xC7F0},{0xD5F5, 0xC7F1},{0xD5F6, 0xC266}, - {0xD5F7, 0xC7F2},{0xD5F8, 0xC267},{0xD5F9, 0xC7F3},{0xD5FA, 0xC268},{0xD5FB, 0xC269},{0xD5FC, 0xC26A},{0xD5FD, 0xC26B},{0xD5FE, 0xC26C}, - {0xD5FF, 0xC26D},{0xD600, 0xC7F4},{0xD601, 0xC7F5},{0xD602, 0xC26E},{0xD603, 0xC26F},{0xD604, 0xC7F6},{0xD605, 0xC270},{0xD606, 0xC271}, - {0xD607, 0xC272},{0xD608, 0xC7F7},{0xD609, 0xC273},{0xD60A, 0xC274},{0xD60B, 0xC275},{0xD60C, 0xC276},{0xD60D, 0xC277},{0xD60E, 0xC278}, - {0xD60F, 0xC279},{0xD610, 0xC7F8},{0xD611, 0xC7F9},{0xD612, 0xC27A},{0xD613, 0xC7FA},{0xD614, 0xC7FB},{0xD615, 0xC7FC},{0xD616, 0xC281}, - {0xD617, 0xC282},{0xD618, 0xC283},{0xD619, 0xC284},{0xD61A, 0xC285},{0xD61B, 0xC286},{0xD61C, 0xC7FD},{0xD61D, 0xC287},{0xD61E, 0xC288}, - {0xD61F, 0xC289},{0xD620, 0xC7FE},{0xD621, 0xC28A},{0xD622, 0xC28B},{0xD623, 0xC28C},{0xD624, 0xC8A1},{0xD625, 0xC28D},{0xD626, 0xC28E}, - {0xD627, 0xC28F},{0xD628, 0xC290},{0xD629, 0xC291},{0xD62A, 0xC292},{0xD62B, 0xC293},{0xD62C, 0xC294},{0xD62D, 0xC8A2},{0xD62E, 0xC295}, - {0xD62F, 0xC296},{0xD630, 0xC297},{0xD631, 0xC298},{0xD632, 0xC299},{0xD633, 0xC29A},{0xD634, 0xC29B},{0xD635, 0xC29C},{0xD636, 0xC29D}, - {0xD637, 0xC29E},{0xD638, 0xC8A3},{0xD639, 0xC8A4},{0xD63A, 0xC29F},{0xD63B, 0xC2A0},{0xD63C, 0xC8A5},{0xD63D, 0xC341},{0xD63E, 0xC342}, - {0xD63F, 0xC343},{0xD640, 0xC8A6},{0xD641, 0xC344},{0xD642, 0xC345},{0xD643, 0xC346},{0xD644, 0xC347},{0xD645, 0xC8A7},{0xD646, 0xC348}, - {0xD647, 0xC349},{0xD648, 0xC8A8},{0xD649, 0xC8A9},{0xD64A, 0xC34A},{0xD64B, 0xC8AA},{0xD64C, 0xC34B},{0xD64D, 0xC8AB},{0xD64E, 0xC34C}, - {0xD64F, 0xC34D},{0xD650, 0xC34E},{0xD651, 0xC8AC},{0xD652, 0xC34F},{0xD653, 0xC350},{0xD654, 0xC8AD},{0xD655, 0xC8AE},{0xD656, 0xC351}, - {0xD657, 0xC352},{0xD658, 0xC8AF},{0xD659, 0xC353},{0xD65A, 0xC354},{0xD65B, 0xC355},{0xD65C, 0xC8B0},{0xD65D, 0xC356},{0xD65E, 0xC357}, - {0xD65F, 0xC358},{0xD660, 0xC359},{0xD661, 0xC35A},{0xD662, 0xC361},{0xD663, 0xC362},{0xD664, 0xC363},{0xD665, 0xC364},{0xD666, 0xC365}, - {0xD667, 0xC8B1},{0xD668, 0xC366},{0xD669, 0xC8B2},{0xD66A, 0xC367},{0xD66B, 0xC368},{0xD66C, 0xC369},{0xD66D, 0xC36A},{0xD66E, 0xC36B}, - {0xD66F, 0xC36C},{0xD670, 0xC8B3},{0xD671, 0xC8B4},{0xD672, 0xC36D},{0xD673, 0xC36E},{0xD674, 0xC8B5},{0xD675, 0xC36F},{0xD676, 0xC370}, - {0xD677, 0xC371},{0xD678, 0xC372},{0xD679, 0xC373},{0xD67A, 0xC374},{0xD67B, 0xC375},{0xD67C, 0xC376},{0xD67D, 0xC377},{0xD67E, 0xC378}, - {0xD67F, 0xC379},{0xD680, 0xC37A},{0xD681, 0xC381},{0xD682, 0xC382},{0xD683, 0xC8B6},{0xD684, 0xC383},{0xD685, 0xC8B7},{0xD686, 0xC384}, - {0xD687, 0xC385},{0xD688, 0xC386},{0xD689, 0xC387},{0xD68A, 0xC388},{0xD68B, 0xC389},{0xD68C, 0xC8B8},{0xD68D, 0xC8B9},{0xD68E, 0xC38A}, - {0xD68F, 0xC38B},{0xD690, 0xC8BA},{0xD691, 0xC38C},{0xD692, 0xC38D},{0xD693, 0xC38E},{0xD694, 0xC8BB},{0xD695, 0xC38F},{0xD696, 0xC390}, - {0xD697, 0xC391},{0xD698, 0xC392},{0xD699, 0xC393},{0xD69A, 0xC394},{0xD69B, 0xC395},{0xD69C, 0xC396},{0xD69D, 0xC8BC},{0xD69E, 0xC397}, - {0xD69F, 0xC8BD},{0xD6A0, 0xC398},{0xD6A1, 0xC8BE},{0xD6A2, 0xC399},{0xD6A3, 0xC39A},{0xD6A4, 0xC39B},{0xD6A5, 0xC39C},{0xD6A6, 0xC39D}, - {0xD6A7, 0xC39E},{0xD6A8, 0xC8BF},{0xD6A9, 0xC39F},{0xD6AA, 0xC3A0},{0xD6AB, 0xC441},{0xD6AC, 0xC8C0},{0xD6AD, 0xC442},{0xD6AE, 0xC443}, - {0xD6AF, 0xC444},{0xD6B0, 0xC8C1},{0xD6B1, 0xC445},{0xD6B2, 0xC446},{0xD6B3, 0xC447},{0xD6B4, 0xC448},{0xD6B5, 0xC449},{0xD6B6, 0xC44A}, - {0xD6B7, 0xC44B},{0xD6B8, 0xC44C},{0xD6B9, 0xC8C2},{0xD6BA, 0xC44D},{0xD6BB, 0xC8C3},{0xD6BC, 0xC44E},{0xD6BD, 0xC44F},{0xD6BE, 0xC450}, - {0xD6BF, 0xC451},{0xD6C0, 0xC452},{0xD6C1, 0xC453},{0xD6C2, 0xC454},{0xD6C3, 0xC455},{0xD6C4, 0xC8C4},{0xD6C5, 0xC8C5},{0xD6C6, 0xC456}, - {0xD6C7, 0xC457},{0xD6C8, 0xC8C6},{0xD6C9, 0xC458},{0xD6CA, 0xC459},{0xD6CB, 0xC45A},{0xD6CC, 0xC8C7},{0xD6CD, 0xC461},{0xD6CE, 0xC462}, - {0xD6CF, 0xC463},{0xD6D0, 0xC464},{0xD6D1, 0xC8C8},{0xD6D2, 0xC465},{0xD6D3, 0xC466},{0xD6D4, 0xC8C9},{0xD6D5, 0xC467},{0xD6D6, 0xC468}, - {0xD6D7, 0xC8CA},{0xD6D8, 0xC469},{0xD6D9, 0xC8CB},{0xD6DA, 0xC46A},{0xD6DB, 0xC46B},{0xD6DC, 0xC46C},{0xD6DD, 0xC46D},{0xD6DE, 0xC46E}, - {0xD6DF, 0xC46F},{0xD6E0, 0xC8CC},{0xD6E1, 0xC470},{0xD6E2, 0xC471},{0xD6E3, 0xC472},{0xD6E4, 0xC8CD},{0xD6E5, 0xC473},{0xD6E6, 0xC474}, - {0xD6E7, 0xC475},{0xD6E8, 0xC8CE},{0xD6E9, 0xC476},{0xD6EA, 0xC477},{0xD6EB, 0xC478},{0xD6EC, 0xC479},{0xD6ED, 0xC47A},{0xD6EE, 0xC481}, - {0xD6EF, 0xC482},{0xD6F0, 0xC8CF},{0xD6F1, 0xC483},{0xD6F2, 0xC484},{0xD6F3, 0xC485},{0xD6F4, 0xC486},{0xD6F5, 0xC8D0},{0xD6F6, 0xC487}, - {0xD6F7, 0xC488},{0xD6F8, 0xC489},{0xD6F9, 0xC48A},{0xD6FA, 0xC48B},{0xD6FB, 0xC48C},{0xD6FC, 0xC8D1},{0xD6FD, 0xC8D2},{0xD6FE, 0xC48D}, - {0xD6FF, 0xC48E},{0xD700, 0xC8D3},{0xD701, 0xC48F},{0xD702, 0xC490},{0xD703, 0xC491},{0xD704, 0xC8D4},{0xD705, 0xC492},{0xD706, 0xC493}, - {0xD707, 0xC494},{0xD708, 0xC495},{0xD709, 0xC496},{0xD70A, 0xC497},{0xD70B, 0xC498},{0xD70C, 0xC499},{0xD70D, 0xC49A},{0xD70E, 0xC49B}, - {0xD70F, 0xC49C},{0xD710, 0xC49D},{0xD711, 0xC8D5},{0xD712, 0xC49E},{0xD713, 0xC49F},{0xD714, 0xC4A0},{0xD715, 0xC541},{0xD716, 0xC542}, - {0xD717, 0xC543},{0xD718, 0xC8D6},{0xD719, 0xC8D7},{0xD71A, 0xC544},{0xD71B, 0xC545},{0xD71C, 0xC8D8},{0xD71D, 0xC546},{0xD71E, 0xC547}, - {0xD71F, 0xC548},{0xD720, 0xC8D9},{0xD721, 0xC549},{0xD722, 0xC54A},{0xD723, 0xC54B},{0xD724, 0xC54C},{0xD725, 0xC54D},{0xD726, 0xC54E}, - {0xD727, 0xC54F},{0xD728, 0xC8DA},{0xD729, 0xC8DB},{0xD72A, 0xC550},{0xD72B, 0xC8DC},{0xD72C, 0xC551},{0xD72D, 0xC8DD},{0xD72E, 0xC552}, - {0xD72F, 0xC553},{0xD730, 0xC554},{0xD731, 0xC555},{0xD732, 0xC556},{0xD733, 0xC557},{0xD734, 0xC8DE},{0xD735, 0xC8DF},{0xD736, 0xC558}, - {0xD737, 0xC559},{0xD738, 0xC8E0},{0xD739, 0xC55A},{0xD73A, 0xC561},{0xD73B, 0xC562},{0xD73C, 0xC8E1},{0xD73D, 0xC563},{0xD73E, 0xC564}, - {0xD73F, 0xC565},{0xD740, 0xC566},{0xD741, 0xC567},{0xD742, 0xC568},{0xD743, 0xC569},{0xD744, 0xC8E2},{0xD745, 0xC56A},{0xD746, 0xC56B}, - {0xD747, 0xC8E3},{0xD748, 0xC56C},{0xD749, 0xC8E4},{0xD74A, 0xC56D},{0xD74B, 0xC56E},{0xD74C, 0xC56F},{0xD74D, 0xC570},{0xD74E, 0xC571}, - {0xD74F, 0xC572},{0xD750, 0xC8E5},{0xD751, 0xC8E6},{0xD752, 0xC573},{0xD753, 0xC574},{0xD754, 0xC8E7},{0xD755, 0xC575},{0xD756, 0xC8E8}, - {0xD757, 0xC8E9},{0xD758, 0xC8EA},{0xD759, 0xC8EB},{0xD75A, 0xC576},{0xD75B, 0xC577},{0xD75C, 0xC578},{0xD75D, 0xC579},{0xD75E, 0xC57A}, - {0xD75F, 0xC581},{0xD760, 0xC8EC},{0xD761, 0xC8ED},{0xD762, 0xC582},{0xD763, 0xC8EE},{0xD764, 0xC583},{0xD765, 0xC8EF},{0xD766, 0xC584}, - {0xD767, 0xC585},{0xD768, 0xC586},{0xD769, 0xC8F0},{0xD76A, 0xC587},{0xD76B, 0xC588},{0xD76C, 0xC8F1},{0xD76D, 0xC589},{0xD76E, 0xC58A}, - {0xD76F, 0xC58B},{0xD770, 0xC8F2},{0xD771, 0xC58C},{0xD772, 0xC58D},{0xD773, 0xC58E},{0xD774, 0xC8F3},{0xD775, 0xC58F},{0xD776, 0xC590}, - {0xD777, 0xC591},{0xD778, 0xC592},{0xD779, 0xC593},{0xD77A, 0xC594},{0xD77B, 0xC595},{0xD77C, 0xC8F4},{0xD77D, 0xC8F5},{0xD77E, 0xC596}, - {0xD77F, 0xC597},{0xD780, 0xC598},{0xD781, 0xC8F6},{0xD782, 0xC599},{0xD783, 0xC59A},{0xD784, 0xC59B},{0xD785, 0xC59C},{0xD786, 0xC59D}, - {0xD787, 0xC59E},{0xD788, 0xC8F7},{0xD789, 0xC8F8},{0xD78A, 0xC59F},{0xD78B, 0xC5A0},{0xD78C, 0xC8F9},{0xD78D, 0xC641},{0xD78E, 0xC642}, - {0xD78F, 0xC643},{0xD790, 0xC8FA},{0xD791, 0xC644},{0xD792, 0xC645},{0xD793, 0xC646},{0xD794, 0xC647},{0xD795, 0xC648},{0xD796, 0xC649}, - {0xD797, 0xC64A},{0xD798, 0xC8FB},{0xD799, 0xC8FC},{0xD79A, 0xC64B},{0xD79B, 0xC8FD},{0xD79C, 0xC64C},{0xD79D, 0xC8FE},{0xD79E, 0xC64D}, - {0xD79F, 0xC64E},{0xD7A0, 0xC64F},{0xD7A1, 0xC650},{0xD7A2, 0xC651},{0xD7A3, 0xC652},{0xF900, 0xCBD0},{0xF901, 0xCBD6},{0xF902, 0xCBE7}, - {0xF903, 0xCDCF},{0xF904, 0xCDE8},{0xF905, 0xCEAD},{0xF906, 0xCFFB},{0xF907, 0xD0A2},{0xF908, 0xD0B8},{0xF909, 0xD0D0},{0xF90A, 0xD0DD}, - {0xF90B, 0xD1D4},{0xF90C, 0xD1D5},{0xF90D, 0xD1D8},{0xF90E, 0xD1DB},{0xF90F, 0xD1DC},{0xF910, 0xD1DD},{0xF911, 0xD1DE},{0xF912, 0xD1DF}, - {0xF913, 0xD1E0},{0xF914, 0xD1E2},{0xF915, 0xD1E3},{0xF916, 0xD1E4},{0xF917, 0xD1E5},{0xF918, 0xD1E6},{0xF919, 0xD1E8},{0xF91A, 0xD1E9}, - {0xF91B, 0xD1EA},{0xF91C, 0xD1EB},{0xF91D, 0xD1ED},{0xF91E, 0xD1EF},{0xF91F, 0xD1F0},{0xF920, 0xD1F2},{0xF921, 0xD1F6},{0xF922, 0xD1FA}, - {0xF923, 0xD1FC},{0xF924, 0xD1FD},{0xF925, 0xD1FE},{0xF926, 0xD2A2},{0xF927, 0xD2A3},{0xF928, 0xD2A7},{0xF929, 0xD2A8},{0xF92A, 0xD2A9}, - {0xF92B, 0xD2AA},{0xF92C, 0xD2AB},{0xF92D, 0xD2AD},{0xF92E, 0xD2B2},{0xF92F, 0xD2BE},{0xF930, 0xD2C2},{0xF931, 0xD2C3},{0xF932, 0xD2C4}, - {0xF933, 0xD2C6},{0xF934, 0xD2C7},{0xF935, 0xD2C8},{0xF936, 0xD2C9},{0xF937, 0xD2CA},{0xF938, 0xD2CB},{0xF939, 0xD2CD},{0xF93A, 0xD2CE}, - {0xF93B, 0xD2CF},{0xF93C, 0xD2D0},{0xF93D, 0xD2D1},{0xF93E, 0xD2D2},{0xF93F, 0xD2D3},{0xF940, 0xD2D4},{0xF941, 0xD2D5},{0xF942, 0xD2D6}, - {0xF943, 0xD2D7},{0xF944, 0xD2D9},{0xF945, 0xD2DA},{0xF946, 0xD2DE},{0xF947, 0xD2DF},{0xF948, 0xD2E1},{0xF949, 0xD2E2},{0xF94A, 0xD2E4}, - {0xF94B, 0xD2E5},{0xF94C, 0xD2E6},{0xF94D, 0xD2E7},{0xF94E, 0xD2E8},{0xF94F, 0xD2E9},{0xF950, 0xD2EA},{0xF951, 0xD2EB},{0xF952, 0xD2F0}, - {0xF953, 0xD2F1},{0xF954, 0xD2F2},{0xF955, 0xD2F3},{0xF956, 0xD2F4},{0xF957, 0xD2F5},{0xF958, 0xD2F7},{0xF959, 0xD2F8},{0xF95A, 0xD4E6}, - {0xF95B, 0xD4FC},{0xF95C, 0xD5A5},{0xF95D, 0xD5AB},{0xF95E, 0xD5AE},{0xF95F, 0xD6B8},{0xF960, 0xD6CD},{0xF961, 0xD7CB},{0xF962, 0xD7E4}, - {0xF963, 0xDBC5},{0xF964, 0xDBE4},{0xF965, 0xDCA5},{0xF966, 0xDDA5},{0xF967, 0xDDD5},{0xF968, 0xDDF4},{0xF969, 0xDEFC},{0xF96A, 0xDEFE}, - {0xF96B, 0xDFB3},{0xF96C, 0xDFE1},{0xF96D, 0xDFE8},{0xF96E, 0xE0F1},{0xF96F, 0xE1AD},{0xF970, 0xE1ED},{0xF971, 0xE3F5},{0xF972, 0xE4A1}, - {0xF973, 0xE4A9},{0xF974, 0xE5AE},{0xF975, 0xE5B1},{0xF976, 0xE5B2},{0xF977, 0xE5B9},{0xF978, 0xE5BB},{0xF979, 0xE5BC},{0xF97A, 0xE5C4}, - {0xF97B, 0xE5CE},{0xF97C, 0xE5D0},{0xF97D, 0xE5D2},{0xF97E, 0xE5D6},{0xF97F, 0xE5FA},{0xF980, 0xE5FB},{0xF981, 0xE5FC},{0xF982, 0xE5FE}, - {0xF983, 0xE6A1},{0xF984, 0xE6A4},{0xF985, 0xE6A7},{0xF986, 0xE6AD},{0xF987, 0xE6AF},{0xF988, 0xE6B0},{0xF989, 0xE6B1},{0xF98A, 0xE6B3}, - {0xF98B, 0xE6B7},{0xF98C, 0xE6B8},{0xF98D, 0xE6BC},{0xF98E, 0xE6C4},{0xF98F, 0xE6C6},{0xF990, 0xE6C7},{0xF991, 0xE6CA},{0xF992, 0xE6D2}, - {0xF993, 0xE6D6},{0xF994, 0xE6D9},{0xF995, 0xE6DC},{0xF996, 0xE6DF},{0xF997, 0xE6E1},{0xF998, 0xE6E4},{0xF999, 0xE6E5},{0xF99A, 0xE6E6}, - {0xF99B, 0xE6E8},{0xF99C, 0xE6EA},{0xF99D, 0xE6EB},{0xF99E, 0xE6EC},{0xF99F, 0xE6EF},{0xF9A0, 0xE6F1},{0xF9A1, 0xE6F2},{0xF9A2, 0xE6F5}, - {0xF9A3, 0xE6F6},{0xF9A4, 0xE6F7},{0xF9A5, 0xE6F9},{0xF9A6, 0xE7A1},{0xF9A7, 0xE7A6},{0xF9A8, 0xE7A9},{0xF9A9, 0xE7AA},{0xF9AA, 0xE7AC}, - {0xF9AB, 0xE7AD},{0xF9AC, 0xE7B0},{0xF9AD, 0xE7BF},{0xF9AE, 0xE7C1},{0xF9AF, 0xE7C6},{0xF9B0, 0xE7C7},{0xF9B1, 0xE7CB},{0xF9B2, 0xE7CD}, - {0xF9B3, 0xE7CF},{0xF9B4, 0xE7D0},{0xF9B5, 0xE7D3},{0xF9B6, 0xE7DF},{0xF9B7, 0xE7E4},{0xF9B8, 0xE7E6},{0xF9B9, 0xE7F7},{0xF9BA, 0xE8E7}, - {0xF9BB, 0xE8E8},{0xF9BC, 0xE8F0},{0xF9BD, 0xE8F1},{0xF9BE, 0xE8F7},{0xF9BF, 0xE8F9},{0xF9C0, 0xE8FB},{0xF9C1, 0xE8FE},{0xF9C2, 0xE9A7}, - {0xF9C3, 0xE9AC},{0xF9C4, 0xE9CC},{0xF9C5, 0xE9F7},{0xF9C6, 0xEAC1},{0xF9C7, 0xEAE5},{0xF9C8, 0xEAF4},{0xF9C9, 0xEAF7},{0xF9CA, 0xEAFC}, - {0xF9CB, 0xEAFE},{0xF9CC, 0xEBA4},{0xF9CD, 0xEBA7},{0xF9CE, 0xEBA9},{0xF9CF, 0xEBAA},{0xF9D0, 0xEBBA},{0xF9D1, 0xEBBB},{0xF9D2, 0xEBBD}, - {0xF9D3, 0xEBC1},{0xF9D4, 0xEBC2},{0xF9D5, 0xEBC6},{0xF9D6, 0xEBC7},{0xF9D7, 0xEBCC},{0xF9D8, 0xEBCF},{0xF9D9, 0xEBD0},{0xF9DA, 0xEBD1}, - {0xF9DB, 0xEBD2},{0xF9DC, 0xEBD8},{0xF9DD, 0xECA6},{0xF9DE, 0xECA7},{0xF9DF, 0xECAA},{0xF9E0, 0xECAF},{0xF9E1, 0xECB0},{0xF9E2, 0xECB1}, - {0xF9E3, 0xECB2},{0xF9E4, 0xECB5},{0xF9E5, 0xECB8},{0xF9E6, 0xECBA},{0xF9E7, 0xECC0},{0xF9E8, 0xECC1},{0xF9E9, 0xECC5},{0xF9EA, 0xECC6}, - {0xF9EB, 0xECC9},{0xF9EC, 0xECCA},{0xF9ED, 0xECD5},{0xF9EE, 0xECDD},{0xF9EF, 0xECDE},{0xF9F0, 0xECE1},{0xF9F1, 0xECE4},{0xF9F2, 0xECE7}, - {0xF9F3, 0xECE8},{0xF9F4, 0xECF7},{0xF9F5, 0xECF8},{0xF9F6, 0xECFA},{0xF9F7, 0xEDA1},{0xF9F8, 0xEDA2},{0xF9F9, 0xEDA3},{0xF9FA, 0xEDEE}, - {0xF9FB, 0xEEDB},{0xF9FC, 0xF2BD},{0xF9FD, 0xF2FA},{0xF9FE, 0xF3B1},{0xF9FF, 0xF4A7},{0xFA00, 0xF4EE},{0xFA01, 0xF6F4},{0xFA02, 0xF6F6}, - {0xFA03, 0xF7B8},{0xFA04, 0xF7C8},{0xFA05, 0xF7D3},{0xFA06, 0xF8DB},{0xFA07, 0xF8F0},{0xFA08, 0xFAA1},{0xFA09, 0xFAA2},{0xFA0A, 0xFAE6}, - {0xFA0B, 0xFCA9},{0xFF01, 0xA3A1},{0xFF02, 0xA3A2},{0xFF03, 0xA3A3},{0xFF04, 0xA3A4},{0xFF05, 0xA3A5},{0xFF06, 0xA3A6},{0xFF07, 0xA3A7}, - {0xFF08, 0xA3A8},{0xFF09, 0xA3A9},{0xFF0A, 0xA3AA},{0xFF0B, 0xA3AB},{0xFF0C, 0xA3AC},{0xFF0D, 0xA3AD},{0xFF0E, 0xA3AE},{0xFF0F, 0xA3AF}, - {0xFF10, 0xA3B0},{0xFF11, 0xA3B1},{0xFF12, 0xA3B2},{0xFF13, 0xA3B3},{0xFF14, 0xA3B4},{0xFF15, 0xA3B5},{0xFF16, 0xA3B6},{0xFF17, 0xA3B7}, - {0xFF18, 0xA3B8},{0xFF19, 0xA3B9},{0xFF1A, 0xA3BA},{0xFF1B, 0xA3BB},{0xFF1C, 0xA3BC},{0xFF1D, 0xA3BD},{0xFF1E, 0xA3BE},{0xFF1F, 0xA3BF}, - {0xFF20, 0xA3C0},{0xFF21, 0xA3C1},{0xFF22, 0xA3C2},{0xFF23, 0xA3C3},{0xFF24, 0xA3C4},{0xFF25, 0xA3C5},{0xFF26, 0xA3C6},{0xFF27, 0xA3C7}, - {0xFF28, 0xA3C8},{0xFF29, 0xA3C9},{0xFF2A, 0xA3CA},{0xFF2B, 0xA3CB},{0xFF2C, 0xA3CC},{0xFF2D, 0xA3CD},{0xFF2E, 0xA3CE},{0xFF2F, 0xA3CF}, - {0xFF30, 0xA3D0},{0xFF31, 0xA3D1},{0xFF32, 0xA3D2},{0xFF33, 0xA3D3},{0xFF34, 0xA3D4},{0xFF35, 0xA3D5},{0xFF36, 0xA3D6},{0xFF37, 0xA3D7}, - {0xFF38, 0xA3D8},{0xFF39, 0xA3D9},{0xFF3A, 0xA3DA},{0xFF3B, 0xA3DB},{0xFF3C, 0xA1AC},{0xFF3D, 0xA3DD},{0xFF3E, 0xA3DE},{0xFF3F, 0xA3DF}, - {0xFF40, 0xA3E0},{0xFF41, 0xA3E1},{0xFF42, 0xA3E2},{0xFF43, 0xA3E3},{0xFF44, 0xA3E4},{0xFF45, 0xA3E5},{0xFF46, 0xA3E6},{0xFF47, 0xA3E7}, - {0xFF48, 0xA3E8},{0xFF49, 0xA3E9},{0xFF4A, 0xA3EA},{0xFF4B, 0xA3EB},{0xFF4C, 0xA3EC},{0xFF4D, 0xA3ED},{0xFF4E, 0xA3EE},{0xFF4F, 0xA3EF}, - {0xFF50, 0xA3F0},{0xFF51, 0xA3F1},{0xFF52, 0xA3F2},{0xFF53, 0xA3F3},{0xFF54, 0xA3F4},{0xFF55, 0xA3F5},{0xFF56, 0xA3F6},{0xFF57, 0xA3F7}, - {0xFF58, 0xA3F8},{0xFF59, 0xA3F9},{0xFF5A, 0xA3FA},{0xFF5B, 0xA3FB},{0xFF5C, 0xA3FC},{0xFF5D, 0xA3FD},{0xFF5E, 0xA2A6},{0xFFE0, 0xA1CB}, - {0xFFE1, 0xA1CC},{0xFFE2, 0xA1FE},{0xFFE3, 0xA3FE},{0xFFE5, 0xA1CD},{0xFFE6, 0xA3DC} -}; diff --git a/vcl/source/fontsubset/u2prc.inc b/vcl/source/fontsubset/u2prc.inc deleted file mode 100644 index 445461b59653..000000000000 --- a/vcl/source/fontsubset/u2prc.inc +++ /dev/null @@ -1,3036 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// use generic RTL_TEXTENCODING_ to get rid of this file - -sal_uInt16pair xlat_1_4[24035] = { - {0x0020, 0x0020},{0x0021, 0x0021},{0x0022, 0x0022},{0x0023, 0x0023},{0x0024, 0x0024},{0x0025, 0x0025},{0x0026, 0x0026},{0x0027, 0x0027}, - {0x0028, 0x0028},{0x0029, 0x0029},{0x002A, 0x002A},{0x002B, 0x002B},{0x002C, 0x002C},{0x002D, 0x002D},{0x002E, 0x002E},{0x002F, 0x002F}, - {0x0030, 0x0030},{0x0031, 0x0031},{0x0032, 0x0032},{0x0033, 0x0033},{0x0034, 0x0034},{0x0035, 0x0035},{0x0036, 0x0036},{0x0037, 0x0037}, - {0x0038, 0x0038},{0x0039, 0x0039},{0x003A, 0x003A},{0x003B, 0x003B},{0x003C, 0x003C},{0x003D, 0x003D},{0x003E, 0x003E},{0x003F, 0x003F}, - {0x0040, 0x0040},{0x0041, 0x0041},{0x0042, 0x0042},{0x0043, 0x0043},{0x0044, 0x0044},{0x0045, 0x0045},{0x0046, 0x0046},{0x0047, 0x0047}, - {0x0048, 0x0048},{0x0049, 0x0049},{0x004A, 0x004A},{0x004B, 0x004B},{0x004C, 0x004C},{0x004D, 0x004D},{0x004E, 0x004E},{0x004F, 0x004F}, - {0x0050, 0x0050},{0x0051, 0x0051},{0x0052, 0x0052},{0x0053, 0x0053},{0x0054, 0x0054},{0x0055, 0x0055},{0x0056, 0x0056},{0x0057, 0x0057}, - {0x0058, 0x0058},{0x0059, 0x0059},{0x005A, 0x005A},{0x005B, 0x005B},{0x005C, 0x005C},{0x005D, 0x005D},{0x005E, 0x005E},{0x005F, 0x005F}, - {0x0060, 0x0060},{0x0061, 0x0061},{0x0062, 0x0062},{0x0063, 0x0063},{0x0064, 0x0064},{0x0065, 0x0065},{0x0066, 0x0066},{0x0067, 0x0067}, - {0x0068, 0x0068},{0x0069, 0x0069},{0x006A, 0x006A},{0x006B, 0x006B},{0x006C, 0x006C},{0x006D, 0x006D},{0x006E, 0x006E},{0x006F, 0x006F}, - {0x0070, 0x0070},{0x0071, 0x0071},{0x0072, 0x0072},{0x0073, 0x0073},{0x0074, 0x0074},{0x0075, 0x0075},{0x0076, 0x0076},{0x0077, 0x0077}, - {0x0078, 0x0078},{0x0079, 0x0079},{0x007A, 0x007A},{0x007B, 0x007B},{0x007C, 0x007C},{0x007D, 0x007D},{0x007E, 0x007E},{0x00A4, 0xA1E8}, - {0x00A7, 0xA1EC},{0x00A8, 0xA1A7},{0x00B0, 0xA1E3},{0x00B1, 0xA1C0},{0x00B7, 0xA1A4},{0x00D7, 0xA1C1},{0x00E0, 0xA8A4},{0x00E1, 0xA8A2}, - {0x00E8, 0xA8A8},{0x00E9, 0xA8A6},{0x00EA, 0xA8BA},{0x00EC, 0xA8AC},{0x00ED, 0xA8AA},{0x00F2, 0xA8B0},{0x00F3, 0xA8AE},{0x00F7, 0xA1C2}, - {0x00F9, 0xA8B4},{0x00FA, 0xA8B2},{0x00FC, 0xA8B9},{0x0101, 0xA8A1},{0x0113, 0xA8A5},{0x011B, 0xA8A7},{0x012B, 0xA8A9},{0x0144, 0xA8BD}, - {0x0148, 0xA8BE},{0x014D, 0xA8AD},{0x016B, 0xA8B1},{0x01CE, 0xA8A3},{0x01D0, 0xA8AB},{0x01D2, 0xA8AF},{0x01D4, 0xA8B3},{0x01D6, 0xA8B5}, - {0x01D8, 0xA8B6},{0x01DA, 0xA8B7},{0x01DC, 0xA8B8},{0x0251, 0xA8BB},{0x0261, 0xA8C0},{0x02C7, 0xA1A6},{0x02C9, 0xA1A5},{0x02CA, 0xA840}, - {0x02CB, 0xA841},{0x02D9, 0xA842},{0x0391, 0xA6A1},{0x0392, 0xA6A2},{0x0393, 0xA6A3},{0x0394, 0xA6A4},{0x0395, 0xA6A5},{0x0396, 0xA6A6}, - {0x0397, 0xA6A7},{0x0398, 0xA6A8},{0x0399, 0xA6A9},{0x039A, 0xA6AA},{0x039B, 0xA6AB},{0x039C, 0xA6AC},{0x039D, 0xA6AD},{0x039E, 0xA6AE}, - {0x039F, 0xA6AF},{0x03A0, 0xA6B0},{0x03A1, 0xA6B1},{0x03A3, 0xA6B2},{0x03A4, 0xA6B3},{0x03A5, 0xA6B4},{0x03A6, 0xA6B5},{0x03A7, 0xA6B6}, - {0x03A8, 0xA6B7},{0x03A9, 0xA6B8},{0x03B1, 0xA6C1},{0x03B2, 0xA6C2},{0x03B3, 0xA6C3},{0x03B4, 0xA6C4},{0x03B5, 0xA6C5},{0x03B6, 0xA6C6}, - {0x03B7, 0xA6C7},{0x03B8, 0xA6C8},{0x03B9, 0xA6C9},{0x03BA, 0xA6CA},{0x03BB, 0xA6CB},{0x03BC, 0xA6CC},{0x03BD, 0xA6CD},{0x03BE, 0xA6CE}, - {0x03BF, 0xA6CF},{0x03C0, 0xA6D0},{0x03C1, 0xA6D1},{0x03C3, 0xA6D2},{0x03C4, 0xA6D3},{0x03C5, 0xA6D4},{0x03C6, 0xA6D5},{0x03C7, 0xA6D6}, - {0x03C8, 0xA6D7},{0x03C9, 0xA6D8},{0x0401, 0xA7A7},{0x0410, 0xA7A1},{0x0411, 0xA7A2},{0x0412, 0xA7A3},{0x0413, 0xA7A4},{0x0414, 0xA7A5}, - {0x0415, 0xA7A6},{0x0416, 0xA7A8},{0x0417, 0xA7A9},{0x0418, 0xA7AA},{0x0419, 0xA7AB},{0x041A, 0xA7AC},{0x041B, 0xA7AD},{0x041C, 0xA7AE}, - {0x041D, 0xA7AF},{0x041E, 0xA7B0},{0x041F, 0xA7B1},{0x0420, 0xA7B2},{0x0421, 0xA7B3},{0x0422, 0xA7B4},{0x0423, 0xA7B5},{0x0424, 0xA7B6}, - {0x0425, 0xA7B7},{0x0426, 0xA7B8},{0x0427, 0xA7B9},{0x0428, 0xA7BA},{0x0429, 0xA7BB},{0x042A, 0xA7BC},{0x042B, 0xA7BD},{0x042C, 0xA7BE}, - {0x042D, 0xA7BF},{0x042E, 0xA7C0},{0x042F, 0xA7C1},{0x0430, 0xA7D1},{0x0431, 0xA7D2},{0x0432, 0xA7D3},{0x0433, 0xA7D4},{0x0434, 0xA7D5}, - {0x0435, 0xA7D6},{0x0436, 0xA7D8},{0x0437, 0xA7D9},{0x0438, 0xA7DA},{0x0439, 0xA7DB},{0x043A, 0xA7DC},{0x043B, 0xA7DD},{0x043C, 0xA7DE}, - {0x043D, 0xA7DF},{0x043E, 0xA7E0},{0x043F, 0xA7E1},{0x0440, 0xA7E2},{0x0441, 0xA7E3},{0x0442, 0xA7E4},{0x0443, 0xA7E5},{0x0444, 0xA7E6}, - {0x0445, 0xA7E7},{0x0446, 0xA7E8},{0x0447, 0xA7E9},{0x0448, 0xA7EA},{0x0449, 0xA7EB},{0x044A, 0xA7EC},{0x044B, 0xA7ED},{0x044C, 0xA7EE}, - {0x044D, 0xA7EF},{0x044E, 0xA7F0},{0x044F, 0xA7F1},{0x0451, 0xA7D7},{0x2010, 0xA95C},{0x2013, 0xA843},{0x2014, 0xA1AA},{0x2015, 0xA844}, - {0x2016, 0xA1AC},{0x2018, 0xA1AE},{0x2019, 0xA1AF},{0x201C, 0xA1B0},{0x201D, 0xA1B1},{0x2025, 0xA845},{0x2026, 0xA1AD},{0x2030, 0xA1EB}, - {0x2032, 0xA1E4},{0x2033, 0xA1E5},{0x2035, 0xA846},{0x203B, 0xA1F9},{0x2103, 0xA1E6},{0x2105, 0xA847},{0x2109, 0xA848},{0x2116, 0xA1ED}, - {0x2121, 0xA959},{0x2160, 0xA2F1},{0x2161, 0xA2F2},{0x2162, 0xA2F3},{0x2163, 0xA2F4},{0x2164, 0xA2F5},{0x2165, 0xA2F6},{0x2166, 0xA2F7}, - {0x2167, 0xA2F8},{0x2168, 0xA2F9},{0x2169, 0xA2FA},{0x216A, 0xA2FB},{0x216B, 0xA2FC},{0x2170, 0xA2A1},{0x2171, 0xA2A2},{0x2172, 0xA2A3}, - {0x2173, 0xA2A4},{0x2174, 0xA2A5},{0x2175, 0xA2A6},{0x2176, 0xA2A7},{0x2177, 0xA2A8},{0x2178, 0xA2A9},{0x2179, 0xA2AA},{0x2190, 0xA1FB}, - {0x2191, 0xA1FC},{0x2192, 0xA1FA},{0x2193, 0xA1FD},{0x2196, 0xA849},{0x2197, 0xA84A},{0x2198, 0xA84B},{0x2199, 0xA84C},{0x2208, 0xA1CA}, - {0x220F, 0xA1C7},{0x2211, 0xA1C6},{0x2215, 0xA84D},{0x221A, 0xA1CC},{0x221D, 0xA1D8},{0x221E, 0xA1DE},{0x221F, 0xA84E},{0x2220, 0xA1CF}, - {0x2223, 0xA84F},{0x2225, 0xA1CE},{0x2227, 0xA1C4},{0x2228, 0xA1C5},{0x2229, 0xA1C9},{0x222A, 0xA1C8},{0x222B, 0xA1D2},{0x222E, 0xA1D3}, - {0x2234, 0xA1E0},{0x2235, 0xA1DF},{0x2236, 0xA1C3},{0x2237, 0xA1CB},{0x223D, 0xA1D7},{0x2248, 0xA1D6},{0x224C, 0xA1D5},{0x2252, 0xA850}, - {0x2260, 0xA1D9},{0x2261, 0xA1D4},{0x2264, 0xA1DC},{0x2265, 0xA1DD},{0x2266, 0xA851},{0x2267, 0xA852},{0x226E, 0xA1DA},{0x226F, 0xA1DB}, - {0x2299, 0xA1D1},{0x22A5, 0xA1CD},{0x22BF, 0xA853},{0x2312, 0xA1D0},{0x2460, 0xA2D9},{0x2461, 0xA2DA},{0x2462, 0xA2DB},{0x2463, 0xA2DC}, - {0x2464, 0xA2DD},{0x2465, 0xA2DE},{0x2466, 0xA2DF},{0x2467, 0xA2E0},{0x2468, 0xA2E1},{0x2469, 0xA2E2},{0x2474, 0xA2C5},{0x2475, 0xA2C6}, - {0x2476, 0xA2C7},{0x2477, 0xA2C8},{0x2478, 0xA2C9},{0x2479, 0xA2CA},{0x247A, 0xA2CB},{0x247B, 0xA2CC},{0x247C, 0xA2CD},{0x247D, 0xA2CE}, - {0x247E, 0xA2CF},{0x247F, 0xA2D0},{0x2480, 0xA2D1},{0x2481, 0xA2D2},{0x2482, 0xA2D3},{0x2483, 0xA2D4},{0x2484, 0xA2D5},{0x2485, 0xA2D6}, - {0x2486, 0xA2D7},{0x2487, 0xA2D8},{0x2488, 0xA2B1},{0x2489, 0xA2B2},{0x248A, 0xA2B3},{0x248B, 0xA2B4},{0x248C, 0xA2B5},{0x248D, 0xA2B6}, - {0x248E, 0xA2B7},{0x248F, 0xA2B8},{0x2490, 0xA2B9},{0x2491, 0xA2BA},{0x2492, 0xA2BB},{0x2493, 0xA2BC},{0x2494, 0xA2BD},{0x2495, 0xA2BE}, - {0x2496, 0xA2BF},{0x2497, 0xA2C0},{0x2498, 0xA2C1},{0x2499, 0xA2C2},{0x249A, 0xA2C3},{0x249B, 0xA2C4},{0x2500, 0xA9A4},{0x2501, 0xA9A5}, - {0x2502, 0xA9A6},{0x2503, 0xA9A7},{0x2504, 0xA9A8},{0x2505, 0xA9A9},{0x2506, 0xA9AA},{0x2507, 0xA9AB},{0x2508, 0xA9AC},{0x2509, 0xA9AD}, - {0x250A, 0xA9AE},{0x250B, 0xA9AF},{0x250C, 0xA9B0},{0x250D, 0xA9B1},{0x250E, 0xA9B2},{0x250F, 0xA9B3},{0x2510, 0xA9B4},{0x2511, 0xA9B5}, - {0x2512, 0xA9B6},{0x2513, 0xA9B7},{0x2514, 0xA9B8},{0x2515, 0xA9B9},{0x2516, 0xA9BA},{0x2517, 0xA9BB},{0x2518, 0xA9BC},{0x2519, 0xA9BD}, - {0x251A, 0xA9BE},{0x251B, 0xA9BF},{0x251C, 0xA9C0},{0x251D, 0xA9C1},{0x251E, 0xA9C2},{0x251F, 0xA9C3},{0x2520, 0xA9C4},{0x2521, 0xA9C5}, - {0x2522, 0xA9C6},{0x2523, 0xA9C7},{0x2524, 0xA9C8},{0x2525, 0xA9C9},{0x2526, 0xA9CA},{0x2527, 0xA9CB},{0x2528, 0xA9CC},{0x2529, 0xA9CD}, - {0x252A, 0xA9CE},{0x252B, 0xA9CF},{0x252C, 0xA9D0},{0x252D, 0xA9D1},{0x252E, 0xA9D2},{0x252F, 0xA9D3},{0x2530, 0xA9D4},{0x2531, 0xA9D5}, - {0x2532, 0xA9D6},{0x2533, 0xA9D7},{0x2534, 0xA9D8},{0x2535, 0xA9D9},{0x2536, 0xA9DA},{0x2537, 0xA9DB},{0x2538, 0xA9DC},{0x2539, 0xA9DD}, - {0x253A, 0xA9DE},{0x253B, 0xA9DF},{0x253C, 0xA9E0},{0x253D, 0xA9E1},{0x253E, 0xA9E2},{0x253F, 0xA9E3},{0x2540, 0xA9E4},{0x2541, 0xA9E5}, - {0x2542, 0xA9E6},{0x2543, 0xA9E7},{0x2544, 0xA9E8},{0x2545, 0xA9E9},{0x2546, 0xA9EA},{0x2547, 0xA9EB},{0x2548, 0xA9EC},{0x2549, 0xA9ED}, - {0x254A, 0xA9EE},{0x254B, 0xA9EF},{0x2550, 0xA854},{0x2551, 0xA855},{0x2552, 0xA856},{0x2553, 0xA857},{0x2554, 0xA858},{0x2555, 0xA859}, - {0x2556, 0xA85A},{0x2557, 0xA85B},{0x2558, 0xA85C},{0x2559, 0xA85D},{0x255A, 0xA85E},{0x255B, 0xA85F},{0x255C, 0xA860},{0x255D, 0xA861}, - {0x255E, 0xA862},{0x255F, 0xA863},{0x2560, 0xA864},{0x2561, 0xA865},{0x2562, 0xA866},{0x2563, 0xA867},{0x2564, 0xA868},{0x2565, 0xA869}, - {0x2566, 0xA86A},{0x2567, 0xA86B},{0x2568, 0xA86C},{0x2569, 0xA86D},{0x256A, 0xA86E},{0x256B, 0xA86F},{0x256C, 0xA870},{0x256D, 0xA871}, - {0x256E, 0xA872},{0x256F, 0xA873},{0x2570, 0xA874},{0x2571, 0xA875},{0x2572, 0xA876},{0x2573, 0xA877},{0x2581, 0xA878},{0x2582, 0xA879}, - {0x2583, 0xA87A},{0x2584, 0xA87B},{0x2585, 0xA87C},{0x2586, 0xA87D},{0x2587, 0xA87E},{0x2588, 0xA880},{0x2589, 0xA881},{0x258A, 0xA882}, - {0x258B, 0xA883},{0x258C, 0xA884},{0x258D, 0xA885},{0x258E, 0xA886},{0x258F, 0xA887},{0x2593, 0xA888},{0x2594, 0xA889},{0x2595, 0xA88A}, - {0x25A0, 0xA1F6},{0x25A1, 0xA1F5},{0x25B2, 0xA1F8},{0x25B3, 0xA1F7},{0x25BC, 0xA88B},{0x25BD, 0xA88C},{0x25C6, 0xA1F4},{0x25C7, 0xA1F3}, - {0x25CB, 0xA1F0},{0x25CE, 0xA1F2},{0x25CF, 0xA1F1},{0x25E2, 0xA88D},{0x25E3, 0xA88E},{0x25E4, 0xA88F},{0x25E5, 0xA890},{0x2605, 0xA1EF}, - {0x2606, 0xA1EE},{0x2609, 0xA891},{0x2640, 0xA1E2},{0x2641, 0xA892},{0x2642, 0xA1E1},{0x3000, 0xA1A1},{0x3001, 0xA1A2},{0x3002, 0xA1A3}, - {0x3003, 0xA1A8},{0x3005, 0xA1A9},{0x3006, 0xA965},{0x3007, 0xA996},{0x3008, 0xA1B4},{0x3009, 0xA1B5},{0x300A, 0xA1B6},{0x300B, 0xA1B7}, - {0x300C, 0xA1B8},{0x300D, 0xA1B9},{0x300E, 0xA1BA},{0x300F, 0xA1BB},{0x3010, 0xA1BE},{0x3011, 0xA1BF},{0x3012, 0xA893},{0x3013, 0xA1FE}, - {0x3014, 0xA1B2},{0x3015, 0xA1B3},{0x3016, 0xA1BC},{0x3017, 0xA1BD},{0x301D, 0xA894},{0x301E, 0xA895},{0x3021, 0xA940},{0x3022, 0xA941}, - {0x3023, 0xA942},{0x3024, 0xA943},{0x3025, 0xA944},{0x3026, 0xA945},{0x3027, 0xA946},{0x3028, 0xA947},{0x3029, 0xA948},{0x3041, 0xA4A1}, - {0x3042, 0xA4A2},{0x3043, 0xA4A3},{0x3044, 0xA4A4},{0x3045, 0xA4A5},{0x3046, 0xA4A6},{0x3047, 0xA4A7},{0x3048, 0xA4A8},{0x3049, 0xA4A9}, - {0x304A, 0xA4AA},{0x304B, 0xA4AB},{0x304C, 0xA4AC},{0x304D, 0xA4AD},{0x304E, 0xA4AE},{0x304F, 0xA4AF},{0x3050, 0xA4B0},{0x3051, 0xA4B1}, - {0x3052, 0xA4B2},{0x3053, 0xA4B3},{0x3054, 0xA4B4},{0x3055, 0xA4B5},{0x3056, 0xA4B6},{0x3057, 0xA4B7},{0x3058, 0xA4B8},{0x3059, 0xA4B9}, - {0x305A, 0xA4BA},{0x305B, 0xA4BB},{0x305C, 0xA4BC},{0x305D, 0xA4BD},{0x305E, 0xA4BE},{0x305F, 0xA4BF},{0x3060, 0xA4C0},{0x3061, 0xA4C1}, - {0x3062, 0xA4C2},{0x3063, 0xA4C3},{0x3064, 0xA4C4},{0x3065, 0xA4C5},{0x3066, 0xA4C6},{0x3067, 0xA4C7},{0x3068, 0xA4C8},{0x3069, 0xA4C9}, - {0x306A, 0xA4CA},{0x306B, 0xA4CB},{0x306C, 0xA4CC},{0x306D, 0xA4CD},{0x306E, 0xA4CE},{0x306F, 0xA4CF},{0x3070, 0xA4D0},{0x3071, 0xA4D1}, - {0x3072, 0xA4D2},{0x3073, 0xA4D3},{0x3074, 0xA4D4},{0x3075, 0xA4D5},{0x3076, 0xA4D6},{0x3077, 0xA4D7},{0x3078, 0xA4D8},{0x3079, 0xA4D9}, - {0x307A, 0xA4DA},{0x307B, 0xA4DB},{0x307C, 0xA4DC},{0x307D, 0xA4DD},{0x307E, 0xA4DE},{0x307F, 0xA4DF},{0x3080, 0xA4E0},{0x3081, 0xA4E1}, - {0x3082, 0xA4E2},{0x3083, 0xA4E3},{0x3084, 0xA4E4},{0x3085, 0xA4E5},{0x3086, 0xA4E6},{0x3087, 0xA4E7},{0x3088, 0xA4E8},{0x3089, 0xA4E9}, - {0x308A, 0xA4EA},{0x308B, 0xA4EB},{0x308C, 0xA4EC},{0x308D, 0xA4ED},{0x308E, 0xA4EE},{0x308F, 0xA4EF},{0x3090, 0xA4F0},{0x3091, 0xA4F1}, - {0x3092, 0xA4F2},{0x3093, 0xA4F3},{0x309B, 0xA961},{0x309C, 0xA962},{0x309D, 0xA966},{0x309E, 0xA967},{0x30A1, 0xA5A1},{0x30A2, 0xA5A2}, - {0x30A3, 0xA5A3},{0x30A4, 0xA5A4},{0x30A5, 0xA5A5},{0x30A6, 0xA5A6},{0x30A7, 0xA5A7},{0x30A8, 0xA5A8},{0x30A9, 0xA5A9},{0x30AA, 0xA5AA}, - {0x30AB, 0xA5AB},{0x30AC, 0xA5AC},{0x30AD, 0xA5AD},{0x30AE, 0xA5AE},{0x30AF, 0xA5AF},{0x30B0, 0xA5B0},{0x30B1, 0xA5B1},{0x30B2, 0xA5B2}, - {0x30B3, 0xA5B3},{0x30B4, 0xA5B4},{0x30B5, 0xA5B5},{0x30B6, 0xA5B6},{0x30B7, 0xA5B7},{0x30B8, 0xA5B8},{0x30B9, 0xA5B9},{0x30BA, 0xA5BA}, - {0x30BB, 0xA5BB},{0x30BC, 0xA5BC},{0x30BD, 0xA5BD},{0x30BE, 0xA5BE},{0x30BF, 0xA5BF},{0x30C0, 0xA5C0},{0x30C1, 0xA5C1},{0x30C2, 0xA5C2}, - {0x30C3, 0xA5C3},{0x30C4, 0xA5C4},{0x30C5, 0xA5C5},{0x30C6, 0xA5C6},{0x30C7, 0xA5C7},{0x30C8, 0xA5C8},{0x30C9, 0xA5C9},{0x30CA, 0xA5CA}, - {0x30CB, 0xA5CB},{0x30CC, 0xA5CC},{0x30CD, 0xA5CD},{0x30CE, 0xA5CE},{0x30CF, 0xA5CF},{0x30D0, 0xA5D0},{0x30D1, 0xA5D1},{0x30D2, 0xA5D2}, - {0x30D3, 0xA5D3},{0x30D4, 0xA5D4},{0x30D5, 0xA5D5},{0x30D6, 0xA5D6},{0x30D7, 0xA5D7},{0x30D8, 0xA5D8},{0x30D9, 0xA5D9},{0x30DA, 0xA5DA}, - {0x30DB, 0xA5DB},{0x30DC, 0xA5DC},{0x30DD, 0xA5DD},{0x30DE, 0xA5DE},{0x30DF, 0xA5DF},{0x30E0, 0xA5E0},{0x30E1, 0xA5E1},{0x30E2, 0xA5E2}, - {0x30E3, 0xA5E3},{0x30E4, 0xA5E4},{0x30E5, 0xA5E5},{0x30E6, 0xA5E6},{0x30E7, 0xA5E7},{0x30E8, 0xA5E8},{0x30E9, 0xA5E9},{0x30EA, 0xA5EA}, - {0x30EB, 0xA5EB},{0x30EC, 0xA5EC},{0x30ED, 0xA5ED},{0x30EE, 0xA5EE},{0x30EF, 0xA5EF},{0x30F0, 0xA5F0},{0x30F1, 0xA5F1},{0x30F2, 0xA5F2}, - {0x30F3, 0xA5F3},{0x30F4, 0xA5F4},{0x30F5, 0xA5F5},{0x30F6, 0xA5F6},{0x30FC, 0xA960},{0x30FD, 0xA963},{0x30FE, 0xA964},{0x3105, 0xA8C5}, - {0x3106, 0xA8C6},{0x3107, 0xA8C7},{0x3108, 0xA8C8},{0x3109, 0xA8C9},{0x310A, 0xA8CA},{0x310B, 0xA8CB},{0x310C, 0xA8CC},{0x310D, 0xA8CD}, - {0x310E, 0xA8CE},{0x310F, 0xA8CF},{0x3110, 0xA8D0},{0x3111, 0xA8D1},{0x3112, 0xA8D2},{0x3113, 0xA8D3},{0x3114, 0xA8D4},{0x3115, 0xA8D5}, - {0x3116, 0xA8D6},{0x3117, 0xA8D7},{0x3118, 0xA8D8},{0x3119, 0xA8D9},{0x311A, 0xA8DA},{0x311B, 0xA8DB},{0x311C, 0xA8DC},{0x311D, 0xA8DD}, - {0x311E, 0xA8DE},{0x311F, 0xA8DF},{0x3120, 0xA8E0},{0x3121, 0xA8E1},{0x3122, 0xA8E2},{0x3123, 0xA8E3},{0x3124, 0xA8E4},{0x3125, 0xA8E5}, - {0x3126, 0xA8E6},{0x3127, 0xA8E7},{0x3128, 0xA8E8},{0x3129, 0xA8E9},{0x3220, 0xA2E5},{0x3221, 0xA2E6},{0x3222, 0xA2E7},{0x3223, 0xA2E8}, - {0x3224, 0xA2E9},{0x3225, 0xA2EA},{0x3226, 0xA2EB},{0x3227, 0xA2EC},{0x3228, 0xA2ED},{0x3229, 0xA2EE},{0x3231, 0xA95A},{0x32A3, 0xA949}, - {0x338E, 0xA94A},{0x338F, 0xA94B},{0x339C, 0xA94C},{0x339D, 0xA94D},{0x339E, 0xA94E},{0x33A1, 0xA94F},{0x33C4, 0xA950},{0x33CE, 0xA951}, - {0x33D1, 0xA952},{0x33D2, 0xA953},{0x33D5, 0xA954},{0x4E00, 0xD2BB},{0x4E01, 0xB6A1},{0x4E02, 0x8140},{0x4E03, 0xC6DF},{0x4E04, 0x8141}, - {0x4E05, 0x8142},{0x4E06, 0x8143},{0x4E07, 0xCDF2},{0x4E08, 0xD5C9},{0x4E09, 0xC8FD},{0x4E0A, 0xC9CF},{0x4E0B, 0xCFC2},{0x4E0C, 0xD8A2}, - {0x4E0D, 0xB2BB},{0x4E0E, 0xD3EB},{0x4E0F, 0x8144},{0x4E10, 0xD8A4},{0x4E11, 0xB3F3},{0x4E12, 0x8145},{0x4E13, 0xD7A8},{0x4E14, 0xC7D2}, - {0x4E15, 0xD8A7},{0x4E16, 0xCAC0},{0x4E17, 0x8146},{0x4E18, 0xC7F0},{0x4E19, 0xB1FB},{0x4E1A, 0xD2B5},{0x4E1B, 0xB4D4},{0x4E1C, 0xB6AB}, - {0x4E1D, 0xCBBF},{0x4E1E, 0xD8A9},{0x4E1F, 0x8147},{0x4E20, 0x8148},{0x4E21, 0x8149},{0x4E22, 0xB6AA},{0x4E23, 0x814A},{0x4E24, 0xC1BD}, - {0x4E25, 0xD1CF},{0x4E26, 0x814B},{0x4E27, 0xC9A5},{0x4E28, 0xD8AD},{0x4E29, 0x814C},{0x4E2A, 0xB8F6},{0x4E2B, 0xD1BE},{0x4E2C, 0xE3DC}, - {0x4E2D, 0xD6D0},{0x4E2E, 0x814D},{0x4E2F, 0x814E},{0x4E30, 0xB7E1},{0x4E31, 0x814F},{0x4E32, 0xB4AE},{0x4E33, 0x8150},{0x4E34, 0xC1D9}, - {0x4E35, 0x8151},{0x4E36, 0xD8BC},{0x4E37, 0x8152},{0x4E38, 0xCDE8},{0x4E39, 0xB5A4},{0x4E3A, 0xCEAA},{0x4E3B, 0xD6F7},{0x4E3C, 0x8153}, - {0x4E3D, 0xC0F6},{0x4E3E, 0xBED9},{0x4E3F, 0xD8AF},{0x4E40, 0x8154},{0x4E41, 0x8155},{0x4E42, 0x8156},{0x4E43, 0xC4CB},{0x4E44, 0x8157}, - {0x4E45, 0xBEC3},{0x4E46, 0x8158},{0x4E47, 0xD8B1},{0x4E48, 0xC3B4},{0x4E49, 0xD2E5},{0x4E4A, 0x8159},{0x4E4B, 0xD6AE},{0x4E4C, 0xCEDA}, - {0x4E4D, 0xD5A7},{0x4E4E, 0xBAF5},{0x4E4F, 0xB7A6},{0x4E50, 0xC0D6},{0x4E51, 0x815A},{0x4E52, 0xC6B9},{0x4E53, 0xC5D2},{0x4E54, 0xC7C7}, - {0x4E55, 0x815B},{0x4E56, 0xB9D4},{0x4E57, 0x815C},{0x4E58, 0xB3CB},{0x4E59, 0xD2D2},{0x4E5A, 0x815D},{0x4E5B, 0x815E},{0x4E5C, 0xD8BF}, - {0x4E5D, 0xBEC5},{0x4E5E, 0xC6F2},{0x4E5F, 0xD2B2},{0x4E60, 0xCFB0},{0x4E61, 0xCFE7},{0x4E62, 0x815F},{0x4E63, 0x8160},{0x4E64, 0x8161}, - {0x4E65, 0x8162},{0x4E66, 0xCAE9},{0x4E67, 0x8163},{0x4E68, 0x8164},{0x4E69, 0xD8C0},{0x4E6A, 0x8165},{0x4E6B, 0x8166},{0x4E6C, 0x8167}, - {0x4E6D, 0x8168},{0x4E6E, 0x8169},{0x4E6F, 0x816A},{0x4E70, 0xC2F2},{0x4E71, 0xC2D2},{0x4E72, 0x816B},{0x4E73, 0xC8E9},{0x4E74, 0x816C}, - {0x4E75, 0x816D},{0x4E76, 0x816E},{0x4E77, 0x816F},{0x4E78, 0x8170},{0x4E79, 0x8171},{0x4E7A, 0x8172},{0x4E7B, 0x8173},{0x4E7C, 0x8174}, - {0x4E7D, 0x8175},{0x4E7E, 0xC7AC},{0x4E7F, 0x8176},{0x4E80, 0x8177},{0x4E81, 0x8178},{0x4E82, 0x8179},{0x4E83, 0x817A},{0x4E84, 0x817B}, - {0x4E85, 0x817C},{0x4E86, 0xC1CB},{0x4E87, 0x817D},{0x4E88, 0xD3E8},{0x4E89, 0xD5F9},{0x4E8A, 0x817E},{0x4E8B, 0xCAC2},{0x4E8C, 0xB6FE}, - {0x4E8D, 0xD8A1},{0x4E8E, 0xD3DA},{0x4E8F, 0xBFF7},{0x4E90, 0x8180},{0x4E91, 0xD4C6},{0x4E92, 0xBBA5},{0x4E93, 0xD8C1},{0x4E94, 0xCEE5}, - {0x4E95, 0xBEAE},{0x4E96, 0x8181},{0x4E97, 0x8182},{0x4E98, 0xD8A8},{0x4E99, 0x8183},{0x4E9A, 0xD1C7},{0x4E9B, 0xD0A9},{0x4E9C, 0x8184}, - {0x4E9D, 0x8185},{0x4E9E, 0x8186},{0x4E9F, 0xD8BD},{0x4EA0, 0xD9EF},{0x4EA1, 0xCDF6},{0x4EA2, 0xBFBA},{0x4EA3, 0x8187},{0x4EA4, 0xBDBB}, - {0x4EA5, 0xBAA5},{0x4EA6, 0xD2E0},{0x4EA7, 0xB2FA},{0x4EA8, 0xBAE0},{0x4EA9, 0xC4B6},{0x4EAA, 0x8188},{0x4EAB, 0xCFED},{0x4EAC, 0xBEA9}, - {0x4EAD, 0xCDA4},{0x4EAE, 0xC1C1},{0x4EAF, 0x8189},{0x4EB0, 0x818A},{0x4EB1, 0x818B},{0x4EB2, 0xC7D7},{0x4EB3, 0xD9F1},{0x4EB4, 0x818C}, - {0x4EB5, 0xD9F4},{0x4EB6, 0x818D},{0x4EB7, 0x818E},{0x4EB8, 0x818F},{0x4EB9, 0x8190},{0x4EBA, 0xC8CB},{0x4EBB, 0xD8E9},{0x4EBC, 0x8191}, - {0x4EBD, 0x8192},{0x4EBE, 0x8193},{0x4EBF, 0xD2DA},{0x4EC0, 0xCAB2},{0x4EC1, 0xC8CA},{0x4EC2, 0xD8EC},{0x4EC3, 0xD8EA},{0x4EC4, 0xD8C6}, - {0x4EC5, 0xBDF6},{0x4EC6, 0xC6CD},{0x4EC7, 0xB3F0},{0x4EC8, 0x8194},{0x4EC9, 0xD8EB},{0x4ECA, 0xBDF1},{0x4ECB, 0xBDE9},{0x4ECC, 0x8195}, - {0x4ECD, 0xC8D4},{0x4ECE, 0xB4D3},{0x4ECF, 0x8196},{0x4ED0, 0x8197},{0x4ED1, 0xC2D8},{0x4ED2, 0x8198},{0x4ED3, 0xB2D6},{0x4ED4, 0xD7D0}, - {0x4ED5, 0xCACB},{0x4ED6, 0xCBFB},{0x4ED7, 0xD5CC},{0x4ED8, 0xB8B6},{0x4ED9, 0xCFC9},{0x4EDA, 0x8199},{0x4EDB, 0x819A},{0x4EDC, 0x819B}, - {0x4EDD, 0xD9DA},{0x4EDE, 0xD8F0},{0x4EDF, 0xC7AA},{0x4EE0, 0x819C},{0x4EE1, 0xD8EE},{0x4EE2, 0x819D},{0x4EE3, 0xB4FA},{0x4EE4, 0xC1EE}, - {0x4EE5, 0xD2D4},{0x4EE6, 0x819E},{0x4EE7, 0x819F},{0x4EE8, 0xD8ED},{0x4EE9, 0x81A0},{0x4EEA, 0xD2C7},{0x4EEB, 0xD8EF},{0x4EEC, 0xC3C7}, - {0x4EED, 0x81A1},{0x4EEE, 0x81A2},{0x4EEF, 0x81A3},{0x4EF0, 0xD1F6},{0x4EF1, 0x81A4},{0x4EF2, 0xD6D9},{0x4EF3, 0xD8F2},{0x4EF4, 0x81A5}, - {0x4EF5, 0xD8F5},{0x4EF6, 0xBCFE},{0x4EF7, 0xBCDB},{0x4EF8, 0x81A6},{0x4EF9, 0x81A7},{0x4EFA, 0x81A8},{0x4EFB, 0xC8CE},{0x4EFC, 0x81A9}, - {0x4EFD, 0xB7DD},{0x4EFE, 0x81AA},{0x4EFF, 0xB7C2},{0x4F00, 0x81AB},{0x4F01, 0xC6F3},{0x4F02, 0x81AC},{0x4F03, 0x81AD},{0x4F04, 0x81AE}, - {0x4F05, 0x81AF},{0x4F06, 0x81B0},{0x4F07, 0x81B1},{0x4F08, 0x81B2},{0x4F09, 0xD8F8},{0x4F0A, 0xD2C1},{0x4F0B, 0x81B3},{0x4F0C, 0x81B4}, - {0x4F0D, 0xCEE9},{0x4F0E, 0xBCBF},{0x4F0F, 0xB7FC},{0x4F10, 0xB7A5},{0x4F11, 0xD0DD},{0x4F12, 0x81B5},{0x4F13, 0x81B6},{0x4F14, 0x81B7}, - {0x4F15, 0x81B8},{0x4F16, 0x81B9},{0x4F17, 0xD6DA},{0x4F18, 0xD3C5},{0x4F19, 0xBBEF},{0x4F1A, 0xBBE1},{0x4F1B, 0xD8F1},{0x4F1C, 0x81BA}, - {0x4F1D, 0x81BB},{0x4F1E, 0xC9A1},{0x4F1F, 0xCEB0},{0x4F20, 0xB4AB},{0x4F21, 0x81BC},{0x4F22, 0xD8F3},{0x4F23, 0x81BD},{0x4F24, 0xC9CB}, - {0x4F25, 0xD8F6},{0x4F26, 0xC2D7},{0x4F27, 0xD8F7},{0x4F28, 0x81BE},{0x4F29, 0x81BF},{0x4F2A, 0xCEB1},{0x4F2B, 0xD8F9},{0x4F2C, 0x81C0}, - {0x4F2D, 0x81C1},{0x4F2E, 0x81C2},{0x4F2F, 0xB2AE},{0x4F30, 0xB9C0},{0x4F31, 0x81C3},{0x4F32, 0xD9A3},{0x4F33, 0x81C4},{0x4F34, 0xB0E9}, - {0x4F35, 0x81C5},{0x4F36, 0xC1E6},{0x4F37, 0x81C6},{0x4F38, 0xC9EC},{0x4F39, 0x81C7},{0x4F3A, 0xCBC5},{0x4F3B, 0x81C8},{0x4F3C, 0xCBC6}, - {0x4F3D, 0xD9A4},{0x4F3E, 0x81C9},{0x4F3F, 0x81CA},{0x4F40, 0x81CB},{0x4F41, 0x81CC},{0x4F42, 0x81CD},{0x4F43, 0xB5E8},{0x4F44, 0x81CE}, - {0x4F45, 0x81CF},{0x4F46, 0xB5AB},{0x4F47, 0x81D0},{0x4F48, 0x81D1},{0x4F49, 0x81D2},{0x4F4A, 0x81D3},{0x4F4B, 0x81D4},{0x4F4C, 0x81D5}, - {0x4F4D, 0xCEBB},{0x4F4E, 0xB5CD},{0x4F4F, 0xD7A1},{0x4F50, 0xD7F4},{0x4F51, 0xD3D3},{0x4F52, 0x81D6},{0x4F53, 0xCCE5},{0x4F54, 0x81D7}, - {0x4F55, 0xBACE},{0x4F56, 0x81D8},{0x4F57, 0xD9A2},{0x4F58, 0xD9DC},{0x4F59, 0xD3E0},{0x4F5A, 0xD8FD},{0x4F5B, 0xB7F0},{0x4F5C, 0xD7F7}, - {0x4F5D, 0xD8FE},{0x4F5E, 0xD8FA},{0x4F5F, 0xD9A1},{0x4F60, 0xC4E3},{0x4F61, 0x81D9},{0x4F62, 0x81DA},{0x4F63, 0xD3B6},{0x4F64, 0xD8F4}, - {0x4F65, 0xD9DD},{0x4F66, 0x81DB},{0x4F67, 0xD8FB},{0x4F68, 0x81DC},{0x4F69, 0xC5E5},{0x4F6A, 0x81DD},{0x4F6B, 0x81DE},{0x4F6C, 0xC0D0}, - {0x4F6D, 0x81DF},{0x4F6E, 0x81E0},{0x4F6F, 0xD1F0},{0x4F70, 0xB0DB},{0x4F71, 0x81E1},{0x4F72, 0x81E2},{0x4F73, 0xBCD1},{0x4F74, 0xD9A6}, - {0x4F75, 0x81E3},{0x4F76, 0xD9A5},{0x4F77, 0x81E4},{0x4F78, 0x81E5},{0x4F79, 0x81E6},{0x4F7A, 0x81E7},{0x4F7B, 0xD9AC},{0x4F7C, 0xD9AE}, - {0x4F7D, 0x81E8},{0x4F7E, 0xD9AB},{0x4F7F, 0xCAB9},{0x4F80, 0x81E9},{0x4F81, 0x81EA},{0x4F82, 0x81EB},{0x4F83, 0xD9A9},{0x4F84, 0xD6B6}, - {0x4F85, 0x81EC},{0x4F86, 0x81ED},{0x4F87, 0x81EE},{0x4F88, 0xB3DE},{0x4F89, 0xD9A8},{0x4F8A, 0x81EF},{0x4F8B, 0xC0FD},{0x4F8C, 0x81F0}, - {0x4F8D, 0xCACC},{0x4F8E, 0x81F1},{0x4F8F, 0xD9AA},{0x4F90, 0x81F2},{0x4F91, 0xD9A7},{0x4F92, 0x81F3},{0x4F93, 0x81F4},{0x4F94, 0xD9B0}, - {0x4F95, 0x81F5},{0x4F96, 0x81F6},{0x4F97, 0xB6B1},{0x4F98, 0x81F7},{0x4F99, 0x81F8},{0x4F9A, 0x81F9},{0x4F9B, 0xB9A9},{0x4F9C, 0x81FA}, - {0x4F9D, 0xD2C0},{0x4F9E, 0x81FB},{0x4F9F, 0x81FC},{0x4FA0, 0xCFC0},{0x4FA1, 0x81FD},{0x4FA2, 0x81FE},{0x4FA3, 0xC2C2},{0x4FA4, 0x8240}, - {0x4FA5, 0xBDC4},{0x4FA6, 0xD5EC},{0x4FA7, 0xB2E0},{0x4FA8, 0xC7C8},{0x4FA9, 0xBFEB},{0x4FAA, 0xD9AD},{0x4FAB, 0x8241},{0x4FAC, 0xD9AF}, - {0x4FAD, 0x8242},{0x4FAE, 0xCEEA},{0x4FAF, 0xBAEE},{0x4FB0, 0x8243},{0x4FB1, 0x8244},{0x4FB2, 0x8245},{0x4FB3, 0x8246},{0x4FB4, 0x8247}, - {0x4FB5, 0xC7D6},{0x4FB6, 0x8248},{0x4FB7, 0x8249},{0x4FB8, 0x824A},{0x4FB9, 0x824B},{0x4FBA, 0x824C},{0x4FBB, 0x824D},{0x4FBC, 0x824E}, - {0x4FBD, 0x824F},{0x4FBE, 0x8250},{0x4FBF, 0xB1E3},{0x4FC0, 0x8251},{0x4FC1, 0x8252},{0x4FC2, 0x8253},{0x4FC3, 0xB4D9},{0x4FC4, 0xB6ED}, - {0x4FC5, 0xD9B4},{0x4FC6, 0x8254},{0x4FC7, 0x8255},{0x4FC8, 0x8256},{0x4FC9, 0x8257},{0x4FCA, 0xBFA1},{0x4FCB, 0x8258},{0x4FCC, 0x8259}, - {0x4FCD, 0x825A},{0x4FCE, 0xD9DE},{0x4FCF, 0xC7CE},{0x4FD0, 0xC0FE},{0x4FD1, 0xD9B8},{0x4FD2, 0x825B},{0x4FD3, 0x825C},{0x4FD4, 0x825D}, - {0x4FD5, 0x825E},{0x4FD6, 0x825F},{0x4FD7, 0xCBD7},{0x4FD8, 0xB7FD},{0x4FD9, 0x8260},{0x4FDA, 0xD9B5},{0x4FDB, 0x8261},{0x4FDC, 0xD9B7}, - {0x4FDD, 0xB1A3},{0x4FDE, 0xD3E1},{0x4FDF, 0xD9B9},{0x4FE0, 0x8262},{0x4FE1, 0xD0C5},{0x4FE2, 0x8263},{0x4FE3, 0xD9B6},{0x4FE4, 0x8264}, - {0x4FE5, 0x8265},{0x4FE6, 0xD9B1},{0x4FE7, 0x8266},{0x4FE8, 0xD9B2},{0x4FE9, 0xC1A9},{0x4FEA, 0xD9B3},{0x4FEB, 0x8267},{0x4FEC, 0x8268}, - {0x4FED, 0xBCF3},{0x4FEE, 0xD0DE},{0x4FEF, 0xB8A9},{0x4FF0, 0x8269},{0x4FF1, 0xBEE3},{0x4FF2, 0x826A},{0x4FF3, 0xD9BD},{0x4FF4, 0x826B}, - {0x4FF5, 0x826C},{0x4FF6, 0x826D},{0x4FF7, 0x826E},{0x4FF8, 0xD9BA},{0x4FF9, 0x826F},{0x4FFA, 0xB0B3},{0x4FFB, 0x8270},{0x4FFC, 0x8271}, - {0x4FFD, 0x8272},{0x4FFE, 0xD9C2},{0x4FFF, 0x8273},{0x5000, 0x8274},{0x5001, 0x8275},{0x5002, 0x8276},{0x5003, 0x8277},{0x5004, 0x8278}, - {0x5005, 0x8279},{0x5006, 0x827A},{0x5007, 0x827B},{0x5008, 0x827C},{0x5009, 0x827D},{0x500A, 0x827E},{0x500B, 0x8280},{0x500C, 0xD9C4}, - {0x500D, 0xB1B6},{0x500E, 0x8281},{0x500F, 0xD9BF},{0x5010, 0x8282},{0x5011, 0x8283},{0x5012, 0xB5B9},{0x5013, 0x8284},{0x5014, 0xBEF3}, - {0x5015, 0x8285},{0x5016, 0x8286},{0x5017, 0x8287},{0x5018, 0xCCC8},{0x5019, 0xBAF2},{0x501A, 0xD2D0},{0x501B, 0x8288},{0x501C, 0xD9C3}, - {0x501D, 0x8289},{0x501E, 0x828A},{0x501F, 0xBDE8},{0x5020, 0x828B},{0x5021, 0xB3AB},{0x5022, 0x828C},{0x5023, 0x828D},{0x5024, 0x828E}, - {0x5025, 0xD9C5},{0x5026, 0xBEEB},{0x5027, 0x828F},{0x5028, 0xD9C6},{0x5029, 0xD9BB},{0x502A, 0xC4DF},{0x502B, 0x8290},{0x502C, 0xD9BE}, - {0x502D, 0xD9C1},{0x502E, 0xD9C0},{0x502F, 0x8291},{0x5030, 0x8292},{0x5031, 0x8293},{0x5032, 0x8294},{0x5033, 0x8295},{0x5034, 0x8296}, - {0x5035, 0x8297},{0x5036, 0x8298},{0x5037, 0x8299},{0x5038, 0x829A},{0x5039, 0x829B},{0x503A, 0xD5AE},{0x503B, 0x829C},{0x503C, 0xD6B5}, - {0x503D, 0x829D},{0x503E, 0xC7E3},{0x503F, 0x829E},{0x5040, 0x829F},{0x5041, 0x82A0},{0x5042, 0x82A1},{0x5043, 0xD9C8},{0x5044, 0x82A2}, - {0x5045, 0x82A3},{0x5046, 0x82A4},{0x5047, 0xBCD9},{0x5048, 0xD9CA},{0x5049, 0x82A5},{0x504A, 0x82A6},{0x504B, 0x82A7},{0x504C, 0xD9BC}, - {0x504D, 0x82A8},{0x504E, 0xD9CB},{0x504F, 0xC6AB},{0x5050, 0x82A9},{0x5051, 0x82AA},{0x5052, 0x82AB},{0x5053, 0x82AC},{0x5054, 0x82AD}, - {0x5055, 0xD9C9},{0x5056, 0x82AE},{0x5057, 0x82AF},{0x5058, 0x82B0},{0x5059, 0x82B1},{0x505A, 0xD7F6},{0x505B, 0x82B2},{0x505C, 0xCDA3}, - {0x505D, 0x82B3},{0x505E, 0x82B4},{0x505F, 0x82B5},{0x5060, 0x82B6},{0x5061, 0x82B7},{0x5062, 0x82B8},{0x5063, 0x82B9},{0x5064, 0x82BA}, - {0x5065, 0xBDA1},{0x5066, 0x82BB},{0x5067, 0x82BC},{0x5068, 0x82BD},{0x5069, 0x82BE},{0x506A, 0x82BF},{0x506B, 0x82C0},{0x506C, 0xD9CC}, - {0x506D, 0x82C1},{0x506E, 0x82C2},{0x506F, 0x82C3},{0x5070, 0x82C4},{0x5071, 0x82C5},{0x5072, 0x82C6},{0x5073, 0x82C7},{0x5074, 0x82C8}, - {0x5075, 0x82C9},{0x5076, 0xC5BC},{0x5077, 0xCDB5},{0x5078, 0x82CA},{0x5079, 0x82CB},{0x507A, 0x82CC},{0x507B, 0xD9CD},{0x507C, 0x82CD}, - {0x507D, 0x82CE},{0x507E, 0xD9C7},{0x507F, 0xB3A5},{0x5080, 0xBFFE},{0x5081, 0x82CF},{0x5082, 0x82D0},{0x5083, 0x82D1},{0x5084, 0x82D2}, - {0x5085, 0xB8B5},{0x5086, 0x82D3},{0x5087, 0x82D4},{0x5088, 0xC0FC},{0x5089, 0x82D5},{0x508A, 0x82D6},{0x508B, 0x82D7},{0x508C, 0x82D8}, - {0x508D, 0xB0F8},{0x508E, 0x82D9},{0x508F, 0x82DA},{0x5090, 0x82DB},{0x5091, 0x82DC},{0x5092, 0x82DD},{0x5093, 0x82DE},{0x5094, 0x82DF}, - {0x5095, 0x82E0},{0x5096, 0x82E1},{0x5097, 0x82E2},{0x5098, 0x82E3},{0x5099, 0x82E4},{0x509A, 0x82E5},{0x509B, 0x82E6},{0x509C, 0x82E7}, - {0x509D, 0x82E8},{0x509E, 0x82E9},{0x509F, 0x82EA},{0x50A0, 0x82EB},{0x50A1, 0x82EC},{0x50A2, 0x82ED},{0x50A3, 0xB4F6},{0x50A4, 0x82EE}, - {0x50A5, 0xD9CE},{0x50A6, 0x82EF},{0x50A7, 0xD9CF},{0x50A8, 0xB4A2},{0x50A9, 0xD9D0},{0x50AA, 0x82F0},{0x50AB, 0x82F1},{0x50AC, 0xB4DF}, - {0x50AD, 0x82F2},{0x50AE, 0x82F3},{0x50AF, 0x82F4},{0x50B0, 0x82F5},{0x50B1, 0x82F6},{0x50B2, 0xB0C1},{0x50B3, 0x82F7},{0x50B4, 0x82F8}, - {0x50B5, 0x82F9},{0x50B6, 0x82FA},{0x50B7, 0x82FB},{0x50B8, 0x82FC},{0x50B9, 0x82FD},{0x50BA, 0xD9D1},{0x50BB, 0xC9B5},{0x50BC, 0x82FE}, - {0x50BD, 0x8340},{0x50BE, 0x8341},{0x50BF, 0x8342},{0x50C0, 0x8343},{0x50C1, 0x8344},{0x50C2, 0x8345},{0x50C3, 0x8346},{0x50C4, 0x8347}, - {0x50C5, 0x8348},{0x50C6, 0x8349},{0x50C7, 0x834A},{0x50C8, 0x834B},{0x50C9, 0x834C},{0x50CA, 0x834D},{0x50CB, 0x834E},{0x50CC, 0x834F}, - {0x50CD, 0x8350},{0x50CE, 0x8351},{0x50CF, 0xCFF1},{0x50D0, 0x8352},{0x50D1, 0x8353},{0x50D2, 0x8354},{0x50D3, 0x8355},{0x50D4, 0x8356}, - {0x50D5, 0x8357},{0x50D6, 0xD9D2},{0x50D7, 0x8358},{0x50D8, 0x8359},{0x50D9, 0x835A},{0x50DA, 0xC1C5},{0x50DB, 0x835B},{0x50DC, 0x835C}, - {0x50DD, 0x835D},{0x50DE, 0x835E},{0x50DF, 0x835F},{0x50E0, 0x8360},{0x50E1, 0x8361},{0x50E2, 0x8362},{0x50E3, 0x8363},{0x50E4, 0x8364}, - {0x50E5, 0x8365},{0x50E6, 0xD9D6},{0x50E7, 0xC9AE},{0x50E8, 0x8366},{0x50E9, 0x8367},{0x50EA, 0x8368},{0x50EB, 0x8369},{0x50EC, 0xD9D5}, - {0x50ED, 0xD9D4},{0x50EE, 0xD9D7},{0x50EF, 0x836A},{0x50F0, 0x836B},{0x50F1, 0x836C},{0x50F2, 0x836D},{0x50F3, 0xCBDB},{0x50F4, 0x836E}, - {0x50F5, 0xBDA9},{0x50F6, 0x836F},{0x50F7, 0x8370},{0x50F8, 0x8371},{0x50F9, 0x8372},{0x50FA, 0x8373},{0x50FB, 0xC6A7},{0x50FC, 0x8374}, - {0x50FD, 0x8375},{0x50FE, 0x8376},{0x50FF, 0x8377},{0x5100, 0x8378},{0x5101, 0x8379},{0x5102, 0x837A},{0x5103, 0x837B},{0x5104, 0x837C}, - {0x5105, 0x837D},{0x5106, 0xD9D3},{0x5107, 0xD9D8},{0x5108, 0x837E},{0x5109, 0x8380},{0x510A, 0x8381},{0x510B, 0xD9D9},{0x510C, 0x8382}, - {0x510D, 0x8383},{0x510E, 0x8384},{0x510F, 0x8385},{0x5110, 0x8386},{0x5111, 0x8387},{0x5112, 0xC8E5},{0x5113, 0x8388},{0x5114, 0x8389}, - {0x5115, 0x838A},{0x5116, 0x838B},{0x5117, 0x838C},{0x5118, 0x838D},{0x5119, 0x838E},{0x511A, 0x838F},{0x511B, 0x8390},{0x511C, 0x8391}, - {0x511D, 0x8392},{0x511E, 0x8393},{0x511F, 0x8394},{0x5120, 0x8395},{0x5121, 0xC0DC},{0x5122, 0x8396},{0x5123, 0x8397},{0x5124, 0x8398}, - {0x5125, 0x8399},{0x5126, 0x839A},{0x5127, 0x839B},{0x5128, 0x839C},{0x5129, 0x839D},{0x512A, 0x839E},{0x512B, 0x839F},{0x512C, 0x83A0}, - {0x512D, 0x83A1},{0x512E, 0x83A2},{0x512F, 0x83A3},{0x5130, 0x83A4},{0x5131, 0x83A5},{0x5132, 0x83A6},{0x5133, 0x83A7},{0x5134, 0x83A8}, - {0x5135, 0x83A9},{0x5136, 0x83AA},{0x5137, 0x83AB},{0x5138, 0x83AC},{0x5139, 0x83AD},{0x513A, 0x83AE},{0x513B, 0x83AF},{0x513C, 0x83B0}, - {0x513D, 0x83B1},{0x513E, 0x83B2},{0x513F, 0xB6F9},{0x5140, 0xD8A3},{0x5141, 0xD4CA},{0x5142, 0x83B3},{0x5143, 0xD4AA},{0x5144, 0xD0D6}, - {0x5145, 0xB3E4},{0x5146, 0xD5D7},{0x5147, 0x83B4},{0x5148, 0xCFC8},{0x5149, 0xB9E2},{0x514A, 0x83B5},{0x514B, 0xBFCB},{0x514C, 0x83B6}, - {0x514D, 0xC3E2},{0x514E, 0x83B7},{0x514F, 0x83B8},{0x5150, 0x83B9},{0x5151, 0xB6D2},{0x5152, 0x83BA},{0x5153, 0x83BB},{0x5154, 0xCDC3}, - {0x5155, 0xD9EE},{0x5156, 0xD9F0},{0x5157, 0x83BC},{0x5158, 0x83BD},{0x5159, 0x83BE},{0x515A, 0xB5B3},{0x515B, 0x83BF},{0x515C, 0xB6B5}, - {0x515D, 0x83C0},{0x515E, 0x83C1},{0x515F, 0x83C2},{0x5160, 0x83C3},{0x5161, 0x83C4},{0x5162, 0xBEA4},{0x5163, 0x83C5},{0x5164, 0x83C6}, - {0x5165, 0xC8EB},{0x5166, 0x83C7},{0x5167, 0x83C8},{0x5168, 0xC8AB},{0x5169, 0x83C9},{0x516A, 0x83CA},{0x516B, 0xB0CB},{0x516C, 0xB9AB}, - {0x516D, 0xC1F9},{0x516E, 0xD9E2},{0x516F, 0x83CB},{0x5170, 0xC0BC},{0x5171, 0xB9B2},{0x5172, 0x83CC},{0x5173, 0xB9D8},{0x5174, 0xD0CB}, - {0x5175, 0xB1F8},{0x5176, 0xC6E4},{0x5177, 0xBEDF},{0x5178, 0xB5E4},{0x5179, 0xD7C8},{0x517A, 0x83CD},{0x517B, 0xD1F8},{0x517C, 0xBCE6}, - {0x517D, 0xCADE},{0x517E, 0x83CE},{0x517F, 0x83CF},{0x5180, 0xBCBD},{0x5181, 0xD9E6},{0x5182, 0xD8E7},{0x5183, 0x83D0},{0x5184, 0x83D1}, - {0x5185, 0xC4DA},{0x5186, 0x83D2},{0x5187, 0x83D3},{0x5188, 0xB8D4},{0x5189, 0xC8BD},{0x518A, 0x83D4},{0x518B, 0x83D5},{0x518C, 0xB2E1}, - {0x518D, 0xD4D9},{0x518E, 0x83D6},{0x518F, 0x83D7},{0x5190, 0x83D8},{0x5191, 0x83D9},{0x5192, 0xC3B0},{0x5193, 0x83DA},{0x5194, 0x83DB}, - {0x5195, 0xC3E1},{0x5196, 0xDAA2},{0x5197, 0xC8DF},{0x5198, 0x83DC},{0x5199, 0xD0B4},{0x519A, 0x83DD},{0x519B, 0xBEFC},{0x519C, 0xC5A9}, - {0x519D, 0x83DE},{0x519E, 0x83DF},{0x519F, 0x83E0},{0x51A0, 0xB9DA},{0x51A1, 0x83E1},{0x51A2, 0xDAA3},{0x51A3, 0x83E2},{0x51A4, 0xD4A9}, - {0x51A5, 0xDAA4},{0x51A6, 0x83E3},{0x51A7, 0x83E4},{0x51A8, 0x83E5},{0x51A9, 0x83E6},{0x51AA, 0x83E7},{0x51AB, 0xD9FB},{0x51AC, 0xB6AC}, - {0x51AD, 0x83E8},{0x51AE, 0x83E9},{0x51AF, 0xB7EB},{0x51B0, 0xB1F9},{0x51B1, 0xD9FC},{0x51B2, 0xB3E5},{0x51B3, 0xBEF6},{0x51B4, 0x83EA}, - {0x51B5, 0xBFF6},{0x51B6, 0xD2B1},{0x51B7, 0xC0E4},{0x51B8, 0x83EB},{0x51B9, 0x83EC},{0x51BA, 0x83ED},{0x51BB, 0xB6B3},{0x51BC, 0xD9FE}, - {0x51BD, 0xD9FD},{0x51BE, 0x83EE},{0x51BF, 0x83EF},{0x51C0, 0xBEBB},{0x51C1, 0x83F0},{0x51C2, 0x83F1},{0x51C3, 0x83F2},{0x51C4, 0xC6E0}, - {0x51C5, 0x83F3},{0x51C6, 0xD7BC},{0x51C7, 0xDAA1},{0x51C8, 0x83F4},{0x51C9, 0xC1B9},{0x51CA, 0x83F5},{0x51CB, 0xB5F2},{0x51CC, 0xC1E8}, - {0x51CD, 0x83F6},{0x51CE, 0x83F7},{0x51CF, 0xBCF5},{0x51D0, 0x83F8},{0x51D1, 0xB4D5},{0x51D2, 0x83F9},{0x51D3, 0x83FA},{0x51D4, 0x83FB}, - {0x51D5, 0x83FC},{0x51D6, 0x83FD},{0x51D7, 0x83FE},{0x51D8, 0x8440},{0x51D9, 0x8441},{0x51DA, 0x8442},{0x51DB, 0xC1DD},{0x51DC, 0x8443}, - {0x51DD, 0xC4FD},{0x51DE, 0x8444},{0x51DF, 0x8445},{0x51E0, 0xBCB8},{0x51E1, 0xB7B2},{0x51E2, 0x8446},{0x51E3, 0x8447},{0x51E4, 0xB7EF}, - {0x51E5, 0x8448},{0x51E6, 0x8449},{0x51E7, 0x844A},{0x51E8, 0x844B},{0x51E9, 0x844C},{0x51EA, 0x844D},{0x51EB, 0xD9EC},{0x51EC, 0x844E}, - {0x51ED, 0xC6BE},{0x51EE, 0x844F},{0x51EF, 0xBFAD},{0x51F0, 0xBBCB},{0x51F1, 0x8450},{0x51F2, 0x8451},{0x51F3, 0xB5CA},{0x51F4, 0x8452}, - {0x51F5, 0xDBC9},{0x51F6, 0xD0D7},{0x51F7, 0x8453},{0x51F8, 0xCDB9},{0x51F9, 0xB0BC},{0x51FA, 0xB3F6},{0x51FB, 0xBBF7},{0x51FC, 0xDBCA}, - {0x51FD, 0xBAAF},{0x51FE, 0x8454},{0x51FF, 0xD4E4},{0x5200, 0xB5B6},{0x5201, 0xB5F3},{0x5202, 0xD8D6},{0x5203, 0xC8D0},{0x5204, 0x8455}, - {0x5205, 0x8456},{0x5206, 0xB7D6},{0x5207, 0xC7D0},{0x5208, 0xD8D7},{0x5209, 0x8457},{0x520A, 0xBFAF},{0x520B, 0x8458},{0x520C, 0x8459}, - {0x520D, 0xDBBB},{0x520E, 0xD8D8},{0x520F, 0x845A},{0x5210, 0x845B},{0x5211, 0xD0CC},{0x5212, 0xBBAE},{0x5213, 0x845C},{0x5214, 0x845D}, - {0x5215, 0x845E},{0x5216, 0xEBBE},{0x5217, 0xC1D0},{0x5218, 0xC1F5},{0x5219, 0xD4F2},{0x521A, 0xB8D5},{0x521B, 0xB4B4},{0x521C, 0x845F}, - {0x521D, 0xB3F5},{0x521E, 0x8460},{0x521F, 0x8461},{0x5220, 0xC9BE},{0x5221, 0x8462},{0x5222, 0x8463},{0x5223, 0x8464},{0x5224, 0xC5D0}, - {0x5225, 0x8465},{0x5226, 0x8466},{0x5227, 0x8467},{0x5228, 0xC5D9},{0x5229, 0xC0FB},{0x522A, 0x8468},{0x522B, 0xB1F0},{0x522C, 0x8469}, - {0x522D, 0xD8D9},{0x522E, 0xB9CE},{0x522F, 0x846A},{0x5230, 0xB5BD},{0x5231, 0x846B},{0x5232, 0x846C},{0x5233, 0xD8DA},{0x5234, 0x846D}, - {0x5235, 0x846E},{0x5236, 0xD6C6},{0x5237, 0xCBA2},{0x5238, 0xC8AF},{0x5239, 0xC9B2},{0x523A, 0xB4CC},{0x523B, 0xBFCC},{0x523C, 0x846F}, - {0x523D, 0xB9F4},{0x523E, 0x8470},{0x523F, 0xD8DB},{0x5240, 0xD8DC},{0x5241, 0xB6E7},{0x5242, 0xBCC1},{0x5243, 0xCCEA},{0x5244, 0x8471}, - {0x5245, 0x8472},{0x5246, 0x8473},{0x5247, 0x8474},{0x5248, 0x8475},{0x5249, 0x8476},{0x524A, 0xCFF7},{0x524B, 0x8477},{0x524C, 0xD8DD}, - {0x524D, 0xC7B0},{0x524E, 0x8478},{0x524F, 0x8479},{0x5250, 0xB9D0},{0x5251, 0xBDA3},{0x5252, 0x847A},{0x5253, 0x847B},{0x5254, 0xCCDE}, - {0x5255, 0x847C},{0x5256, 0xC6CA},{0x5257, 0x847D},{0x5258, 0x847E},{0x5259, 0x8480},{0x525A, 0x8481},{0x525B, 0x8482},{0x525C, 0xD8E0}, - {0x525D, 0x8483},{0x525E, 0xD8DE},{0x525F, 0x8484},{0x5260, 0x8485},{0x5261, 0xD8DF},{0x5262, 0x8486},{0x5263, 0x8487},{0x5264, 0x8488}, - {0x5265, 0xB0FE},{0x5266, 0x8489},{0x5267, 0xBEE7},{0x5268, 0x848A},{0x5269, 0xCAA3},{0x526A, 0xBCF4},{0x526B, 0x848B},{0x526C, 0x848C}, - {0x526D, 0x848D},{0x526E, 0x848E},{0x526F, 0xB8B1},{0x5270, 0x848F},{0x5271, 0x8490},{0x5272, 0xB8EE},{0x5273, 0x8491},{0x5274, 0x8492}, - {0x5275, 0x8493},{0x5276, 0x8494},{0x5277, 0x8495},{0x5278, 0x8496},{0x5279, 0x8497},{0x527A, 0x8498},{0x527B, 0x8499},{0x527C, 0x849A}, - {0x527D, 0xD8E2},{0x527E, 0x849B},{0x527F, 0xBDCB},{0x5280, 0x849C},{0x5281, 0xD8E4},{0x5282, 0xD8E3},{0x5283, 0x849D},{0x5284, 0x849E}, - {0x5285, 0x849F},{0x5286, 0x84A0},{0x5287, 0x84A1},{0x5288, 0xC5FC},{0x5289, 0x84A2},{0x528A, 0x84A3},{0x528B, 0x84A4},{0x528C, 0x84A5}, - {0x528D, 0x84A6},{0x528E, 0x84A7},{0x528F, 0x84A8},{0x5290, 0xD8E5},{0x5291, 0x84A9},{0x5292, 0x84AA},{0x5293, 0xD8E6},{0x5294, 0x84AB}, - {0x5295, 0x84AC},{0x5296, 0x84AD},{0x5297, 0x84AE},{0x5298, 0x84AF},{0x5299, 0x84B0},{0x529A, 0x84B1},{0x529B, 0xC1A6},{0x529C, 0x84B2}, - {0x529D, 0xC8B0},{0x529E, 0xB0EC},{0x529F, 0xB9A6},{0x52A0, 0xBCD3},{0x52A1, 0xCEF1},{0x52A2, 0xDBBD},{0x52A3, 0xC1D3},{0x52A4, 0x84B3}, - {0x52A5, 0x84B4},{0x52A6, 0x84B5},{0x52A7, 0x84B6},{0x52A8, 0xB6AF},{0x52A9, 0xD6FA},{0x52AA, 0xC5AC},{0x52AB, 0xBDD9},{0x52AC, 0xDBBE}, - {0x52AD, 0xDBBF},{0x52AE, 0x84B7},{0x52AF, 0x84B8},{0x52B0, 0x84B9},{0x52B1, 0xC0F8},{0x52B2, 0xBEA2},{0x52B3, 0xC0CD},{0x52B4, 0x84BA}, - {0x52B5, 0x84BB},{0x52B6, 0x84BC},{0x52B7, 0x84BD},{0x52B8, 0x84BE},{0x52B9, 0x84BF},{0x52BA, 0x84C0},{0x52BB, 0x84C1},{0x52BC, 0x84C2}, - {0x52BD, 0x84C3},{0x52BE, 0xDBC0},{0x52BF, 0xCAC6},{0x52C0, 0x84C4},{0x52C1, 0x84C5},{0x52C2, 0x84C6},{0x52C3, 0xB2AA},{0x52C4, 0x84C7}, - {0x52C5, 0x84C8},{0x52C6, 0x84C9},{0x52C7, 0xD3C2},{0x52C8, 0x84CA},{0x52C9, 0xC3E3},{0x52CA, 0x84CB},{0x52CB, 0xD1AB},{0x52CC, 0x84CC}, - {0x52CD, 0x84CD},{0x52CE, 0x84CE},{0x52CF, 0x84CF},{0x52D0, 0xDBC2},{0x52D1, 0x84D0},{0x52D2, 0xC0D5},{0x52D3, 0x84D1},{0x52D4, 0x84D2}, - {0x52D5, 0x84D3},{0x52D6, 0xDBC3},{0x52D7, 0x84D4},{0x52D8, 0xBFB1},{0x52D9, 0x84D5},{0x52DA, 0x84D6},{0x52DB, 0x84D7},{0x52DC, 0x84D8}, - {0x52DD, 0x84D9},{0x52DE, 0x84DA},{0x52DF, 0xC4BC},{0x52E0, 0x84DB},{0x52E1, 0x84DC},{0x52E2, 0x84DD},{0x52E3, 0x84DE},{0x52E4, 0xC7DA}, - {0x52E5, 0x84DF},{0x52E6, 0x84E0},{0x52E7, 0x84E1},{0x52E8, 0x84E2},{0x52E9, 0x84E3},{0x52EA, 0x84E4},{0x52EB, 0x84E5},{0x52EC, 0x84E6}, - {0x52ED, 0x84E7},{0x52EE, 0x84E8},{0x52EF, 0x84E9},{0x52F0, 0xDBC4},{0x52F1, 0x84EA},{0x52F2, 0x84EB},{0x52F3, 0x84EC},{0x52F4, 0x84ED}, - {0x52F5, 0x84EE},{0x52F6, 0x84EF},{0x52F7, 0x84F0},{0x52F8, 0x84F1},{0x52F9, 0xD9E8},{0x52FA, 0xC9D7},{0x52FB, 0x84F2},{0x52FC, 0x84F3}, - {0x52FD, 0x84F4},{0x52FE, 0xB9B4},{0x52FF, 0xCEF0},{0x5300, 0xD4C8},{0x5301, 0x84F5},{0x5302, 0x84F6},{0x5303, 0x84F7},{0x5304, 0x84F8}, - {0x5305, 0xB0FC},{0x5306, 0xB4D2},{0x5307, 0x84F9},{0x5308, 0xD0D9},{0x5309, 0x84FA},{0x530A, 0x84FB},{0x530B, 0x84FC},{0x530C, 0x84FD}, - {0x530D, 0xD9E9},{0x530E, 0x84FE},{0x530F, 0xDECB},{0x5310, 0xD9EB},{0x5311, 0x8540},{0x5312, 0x8541},{0x5313, 0x8542},{0x5314, 0x8543}, - {0x5315, 0xD8B0},{0x5316, 0xBBAF},{0x5317, 0xB1B1},{0x5318, 0x8544},{0x5319, 0xB3D7},{0x531A, 0xD8CE},{0x531B, 0x8545},{0x531C, 0x8546}, - {0x531D, 0xD4D1},{0x531E, 0x8547},{0x531F, 0x8548},{0x5320, 0xBDB3},{0x5321, 0xBFEF},{0x5322, 0x8549},{0x5323, 0xCFBB},{0x5324, 0x854A}, - {0x5325, 0x854B},{0x5326, 0xD8D0},{0x5327, 0x854C},{0x5328, 0x854D},{0x5329, 0x854E},{0x532A, 0xB7CB},{0x532B, 0x854F},{0x532C, 0x8550}, - {0x532D, 0x8551},{0x532E, 0xD8D1},{0x532F, 0x8552},{0x5330, 0x8553},{0x5331, 0x8554},{0x5332, 0x8555},{0x5333, 0x8556},{0x5334, 0x8557}, - {0x5335, 0x8558},{0x5336, 0x8559},{0x5337, 0x855A},{0x5338, 0x855B},{0x5339, 0xC6A5},{0x533A, 0xC7F8},{0x533B, 0xD2BD},{0x533C, 0x855C}, - {0x533D, 0x855D},{0x533E, 0xD8D2},{0x533F, 0xC4E4},{0x5340, 0x855E},{0x5341, 0xCAAE},{0x5342, 0x855F},{0x5343, 0xC7A7},{0x5344, 0x8560}, - {0x5345, 0xD8A6},{0x5346, 0x8561},{0x5347, 0xC9FD},{0x5348, 0xCEE7},{0x5349, 0xBBDC},{0x534A, 0xB0EB},{0x534B, 0x8562},{0x534C, 0x8563}, - {0x534D, 0x8564},{0x534E, 0xBBAA},{0x534F, 0xD0AD},{0x5350, 0x8565},{0x5351, 0xB1B0},{0x5352, 0xD7E4},{0x5353, 0xD7BF},{0x5354, 0x8566}, - {0x5355, 0xB5A5},{0x5356, 0xC2F4},{0x5357, 0xC4CF},{0x5358, 0x8567},{0x5359, 0x8568},{0x535A, 0xB2A9},{0x535B, 0x8569},{0x535C, 0xB2B7}, - {0x535D, 0x856A},{0x535E, 0xB1E5},{0x535F, 0xDFB2},{0x5360, 0xD5BC},{0x5361, 0xBFA8},{0x5362, 0xC2AC},{0x5363, 0xD8D5},{0x5364, 0xC2B1}, - {0x5365, 0x856B},{0x5366, 0xD8D4},{0x5367, 0xCED4},{0x5368, 0x856C},{0x5369, 0xDAE0},{0x536A, 0x856D},{0x536B, 0xCEC0},{0x536C, 0x856E}, - {0x536D, 0x856F},{0x536E, 0xD8B4},{0x536F, 0xC3AE},{0x5370, 0xD3A1},{0x5371, 0xCEA3},{0x5372, 0x8570},{0x5373, 0xBCB4},{0x5374, 0xC8B4}, - {0x5375, 0xC2D1},{0x5376, 0x8571},{0x5377, 0xBEED},{0x5378, 0xD0B6},{0x5379, 0x8572},{0x537A, 0xDAE1},{0x537B, 0x8573},{0x537C, 0x8574}, - {0x537D, 0x8575},{0x537E, 0x8576},{0x537F, 0xC7E4},{0x5380, 0x8577},{0x5381, 0x8578},{0x5382, 0xB3A7},{0x5383, 0x8579},{0x5384, 0xB6F2}, - {0x5385, 0xCCFC},{0x5386, 0xC0FA},{0x5387, 0x857A},{0x5388, 0x857B},{0x5389, 0xC0F7},{0x538A, 0x857C},{0x538B, 0xD1B9},{0x538C, 0xD1E1}, - {0x538D, 0xD8C7},{0x538E, 0x857D},{0x538F, 0x857E},{0x5390, 0x8580},{0x5391, 0x8581},{0x5392, 0x8582},{0x5393, 0x8583},{0x5394, 0x8584}, - {0x5395, 0xB2DE},{0x5396, 0x8585},{0x5397, 0x8586},{0x5398, 0xC0E5},{0x5399, 0x8587},{0x539A, 0xBAF1},{0x539B, 0x8588},{0x539C, 0x8589}, - {0x539D, 0xD8C8},{0x539E, 0x858A},{0x539F, 0xD4AD},{0x53A0, 0x858B},{0x53A1, 0x858C},{0x53A2, 0xCFE1},{0x53A3, 0xD8C9},{0x53A4, 0x858D}, - {0x53A5, 0xD8CA},{0x53A6, 0xCFC3},{0x53A7, 0x858E},{0x53A8, 0xB3F8},{0x53A9, 0xBEC7},{0x53AA, 0x858F},{0x53AB, 0x8590},{0x53AC, 0x8591}, - {0x53AD, 0x8592},{0x53AE, 0xD8CB},{0x53AF, 0x8593},{0x53B0, 0x8594},{0x53B1, 0x8595},{0x53B2, 0x8596},{0x53B3, 0x8597},{0x53B4, 0x8598}, - {0x53B5, 0x8599},{0x53B6, 0xDBCC},{0x53B7, 0x859A},{0x53B8, 0x859B},{0x53B9, 0x859C},{0x53BA, 0x859D},{0x53BB, 0xC8A5},{0x53BC, 0x859E}, - {0x53BD, 0x859F},{0x53BE, 0x85A0},{0x53BF, 0xCFD8},{0x53C0, 0x85A1},{0x53C1, 0xC8FE},{0x53C2, 0xB2CE},{0x53C3, 0x85A2},{0x53C4, 0x85A3}, - {0x53C5, 0x85A4},{0x53C6, 0x85A5},{0x53C7, 0x85A6},{0x53C8, 0xD3D6},{0x53C9, 0xB2E6},{0x53CA, 0xBCB0},{0x53CB, 0xD3D1},{0x53CC, 0xCBAB}, - {0x53CD, 0xB7B4},{0x53CE, 0x85A7},{0x53CF, 0x85A8},{0x53D0, 0x85A9},{0x53D1, 0xB7A2},{0x53D2, 0x85AA},{0x53D3, 0x85AB},{0x53D4, 0xCAE5}, - {0x53D5, 0x85AC},{0x53D6, 0xC8A1},{0x53D7, 0xCADC},{0x53D8, 0xB1E4},{0x53D9, 0xD0F0},{0x53DA, 0x85AD},{0x53DB, 0xC5D1},{0x53DC, 0x85AE}, - {0x53DD, 0x85AF},{0x53DE, 0x85B0},{0x53DF, 0xDBC5},{0x53E0, 0xB5FE},{0x53E1, 0x85B1},{0x53E2, 0x85B2},{0x53E3, 0xBFDA},{0x53E4, 0xB9C5}, - {0x53E5, 0xBEE4},{0x53E6, 0xC1ED},{0x53E7, 0x85B3},{0x53E8, 0xDFB6},{0x53E9, 0xDFB5},{0x53EA, 0xD6BB},{0x53EB, 0xBDD0},{0x53EC, 0xD5D9}, - {0x53ED, 0xB0C8},{0x53EE, 0xB6A3},{0x53EF, 0xBFC9},{0x53F0, 0xCCA8},{0x53F1, 0xDFB3},{0x53F2, 0xCAB7},{0x53F3, 0xD3D2},{0x53F4, 0x85B4}, - {0x53F5, 0xD8CF},{0x53F6, 0xD2B6},{0x53F7, 0xBAC5},{0x53F8, 0xCBBE},{0x53F9, 0xCCBE},{0x53FA, 0x85B5},{0x53FB, 0xDFB7},{0x53FC, 0xB5F0}, - {0x53FD, 0xDFB4},{0x53FE, 0x85B6},{0x53FF, 0x85B7},{0x5400, 0x85B8},{0x5401, 0xD3F5},{0x5402, 0x85B9},{0x5403, 0xB3D4},{0x5404, 0xB8F7}, - {0x5405, 0x85BA},{0x5406, 0xDFBA},{0x5407, 0x85BB},{0x5408, 0xBACF},{0x5409, 0xBCAA},{0x540A, 0xB5F5},{0x540B, 0x85BC},{0x540C, 0xCDAC}, - {0x540D, 0xC3FB},{0x540E, 0xBAF3},{0x540F, 0xC0F4},{0x5410, 0xCDC2},{0x5411, 0xCFF2},{0x5412, 0xDFB8},{0x5413, 0xCFC5},{0x5414, 0x85BD}, - {0x5415, 0xC2C0},{0x5416, 0xDFB9},{0x5417, 0xC2F0},{0x5418, 0x85BE},{0x5419, 0x85BF},{0x541A, 0x85C0},{0x541B, 0xBEFD},{0x541C, 0x85C1}, - {0x541D, 0xC1DF},{0x541E, 0xCDCC},{0x541F, 0xD2F7},{0x5420, 0xB7CD},{0x5421, 0xDFC1},{0x5422, 0x85C2},{0x5423, 0xDFC4},{0x5424, 0x85C3}, - {0x5425, 0x85C4},{0x5426, 0xB7F1},{0x5427, 0xB0C9},{0x5428, 0xB6D6},{0x5429, 0xB7D4},{0x542A, 0x85C5},{0x542B, 0xBAAC},{0x542C, 0xCCFD}, - {0x542D, 0xBFD4},{0x542E, 0xCBB1},{0x542F, 0xC6F4},{0x5430, 0x85C6},{0x5431, 0xD6A8},{0x5432, 0xDFC5},{0x5433, 0x85C7},{0x5434, 0xCEE2}, - {0x5435, 0xB3B3},{0x5436, 0x85C8},{0x5437, 0x85C9},{0x5438, 0xCEFC},{0x5439, 0xB4B5},{0x543A, 0x85CA},{0x543B, 0xCEC7},{0x543C, 0xBAF0}, - {0x543D, 0x85CB},{0x543E, 0xCEE1},{0x543F, 0x85CC},{0x5440, 0xD1BD},{0x5441, 0x85CD},{0x5442, 0x85CE},{0x5443, 0xDFC0},{0x5444, 0x85CF}, - {0x5445, 0x85D0},{0x5446, 0xB4F4},{0x5447, 0x85D1},{0x5448, 0xB3CA},{0x5449, 0x85D2},{0x544A, 0xB8E6},{0x544B, 0xDFBB},{0x544C, 0x85D3}, - {0x544D, 0x85D4},{0x544E, 0x85D5},{0x544F, 0x85D6},{0x5450, 0xC4C5},{0x5451, 0x85D7},{0x5452, 0xDFBC},{0x5453, 0xDFBD},{0x5454, 0xDFBE}, - {0x5455, 0xC5BB},{0x5456, 0xDFBF},{0x5457, 0xDFC2},{0x5458, 0xD4B1},{0x5459, 0xDFC3},{0x545A, 0x85D8},{0x545B, 0xC7BA},{0x545C, 0xCED8}, - {0x545D, 0x85D9},{0x545E, 0x85DA},{0x545F, 0x85DB},{0x5460, 0x85DC},{0x5461, 0x85DD},{0x5462, 0xC4D8},{0x5463, 0x85DE},{0x5464, 0xDFCA}, - {0x5465, 0x85DF},{0x5466, 0xDFCF},{0x5467, 0x85E0},{0x5468, 0xD6DC},{0x5469, 0x85E1},{0x546A, 0x85E2},{0x546B, 0x85E3},{0x546C, 0x85E4}, - {0x546D, 0x85E5},{0x546E, 0x85E6},{0x546F, 0x85E7},{0x5470, 0x85E8},{0x5471, 0xDFC9},{0x5472, 0xDFDA},{0x5473, 0xCEB6},{0x5474, 0x85E9}, - {0x5475, 0xBAC7},{0x5476, 0xDFCE},{0x5477, 0xDFC8},{0x5478, 0xC5DE},{0x5479, 0x85EA},{0x547A, 0x85EB},{0x547B, 0xC9EB},{0x547C, 0xBAF4}, - {0x547D, 0xC3FC},{0x547E, 0x85EC},{0x547F, 0x85ED},{0x5480, 0xBED7},{0x5481, 0x85EE},{0x5482, 0xDFC6},{0x5483, 0x85EF},{0x5484, 0xDFCD}, - {0x5485, 0x85F0},{0x5486, 0xC5D8},{0x5487, 0x85F1},{0x5488, 0x85F2},{0x5489, 0x85F3},{0x548A, 0x85F4},{0x548B, 0xD5A6},{0x548C, 0xBACD}, - {0x548D, 0x85F5},{0x548E, 0xBECC},{0x548F, 0xD3BD},{0x5490, 0xB8C0},{0x5491, 0x85F6},{0x5492, 0xD6E4},{0x5493, 0x85F7},{0x5494, 0xDFC7}, - {0x5495, 0xB9BE},{0x5496, 0xBFA7},{0x5497, 0x85F8},{0x5498, 0x85F9},{0x5499, 0xC1FC},{0x549A, 0xDFCB},{0x549B, 0xDFCC},{0x549C, 0x85FA}, - {0x549D, 0xDFD0},{0x549E, 0x85FB},{0x549F, 0x85FC},{0x54A0, 0x85FD},{0x54A1, 0x85FE},{0x54A2, 0x8640},{0x54A3, 0xDFDB},{0x54A4, 0xDFE5}, - {0x54A5, 0x8641},{0x54A6, 0xDFD7},{0x54A7, 0xDFD6},{0x54A8, 0xD7C9},{0x54A9, 0xDFE3},{0x54AA, 0xDFE4},{0x54AB, 0xE5EB},{0x54AC, 0xD2A7}, - {0x54AD, 0xDFD2},{0x54AE, 0x8642},{0x54AF, 0xBFA9},{0x54B0, 0x8643},{0x54B1, 0xD4DB},{0x54B2, 0x8644},{0x54B3, 0xBFC8},{0x54B4, 0xDFD4}, - {0x54B5, 0x8645},{0x54B6, 0x8646},{0x54B7, 0x8647},{0x54B8, 0xCFCC},{0x54B9, 0x8648},{0x54BA, 0x8649},{0x54BB, 0xDFDD},{0x54BC, 0x864A}, - {0x54BD, 0xD1CA},{0x54BE, 0x864B},{0x54BF, 0xDFDE},{0x54C0, 0xB0A7},{0x54C1, 0xC6B7},{0x54C2, 0xDFD3},{0x54C3, 0x864C},{0x54C4, 0xBAE5}, - {0x54C5, 0x864D},{0x54C6, 0xB6DF},{0x54C7, 0xCDDB},{0x54C8, 0xB9FE},{0x54C9, 0xD4D5},{0x54CA, 0x864E},{0x54CB, 0x864F},{0x54CC, 0xDFDF}, - {0x54CD, 0xCFEC},{0x54CE, 0xB0A5},{0x54CF, 0xDFE7},{0x54D0, 0xDFD1},{0x54D1, 0xD1C6},{0x54D2, 0xDFD5},{0x54D3, 0xDFD8},{0x54D4, 0xDFD9}, - {0x54D5, 0xDFDC},{0x54D6, 0x8650},{0x54D7, 0xBBA9},{0x54D8, 0x8651},{0x54D9, 0xDFE0},{0x54DA, 0xDFE1},{0x54DB, 0x8652},{0x54DC, 0xDFE2}, - {0x54DD, 0xDFE6},{0x54DE, 0xDFE8},{0x54DF, 0xD3B4},{0x54E0, 0x8653},{0x54E1, 0x8654},{0x54E2, 0x8655},{0x54E3, 0x8656},{0x54E4, 0x8657}, - {0x54E5, 0xB8E7},{0x54E6, 0xC5B6},{0x54E7, 0xDFEA},{0x54E8, 0xC9DA},{0x54E9, 0xC1A8},{0x54EA, 0xC4C4},{0x54EB, 0x8658},{0x54EC, 0x8659}, - {0x54ED, 0xBFDE},{0x54EE, 0xCFF8},{0x54EF, 0x865A},{0x54F0, 0x865B},{0x54F1, 0x865C},{0x54F2, 0xD5DC},{0x54F3, 0xDFEE},{0x54F4, 0x865D}, - {0x54F5, 0x865E},{0x54F6, 0x865F},{0x54F7, 0x8660},{0x54F8, 0x8661},{0x54F9, 0x8662},{0x54FA, 0xB2B8},{0x54FB, 0x8663},{0x54FC, 0xBADF}, - {0x54FD, 0xDFEC},{0x54FE, 0x8664},{0x54FF, 0xDBC1},{0x5500, 0x8665},{0x5501, 0xD1E4},{0x5502, 0x8666},{0x5503, 0x8667},{0x5504, 0x8668}, - {0x5505, 0x8669},{0x5506, 0xCBF4},{0x5507, 0xB4BD},{0x5508, 0x866A},{0x5509, 0xB0A6},{0x550A, 0x866B},{0x550B, 0x866C},{0x550C, 0x866D}, - {0x550D, 0x866E},{0x550E, 0x866F},{0x550F, 0xDFF1},{0x5510, 0xCCC6},{0x5511, 0xDFF2},{0x5512, 0x8670},{0x5513, 0x8671},{0x5514, 0xDFED}, - {0x5515, 0x8672},{0x5516, 0x8673},{0x5517, 0x8674},{0x5518, 0x8675},{0x5519, 0x8676},{0x551A, 0x8677},{0x551B, 0xDFE9},{0x551C, 0x8678}, - {0x551D, 0x8679},{0x551E, 0x867A},{0x551F, 0x867B},{0x5520, 0xDFEB},{0x5521, 0x867C},{0x5522, 0xDFEF},{0x5523, 0xDFF0},{0x5524, 0xBBBD}, - {0x5525, 0x867D},{0x5526, 0x867E},{0x5527, 0xDFF3},{0x5528, 0x8680},{0x5529, 0x8681},{0x552A, 0xDFF4},{0x552B, 0x8682},{0x552C, 0xBBA3}, - {0x552D, 0x8683},{0x552E, 0xCADB},{0x552F, 0xCEA8},{0x5530, 0xE0A7},{0x5531, 0xB3AA},{0x5532, 0x8684},{0x5533, 0xE0A6},{0x5534, 0x8685}, - {0x5535, 0x8686},{0x5536, 0x8687},{0x5537, 0xE0A1},{0x5538, 0x8688},{0x5539, 0x8689},{0x553A, 0x868A},{0x553B, 0x868B},{0x553C, 0xDFFE}, - {0x553D, 0x868C},{0x553E, 0xCDD9},{0x553F, 0xDFFC},{0x5540, 0x868D},{0x5541, 0xDFFA},{0x5542, 0x868E},{0x5543, 0xBFD0},{0x5544, 0xD7C4}, - {0x5545, 0x868F},{0x5546, 0xC9CC},{0x5547, 0x8690},{0x5548, 0x8691},{0x5549, 0xDFF8},{0x554A, 0xB0A1},{0x554B, 0x8692},{0x554C, 0x8693}, - {0x554D, 0x8694},{0x554E, 0x8695},{0x554F, 0x8696},{0x5550, 0xDFFD},{0x5551, 0x8697},{0x5552, 0x8698},{0x5553, 0x8699},{0x5554, 0x869A}, - {0x5555, 0xDFFB},{0x5556, 0xE0A2},{0x5557, 0x869B},{0x5558, 0x869C},{0x5559, 0x869D},{0x555A, 0x869E},{0x555B, 0x869F},{0x555C, 0xE0A8}, - {0x555D, 0x86A0},{0x555E, 0x86A1},{0x555F, 0x86A2},{0x5560, 0x86A3},{0x5561, 0xB7C8},{0x5562, 0x86A4},{0x5563, 0x86A5},{0x5564, 0xC6A1}, - {0x5565, 0xC9B6},{0x5566, 0xC0B2},{0x5567, 0xDFF5},{0x5568, 0x86A6},{0x5569, 0x86A7},{0x556A, 0xC5BE},{0x556B, 0x86A8},{0x556C, 0xD8C4}, - {0x556D, 0xDFF9},{0x556E, 0xC4F6},{0x556F, 0x86A9},{0x5570, 0x86AA},{0x5571, 0x86AB},{0x5572, 0x86AC},{0x5573, 0x86AD},{0x5574, 0x86AE}, - {0x5575, 0xE0A3},{0x5576, 0xE0A4},{0x5577, 0xE0A5},{0x5578, 0xD0A5},{0x5579, 0x86AF},{0x557A, 0x86B0},{0x557B, 0xE0B4},{0x557C, 0xCCE4}, - {0x557D, 0x86B1},{0x557E, 0xE0B1},{0x557F, 0x86B2},{0x5580, 0xBFA6},{0x5581, 0xE0AF},{0x5582, 0xCEB9},{0x5583, 0xE0AB},{0x5584, 0xC9C6}, - {0x5585, 0x86B3},{0x5586, 0x86B4},{0x5587, 0xC0AE},{0x5588, 0xE0AE},{0x5589, 0xBAED},{0x558A, 0xBAB0},{0x558B, 0xE0A9},{0x558C, 0x86B5}, - {0x558D, 0x86B6},{0x558E, 0x86B7},{0x558F, 0xDFF6},{0x5590, 0x86B8},{0x5591, 0xE0B3},{0x5592, 0x86B9},{0x5593, 0x86BA},{0x5594, 0xE0B8}, - {0x5595, 0x86BB},{0x5596, 0x86BC},{0x5597, 0x86BD},{0x5598, 0xB4AD},{0x5599, 0xE0B9},{0x559A, 0x86BE},{0x559B, 0x86BF},{0x559C, 0xCFB2}, - {0x559D, 0xBAC8},{0x559E, 0x86C0},{0x559F, 0xE0B0},{0x55A0, 0x86C1},{0x55A1, 0x86C2},{0x55A2, 0x86C3},{0x55A3, 0x86C4},{0x55A4, 0x86C5}, - {0x55A5, 0x86C6},{0x55A6, 0x86C7},{0x55A7, 0xD0FA},{0x55A8, 0x86C8},{0x55A9, 0x86C9},{0x55AA, 0x86CA},{0x55AB, 0x86CB},{0x55AC, 0x86CC}, - {0x55AD, 0x86CD},{0x55AE, 0x86CE},{0x55AF, 0x86CF},{0x55B0, 0x86D0},{0x55B1, 0xE0AC},{0x55B2, 0x86D1},{0x55B3, 0xD4FB},{0x55B4, 0x86D2}, - {0x55B5, 0xDFF7},{0x55B6, 0x86D3},{0x55B7, 0xC5E7},{0x55B8, 0x86D4},{0x55B9, 0xE0AD},{0x55BA, 0x86D5},{0x55BB, 0xD3F7},{0x55BC, 0x86D6}, - {0x55BD, 0xE0B6},{0x55BE, 0xE0B7},{0x55BF, 0x86D7},{0x55C0, 0x86D8},{0x55C1, 0x86D9},{0x55C2, 0x86DA},{0x55C3, 0x86DB},{0x55C4, 0xE0C4}, - {0x55C5, 0xD0E1},{0x55C6, 0x86DC},{0x55C7, 0x86DD},{0x55C8, 0x86DE},{0x55C9, 0xE0BC},{0x55CA, 0x86DF},{0x55CB, 0x86E0},{0x55CC, 0xE0C9}, - {0x55CD, 0xE0CA},{0x55CE, 0x86E1},{0x55CF, 0x86E2},{0x55D0, 0x86E3},{0x55D1, 0xE0BE},{0x55D2, 0xE0AA},{0x55D3, 0xC9A4},{0x55D4, 0xE0C1}, - {0x55D5, 0x86E4},{0x55D6, 0xE0B2},{0x55D7, 0x86E5},{0x55D8, 0x86E6},{0x55D9, 0x86E7},{0x55DA, 0x86E8},{0x55DB, 0x86E9},{0x55DC, 0xCAC8}, - {0x55DD, 0xE0C3},{0x55DE, 0x86EA},{0x55DF, 0xE0B5},{0x55E0, 0x86EB},{0x55E1, 0xCECB},{0x55E2, 0x86EC},{0x55E3, 0xCBC3},{0x55E4, 0xE0CD}, - {0x55E5, 0xE0C6},{0x55E6, 0xE0C2},{0x55E7, 0x86ED},{0x55E8, 0xE0CB},{0x55E9, 0x86EE},{0x55EA, 0xE0BA},{0x55EB, 0xE0BF},{0x55EC, 0xE0C0}, - {0x55ED, 0x86EF},{0x55EE, 0x86F0},{0x55EF, 0xE0C5},{0x55F0, 0x86F1},{0x55F1, 0x86F2},{0x55F2, 0xE0C7},{0x55F3, 0xE0C8},{0x55F4, 0x86F3}, - {0x55F5, 0xE0CC},{0x55F6, 0x86F4},{0x55F7, 0xE0BB},{0x55F8, 0x86F5},{0x55F9, 0x86F6},{0x55FA, 0x86F7},{0x55FB, 0x86F8},{0x55FC, 0x86F9}, - {0x55FD, 0xCBD4},{0x55FE, 0xE0D5},{0x55FF, 0x86FA},{0x5600, 0xE0D6},{0x5601, 0xE0D2},{0x5602, 0x86FB},{0x5603, 0x86FC},{0x5604, 0x86FD}, - {0x5605, 0x86FE},{0x5606, 0x8740},{0x5607, 0x8741},{0x5608, 0xE0D0},{0x5609, 0xBCCE},{0x560A, 0x8742},{0x560B, 0x8743},{0x560C, 0xE0D1}, - {0x560D, 0x8744},{0x560E, 0xB8C2},{0x560F, 0xD8C5},{0x5610, 0x8745},{0x5611, 0x8746},{0x5612, 0x8747},{0x5613, 0x8748},{0x5614, 0x8749}, - {0x5615, 0x874A},{0x5616, 0x874B},{0x5617, 0x874C},{0x5618, 0xD0EA},{0x5619, 0x874D},{0x561A, 0x874E},{0x561B, 0xC2EF},{0x561C, 0x874F}, - {0x561D, 0x8750},{0x561E, 0xE0CF},{0x561F, 0xE0BD},{0x5620, 0x8751},{0x5621, 0x8752},{0x5622, 0x8753},{0x5623, 0xE0D4},{0x5624, 0xE0D3}, - {0x5625, 0x8754},{0x5626, 0x8755},{0x5627, 0xE0D7},{0x5628, 0x8756},{0x5629, 0x8757},{0x562A, 0x8758},{0x562B, 0x8759},{0x562C, 0xE0DC}, - {0x562D, 0xE0D8},{0x562E, 0x875A},{0x562F, 0x875B},{0x5630, 0x875C},{0x5631, 0xD6F6},{0x5632, 0xB3B0},{0x5633, 0x875D},{0x5634, 0xD7EC}, - {0x5635, 0x875E},{0x5636, 0xCBBB},{0x5637, 0x875F},{0x5638, 0x8760},{0x5639, 0xE0DA},{0x563A, 0x8761},{0x563B, 0xCEFB},{0x563C, 0x8762}, - {0x563D, 0x8763},{0x563E, 0x8764},{0x563F, 0xBAD9},{0x5640, 0x8765},{0x5641, 0x8766},{0x5642, 0x8767},{0x5643, 0x8768},{0x5644, 0x8769}, - {0x5645, 0x876A},{0x5646, 0x876B},{0x5647, 0x876C},{0x5648, 0x876D},{0x5649, 0x876E},{0x564A, 0x876F},{0x564B, 0x8770},{0x564C, 0xE0E1}, - {0x564D, 0xE0DD},{0x564E, 0xD2AD},{0x564F, 0x8771},{0x5650, 0x8772},{0x5651, 0x8773},{0x5652, 0x8774},{0x5653, 0x8775},{0x5654, 0xE0E2}, - {0x5655, 0x8776},{0x5656, 0x8777},{0x5657, 0xE0DB},{0x5658, 0xE0D9},{0x5659, 0xE0DF},{0x565A, 0x8778},{0x565B, 0x8779},{0x565C, 0xE0E0}, - {0x565D, 0x877A},{0x565E, 0x877B},{0x565F, 0x877C},{0x5660, 0x877D},{0x5661, 0x877E},{0x5662, 0xE0DE},{0x5663, 0x8780},{0x5664, 0xE0E4}, - {0x5665, 0x8781},{0x5666, 0x8782},{0x5667, 0x8783},{0x5668, 0xC6F7},{0x5669, 0xD8AC},{0x566A, 0xD4EB},{0x566B, 0xE0E6},{0x566C, 0xCAC9}, - {0x566D, 0x8784},{0x566E, 0x8785},{0x566F, 0x8786},{0x5670, 0x8787},{0x5671, 0xE0E5},{0x5672, 0x8788},{0x5673, 0x8789},{0x5674, 0x878A}, - {0x5675, 0x878B},{0x5676, 0xB8C1},{0x5677, 0x878C},{0x5678, 0x878D},{0x5679, 0x878E},{0x567A, 0x878F},{0x567B, 0xE0E7},{0x567C, 0xE0E8}, - {0x567D, 0x8790},{0x567E, 0x8791},{0x567F, 0x8792},{0x5680, 0x8793},{0x5681, 0x8794},{0x5682, 0x8795},{0x5683, 0x8796},{0x5684, 0x8797}, - {0x5685, 0xE0E9},{0x5686, 0xE0E3},{0x5687, 0x8798},{0x5688, 0x8799},{0x5689, 0x879A},{0x568A, 0x879B},{0x568B, 0x879C},{0x568C, 0x879D}, - {0x568D, 0x879E},{0x568E, 0xBABF},{0x568F, 0xCCE7},{0x5690, 0x879F},{0x5691, 0x87A0},{0x5692, 0x87A1},{0x5693, 0xE0EA},{0x5694, 0x87A2}, - {0x5695, 0x87A3},{0x5696, 0x87A4},{0x5697, 0x87A5},{0x5698, 0x87A6},{0x5699, 0x87A7},{0x569A, 0x87A8},{0x569B, 0x87A9},{0x569C, 0x87AA}, - {0x569D, 0x87AB},{0x569E, 0x87AC},{0x569F, 0x87AD},{0x56A0, 0x87AE},{0x56A1, 0x87AF},{0x56A2, 0x87B0},{0x56A3, 0xCFF9},{0x56A4, 0x87B1}, - {0x56A5, 0x87B2},{0x56A6, 0x87B3},{0x56A7, 0x87B4},{0x56A8, 0x87B5},{0x56A9, 0x87B6},{0x56AA, 0x87B7},{0x56AB, 0x87B8},{0x56AC, 0x87B9}, - {0x56AD, 0x87BA},{0x56AE, 0x87BB},{0x56AF, 0xE0EB},{0x56B0, 0x87BC},{0x56B1, 0x87BD},{0x56B2, 0x87BE},{0x56B3, 0x87BF},{0x56B4, 0x87C0}, - {0x56B5, 0x87C1},{0x56B6, 0x87C2},{0x56B7, 0xC8C2},{0x56B8, 0x87C3},{0x56B9, 0x87C4},{0x56BA, 0x87C5},{0x56BB, 0x87C6},{0x56BC, 0xBDC0}, - {0x56BD, 0x87C7},{0x56BE, 0x87C8},{0x56BF, 0x87C9},{0x56C0, 0x87CA},{0x56C1, 0x87CB},{0x56C2, 0x87CC},{0x56C3, 0x87CD},{0x56C4, 0x87CE}, - {0x56C5, 0x87CF},{0x56C6, 0x87D0},{0x56C7, 0x87D1},{0x56C8, 0x87D2},{0x56C9, 0x87D3},{0x56CA, 0xC4D2},{0x56CB, 0x87D4},{0x56CC, 0x87D5}, - {0x56CD, 0x87D6},{0x56CE, 0x87D7},{0x56CF, 0x87D8},{0x56D0, 0x87D9},{0x56D1, 0x87DA},{0x56D2, 0x87DB},{0x56D3, 0x87DC},{0x56D4, 0xE0EC}, - {0x56D5, 0x87DD},{0x56D6, 0x87DE},{0x56D7, 0xE0ED},{0x56D8, 0x87DF},{0x56D9, 0x87E0},{0x56DA, 0xC7F4},{0x56DB, 0xCBC4},{0x56DC, 0x87E1}, - {0x56DD, 0xE0EE},{0x56DE, 0xBBD8},{0x56DF, 0xD8B6},{0x56E0, 0xD2F2},{0x56E1, 0xE0EF},{0x56E2, 0xCDC5},{0x56E3, 0x87E2},{0x56E4, 0xB6DA}, - {0x56E5, 0x87E3},{0x56E6, 0x87E4},{0x56E7, 0x87E5},{0x56E8, 0x87E6},{0x56E9, 0x87E7},{0x56EA, 0x87E8},{0x56EB, 0xE0F1},{0x56EC, 0x87E9}, - {0x56ED, 0xD4B0},{0x56EE, 0x87EA},{0x56EF, 0x87EB},{0x56F0, 0xC0A7},{0x56F1, 0xB4D1},{0x56F2, 0x87EC},{0x56F3, 0x87ED},{0x56F4, 0xCEA7}, - {0x56F5, 0xE0F0},{0x56F6, 0x87EE},{0x56F7, 0x87EF},{0x56F8, 0x87F0},{0x56F9, 0xE0F2},{0x56FA, 0xB9CC},{0x56FB, 0x87F1},{0x56FC, 0x87F2}, - {0x56FD, 0xB9FA},{0x56FE, 0xCDBC},{0x56FF, 0xE0F3},{0x5700, 0x87F3},{0x5701, 0x87F4},{0x5702, 0x87F5},{0x5703, 0xC6D4},{0x5704, 0xE0F4}, - {0x5705, 0x87F6},{0x5706, 0xD4B2},{0x5707, 0x87F7},{0x5708, 0xC8A6},{0x5709, 0xE0F6},{0x570A, 0xE0F5},{0x570B, 0x87F8},{0x570C, 0x87F9}, - {0x570D, 0x87FA},{0x570E, 0x87FB},{0x570F, 0x87FC},{0x5710, 0x87FD},{0x5711, 0x87FE},{0x5712, 0x8840},{0x5713, 0x8841},{0x5714, 0x8842}, - {0x5715, 0x8843},{0x5716, 0x8844},{0x5717, 0x8845},{0x5718, 0x8846},{0x5719, 0x8847},{0x571A, 0x8848},{0x571B, 0x8849},{0x571C, 0xE0F7}, - {0x571D, 0x884A},{0x571E, 0x884B},{0x571F, 0xCDC1},{0x5720, 0x884C},{0x5721, 0x884D},{0x5722, 0x884E},{0x5723, 0xCAA5},{0x5724, 0x884F}, - {0x5725, 0x8850},{0x5726, 0x8851},{0x5727, 0x8852},{0x5728, 0xD4DA},{0x5729, 0xDBD7},{0x572A, 0xDBD9},{0x572B, 0x8853},{0x572C, 0xDBD8}, - {0x572D, 0xB9E7},{0x572E, 0xDBDC},{0x572F, 0xDBDD},{0x5730, 0xB5D8},{0x5731, 0x8854},{0x5732, 0x8855},{0x5733, 0xDBDA},{0x5734, 0x8856}, - {0x5735, 0x8857},{0x5736, 0x8858},{0x5737, 0x8859},{0x5738, 0x885A},{0x5739, 0xDBDB},{0x573A, 0xB3A1},{0x573B, 0xDBDF},{0x573C, 0x885B}, - {0x573D, 0x885C},{0x573E, 0xBBF8},{0x573F, 0x885D},{0x5740, 0xD6B7},{0x5741, 0x885E},{0x5742, 0xDBE0},{0x5743, 0x885F},{0x5744, 0x8860}, - {0x5745, 0x8861},{0x5746, 0x8862},{0x5747, 0xBEF9},{0x5748, 0x8863},{0x5749, 0x8864},{0x574A, 0xB7BB},{0x574B, 0x8865},{0x574C, 0xDBD0}, - {0x574D, 0xCCAE},{0x574E, 0xBFB2},{0x574F, 0xBBB5},{0x5750, 0xD7F8},{0x5751, 0xBFD3},{0x5752, 0x8866},{0x5753, 0x8867},{0x5754, 0x8868}, - {0x5755, 0x8869},{0x5756, 0x886A},{0x5757, 0xBFE9},{0x5758, 0x886B},{0x5759, 0x886C},{0x575A, 0xBCE1},{0x575B, 0xCCB3},{0x575C, 0xDBDE}, - {0x575D, 0xB0D3},{0x575E, 0xCEEB},{0x575F, 0xB7D8},{0x5760, 0xD7B9},{0x5761, 0xC6C2},{0x5762, 0x886D},{0x5763, 0x886E},{0x5764, 0xC0A4}, - {0x5765, 0x886F},{0x5766, 0xCCB9},{0x5767, 0x8870},{0x5768, 0xDBE7},{0x5769, 0xDBE1},{0x576A, 0xC6BA},{0x576B, 0xDBE3},{0x576C, 0x8871}, - {0x576D, 0xDBE8},{0x576E, 0x8872},{0x576F, 0xC5F7},{0x5770, 0x8873},{0x5771, 0x8874},{0x5772, 0x8875},{0x5773, 0xDBEA},{0x5774, 0x8876}, - {0x5775, 0x8877},{0x5776, 0xDBE9},{0x5777, 0xBFC0},{0x5778, 0x8878},{0x5779, 0x8879},{0x577A, 0x887A},{0x577B, 0xDBE6},{0x577C, 0xDBE5}, - {0x577D, 0x887B},{0x577E, 0x887C},{0x577F, 0x887D},{0x5780, 0x887E},{0x5781, 0x8880},{0x5782, 0xB4B9},{0x5783, 0xC0AC},{0x5784, 0xC2A2}, - {0x5785, 0xDBE2},{0x5786, 0xDBE4},{0x5787, 0x8881},{0x5788, 0x8882},{0x5789, 0x8883},{0x578A, 0x8884},{0x578B, 0xD0CD},{0x578C, 0xDBED}, - {0x578D, 0x8885},{0x578E, 0x8886},{0x578F, 0x8887},{0x5790, 0x8888},{0x5791, 0x8889},{0x5792, 0xC0DD},{0x5793, 0xDBF2},{0x5794, 0x888A}, - {0x5795, 0x888B},{0x5796, 0x888C},{0x5797, 0x888D},{0x5798, 0x888E},{0x5799, 0x888F},{0x579A, 0x8890},{0x579B, 0xB6E2},{0x579C, 0x8891}, - {0x579D, 0x8892},{0x579E, 0x8893},{0x579F, 0x8894},{0x57A0, 0xDBF3},{0x57A1, 0xDBD2},{0x57A2, 0xB9B8},{0x57A3, 0xD4AB},{0x57A4, 0xDBEC}, - {0x57A5, 0x8895},{0x57A6, 0xBFD1},{0x57A7, 0xDBF0},{0x57A8, 0x8896},{0x57A9, 0xDBD1},{0x57AA, 0x8897},{0x57AB, 0xB5E6},{0x57AC, 0x8898}, - {0x57AD, 0xDBEB},{0x57AE, 0xBFE5},{0x57AF, 0x8899},{0x57B0, 0x889A},{0x57B1, 0x889B},{0x57B2, 0xDBEE},{0x57B3, 0x889C},{0x57B4, 0xDBF1}, - {0x57B5, 0x889D},{0x57B6, 0x889E},{0x57B7, 0x889F},{0x57B8, 0xDBF9},{0x57B9, 0x88A0},{0x57BA, 0x88A1},{0x57BB, 0x88A2},{0x57BC, 0x88A3}, - {0x57BD, 0x88A4},{0x57BE, 0x88A5},{0x57BF, 0x88A6},{0x57C0, 0x88A7},{0x57C1, 0x88A8},{0x57C2, 0xB9A1},{0x57C3, 0xB0A3},{0x57C4, 0x88A9}, - {0x57C5, 0x88AA},{0x57C6, 0x88AB},{0x57C7, 0x88AC},{0x57C8, 0x88AD},{0x57C9, 0x88AE},{0x57CA, 0x88AF},{0x57CB, 0xC2F1},{0x57CC, 0x88B0}, - {0x57CD, 0x88B1},{0x57CE, 0xB3C7},{0x57CF, 0xDBEF},{0x57D0, 0x88B2},{0x57D1, 0x88B3},{0x57D2, 0xDBF8},{0x57D3, 0x88B4},{0x57D4, 0xC6D2}, - {0x57D5, 0xDBF4},{0x57D6, 0x88B5},{0x57D7, 0x88B6},{0x57D8, 0xDBF5},{0x57D9, 0xDBF7},{0x57DA, 0xDBF6},{0x57DB, 0x88B7},{0x57DC, 0x88B8}, - {0x57DD, 0xDBFE},{0x57DE, 0x88B9},{0x57DF, 0xD3F2},{0x57E0, 0xB2BA},{0x57E1, 0x88BA},{0x57E2, 0x88BB},{0x57E3, 0x88BC},{0x57E4, 0xDBFD}, - {0x57E5, 0x88BD},{0x57E6, 0x88BE},{0x57E7, 0x88BF},{0x57E8, 0x88C0},{0x57E9, 0x88C1},{0x57EA, 0x88C2},{0x57EB, 0x88C3},{0x57EC, 0x88C4}, - {0x57ED, 0xDCA4},{0x57EE, 0x88C5},{0x57EF, 0xDBFB},{0x57F0, 0x88C6},{0x57F1, 0x88C7},{0x57F2, 0x88C8},{0x57F3, 0x88C9},{0x57F4, 0xDBFA}, - {0x57F5, 0x88CA},{0x57F6, 0x88CB},{0x57F7, 0x88CC},{0x57F8, 0xDBFC},{0x57F9, 0xC5E0},{0x57FA, 0xBBF9},{0x57FB, 0x88CD},{0x57FC, 0x88CE}, - {0x57FD, 0xDCA3},{0x57FE, 0x88CF},{0x57FF, 0x88D0},{0x5800, 0xDCA5},{0x5801, 0x88D1},{0x5802, 0xCCC3},{0x5803, 0x88D2},{0x5804, 0x88D3}, - {0x5805, 0x88D4},{0x5806, 0xB6D1},{0x5807, 0xDDC0},{0x5808, 0x88D5},{0x5809, 0x88D6},{0x580A, 0x88D7},{0x580B, 0xDCA1},{0x580C, 0x88D8}, - {0x580D, 0xDCA2},{0x580E, 0x88D9},{0x580F, 0x88DA},{0x5810, 0x88DB},{0x5811, 0xC7B5},{0x5812, 0x88DC},{0x5813, 0x88DD},{0x5814, 0x88DE}, - {0x5815, 0xB6E9},{0x5816, 0x88DF},{0x5817, 0x88E0},{0x5818, 0x88E1},{0x5819, 0xDCA7},{0x581A, 0x88E2},{0x581B, 0x88E3},{0x581C, 0x88E4}, - {0x581D, 0x88E5},{0x581E, 0xDCA6},{0x581F, 0x88E6},{0x5820, 0xDCA9},{0x5821, 0xB1A4},{0x5822, 0x88E7},{0x5823, 0x88E8},{0x5824, 0xB5CC}, - {0x5825, 0x88E9},{0x5826, 0x88EA},{0x5827, 0x88EB},{0x5828, 0x88EC},{0x5829, 0x88ED},{0x582A, 0xBFB0},{0x582B, 0x88EE},{0x582C, 0x88EF}, - {0x582D, 0x88F0},{0x582E, 0x88F1},{0x582F, 0x88F2},{0x5830, 0xD1DF},{0x5831, 0x88F3},{0x5832, 0x88F4},{0x5833, 0x88F5},{0x5834, 0x88F6}, - {0x5835, 0xB6C2},{0x5836, 0x88F7},{0x5837, 0x88F8},{0x5838, 0x88F9},{0x5839, 0x88FA},{0x583A, 0x88FB},{0x583B, 0x88FC},{0x583C, 0x88FD}, - {0x583D, 0x88FE},{0x583E, 0x8940},{0x583F, 0x8941},{0x5840, 0x8942},{0x5841, 0x8943},{0x5842, 0x8944},{0x5843, 0x8945},{0x5844, 0xDCA8}, - {0x5845, 0x8946},{0x5846, 0x8947},{0x5847, 0x8948},{0x5848, 0x8949},{0x5849, 0x894A},{0x584A, 0x894B},{0x584B, 0x894C},{0x584C, 0xCBFA}, - {0x584D, 0xEBF3},{0x584E, 0x894D},{0x584F, 0x894E},{0x5850, 0x894F},{0x5851, 0xCBDC},{0x5852, 0x8950},{0x5853, 0x8951},{0x5854, 0xCBFE}, - {0x5855, 0x8952},{0x5856, 0x8953},{0x5857, 0x8954},{0x5858, 0xCCC1},{0x5859, 0x8955},{0x585A, 0x8956},{0x585B, 0x8957},{0x585C, 0x8958}, - {0x585D, 0x8959},{0x585E, 0xC8FB},{0x585F, 0x895A},{0x5860, 0x895B},{0x5861, 0x895C},{0x5862, 0x895D},{0x5863, 0x895E},{0x5864, 0x895F}, - {0x5865, 0xDCAA},{0x5866, 0x8960},{0x5867, 0x8961},{0x5868, 0x8962},{0x5869, 0x8963},{0x586A, 0x8964},{0x586B, 0xCCEE},{0x586C, 0xDCAB}, - {0x586D, 0x8965},{0x586E, 0x8966},{0x586F, 0x8967},{0x5870, 0x8968},{0x5871, 0x8969},{0x5872, 0x896A},{0x5873, 0x896B},{0x5874, 0x896C}, - {0x5875, 0x896D},{0x5876, 0x896E},{0x5877, 0x896F},{0x5878, 0x8970},{0x5879, 0x8971},{0x587A, 0x8972},{0x587B, 0x8973},{0x587C, 0x8974}, - {0x587D, 0x8975},{0x587E, 0xDBD3},{0x587F, 0x8976},{0x5880, 0xDCAF},{0x5881, 0xDCAC},{0x5882, 0x8977},{0x5883, 0xBEB3},{0x5884, 0x8978}, - {0x5885, 0xCAFB},{0x5886, 0x8979},{0x5887, 0x897A},{0x5888, 0x897B},{0x5889, 0xDCAD},{0x588A, 0x897C},{0x588B, 0x897D},{0x588C, 0x897E}, - {0x588D, 0x8980},{0x588E, 0x8981},{0x588F, 0x8982},{0x5890, 0x8983},{0x5891, 0x8984},{0x5892, 0xC9CA},{0x5893, 0xC4B9},{0x5894, 0x8985}, - {0x5895, 0x8986},{0x5896, 0x8987},{0x5897, 0x8988},{0x5898, 0x8989},{0x5899, 0xC7BD},{0x589A, 0xDCAE},{0x589B, 0x898A},{0x589C, 0x898B}, - {0x589D, 0x898C},{0x589E, 0xD4F6},{0x589F, 0xD0E6},{0x58A0, 0x898D},{0x58A1, 0x898E},{0x58A2, 0x898F},{0x58A3, 0x8990},{0x58A4, 0x8991}, - {0x58A5, 0x8992},{0x58A6, 0x8993},{0x58A7, 0x8994},{0x58A8, 0xC4AB},{0x58A9, 0xB6D5},{0x58AA, 0x8995},{0x58AB, 0x8996},{0x58AC, 0x8997}, - {0x58AD, 0x8998},{0x58AE, 0x8999},{0x58AF, 0x899A},{0x58B0, 0x899B},{0x58B1, 0x899C},{0x58B2, 0x899D},{0x58B3, 0x899E},{0x58B4, 0x899F}, - {0x58B5, 0x89A0},{0x58B6, 0x89A1},{0x58B7, 0x89A2},{0x58B8, 0x89A3},{0x58B9, 0x89A4},{0x58BA, 0x89A5},{0x58BB, 0x89A6},{0x58BC, 0xDBD4}, - {0x58BD, 0x89A7},{0x58BE, 0x89A8},{0x58BF, 0x89A9},{0x58C0, 0x89AA},{0x58C1, 0xB1DA},{0x58C2, 0x89AB},{0x58C3, 0x89AC},{0x58C4, 0x89AD}, - {0x58C5, 0xDBD5},{0x58C6, 0x89AE},{0x58C7, 0x89AF},{0x58C8, 0x89B0},{0x58C9, 0x89B1},{0x58CA, 0x89B2},{0x58CB, 0x89B3},{0x58CC, 0x89B4}, - {0x58CD, 0x89B5},{0x58CE, 0x89B6},{0x58CF, 0x89B7},{0x58D0, 0x89B8},{0x58D1, 0xDBD6},{0x58D2, 0x89B9},{0x58D3, 0x89BA},{0x58D4, 0x89BB}, - {0x58D5, 0xBABE},{0x58D6, 0x89BC},{0x58D7, 0x89BD},{0x58D8, 0x89BE},{0x58D9, 0x89BF},{0x58DA, 0x89C0},{0x58DB, 0x89C1},{0x58DC, 0x89C2}, - {0x58DD, 0x89C3},{0x58DE, 0x89C4},{0x58DF, 0x89C5},{0x58E0, 0x89C6},{0x58E1, 0x89C7},{0x58E2, 0x89C8},{0x58E3, 0x89C9},{0x58E4, 0xC8C0}, - {0x58E5, 0x89CA},{0x58E6, 0x89CB},{0x58E7, 0x89CC},{0x58E8, 0x89CD},{0x58E9, 0x89CE},{0x58EA, 0x89CF},{0x58EB, 0xCABF},{0x58EC, 0xC8C9}, - {0x58ED, 0x89D0},{0x58EE, 0xD7B3},{0x58EF, 0x89D1},{0x58F0, 0xC9F9},{0x58F1, 0x89D2},{0x58F2, 0x89D3},{0x58F3, 0xBFC7},{0x58F4, 0x89D4}, - {0x58F5, 0x89D5},{0x58F6, 0xBAF8},{0x58F7, 0x89D6},{0x58F8, 0x89D7},{0x58F9, 0xD2BC},{0x58FA, 0x89D8},{0x58FB, 0x89D9},{0x58FC, 0x89DA}, - {0x58FD, 0x89DB},{0x58FE, 0x89DC},{0x58FF, 0x89DD},{0x5900, 0x89DE},{0x5901, 0x89DF},{0x5902, 0xE2BA},{0x5903, 0x89E0},{0x5904, 0xB4A6}, - {0x5905, 0x89E1},{0x5906, 0x89E2},{0x5907, 0xB1B8},{0x5908, 0x89E3},{0x5909, 0x89E4},{0x590A, 0x89E5},{0x590B, 0x89E6},{0x590C, 0x89E7}, - {0x590D, 0xB8B4},{0x590E, 0x89E8},{0x590F, 0xCFC4},{0x5910, 0x89E9},{0x5911, 0x89EA},{0x5912, 0x89EB},{0x5913, 0x89EC},{0x5914, 0xD9E7}, - {0x5915, 0xCFA6},{0x5916, 0xCDE2},{0x5917, 0x89ED},{0x5918, 0x89EE},{0x5919, 0xD9ED},{0x591A, 0xB6E0},{0x591B, 0x89EF},{0x591C, 0xD2B9}, - {0x591D, 0x89F0},{0x591E, 0x89F1},{0x591F, 0xB9BB},{0x5920, 0x89F2},{0x5921, 0x89F3},{0x5922, 0x89F4},{0x5923, 0x89F5},{0x5924, 0xE2B9}, - {0x5925, 0xE2B7},{0x5926, 0x89F6},{0x5927, 0xB4F3},{0x5928, 0x89F7},{0x5929, 0xCCEC},{0x592A, 0xCCAB},{0x592B, 0xB7F2},{0x592C, 0x89F8}, - {0x592D, 0xD8B2},{0x592E, 0xD1EB},{0x592F, 0xBABB},{0x5930, 0x89F9},{0x5931, 0xCAA7},{0x5932, 0x89FA},{0x5933, 0x89FB},{0x5934, 0xCDB7}, - {0x5935, 0x89FC},{0x5936, 0x89FD},{0x5937, 0xD2C4},{0x5938, 0xBFE4},{0x5939, 0xBCD0},{0x593A, 0xB6E1},{0x593B, 0x89FE},{0x593C, 0xDEC5}, - {0x593D, 0x8A40},{0x593E, 0x8A41},{0x593F, 0x8A42},{0x5940, 0x8A43},{0x5941, 0xDEC6},{0x5942, 0xDBBC},{0x5943, 0x8A44},{0x5944, 0xD1D9}, - {0x5945, 0x8A45},{0x5946, 0x8A46},{0x5947, 0xC6E6},{0x5948, 0xC4CE},{0x5949, 0xB7EE},{0x594A, 0x8A47},{0x594B, 0xB7DC},{0x594C, 0x8A48}, - {0x594D, 0x8A49},{0x594E, 0xBFFC},{0x594F, 0xD7E0},{0x5950, 0x8A4A},{0x5951, 0xC6F5},{0x5952, 0x8A4B},{0x5953, 0x8A4C},{0x5954, 0xB1BC}, - {0x5955, 0xDEC8},{0x5956, 0xBDB1},{0x5957, 0xCCD7},{0x5958, 0xDECA},{0x5959, 0x8A4D},{0x595A, 0xDEC9},{0x595B, 0x8A4E},{0x595C, 0x8A4F}, - {0x595D, 0x8A50},{0x595E, 0x8A51},{0x595F, 0x8A52},{0x5960, 0xB5EC},{0x5961, 0x8A53},{0x5962, 0xC9DD},{0x5963, 0x8A54},{0x5964, 0x8A55}, - {0x5965, 0xB0C2},{0x5966, 0x8A56},{0x5967, 0x8A57},{0x5968, 0x8A58},{0x5969, 0x8A59},{0x596A, 0x8A5A},{0x596B, 0x8A5B},{0x596C, 0x8A5C}, - {0x596D, 0x8A5D},{0x596E, 0x8A5E},{0x596F, 0x8A5F},{0x5970, 0x8A60},{0x5971, 0x8A61},{0x5972, 0x8A62},{0x5973, 0xC5AE},{0x5974, 0xC5AB}, - {0x5975, 0x8A63},{0x5976, 0xC4CC},{0x5977, 0x8A64},{0x5978, 0xBCE9},{0x5979, 0xCBFD},{0x597A, 0x8A65},{0x597B, 0x8A66},{0x597C, 0x8A67}, - {0x597D, 0xBAC3},{0x597E, 0x8A68},{0x597F, 0x8A69},{0x5980, 0x8A6A},{0x5981, 0xE5F9},{0x5982, 0xC8E7},{0x5983, 0xE5FA},{0x5984, 0xCDFD}, - {0x5985, 0x8A6B},{0x5986, 0xD7B1},{0x5987, 0xB8BE},{0x5988, 0xC2E8},{0x5989, 0x8A6C},{0x598A, 0xC8D1},{0x598B, 0x8A6D},{0x598C, 0x8A6E}, - {0x598D, 0xE5FB},{0x598E, 0x8A6F},{0x598F, 0x8A70},{0x5990, 0x8A71},{0x5991, 0x8A72},{0x5992, 0xB6CA},{0x5993, 0xBCCB},{0x5994, 0x8A73}, - {0x5995, 0x8A74},{0x5996, 0xD1FD},{0x5997, 0xE6A1},{0x5998, 0x8A75},{0x5999, 0xC3EE},{0x599A, 0x8A76},{0x599B, 0x8A77},{0x599C, 0x8A78}, - {0x599D, 0x8A79},{0x599E, 0xE6A4},{0x599F, 0x8A7A},{0x59A0, 0x8A7B},{0x59A1, 0x8A7C},{0x59A2, 0x8A7D},{0x59A3, 0xE5FE},{0x59A4, 0xE6A5}, - {0x59A5, 0xCDD7},{0x59A6, 0x8A7E},{0x59A7, 0x8A80},{0x59A8, 0xB7C1},{0x59A9, 0xE5FC},{0x59AA, 0xE5FD},{0x59AB, 0xE6A3},{0x59AC, 0x8A81}, - {0x59AD, 0x8A82},{0x59AE, 0xC4DD},{0x59AF, 0xE6A8},{0x59B0, 0x8A83},{0x59B1, 0x8A84},{0x59B2, 0xE6A7},{0x59B3, 0x8A85},{0x59B4, 0x8A86}, - {0x59B5, 0x8A87},{0x59B6, 0x8A88},{0x59B7, 0x8A89},{0x59B8, 0x8A8A},{0x59B9, 0xC3C3},{0x59BA, 0x8A8B},{0x59BB, 0xC6DE},{0x59BC, 0x8A8C}, - {0x59BD, 0x8A8D},{0x59BE, 0xE6AA},{0x59BF, 0x8A8E},{0x59C0, 0x8A8F},{0x59C1, 0x8A90},{0x59C2, 0x8A91},{0x59C3, 0x8A92},{0x59C4, 0x8A93}, - {0x59C5, 0x8A94},{0x59C6, 0xC4B7},{0x59C7, 0x8A95},{0x59C8, 0x8A96},{0x59C9, 0x8A97},{0x59CA, 0xE6A2},{0x59CB, 0xCABC},{0x59CC, 0x8A98}, - {0x59CD, 0x8A99},{0x59CE, 0x8A9A},{0x59CF, 0x8A9B},{0x59D0, 0xBDE3},{0x59D1, 0xB9C3},{0x59D2, 0xE6A6},{0x59D3, 0xD0D5},{0x59D4, 0xCEAF}, - {0x59D5, 0x8A9C},{0x59D6, 0x8A9D},{0x59D7, 0xE6A9},{0x59D8, 0xE6B0},{0x59D9, 0x8A9E},{0x59DA, 0xD2A6},{0x59DB, 0x8A9F},{0x59DC, 0xBDAA}, - {0x59DD, 0xE6AD},{0x59DE, 0x8AA0},{0x59DF, 0x8AA1},{0x59E0, 0x8AA2},{0x59E1, 0x8AA3},{0x59E2, 0x8AA4},{0x59E3, 0xE6AF},{0x59E4, 0x8AA5}, - {0x59E5, 0xC0D1},{0x59E6, 0x8AA6},{0x59E7, 0x8AA7},{0x59E8, 0xD2CC},{0x59E9, 0x8AA8},{0x59EA, 0x8AA9},{0x59EB, 0x8AAA},{0x59EC, 0xBCA7}, - {0x59ED, 0x8AAB},{0x59EE, 0x8AAC},{0x59EF, 0x8AAD},{0x59F0, 0x8AAE},{0x59F1, 0x8AAF},{0x59F2, 0x8AB0},{0x59F3, 0x8AB1},{0x59F4, 0x8AB2}, - {0x59F5, 0x8AB3},{0x59F6, 0x8AB4},{0x59F7, 0x8AB5},{0x59F8, 0x8AB6},{0x59F9, 0xE6B1},{0x59FA, 0x8AB7},{0x59FB, 0xD2F6},{0x59FC, 0x8AB8}, - {0x59FD, 0x8AB9},{0x59FE, 0x8ABA},{0x59FF, 0xD7CB},{0x5A00, 0x8ABB},{0x5A01, 0xCDFE},{0x5A02, 0x8ABC},{0x5A03, 0xCDDE},{0x5A04, 0xC2A6}, - {0x5A05, 0xE6AB},{0x5A06, 0xE6AC},{0x5A07, 0xBDBF},{0x5A08, 0xE6AE},{0x5A09, 0xE6B3},{0x5A0A, 0x8ABD},{0x5A0B, 0x8ABE},{0x5A0C, 0xE6B2}, - {0x5A0D, 0x8ABF},{0x5A0E, 0x8AC0},{0x5A0F, 0x8AC1},{0x5A10, 0x8AC2},{0x5A11, 0xE6B6},{0x5A12, 0x8AC3},{0x5A13, 0xE6B8},{0x5A14, 0x8AC4}, - {0x5A15, 0x8AC5},{0x5A16, 0x8AC6},{0x5A17, 0x8AC7},{0x5A18, 0xC4EF},{0x5A19, 0x8AC8},{0x5A1A, 0x8AC9},{0x5A1B, 0x8ACA},{0x5A1C, 0xC4C8}, - {0x5A1D, 0x8ACB},{0x5A1E, 0x8ACC},{0x5A1F, 0xBEEA},{0x5A20, 0xC9EF},{0x5A21, 0x8ACD},{0x5A22, 0x8ACE},{0x5A23, 0xE6B7},{0x5A24, 0x8ACF}, - {0x5A25, 0xB6F0},{0x5A26, 0x8AD0},{0x5A27, 0x8AD1},{0x5A28, 0x8AD2},{0x5A29, 0xC3E4},{0x5A2A, 0x8AD3},{0x5A2B, 0x8AD4},{0x5A2C, 0x8AD5}, - {0x5A2D, 0x8AD6},{0x5A2E, 0x8AD7},{0x5A2F, 0x8AD8},{0x5A30, 0x8AD9},{0x5A31, 0xD3E9},{0x5A32, 0xE6B4},{0x5A33, 0x8ADA},{0x5A34, 0xE6B5}, - {0x5A35, 0x8ADB},{0x5A36, 0xC8A2},{0x5A37, 0x8ADC},{0x5A38, 0x8ADD},{0x5A39, 0x8ADE},{0x5A3A, 0x8ADF},{0x5A3B, 0x8AE0},{0x5A3C, 0xE6BD}, - {0x5A3D, 0x8AE1},{0x5A3E, 0x8AE2},{0x5A3F, 0x8AE3},{0x5A40, 0xE6B9},{0x5A41, 0x8AE4},{0x5A42, 0x8AE5},{0x5A43, 0x8AE6},{0x5A44, 0x8AE7}, - {0x5A45, 0x8AE8},{0x5A46, 0xC6C5},{0x5A47, 0x8AE9},{0x5A48, 0x8AEA},{0x5A49, 0xCDF1},{0x5A4A, 0xE6BB},{0x5A4B, 0x8AEB},{0x5A4C, 0x8AEC}, - {0x5A4D, 0x8AED},{0x5A4E, 0x8AEE},{0x5A4F, 0x8AEF},{0x5A50, 0x8AF0},{0x5A51, 0x8AF1},{0x5A52, 0x8AF2},{0x5A53, 0x8AF3},{0x5A54, 0x8AF4}, - {0x5A55, 0xE6BC},{0x5A56, 0x8AF5},{0x5A57, 0x8AF6},{0x5A58, 0x8AF7},{0x5A59, 0x8AF8},{0x5A5A, 0xBBE9},{0x5A5B, 0x8AF9},{0x5A5C, 0x8AFA}, - {0x5A5D, 0x8AFB},{0x5A5E, 0x8AFC},{0x5A5F, 0x8AFD},{0x5A60, 0x8AFE},{0x5A61, 0x8B40},{0x5A62, 0xE6BE},{0x5A63, 0x8B41},{0x5A64, 0x8B42}, - {0x5A65, 0x8B43},{0x5A66, 0x8B44},{0x5A67, 0xE6BA},{0x5A68, 0x8B45},{0x5A69, 0x8B46},{0x5A6A, 0xC0B7},{0x5A6B, 0x8B47},{0x5A6C, 0x8B48}, - {0x5A6D, 0x8B49},{0x5A6E, 0x8B4A},{0x5A6F, 0x8B4B},{0x5A70, 0x8B4C},{0x5A71, 0x8B4D},{0x5A72, 0x8B4E},{0x5A73, 0x8B4F},{0x5A74, 0xD3A4}, - {0x5A75, 0xE6BF},{0x5A76, 0xC9F4},{0x5A77, 0xE6C3},{0x5A78, 0x8B50},{0x5A79, 0x8B51},{0x5A7A, 0xE6C4},{0x5A7B, 0x8B52},{0x5A7C, 0x8B53}, - {0x5A7D, 0x8B54},{0x5A7E, 0x8B55},{0x5A7F, 0xD0F6},{0x5A80, 0x8B56},{0x5A81, 0x8B57},{0x5A82, 0x8B58},{0x5A83, 0x8B59},{0x5A84, 0x8B5A}, - {0x5A85, 0x8B5B},{0x5A86, 0x8B5C},{0x5A87, 0x8B5D},{0x5A88, 0x8B5E},{0x5A89, 0x8B5F},{0x5A8A, 0x8B60},{0x5A8B, 0x8B61},{0x5A8C, 0x8B62}, - {0x5A8D, 0x8B63},{0x5A8E, 0x8B64},{0x5A8F, 0x8B65},{0x5A90, 0x8B66},{0x5A91, 0x8B67},{0x5A92, 0xC3BD},{0x5A93, 0x8B68},{0x5A94, 0x8B69}, - {0x5A95, 0x8B6A},{0x5A96, 0x8B6B},{0x5A97, 0x8B6C},{0x5A98, 0x8B6D},{0x5A99, 0x8B6E},{0x5A9A, 0xC3C4},{0x5A9B, 0xE6C2},{0x5A9C, 0x8B6F}, - {0x5A9D, 0x8B70},{0x5A9E, 0x8B71},{0x5A9F, 0x8B72},{0x5AA0, 0x8B73},{0x5AA1, 0x8B74},{0x5AA2, 0x8B75},{0x5AA3, 0x8B76},{0x5AA4, 0x8B77}, - {0x5AA5, 0x8B78},{0x5AA6, 0x8B79},{0x5AA7, 0x8B7A},{0x5AA8, 0x8B7B},{0x5AA9, 0x8B7C},{0x5AAA, 0xE6C1},{0x5AAB, 0x8B7D},{0x5AAC, 0x8B7E}, - {0x5AAD, 0x8B80},{0x5AAE, 0x8B81},{0x5AAF, 0x8B82},{0x5AB0, 0x8B83},{0x5AB1, 0x8B84},{0x5AB2, 0xE6C7},{0x5AB3, 0xCFB1},{0x5AB4, 0x8B85}, - {0x5AB5, 0xEBF4},{0x5AB6, 0x8B86},{0x5AB7, 0x8B87},{0x5AB8, 0xE6CA},{0x5AB9, 0x8B88},{0x5ABA, 0x8B89},{0x5ABB, 0x8B8A},{0x5ABC, 0x8B8B}, - {0x5ABD, 0x8B8C},{0x5ABE, 0xE6C5},{0x5ABF, 0x8B8D},{0x5AC0, 0x8B8E},{0x5AC1, 0xBCDE},{0x5AC2, 0xC9A9},{0x5AC3, 0x8B8F},{0x5AC4, 0x8B90}, - {0x5AC5, 0x8B91},{0x5AC6, 0x8B92},{0x5AC7, 0x8B93},{0x5AC8, 0x8B94},{0x5AC9, 0xBCB5},{0x5ACA, 0x8B95},{0x5ACB, 0x8B96},{0x5ACC, 0xCFD3}, - {0x5ACD, 0x8B97},{0x5ACE, 0x8B98},{0x5ACF, 0x8B99},{0x5AD0, 0x8B9A},{0x5AD1, 0x8B9B},{0x5AD2, 0xE6C8},{0x5AD3, 0x8B9C},{0x5AD4, 0xE6C9}, - {0x5AD5, 0x8B9D},{0x5AD6, 0xE6CE},{0x5AD7, 0x8B9E},{0x5AD8, 0xE6D0},{0x5AD9, 0x8B9F},{0x5ADA, 0x8BA0},{0x5ADB, 0x8BA1},{0x5ADC, 0xE6D1}, - {0x5ADD, 0x8BA2},{0x5ADE, 0x8BA3},{0x5ADF, 0x8BA4},{0x5AE0, 0xE6CB},{0x5AE1, 0xB5D5},{0x5AE2, 0x8BA5},{0x5AE3, 0xE6CC},{0x5AE4, 0x8BA6}, - {0x5AE5, 0x8BA7},{0x5AE6, 0xE6CF},{0x5AE7, 0x8BA8},{0x5AE8, 0x8BA9},{0x5AE9, 0xC4DB},{0x5AEA, 0x8BAA},{0x5AEB, 0xE6C6},{0x5AEC, 0x8BAB}, - {0x5AED, 0x8BAC},{0x5AEE, 0x8BAD},{0x5AEF, 0x8BAE},{0x5AF0, 0x8BAF},{0x5AF1, 0xE6CD},{0x5AF2, 0x8BB0},{0x5AF3, 0x8BB1},{0x5AF4, 0x8BB2}, - {0x5AF5, 0x8BB3},{0x5AF6, 0x8BB4},{0x5AF7, 0x8BB5},{0x5AF8, 0x8BB6},{0x5AF9, 0x8BB7},{0x5AFA, 0x8BB8},{0x5AFB, 0x8BB9},{0x5AFC, 0x8BBA}, - {0x5AFD, 0x8BBB},{0x5AFE, 0x8BBC},{0x5AFF, 0x8BBD},{0x5B00, 0x8BBE},{0x5B01, 0x8BBF},{0x5B02, 0x8BC0},{0x5B03, 0x8BC1},{0x5B04, 0x8BC2}, - {0x5B05, 0x8BC3},{0x5B06, 0x8BC4},{0x5B07, 0x8BC5},{0x5B08, 0x8BC6},{0x5B09, 0xE6D2},{0x5B0A, 0x8BC7},{0x5B0B, 0x8BC8},{0x5B0C, 0x8BC9}, - {0x5B0D, 0x8BCA},{0x5B0E, 0x8BCB},{0x5B0F, 0x8BCC},{0x5B10, 0x8BCD},{0x5B11, 0x8BCE},{0x5B12, 0x8BCF},{0x5B13, 0x8BD0},{0x5B14, 0x8BD1}, - {0x5B15, 0x8BD2},{0x5B16, 0xE6D4},{0x5B17, 0xE6D3},{0x5B18, 0x8BD3},{0x5B19, 0x8BD4},{0x5B1A, 0x8BD5},{0x5B1B, 0x8BD6},{0x5B1C, 0x8BD7}, - {0x5B1D, 0x8BD8},{0x5B1E, 0x8BD9},{0x5B1F, 0x8BDA},{0x5B20, 0x8BDB},{0x5B21, 0x8BDC},{0x5B22, 0x8BDD},{0x5B23, 0x8BDE},{0x5B24, 0x8BDF}, - {0x5B25, 0x8BE0},{0x5B26, 0x8BE1},{0x5B27, 0x8BE2},{0x5B28, 0x8BE3},{0x5B29, 0x8BE4},{0x5B2A, 0x8BE5},{0x5B2B, 0x8BE6},{0x5B2C, 0x8BE7}, - {0x5B2D, 0x8BE8},{0x5B2E, 0x8BE9},{0x5B2F, 0x8BEA},{0x5B30, 0x8BEB},{0x5B31, 0x8BEC},{0x5B32, 0xE6D5},{0x5B33, 0x8BED},{0x5B34, 0xD9F8}, - {0x5B35, 0x8BEE},{0x5B36, 0x8BEF},{0x5B37, 0xE6D6},{0x5B38, 0x8BF0},{0x5B39, 0x8BF1},{0x5B3A, 0x8BF2},{0x5B3B, 0x8BF3},{0x5B3C, 0x8BF4}, - {0x5B3D, 0x8BF5},{0x5B3E, 0x8BF6},{0x5B3F, 0x8BF7},{0x5B40, 0xE6D7},{0x5B41, 0x8BF8},{0x5B42, 0x8BF9},{0x5B43, 0x8BFA},{0x5B44, 0x8BFB}, - {0x5B45, 0x8BFC},{0x5B46, 0x8BFD},{0x5B47, 0x8BFE},{0x5B48, 0x8C40},{0x5B49, 0x8C41},{0x5B4A, 0x8C42},{0x5B4B, 0x8C43},{0x5B4C, 0x8C44}, - {0x5B4D, 0x8C45},{0x5B4E, 0x8C46},{0x5B4F, 0x8C47},{0x5B50, 0xD7D3},{0x5B51, 0xE6DD},{0x5B52, 0x8C48},{0x5B53, 0xE6DE},{0x5B54, 0xBFD7}, - {0x5B55, 0xD4D0},{0x5B56, 0x8C49},{0x5B57, 0xD7D6},{0x5B58, 0xB4E6},{0x5B59, 0xCBEF},{0x5B5A, 0xE6DA},{0x5B5B, 0xD8C3},{0x5B5C, 0xD7CE}, - {0x5B5D, 0xD0A2},{0x5B5E, 0x8C4A},{0x5B5F, 0xC3CF},{0x5B60, 0x8C4B},{0x5B61, 0x8C4C},{0x5B62, 0xE6DF},{0x5B63, 0xBCBE},{0x5B64, 0xB9C2}, - {0x5B65, 0xE6DB},{0x5B66, 0xD1A7},{0x5B67, 0x8C4D},{0x5B68, 0x8C4E},{0x5B69, 0xBAA2},{0x5B6A, 0xC2CF},{0x5B6B, 0x8C4F},{0x5B6C, 0xD8AB}, - {0x5B6D, 0x8C50},{0x5B6E, 0x8C51},{0x5B6F, 0x8C52},{0x5B70, 0xCAEB},{0x5B71, 0xE5EE},{0x5B72, 0x8C53},{0x5B73, 0xE6DC},{0x5B74, 0x8C54}, - {0x5B75, 0xB7F5},{0x5B76, 0x8C55},{0x5B77, 0x8C56},{0x5B78, 0x8C57},{0x5B79, 0x8C58},{0x5B7A, 0xC8E6},{0x5B7B, 0x8C59},{0x5B7C, 0x8C5A}, - {0x5B7D, 0xC4F5},{0x5B7E, 0x8C5B},{0x5B7F, 0x8C5C},{0x5B80, 0xE5B2},{0x5B81, 0xC4FE},{0x5B82, 0x8C5D},{0x5B83, 0xCBFC},{0x5B84, 0xE5B3}, - {0x5B85, 0xD5AC},{0x5B86, 0x8C5E},{0x5B87, 0xD3EE},{0x5B88, 0xCAD8},{0x5B89, 0xB0B2},{0x5B8A, 0x8C5F},{0x5B8B, 0xCBCE},{0x5B8C, 0xCDEA}, - {0x5B8D, 0x8C60},{0x5B8E, 0x8C61},{0x5B8F, 0xBAEA},{0x5B90, 0x8C62},{0x5B91, 0x8C63},{0x5B92, 0x8C64},{0x5B93, 0xE5B5},{0x5B94, 0x8C65}, - {0x5B95, 0xE5B4},{0x5B96, 0x8C66},{0x5B97, 0xD7DA},{0x5B98, 0xB9D9},{0x5B99, 0xD6E6},{0x5B9A, 0xB6A8},{0x5B9B, 0xCDF0},{0x5B9C, 0xD2CB}, - {0x5B9D, 0xB1A6},{0x5B9E, 0xCAB5},{0x5B9F, 0x8C67},{0x5BA0, 0xB3E8},{0x5BA1, 0xC9F3},{0x5BA2, 0xBFCD},{0x5BA3, 0xD0FB},{0x5BA4, 0xCAD2}, - {0x5BA5, 0xE5B6},{0x5BA6, 0xBBC2},{0x5BA7, 0x8C68},{0x5BA8, 0x8C69},{0x5BA9, 0x8C6A},{0x5BAA, 0xCFDC},{0x5BAB, 0xB9AC},{0x5BAC, 0x8C6B}, - {0x5BAD, 0x8C6C},{0x5BAE, 0x8C6D},{0x5BAF, 0x8C6E},{0x5BB0, 0xD4D7},{0x5BB1, 0x8C6F},{0x5BB2, 0x8C70},{0x5BB3, 0xBAA6},{0x5BB4, 0xD1E7}, - {0x5BB5, 0xCFFC},{0x5BB6, 0xBCD2},{0x5BB7, 0x8C71},{0x5BB8, 0xE5B7},{0x5BB9, 0xC8DD},{0x5BBA, 0x8C72},{0x5BBB, 0x8C73},{0x5BBC, 0x8C74}, - {0x5BBD, 0xBFED},{0x5BBE, 0xB1F6},{0x5BBF, 0xCBDE},{0x5BC0, 0x8C75},{0x5BC1, 0x8C76},{0x5BC2, 0xBCC5},{0x5BC3, 0x8C77},{0x5BC4, 0xBCC4}, - {0x5BC5, 0xD2FA},{0x5BC6, 0xC3DC},{0x5BC7, 0xBFDC},{0x5BC8, 0x8C78},{0x5BC9, 0x8C79},{0x5BCA, 0x8C7A},{0x5BCB, 0x8C7B},{0x5BCC, 0xB8BB}, - {0x5BCD, 0x8C7C},{0x5BCE, 0x8C7D},{0x5BCF, 0x8C7E},{0x5BD0, 0xC3C2},{0x5BD1, 0x8C80},{0x5BD2, 0xBAAE},{0x5BD3, 0xD4A2},{0x5BD4, 0x8C81}, - {0x5BD5, 0x8C82},{0x5BD6, 0x8C83},{0x5BD7, 0x8C84},{0x5BD8, 0x8C85},{0x5BD9, 0x8C86},{0x5BDA, 0x8C87},{0x5BDB, 0x8C88},{0x5BDC, 0x8C89}, - {0x5BDD, 0xC7DE},{0x5BDE, 0xC4AF},{0x5BDF, 0xB2EC},{0x5BE0, 0x8C8A},{0x5BE1, 0xB9D1},{0x5BE2, 0x8C8B},{0x5BE3, 0x8C8C},{0x5BE4, 0xE5BB}, - {0x5BE5, 0xC1C8},{0x5BE6, 0x8C8D},{0x5BE7, 0x8C8E},{0x5BE8, 0xD5AF},{0x5BE9, 0x8C8F},{0x5BEA, 0x8C90},{0x5BEB, 0x8C91},{0x5BEC, 0x8C92}, - {0x5BED, 0x8C93},{0x5BEE, 0xE5BC},{0x5BEF, 0x8C94},{0x5BF0, 0xE5BE},{0x5BF1, 0x8C95},{0x5BF2, 0x8C96},{0x5BF3, 0x8C97},{0x5BF4, 0x8C98}, - {0x5BF5, 0x8C99},{0x5BF6, 0x8C9A},{0x5BF7, 0x8C9B},{0x5BF8, 0xB4E7},{0x5BF9, 0xB6D4},{0x5BFA, 0xCBC2},{0x5BFB, 0xD1B0},{0x5BFC, 0xB5BC}, - {0x5BFD, 0x8C9C},{0x5BFE, 0x8C9D},{0x5BFF, 0xCAD9},{0x5C00, 0x8C9E},{0x5C01, 0xB7E2},{0x5C02, 0x8C9F},{0x5C03, 0x8CA0},{0x5C04, 0xC9E4}, - {0x5C05, 0x8CA1},{0x5C06, 0xBDAB},{0x5C07, 0x8CA2},{0x5C08, 0x8CA3},{0x5C09, 0xCEBE},{0x5C0A, 0xD7F0},{0x5C0B, 0x8CA4},{0x5C0C, 0x8CA5}, - {0x5C0D, 0x8CA6},{0x5C0E, 0x8CA7},{0x5C0F, 0xD0A1},{0x5C10, 0x8CA8},{0x5C11, 0xC9D9},{0x5C12, 0x8CA9},{0x5C13, 0x8CAA},{0x5C14, 0xB6FB}, - {0x5C15, 0xE6D8},{0x5C16, 0xBCE2},{0x5C17, 0x8CAB},{0x5C18, 0xB3BE},{0x5C19, 0x8CAC},{0x5C1A, 0xC9D0},{0x5C1B, 0x8CAD},{0x5C1C, 0xE6D9}, - {0x5C1D, 0xB3A2},{0x5C1E, 0x8CAE},{0x5C1F, 0x8CAF},{0x5C20, 0x8CB0},{0x5C21, 0x8CB1},{0x5C22, 0xDECC},{0x5C23, 0x8CB2},{0x5C24, 0xD3C8}, - {0x5C25, 0xDECD},{0x5C26, 0x8CB3},{0x5C27, 0xD2A2},{0x5C28, 0x8CB4},{0x5C29, 0x8CB5},{0x5C2A, 0x8CB6},{0x5C2B, 0x8CB7},{0x5C2C, 0xDECE}, - {0x5C2D, 0x8CB8},{0x5C2E, 0x8CB9},{0x5C2F, 0x8CBA},{0x5C30, 0x8CBB},{0x5C31, 0xBECD},{0x5C32, 0x8CBC},{0x5C33, 0x8CBD},{0x5C34, 0xDECF}, - {0x5C35, 0x8CBE},{0x5C36, 0x8CBF},{0x5C37, 0x8CC0},{0x5C38, 0xCAAC},{0x5C39, 0xD2FC},{0x5C3A, 0xB3DF},{0x5C3B, 0xE5EA},{0x5C3C, 0xC4E1}, - {0x5C3D, 0xBEA1},{0x5C3E, 0xCEB2},{0x5C3F, 0xC4F2},{0x5C40, 0xBED6},{0x5C41, 0xC6A8},{0x5C42, 0xB2E3},{0x5C43, 0x8CC1},{0x5C44, 0x8CC2}, - {0x5C45, 0xBED3},{0x5C46, 0x8CC3},{0x5C47, 0x8CC4},{0x5C48, 0xC7FC},{0x5C49, 0xCCEB},{0x5C4A, 0xBDEC},{0x5C4B, 0xCEDD},{0x5C4C, 0x8CC5}, - {0x5C4D, 0x8CC6},{0x5C4E, 0xCABA},{0x5C4F, 0xC6C1},{0x5C50, 0xE5EC},{0x5C51, 0xD0BC},{0x5C52, 0x8CC7},{0x5C53, 0x8CC8},{0x5C54, 0x8CC9}, - {0x5C55, 0xD5B9},{0x5C56, 0x8CCA},{0x5C57, 0x8CCB},{0x5C58, 0x8CCC},{0x5C59, 0xE5ED},{0x5C5A, 0x8CCD},{0x5C5B, 0x8CCE},{0x5C5C, 0x8CCF}, - {0x5C5D, 0x8CD0},{0x5C5E, 0xCAF4},{0x5C5F, 0x8CD1},{0x5C60, 0xCDC0},{0x5C61, 0xC2C5},{0x5C62, 0x8CD2},{0x5C63, 0xE5EF},{0x5C64, 0x8CD3}, - {0x5C65, 0xC2C4},{0x5C66, 0xE5F0},{0x5C67, 0x8CD4},{0x5C68, 0x8CD5},{0x5C69, 0x8CD6},{0x5C6A, 0x8CD7},{0x5C6B, 0x8CD8},{0x5C6C, 0x8CD9}, - {0x5C6D, 0x8CDA},{0x5C6E, 0xE5F8},{0x5C6F, 0xCDCD},{0x5C70, 0x8CDB},{0x5C71, 0xC9BD},{0x5C72, 0x8CDC},{0x5C73, 0x8CDD},{0x5C74, 0x8CDE}, - {0x5C75, 0x8CDF},{0x5C76, 0x8CE0},{0x5C77, 0x8CE1},{0x5C78, 0x8CE2},{0x5C79, 0xD2D9},{0x5C7A, 0xE1A8},{0x5C7B, 0x8CE3},{0x5C7C, 0x8CE4}, - {0x5C7D, 0x8CE5},{0x5C7E, 0x8CE6},{0x5C7F, 0xD3EC},{0x5C80, 0x8CE7},{0x5C81, 0xCBEA},{0x5C82, 0xC6F1},{0x5C83, 0x8CE8},{0x5C84, 0x8CE9}, - {0x5C85, 0x8CEA},{0x5C86, 0x8CEB},{0x5C87, 0x8CEC},{0x5C88, 0xE1AC},{0x5C89, 0x8CED},{0x5C8A, 0x8CEE},{0x5C8B, 0x8CEF},{0x5C8C, 0xE1A7}, - {0x5C8D, 0xE1A9},{0x5C8E, 0x8CF0},{0x5C8F, 0x8CF1},{0x5C90, 0xE1AA},{0x5C91, 0xE1AF},{0x5C92, 0x8CF2},{0x5C93, 0x8CF3},{0x5C94, 0xB2ED}, - {0x5C95, 0x8CF4},{0x5C96, 0xE1AB},{0x5C97, 0xB8DA},{0x5C98, 0xE1AD},{0x5C99, 0xE1AE},{0x5C9A, 0xE1B0},{0x5C9B, 0xB5BA},{0x5C9C, 0xE1B1}, - {0x5C9D, 0x8CF5},{0x5C9E, 0x8CF6},{0x5C9F, 0x8CF7},{0x5CA0, 0x8CF8},{0x5CA1, 0x8CF9},{0x5CA2, 0xE1B3},{0x5CA3, 0xE1B8},{0x5CA4, 0x8CFA}, - {0x5CA5, 0x8CFB},{0x5CA6, 0x8CFC},{0x5CA7, 0x8CFD},{0x5CA8, 0x8CFE},{0x5CA9, 0xD1D2},{0x5CAA, 0x8D40},{0x5CAB, 0xE1B6},{0x5CAC, 0xE1B5}, - {0x5CAD, 0xC1EB},{0x5CAE, 0x8D41},{0x5CAF, 0x8D42},{0x5CB0, 0x8D43},{0x5CB1, 0xE1B7},{0x5CB2, 0x8D44},{0x5CB3, 0xD4C0},{0x5CB4, 0x8D45}, - {0x5CB5, 0xE1B2},{0x5CB6, 0x8D46},{0x5CB7, 0xE1BA},{0x5CB8, 0xB0B6},{0x5CB9, 0x8D47},{0x5CBA, 0x8D48},{0x5CBB, 0x8D49},{0x5CBC, 0x8D4A}, - {0x5CBD, 0xE1B4},{0x5CBE, 0x8D4B},{0x5CBF, 0xBFF9},{0x5CC0, 0x8D4C},{0x5CC1, 0xE1B9},{0x5CC2, 0x8D4D},{0x5CC3, 0x8D4E},{0x5CC4, 0xE1BB}, - {0x5CC5, 0x8D4F},{0x5CC6, 0x8D50},{0x5CC7, 0x8D51},{0x5CC8, 0x8D52},{0x5CC9, 0x8D53},{0x5CCA, 0x8D54},{0x5CCB, 0xE1BE},{0x5CCC, 0x8D55}, - {0x5CCD, 0x8D56},{0x5CCE, 0x8D57},{0x5CCF, 0x8D58},{0x5CD0, 0x8D59},{0x5CD1, 0x8D5A},{0x5CD2, 0xE1BC},{0x5CD3, 0x8D5B},{0x5CD4, 0x8D5C}, - {0x5CD5, 0x8D5D},{0x5CD6, 0x8D5E},{0x5CD7, 0x8D5F},{0x5CD8, 0x8D60},{0x5CD9, 0xD6C5},{0x5CDA, 0x8D61},{0x5CDB, 0x8D62},{0x5CDC, 0x8D63}, - {0x5CDD, 0x8D64},{0x5CDE, 0x8D65},{0x5CDF, 0x8D66},{0x5CE0, 0x8D67},{0x5CE1, 0xCFBF},{0x5CE2, 0x8D68},{0x5CE3, 0x8D69},{0x5CE4, 0xE1BD}, - {0x5CE5, 0xE1BF},{0x5CE6, 0xC2CD},{0x5CE7, 0x8D6A},{0x5CE8, 0xB6EB},{0x5CE9, 0x8D6B},{0x5CEA, 0xD3F8},{0x5CEB, 0x8D6C},{0x5CEC, 0x8D6D}, - {0x5CED, 0xC7CD},{0x5CEE, 0x8D6E},{0x5CEF, 0x8D6F},{0x5CF0, 0xB7E5},{0x5CF1, 0x8D70},{0x5CF2, 0x8D71},{0x5CF3, 0x8D72},{0x5CF4, 0x8D73}, - {0x5CF5, 0x8D74},{0x5CF6, 0x8D75},{0x5CF7, 0x8D76},{0x5CF8, 0x8D77},{0x5CF9, 0x8D78},{0x5CFA, 0x8D79},{0x5CFB, 0xBEFE},{0x5CFC, 0x8D7A}, - {0x5CFD, 0x8D7B},{0x5CFE, 0x8D7C},{0x5CFF, 0x8D7D},{0x5D00, 0x8D7E},{0x5D01, 0x8D80},{0x5D02, 0xE1C0},{0x5D03, 0xE1C1},{0x5D04, 0x8D81}, - {0x5D05, 0x8D82},{0x5D06, 0xE1C7},{0x5D07, 0xB3E7},{0x5D08, 0x8D83},{0x5D09, 0x8D84},{0x5D0A, 0x8D85},{0x5D0B, 0x8D86},{0x5D0C, 0x8D87}, - {0x5D0D, 0x8D88},{0x5D0E, 0xC6E9},{0x5D0F, 0x8D89},{0x5D10, 0x8D8A},{0x5D11, 0x8D8B},{0x5D12, 0x8D8C},{0x5D13, 0x8D8D},{0x5D14, 0xB4DE}, - {0x5D15, 0x8D8E},{0x5D16, 0xD1C2},{0x5D17, 0x8D8F},{0x5D18, 0x8D90},{0x5D19, 0x8D91},{0x5D1A, 0x8D92},{0x5D1B, 0xE1C8},{0x5D1C, 0x8D93}, - {0x5D1D, 0x8D94},{0x5D1E, 0xE1C6},{0x5D1F, 0x8D95},{0x5D20, 0x8D96},{0x5D21, 0x8D97},{0x5D22, 0x8D98},{0x5D23, 0x8D99},{0x5D24, 0xE1C5}, - {0x5D25, 0x8D9A},{0x5D26, 0xE1C3},{0x5D27, 0xE1C2},{0x5D28, 0x8D9B},{0x5D29, 0xB1C0},{0x5D2A, 0x8D9C},{0x5D2B, 0x8D9D},{0x5D2C, 0x8D9E}, - {0x5D2D, 0xD5B8},{0x5D2E, 0xE1C4},{0x5D2F, 0x8D9F},{0x5D30, 0x8DA0},{0x5D31, 0x8DA1},{0x5D32, 0x8DA2},{0x5D33, 0x8DA3},{0x5D34, 0xE1CB}, - {0x5D35, 0x8DA4},{0x5D36, 0x8DA5},{0x5D37, 0x8DA6},{0x5D38, 0x8DA7},{0x5D39, 0x8DA8},{0x5D3A, 0x8DA9},{0x5D3B, 0x8DAA},{0x5D3C, 0x8DAB}, - {0x5D3D, 0xE1CC},{0x5D3E, 0xE1CA},{0x5D3F, 0x8DAC},{0x5D40, 0x8DAD},{0x5D41, 0x8DAE},{0x5D42, 0x8DAF},{0x5D43, 0x8DB0},{0x5D44, 0x8DB1}, - {0x5D45, 0x8DB2},{0x5D46, 0x8DB3},{0x5D47, 0xEFFA},{0x5D48, 0x8DB4},{0x5D49, 0x8DB5},{0x5D4A, 0xE1D3},{0x5D4B, 0xE1D2},{0x5D4C, 0xC7B6}, - {0x5D4D, 0x8DB6},{0x5D4E, 0x8DB7},{0x5D4F, 0x8DB8},{0x5D50, 0x8DB9},{0x5D51, 0x8DBA},{0x5D52, 0x8DBB},{0x5D53, 0x8DBC},{0x5D54, 0x8DBD}, - {0x5D55, 0x8DBE},{0x5D56, 0x8DBF},{0x5D57, 0x8DC0},{0x5D58, 0xE1C9},{0x5D59, 0x8DC1},{0x5D5A, 0x8DC2},{0x5D5B, 0xE1CE},{0x5D5C, 0x8DC3}, - {0x5D5D, 0xE1D0},{0x5D5E, 0x8DC4},{0x5D5F, 0x8DC5},{0x5D60, 0x8DC6},{0x5D61, 0x8DC7},{0x5D62, 0x8DC8},{0x5D63, 0x8DC9},{0x5D64, 0x8DCA}, - {0x5D65, 0x8DCB},{0x5D66, 0x8DCC},{0x5D67, 0x8DCD},{0x5D68, 0x8DCE},{0x5D69, 0xE1D4},{0x5D6A, 0x8DCF},{0x5D6B, 0xE1D1},{0x5D6C, 0xE1CD}, - {0x5D6D, 0x8DD0},{0x5D6E, 0x8DD1},{0x5D6F, 0xE1CF},{0x5D70, 0x8DD2},{0x5D71, 0x8DD3},{0x5D72, 0x8DD4},{0x5D73, 0x8DD5},{0x5D74, 0xE1D5}, - {0x5D75, 0x8DD6},{0x5D76, 0x8DD7},{0x5D77, 0x8DD8},{0x5D78, 0x8DD9},{0x5D79, 0x8DDA},{0x5D7A, 0x8DDB},{0x5D7B, 0x8DDC},{0x5D7C, 0x8DDD}, - {0x5D7D, 0x8DDE},{0x5D7E, 0x8DDF},{0x5D7F, 0x8DE0},{0x5D80, 0x8DE1},{0x5D81, 0x8DE2},{0x5D82, 0xE1D6},{0x5D83, 0x8DE3},{0x5D84, 0x8DE4}, - {0x5D85, 0x8DE5},{0x5D86, 0x8DE6},{0x5D87, 0x8DE7},{0x5D88, 0x8DE8},{0x5D89, 0x8DE9},{0x5D8A, 0x8DEA},{0x5D8B, 0x8DEB},{0x5D8C, 0x8DEC}, - {0x5D8D, 0x8DED},{0x5D8E, 0x8DEE},{0x5D8F, 0x8DEF},{0x5D90, 0x8DF0},{0x5D91, 0x8DF1},{0x5D92, 0x8DF2},{0x5D93, 0x8DF3},{0x5D94, 0x8DF4}, - {0x5D95, 0x8DF5},{0x5D96, 0x8DF6},{0x5D97, 0x8DF7},{0x5D98, 0x8DF8},{0x5D99, 0xE1D7},{0x5D9A, 0x8DF9},{0x5D9B, 0x8DFA},{0x5D9C, 0x8DFB}, - {0x5D9D, 0xE1D8},{0x5D9E, 0x8DFC},{0x5D9F, 0x8DFD},{0x5DA0, 0x8DFE},{0x5DA1, 0x8E40},{0x5DA2, 0x8E41},{0x5DA3, 0x8E42},{0x5DA4, 0x8E43}, - {0x5DA5, 0x8E44},{0x5DA6, 0x8E45},{0x5DA7, 0x8E46},{0x5DA8, 0x8E47},{0x5DA9, 0x8E48},{0x5DAA, 0x8E49},{0x5DAB, 0x8E4A},{0x5DAC, 0x8E4B}, - {0x5DAD, 0x8E4C},{0x5DAE, 0x8E4D},{0x5DAF, 0x8E4E},{0x5DB0, 0x8E4F},{0x5DB1, 0x8E50},{0x5DB2, 0x8E51},{0x5DB3, 0x8E52},{0x5DB4, 0x8E53}, - {0x5DB5, 0x8E54},{0x5DB6, 0x8E55},{0x5DB7, 0xE1DA},{0x5DB8, 0x8E56},{0x5DB9, 0x8E57},{0x5DBA, 0x8E58},{0x5DBB, 0x8E59},{0x5DBC, 0x8E5A}, - {0x5DBD, 0x8E5B},{0x5DBE, 0x8E5C},{0x5DBF, 0x8E5D},{0x5DC0, 0x8E5E},{0x5DC1, 0x8E5F},{0x5DC2, 0x8E60},{0x5DC3, 0x8E61},{0x5DC4, 0x8E62}, - {0x5DC5, 0xE1DB},{0x5DC6, 0x8E63},{0x5DC7, 0x8E64},{0x5DC8, 0x8E65},{0x5DC9, 0x8E66},{0x5DCA, 0x8E67},{0x5DCB, 0x8E68},{0x5DCC, 0x8E69}, - {0x5DCD, 0xCEA1},{0x5DCE, 0x8E6A},{0x5DCF, 0x8E6B},{0x5DD0, 0x8E6C},{0x5DD1, 0x8E6D},{0x5DD2, 0x8E6E},{0x5DD3, 0x8E6F},{0x5DD4, 0x8E70}, - {0x5DD5, 0x8E71},{0x5DD6, 0x8E72},{0x5DD7, 0x8E73},{0x5DD8, 0x8E74},{0x5DD9, 0x8E75},{0x5DDA, 0x8E76},{0x5DDB, 0xE7DD},{0x5DDC, 0x8E77}, - {0x5DDD, 0xB4A8},{0x5DDE, 0xD6DD},{0x5DDF, 0x8E78},{0x5DE0, 0x8E79},{0x5DE1, 0xD1B2},{0x5DE2, 0xB3B2},{0x5DE3, 0x8E7A},{0x5DE4, 0x8E7B}, - {0x5DE5, 0xB9A4},{0x5DE6, 0xD7F3},{0x5DE7, 0xC7C9},{0x5DE8, 0xBEDE},{0x5DE9, 0xB9AE},{0x5DEA, 0x8E7C},{0x5DEB, 0xCED7},{0x5DEC, 0x8E7D}, - {0x5DED, 0x8E7E},{0x5DEE, 0xB2EE},{0x5DEF, 0xDBCF},{0x5DF0, 0x8E80},{0x5DF1, 0xBCBA},{0x5DF2, 0xD2D1},{0x5DF3, 0xCBC8},{0x5DF4, 0xB0CD}, - {0x5DF5, 0x8E81},{0x5DF6, 0x8E82},{0x5DF7, 0xCFEF},{0x5DF8, 0x8E83},{0x5DF9, 0x8E84},{0x5DFA, 0x8E85},{0x5DFB, 0x8E86},{0x5DFC, 0x8E87}, - {0x5DFD, 0xD9E3},{0x5DFE, 0xBDED},{0x5DFF, 0x8E88},{0x5E00, 0x8E89},{0x5E01, 0xB1D2},{0x5E02, 0xCAD0},{0x5E03, 0xB2BC},{0x5E04, 0x8E8A}, - {0x5E05, 0xCBA7},{0x5E06, 0xB7AB},{0x5E07, 0x8E8B},{0x5E08, 0xCAA6},{0x5E09, 0x8E8C},{0x5E0A, 0x8E8D},{0x5E0B, 0x8E8E},{0x5E0C, 0xCFA3}, - {0x5E0D, 0x8E8F},{0x5E0E, 0x8E90},{0x5E0F, 0xE0F8},{0x5E10, 0xD5CA},{0x5E11, 0xE0FB},{0x5E12, 0x8E91},{0x5E13, 0x8E92},{0x5E14, 0xE0FA}, - {0x5E15, 0xC5C1},{0x5E16, 0xCCFB},{0x5E17, 0x8E93},{0x5E18, 0xC1B1},{0x5E19, 0xE0F9},{0x5E1A, 0xD6E3},{0x5E1B, 0xB2AF},{0x5E1C, 0xD6C4}, - {0x5E1D, 0xB5DB},{0x5E1E, 0x8E94},{0x5E1F, 0x8E95},{0x5E20, 0x8E96},{0x5E21, 0x8E97},{0x5E22, 0x8E98},{0x5E23, 0x8E99},{0x5E24, 0x8E9A}, - {0x5E25, 0x8E9B},{0x5E26, 0xB4F8},{0x5E27, 0xD6A1},{0x5E28, 0x8E9C},{0x5E29, 0x8E9D},{0x5E2A, 0x8E9E},{0x5E2B, 0x8E9F},{0x5E2C, 0x8EA0}, - {0x5E2D, 0xCFAF},{0x5E2E, 0xB0EF},{0x5E2F, 0x8EA1},{0x5E30, 0x8EA2},{0x5E31, 0xE0FC},{0x5E32, 0x8EA3},{0x5E33, 0x8EA4},{0x5E34, 0x8EA5}, - {0x5E35, 0x8EA6},{0x5E36, 0x8EA7},{0x5E37, 0xE1A1},{0x5E38, 0xB3A3},{0x5E39, 0x8EA8},{0x5E3A, 0x8EA9},{0x5E3B, 0xE0FD},{0x5E3C, 0xE0FE}, - {0x5E3D, 0xC3B1},{0x5E3E, 0x8EAA},{0x5E3F, 0x8EAB},{0x5E40, 0x8EAC},{0x5E41, 0x8EAD},{0x5E42, 0xC3DD},{0x5E43, 0x8EAE},{0x5E44, 0xE1A2}, - {0x5E45, 0xB7F9},{0x5E46, 0x8EAF},{0x5E47, 0x8EB0},{0x5E48, 0x8EB1},{0x5E49, 0x8EB2},{0x5E4A, 0x8EB3},{0x5E4B, 0x8EB4},{0x5E4C, 0xBBCF}, - {0x5E4D, 0x8EB5},{0x5E4E, 0x8EB6},{0x5E4F, 0x8EB7},{0x5E50, 0x8EB8},{0x5E51, 0x8EB9},{0x5E52, 0x8EBA},{0x5E53, 0x8EBB},{0x5E54, 0xE1A3}, - {0x5E55, 0xC4BB},{0x5E56, 0x8EBC},{0x5E57, 0x8EBD},{0x5E58, 0x8EBE},{0x5E59, 0x8EBF},{0x5E5A, 0x8EC0},{0x5E5B, 0xE1A4},{0x5E5C, 0x8EC1}, - {0x5E5D, 0x8EC2},{0x5E5E, 0xE1A5},{0x5E5F, 0x8EC3},{0x5E60, 0x8EC4},{0x5E61, 0xE1A6},{0x5E62, 0xB4B1},{0x5E63, 0x8EC5},{0x5E64, 0x8EC6}, - {0x5E65, 0x8EC7},{0x5E66, 0x8EC8},{0x5E67, 0x8EC9},{0x5E68, 0x8ECA},{0x5E69, 0x8ECB},{0x5E6A, 0x8ECC},{0x5E6B, 0x8ECD},{0x5E6C, 0x8ECE}, - {0x5E6D, 0x8ECF},{0x5E6E, 0x8ED0},{0x5E6F, 0x8ED1},{0x5E70, 0x8ED2},{0x5E71, 0x8ED3},{0x5E72, 0xB8C9},{0x5E73, 0xC6BD},{0x5E74, 0xC4EA}, - {0x5E75, 0x8ED4},{0x5E76, 0xB2A2},{0x5E77, 0x8ED5},{0x5E78, 0xD0D2},{0x5E79, 0x8ED6},{0x5E7A, 0xE7DB},{0x5E7B, 0xBBC3},{0x5E7C, 0xD3D7}, - {0x5E7D, 0xD3C4},{0x5E7E, 0x8ED7},{0x5E7F, 0xB9E3},{0x5E80, 0xE2CF},{0x5E81, 0x8ED8},{0x5E82, 0x8ED9},{0x5E83, 0x8EDA},{0x5E84, 0xD7AF}, - {0x5E85, 0x8EDB},{0x5E86, 0xC7EC},{0x5E87, 0xB1D3},{0x5E88, 0x8EDC},{0x5E89, 0x8EDD},{0x5E8A, 0xB4B2},{0x5E8B, 0xE2D1},{0x5E8C, 0x8EDE}, - {0x5E8D, 0x8EDF},{0x5E8E, 0x8EE0},{0x5E8F, 0xD0F2},{0x5E90, 0xC2AE},{0x5E91, 0xE2D0},{0x5E92, 0x8EE1},{0x5E93, 0xBFE2},{0x5E94, 0xD3A6}, - {0x5E95, 0xB5D7},{0x5E96, 0xE2D2},{0x5E97, 0xB5EA},{0x5E98, 0x8EE2},{0x5E99, 0xC3ED},{0x5E9A, 0xB8FD},{0x5E9B, 0x8EE3},{0x5E9C, 0xB8AE}, - {0x5E9D, 0x8EE4},{0x5E9E, 0xC5D3},{0x5E9F, 0xB7CF},{0x5EA0, 0xE2D4},{0x5EA1, 0x8EE5},{0x5EA2, 0x8EE6},{0x5EA3, 0x8EE7},{0x5EA4, 0x8EE8}, - {0x5EA5, 0xE2D3},{0x5EA6, 0xB6C8},{0x5EA7, 0xD7F9},{0x5EA8, 0x8EE9},{0x5EA9, 0x8EEA},{0x5EAA, 0x8EEB},{0x5EAB, 0x8EEC},{0x5EAC, 0x8EED}, - {0x5EAD, 0xCDA5},{0x5EAE, 0x8EEE},{0x5EAF, 0x8EEF},{0x5EB0, 0x8EF0},{0x5EB1, 0x8EF1},{0x5EB2, 0x8EF2},{0x5EB3, 0xE2D8},{0x5EB4, 0x8EF3}, - {0x5EB5, 0xE2D6},{0x5EB6, 0xCAFC},{0x5EB7, 0xBFB5},{0x5EB8, 0xD3B9},{0x5EB9, 0xE2D5},{0x5EBA, 0x8EF4},{0x5EBB, 0x8EF5},{0x5EBC, 0x8EF6}, - {0x5EBD, 0x8EF7},{0x5EBE, 0xE2D7},{0x5EBF, 0x8EF8},{0x5EC0, 0x8EF9},{0x5EC1, 0x8EFA},{0x5EC2, 0x8EFB},{0x5EC3, 0x8EFC},{0x5EC4, 0x8EFD}, - {0x5EC5, 0x8EFE},{0x5EC6, 0x8F40},{0x5EC7, 0x8F41},{0x5EC8, 0x8F42},{0x5EC9, 0xC1AE},{0x5ECA, 0xC0C8},{0x5ECB, 0x8F43},{0x5ECC, 0x8F44}, - {0x5ECD, 0x8F45},{0x5ECE, 0x8F46},{0x5ECF, 0x8F47},{0x5ED0, 0x8F48},{0x5ED1, 0xE2DB},{0x5ED2, 0xE2DA},{0x5ED3, 0xC0AA},{0x5ED4, 0x8F49}, - {0x5ED5, 0x8F4A},{0x5ED6, 0xC1CE},{0x5ED7, 0x8F4B},{0x5ED8, 0x8F4C},{0x5ED9, 0x8F4D},{0x5EDA, 0x8F4E},{0x5EDB, 0xE2DC},{0x5EDC, 0x8F4F}, - {0x5EDD, 0x8F50},{0x5EDE, 0x8F51},{0x5EDF, 0x8F52},{0x5EE0, 0x8F53},{0x5EE1, 0x8F54},{0x5EE2, 0x8F55},{0x5EE3, 0x8F56},{0x5EE4, 0x8F57}, - {0x5EE5, 0x8F58},{0x5EE6, 0x8F59},{0x5EE7, 0x8F5A},{0x5EE8, 0xE2DD},{0x5EE9, 0x8F5B},{0x5EEA, 0xE2DE},{0x5EEB, 0x8F5C},{0x5EEC, 0x8F5D}, - {0x5EED, 0x8F5E},{0x5EEE, 0x8F5F},{0x5EEF, 0x8F60},{0x5EF0, 0x8F61},{0x5EF1, 0x8F62},{0x5EF2, 0x8F63},{0x5EF3, 0x8F64},{0x5EF4, 0xDBC8}, - {0x5EF5, 0x8F65},{0x5EF6, 0xD1D3},{0x5EF7, 0xCDA2},{0x5EF8, 0x8F66},{0x5EF9, 0x8F67},{0x5EFA, 0xBDA8},{0x5EFB, 0x8F68},{0x5EFC, 0x8F69}, - {0x5EFD, 0x8F6A},{0x5EFE, 0xDEC3},{0x5EFF, 0xD8A5},{0x5F00, 0xBFAA},{0x5F01, 0xDBCD},{0x5F02, 0xD2EC},{0x5F03, 0xC6FA},{0x5F04, 0xC5AA}, - {0x5F05, 0x8F6B},{0x5F06, 0x8F6C},{0x5F07, 0x8F6D},{0x5F08, 0xDEC4},{0x5F09, 0x8F6E},{0x5F0A, 0xB1D7},{0x5F0B, 0xDFAE},{0x5F0C, 0x8F6F}, - {0x5F0D, 0x8F70},{0x5F0E, 0x8F71},{0x5F0F, 0xCABD},{0x5F10, 0x8F72},{0x5F11, 0xDFB1},{0x5F12, 0x8F73},{0x5F13, 0xB9AD},{0x5F14, 0x8F74}, - {0x5F15, 0xD2FD},{0x5F16, 0x8F75},{0x5F17, 0xB8A5},{0x5F18, 0xBAEB},{0x5F19, 0x8F76},{0x5F1A, 0x8F77},{0x5F1B, 0xB3DA},{0x5F1C, 0x8F78}, - {0x5F1D, 0x8F79},{0x5F1E, 0x8F7A},{0x5F1F, 0xB5DC},{0x5F20, 0xD5C5},{0x5F21, 0x8F7B},{0x5F22, 0x8F7C},{0x5F23, 0x8F7D},{0x5F24, 0x8F7E}, - {0x5F25, 0xC3D6},{0x5F26, 0xCFD2},{0x5F27, 0xBBA1},{0x5F28, 0x8F80},{0x5F29, 0xE5F3},{0x5F2A, 0xE5F2},{0x5F2B, 0x8F81},{0x5F2C, 0x8F82}, - {0x5F2D, 0xE5F4},{0x5F2E, 0x8F83},{0x5F2F, 0xCDE4},{0x5F30, 0x8F84},{0x5F31, 0xC8F5},{0x5F32, 0x8F85},{0x5F33, 0x8F86},{0x5F34, 0x8F87}, - {0x5F35, 0x8F88},{0x5F36, 0x8F89},{0x5F37, 0x8F8A},{0x5F38, 0x8F8B},{0x5F39, 0xB5AF},{0x5F3A, 0xC7BF},{0x5F3B, 0x8F8C},{0x5F3C, 0xE5F6}, - {0x5F3D, 0x8F8D},{0x5F3E, 0x8F8E},{0x5F3F, 0x8F8F},{0x5F40, 0xECB0},{0x5F41, 0x8F90},{0x5F42, 0x8F91},{0x5F43, 0x8F92},{0x5F44, 0x8F93}, - {0x5F45, 0x8F94},{0x5F46, 0x8F95},{0x5F47, 0x8F96},{0x5F48, 0x8F97},{0x5F49, 0x8F98},{0x5F4A, 0x8F99},{0x5F4B, 0x8F9A},{0x5F4C, 0x8F9B}, - {0x5F4D, 0x8F9C},{0x5F4E, 0x8F9D},{0x5F4F, 0x8F9E},{0x5F50, 0xE5E6},{0x5F51, 0x8F9F},{0x5F52, 0xB9E9},{0x5F53, 0xB5B1},{0x5F54, 0x8FA0}, - {0x5F55, 0xC2BC},{0x5F56, 0xE5E8},{0x5F57, 0xE5E7},{0x5F58, 0xE5E9},{0x5F59, 0x8FA1},{0x5F5A, 0x8FA2},{0x5F5B, 0x8FA3},{0x5F5C, 0x8FA4}, - {0x5F5D, 0xD2CD},{0x5F5E, 0x8FA5},{0x5F5F, 0x8FA6},{0x5F60, 0x8FA7},{0x5F61, 0xE1EA},{0x5F62, 0xD0CE},{0x5F63, 0x8FA8},{0x5F64, 0xCDAE}, - {0x5F65, 0x8FA9},{0x5F66, 0xD1E5},{0x5F67, 0x8FAA},{0x5F68, 0x8FAB},{0x5F69, 0xB2CA},{0x5F6A, 0xB1EB},{0x5F6B, 0x8FAC},{0x5F6C, 0xB1F2}, - {0x5F6D, 0xC5ED},{0x5F6E, 0x8FAD},{0x5F6F, 0x8FAE},{0x5F70, 0xD5C3},{0x5F71, 0xD3B0},{0x5F72, 0x8FAF},{0x5F73, 0xE1DC},{0x5F74, 0x8FB0}, - {0x5F75, 0x8FB1},{0x5F76, 0x8FB2},{0x5F77, 0xE1DD},{0x5F78, 0x8FB3},{0x5F79, 0xD2DB},{0x5F7A, 0x8FB4},{0x5F7B, 0xB3B9},{0x5F7C, 0xB1CB}, - {0x5F7D, 0x8FB5},{0x5F7E, 0x8FB6},{0x5F7F, 0x8FB7},{0x5F80, 0xCDF9},{0x5F81, 0xD5F7},{0x5F82, 0xE1DE},{0x5F83, 0x8FB8},{0x5F84, 0xBEB6}, - {0x5F85, 0xB4FD},{0x5F86, 0x8FB9},{0x5F87, 0xE1DF},{0x5F88, 0xBADC},{0x5F89, 0xE1E0},{0x5F8A, 0xBBB2},{0x5F8B, 0xC2C9},{0x5F8C, 0xE1E1}, - {0x5F8D, 0x8FBA},{0x5F8E, 0x8FBB},{0x5F8F, 0x8FBC},{0x5F90, 0xD0EC},{0x5F91, 0x8FBD},{0x5F92, 0xCDBD},{0x5F93, 0x8FBE},{0x5F94, 0x8FBF}, - {0x5F95, 0xE1E2},{0x5F96, 0x8FC0},{0x5F97, 0xB5C3},{0x5F98, 0xC5C7},{0x5F99, 0xE1E3},{0x5F9A, 0x8FC1},{0x5F9B, 0x8FC2},{0x5F9C, 0xE1E4}, - {0x5F9D, 0x8FC3},{0x5F9E, 0x8FC4},{0x5F9F, 0x8FC5},{0x5FA0, 0x8FC6},{0x5FA1, 0xD3F9},{0x5FA2, 0x8FC7},{0x5FA3, 0x8FC8},{0x5FA4, 0x8FC9}, - {0x5FA5, 0x8FCA},{0x5FA6, 0x8FCB},{0x5FA7, 0x8FCC},{0x5FA8, 0xE1E5},{0x5FA9, 0x8FCD},{0x5FAA, 0xD1AD},{0x5FAB, 0x8FCE},{0x5FAC, 0x8FCF}, - {0x5FAD, 0xE1E6},{0x5FAE, 0xCEA2},{0x5FAF, 0x8FD0},{0x5FB0, 0x8FD1},{0x5FB1, 0x8FD2},{0x5FB2, 0x8FD3},{0x5FB3, 0x8FD4},{0x5FB4, 0x8FD5}, - {0x5FB5, 0xE1E7},{0x5FB6, 0x8FD6},{0x5FB7, 0xB5C2},{0x5FB8, 0x8FD7},{0x5FB9, 0x8FD8},{0x5FBA, 0x8FD9},{0x5FBB, 0x8FDA},{0x5FBC, 0xE1E8}, - {0x5FBD, 0xBBD5},{0x5FBE, 0x8FDB},{0x5FBF, 0x8FDC},{0x5FC0, 0x8FDD},{0x5FC1, 0x8FDE},{0x5FC2, 0x8FDF},{0x5FC3, 0xD0C4},{0x5FC4, 0xE2E0}, - {0x5FC5, 0xB1D8},{0x5FC6, 0xD2E4},{0x5FC7, 0x8FE0},{0x5FC8, 0x8FE1},{0x5FC9, 0xE2E1},{0x5FCA, 0x8FE2},{0x5FCB, 0x8FE3},{0x5FCC, 0xBCC9}, - {0x5FCD, 0xC8CC},{0x5FCE, 0x8FE4},{0x5FCF, 0xE2E3},{0x5FD0, 0xECFE},{0x5FD1, 0xECFD},{0x5FD2, 0xDFAF},{0x5FD3, 0x8FE5},{0x5FD4, 0x8FE6}, - {0x5FD5, 0x8FE7},{0x5FD6, 0xE2E2},{0x5FD7, 0xD6BE},{0x5FD8, 0xCDFC},{0x5FD9, 0xC3A6},{0x5FDA, 0x8FE8},{0x5FDB, 0x8FE9},{0x5FDC, 0x8FEA}, - {0x5FDD, 0xE3C3},{0x5FDE, 0x8FEB},{0x5FDF, 0x8FEC},{0x5FE0, 0xD6D2},{0x5FE1, 0xE2E7},{0x5FE2, 0x8FED},{0x5FE3, 0x8FEE},{0x5FE4, 0xE2E8}, - {0x5FE5, 0x8FEF},{0x5FE6, 0x8FF0},{0x5FE7, 0xD3C7},{0x5FE8, 0x8FF1},{0x5FE9, 0x8FF2},{0x5FEA, 0xE2EC},{0x5FEB, 0xBFEC},{0x5FEC, 0x8FF3}, - {0x5FED, 0xE2ED},{0x5FEE, 0xE2E5},{0x5FEF, 0x8FF4},{0x5FF0, 0x8FF5},{0x5FF1, 0xB3C0},{0x5FF2, 0x8FF6},{0x5FF3, 0x8FF7},{0x5FF4, 0x8FF8}, - {0x5FF5, 0xC4EE},{0x5FF6, 0x8FF9},{0x5FF7, 0x8FFA},{0x5FF8, 0xE2EE},{0x5FF9, 0x8FFB},{0x5FFA, 0x8FFC},{0x5FFB, 0xD0C3},{0x5FFC, 0x8FFD}, - {0x5FFD, 0xBAF6},{0x5FFE, 0xE2E9},{0x5FFF, 0xB7DE},{0x6000, 0xBBB3},{0x6001, 0xCCAC},{0x6002, 0xCBCB},{0x6003, 0xE2E4},{0x6004, 0xE2E6}, - {0x6005, 0xE2EA},{0x6006, 0xE2EB},{0x6007, 0x8FFE},{0x6008, 0x9040},{0x6009, 0x9041},{0x600A, 0xE2F7},{0x600B, 0x9042},{0x600C, 0x9043}, - {0x600D, 0xE2F4},{0x600E, 0xD4F5},{0x600F, 0xE2F3},{0x6010, 0x9044},{0x6011, 0x9045},{0x6012, 0xC5AD},{0x6013, 0x9046},{0x6014, 0xD5FA}, - {0x6015, 0xC5C2},{0x6016, 0xB2C0},{0x6017, 0x9047},{0x6018, 0x9048},{0x6019, 0xE2EF},{0x601A, 0x9049},{0x601B, 0xE2F2},{0x601C, 0xC1AF}, - {0x601D, 0xCBBC},{0x601E, 0x904A},{0x601F, 0x904B},{0x6020, 0xB5A1},{0x6021, 0xE2F9},{0x6022, 0x904C},{0x6023, 0x904D},{0x6024, 0x904E}, - {0x6025, 0xBCB1},{0x6026, 0xE2F1},{0x6027, 0xD0D4},{0x6028, 0xD4B9},{0x6029, 0xE2F5},{0x602A, 0xB9D6},{0x602B, 0xE2F6},{0x602C, 0x904F}, - {0x602D, 0x9050},{0x602E, 0x9051},{0x602F, 0xC7D3},{0x6030, 0x9052},{0x6031, 0x9053},{0x6032, 0x9054},{0x6033, 0x9055},{0x6034, 0x9056}, - {0x6035, 0xE2F0},{0x6036, 0x9057},{0x6037, 0x9058},{0x6038, 0x9059},{0x6039, 0x905A},{0x603A, 0x905B},{0x603B, 0xD7DC},{0x603C, 0xEDA1}, - {0x603D, 0x905C},{0x603E, 0x905D},{0x603F, 0xE2F8},{0x6040, 0x905E},{0x6041, 0xEDA5},{0x6042, 0xE2FE},{0x6043, 0xCAD1},{0x6044, 0x905F}, - {0x6045, 0x9060},{0x6046, 0x9061},{0x6047, 0x9062},{0x6048, 0x9063},{0x6049, 0x9064},{0x604A, 0x9065},{0x604B, 0xC1B5},{0x604C, 0x9066}, - {0x604D, 0xBBD0},{0x604E, 0x9067},{0x604F, 0x9068},{0x6050, 0xBFD6},{0x6051, 0x9069},{0x6052, 0xBAE3},{0x6053, 0x906A},{0x6054, 0x906B}, - {0x6055, 0xCBA1},{0x6056, 0x906C},{0x6057, 0x906D},{0x6058, 0x906E},{0x6059, 0xEDA6},{0x605A, 0xEDA3},{0x605B, 0x906F},{0x605C, 0x9070}, - {0x605D, 0xEDA2},{0x605E, 0x9071},{0x605F, 0x9072},{0x6060, 0x9073},{0x6061, 0x9074},{0x6062, 0xBBD6},{0x6063, 0xEDA7},{0x6064, 0xD0F4}, - {0x6065, 0x9075},{0x6066, 0x9076},{0x6067, 0xEDA4},{0x6068, 0xBADE},{0x6069, 0xB6F7},{0x606A, 0xE3A1},{0x606B, 0xB6B2},{0x606C, 0xCCF1}, - {0x606D, 0xB9A7},{0x606E, 0x9077},{0x606F, 0xCFA2},{0x6070, 0xC7A1},{0x6071, 0x9078},{0x6072, 0x9079},{0x6073, 0xBFD2},{0x6074, 0x907A}, - {0x6075, 0x907B},{0x6076, 0xB6F1},{0x6077, 0x907C},{0x6078, 0xE2FA},{0x6079, 0xE2FB},{0x607A, 0xE2FD},{0x607B, 0xE2FC},{0x607C, 0xC4D5}, - {0x607D, 0xE3A2},{0x607E, 0x907D},{0x607F, 0xD3C1},{0x6080, 0x907E},{0x6081, 0x9080},{0x6082, 0x9081},{0x6083, 0xE3A7},{0x6084, 0xC7C4}, - {0x6085, 0x9082},{0x6086, 0x9083},{0x6087, 0x9084},{0x6088, 0x9085},{0x6089, 0xCFA4},{0x608A, 0x9086},{0x608B, 0x9087},{0x608C, 0xE3A9}, - {0x608D, 0xBAB7},{0x608E, 0x9088},{0x608F, 0x9089},{0x6090, 0x908A},{0x6091, 0x908B},{0x6092, 0xE3A8},{0x6093, 0x908C},{0x6094, 0xBBDA}, - {0x6095, 0x908D},{0x6096, 0xE3A3},{0x6097, 0x908E},{0x6098, 0x908F},{0x6099, 0x9090},{0x609A, 0xE3A4},{0x609B, 0xE3AA},{0x609C, 0x9091}, - {0x609D, 0xE3A6},{0x609E, 0x9092},{0x609F, 0xCEF2},{0x60A0, 0xD3C6},{0x60A1, 0x9093},{0x60A2, 0x9094},{0x60A3, 0xBBBC},{0x60A4, 0x9095}, - {0x60A5, 0x9096},{0x60A6, 0xD4C3},{0x60A7, 0x9097},{0x60A8, 0xC4FA},{0x60A9, 0x9098},{0x60AA, 0x9099},{0x60AB, 0xEDA8},{0x60AC, 0xD0FC}, - {0x60AD, 0xE3A5},{0x60AE, 0x909A},{0x60AF, 0xC3F5},{0x60B0, 0x909B},{0x60B1, 0xE3AD},{0x60B2, 0xB1AF},{0x60B3, 0x909C},{0x60B4, 0xE3B2}, - {0x60B5, 0x909D},{0x60B6, 0x909E},{0x60B7, 0x909F},{0x60B8, 0xBCC2},{0x60B9, 0x90A0},{0x60BA, 0x90A1},{0x60BB, 0xE3AC},{0x60BC, 0xB5BF}, - {0x60BD, 0x90A2},{0x60BE, 0x90A3},{0x60BF, 0x90A4},{0x60C0, 0x90A5},{0x60C1, 0x90A6},{0x60C2, 0x90A7},{0x60C3, 0x90A8},{0x60C4, 0x90A9}, - {0x60C5, 0xC7E9},{0x60C6, 0xE3B0},{0x60C7, 0x90AA},{0x60C8, 0x90AB},{0x60C9, 0x90AC},{0x60CA, 0xBEAA},{0x60CB, 0xCDEF},{0x60CC, 0x90AD}, - {0x60CD, 0x90AE},{0x60CE, 0x90AF},{0x60CF, 0x90B0},{0x60D0, 0x90B1},{0x60D1, 0xBBF3},{0x60D2, 0x90B2},{0x60D3, 0x90B3},{0x60D4, 0x90B4}, - {0x60D5, 0xCCE8},{0x60D6, 0x90B5},{0x60D7, 0x90B6},{0x60D8, 0xE3AF},{0x60D9, 0x90B7},{0x60DA, 0xE3B1},{0x60DB, 0x90B8},{0x60DC, 0xCFA7}, - {0x60DD, 0xE3AE},{0x60DE, 0x90B9},{0x60DF, 0xCEA9},{0x60E0, 0xBBDD},{0x60E1, 0x90BA},{0x60E2, 0x90BB},{0x60E3, 0x90BC},{0x60E4, 0x90BD}, - {0x60E5, 0x90BE},{0x60E6, 0xB5EB},{0x60E7, 0xBEE5},{0x60E8, 0xB2D2},{0x60E9, 0xB3CD},{0x60EA, 0x90BF},{0x60EB, 0xB1B9},{0x60EC, 0xE3AB}, - {0x60ED, 0xB2D1},{0x60EE, 0xB5AC},{0x60EF, 0xB9DF},{0x60F0, 0xB6E8},{0x60F1, 0x90C0},{0x60F2, 0x90C1},{0x60F3, 0xCFEB},{0x60F4, 0xE3B7}, - {0x60F5, 0x90C2},{0x60F6, 0xBBCC},{0x60F7, 0x90C3},{0x60F8, 0x90C4},{0x60F9, 0xC8C7},{0x60FA, 0xD0CA},{0x60FB, 0x90C5},{0x60FC, 0x90C6}, - {0x60FD, 0x90C7},{0x60FE, 0x90C8},{0x60FF, 0x90C9},{0x6100, 0xE3B8},{0x6101, 0xB3EE},{0x6102, 0x90CA},{0x6103, 0x90CB},{0x6104, 0x90CC}, - {0x6105, 0x90CD},{0x6106, 0xEDA9},{0x6107, 0x90CE},{0x6108, 0xD3FA},{0x6109, 0xD3E4},{0x610A, 0x90CF},{0x610B, 0x90D0},{0x610C, 0x90D1}, - {0x610D, 0xEDAA},{0x610E, 0xE3B9},{0x610F, 0xD2E2},{0x6110, 0x90D2},{0x6111, 0x90D3},{0x6112, 0x90D4},{0x6113, 0x90D5},{0x6114, 0x90D6}, - {0x6115, 0xE3B5},{0x6116, 0x90D7},{0x6117, 0x90D8},{0x6118, 0x90D9},{0x6119, 0x90DA},{0x611A, 0xD3DE},{0x611B, 0x90DB},{0x611C, 0x90DC}, - {0x611D, 0x90DD},{0x611E, 0x90DE},{0x611F, 0xB8D0},{0x6120, 0xE3B3},{0x6121, 0x90DF},{0x6122, 0x90E0},{0x6123, 0xE3B6},{0x6124, 0xB7DF}, - {0x6125, 0x90E1},{0x6126, 0xE3B4},{0x6127, 0xC0A2},{0x6128, 0x90E2},{0x6129, 0x90E3},{0x612A, 0x90E4},{0x612B, 0xE3BA},{0x612C, 0x90E5}, - {0x612D, 0x90E6},{0x612E, 0x90E7},{0x612F, 0x90E8},{0x6130, 0x90E9},{0x6131, 0x90EA},{0x6132, 0x90EB},{0x6133, 0x90EC},{0x6134, 0x90ED}, - {0x6135, 0x90EE},{0x6136, 0x90EF},{0x6137, 0x90F0},{0x6138, 0x90F1},{0x6139, 0x90F2},{0x613A, 0x90F3},{0x613B, 0x90F4},{0x613C, 0x90F5}, - {0x613D, 0x90F6},{0x613E, 0x90F7},{0x613F, 0xD4B8},{0x6140, 0x90F8},{0x6141, 0x90F9},{0x6142, 0x90FA},{0x6143, 0x90FB},{0x6144, 0x90FC}, - {0x6145, 0x90FD},{0x6146, 0x90FE},{0x6147, 0x9140},{0x6148, 0xB4C8},{0x6149, 0x9141},{0x614A, 0xE3BB},{0x614B, 0x9142},{0x614C, 0xBBC5}, - {0x614D, 0x9143},{0x614E, 0xC9F7},{0x614F, 0x9144},{0x6150, 0x9145},{0x6151, 0xC9E5},{0x6152, 0x9146},{0x6153, 0x9147},{0x6154, 0x9148}, - {0x6155, 0xC4BD},{0x6156, 0x9149},{0x6157, 0x914A},{0x6158, 0x914B},{0x6159, 0x914C},{0x615A, 0x914D},{0x615B, 0x914E},{0x615C, 0x914F}, - {0x615D, 0xEDAB},{0x615E, 0x9150},{0x615F, 0x9151},{0x6160, 0x9152},{0x6161, 0x9153},{0x6162, 0xC2FD},{0x6163, 0x9154},{0x6164, 0x9155}, - {0x6165, 0x9156},{0x6166, 0x9157},{0x6167, 0xBBDB},{0x6168, 0xBFAE},{0x6169, 0x9158},{0x616A, 0x9159},{0x616B, 0x915A},{0x616C, 0x915B}, - {0x616D, 0x915C},{0x616E, 0x915D},{0x616F, 0x915E},{0x6170, 0xCEBF},{0x6171, 0x915F},{0x6172, 0x9160},{0x6173, 0x9161},{0x6174, 0x9162}, - {0x6175, 0xE3BC},{0x6176, 0x9163},{0x6177, 0xBFB6},{0x6178, 0x9164},{0x6179, 0x9165},{0x617A, 0x9166},{0x617B, 0x9167},{0x617C, 0x9168}, - {0x617D, 0x9169},{0x617E, 0x916A},{0x617F, 0x916B},{0x6180, 0x916C},{0x6181, 0x916D},{0x6182, 0x916E},{0x6183, 0x916F},{0x6184, 0x9170}, - {0x6185, 0x9171},{0x6186, 0x9172},{0x6187, 0x9173},{0x6188, 0x9174},{0x6189, 0x9175},{0x618A, 0x9176},{0x618B, 0xB1EF},{0x618C, 0x9177}, - {0x618D, 0x9178},{0x618E, 0xD4F7},{0x618F, 0x9179},{0x6190, 0x917A},{0x6191, 0x917B},{0x6192, 0x917C},{0x6193, 0x917D},{0x6194, 0xE3BE}, - {0x6195, 0x917E},{0x6196, 0x9180},{0x6197, 0x9181},{0x6198, 0x9182},{0x6199, 0x9183},{0x619A, 0x9184},{0x619B, 0x9185},{0x619C, 0x9186}, - {0x619D, 0xEDAD},{0x619E, 0x9187},{0x619F, 0x9188},{0x61A0, 0x9189},{0x61A1, 0x918A},{0x61A2, 0x918B},{0x61A3, 0x918C},{0x61A4, 0x918D}, - {0x61A5, 0x918E},{0x61A6, 0x918F},{0x61A7, 0xE3BF},{0x61A8, 0xBAA9},{0x61A9, 0xEDAC},{0x61AA, 0x9190},{0x61AB, 0x9191},{0x61AC, 0xE3BD}, - {0x61AD, 0x9192},{0x61AE, 0x9193},{0x61AF, 0x9194},{0x61B0, 0x9195},{0x61B1, 0x9196},{0x61B2, 0x9197},{0x61B3, 0x9198},{0x61B4, 0x9199}, - {0x61B5, 0x919A},{0x61B6, 0x919B},{0x61B7, 0xE3C0},{0x61B8, 0x919C},{0x61B9, 0x919D},{0x61BA, 0x919E},{0x61BB, 0x919F},{0x61BC, 0x91A0}, - {0x61BD, 0x91A1},{0x61BE, 0xBAB6},{0x61BF, 0x91A2},{0x61C0, 0x91A3},{0x61C1, 0x91A4},{0x61C2, 0xB6AE},{0x61C3, 0x91A5},{0x61C4, 0x91A6}, - {0x61C5, 0x91A7},{0x61C6, 0x91A8},{0x61C7, 0x91A9},{0x61C8, 0xD0B8},{0x61C9, 0x91AA},{0x61CA, 0xB0C3},{0x61CB, 0xEDAE},{0x61CC, 0x91AB}, - {0x61CD, 0x91AC},{0x61CE, 0x91AD},{0x61CF, 0x91AE},{0x61D0, 0x91AF},{0x61D1, 0xEDAF},{0x61D2, 0xC0C1},{0x61D3, 0x91B0},{0x61D4, 0xE3C1}, - {0x61D5, 0x91B1},{0x61D6, 0x91B2},{0x61D7, 0x91B3},{0x61D8, 0x91B4},{0x61D9, 0x91B5},{0x61DA, 0x91B6},{0x61DB, 0x91B7},{0x61DC, 0x91B8}, - {0x61DD, 0x91B9},{0x61DE, 0x91BA},{0x61DF, 0x91BB},{0x61E0, 0x91BC},{0x61E1, 0x91BD},{0x61E2, 0x91BE},{0x61E3, 0x91BF},{0x61E4, 0x91C0}, - {0x61E5, 0x91C1},{0x61E6, 0xC5B3},{0x61E7, 0x91C2},{0x61E8, 0x91C3},{0x61E9, 0x91C4},{0x61EA, 0x91C5},{0x61EB, 0x91C6},{0x61EC, 0x91C7}, - {0x61ED, 0x91C8},{0x61EE, 0x91C9},{0x61EF, 0x91CA},{0x61F0, 0x91CB},{0x61F1, 0x91CC},{0x61F2, 0x91CD},{0x61F3, 0x91CE},{0x61F4, 0x91CF}, - {0x61F5, 0xE3C2},{0x61F6, 0x91D0},{0x61F7, 0x91D1},{0x61F8, 0x91D2},{0x61F9, 0x91D3},{0x61FA, 0x91D4},{0x61FB, 0x91D5},{0x61FC, 0x91D6}, - {0x61FD, 0x91D7},{0x61FE, 0x91D8},{0x61FF, 0xDCB2},{0x6200, 0x91D9},{0x6201, 0x91DA},{0x6202, 0x91DB},{0x6203, 0x91DC},{0x6204, 0x91DD}, - {0x6205, 0x91DE},{0x6206, 0xEDB0},{0x6207, 0x91DF},{0x6208, 0xB8EA},{0x6209, 0x91E0},{0x620A, 0xCEEC},{0x620B, 0xEAA7},{0x620C, 0xD0E7}, - {0x620D, 0xCAF9},{0x620E, 0xC8D6},{0x620F, 0xCFB7},{0x6210, 0xB3C9},{0x6211, 0xCED2},{0x6212, 0xBDE4},{0x6213, 0x91E1},{0x6214, 0x91E2}, - {0x6215, 0xE3DE},{0x6216, 0xBBF2},{0x6217, 0xEAA8},{0x6218, 0xD5BD},{0x6219, 0x91E3},{0x621A, 0xC6DD},{0x621B, 0xEAA9},{0x621C, 0x91E4}, - {0x621D, 0x91E5},{0x621E, 0x91E6},{0x621F, 0xEAAA},{0x6220, 0x91E7},{0x6221, 0xEAAC},{0x6222, 0xEAAB},{0x6223, 0x91E8},{0x6224, 0xEAAE}, - {0x6225, 0xEAAD},{0x6226, 0x91E9},{0x6227, 0x91EA},{0x6228, 0x91EB},{0x6229, 0x91EC},{0x622A, 0xBDD8},{0x622B, 0x91ED},{0x622C, 0xEAAF}, - {0x622D, 0x91EE},{0x622E, 0xC2BE},{0x622F, 0x91EF},{0x6230, 0x91F0},{0x6231, 0x91F1},{0x6232, 0x91F2},{0x6233, 0xB4C1},{0x6234, 0xB4F7}, - {0x6235, 0x91F3},{0x6236, 0x91F4},{0x6237, 0xBBA7},{0x6238, 0x91F5},{0x6239, 0x91F6},{0x623A, 0x91F7},{0x623B, 0x91F8},{0x623C, 0x91F9}, - {0x623D, 0xECE6},{0x623E, 0xECE5},{0x623F, 0xB7BF},{0x6240, 0xCBF9},{0x6241, 0xB1E2},{0x6242, 0x91FA},{0x6243, 0xECE7},{0x6244, 0x91FB}, - {0x6245, 0x91FC},{0x6246, 0x91FD},{0x6247, 0xC9C8},{0x6248, 0xECE8},{0x6249, 0xECE9},{0x624A, 0x91FE},{0x624B, 0xCAD6},{0x624C, 0xDED0}, - {0x624D, 0xB2C5},{0x624E, 0xD4FA},{0x624F, 0x9240},{0x6250, 0x9241},{0x6251, 0xC6CB},{0x6252, 0xB0C7},{0x6253, 0xB4F2},{0x6254, 0xC8D3}, - {0x6255, 0x9242},{0x6256, 0x9243},{0x6257, 0x9244},{0x6258, 0xCDD0},{0x6259, 0x9245},{0x625A, 0x9246},{0x625B, 0xBFB8},{0x625C, 0x9247}, - {0x625D, 0x9248},{0x625E, 0x9249},{0x625F, 0x924A},{0x6260, 0x924B},{0x6261, 0x924C},{0x6262, 0x924D},{0x6263, 0xBFDB},{0x6264, 0x924E}, - {0x6265, 0x924F},{0x6266, 0xC7A4},{0x6267, 0xD6B4},{0x6268, 0x9250},{0x6269, 0xC0A9},{0x626A, 0xDED1},{0x626B, 0xC9A8},{0x626C, 0xD1EF}, - {0x626D, 0xC5A4},{0x626E, 0xB0E7},{0x626F, 0xB3B6},{0x6270, 0xC8C5},{0x6271, 0x9251},{0x6272, 0x9252},{0x6273, 0xB0E2},{0x6274, 0x9253}, - {0x6275, 0x9254},{0x6276, 0xB7F6},{0x6277, 0x9255},{0x6278, 0x9256},{0x6279, 0xC5FA},{0x627A, 0x9257},{0x627B, 0x9258},{0x627C, 0xB6F3}, - {0x627D, 0x9259},{0x627E, 0xD5D2},{0x627F, 0xB3D0},{0x6280, 0xBCBC},{0x6281, 0x925A},{0x6282, 0x925B},{0x6283, 0x925C},{0x6284, 0xB3AD}, - {0x6285, 0x925D},{0x6286, 0x925E},{0x6287, 0x925F},{0x6288, 0x9260},{0x6289, 0xBEF1},{0x628A, 0xB0D1},{0x628B, 0x9261},{0x628C, 0x9262}, - {0x628D, 0x9263},{0x628E, 0x9264},{0x628F, 0x9265},{0x6290, 0x9266},{0x6291, 0xD2D6},{0x6292, 0xCAE3},{0x6293, 0xD7A5},{0x6294, 0x9267}, - {0x6295, 0xCDB6},{0x6296, 0xB6B6},{0x6297, 0xBFB9},{0x6298, 0xD5DB},{0x6299, 0x9268},{0x629A, 0xB8A7},{0x629B, 0xC5D7},{0x629C, 0x9269}, - {0x629D, 0x926A},{0x629E, 0x926B},{0x629F, 0xDED2},{0x62A0, 0xBFD9},{0x62A1, 0xC2D5},{0x62A2, 0xC7C0},{0x62A3, 0x926C},{0x62A4, 0xBBA4}, - {0x62A5, 0xB1A8},{0x62A6, 0x926D},{0x62A7, 0x926E},{0x62A8, 0xC5EA},{0x62A9, 0x926F},{0x62AA, 0x9270},{0x62AB, 0xC5FB},{0x62AC, 0xCCA7}, - {0x62AD, 0x9271},{0x62AE, 0x9272},{0x62AF, 0x9273},{0x62B0, 0x9274},{0x62B1, 0xB1A7},{0x62B2, 0x9275},{0x62B3, 0x9276},{0x62B4, 0x9277}, - {0x62B5, 0xB5D6},{0x62B6, 0x9278},{0x62B7, 0x9279},{0x62B8, 0x927A},{0x62B9, 0xC4A8},{0x62BA, 0x927B},{0x62BB, 0xDED3},{0x62BC, 0xD1BA}, - {0x62BD, 0xB3E9},{0x62BE, 0x927C},{0x62BF, 0xC3F2},{0x62C0, 0x927D},{0x62C1, 0x927E},{0x62C2, 0xB7F7},{0x62C3, 0x9280},{0x62C4, 0xD6F4}, - {0x62C5, 0xB5A3},{0x62C6, 0xB2F0},{0x62C7, 0xC4B4},{0x62C8, 0xC4E9},{0x62C9, 0xC0AD},{0x62CA, 0xDED4},{0x62CB, 0x9281},{0x62CC, 0xB0E8}, - {0x62CD, 0xC5C4},{0x62CE, 0xC1E0},{0x62CF, 0x9282},{0x62D0, 0xB9D5},{0x62D1, 0x9283},{0x62D2, 0xBEDC},{0x62D3, 0xCDD8},{0x62D4, 0xB0CE}, - {0x62D5, 0x9284},{0x62D6, 0xCDCF},{0x62D7, 0xDED6},{0x62D8, 0xBED0},{0x62D9, 0xD7BE},{0x62DA, 0xDED5},{0x62DB, 0xD5D0},{0x62DC, 0xB0DD}, - {0x62DD, 0x9285},{0x62DE, 0x9286},{0x62DF, 0xC4E2},{0x62E0, 0x9287},{0x62E1, 0x9288},{0x62E2, 0xC2A3},{0x62E3, 0xBCF0},{0x62E4, 0x9289}, - {0x62E5, 0xD3B5},{0x62E6, 0xC0B9},{0x62E7, 0xC5A1},{0x62E8, 0xB2A6},{0x62E9, 0xD4F1},{0x62EA, 0x928A},{0x62EB, 0x928B},{0x62EC, 0xC0A8}, - {0x62ED, 0xCAC3},{0x62EE, 0xDED7},{0x62EF, 0xD5FC},{0x62F0, 0x928C},{0x62F1, 0xB9B0},{0x62F2, 0x928D},{0x62F3, 0xC8AD},{0x62F4, 0xCBA9}, - {0x62F5, 0x928E},{0x62F6, 0xDED9},{0x62F7, 0xBFBD},{0x62F8, 0x928F},{0x62F9, 0x9290},{0x62FA, 0x9291},{0x62FB, 0x9292},{0x62FC, 0xC6B4}, - {0x62FD, 0xD7A7},{0x62FE, 0xCAB0},{0x62FF, 0xC4C3},{0x6300, 0x9293},{0x6301, 0xB3D6},{0x6302, 0xB9D2},{0x6303, 0x9294},{0x6304, 0x9295}, - {0x6305, 0x9296},{0x6306, 0x9297},{0x6307, 0xD6B8},{0x6308, 0xEAFC},{0x6309, 0xB0B4},{0x630A, 0x9298},{0x630B, 0x9299},{0x630C, 0x929A}, - {0x630D, 0x929B},{0x630E, 0xBFE6},{0x630F, 0x929C},{0x6310, 0x929D},{0x6311, 0xCCF4},{0x6312, 0x929E},{0x6313, 0x929F},{0x6314, 0x92A0}, - {0x6315, 0x92A1},{0x6316, 0xCDDA},{0x6317, 0x92A2},{0x6318, 0x92A3},{0x6319, 0x92A4},{0x631A, 0xD6BF},{0x631B, 0xC2CE},{0x631C, 0x92A5}, - {0x631D, 0xCECE},{0x631E, 0xCCA2},{0x631F, 0xD0AE},{0x6320, 0xC4D3},{0x6321, 0xB5B2},{0x6322, 0xDED8},{0x6323, 0xD5F5},{0x6324, 0xBCB7}, - {0x6325, 0xBBD3},{0x6326, 0x92A6},{0x6327, 0x92A7},{0x6328, 0xB0A4},{0x6329, 0x92A8},{0x632A, 0xC5B2},{0x632B, 0xB4EC},{0x632C, 0x92A9}, - {0x632D, 0x92AA},{0x632E, 0x92AB},{0x632F, 0xD5F1},{0x6330, 0x92AC},{0x6331, 0x92AD},{0x6332, 0xEAFD},{0x6333, 0x92AE},{0x6334, 0x92AF}, - {0x6335, 0x92B0},{0x6336, 0x92B1},{0x6337, 0x92B2},{0x6338, 0x92B3},{0x6339, 0xDEDA},{0x633A, 0xCDA6},{0x633B, 0x92B4},{0x633C, 0x92B5}, - {0x633D, 0xCDEC},{0x633E, 0x92B6},{0x633F, 0x92B7},{0x6340, 0x92B8},{0x6341, 0x92B9},{0x6342, 0xCEE6},{0x6343, 0xDEDC},{0x6344, 0x92BA}, - {0x6345, 0xCDB1},{0x6346, 0xC0A6},{0x6347, 0x92BB},{0x6348, 0x92BC},{0x6349, 0xD7BD},{0x634A, 0x92BD},{0x634B, 0xDEDB},{0x634C, 0xB0C6}, - {0x634D, 0xBAB4},{0x634E, 0xC9D3},{0x634F, 0xC4F3},{0x6350, 0xBEE8},{0x6351, 0x92BE},{0x6352, 0x92BF},{0x6353, 0x92C0},{0x6354, 0x92C1}, - {0x6355, 0xB2B6},{0x6356, 0x92C2},{0x6357, 0x92C3},{0x6358, 0x92C4},{0x6359, 0x92C5},{0x635A, 0x92C6},{0x635B, 0x92C7},{0x635C, 0x92C8}, - {0x635D, 0x92C9},{0x635E, 0xC0CC},{0x635F, 0xCBF0},{0x6360, 0x92CA},{0x6361, 0xBCF1},{0x6362, 0xBBBB},{0x6363, 0xB5B7},{0x6364, 0x92CB}, - {0x6365, 0x92CC},{0x6366, 0x92CD},{0x6367, 0xC5F5},{0x6368, 0x92CE},{0x6369, 0xDEE6},{0x636A, 0x92CF},{0x636B, 0x92D0},{0x636C, 0x92D1}, - {0x636D, 0xDEE3},{0x636E, 0xBEDD},{0x636F, 0x92D2},{0x6370, 0x92D3},{0x6371, 0xDEDF},{0x6372, 0x92D4},{0x6373, 0x92D5},{0x6374, 0x92D6}, - {0x6375, 0x92D7},{0x6376, 0xB4B7},{0x6377, 0xBDDD},{0x6378, 0x92D8},{0x6379, 0x92D9},{0x637A, 0xDEE0},{0x637B, 0xC4ED},{0x637C, 0x92DA}, - {0x637D, 0x92DB},{0x637E, 0x92DC},{0x637F, 0x92DD},{0x6380, 0xCFC6},{0x6381, 0x92DE},{0x6382, 0xB5E0},{0x6383, 0x92DF},{0x6384, 0x92E0}, - {0x6385, 0x92E1},{0x6386, 0x92E2},{0x6387, 0xB6DE},{0x6388, 0xCADA},{0x6389, 0xB5F4},{0x638A, 0xDEE5},{0x638B, 0x92E3},{0x638C, 0xD5C6}, - {0x638D, 0x92E4},{0x638E, 0xDEE1},{0x638F, 0xCCCD},{0x6390, 0xC6FE},{0x6391, 0x92E5},{0x6392, 0xC5C5},{0x6393, 0x92E6},{0x6394, 0x92E7}, - {0x6395, 0x92E8},{0x6396, 0xD2B4},{0x6397, 0x92E9},{0x6398, 0xBEF2},{0x6399, 0x92EA},{0x639A, 0x92EB},{0x639B, 0x92EC},{0x639C, 0x92ED}, - {0x639D, 0x92EE},{0x639E, 0x92EF},{0x639F, 0x92F0},{0x63A0, 0xC2D3},{0x63A1, 0x92F1},{0x63A2, 0xCCBD},{0x63A3, 0xB3B8},{0x63A4, 0x92F2}, - {0x63A5, 0xBDD3},{0x63A6, 0x92F3},{0x63A7, 0xBFD8},{0x63A8, 0xCDC6},{0x63A9, 0xD1DA},{0x63AA, 0xB4EB},{0x63AB, 0x92F4},{0x63AC, 0xDEE4}, - {0x63AD, 0xDEDD},{0x63AE, 0xDEE7},{0x63AF, 0x92F5},{0x63B0, 0xEAFE},{0x63B1, 0x92F6},{0x63B2, 0x92F7},{0x63B3, 0xC2B0},{0x63B4, 0xDEE2}, - {0x63B5, 0x92F8},{0x63B6, 0x92F9},{0x63B7, 0xD6C0},{0x63B8, 0xB5A7},{0x63B9, 0x92FA},{0x63BA, 0xB2F4},{0x63BB, 0x92FB},{0x63BC, 0xDEE8}, - {0x63BD, 0x92FC},{0x63BE, 0xDEF2},{0x63BF, 0x92FD},{0x63C0, 0x92FE},{0x63C1, 0x9340},{0x63C2, 0x9341},{0x63C3, 0x9342},{0x63C4, 0xDEED}, - {0x63C5, 0x9343},{0x63C6, 0xDEF1},{0x63C7, 0x9344},{0x63C8, 0x9345},{0x63C9, 0xC8E0},{0x63CA, 0x9346},{0x63CB, 0x9347},{0x63CC, 0x9348}, - {0x63CD, 0xD7E1},{0x63CE, 0xDEEF},{0x63CF, 0xC3E8},{0x63D0, 0xCCE1},{0x63D1, 0x9349},{0x63D2, 0xB2E5},{0x63D3, 0x934A},{0x63D4, 0x934B}, - {0x63D5, 0x934C},{0x63D6, 0xD2BE},{0x63D7, 0x934D},{0x63D8, 0x934E},{0x63D9, 0x934F},{0x63DA, 0x9350},{0x63DB, 0x9351},{0x63DC, 0x9352}, - {0x63DD, 0x9353},{0x63DE, 0xDEEE},{0x63DF, 0x9354},{0x63E0, 0xDEEB},{0x63E1, 0xCED5},{0x63E2, 0x9355},{0x63E3, 0xB4A7},{0x63E4, 0x9356}, - {0x63E5, 0x9357},{0x63E6, 0x9358},{0x63E7, 0x9359},{0x63E8, 0x935A},{0x63E9, 0xBFAB},{0x63EA, 0xBEBE},{0x63EB, 0x935B},{0x63EC, 0x935C}, - {0x63ED, 0xBDD2},{0x63EE, 0x935D},{0x63EF, 0x935E},{0x63F0, 0x935F},{0x63F1, 0x9360},{0x63F2, 0xDEE9},{0x63F3, 0x9361},{0x63F4, 0xD4AE}, - {0x63F5, 0x9362},{0x63F6, 0xDEDE},{0x63F7, 0x9363},{0x63F8, 0xDEEA},{0x63F9, 0x9364},{0x63FA, 0x9365},{0x63FB, 0x9366},{0x63FC, 0x9367}, - {0x63FD, 0xC0BF},{0x63FE, 0x9368},{0x63FF, 0xDEEC},{0x6400, 0xB2F3},{0x6401, 0xB8E9},{0x6402, 0xC2A7},{0x6403, 0x9369},{0x6404, 0x936A}, - {0x6405, 0xBDC1},{0x6406, 0x936B},{0x6407, 0x936C},{0x6408, 0x936D},{0x6409, 0x936E},{0x640A, 0x936F},{0x640B, 0xDEF5},{0x640C, 0xDEF8}, - {0x640D, 0x9370},{0x640E, 0x9371},{0x640F, 0xB2AB},{0x6410, 0xB4A4},{0x6411, 0x9372},{0x6412, 0x9373},{0x6413, 0xB4EA},{0x6414, 0xC9A6}, - {0x6415, 0x9374},{0x6416, 0x9375},{0x6417, 0x9376},{0x6418, 0x9377},{0x6419, 0x9378},{0x641A, 0x9379},{0x641B, 0xDEF6},{0x641C, 0xCBD1}, - {0x641D, 0x937A},{0x641E, 0xB8E3},{0x641F, 0x937B},{0x6420, 0xDEF7},{0x6421, 0xDEFA},{0x6422, 0x937C},{0x6423, 0x937D},{0x6424, 0x937E}, - {0x6425, 0x9380},{0x6426, 0xDEF9},{0x6427, 0x9381},{0x6428, 0x9382},{0x6429, 0x9383},{0x642A, 0xCCC2},{0x642B, 0x9384},{0x642C, 0xB0E1}, - {0x642D, 0xB4EE},{0x642E, 0x9385},{0x642F, 0x9386},{0x6430, 0x9387},{0x6431, 0x9388},{0x6432, 0x9389},{0x6433, 0x938A},{0x6434, 0xE5BA}, - {0x6435, 0x938B},{0x6436, 0x938C},{0x6437, 0x938D},{0x6438, 0x938E},{0x6439, 0x938F},{0x643A, 0xD0AF},{0x643B, 0x9390},{0x643C, 0x9391}, - {0x643D, 0xB2EB},{0x643E, 0x9392},{0x643F, 0xEBA1},{0x6440, 0x9393},{0x6441, 0xDEF4},{0x6442, 0x9394},{0x6443, 0x9395},{0x6444, 0xC9E3}, - {0x6445, 0xDEF3},{0x6446, 0xB0DA},{0x6447, 0xD2A1},{0x6448, 0xB1F7},{0x6449, 0x9396},{0x644A, 0xCCAF},{0x644B, 0x9397},{0x644C, 0x9398}, - {0x644D, 0x9399},{0x644E, 0x939A},{0x644F, 0x939B},{0x6450, 0x939C},{0x6451, 0x939D},{0x6452, 0xDEF0},{0x6453, 0x939E},{0x6454, 0xCBA4}, - {0x6455, 0x939F},{0x6456, 0x93A0},{0x6457, 0x93A1},{0x6458, 0xD5AA},{0x6459, 0x93A2},{0x645A, 0x93A3},{0x645B, 0x93A4},{0x645C, 0x93A5}, - {0x645D, 0x93A6},{0x645E, 0xDEFB},{0x645F, 0x93A7},{0x6460, 0x93A8},{0x6461, 0x93A9},{0x6462, 0x93AA},{0x6463, 0x93AB},{0x6464, 0x93AC}, - {0x6465, 0x93AD},{0x6466, 0x93AE},{0x6467, 0xB4DD},{0x6468, 0x93AF},{0x6469, 0xC4A6},{0x646A, 0x93B0},{0x646B, 0x93B1},{0x646C, 0x93B2}, - {0x646D, 0xDEFD},{0x646E, 0x93B3},{0x646F, 0x93B4},{0x6470, 0x93B5},{0x6471, 0x93B6},{0x6472, 0x93B7},{0x6473, 0x93B8},{0x6474, 0x93B9}, - {0x6475, 0x93BA},{0x6476, 0x93BB},{0x6477, 0x93BC},{0x6478, 0xC3FE},{0x6479, 0xC4A1},{0x647A, 0xDFA1},{0x647B, 0x93BD},{0x647C, 0x93BE}, - {0x647D, 0x93BF},{0x647E, 0x93C0},{0x647F, 0x93C1},{0x6480, 0x93C2},{0x6481, 0x93C3},{0x6482, 0xC1CC},{0x6483, 0x93C4},{0x6484, 0xDEFC}, - {0x6485, 0xBEEF},{0x6486, 0x93C5},{0x6487, 0xC6B2},{0x6488, 0x93C6},{0x6489, 0x93C7},{0x648A, 0x93C8},{0x648B, 0x93C9},{0x648C, 0x93CA}, - {0x648D, 0x93CB},{0x648E, 0x93CC},{0x648F, 0x93CD},{0x6490, 0x93CE},{0x6491, 0xB3C5},{0x6492, 0xC8F6},{0x6493, 0x93CF},{0x6494, 0x93D0}, - {0x6495, 0xCBBA},{0x6496, 0xDEFE},{0x6497, 0x93D1},{0x6498, 0x93D2},{0x6499, 0xDFA4},{0x649A, 0x93D3},{0x649B, 0x93D4},{0x649C, 0x93D5}, - {0x649D, 0x93D6},{0x649E, 0xD7B2},{0x649F, 0x93D7},{0x64A0, 0x93D8},{0x64A1, 0x93D9},{0x64A2, 0x93DA},{0x64A3, 0x93DB},{0x64A4, 0xB3B7}, - {0x64A5, 0x93DC},{0x64A6, 0x93DD},{0x64A7, 0x93DE},{0x64A8, 0x93DF},{0x64A9, 0xC1C3},{0x64AA, 0x93E0},{0x64AB, 0x93E1},{0x64AC, 0xC7CB}, - {0x64AD, 0xB2A5},{0x64AE, 0xB4E9},{0x64AF, 0x93E2},{0x64B0, 0xD7AB},{0x64B1, 0x93E3},{0x64B2, 0x93E4},{0x64B3, 0x93E5},{0x64B4, 0x93E6}, - {0x64B5, 0xC4EC},{0x64B6, 0x93E7},{0x64B7, 0xDFA2},{0x64B8, 0xDFA3},{0x64B9, 0x93E8},{0x64BA, 0xDFA5},{0x64BB, 0x93E9},{0x64BC, 0xBAB3}, - {0x64BD, 0x93EA},{0x64BE, 0x93EB},{0x64BF, 0x93EC},{0x64C0, 0xDFA6},{0x64C1, 0x93ED},{0x64C2, 0xC0DE},{0x64C3, 0x93EE},{0x64C4, 0x93EF}, - {0x64C5, 0xC9C3},{0x64C6, 0x93F0},{0x64C7, 0x93F1},{0x64C8, 0x93F2},{0x64C9, 0x93F3},{0x64CA, 0x93F4},{0x64CB, 0x93F5},{0x64CC, 0x93F6}, - {0x64CD, 0xB2D9},{0x64CE, 0xC7E6},{0x64CF, 0x93F7},{0x64D0, 0xDFA7},{0x64D1, 0x93F8},{0x64D2, 0xC7DC},{0x64D3, 0x93F9},{0x64D4, 0x93FA}, - {0x64D5, 0x93FB},{0x64D6, 0x93FC},{0x64D7, 0xDFA8},{0x64D8, 0xEBA2},{0x64D9, 0x93FD},{0x64DA, 0x93FE},{0x64DB, 0x9440},{0x64DC, 0x9441}, - {0x64DD, 0x9442},{0x64DE, 0xCBD3},{0x64DF, 0x9443},{0x64E0, 0x9444},{0x64E1, 0x9445},{0x64E2, 0xDFAA},{0x64E3, 0x9446},{0x64E4, 0xDFA9}, - {0x64E5, 0x9447},{0x64E6, 0xB2C1},{0x64E7, 0x9448},{0x64E8, 0x9449},{0x64E9, 0x944A},{0x64EA, 0x944B},{0x64EB, 0x944C},{0x64EC, 0x944D}, - {0x64ED, 0x944E},{0x64EE, 0x944F},{0x64EF, 0x9450},{0x64F0, 0x9451},{0x64F1, 0x9452},{0x64F2, 0x9453},{0x64F3, 0x9454},{0x64F4, 0x9455}, - {0x64F5, 0x9456},{0x64F6, 0x9457},{0x64F7, 0x9458},{0x64F8, 0x9459},{0x64F9, 0x945A},{0x64FA, 0x945B},{0x64FB, 0x945C},{0x64FC, 0x945D}, - {0x64FD, 0x945E},{0x64FE, 0x945F},{0x64FF, 0x9460},{0x6500, 0xC5CA},{0x6501, 0x9461},{0x6502, 0x9462},{0x6503, 0x9463},{0x6504, 0x9464}, - {0x6505, 0x9465},{0x6506, 0x9466},{0x6507, 0x9467},{0x6508, 0x9468},{0x6509, 0xDFAB},{0x650A, 0x9469},{0x650B, 0x946A},{0x650C, 0x946B}, - {0x650D, 0x946C},{0x650E, 0x946D},{0x650F, 0x946E},{0x6510, 0x946F},{0x6511, 0x9470},{0x6512, 0xD4DC},{0x6513, 0x9471},{0x6514, 0x9472}, - {0x6515, 0x9473},{0x6516, 0x9474},{0x6517, 0x9475},{0x6518, 0xC8C1},{0x6519, 0x9476},{0x651A, 0x9477},{0x651B, 0x9478},{0x651C, 0x9479}, - {0x651D, 0x947A},{0x651E, 0x947B},{0x651F, 0x947C},{0x6520, 0x947D},{0x6521, 0x947E},{0x6522, 0x9480},{0x6523, 0x9481},{0x6524, 0x9482}, - {0x6525, 0xDFAC},{0x6526, 0x9483},{0x6527, 0x9484},{0x6528, 0x9485},{0x6529, 0x9486},{0x652A, 0x9487},{0x652B, 0xBEF0},{0x652C, 0x9488}, - {0x652D, 0x9489},{0x652E, 0xDFAD},{0x652F, 0xD6A7},{0x6530, 0x948A},{0x6531, 0x948B},{0x6532, 0x948C},{0x6533, 0x948D},{0x6534, 0xEAB7}, - {0x6535, 0xEBB6},{0x6536, 0xCAD5},{0x6537, 0x948E},{0x6538, 0xD8FC},{0x6539, 0xB8C4},{0x653A, 0x948F},{0x653B, 0xB9A5},{0x653C, 0x9490}, - {0x653D, 0x9491},{0x653E, 0xB7C5},{0x653F, 0xD5FE},{0x6540, 0x9492},{0x6541, 0x9493},{0x6542, 0x9494},{0x6543, 0x9495},{0x6544, 0x9496}, - {0x6545, 0xB9CA},{0x6546, 0x9497},{0x6547, 0x9498},{0x6548, 0xD0A7},{0x6549, 0xF4CD},{0x654A, 0x9499},{0x654B, 0x949A},{0x654C, 0xB5D0}, - {0x654D, 0x949B},{0x654E, 0x949C},{0x654F, 0xC3F4},{0x6550, 0x949D},{0x6551, 0xBEC8},{0x6552, 0x949E},{0x6553, 0x949F},{0x6554, 0x94A0}, - {0x6555, 0xEBB7},{0x6556, 0xB0BD},{0x6557, 0x94A1},{0x6558, 0x94A2},{0x6559, 0xBDCC},{0x655A, 0x94A3},{0x655B, 0xC1B2},{0x655C, 0x94A4}, - {0x655D, 0xB1D6},{0x655E, 0xB3A8},{0x655F, 0x94A5},{0x6560, 0x94A6},{0x6561, 0x94A7},{0x6562, 0xB8D2},{0x6563, 0xC9A2},{0x6564, 0x94A8}, - {0x6565, 0x94A9},{0x6566, 0xB6D8},{0x6567, 0x94AA},{0x6568, 0x94AB},{0x6569, 0x94AC},{0x656A, 0x94AD},{0x656B, 0xEBB8},{0x656C, 0xBEB4}, - {0x656D, 0x94AE},{0x656E, 0x94AF},{0x656F, 0x94B0},{0x6570, 0xCAFD},{0x6571, 0x94B1},{0x6572, 0xC7C3},{0x6573, 0x94B2},{0x6574, 0xD5FB}, - {0x6575, 0x94B3},{0x6576, 0x94B4},{0x6577, 0xB7F3},{0x6578, 0x94B5},{0x6579, 0x94B6},{0x657A, 0x94B7},{0x657B, 0x94B8},{0x657C, 0x94B9}, - {0x657D, 0x94BA},{0x657E, 0x94BB},{0x657F, 0x94BC},{0x6580, 0x94BD},{0x6581, 0x94BE},{0x6582, 0x94BF},{0x6583, 0x94C0},{0x6584, 0x94C1}, - {0x6585, 0x94C2},{0x6586, 0x94C3},{0x6587, 0xCEC4},{0x6588, 0x94C4},{0x6589, 0x94C5},{0x658A, 0x94C6},{0x658B, 0xD5AB},{0x658C, 0xB1F3}, - {0x658D, 0x94C7},{0x658E, 0x94C8},{0x658F, 0x94C9},{0x6590, 0xECB3},{0x6591, 0xB0DF},{0x6592, 0x94CA},{0x6593, 0xECB5},{0x6594, 0x94CB}, - {0x6595, 0x94CC},{0x6596, 0x94CD},{0x6597, 0xB6B7},{0x6598, 0x94CE},{0x6599, 0xC1CF},{0x659A, 0x94CF},{0x659B, 0xF5FA},{0x659C, 0xD0B1}, - {0x659D, 0x94D0},{0x659E, 0x94D1},{0x659F, 0xD5E5},{0x65A0, 0x94D2},{0x65A1, 0xCED3},{0x65A2, 0x94D3},{0x65A3, 0x94D4},{0x65A4, 0xBDEF}, - {0x65A5, 0xB3E2},{0x65A6, 0x94D5},{0x65A7, 0xB8AB},{0x65A8, 0x94D6},{0x65A9, 0xD5B6},{0x65AA, 0x94D7},{0x65AB, 0xEDBD},{0x65AC, 0x94D8}, - {0x65AD, 0xB6CF},{0x65AE, 0x94D9},{0x65AF, 0xCBB9},{0x65B0, 0xD0C2},{0x65B1, 0x94DA},{0x65B2, 0x94DB},{0x65B3, 0x94DC},{0x65B4, 0x94DD}, - {0x65B5, 0x94DE},{0x65B6, 0x94DF},{0x65B7, 0x94E0},{0x65B8, 0x94E1},{0x65B9, 0xB7BD},{0x65BA, 0x94E2},{0x65BB, 0x94E3},{0x65BC, 0xECB6}, - {0x65BD, 0xCAA9},{0x65BE, 0x94E4},{0x65BF, 0x94E5},{0x65C0, 0x94E6},{0x65C1, 0xC5D4},{0x65C2, 0x94E7},{0x65C3, 0xECB9},{0x65C4, 0xECB8}, - {0x65C5, 0xC2C3},{0x65C6, 0xECB7},{0x65C7, 0x94E8},{0x65C8, 0x94E9},{0x65C9, 0x94EA},{0x65CA, 0x94EB},{0x65CB, 0xD0FD},{0x65CC, 0xECBA}, - {0x65CD, 0x94EC},{0x65CE, 0xECBB},{0x65CF, 0xD7E5},{0x65D0, 0x94ED},{0x65D1, 0x94EE},{0x65D2, 0xECBC},{0x65D3, 0x94EF},{0x65D4, 0x94F0}, - {0x65D5, 0x94F1},{0x65D6, 0xECBD},{0x65D7, 0xC6EC},{0x65D8, 0x94F2},{0x65D9, 0x94F3},{0x65DA, 0x94F4},{0x65DB, 0x94F5},{0x65DC, 0x94F6}, - {0x65DD, 0x94F7},{0x65DE, 0x94F8},{0x65DF, 0x94F9},{0x65E0, 0xCEDE},{0x65E1, 0x94FA},{0x65E2, 0xBCC8},{0x65E3, 0x94FB},{0x65E4, 0x94FC}, - {0x65E5, 0xC8D5},{0x65E6, 0xB5A9},{0x65E7, 0xBEC9},{0x65E8, 0xD6BC},{0x65E9, 0xD4E7},{0x65EA, 0x94FD},{0x65EB, 0x94FE},{0x65EC, 0xD1AE}, - {0x65ED, 0xD0F1},{0x65EE, 0xEAB8},{0x65EF, 0xEAB9},{0x65F0, 0xEABA},{0x65F1, 0xBAB5},{0x65F2, 0x9540},{0x65F3, 0x9541},{0x65F4, 0x9542}, - {0x65F5, 0x9543},{0x65F6, 0xCAB1},{0x65F7, 0xBFF5},{0x65F8, 0x9544},{0x65F9, 0x9545},{0x65FA, 0xCDFA},{0x65FB, 0x9546},{0x65FC, 0x9547}, - {0x65FD, 0x9548},{0x65FE, 0x9549},{0x65FF, 0x954A},{0x6600, 0xEAC0},{0x6601, 0x954B},{0x6602, 0xB0BA},{0x6603, 0xEABE},{0x6604, 0x954C}, - {0x6605, 0x954D},{0x6606, 0xC0A5},{0x6607, 0x954E},{0x6608, 0x954F},{0x6609, 0x9550},{0x660A, 0xEABB},{0x660B, 0x9551},{0x660C, 0xB2FD}, - {0x660D, 0x9552},{0x660E, 0xC3F7},{0x660F, 0xBBE8},{0x6610, 0x9553},{0x6611, 0x9554},{0x6612, 0x9555},{0x6613, 0xD2D7},{0x6614, 0xCEF4}, - {0x6615, 0xEABF},{0x6616, 0x9556},{0x6617, 0x9557},{0x6618, 0x9558},{0x6619, 0xEABC},{0x661A, 0x9559},{0x661B, 0x955A},{0x661C, 0x955B}, - {0x661D, 0xEAC3},{0x661E, 0x955C},{0x661F, 0xD0C7},{0x6620, 0xD3B3},{0x6621, 0x955D},{0x6622, 0x955E},{0x6623, 0x955F},{0x6624, 0x9560}, - {0x6625, 0xB4BA},{0x6626, 0x9561},{0x6627, 0xC3C1},{0x6628, 0xD7F2},{0x6629, 0x9562},{0x662A, 0x9563},{0x662B, 0x9564},{0x662C, 0x9565}, - {0x662D, 0xD5D1},{0x662E, 0x9566},{0x662F, 0xCAC7},{0x6630, 0x9567},{0x6631, 0xEAC5},{0x6632, 0x9568},{0x6633, 0x9569},{0x6634, 0xEAC4}, - {0x6635, 0xEAC7},{0x6636, 0xEAC6},{0x6637, 0x956A},{0x6638, 0x956B},{0x6639, 0x956C},{0x663A, 0x956D},{0x663B, 0x956E},{0x663C, 0xD6E7}, - {0x663D, 0x956F},{0x663E, 0xCFD4},{0x663F, 0x9570},{0x6640, 0x9571},{0x6641, 0xEACB},{0x6642, 0x9572},{0x6643, 0xBBCE},{0x6644, 0x9573}, - {0x6645, 0x9574},{0x6646, 0x9575},{0x6647, 0x9576},{0x6648, 0x9577},{0x6649, 0x9578},{0x664A, 0x9579},{0x664B, 0xBDFA},{0x664C, 0xC9CE}, - {0x664D, 0x957A},{0x664E, 0x957B},{0x664F, 0xEACC},{0x6650, 0x957C},{0x6651, 0x957D},{0x6652, 0xC9B9},{0x6653, 0xCFFE},{0x6654, 0xEACA}, - {0x6655, 0xD4CE},{0x6656, 0xEACD},{0x6657, 0xEACF},{0x6658, 0x957E},{0x6659, 0x9580},{0x665A, 0xCDED},{0x665B, 0x9581},{0x665C, 0x9582}, - {0x665D, 0x9583},{0x665E, 0x9584},{0x665F, 0xEAC9},{0x6660, 0x9585},{0x6661, 0xEACE},{0x6662, 0x9586},{0x6663, 0x9587},{0x6664, 0xCEEE}, - {0x6665, 0x9588},{0x6666, 0xBBDE},{0x6667, 0x9589},{0x6668, 0xB3BF},{0x6669, 0x958A},{0x666A, 0x958B},{0x666B, 0x958C},{0x666C, 0x958D}, - {0x666D, 0x958E},{0x666E, 0xC6D5},{0x666F, 0xBEB0},{0x6670, 0xCEFA},{0x6671, 0x958F},{0x6672, 0x9590},{0x6673, 0x9591},{0x6674, 0xC7E7}, - {0x6675, 0x9592},{0x6676, 0xBEA7},{0x6677, 0xEAD0},{0x6678, 0x9593},{0x6679, 0x9594},{0x667A, 0xD6C7},{0x667B, 0x9595},{0x667C, 0x9596}, - {0x667D, 0x9597},{0x667E, 0xC1C0},{0x667F, 0x9598},{0x6680, 0x9599},{0x6681, 0x959A},{0x6682, 0xD4DD},{0x6683, 0x959B},{0x6684, 0xEAD1}, - {0x6685, 0x959C},{0x6686, 0x959D},{0x6687, 0xCFBE},{0x6688, 0x959E},{0x6689, 0x959F},{0x668A, 0x95A0},{0x668B, 0x95A1},{0x668C, 0xEAD2}, - {0x668D, 0x95A2},{0x668E, 0x95A3},{0x668F, 0x95A4},{0x6690, 0x95A5},{0x6691, 0xCAEE},{0x6692, 0x95A6},{0x6693, 0x95A7},{0x6694, 0x95A8}, - {0x6695, 0x95A9},{0x6696, 0xC5AF},{0x6697, 0xB0B5},{0x6698, 0x95AA},{0x6699, 0x95AB},{0x669A, 0x95AC},{0x669B, 0x95AD},{0x669C, 0x95AE}, - {0x669D, 0xEAD4},{0x669E, 0x95AF},{0x669F, 0x95B0},{0x66A0, 0x95B1},{0x66A1, 0x95B2},{0x66A2, 0x95B3},{0x66A3, 0x95B4},{0x66A4, 0x95B5}, - {0x66A5, 0x95B6},{0x66A6, 0x95B7},{0x66A7, 0xEAD3},{0x66A8, 0xF4DF},{0x66A9, 0x95B8},{0x66AA, 0x95B9},{0x66AB, 0x95BA},{0x66AC, 0x95BB}, - {0x66AD, 0x95BC},{0x66AE, 0xC4BA},{0x66AF, 0x95BD},{0x66B0, 0x95BE},{0x66B1, 0x95BF},{0x66B2, 0x95C0},{0x66B3, 0x95C1},{0x66B4, 0xB1A9}, - {0x66B5, 0x95C2},{0x66B6, 0x95C3},{0x66B7, 0x95C4},{0x66B8, 0x95C5},{0x66B9, 0xE5DF},{0x66BA, 0x95C6},{0x66BB, 0x95C7},{0x66BC, 0x95C8}, - {0x66BD, 0x95C9},{0x66BE, 0xEAD5},{0x66BF, 0x95CA},{0x66C0, 0x95CB},{0x66C1, 0x95CC},{0x66C2, 0x95CD},{0x66C3, 0x95CE},{0x66C4, 0x95CF}, - {0x66C5, 0x95D0},{0x66C6, 0x95D1},{0x66C7, 0x95D2},{0x66C8, 0x95D3},{0x66C9, 0x95D4},{0x66CA, 0x95D5},{0x66CB, 0x95D6},{0x66CC, 0x95D7}, - {0x66CD, 0x95D8},{0x66CE, 0x95D9},{0x66CF, 0x95DA},{0x66D0, 0x95DB},{0x66D1, 0x95DC},{0x66D2, 0x95DD},{0x66D3, 0x95DE},{0x66D4, 0x95DF}, - {0x66D5, 0x95E0},{0x66D6, 0x95E1},{0x66D7, 0x95E2},{0x66D8, 0x95E3},{0x66D9, 0xCAEF},{0x66DA, 0x95E4},{0x66DB, 0xEAD6},{0x66DC, 0xEAD7}, - {0x66DD, 0xC6D8},{0x66DE, 0x95E5},{0x66DF, 0x95E6},{0x66E0, 0x95E7},{0x66E1, 0x95E8},{0x66E2, 0x95E9},{0x66E3, 0x95EA},{0x66E4, 0x95EB}, - {0x66E5, 0x95EC},{0x66E6, 0xEAD8},{0x66E7, 0x95ED},{0x66E8, 0x95EE},{0x66E9, 0xEAD9},{0x66EA, 0x95EF},{0x66EB, 0x95F0},{0x66EC, 0x95F1}, - {0x66ED, 0x95F2},{0x66EE, 0x95F3},{0x66EF, 0x95F4},{0x66F0, 0xD4BB},{0x66F1, 0x95F5},{0x66F2, 0xC7FA},{0x66F3, 0xD2B7},{0x66F4, 0xB8FC}, - {0x66F5, 0x95F6},{0x66F6, 0x95F7},{0x66F7, 0xEAC2},{0x66F8, 0x95F8},{0x66F9, 0xB2DC},{0x66FA, 0x95F9},{0x66FB, 0x95FA},{0x66FC, 0xC2FC}, - {0x66FD, 0x95FB},{0x66FE, 0xD4F8},{0x66FF, 0xCCE6},{0x6700, 0xD7EE},{0x6701, 0x95FC},{0x6702, 0x95FD},{0x6703, 0x95FE},{0x6704, 0x9640}, - {0x6705, 0x9641},{0x6706, 0x9642},{0x6707, 0x9643},{0x6708, 0xD4C2},{0x6709, 0xD3D0},{0x670A, 0xEBC3},{0x670B, 0xC5F3},{0x670C, 0x9644}, - {0x670D, 0xB7FE},{0x670E, 0x9645},{0x670F, 0x9646},{0x6710, 0xEBD4},{0x6711, 0x9647},{0x6712, 0x9648},{0x6713, 0x9649},{0x6714, 0xCBB7}, - {0x6715, 0xEBDE},{0x6716, 0x964A},{0x6717, 0xC0CA},{0x6718, 0x964B},{0x6719, 0x964C},{0x671A, 0x964D},{0x671B, 0xCDFB},{0x671C, 0x964E}, - {0x671D, 0xB3AF},{0x671E, 0x964F},{0x671F, 0xC6DA},{0x6720, 0x9650},{0x6721, 0x9651},{0x6722, 0x9652},{0x6723, 0x9653},{0x6724, 0x9654}, - {0x6725, 0x9655},{0x6726, 0xEBFC},{0x6727, 0x9656},{0x6728, 0xC4BE},{0x6729, 0x9657},{0x672A, 0xCEB4},{0x672B, 0xC4A9},{0x672C, 0xB1BE}, - {0x672D, 0xD4FD},{0x672E, 0x9658},{0x672F, 0xCAF5},{0x6730, 0x9659},{0x6731, 0xD6EC},{0x6732, 0x965A},{0x6733, 0x965B},{0x6734, 0xC6D3}, - {0x6735, 0xB6E4},{0x6736, 0x965C},{0x6737, 0x965D},{0x6738, 0x965E},{0x6739, 0x965F},{0x673A, 0xBBFA},{0x673B, 0x9660},{0x673C, 0x9661}, - {0x673D, 0xD0E0},{0x673E, 0x9662},{0x673F, 0x9663},{0x6740, 0xC9B1},{0x6741, 0x9664},{0x6742, 0xD4D3},{0x6743, 0xC8A8},{0x6744, 0x9665}, - {0x6745, 0x9666},{0x6746, 0xB8CB},{0x6747, 0x9667},{0x6748, 0xE8BE},{0x6749, 0xC9BC},{0x674A, 0x9668},{0x674B, 0x9669},{0x674C, 0xE8BB}, - {0x674D, 0x966A},{0x674E, 0xC0EE},{0x674F, 0xD0D3},{0x6750, 0xB2C4},{0x6751, 0xB4E5},{0x6752, 0x966B},{0x6753, 0xE8BC},{0x6754, 0x966C}, - {0x6755, 0x966D},{0x6756, 0xD5C8},{0x6757, 0x966E},{0x6758, 0x966F},{0x6759, 0x9670},{0x675A, 0x9671},{0x675B, 0x9672},{0x675C, 0xB6C5}, - {0x675D, 0x9673},{0x675E, 0xE8BD},{0x675F, 0xCAF8},{0x6760, 0xB8DC},{0x6761, 0xCCF5},{0x6762, 0x9674},{0x6763, 0x9675},{0x6764, 0x9676}, - {0x6765, 0xC0B4},{0x6766, 0x9677},{0x6767, 0x9678},{0x6768, 0xD1EE},{0x6769, 0xE8BF},{0x676A, 0xE8C2},{0x676B, 0x9679},{0x676C, 0x967A}, - {0x676D, 0xBABC},{0x676E, 0x967B},{0x676F, 0xB1AD},{0x6770, 0xBDDC},{0x6771, 0x967C},{0x6772, 0xEABD},{0x6773, 0xE8C3},{0x6774, 0x967D}, - {0x6775, 0xE8C6},{0x6776, 0x967E},{0x6777, 0xE8CB},{0x6778, 0x9680},{0x6779, 0x9681},{0x677A, 0x9682},{0x677B, 0x9683},{0x677C, 0xE8CC}, - {0x677D, 0x9684},{0x677E, 0xCBC9},{0x677F, 0xB0E5},{0x6780, 0x9685},{0x6781, 0xBCAB},{0x6782, 0x9686},{0x6783, 0x9687},{0x6784, 0xB9B9}, - {0x6785, 0x9688},{0x6786, 0x9689},{0x6787, 0xE8C1},{0x6788, 0x968A},{0x6789, 0xCDF7},{0x678A, 0x968B},{0x678B, 0xE8CA},{0x678C, 0x968C}, - {0x678D, 0x968D},{0x678E, 0x968E},{0x678F, 0x968F},{0x6790, 0xCEF6},{0x6791, 0x9690},{0x6792, 0x9691},{0x6793, 0x9692},{0x6794, 0x9693}, - {0x6795, 0xD5ED},{0x6796, 0x9694},{0x6797, 0xC1D6},{0x6798, 0xE8C4},{0x6799, 0x9695},{0x679A, 0xC3B6},{0x679B, 0x9696},{0x679C, 0xB9FB}, - {0x679D, 0xD6A6},{0x679E, 0xE8C8},{0x679F, 0x9697},{0x67A0, 0x9698},{0x67A1, 0x9699},{0x67A2, 0xCAE0},{0x67A3, 0xD4E6},{0x67A4, 0x969A}, - {0x67A5, 0xE8C0},{0x67A6, 0x969B},{0x67A7, 0xE8C5},{0x67A8, 0xE8C7},{0x67A9, 0x969C},{0x67AA, 0xC7B9},{0x67AB, 0xB7E3},{0x67AC, 0x969D}, - {0x67AD, 0xE8C9},{0x67AE, 0x969E},{0x67AF, 0xBFDD},{0x67B0, 0xE8D2},{0x67B1, 0x969F},{0x67B2, 0x96A0},{0x67B3, 0xE8D7},{0x67B4, 0x96A1}, - {0x67B5, 0xE8D5},{0x67B6, 0xBCDC},{0x67B7, 0xBCCF},{0x67B8, 0xE8DB},{0x67B9, 0x96A2},{0x67BA, 0x96A3},{0x67BB, 0x96A4},{0x67BC, 0x96A5}, - {0x67BD, 0x96A6},{0x67BE, 0x96A7},{0x67BF, 0x96A8},{0x67C0, 0x96A9},{0x67C1, 0xE8DE},{0x67C2, 0x96AA},{0x67C3, 0xE8DA},{0x67C4, 0xB1FA}, - {0x67C5, 0x96AB},{0x67C6, 0x96AC},{0x67C7, 0x96AD},{0x67C8, 0x96AE},{0x67C9, 0x96AF},{0x67CA, 0x96B0},{0x67CB, 0x96B1},{0x67CC, 0x96B2}, - {0x67CD, 0x96B3},{0x67CE, 0x96B4},{0x67CF, 0xB0D8},{0x67D0, 0xC4B3},{0x67D1, 0xB8CC},{0x67D2, 0xC6E2},{0x67D3, 0xC8BE},{0x67D4, 0xC8E1}, - {0x67D5, 0x96B5},{0x67D6, 0x96B6},{0x67D7, 0x96B7},{0x67D8, 0xE8CF},{0x67D9, 0xE8D4},{0x67DA, 0xE8D6},{0x67DB, 0x96B8},{0x67DC, 0xB9F1}, - {0x67DD, 0xE8D8},{0x67DE, 0xD7F5},{0x67DF, 0x96B9},{0x67E0, 0xC4FB},{0x67E1, 0x96BA},{0x67E2, 0xE8DC},{0x67E3, 0x96BB},{0x67E4, 0x96BC}, - {0x67E5, 0xB2E9},{0x67E6, 0x96BD},{0x67E7, 0x96BE},{0x67E8, 0x96BF},{0x67E9, 0xE8D1},{0x67EA, 0x96C0},{0x67EB, 0x96C1},{0x67EC, 0xBCED}, - {0x67ED, 0x96C2},{0x67EE, 0x96C3},{0x67EF, 0xBFC2},{0x67F0, 0xE8CD},{0x67F1, 0xD6F9},{0x67F2, 0x96C4},{0x67F3, 0xC1F8},{0x67F4, 0xB2F1}, - {0x67F5, 0x96C5},{0x67F6, 0x96C6},{0x67F7, 0x96C7},{0x67F8, 0x96C8},{0x67F9, 0x96C9},{0x67FA, 0x96CA},{0x67FB, 0x96CB},{0x67FC, 0x96CC}, - {0x67FD, 0xE8DF},{0x67FE, 0x96CD},{0x67FF, 0xCAC1},{0x6800, 0xE8D9},{0x6801, 0x96CE},{0x6802, 0x96CF},{0x6803, 0x96D0},{0x6804, 0x96D1}, - {0x6805, 0xD5A4},{0x6806, 0x96D2},{0x6807, 0xB1EA},{0x6808, 0xD5BB},{0x6809, 0xE8CE},{0x680A, 0xE8D0},{0x680B, 0xB6B0},{0x680C, 0xE8D3}, - {0x680D, 0x96D3},{0x680E, 0xE8DD},{0x680F, 0xC0B8},{0x6810, 0x96D4},{0x6811, 0xCAF7},{0x6812, 0x96D5},{0x6813, 0xCBA8},{0x6814, 0x96D6}, - {0x6815, 0x96D7},{0x6816, 0xC6DC},{0x6817, 0xC0F5},{0x6818, 0x96D8},{0x6819, 0x96D9},{0x681A, 0x96DA},{0x681B, 0x96DB},{0x681C, 0x96DC}, - {0x681D, 0xE8E9},{0x681E, 0x96DD},{0x681F, 0x96DE},{0x6820, 0x96DF},{0x6821, 0xD0A3},{0x6822, 0x96E0},{0x6823, 0x96E1},{0x6824, 0x96E2}, - {0x6825, 0x96E3},{0x6826, 0x96E4},{0x6827, 0x96E5},{0x6828, 0x96E6},{0x6829, 0xE8F2},{0x682A, 0xD6EA},{0x682B, 0x96E7},{0x682C, 0x96E8}, - {0x682D, 0x96E9},{0x682E, 0x96EA},{0x682F, 0x96EB},{0x6830, 0x96EC},{0x6831, 0x96ED},{0x6832, 0xE8E0},{0x6833, 0xE8E1},{0x6834, 0x96EE}, - {0x6835, 0x96EF},{0x6836, 0x96F0},{0x6837, 0xD1F9},{0x6838, 0xBACB},{0x6839, 0xB8F9},{0x683A, 0x96F1},{0x683B, 0x96F2},{0x683C, 0xB8F1}, - {0x683D, 0xD4D4},{0x683E, 0xE8EF},{0x683F, 0x96F3},{0x6840, 0xE8EE},{0x6841, 0xE8EC},{0x6842, 0xB9F0},{0x6843, 0xCCD2},{0x6844, 0xE8E6}, - {0x6845, 0xCEA6},{0x6846, 0xBFF2},{0x6847, 0x96F4},{0x6848, 0xB0B8},{0x6849, 0xE8F1},{0x684A, 0xE8F0},{0x684B, 0x96F5},{0x684C, 0xD7C0}, - {0x684D, 0x96F6},{0x684E, 0xE8E4},{0x684F, 0x96F7},{0x6850, 0xCDA9},{0x6851, 0xC9A3},{0x6852, 0x96F8},{0x6853, 0xBBB8},{0x6854, 0xBDDB}, - {0x6855, 0xE8EA},{0x6856, 0x96F9},{0x6857, 0x96FA},{0x6858, 0x96FB},{0x6859, 0x96FC},{0x685A, 0x96FD},{0x685B, 0x96FE},{0x685C, 0x9740}, - {0x685D, 0x9741},{0x685E, 0x9742},{0x685F, 0x9743},{0x6860, 0xE8E2},{0x6861, 0xE8E3},{0x6862, 0xE8E5},{0x6863, 0xB5B5},{0x6864, 0xE8E7}, - {0x6865, 0xC7C5},{0x6866, 0xE8EB},{0x6867, 0xE8ED},{0x6868, 0xBDB0},{0x6869, 0xD7AE},{0x686A, 0x9744},{0x686B, 0xE8F8},{0x686C, 0x9745}, - {0x686D, 0x9746},{0x686E, 0x9747},{0x686F, 0x9748},{0x6870, 0x9749},{0x6871, 0x974A},{0x6872, 0x974B},{0x6873, 0x974C},{0x6874, 0xE8F5}, - {0x6875, 0x974D},{0x6876, 0xCDB0},{0x6877, 0xE8F6},{0x6878, 0x974E},{0x6879, 0x974F},{0x687A, 0x9750},{0x687B, 0x9751},{0x687C, 0x9752}, - {0x687D, 0x9753},{0x687E, 0x9754},{0x687F, 0x9755},{0x6880, 0x9756},{0x6881, 0xC1BA},{0x6882, 0x9757},{0x6883, 0xE8E8},{0x6884, 0x9758}, - {0x6885, 0xC3B7},{0x6886, 0xB0F0},{0x6887, 0x9759},{0x6888, 0x975A},{0x6889, 0x975B},{0x688A, 0x975C},{0x688B, 0x975D},{0x688C, 0x975E}, - {0x688D, 0x975F},{0x688E, 0x9760},{0x688F, 0xE8F4},{0x6890, 0x9761},{0x6891, 0x9762},{0x6892, 0x9763},{0x6893, 0xE8F7},{0x6894, 0x9764}, - {0x6895, 0x9765},{0x6896, 0x9766},{0x6897, 0xB9A3},{0x6898, 0x9767},{0x6899, 0x9768},{0x689A, 0x9769},{0x689B, 0x976A},{0x689C, 0x976B}, - {0x689D, 0x976C},{0x689E, 0x976D},{0x689F, 0x976E},{0x68A0, 0x976F},{0x68A1, 0x9770},{0x68A2, 0xC9D2},{0x68A3, 0x9771},{0x68A4, 0x9772}, - {0x68A5, 0x9773},{0x68A6, 0xC3CE},{0x68A7, 0xCEE0},{0x68A8, 0xC0E6},{0x68A9, 0x9774},{0x68AA, 0x9775},{0x68AB, 0x9776},{0x68AC, 0x9777}, - {0x68AD, 0xCBF3},{0x68AE, 0x9778},{0x68AF, 0xCCDD},{0x68B0, 0xD0B5},{0x68B1, 0x9779},{0x68B2, 0x977A},{0x68B3, 0xCAE1},{0x68B4, 0x977B}, - {0x68B5, 0xE8F3},{0x68B6, 0x977C},{0x68B7, 0x977D},{0x68B8, 0x977E},{0x68B9, 0x9780},{0x68BA, 0x9781},{0x68BB, 0x9782},{0x68BC, 0x9783}, - {0x68BD, 0x9784},{0x68BE, 0x9785},{0x68BF, 0x9786},{0x68C0, 0xBCEC},{0x68C1, 0x9787},{0x68C2, 0xE8F9},{0x68C3, 0x9788},{0x68C4, 0x9789}, - {0x68C5, 0x978A},{0x68C6, 0x978B},{0x68C7, 0x978C},{0x68C8, 0x978D},{0x68C9, 0xC3DE},{0x68CA, 0x978E},{0x68CB, 0xC6E5},{0x68CC, 0x978F}, - {0x68CD, 0xB9F7},{0x68CE, 0x9790},{0x68CF, 0x9791},{0x68D0, 0x9792},{0x68D1, 0x9793},{0x68D2, 0xB0F4},{0x68D3, 0x9794},{0x68D4, 0x9795}, - {0x68D5, 0xD7D8},{0x68D6, 0x9796},{0x68D7, 0x9797},{0x68D8, 0xBCAC},{0x68D9, 0x9798},{0x68DA, 0xC5EF},{0x68DB, 0x9799},{0x68DC, 0x979A}, - {0x68DD, 0x979B},{0x68DE, 0x979C},{0x68DF, 0x979D},{0x68E0, 0xCCC4},{0x68E1, 0x979E},{0x68E2, 0x979F},{0x68E3, 0xE9A6},{0x68E4, 0x97A0}, - {0x68E5, 0x97A1},{0x68E6, 0x97A2},{0x68E7, 0x97A3},{0x68E8, 0x97A4},{0x68E9, 0x97A5},{0x68EA, 0x97A6},{0x68EB, 0x97A7},{0x68EC, 0x97A8}, - {0x68ED, 0x97A9},{0x68EE, 0xC9AD},{0x68EF, 0x97AA},{0x68F0, 0xE9A2},{0x68F1, 0xC0E2},{0x68F2, 0x97AB},{0x68F3, 0x97AC},{0x68F4, 0x97AD}, - {0x68F5, 0xBFC3},{0x68F6, 0x97AE},{0x68F7, 0x97AF},{0x68F8, 0x97B0},{0x68F9, 0xE8FE},{0x68FA, 0xB9D7},{0x68FB, 0x97B1},{0x68FC, 0xE8FB}, - {0x68FD, 0x97B2},{0x68FE, 0x97B3},{0x68FF, 0x97B4},{0x6900, 0x97B5},{0x6901, 0xE9A4},{0x6902, 0x97B6},{0x6903, 0x97B7},{0x6904, 0x97B8}, - {0x6905, 0xD2CE},{0x6906, 0x97B9},{0x6907, 0x97BA},{0x6908, 0x97BB},{0x6909, 0x97BC},{0x690A, 0x97BD},{0x690B, 0xE9A3},{0x690C, 0x97BE}, - {0x690D, 0xD6B2},{0x690E, 0xD7B5},{0x690F, 0x97BF},{0x6910, 0xE9A7},{0x6911, 0x97C0},{0x6912, 0xBDB7},{0x6913, 0x97C1},{0x6914, 0x97C2}, - {0x6915, 0x97C3},{0x6916, 0x97C4},{0x6917, 0x97C5},{0x6918, 0x97C6},{0x6919, 0x97C7},{0x691A, 0x97C8},{0x691B, 0x97C9},{0x691C, 0x97CA}, - {0x691D, 0x97CB},{0x691E, 0x97CC},{0x691F, 0xE8FC},{0x6920, 0xE8FD},{0x6921, 0x97CD},{0x6922, 0x97CE},{0x6923, 0x97CF},{0x6924, 0xE9A1}, - {0x6925, 0x97D0},{0x6926, 0x97D1},{0x6927, 0x97D2},{0x6928, 0x97D3},{0x6929, 0x97D4},{0x692A, 0x97D5},{0x692B, 0x97D6},{0x692C, 0x97D7}, - {0x692D, 0xCDD6},{0x692E, 0x97D8},{0x692F, 0x97D9},{0x6930, 0xD2AC},{0x6931, 0x97DA},{0x6932, 0x97DB},{0x6933, 0x97DC},{0x6934, 0xE9B2}, - {0x6935, 0x97DD},{0x6936, 0x97DE},{0x6937, 0x97DF},{0x6938, 0x97E0},{0x6939, 0xE9A9},{0x693A, 0x97E1},{0x693B, 0x97E2},{0x693C, 0x97E3}, - {0x693D, 0xB4AA},{0x693E, 0x97E4},{0x693F, 0xB4BB},{0x6940, 0x97E5},{0x6941, 0x97E6},{0x6942, 0xE9AB},{0x6943, 0x97E7},{0x6944, 0x97E8}, - {0x6945, 0x97E9},{0x6946, 0x97EA},{0x6947, 0x97EB},{0x6948, 0x97EC},{0x6949, 0x97ED},{0x694A, 0x97EE},{0x694B, 0x97EF},{0x694C, 0x97F0}, - {0x694D, 0x97F1},{0x694E, 0x97F2},{0x694F, 0x97F3},{0x6950, 0x97F4},{0x6951, 0x97F5},{0x6952, 0x97F6},{0x6953, 0x97F7},{0x6954, 0xD0A8}, - {0x6955, 0x97F8},{0x6956, 0x97F9},{0x6957, 0xE9A5},{0x6958, 0x97FA},{0x6959, 0x97FB},{0x695A, 0xB3FE},{0x695B, 0x97FC},{0x695C, 0x97FD}, - {0x695D, 0xE9AC},{0x695E, 0xC0E3},{0x695F, 0x97FE},{0x6960, 0xE9AA},{0x6961, 0x9840},{0x6962, 0x9841},{0x6963, 0xE9B9},{0x6964, 0x9842}, - {0x6965, 0x9843},{0x6966, 0xE9B8},{0x6967, 0x9844},{0x6968, 0x9845},{0x6969, 0x9846},{0x696A, 0x9847},{0x696B, 0xE9AE},{0x696C, 0x9848}, - {0x696D, 0x9849},{0x696E, 0xE8FA},{0x696F, 0x984A},{0x6970, 0x984B},{0x6971, 0xE9A8},{0x6972, 0x984C},{0x6973, 0x984D},{0x6974, 0x984E}, - {0x6975, 0x984F},{0x6976, 0x9850},{0x6977, 0xBFAC},{0x6978, 0xE9B1},{0x6979, 0xE9BA},{0x697A, 0x9851},{0x697B, 0x9852},{0x697C, 0xC2A5}, - {0x697D, 0x9853},{0x697E, 0x9854},{0x697F, 0x9855},{0x6980, 0xE9AF},{0x6981, 0x9856},{0x6982, 0xB8C5},{0x6983, 0x9857},{0x6984, 0xE9AD}, - {0x6985, 0x9858},{0x6986, 0xD3DC},{0x6987, 0xE9B4},{0x6988, 0xE9B5},{0x6989, 0xE9B7},{0x698A, 0x9859},{0x698B, 0x985A},{0x698C, 0x985B}, - {0x698D, 0xE9C7},{0x698E, 0x985C},{0x698F, 0x985D},{0x6990, 0x985E},{0x6991, 0x985F},{0x6992, 0x9860},{0x6993, 0x9861},{0x6994, 0xC0C6}, - {0x6995, 0xE9C5},{0x6996, 0x9862},{0x6997, 0x9863},{0x6998, 0xE9B0},{0x6999, 0x9864},{0x699A, 0x9865},{0x699B, 0xE9BB},{0x699C, 0xB0F1}, - {0x699D, 0x9866},{0x699E, 0x9867},{0x699F, 0x9868},{0x69A0, 0x9869},{0x69A1, 0x986A},{0x69A2, 0x986B},{0x69A3, 0x986C},{0x69A4, 0x986D}, - {0x69A5, 0x986E},{0x69A6, 0x986F},{0x69A7, 0xE9BC},{0x69A8, 0xD5A5},{0x69A9, 0x9870},{0x69AA, 0x9871},{0x69AB, 0xE9BE},{0x69AC, 0x9872}, - {0x69AD, 0xE9BF},{0x69AE, 0x9873},{0x69AF, 0x9874},{0x69B0, 0x9875},{0x69B1, 0xE9C1},{0x69B2, 0x9876},{0x69B3, 0x9877},{0x69B4, 0xC1F1}, - {0x69B5, 0x9878},{0x69B6, 0x9879},{0x69B7, 0xC8B6},{0x69B8, 0x987A},{0x69B9, 0x987B},{0x69BA, 0x987C},{0x69BB, 0xE9BD},{0x69BC, 0x987D}, - {0x69BD, 0x987E},{0x69BE, 0x9880},{0x69BF, 0x9881},{0x69C0, 0x9882},{0x69C1, 0xE9C2},{0x69C2, 0x9883},{0x69C3, 0x9884},{0x69C4, 0x9885}, - {0x69C5, 0x9886},{0x69C6, 0x9887},{0x69C7, 0x9888},{0x69C8, 0x9889},{0x69C9, 0x988A},{0x69CA, 0xE9C3},{0x69CB, 0x988B},{0x69CC, 0xE9B3}, - {0x69CD, 0x988C},{0x69CE, 0xE9B6},{0x69CF, 0x988D},{0x69D0, 0xBBB1},{0x69D1, 0x988E},{0x69D2, 0x988F},{0x69D3, 0x9890},{0x69D4, 0xE9C0}, - {0x69D5, 0x9891},{0x69D6, 0x9892},{0x69D7, 0x9893},{0x69D8, 0x9894},{0x69D9, 0x9895},{0x69DA, 0x9896},{0x69DB, 0xBCF7},{0x69DC, 0x9897}, - {0x69DD, 0x9898},{0x69DE, 0x9899},{0x69DF, 0xE9C4},{0x69E0, 0xE9C6},{0x69E1, 0x989A},{0x69E2, 0x989B},{0x69E3, 0x989C},{0x69E4, 0x989D}, - {0x69E5, 0x989E},{0x69E6, 0x989F},{0x69E7, 0x98A0},{0x69E8, 0x98A1},{0x69E9, 0x98A2},{0x69EA, 0x98A3},{0x69EB, 0x98A4},{0x69EC, 0x98A5}, - {0x69ED, 0xE9CA},{0x69EE, 0x98A6},{0x69EF, 0x98A7},{0x69F0, 0x98A8},{0x69F1, 0x98A9},{0x69F2, 0xE9CE},{0x69F3, 0x98AA},{0x69F4, 0x98AB}, - {0x69F5, 0x98AC},{0x69F6, 0x98AD},{0x69F7, 0x98AE},{0x69F8, 0x98AF},{0x69F9, 0x98B0},{0x69FA, 0x98B1},{0x69FB, 0x98B2},{0x69FC, 0x98B3}, - {0x69FD, 0xB2DB},{0x69FE, 0x98B4},{0x69FF, 0xE9C8},{0x6A00, 0x98B5},{0x6A01, 0x98B6},{0x6A02, 0x98B7},{0x6A03, 0x98B8},{0x6A04, 0x98B9}, - {0x6A05, 0x98BA},{0x6A06, 0x98BB},{0x6A07, 0x98BC},{0x6A08, 0x98BD},{0x6A09, 0x98BE},{0x6A0A, 0xB7AE},{0x6A0B, 0x98BF},{0x6A0C, 0x98C0}, - {0x6A0D, 0x98C1},{0x6A0E, 0x98C2},{0x6A0F, 0x98C3},{0x6A10, 0x98C4},{0x6A11, 0x98C5},{0x6A12, 0x98C6},{0x6A13, 0x98C7},{0x6A14, 0x98C8}, - {0x6A15, 0x98C9},{0x6A16, 0x98CA},{0x6A17, 0xE9CB},{0x6A18, 0xE9CC},{0x6A19, 0x98CB},{0x6A1A, 0x98CC},{0x6A1B, 0x98CD},{0x6A1C, 0x98CE}, - {0x6A1D, 0x98CF},{0x6A1E, 0x98D0},{0x6A1F, 0xD5C1},{0x6A20, 0x98D1},{0x6A21, 0xC4A3},{0x6A22, 0x98D2},{0x6A23, 0x98D3},{0x6A24, 0x98D4}, - {0x6A25, 0x98D5},{0x6A26, 0x98D6},{0x6A27, 0x98D7},{0x6A28, 0xE9D8},{0x6A29, 0x98D8},{0x6A2A, 0xBAE1},{0x6A2B, 0x98D9},{0x6A2C, 0x98DA}, - {0x6A2D, 0x98DB},{0x6A2E, 0x98DC},{0x6A2F, 0xE9C9},{0x6A30, 0x98DD},{0x6A31, 0xD3A3},{0x6A32, 0x98DE},{0x6A33, 0x98DF},{0x6A34, 0x98E0}, - {0x6A35, 0xE9D4},{0x6A36, 0x98E1},{0x6A37, 0x98E2},{0x6A38, 0x98E3},{0x6A39, 0x98E4},{0x6A3A, 0x98E5},{0x6A3B, 0x98E6},{0x6A3C, 0x98E7}, - {0x6A3D, 0xE9D7},{0x6A3E, 0xE9D0},{0x6A3F, 0x98E8},{0x6A40, 0x98E9},{0x6A41, 0x98EA},{0x6A42, 0x98EB},{0x6A43, 0x98EC},{0x6A44, 0xE9CF}, - {0x6A45, 0x98ED},{0x6A46, 0x98EE},{0x6A47, 0xC7C1},{0x6A48, 0x98EF},{0x6A49, 0x98F0},{0x6A4A, 0x98F1},{0x6A4B, 0x98F2},{0x6A4C, 0x98F3}, - {0x6A4D, 0x98F4},{0x6A4E, 0x98F5},{0x6A4F, 0x98F6},{0x6A50, 0xE9D2},{0x6A51, 0x98F7},{0x6A52, 0x98F8},{0x6A53, 0x98F9},{0x6A54, 0x98FA}, - {0x6A55, 0x98FB},{0x6A56, 0x98FC},{0x6A57, 0x98FD},{0x6A58, 0xE9D9},{0x6A59, 0xB3C8},{0x6A5A, 0x98FE},{0x6A5B, 0xE9D3},{0x6A5C, 0x9940}, - {0x6A5D, 0x9941},{0x6A5E, 0x9942},{0x6A5F, 0x9943},{0x6A60, 0x9944},{0x6A61, 0xCFF0},{0x6A62, 0x9945},{0x6A63, 0x9946},{0x6A64, 0x9947}, - {0x6A65, 0xE9CD},{0x6A66, 0x9948},{0x6A67, 0x9949},{0x6A68, 0x994A},{0x6A69, 0x994B},{0x6A6A, 0x994C},{0x6A6B, 0x994D},{0x6A6C, 0x994E}, - {0x6A6D, 0x994F},{0x6A6E, 0x9950},{0x6A6F, 0x9951},{0x6A70, 0x9952},{0x6A71, 0xB3F7},{0x6A72, 0x9953},{0x6A73, 0x9954},{0x6A74, 0x9955}, - {0x6A75, 0x9956},{0x6A76, 0x9957},{0x6A77, 0x9958},{0x6A78, 0x9959},{0x6A79, 0xE9D6},{0x6A7A, 0x995A},{0x6A7B, 0x995B},{0x6A7C, 0xE9DA}, - {0x6A7D, 0x995C},{0x6A7E, 0x995D},{0x6A7F, 0x995E},{0x6A80, 0xCCB4},{0x6A81, 0x995F},{0x6A82, 0x9960},{0x6A83, 0x9961},{0x6A84, 0xCFAD}, - {0x6A85, 0x9962},{0x6A86, 0x9963},{0x6A87, 0x9964},{0x6A88, 0x9965},{0x6A89, 0x9966},{0x6A8A, 0x9967},{0x6A8B, 0x9968},{0x6A8C, 0x9969}, - {0x6A8D, 0x996A},{0x6A8E, 0xE9D5},{0x6A8F, 0x996B},{0x6A90, 0xE9DC},{0x6A91, 0xE9DB},{0x6A92, 0x996C},{0x6A93, 0x996D},{0x6A94, 0x996E}, - {0x6A95, 0x996F},{0x6A96, 0x9970},{0x6A97, 0xE9DE},{0x6A98, 0x9971},{0x6A99, 0x9972},{0x6A9A, 0x9973},{0x6A9B, 0x9974},{0x6A9C, 0x9975}, - {0x6A9D, 0x9976},{0x6A9E, 0x9977},{0x6A9F, 0x9978},{0x6AA0, 0xE9D1},{0x6AA1, 0x9979},{0x6AA2, 0x997A},{0x6AA3, 0x997B},{0x6AA4, 0x997C}, - {0x6AA5, 0x997D},{0x6AA6, 0x997E},{0x6AA7, 0x9980},{0x6AA8, 0x9981},{0x6AA9, 0xE9DD},{0x6AAA, 0x9982},{0x6AAB, 0xE9DF},{0x6AAC, 0xC3CA}, - {0x6AAD, 0x9983},{0x6AAE, 0x9984},{0x6AAF, 0x9985},{0x6AB0, 0x9986},{0x6AB1, 0x9987},{0x6AB2, 0x9988},{0x6AB3, 0x9989},{0x6AB4, 0x998A}, - {0x6AB5, 0x998B},{0x6AB6, 0x998C},{0x6AB7, 0x998D},{0x6AB8, 0x998E},{0x6AB9, 0x998F},{0x6ABA, 0x9990},{0x6ABB, 0x9991},{0x6ABC, 0x9992}, - {0x6ABD, 0x9993},{0x6ABE, 0x9994},{0x6ABF, 0x9995},{0x6AC0, 0x9996},{0x6AC1, 0x9997},{0x6AC2, 0x9998},{0x6AC3, 0x9999},{0x6AC4, 0x999A}, - {0x6AC5, 0x999B},{0x6AC6, 0x999C},{0x6AC7, 0x999D},{0x6AC8, 0x999E},{0x6AC9, 0x999F},{0x6ACA, 0x99A0},{0x6ACB, 0x99A1},{0x6ACC, 0x99A2}, - {0x6ACD, 0x99A3},{0x6ACE, 0x99A4},{0x6ACF, 0x99A5},{0x6AD0, 0x99A6},{0x6AD1, 0x99A7},{0x6AD2, 0x99A8},{0x6AD3, 0x99A9},{0x6AD4, 0x99AA}, - {0x6AD5, 0x99AB},{0x6AD6, 0x99AC},{0x6AD7, 0x99AD},{0x6AD8, 0x99AE},{0x6AD9, 0x99AF},{0x6ADA, 0x99B0},{0x6ADB, 0x99B1},{0x6ADC, 0x99B2}, - {0x6ADD, 0x99B3},{0x6ADE, 0x99B4},{0x6ADF, 0x99B5},{0x6AE0, 0x99B6},{0x6AE1, 0x99B7},{0x6AE2, 0x99B8},{0x6AE3, 0x99B9},{0x6AE4, 0x99BA}, - {0x6AE5, 0x99BB},{0x6AE6, 0x99BC},{0x6AE7, 0x99BD},{0x6AE8, 0x99BE},{0x6AE9, 0x99BF},{0x6AEA, 0x99C0},{0x6AEB, 0x99C1},{0x6AEC, 0x99C2}, - {0x6AED, 0x99C3},{0x6AEE, 0x99C4},{0x6AEF, 0x99C5},{0x6AF0, 0x99C6},{0x6AF1, 0x99C7},{0x6AF2, 0x99C8},{0x6AF3, 0x99C9},{0x6AF4, 0x99CA}, - {0x6AF5, 0x99CB},{0x6AF6, 0x99CC},{0x6AF7, 0x99CD},{0x6AF8, 0x99CE},{0x6AF9, 0x99CF},{0x6AFA, 0x99D0},{0x6AFB, 0x99D1},{0x6AFC, 0x99D2}, - {0x6AFD, 0x99D3},{0x6AFE, 0x99D4},{0x6AFF, 0x99D5},{0x6B00, 0x99D6},{0x6B01, 0x99D7},{0x6B02, 0x99D8},{0x6B03, 0x99D9},{0x6B04, 0x99DA}, - {0x6B05, 0x99DB},{0x6B06, 0x99DC},{0x6B07, 0x99DD},{0x6B08, 0x99DE},{0x6B09, 0x99DF},{0x6B0A, 0x99E0},{0x6B0B, 0x99E1},{0x6B0C, 0x99E2}, - {0x6B0D, 0x99E3},{0x6B0E, 0x99E4},{0x6B0F, 0x99E5},{0x6B10, 0x99E6},{0x6B11, 0x99E7},{0x6B12, 0x99E8},{0x6B13, 0x99E9},{0x6B14, 0x99EA}, - {0x6B15, 0x99EB},{0x6B16, 0x99EC},{0x6B17, 0x99ED},{0x6B18, 0x99EE},{0x6B19, 0x99EF},{0x6B1A, 0x99F0},{0x6B1B, 0x99F1},{0x6B1C, 0x99F2}, - {0x6B1D, 0x99F3},{0x6B1E, 0x99F4},{0x6B1F, 0x99F5},{0x6B20, 0xC7B7},{0x6B21, 0xB4CE},{0x6B22, 0xBBB6},{0x6B23, 0xD0C0},{0x6B24, 0xECA3}, - {0x6B25, 0x99F6},{0x6B26, 0x99F7},{0x6B27, 0xC5B7},{0x6B28, 0x99F8},{0x6B29, 0x99F9},{0x6B2A, 0x99FA},{0x6B2B, 0x99FB},{0x6B2C, 0x99FC}, - {0x6B2D, 0x99FD},{0x6B2E, 0x99FE},{0x6B2F, 0x9A40},{0x6B30, 0x9A41},{0x6B31, 0x9A42},{0x6B32, 0xD3FB},{0x6B33, 0x9A43},{0x6B34, 0x9A44}, - {0x6B35, 0x9A45},{0x6B36, 0x9A46},{0x6B37, 0xECA4},{0x6B38, 0x9A47},{0x6B39, 0xECA5},{0x6B3A, 0xC6DB},{0x6B3B, 0x9A48},{0x6B3C, 0x9A49}, - {0x6B3D, 0x9A4A},{0x6B3E, 0xBFEE},{0x6B3F, 0x9A4B},{0x6B40, 0x9A4C},{0x6B41, 0x9A4D},{0x6B42, 0x9A4E},{0x6B43, 0xECA6},{0x6B44, 0x9A4F}, - {0x6B45, 0x9A50},{0x6B46, 0xECA7},{0x6B47, 0xD0AA},{0x6B48, 0x9A51},{0x6B49, 0xC7B8},{0x6B4A, 0x9A52},{0x6B4B, 0x9A53},{0x6B4C, 0xB8E8}, - {0x6B4D, 0x9A54},{0x6B4E, 0x9A55},{0x6B4F, 0x9A56},{0x6B50, 0x9A57},{0x6B51, 0x9A58},{0x6B52, 0x9A59},{0x6B53, 0x9A5A},{0x6B54, 0x9A5B}, - {0x6B55, 0x9A5C},{0x6B56, 0x9A5D},{0x6B57, 0x9A5E},{0x6B58, 0x9A5F},{0x6B59, 0xECA8},{0x6B5A, 0x9A60},{0x6B5B, 0x9A61},{0x6B5C, 0x9A62}, - {0x6B5D, 0x9A63},{0x6B5E, 0x9A64},{0x6B5F, 0x9A65},{0x6B60, 0x9A66},{0x6B61, 0x9A67},{0x6B62, 0xD6B9},{0x6B63, 0xD5FD},{0x6B64, 0xB4CB}, - {0x6B65, 0xB2BD},{0x6B66, 0xCEE4},{0x6B67, 0xC6E7},{0x6B68, 0x9A68},{0x6B69, 0x9A69},{0x6B6A, 0xCDE1},{0x6B6B, 0x9A6A},{0x6B6C, 0x9A6B}, - {0x6B6D, 0x9A6C},{0x6B6E, 0x9A6D},{0x6B6F, 0x9A6E},{0x6B70, 0x9A6F},{0x6B71, 0x9A70},{0x6B72, 0x9A71},{0x6B73, 0x9A72},{0x6B74, 0x9A73}, - {0x6B75, 0x9A74},{0x6B76, 0x9A75},{0x6B77, 0x9A76},{0x6B78, 0x9A77},{0x6B79, 0xB4F5},{0x6B7A, 0x9A78},{0x6B7B, 0xCBC0},{0x6B7C, 0xBCDF}, - {0x6B7D, 0x9A79},{0x6B7E, 0x9A7A},{0x6B7F, 0x9A7B},{0x6B80, 0x9A7C},{0x6B81, 0xE9E2},{0x6B82, 0xE9E3},{0x6B83, 0xD1EA},{0x6B84, 0xE9E5}, - {0x6B85, 0x9A7D},{0x6B86, 0xB4F9},{0x6B87, 0xE9E4},{0x6B88, 0x9A7E},{0x6B89, 0xD1B3},{0x6B8A, 0xCAE2},{0x6B8B, 0xB2D0},{0x6B8C, 0x9A80}, - {0x6B8D, 0xE9E8},{0x6B8E, 0x9A81},{0x6B8F, 0x9A82},{0x6B90, 0x9A83},{0x6B91, 0x9A84},{0x6B92, 0xE9E6},{0x6B93, 0xE9E7},{0x6B94, 0x9A85}, - {0x6B95, 0x9A86},{0x6B96, 0xD6B3},{0x6B97, 0x9A87},{0x6B98, 0x9A88},{0x6B99, 0x9A89},{0x6B9A, 0xE9E9},{0x6B9B, 0xE9EA},{0x6B9C, 0x9A8A}, - {0x6B9D, 0x9A8B},{0x6B9E, 0x9A8C},{0x6B9F, 0x9A8D},{0x6BA0, 0x9A8E},{0x6BA1, 0xE9EB},{0x6BA2, 0x9A8F},{0x6BA3, 0x9A90},{0x6BA4, 0x9A91}, - {0x6BA5, 0x9A92},{0x6BA6, 0x9A93},{0x6BA7, 0x9A94},{0x6BA8, 0x9A95},{0x6BA9, 0x9A96},{0x6BAA, 0xE9EC},{0x6BAB, 0x9A97},{0x6BAC, 0x9A98}, - {0x6BAD, 0x9A99},{0x6BAE, 0x9A9A},{0x6BAF, 0x9A9B},{0x6BB0, 0x9A9C},{0x6BB1, 0x9A9D},{0x6BB2, 0x9A9E},{0x6BB3, 0xECAF},{0x6BB4, 0xC5B9}, - {0x6BB5, 0xB6CE},{0x6BB6, 0x9A9F},{0x6BB7, 0xD2F3},{0x6BB8, 0x9AA0},{0x6BB9, 0x9AA1},{0x6BBA, 0x9AA2},{0x6BBB, 0x9AA3},{0x6BBC, 0x9AA4}, - {0x6BBD, 0x9AA5},{0x6BBE, 0x9AA6},{0x6BBF, 0xB5EE},{0x6BC0, 0x9AA7},{0x6BC1, 0xBBD9},{0x6BC2, 0xECB1},{0x6BC3, 0x9AA8},{0x6BC4, 0x9AA9}, - {0x6BC5, 0xD2E3},{0x6BC6, 0x9AAA},{0x6BC7, 0x9AAB},{0x6BC8, 0x9AAC},{0x6BC9, 0x9AAD},{0x6BCA, 0x9AAE},{0x6BCB, 0xCEE3},{0x6BCC, 0x9AAF}, - {0x6BCD, 0xC4B8},{0x6BCE, 0x9AB0},{0x6BCF, 0xC3BF},{0x6BD0, 0x9AB1},{0x6BD1, 0x9AB2},{0x6BD2, 0xB6BE},{0x6BD3, 0xD8B9},{0x6BD4, 0xB1C8}, - {0x6BD5, 0xB1CF},{0x6BD6, 0xB1D1},{0x6BD7, 0xC5FE},{0x6BD8, 0x9AB3},{0x6BD9, 0xB1D0},{0x6BDA, 0x9AB4},{0x6BDB, 0xC3AB},{0x6BDC, 0x9AB5}, - {0x6BDD, 0x9AB6},{0x6BDE, 0x9AB7},{0x6BDF, 0x9AB8},{0x6BE0, 0x9AB9},{0x6BE1, 0xD5B1},{0x6BE2, 0x9ABA},{0x6BE3, 0x9ABB},{0x6BE4, 0x9ABC}, - {0x6BE5, 0x9ABD},{0x6BE6, 0x9ABE},{0x6BE7, 0x9ABF},{0x6BE8, 0x9AC0},{0x6BE9, 0x9AC1},{0x6BEA, 0xEBA4},{0x6BEB, 0xBAC1},{0x6BEC, 0x9AC2}, - {0x6BED, 0x9AC3},{0x6BEE, 0x9AC4},{0x6BEF, 0xCCBA},{0x6BF0, 0x9AC5},{0x6BF1, 0x9AC6},{0x6BF2, 0x9AC7},{0x6BF3, 0xEBA5},{0x6BF4, 0x9AC8}, - {0x6BF5, 0xEBA7},{0x6BF6, 0x9AC9},{0x6BF7, 0x9ACA},{0x6BF8, 0x9ACB},{0x6BF9, 0xEBA8},{0x6BFA, 0x9ACC},{0x6BFB, 0x9ACD},{0x6BFC, 0x9ACE}, - {0x6BFD, 0xEBA6},{0x6BFE, 0x9ACF},{0x6BFF, 0x9AD0},{0x6C00, 0x9AD1},{0x6C01, 0x9AD2},{0x6C02, 0x9AD3},{0x6C03, 0x9AD4},{0x6C04, 0x9AD5}, - {0x6C05, 0xEBA9},{0x6C06, 0xEBAB},{0x6C07, 0xEBAA},{0x6C08, 0x9AD6},{0x6C09, 0x9AD7},{0x6C0A, 0x9AD8},{0x6C0B, 0x9AD9},{0x6C0C, 0x9ADA}, - {0x6C0D, 0xEBAC},{0x6C0E, 0x9ADB},{0x6C0F, 0xCACF},{0x6C10, 0xD8B5},{0x6C11, 0xC3F1},{0x6C12, 0x9ADC},{0x6C13, 0xC3A5},{0x6C14, 0xC6F8}, - {0x6C15, 0xEBAD},{0x6C16, 0xC4CA},{0x6C17, 0x9ADD},{0x6C18, 0xEBAE},{0x6C19, 0xEBAF},{0x6C1A, 0xEBB0},{0x6C1B, 0xB7D5},{0x6C1C, 0x9ADE}, - {0x6C1D, 0x9ADF},{0x6C1E, 0x9AE0},{0x6C1F, 0xB7FA},{0x6C20, 0x9AE1},{0x6C21, 0xEBB1},{0x6C22, 0xC7E2},{0x6C23, 0x9AE2},{0x6C24, 0xEBB3}, - {0x6C25, 0x9AE3},{0x6C26, 0xBAA4},{0x6C27, 0xD1F5},{0x6C28, 0xB0B1},{0x6C29, 0xEBB2},{0x6C2A, 0xEBB4},{0x6C2B, 0x9AE4},{0x6C2C, 0x9AE5}, - {0x6C2D, 0x9AE6},{0x6C2E, 0xB5AA},{0x6C2F, 0xC2C8},{0x6C30, 0xC7E8},{0x6C31, 0x9AE7},{0x6C32, 0xEBB5},{0x6C33, 0x9AE8},{0x6C34, 0xCBAE}, - {0x6C35, 0xE3DF},{0x6C36, 0x9AE9},{0x6C37, 0x9AEA},{0x6C38, 0xD3C0},{0x6C39, 0x9AEB},{0x6C3A, 0x9AEC},{0x6C3B, 0x9AED},{0x6C3C, 0x9AEE}, - {0x6C3D, 0xD9DB},{0x6C3E, 0x9AEF},{0x6C3F, 0x9AF0},{0x6C40, 0xCDA1},{0x6C41, 0xD6AD},{0x6C42, 0xC7F3},{0x6C43, 0x9AF1},{0x6C44, 0x9AF2}, - {0x6C45, 0x9AF3},{0x6C46, 0xD9E0},{0x6C47, 0xBBE3},{0x6C48, 0x9AF4},{0x6C49, 0xBABA},{0x6C4A, 0xE3E2},{0x6C4B, 0x9AF5},{0x6C4C, 0x9AF6}, - {0x6C4D, 0x9AF7},{0x6C4E, 0x9AF8},{0x6C4F, 0x9AF9},{0x6C50, 0xCFAB},{0x6C51, 0x9AFA},{0x6C52, 0x9AFB},{0x6C53, 0x9AFC},{0x6C54, 0xE3E0}, - {0x6C55, 0xC9C7},{0x6C56, 0x9AFD},{0x6C57, 0xBAB9},{0x6C58, 0x9AFE},{0x6C59, 0x9B40},{0x6C5A, 0x9B41},{0x6C5B, 0xD1B4},{0x6C5C, 0xE3E1}, - {0x6C5D, 0xC8EA},{0x6C5E, 0xB9AF},{0x6C5F, 0xBDAD},{0x6C60, 0xB3D8},{0x6C61, 0xCEDB},{0x6C62, 0x9B42},{0x6C63, 0x9B43},{0x6C64, 0xCCC0}, - {0x6C65, 0x9B44},{0x6C66, 0x9B45},{0x6C67, 0x9B46},{0x6C68, 0xE3E8},{0x6C69, 0xE3E9},{0x6C6A, 0xCDF4},{0x6C6B, 0x9B47},{0x6C6C, 0x9B48}, - {0x6C6D, 0x9B49},{0x6C6E, 0x9B4A},{0x6C6F, 0x9B4B},{0x6C70, 0xCCAD},{0x6C71, 0x9B4C},{0x6C72, 0xBCB3},{0x6C73, 0x9B4D},{0x6C74, 0xE3EA}, - {0x6C75, 0x9B4E},{0x6C76, 0xE3EB},{0x6C77, 0x9B4F},{0x6C78, 0x9B50},{0x6C79, 0xD0DA},{0x6C7A, 0x9B51},{0x6C7B, 0x9B52},{0x6C7C, 0x9B53}, - {0x6C7D, 0xC6FB},{0x6C7E, 0xB7DA},{0x6C7F, 0x9B54},{0x6C80, 0x9B55},{0x6C81, 0xC7DF},{0x6C82, 0xD2CA},{0x6C83, 0xCED6},{0x6C84, 0x9B56}, - {0x6C85, 0xE3E4},{0x6C86, 0xE3EC},{0x6C87, 0x9B57},{0x6C88, 0xC9F2},{0x6C89, 0xB3C1},{0x6C8A, 0x9B58},{0x6C8B, 0x9B59},{0x6C8C, 0xE3E7}, - {0x6C8D, 0x9B5A},{0x6C8E, 0x9B5B},{0x6C8F, 0xC6E3},{0x6C90, 0xE3E5},{0x6C91, 0x9B5C},{0x6C92, 0x9B5D},{0x6C93, 0xEDB3},{0x6C94, 0xE3E6}, - {0x6C95, 0x9B5E},{0x6C96, 0x9B5F},{0x6C97, 0x9B60},{0x6C98, 0x9B61},{0x6C99, 0xC9B3},{0x6C9A, 0x9B62},{0x6C9B, 0xC5E6},{0x6C9C, 0x9B63}, - {0x6C9D, 0x9B64},{0x6C9E, 0x9B65},{0x6C9F, 0xB9B5},{0x6CA0, 0x9B66},{0x6CA1, 0xC3BB},{0x6CA2, 0x9B67},{0x6CA3, 0xE3E3},{0x6CA4, 0xC5BD}, - {0x6CA5, 0xC1A4},{0x6CA6, 0xC2D9},{0x6CA7, 0xB2D7},{0x6CA8, 0x9B68},{0x6CA9, 0xE3ED},{0x6CAA, 0xBBA6},{0x6CAB, 0xC4AD},{0x6CAC, 0x9B69}, - {0x6CAD, 0xE3F0},{0x6CAE, 0xBEDA},{0x6CAF, 0x9B6A},{0x6CB0, 0x9B6B},{0x6CB1, 0xE3FB},{0x6CB2, 0xE3F5},{0x6CB3, 0xBAD3},{0x6CB4, 0x9B6C}, - {0x6CB5, 0x9B6D},{0x6CB6, 0x9B6E},{0x6CB7, 0x9B6F},{0x6CB8, 0xB7D0},{0x6CB9, 0xD3CD},{0x6CBA, 0x9B70},{0x6CBB, 0xD6CE},{0x6CBC, 0xD5D3}, - {0x6CBD, 0xB9C1},{0x6CBE, 0xD5B4},{0x6CBF, 0xD1D8},{0x6CC0, 0x9B71},{0x6CC1, 0x9B72},{0x6CC2, 0x9B73},{0x6CC3, 0x9B74},{0x6CC4, 0xD0B9}, - {0x6CC5, 0xC7F6},{0x6CC6, 0x9B75},{0x6CC7, 0x9B76},{0x6CC8, 0x9B77},{0x6CC9, 0xC8AA},{0x6CCA, 0xB2B4},{0x6CCB, 0x9B78},{0x6CCC, 0xC3DA}, - {0x6CCD, 0x9B79},{0x6CCE, 0x9B7A},{0x6CCF, 0x9B7B},{0x6CD0, 0xE3EE},{0x6CD1, 0x9B7C},{0x6CD2, 0x9B7D},{0x6CD3, 0xE3FC},{0x6CD4, 0xE3EF}, - {0x6CD5, 0xB7A8},{0x6CD6, 0xE3F7},{0x6CD7, 0xE3F4},{0x6CD8, 0x9B7E},{0x6CD9, 0x9B80},{0x6CDA, 0x9B81},{0x6CDB, 0xB7BA},{0x6CDC, 0x9B82}, - {0x6CDD, 0x9B83},{0x6CDE, 0xC5A2},{0x6CDF, 0x9B84},{0x6CE0, 0xE3F6},{0x6CE1, 0xC5DD},{0x6CE2, 0xB2A8},{0x6CE3, 0xC6FC},{0x6CE4, 0x9B85}, - {0x6CE5, 0xC4E0},{0x6CE6, 0x9B86},{0x6CE7, 0x9B87},{0x6CE8, 0xD7A2},{0x6CE9, 0x9B88},{0x6CEA, 0xC0E1},{0x6CEB, 0xE3F9},{0x6CEC, 0x9B89}, - {0x6CED, 0x9B8A},{0x6CEE, 0xE3FA},{0x6CEF, 0xE3FD},{0x6CF0, 0xCCA9},{0x6CF1, 0xE3F3},{0x6CF2, 0x9B8B},{0x6CF3, 0xD3BE},{0x6CF4, 0x9B8C}, - {0x6CF5, 0xB1C3},{0x6CF6, 0xEDB4},{0x6CF7, 0xE3F1},{0x6CF8, 0xE3F2},{0x6CF9, 0x9B8D},{0x6CFA, 0xE3F8},{0x6CFB, 0xD0BA},{0x6CFC, 0xC6C3}, - {0x6CFD, 0xD4F3},{0x6CFE, 0xE3FE},{0x6CFF, 0x9B8E},{0x6D00, 0x9B8F},{0x6D01, 0xBDE0},{0x6D02, 0x9B90},{0x6D03, 0x9B91},{0x6D04, 0xE4A7}, - {0x6D05, 0x9B92},{0x6D06, 0x9B93},{0x6D07, 0xE4A6},{0x6D08, 0x9B94},{0x6D09, 0x9B95},{0x6D0A, 0x9B96},{0x6D0B, 0xD1F3},{0x6D0C, 0xE4A3}, - {0x6D0D, 0x9B97},{0x6D0E, 0xE4A9},{0x6D0F, 0x9B98},{0x6D10, 0x9B99},{0x6D11, 0x9B9A},{0x6D12, 0xC8F7},{0x6D13, 0x9B9B},{0x6D14, 0x9B9C}, - {0x6D15, 0x9B9D},{0x6D16, 0x9B9E},{0x6D17, 0xCFB4},{0x6D18, 0x9B9F},{0x6D19, 0xE4A8},{0x6D1A, 0xE4AE},{0x6D1B, 0xC2E5},{0x6D1C, 0x9BA0}, - {0x6D1D, 0x9BA1},{0x6D1E, 0xB6B4},{0x6D1F, 0x9BA2},{0x6D20, 0x9BA3},{0x6D21, 0x9BA4},{0x6D22, 0x9BA5},{0x6D23, 0x9BA6},{0x6D24, 0x9BA7}, - {0x6D25, 0xBDF2},{0x6D26, 0x9BA8},{0x6D27, 0xE4A2},{0x6D28, 0x9BA9},{0x6D29, 0x9BAA},{0x6D2A, 0xBAE9},{0x6D2B, 0xE4AA},{0x6D2C, 0x9BAB}, - {0x6D2D, 0x9BAC},{0x6D2E, 0xE4AC},{0x6D2F, 0x9BAD},{0x6D30, 0x9BAE},{0x6D31, 0xB6FD},{0x6D32, 0xD6DE},{0x6D33, 0xE4B2},{0x6D34, 0x9BAF}, - {0x6D35, 0xE4AD},{0x6D36, 0x9BB0},{0x6D37, 0x9BB1},{0x6D38, 0x9BB2},{0x6D39, 0xE4A1},{0x6D3A, 0x9BB3},{0x6D3B, 0xBBEE},{0x6D3C, 0xCDDD}, - {0x6D3D, 0xC7A2},{0x6D3E, 0xC5C9},{0x6D3F, 0x9BB4},{0x6D40, 0x9BB5},{0x6D41, 0xC1F7},{0x6D42, 0x9BB6},{0x6D43, 0xE4A4},{0x6D44, 0x9BB7}, - {0x6D45, 0xC7B3},{0x6D46, 0xBDAC},{0x6D47, 0xBDBD},{0x6D48, 0xE4A5},{0x6D49, 0x9BB8},{0x6D4A, 0xD7C7},{0x6D4B, 0xB2E2},{0x6D4C, 0x9BB9}, - {0x6D4D, 0xE4AB},{0x6D4E, 0xBCC3},{0x6D4F, 0xE4AF},{0x6D50, 0x9BBA},{0x6D51, 0xBBEB},{0x6D52, 0xE4B0},{0x6D53, 0xC5A8},{0x6D54, 0xE4B1}, - {0x6D55, 0x9BBB},{0x6D56, 0x9BBC},{0x6D57, 0x9BBD},{0x6D58, 0x9BBE},{0x6D59, 0xD5E3},{0x6D5A, 0xBFA3},{0x6D5B, 0x9BBF},{0x6D5C, 0xE4BA}, - {0x6D5D, 0x9BC0},{0x6D5E, 0xE4B7},{0x6D5F, 0x9BC1},{0x6D60, 0xE4BB},{0x6D61, 0x9BC2},{0x6D62, 0x9BC3},{0x6D63, 0xE4BD},{0x6D64, 0x9BC4}, - {0x6D65, 0x9BC5},{0x6D66, 0xC6D6},{0x6D67, 0x9BC6},{0x6D68, 0x9BC7},{0x6D69, 0xBAC6},{0x6D6A, 0xC0CB},{0x6D6B, 0x9BC8},{0x6D6C, 0x9BC9}, - {0x6D6D, 0x9BCA},{0x6D6E, 0xB8A1},{0x6D6F, 0xE4B4},{0x6D70, 0x9BCB},{0x6D71, 0x9BCC},{0x6D72, 0x9BCD},{0x6D73, 0x9BCE},{0x6D74, 0xD4A1}, - {0x6D75, 0x9BCF},{0x6D76, 0x9BD0},{0x6D77, 0xBAA3},{0x6D78, 0xBDFE},{0x6D79, 0x9BD1},{0x6D7A, 0x9BD2},{0x6D7B, 0x9BD3},{0x6D7C, 0xE4BC}, - {0x6D7D, 0x9BD4},{0x6D7E, 0x9BD5},{0x6D7F, 0x9BD6},{0x6D80, 0x9BD7},{0x6D81, 0x9BD8},{0x6D82, 0xCDBF},{0x6D83, 0x9BD9},{0x6D84, 0x9BDA}, - {0x6D85, 0xC4F9},{0x6D86, 0x9BDB},{0x6D87, 0x9BDC},{0x6D88, 0xCFFB},{0x6D89, 0xC9E6},{0x6D8A, 0x9BDD},{0x6D8B, 0x9BDE},{0x6D8C, 0xD3BF}, - {0x6D8D, 0x9BDF},{0x6D8E, 0xCFD1},{0x6D8F, 0x9BE0},{0x6D90, 0x9BE1},{0x6D91, 0xE4B3},{0x6D92, 0x9BE2},{0x6D93, 0xE4B8},{0x6D94, 0xE4B9}, - {0x6D95, 0xCCE9},{0x6D96, 0x9BE3},{0x6D97, 0x9BE4},{0x6D98, 0x9BE5},{0x6D99, 0x9BE6},{0x6D9A, 0x9BE7},{0x6D9B, 0xCCCE},{0x6D9C, 0x9BE8}, - {0x6D9D, 0xC0D4},{0x6D9E, 0xE4B5},{0x6D9F, 0xC1B0},{0x6DA0, 0xE4B6},{0x6DA1, 0xCED0},{0x6DA2, 0x9BE9},{0x6DA3, 0xBBC1},{0x6DA4, 0xB5D3}, - {0x6DA5, 0x9BEA},{0x6DA6, 0xC8F3},{0x6DA7, 0xBDA7},{0x6DA8, 0xD5C7},{0x6DA9, 0xC9AC},{0x6DAA, 0xB8A2},{0x6DAB, 0xE4CA},{0x6DAC, 0x9BEB}, - {0x6DAD, 0x9BEC},{0x6DAE, 0xE4CC},{0x6DAF, 0xD1C4},{0x6DB0, 0x9BED},{0x6DB1, 0x9BEE},{0x6DB2, 0xD2BA},{0x6DB3, 0x9BEF},{0x6DB4, 0x9BF0}, - {0x6DB5, 0xBAAD},{0x6DB6, 0x9BF1},{0x6DB7, 0x9BF2},{0x6DB8, 0xBAD4},{0x6DB9, 0x9BF3},{0x6DBA, 0x9BF4},{0x6DBB, 0x9BF5},{0x6DBC, 0x9BF6}, - {0x6DBD, 0x9BF7},{0x6DBE, 0x9BF8},{0x6DBF, 0xE4C3},{0x6DC0, 0xB5ED},{0x6DC1, 0x9BF9},{0x6DC2, 0x9BFA},{0x6DC3, 0x9BFB},{0x6DC4, 0xD7CD}, - {0x6DC5, 0xE4C0},{0x6DC6, 0xCFFD},{0x6DC7, 0xE4BF},{0x6DC8, 0x9BFC},{0x6DC9, 0x9BFD},{0x6DCA, 0x9BFE},{0x6DCB, 0xC1DC},{0x6DCC, 0xCCCA}, - {0x6DCD, 0x9C40},{0x6DCE, 0x9C41},{0x6DCF, 0x9C42},{0x6DD0, 0x9C43},{0x6DD1, 0xCAE7},{0x6DD2, 0x9C44},{0x6DD3, 0x9C45},{0x6DD4, 0x9C46}, - {0x6DD5, 0x9C47},{0x6DD6, 0xC4D7},{0x6DD7, 0x9C48},{0x6DD8, 0xCCD4},{0x6DD9, 0xE4C8},{0x6DDA, 0x9C49},{0x6DDB, 0x9C4A},{0x6DDC, 0x9C4B}, - {0x6DDD, 0xE4C7},{0x6DDE, 0xE4C1},{0x6DDF, 0x9C4C},{0x6DE0, 0xE4C4},{0x6DE1, 0xB5AD},{0x6DE2, 0x9C4D},{0x6DE3, 0x9C4E},{0x6DE4, 0xD3D9}, - {0x6DE5, 0x9C4F},{0x6DE6, 0xE4C6},{0x6DE7, 0x9C50},{0x6DE8, 0x9C51},{0x6DE9, 0x9C52},{0x6DEA, 0x9C53},{0x6DEB, 0xD2F9},{0x6DEC, 0xB4E3}, - {0x6DED, 0x9C54},{0x6DEE, 0xBBB4},{0x6DEF, 0x9C55},{0x6DF0, 0x9C56},{0x6DF1, 0xC9EE},{0x6DF2, 0x9C57},{0x6DF3, 0xB4BE},{0x6DF4, 0x9C58}, - {0x6DF5, 0x9C59},{0x6DF6, 0x9C5A},{0x6DF7, 0xBBEC},{0x6DF8, 0x9C5B},{0x6DF9, 0xD1CD},{0x6DFA, 0x9C5C},{0x6DFB, 0xCCED},{0x6DFC, 0xEDB5}, - {0x6DFD, 0x9C5D},{0x6DFE, 0x9C5E},{0x6DFF, 0x9C5F},{0x6E00, 0x9C60},{0x6E01, 0x9C61},{0x6E02, 0x9C62},{0x6E03, 0x9C63},{0x6E04, 0x9C64}, - {0x6E05, 0xC7E5},{0x6E06, 0x9C65},{0x6E07, 0x9C66},{0x6E08, 0x9C67},{0x6E09, 0x9C68},{0x6E0A, 0xD4A8},{0x6E0B, 0x9C69},{0x6E0C, 0xE4CB}, - {0x6E0D, 0xD7D5},{0x6E0E, 0xE4C2},{0x6E0F, 0x9C6A},{0x6E10, 0xBDA5},{0x6E11, 0xE4C5},{0x6E12, 0x9C6B},{0x6E13, 0x9C6C},{0x6E14, 0xD3E6}, - {0x6E15, 0x9C6D},{0x6E16, 0xE4C9},{0x6E17, 0xC9F8},{0x6E18, 0x9C6E},{0x6E19, 0x9C6F},{0x6E1A, 0xE4BE},{0x6E1B, 0x9C70},{0x6E1C, 0x9C71}, - {0x6E1D, 0xD3E5},{0x6E1E, 0x9C72},{0x6E1F, 0x9C73},{0x6E20, 0xC7FE},{0x6E21, 0xB6C9},{0x6E22, 0x9C74},{0x6E23, 0xD4FC},{0x6E24, 0xB2B3}, - {0x6E25, 0xE4D7},{0x6E26, 0x9C75},{0x6E27, 0x9C76},{0x6E28, 0x9C77},{0x6E29, 0xCEC2},{0x6E2A, 0x9C78},{0x6E2B, 0xE4CD},{0x6E2C, 0x9C79}, - {0x6E2D, 0xCEBC},{0x6E2E, 0x9C7A},{0x6E2F, 0xB8DB},{0x6E30, 0x9C7B},{0x6E31, 0x9C7C},{0x6E32, 0xE4D6},{0x6E33, 0x9C7D},{0x6E34, 0xBFCA}, - {0x6E35, 0x9C7E},{0x6E36, 0x9C80},{0x6E37, 0x9C81},{0x6E38, 0xD3CE},{0x6E39, 0x9C82},{0x6E3A, 0xC3EC},{0x6E3B, 0x9C83},{0x6E3C, 0x9C84}, - {0x6E3D, 0x9C85},{0x6E3E, 0x9C86},{0x6E3F, 0x9C87},{0x6E40, 0x9C88},{0x6E41, 0x9C89},{0x6E42, 0x9C8A},{0x6E43, 0xC5C8},{0x6E44, 0xE4D8}, - {0x6E45, 0x9C8B},{0x6E46, 0x9C8C},{0x6E47, 0x9C8D},{0x6E48, 0x9C8E},{0x6E49, 0x9C8F},{0x6E4A, 0x9C90},{0x6E4B, 0x9C91},{0x6E4C, 0x9C92}, - {0x6E4D, 0xCDC4},{0x6E4E, 0xE4CF},{0x6E4F, 0x9C93},{0x6E50, 0x9C94},{0x6E51, 0x9C95},{0x6E52, 0x9C96},{0x6E53, 0xE4D4},{0x6E54, 0xE4D5}, - {0x6E55, 0x9C97},{0x6E56, 0xBAFE},{0x6E57, 0x9C98},{0x6E58, 0xCFE6},{0x6E59, 0x9C99},{0x6E5A, 0x9C9A},{0x6E5B, 0xD5BF},{0x6E5C, 0x9C9B}, - {0x6E5D, 0x9C9C},{0x6E5E, 0x9C9D},{0x6E5F, 0xE4D2},{0x6E60, 0x9C9E},{0x6E61, 0x9C9F},{0x6E62, 0x9CA0},{0x6E63, 0x9CA1},{0x6E64, 0x9CA2}, - {0x6E65, 0x9CA3},{0x6E66, 0x9CA4},{0x6E67, 0x9CA5},{0x6E68, 0x9CA6},{0x6E69, 0x9CA7},{0x6E6A, 0x9CA8},{0x6E6B, 0xE4D0},{0x6E6C, 0x9CA9}, - {0x6E6D, 0x9CAA},{0x6E6E, 0xE4CE},{0x6E6F, 0x9CAB},{0x6E70, 0x9CAC},{0x6E71, 0x9CAD},{0x6E72, 0x9CAE},{0x6E73, 0x9CAF},{0x6E74, 0x9CB0}, - {0x6E75, 0x9CB1},{0x6E76, 0x9CB2},{0x6E77, 0x9CB3},{0x6E78, 0x9CB4},{0x6E79, 0x9CB5},{0x6E7A, 0x9CB6},{0x6E7B, 0x9CB7},{0x6E7C, 0x9CB8}, - {0x6E7D, 0x9CB9},{0x6E7E, 0xCDE5},{0x6E7F, 0xCAAA},{0x6E80, 0x9CBA},{0x6E81, 0x9CBB},{0x6E82, 0x9CBC},{0x6E83, 0xC0A3},{0x6E84, 0x9CBD}, - {0x6E85, 0xBDA6},{0x6E86, 0xE4D3},{0x6E87, 0x9CBE},{0x6E88, 0x9CBF},{0x6E89, 0xB8C8},{0x6E8A, 0x9CC0},{0x6E8B, 0x9CC1},{0x6E8C, 0x9CC2}, - {0x6E8D, 0x9CC3},{0x6E8E, 0x9CC4},{0x6E8F, 0xE4E7},{0x6E90, 0xD4B4},{0x6E91, 0x9CC5},{0x6E92, 0x9CC6},{0x6E93, 0x9CC7},{0x6E94, 0x9CC8}, - {0x6E95, 0x9CC9},{0x6E96, 0x9CCA},{0x6E97, 0x9CCB},{0x6E98, 0xE4DB},{0x6E99, 0x9CCC},{0x6E9A, 0x9CCD},{0x6E9B, 0x9CCE},{0x6E9C, 0xC1EF}, - {0x6E9D, 0x9CCF},{0x6E9E, 0x9CD0},{0x6E9F, 0xE4E9},{0x6EA0, 0x9CD1},{0x6EA1, 0x9CD2},{0x6EA2, 0xD2E7},{0x6EA3, 0x9CD3},{0x6EA4, 0x9CD4}, - {0x6EA5, 0xE4DF},{0x6EA6, 0x9CD5},{0x6EA7, 0xE4E0},{0x6EA8, 0x9CD6},{0x6EA9, 0x9CD7},{0x6EAA, 0xCFAA},{0x6EAB, 0x9CD8},{0x6EAC, 0x9CD9}, - {0x6EAD, 0x9CDA},{0x6EAE, 0x9CDB},{0x6EAF, 0xCBDD},{0x6EB0, 0x9CDC},{0x6EB1, 0xE4DA},{0x6EB2, 0xE4D1},{0x6EB3, 0x9CDD},{0x6EB4, 0xE4E5}, - {0x6EB5, 0x9CDE},{0x6EB6, 0xC8DC},{0x6EB7, 0xE4E3},{0x6EB8, 0x9CDF},{0x6EB9, 0x9CE0},{0x6EBA, 0xC4E7},{0x6EBB, 0xE4E2},{0x6EBC, 0x9CE1}, - {0x6EBD, 0xE4E1},{0x6EBE, 0x9CE2},{0x6EBF, 0x9CE3},{0x6EC0, 0x9CE4},{0x6EC1, 0xB3FC},{0x6EC2, 0xE4E8},{0x6EC3, 0x9CE5},{0x6EC4, 0x9CE6}, - {0x6EC5, 0x9CE7},{0x6EC6, 0x9CE8},{0x6EC7, 0xB5E1},{0x6EC8, 0x9CE9},{0x6EC9, 0x9CEA},{0x6ECA, 0x9CEB},{0x6ECB, 0xD7CC},{0x6ECC, 0x9CEC}, - {0x6ECD, 0x9CED},{0x6ECE, 0x9CEE},{0x6ECF, 0xE4E6},{0x6ED0, 0x9CEF},{0x6ED1, 0xBBAC},{0x6ED2, 0x9CF0},{0x6ED3, 0xD7D2},{0x6ED4, 0xCCCF}, - {0x6ED5, 0xEBF8},{0x6ED6, 0x9CF1},{0x6ED7, 0xE4E4},{0x6ED8, 0x9CF2},{0x6ED9, 0x9CF3},{0x6EDA, 0xB9F6},{0x6EDB, 0x9CF4},{0x6EDC, 0x9CF5}, - {0x6EDD, 0x9CF6},{0x6EDE, 0xD6CD},{0x6EDF, 0xE4D9},{0x6EE0, 0xE4DC},{0x6EE1, 0xC2FA},{0x6EE2, 0xE4DE},{0x6EE3, 0x9CF7},{0x6EE4, 0xC2CB}, - {0x6EE5, 0xC0C4},{0x6EE6, 0xC2D0},{0x6EE7, 0x9CF8},{0x6EE8, 0xB1F5},{0x6EE9, 0xCCB2},{0x6EEA, 0x9CF9},{0x6EEB, 0x9CFA},{0x6EEC, 0x9CFB}, - {0x6EED, 0x9CFC},{0x6EEE, 0x9CFD},{0x6EEF, 0x9CFE},{0x6EF0, 0x9D40},{0x6EF1, 0x9D41},{0x6EF2, 0x9D42},{0x6EF3, 0x9D43},{0x6EF4, 0xB5CE}, - {0x6EF5, 0x9D44},{0x6EF6, 0x9D45},{0x6EF7, 0x9D46},{0x6EF8, 0x9D47},{0x6EF9, 0xE4EF},{0x6EFA, 0x9D48},{0x6EFB, 0x9D49},{0x6EFC, 0x9D4A}, - {0x6EFD, 0x9D4B},{0x6EFE, 0x9D4C},{0x6EFF, 0x9D4D},{0x6F00, 0x9D4E},{0x6F01, 0x9D4F},{0x6F02, 0xC6AF},{0x6F03, 0x9D50},{0x6F04, 0x9D51}, - {0x6F05, 0x9D52},{0x6F06, 0xC6E1},{0x6F07, 0x9D53},{0x6F08, 0x9D54},{0x6F09, 0xE4F5},{0x6F0A, 0x9D55},{0x6F0B, 0x9D56},{0x6F0C, 0x9D57}, - {0x6F0D, 0x9D58},{0x6F0E, 0x9D59},{0x6F0F, 0xC2A9},{0x6F10, 0x9D5A},{0x6F11, 0x9D5B},{0x6F12, 0x9D5C},{0x6F13, 0xC0EC},{0x6F14, 0xD1DD}, - {0x6F15, 0xE4EE},{0x6F16, 0x9D5D},{0x6F17, 0x9D5E},{0x6F18, 0x9D5F},{0x6F19, 0x9D60},{0x6F1A, 0x9D61},{0x6F1B, 0x9D62},{0x6F1C, 0x9D63}, - {0x6F1D, 0x9D64},{0x6F1E, 0x9D65},{0x6F1F, 0x9D66},{0x6F20, 0xC4AE},{0x6F21, 0x9D67},{0x6F22, 0x9D68},{0x6F23, 0x9D69},{0x6F24, 0xE4ED}, - {0x6F25, 0x9D6A},{0x6F26, 0x9D6B},{0x6F27, 0x9D6C},{0x6F28, 0x9D6D},{0x6F29, 0xE4F6},{0x6F2A, 0xE4F4},{0x6F2B, 0xC2FE},{0x6F2C, 0x9D6E}, - {0x6F2D, 0xE4DD},{0x6F2E, 0x9D6F},{0x6F2F, 0xE4F0},{0x6F30, 0x9D70},{0x6F31, 0xCAFE},{0x6F32, 0x9D71},{0x6F33, 0xD5C4},{0x6F34, 0x9D72}, - {0x6F35, 0x9D73},{0x6F36, 0xE4F1},{0x6F37, 0x9D74},{0x6F38, 0x9D75},{0x6F39, 0x9D76},{0x6F3A, 0x9D77},{0x6F3B, 0x9D78},{0x6F3C, 0x9D79}, - {0x6F3D, 0x9D7A},{0x6F3E, 0xD1FA},{0x6F3F, 0x9D7B},{0x6F40, 0x9D7C},{0x6F41, 0x9D7D},{0x6F42, 0x9D7E},{0x6F43, 0x9D80},{0x6F44, 0x9D81}, - {0x6F45, 0x9D82},{0x6F46, 0xE4EB},{0x6F47, 0xE4EC},{0x6F48, 0x9D83},{0x6F49, 0x9D84},{0x6F4A, 0x9D85},{0x6F4B, 0xE4F2},{0x6F4C, 0x9D86}, - {0x6F4D, 0xCEAB},{0x6F4E, 0x9D87},{0x6F4F, 0x9D88},{0x6F50, 0x9D89},{0x6F51, 0x9D8A},{0x6F52, 0x9D8B},{0x6F53, 0x9D8C},{0x6F54, 0x9D8D}, - {0x6F55, 0x9D8E},{0x6F56, 0x9D8F},{0x6F57, 0x9D90},{0x6F58, 0xC5CB},{0x6F59, 0x9D91},{0x6F5A, 0x9D92},{0x6F5B, 0x9D93},{0x6F5C, 0xC7B1}, - {0x6F5D, 0x9D94},{0x6F5E, 0xC2BA},{0x6F5F, 0x9D95},{0x6F60, 0x9D96},{0x6F61, 0x9D97},{0x6F62, 0xE4EA},{0x6F63, 0x9D98},{0x6F64, 0x9D99}, - {0x6F65, 0x9D9A},{0x6F66, 0xC1CA},{0x6F67, 0x9D9B},{0x6F68, 0x9D9C},{0x6F69, 0x9D9D},{0x6F6A, 0x9D9E},{0x6F6B, 0x9D9F},{0x6F6C, 0x9DA0}, - {0x6F6D, 0xCCB6},{0x6F6E, 0xB3B1},{0x6F6F, 0x9DA1},{0x6F70, 0x9DA2},{0x6F71, 0x9DA3},{0x6F72, 0xE4FB},{0x6F73, 0x9DA4},{0x6F74, 0xE4F3}, - {0x6F75, 0x9DA5},{0x6F76, 0x9DA6},{0x6F77, 0x9DA7},{0x6F78, 0xE4FA},{0x6F79, 0x9DA8},{0x6F7A, 0xE4FD},{0x6F7B, 0x9DA9},{0x6F7C, 0xE4FC}, - {0x6F7D, 0x9DAA},{0x6F7E, 0x9DAB},{0x6F7F, 0x9DAC},{0x6F80, 0x9DAD},{0x6F81, 0x9DAE},{0x6F82, 0x9DAF},{0x6F83, 0x9DB0},{0x6F84, 0xB3CE}, - {0x6F85, 0x9DB1},{0x6F86, 0x9DB2},{0x6F87, 0x9DB3},{0x6F88, 0xB3BA},{0x6F89, 0xE4F7},{0x6F8A, 0x9DB4},{0x6F8B, 0x9DB5},{0x6F8C, 0xE4F9}, - {0x6F8D, 0xE4F8},{0x6F8E, 0xC5EC},{0x6F8F, 0x9DB6},{0x6F90, 0x9DB7},{0x6F91, 0x9DB8},{0x6F92, 0x9DB9},{0x6F93, 0x9DBA},{0x6F94, 0x9DBB}, - {0x6F95, 0x9DBC},{0x6F96, 0x9DBD},{0x6F97, 0x9DBE},{0x6F98, 0x9DBF},{0x6F99, 0x9DC0},{0x6F9A, 0x9DC1},{0x6F9B, 0x9DC2},{0x6F9C, 0xC0BD}, - {0x6F9D, 0x9DC3},{0x6F9E, 0x9DC4},{0x6F9F, 0x9DC5},{0x6FA0, 0x9DC6},{0x6FA1, 0xD4E8},{0x6FA2, 0x9DC7},{0x6FA3, 0x9DC8},{0x6FA4, 0x9DC9}, - {0x6FA5, 0x9DCA},{0x6FA6, 0x9DCB},{0x6FA7, 0xE5A2},{0x6FA8, 0x9DCC},{0x6FA9, 0x9DCD},{0x6FAA, 0x9DCE},{0x6FAB, 0x9DCF},{0x6FAC, 0x9DD0}, - {0x6FAD, 0x9DD1},{0x6FAE, 0x9DD2},{0x6FAF, 0x9DD3},{0x6FB0, 0x9DD4},{0x6FB1, 0x9DD5},{0x6FB2, 0x9DD6},{0x6FB3, 0xB0C4},{0x6FB4, 0x9DD7}, - {0x6FB5, 0x9DD8},{0x6FB6, 0xE5A4},{0x6FB7, 0x9DD9},{0x6FB8, 0x9DDA},{0x6FB9, 0xE5A3},{0x6FBA, 0x9DDB},{0x6FBB, 0x9DDC},{0x6FBC, 0x9DDD}, - {0x6FBD, 0x9DDE},{0x6FBE, 0x9DDF},{0x6FBF, 0x9DE0},{0x6FC0, 0xBCA4},{0x6FC1, 0x9DE1},{0x6FC2, 0xE5A5},{0x6FC3, 0x9DE2},{0x6FC4, 0x9DE3}, - {0x6FC5, 0x9DE4},{0x6FC6, 0x9DE5},{0x6FC7, 0x9DE6},{0x6FC8, 0x9DE7},{0x6FC9, 0xE5A1},{0x6FCA, 0x9DE8},{0x6FCB, 0x9DE9},{0x6FCC, 0x9DEA}, - {0x6FCD, 0x9DEB},{0x6FCE, 0x9DEC},{0x6FCF, 0x9DED},{0x6FD0, 0x9DEE},{0x6FD1, 0xE4FE},{0x6FD2, 0xB1F4},{0x6FD3, 0x9DEF},{0x6FD4, 0x9DF0}, - {0x6FD5, 0x9DF1},{0x6FD6, 0x9DF2},{0x6FD7, 0x9DF3},{0x6FD8, 0x9DF4},{0x6FD9, 0x9DF5},{0x6FDA, 0x9DF6},{0x6FDB, 0x9DF7},{0x6FDC, 0x9DF8}, - {0x6FDD, 0x9DF9},{0x6FDE, 0xE5A8},{0x6FDF, 0x9DFA},{0x6FE0, 0xE5A9},{0x6FE1, 0xE5A6},{0x6FE2, 0x9DFB},{0x6FE3, 0x9DFC},{0x6FE4, 0x9DFD}, - {0x6FE5, 0x9DFE},{0x6FE6, 0x9E40},{0x6FE7, 0x9E41},{0x6FE8, 0x9E42},{0x6FE9, 0x9E43},{0x6FEA, 0x9E44},{0x6FEB, 0x9E45},{0x6FEC, 0x9E46}, - {0x6FED, 0x9E47},{0x6FEE, 0xE5A7},{0x6FEF, 0xE5AA},{0x6FF0, 0x9E48},{0x6FF1, 0x9E49},{0x6FF2, 0x9E4A},{0x6FF3, 0x9E4B},{0x6FF4, 0x9E4C}, - {0x6FF5, 0x9E4D},{0x6FF6, 0x9E4E},{0x6FF7, 0x9E4F},{0x6FF8, 0x9E50},{0x6FF9, 0x9E51},{0x6FFA, 0x9E52},{0x6FFB, 0x9E53},{0x6FFC, 0x9E54}, - {0x6FFD, 0x9E55},{0x6FFE, 0x9E56},{0x6FFF, 0x9E57},{0x7000, 0x9E58},{0x7001, 0x9E59},{0x7002, 0x9E5A},{0x7003, 0x9E5B},{0x7004, 0x9E5C}, - {0x7005, 0x9E5D},{0x7006, 0x9E5E},{0x7007, 0x9E5F},{0x7008, 0x9E60},{0x7009, 0x9E61},{0x700A, 0x9E62},{0x700B, 0x9E63},{0x700C, 0x9E64}, - {0x700D, 0x9E65},{0x700E, 0x9E66},{0x700F, 0x9E67},{0x7010, 0x9E68},{0x7011, 0xC6D9},{0x7012, 0x9E69},{0x7013, 0x9E6A},{0x7014, 0x9E6B}, - {0x7015, 0x9E6C},{0x7016, 0x9E6D},{0x7017, 0x9E6E},{0x7018, 0x9E6F},{0x7019, 0x9E70},{0x701A, 0xE5AB},{0x701B, 0xE5AD},{0x701C, 0x9E71}, - {0x701D, 0x9E72},{0x701E, 0x9E73},{0x701F, 0x9E74},{0x7020, 0x9E75},{0x7021, 0x9E76},{0x7022, 0x9E77},{0x7023, 0xE5AC},{0x7024, 0x9E78}, - {0x7025, 0x9E79},{0x7026, 0x9E7A},{0x7027, 0x9E7B},{0x7028, 0x9E7C},{0x7029, 0x9E7D},{0x702A, 0x9E7E},{0x702B, 0x9E80},{0x702C, 0x9E81}, - {0x702D, 0x9E82},{0x702E, 0x9E83},{0x702F, 0x9E84},{0x7030, 0x9E85},{0x7031, 0x9E86},{0x7032, 0x9E87},{0x7033, 0x9E88},{0x7034, 0x9E89}, - {0x7035, 0xE5AF},{0x7036, 0x9E8A},{0x7037, 0x9E8B},{0x7038, 0x9E8C},{0x7039, 0xE5AE},{0x703A, 0x9E8D},{0x703B, 0x9E8E},{0x703C, 0x9E8F}, - {0x703D, 0x9E90},{0x703E, 0x9E91},{0x703F, 0x9E92},{0x7040, 0x9E93},{0x7041, 0x9E94},{0x7042, 0x9E95},{0x7043, 0x9E96},{0x7044, 0x9E97}, - {0x7045, 0x9E98},{0x7046, 0x9E99},{0x7047, 0x9E9A},{0x7048, 0x9E9B},{0x7049, 0x9E9C},{0x704A, 0x9E9D},{0x704B, 0x9E9E},{0x704C, 0xB9E0}, - {0x704D, 0x9E9F},{0x704E, 0x9EA0},{0x704F, 0xE5B0},{0x7050, 0x9EA1},{0x7051, 0x9EA2},{0x7052, 0x9EA3},{0x7053, 0x9EA4},{0x7054, 0x9EA5}, - {0x7055, 0x9EA6},{0x7056, 0x9EA7},{0x7057, 0x9EA8},{0x7058, 0x9EA9},{0x7059, 0x9EAA},{0x705A, 0x9EAB},{0x705B, 0x9EAC},{0x705C, 0x9EAD}, - {0x705D, 0x9EAE},{0x705E, 0xE5B1},{0x705F, 0x9EAF},{0x7060, 0x9EB0},{0x7061, 0x9EB1},{0x7062, 0x9EB2},{0x7063, 0x9EB3},{0x7064, 0x9EB4}, - {0x7065, 0x9EB5},{0x7066, 0x9EB6},{0x7067, 0x9EB7},{0x7068, 0x9EB8},{0x7069, 0x9EB9},{0x706A, 0x9EBA},{0x706B, 0xBBF0},{0x706C, 0xECE1}, - {0x706D, 0xC3F0},{0x706E, 0x9EBB},{0x706F, 0xB5C6},{0x7070, 0xBBD2},{0x7071, 0x9EBC},{0x7072, 0x9EBD},{0x7073, 0x9EBE},{0x7074, 0x9EBF}, - {0x7075, 0xC1E9},{0x7076, 0xD4EE},{0x7077, 0x9EC0},{0x7078, 0xBEC4},{0x7079, 0x9EC1},{0x707A, 0x9EC2},{0x707B, 0x9EC3},{0x707C, 0xD7C6}, - {0x707D, 0x9EC4},{0x707E, 0xD4D6},{0x707F, 0xB2D3},{0x7080, 0xECBE},{0x7081, 0x9EC5},{0x7082, 0x9EC6},{0x7083, 0x9EC7},{0x7084, 0x9EC8}, - {0x7085, 0xEAC1},{0x7086, 0x9EC9},{0x7087, 0x9ECA},{0x7088, 0x9ECB},{0x7089, 0xC2AF},{0x708A, 0xB4B6},{0x708B, 0x9ECC},{0x708C, 0x9ECD}, - {0x708D, 0x9ECE},{0x708E, 0xD1D7},{0x708F, 0x9ECF},{0x7090, 0x9ED0},{0x7091, 0x9ED1},{0x7092, 0xB3B4},{0x7093, 0x9ED2},{0x7094, 0xC8B2}, - {0x7095, 0xBFBB},{0x7096, 0xECC0},{0x7097, 0x9ED3},{0x7098, 0x9ED4},{0x7099, 0xD6CB},{0x709A, 0x9ED5},{0x709B, 0x9ED6},{0x709C, 0xECBF}, - {0x709D, 0xECC1},{0x709E, 0x9ED7},{0x709F, 0x9ED8},{0x70A0, 0x9ED9},{0x70A1, 0x9EDA},{0x70A2, 0x9EDB},{0x70A3, 0x9EDC},{0x70A4, 0x9EDD}, - {0x70A5, 0x9EDE},{0x70A6, 0x9EDF},{0x70A7, 0x9EE0},{0x70A8, 0x9EE1},{0x70A9, 0x9EE2},{0x70AA, 0x9EE3},{0x70AB, 0xECC5},{0x70AC, 0xBEE6}, - {0x70AD, 0xCCBF},{0x70AE, 0xC5DA},{0x70AF, 0xBEBC},{0x70B0, 0x9EE4},{0x70B1, 0xECC6},{0x70B2, 0x9EE5},{0x70B3, 0xB1FE},{0x70B4, 0x9EE6}, - {0x70B5, 0x9EE7},{0x70B6, 0x9EE8},{0x70B7, 0xECC4},{0x70B8, 0xD5A8},{0x70B9, 0xB5E3},{0x70BA, 0x9EE9},{0x70BB, 0xECC2},{0x70BC, 0xC1B6}, - {0x70BD, 0xB3E3},{0x70BE, 0x9EEA},{0x70BF, 0x9EEB},{0x70C0, 0xECC3},{0x70C1, 0xCBB8},{0x70C2, 0xC0C3},{0x70C3, 0xCCFE},{0x70C4, 0x9EEC}, - {0x70C5, 0x9EED},{0x70C6, 0x9EEE},{0x70C7, 0x9EEF},{0x70C8, 0xC1D2},{0x70C9, 0x9EF0},{0x70CA, 0xECC8},{0x70CB, 0x9EF1},{0x70CC, 0x9EF2}, - {0x70CD, 0x9EF3},{0x70CE, 0x9EF4},{0x70CF, 0x9EF5},{0x70D0, 0x9EF6},{0x70D1, 0x9EF7},{0x70D2, 0x9EF8},{0x70D3, 0x9EF9},{0x70D4, 0x9EFA}, - {0x70D5, 0x9EFB},{0x70D6, 0x9EFC},{0x70D7, 0x9EFD},{0x70D8, 0xBAE6},{0x70D9, 0xC0D3},{0x70DA, 0x9EFE},{0x70DB, 0xD6F2},{0x70DC, 0x9F40}, - {0x70DD, 0x9F41},{0x70DE, 0x9F42},{0x70DF, 0xD1CC},{0x70E0, 0x9F43},{0x70E1, 0x9F44},{0x70E2, 0x9F45},{0x70E3, 0x9F46},{0x70E4, 0xBFBE}, - {0x70E5, 0x9F47},{0x70E6, 0xB7B3},{0x70E7, 0xC9D5},{0x70E8, 0xECC7},{0x70E9, 0xBBE2},{0x70EA, 0x9F48},{0x70EB, 0xCCCC},{0x70EC, 0xBDFD}, - {0x70ED, 0xC8C8},{0x70EE, 0x9F49},{0x70EF, 0xCFA9},{0x70F0, 0x9F4A},{0x70F1, 0x9F4B},{0x70F2, 0x9F4C},{0x70F3, 0x9F4D},{0x70F4, 0x9F4E}, - {0x70F5, 0x9F4F},{0x70F6, 0x9F50},{0x70F7, 0xCDE9},{0x70F8, 0x9F51},{0x70F9, 0xC5EB},{0x70FA, 0x9F52},{0x70FB, 0x9F53},{0x70FC, 0x9F54}, - {0x70FD, 0xB7E9},{0x70FE, 0x9F55},{0x70FF, 0x9F56},{0x7100, 0x9F57},{0x7101, 0x9F58},{0x7102, 0x9F59},{0x7103, 0x9F5A},{0x7104, 0x9F5B}, - {0x7105, 0x9F5C},{0x7106, 0x9F5D},{0x7107, 0x9F5E},{0x7108, 0x9F5F},{0x7109, 0xD1C9},{0x710A, 0xBAB8},{0x710B, 0x9F60},{0x710C, 0x9F61}, - {0x710D, 0x9F62},{0x710E, 0x9F63},{0x710F, 0x9F64},{0x7110, 0xECC9},{0x7111, 0x9F65},{0x7112, 0x9F66},{0x7113, 0xECCA},{0x7114, 0x9F67}, - {0x7115, 0xBBC0},{0x7116, 0xECCB},{0x7117, 0x9F68},{0x7118, 0xECE2},{0x7119, 0xB1BA},{0x711A, 0xB7D9},{0x711B, 0x9F69},{0x711C, 0x9F6A}, - {0x711D, 0x9F6B},{0x711E, 0x9F6C},{0x711F, 0x9F6D},{0x7120, 0x9F6E},{0x7121, 0x9F6F},{0x7122, 0x9F70},{0x7123, 0x9F71},{0x7124, 0x9F72}, - {0x7125, 0x9F73},{0x7126, 0xBDB9},{0x7127, 0x9F74},{0x7128, 0x9F75},{0x7129, 0x9F76},{0x712A, 0x9F77},{0x712B, 0x9F78},{0x712C, 0x9F79}, - {0x712D, 0x9F7A},{0x712E, 0x9F7B},{0x712F, 0xECCC},{0x7130, 0xD1E6},{0x7131, 0xECCD},{0x7132, 0x9F7C},{0x7133, 0x9F7D},{0x7134, 0x9F7E}, - {0x7135, 0x9F80},{0x7136, 0xC8BB},{0x7137, 0x9F81},{0x7138, 0x9F82},{0x7139, 0x9F83},{0x713A, 0x9F84},{0x713B, 0x9F85},{0x713C, 0x9F86}, - {0x713D, 0x9F87},{0x713E, 0x9F88},{0x713F, 0x9F89},{0x7140, 0x9F8A},{0x7141, 0x9F8B},{0x7142, 0x9F8C},{0x7143, 0x9F8D},{0x7144, 0x9F8E}, - {0x7145, 0xECD1},{0x7146, 0x9F8F},{0x7147, 0x9F90},{0x7148, 0x9F91},{0x7149, 0x9F92},{0x714A, 0xECD3},{0x714B, 0x9F93},{0x714C, 0xBBCD}, - {0x714D, 0x9F94},{0x714E, 0xBCE5},{0x714F, 0x9F95},{0x7150, 0x9F96},{0x7151, 0x9F97},{0x7152, 0x9F98},{0x7153, 0x9F99},{0x7154, 0x9F9A}, - {0x7155, 0x9F9B},{0x7156, 0x9F9C},{0x7157, 0x9F9D},{0x7158, 0x9F9E},{0x7159, 0x9F9F},{0x715A, 0x9FA0},{0x715B, 0x9FA1},{0x715C, 0xECCF}, - {0x715D, 0x9FA2},{0x715E, 0xC9B7},{0x715F, 0x9FA3},{0x7160, 0x9FA4},{0x7161, 0x9FA5},{0x7162, 0x9FA6},{0x7163, 0x9FA7},{0x7164, 0xC3BA}, - {0x7165, 0x9FA8},{0x7166, 0xECE3},{0x7167, 0xD5D5},{0x7168, 0xECD0},{0x7169, 0x9FA9},{0x716A, 0x9FAA},{0x716B, 0x9FAB},{0x716C, 0x9FAC}, - {0x716D, 0x9FAD},{0x716E, 0xD6F3},{0x716F, 0x9FAE},{0x7170, 0x9FAF},{0x7171, 0x9FB0},{0x7172, 0xECD2},{0x7173, 0xECCE},{0x7174, 0x9FB1}, - {0x7175, 0x9FB2},{0x7176, 0x9FB3},{0x7177, 0x9FB4},{0x7178, 0xECD4},{0x7179, 0x9FB5},{0x717A, 0xECD5},{0x717B, 0x9FB6},{0x717C, 0x9FB7}, - {0x717D, 0xC9BF},{0x717E, 0x9FB8},{0x717F, 0x9FB9},{0x7180, 0x9FBA},{0x7181, 0x9FBB},{0x7182, 0x9FBC},{0x7183, 0x9FBD},{0x7184, 0xCFA8}, - {0x7185, 0x9FBE},{0x7186, 0x9FBF},{0x7187, 0x9FC0},{0x7188, 0x9FC1},{0x7189, 0x9FC2},{0x718A, 0xD0DC},{0x718B, 0x9FC3},{0x718C, 0x9FC4}, - {0x718D, 0x9FC5},{0x718E, 0x9FC6},{0x718F, 0xD1AC},{0x7190, 0x9FC7},{0x7191, 0x9FC8},{0x7192, 0x9FC9},{0x7193, 0x9FCA},{0x7194, 0xC8DB}, - {0x7195, 0x9FCB},{0x7196, 0x9FCC},{0x7197, 0x9FCD},{0x7198, 0xECD6},{0x7199, 0xCEF5},{0x719A, 0x9FCE},{0x719B, 0x9FCF},{0x719C, 0x9FD0}, - {0x719D, 0x9FD1},{0x719E, 0x9FD2},{0x719F, 0xCAEC},{0x71A0, 0xECDA},{0x71A1, 0x9FD3},{0x71A2, 0x9FD4},{0x71A3, 0x9FD5},{0x71A4, 0x9FD6}, - {0x71A5, 0x9FD7},{0x71A6, 0x9FD8},{0x71A7, 0x9FD9},{0x71A8, 0xECD9},{0x71A9, 0x9FDA},{0x71AA, 0x9FDB},{0x71AB, 0x9FDC},{0x71AC, 0xB0BE}, - {0x71AD, 0x9FDD},{0x71AE, 0x9FDE},{0x71AF, 0x9FDF},{0x71B0, 0x9FE0},{0x71B1, 0x9FE1},{0x71B2, 0x9FE2},{0x71B3, 0xECD7},{0x71B4, 0x9FE3}, - {0x71B5, 0xECD8},{0x71B6, 0x9FE4},{0x71B7, 0x9FE5},{0x71B8, 0x9FE6},{0x71B9, 0xECE4},{0x71BA, 0x9FE7},{0x71BB, 0x9FE8},{0x71BC, 0x9FE9}, - {0x71BD, 0x9FEA},{0x71BE, 0x9FEB},{0x71BF, 0x9FEC},{0x71C0, 0x9FED},{0x71C1, 0x9FEE},{0x71C2, 0x9FEF},{0x71C3, 0xC8BC},{0x71C4, 0x9FF0}, - {0x71C5, 0x9FF1},{0x71C6, 0x9FF2},{0x71C7, 0x9FF3},{0x71C8, 0x9FF4},{0x71C9, 0x9FF5},{0x71CA, 0x9FF6},{0x71CB, 0x9FF7},{0x71CC, 0x9FF8}, - {0x71CD, 0x9FF9},{0x71CE, 0xC1C7},{0x71CF, 0x9FFA},{0x71D0, 0x9FFB},{0x71D1, 0x9FFC},{0x71D2, 0x9FFD},{0x71D3, 0x9FFE},{0x71D4, 0xECDC}, - {0x71D5, 0xD1E0},{0x71D6, 0xA040},{0x71D7, 0xA041},{0x71D8, 0xA042},{0x71D9, 0xA043},{0x71DA, 0xA044},{0x71DB, 0xA045},{0x71DC, 0xA046}, - {0x71DD, 0xA047},{0x71DE, 0xA048},{0x71DF, 0xA049},{0x71E0, 0xECDB},{0x71E1, 0xA04A},{0x71E2, 0xA04B},{0x71E3, 0xA04C},{0x71E4, 0xA04D}, - {0x71E5, 0xD4EF},{0x71E6, 0xA04E},{0x71E7, 0xECDD},{0x71E8, 0xA04F},{0x71E9, 0xA050},{0x71EA, 0xA051},{0x71EB, 0xA052},{0x71EC, 0xA053}, - {0x71ED, 0xA054},{0x71EE, 0xDBC6},{0x71EF, 0xA055},{0x71F0, 0xA056},{0x71F1, 0xA057},{0x71F2, 0xA058},{0x71F3, 0xA059},{0x71F4, 0xA05A}, - {0x71F5, 0xA05B},{0x71F6, 0xA05C},{0x71F7, 0xA05D},{0x71F8, 0xA05E},{0x71F9, 0xECDE},{0x71FA, 0xA05F},{0x71FB, 0xA060},{0x71FC, 0xA061}, - {0x71FD, 0xA062},{0x71FE, 0xA063},{0x71FF, 0xA064},{0x7200, 0xA065},{0x7201, 0xA066},{0x7202, 0xA067},{0x7203, 0xA068},{0x7204, 0xA069}, - {0x7205, 0xA06A},{0x7206, 0xB1AC},{0x7207, 0xA06B},{0x7208, 0xA06C},{0x7209, 0xA06D},{0x720A, 0xA06E},{0x720B, 0xA06F},{0x720C, 0xA070}, - {0x720D, 0xA071},{0x720E, 0xA072},{0x720F, 0xA073},{0x7210, 0xA074},{0x7211, 0xA075},{0x7212, 0xA076},{0x7213, 0xA077},{0x7214, 0xA078}, - {0x7215, 0xA079},{0x7216, 0xA07A},{0x7217, 0xA07B},{0x7218, 0xA07C},{0x7219, 0xA07D},{0x721A, 0xA07E},{0x721B, 0xA080},{0x721C, 0xA081}, - {0x721D, 0xECDF},{0x721E, 0xA082},{0x721F, 0xA083},{0x7220, 0xA084},{0x7221, 0xA085},{0x7222, 0xA086},{0x7223, 0xA087},{0x7224, 0xA088}, - {0x7225, 0xA089},{0x7226, 0xA08A},{0x7227, 0xA08B},{0x7228, 0xECE0},{0x7229, 0xA08C},{0x722A, 0xD7A6},{0x722B, 0xA08D},{0x722C, 0xC5C0}, - {0x722D, 0xA08E},{0x722E, 0xA08F},{0x722F, 0xA090},{0x7230, 0xEBBC},{0x7231, 0xB0AE},{0x7232, 0xA091},{0x7233, 0xA092},{0x7234, 0xA093}, - {0x7235, 0xBEF4},{0x7236, 0xB8B8},{0x7237, 0xD2AF},{0x7238, 0xB0D6},{0x7239, 0xB5F9},{0x723A, 0xA094},{0x723B, 0xD8B3},{0x723C, 0xA095}, - {0x723D, 0xCBAC},{0x723E, 0xA096},{0x723F, 0xE3DD},{0x7240, 0xA097},{0x7241, 0xA098},{0x7242, 0xA099},{0x7243, 0xA09A},{0x7244, 0xA09B}, - {0x7245, 0xA09C},{0x7246, 0xA09D},{0x7247, 0xC6AC},{0x7248, 0xB0E6},{0x7249, 0xA09E},{0x724A, 0xA09F},{0x724B, 0xA0A0},{0x724C, 0xC5C6}, - {0x724D, 0xEBB9},{0x724E, 0xA0A1},{0x724F, 0xA0A2},{0x7250, 0xA0A3},{0x7251, 0xA0A4},{0x7252, 0xEBBA},{0x7253, 0xA0A5},{0x7254, 0xA0A6}, - {0x7255, 0xA0A7},{0x7256, 0xEBBB},{0x7257, 0xA0A8},{0x7258, 0xA0A9},{0x7259, 0xD1C0},{0x725A, 0xA0AA},{0x725B, 0xC5A3},{0x725C, 0xA0AB}, - {0x725D, 0xEAF2},{0x725E, 0xA0AC},{0x725F, 0xC4B2},{0x7260, 0xA0AD},{0x7261, 0xC4B5},{0x7262, 0xC0CE},{0x7263, 0xA0AE},{0x7264, 0xA0AF}, - {0x7265, 0xA0B0},{0x7266, 0xEAF3},{0x7267, 0xC4C1},{0x7268, 0xA0B1},{0x7269, 0xCEEF},{0x726A, 0xA0B2},{0x726B, 0xA0B3},{0x726C, 0xA0B4}, - {0x726D, 0xA0B5},{0x726E, 0xEAF0},{0x726F, 0xEAF4},{0x7270, 0xA0B6},{0x7271, 0xA0B7},{0x7272, 0xC9FC},{0x7273, 0xA0B8},{0x7274, 0xA0B9}, - {0x7275, 0xC7A3},{0x7276, 0xA0BA},{0x7277, 0xA0BB},{0x7278, 0xA0BC},{0x7279, 0xCCD8},{0x727A, 0xCEFE},{0x727B, 0xA0BD},{0x727C, 0xA0BE}, - {0x727D, 0xA0BF},{0x727E, 0xEAF5},{0x727F, 0xEAF6},{0x7280, 0xCFAC},{0x7281, 0xC0E7},{0x7282, 0xA0C0},{0x7283, 0xA0C1},{0x7284, 0xEAF7}, - {0x7285, 0xA0C2},{0x7286, 0xA0C3},{0x7287, 0xA0C4},{0x7288, 0xA0C5},{0x7289, 0xA0C6},{0x728A, 0xB6BF},{0x728B, 0xEAF8},{0x728C, 0xA0C7}, - {0x728D, 0xEAF9},{0x728E, 0xA0C8},{0x728F, 0xEAFA},{0x7290, 0xA0C9},{0x7291, 0xA0CA},{0x7292, 0xEAFB},{0x7293, 0xA0CB},{0x7294, 0xA0CC}, - {0x7295, 0xA0CD},{0x7296, 0xA0CE},{0x7297, 0xA0CF},{0x7298, 0xA0D0},{0x7299, 0xA0D1},{0x729A, 0xA0D2},{0x729B, 0xA0D3},{0x729C, 0xA0D4}, - {0x729D, 0xA0D5},{0x729E, 0xA0D6},{0x729F, 0xEAF1},{0x72A0, 0xA0D7},{0x72A1, 0xA0D8},{0x72A2, 0xA0D9},{0x72A3, 0xA0DA},{0x72A4, 0xA0DB}, - {0x72A5, 0xA0DC},{0x72A6, 0xA0DD},{0x72A7, 0xA0DE},{0x72A8, 0xA0DF},{0x72A9, 0xA0E0},{0x72AA, 0xA0E1},{0x72AB, 0xA0E2},{0x72AC, 0xC8AE}, - {0x72AD, 0xE1EB},{0x72AE, 0xA0E3},{0x72AF, 0xB7B8},{0x72B0, 0xE1EC},{0x72B1, 0xA0E4},{0x72B2, 0xA0E5},{0x72B3, 0xA0E6},{0x72B4, 0xE1ED}, - {0x72B5, 0xA0E7},{0x72B6, 0xD7B4},{0x72B7, 0xE1EE},{0x72B8, 0xE1EF},{0x72B9, 0xD3CC},{0x72BA, 0xA0E8},{0x72BB, 0xA0E9},{0x72BC, 0xA0EA}, - {0x72BD, 0xA0EB},{0x72BE, 0xA0EC},{0x72BF, 0xA0ED},{0x72C0, 0xA0EE},{0x72C1, 0xE1F1},{0x72C2, 0xBFF1},{0x72C3, 0xE1F0},{0x72C4, 0xB5D2}, - {0x72C5, 0xA0EF},{0x72C6, 0xA0F0},{0x72C7, 0xA0F1},{0x72C8, 0xB1B7},{0x72C9, 0xA0F2},{0x72CA, 0xA0F3},{0x72CB, 0xA0F4},{0x72CC, 0xA0F5}, - {0x72CD, 0xE1F3},{0x72CE, 0xE1F2},{0x72CF, 0xA0F6},{0x72D0, 0xBAFC},{0x72D1, 0xA0F7},{0x72D2, 0xE1F4},{0x72D3, 0xA0F8},{0x72D4, 0xA0F9}, - {0x72D5, 0xA0FA},{0x72D6, 0xA0FB},{0x72D7, 0xB9B7},{0x72D8, 0xA0FC},{0x72D9, 0xBED1},{0x72DA, 0xA0FD},{0x72DB, 0xA0FE},{0x72DC, 0xAA40}, - {0x72DD, 0xAA41},{0x72DE, 0xC4FC},{0x72DF, 0xAA42},{0x72E0, 0xBADD},{0x72E1, 0xBDC6},{0x72E2, 0xAA43},{0x72E3, 0xAA44},{0x72E4, 0xAA45}, - {0x72E5, 0xAA46},{0x72E6, 0xAA47},{0x72E7, 0xAA48},{0x72E8, 0xE1F5},{0x72E9, 0xE1F7},{0x72EA, 0xAA49},{0x72EB, 0xAA4A},{0x72EC, 0xB6C0}, - {0x72ED, 0xCFC1},{0x72EE, 0xCAA8},{0x72EF, 0xE1F6},{0x72F0, 0xD5F8},{0x72F1, 0xD3FC},{0x72F2, 0xE1F8},{0x72F3, 0xE1FC},{0x72F4, 0xE1F9}, - {0x72F5, 0xAA4B},{0x72F6, 0xAA4C},{0x72F7, 0xE1FA},{0x72F8, 0xC0EA},{0x72F9, 0xAA4D},{0x72FA, 0xE1FE},{0x72FB, 0xE2A1},{0x72FC, 0xC0C7}, - {0x72FD, 0xAA4E},{0x72FE, 0xAA4F},{0x72FF, 0xAA50},{0x7300, 0xAA51},{0x7301, 0xE1FB},{0x7302, 0xAA52},{0x7303, 0xE1FD},{0x7304, 0xAA53}, - {0x7305, 0xAA54},{0x7306, 0xAA55},{0x7307, 0xAA56},{0x7308, 0xAA57},{0x7309, 0xAA58},{0x730A, 0xE2A5},{0x730B, 0xAA59},{0x730C, 0xAA5A}, - {0x730D, 0xAA5B},{0x730E, 0xC1D4},{0x730F, 0xAA5C},{0x7310, 0xAA5D},{0x7311, 0xAA5E},{0x7312, 0xAA5F},{0x7313, 0xE2A3},{0x7314, 0xAA60}, - {0x7315, 0xE2A8},{0x7316, 0xB2FE},{0x7317, 0xE2A2},{0x7318, 0xAA61},{0x7319, 0xAA62},{0x731A, 0xAA63},{0x731B, 0xC3CD},{0x731C, 0xB2C2}, - {0x731D, 0xE2A7},{0x731E, 0xE2A6},{0x731F, 0xAA64},{0x7320, 0xAA65},{0x7321, 0xE2A4},{0x7322, 0xE2A9},{0x7323, 0xAA66},{0x7324, 0xAA67}, - {0x7325, 0xE2AB},{0x7326, 0xAA68},{0x7327, 0xAA69},{0x7328, 0xAA6A},{0x7329, 0xD0C9},{0x732A, 0xD6ED},{0x732B, 0xC3A8},{0x732C, 0xE2AC}, - {0x732D, 0xAA6B},{0x732E, 0xCFD7},{0x732F, 0xAA6C},{0x7330, 0xAA6D},{0x7331, 0xE2AE},{0x7332, 0xAA6E},{0x7333, 0xAA6F},{0x7334, 0xBAEF}, - {0x7335, 0xAA70},{0x7336, 0xAA71},{0x7337, 0xE9E0},{0x7338, 0xE2AD},{0x7339, 0xE2AA},{0x733A, 0xAA72},{0x733B, 0xAA73},{0x733C, 0xAA74}, - {0x733D, 0xAA75},{0x733E, 0xBBAB},{0x733F, 0xD4B3},{0x7340, 0xAA76},{0x7341, 0xAA77},{0x7342, 0xAA78},{0x7343, 0xAA79},{0x7344, 0xAA7A}, - {0x7345, 0xAA7B},{0x7346, 0xAA7C},{0x7347, 0xAA7D},{0x7348, 0xAA7E},{0x7349, 0xAA80},{0x734A, 0xAA81},{0x734B, 0xAA82},{0x734C, 0xAA83}, - {0x734D, 0xE2B0},{0x734E, 0xAA84},{0x734F, 0xAA85},{0x7350, 0xE2AF},{0x7351, 0xAA86},{0x7352, 0xE9E1},{0x7353, 0xAA87},{0x7354, 0xAA88}, - {0x7355, 0xAA89},{0x7356, 0xAA8A},{0x7357, 0xE2B1},{0x7358, 0xAA8B},{0x7359, 0xAA8C},{0x735A, 0xAA8D},{0x735B, 0xAA8E},{0x735C, 0xAA8F}, - {0x735D, 0xAA90},{0x735E, 0xAA91},{0x735F, 0xAA92},{0x7360, 0xE2B2},{0x7361, 0xAA93},{0x7362, 0xAA94},{0x7363, 0xAA95},{0x7364, 0xAA96}, - {0x7365, 0xAA97},{0x7366, 0xAA98},{0x7367, 0xAA99},{0x7368, 0xAA9A},{0x7369, 0xAA9B},{0x736A, 0xAA9C},{0x736B, 0xAA9D},{0x736C, 0xE2B3}, - {0x736D, 0xCCA1},{0x736E, 0xAA9E},{0x736F, 0xE2B4},{0x7370, 0xAA9F},{0x7371, 0xAAA0},{0x7372, 0xAB40},{0x7373, 0xAB41},{0x7374, 0xAB42}, - {0x7375, 0xAB43},{0x7376, 0xAB44},{0x7377, 0xAB45},{0x7378, 0xAB46},{0x7379, 0xAB47},{0x737A, 0xAB48},{0x737B, 0xAB49},{0x737C, 0xAB4A}, - {0x737D, 0xAB4B},{0x737E, 0xE2B5},{0x737F, 0xAB4C},{0x7380, 0xAB4D},{0x7381, 0xAB4E},{0x7382, 0xAB4F},{0x7383, 0xAB50},{0x7384, 0xD0FE}, - {0x7385, 0xAB51},{0x7386, 0xAB52},{0x7387, 0xC2CA},{0x7388, 0xAB53},{0x7389, 0xD3F1},{0x738A, 0xAB54},{0x738B, 0xCDF5},{0x738C, 0xAB55}, - {0x738D, 0xAB56},{0x738E, 0xE7E0},{0x738F, 0xAB57},{0x7390, 0xAB58},{0x7391, 0xE7E1},{0x7392, 0xAB59},{0x7393, 0xAB5A},{0x7394, 0xAB5B}, - {0x7395, 0xAB5C},{0x7396, 0xBEC1},{0x7397, 0xAB5D},{0x7398, 0xAB5E},{0x7399, 0xAB5F},{0x739A, 0xAB60},{0x739B, 0xC2EA},{0x739C, 0xAB61}, - {0x739D, 0xAB62},{0x739E, 0xAB63},{0x739F, 0xE7E4},{0x73A0, 0xAB64},{0x73A1, 0xAB65},{0x73A2, 0xE7E3},{0x73A3, 0xAB66},{0x73A4, 0xAB67}, - {0x73A5, 0xAB68},{0x73A6, 0xAB69},{0x73A7, 0xAB6A},{0x73A8, 0xAB6B},{0x73A9, 0xCDE6},{0x73AA, 0xAB6C},{0x73AB, 0xC3B5},{0x73AC, 0xAB6D}, - {0x73AD, 0xAB6E},{0x73AE, 0xE7E2},{0x73AF, 0xBBB7},{0x73B0, 0xCFD6},{0x73B1, 0xAB6F},{0x73B2, 0xC1E1},{0x73B3, 0xE7E9},{0x73B4, 0xAB70}, - {0x73B5, 0xAB71},{0x73B6, 0xAB72},{0x73B7, 0xE7E8},{0x73B8, 0xAB73},{0x73B9, 0xAB74},{0x73BA, 0xE7F4},{0x73BB, 0xB2A3},{0x73BC, 0xAB75}, - {0x73BD, 0xAB76},{0x73BE, 0xAB77},{0x73BF, 0xAB78},{0x73C0, 0xE7EA},{0x73C1, 0xAB79},{0x73C2, 0xE7E6},{0x73C3, 0xAB7A},{0x73C4, 0xAB7B}, - {0x73C5, 0xAB7C},{0x73C6, 0xAB7D},{0x73C7, 0xAB7E},{0x73C8, 0xE7EC},{0x73C9, 0xE7EB},{0x73CA, 0xC9BA},{0x73CB, 0xAB80},{0x73CC, 0xAB81}, - {0x73CD, 0xD5E4},{0x73CE, 0xAB82},{0x73CF, 0xE7E5},{0x73D0, 0xB7A9},{0x73D1, 0xE7E7},{0x73D2, 0xAB83},{0x73D3, 0xAB84},{0x73D4, 0xAB85}, - {0x73D5, 0xAB86},{0x73D6, 0xAB87},{0x73D7, 0xAB88},{0x73D8, 0xAB89},{0x73D9, 0xE7EE},{0x73DA, 0xAB8A},{0x73DB, 0xAB8B},{0x73DC, 0xAB8C}, - {0x73DD, 0xAB8D},{0x73DE, 0xE7F3},{0x73DF, 0xAB8E},{0x73E0, 0xD6E9},{0x73E1, 0xAB8F},{0x73E2, 0xAB90},{0x73E3, 0xAB91},{0x73E4, 0xAB92}, - {0x73E5, 0xE7ED},{0x73E6, 0xAB93},{0x73E7, 0xE7F2},{0x73E8, 0xAB94},{0x73E9, 0xE7F1},{0x73EA, 0xAB95},{0x73EB, 0xAB96},{0x73EC, 0xAB97}, - {0x73ED, 0xB0E0},{0x73EE, 0xAB98},{0x73EF, 0xAB99},{0x73F0, 0xAB9A},{0x73F1, 0xAB9B},{0x73F2, 0xE7F5},{0x73F3, 0xAB9C},{0x73F4, 0xAB9D}, - {0x73F5, 0xAB9E},{0x73F6, 0xAB9F},{0x73F7, 0xABA0},{0x73F8, 0xAC40},{0x73F9, 0xAC41},{0x73FA, 0xAC42},{0x73FB, 0xAC43},{0x73FC, 0xAC44}, - {0x73FD, 0xAC45},{0x73FE, 0xAC46},{0x73FF, 0xAC47},{0x7400, 0xAC48},{0x7401, 0xAC49},{0x7402, 0xAC4A},{0x7403, 0xC7F2},{0x7404, 0xAC4B}, - {0x7405, 0xC0C5},{0x7406, 0xC0ED},{0x7407, 0xAC4C},{0x7408, 0xAC4D},{0x7409, 0xC1F0},{0x740A, 0xE7F0},{0x740B, 0xAC4E},{0x740C, 0xAC4F}, - {0x740D, 0xAC50},{0x740E, 0xAC51},{0x740F, 0xE7F6},{0x7410, 0xCBF6},{0x7411, 0xAC52},{0x7412, 0xAC53},{0x7413, 0xAC54},{0x7414, 0xAC55}, - {0x7415, 0xAC56},{0x7416, 0xAC57},{0x7417, 0xAC58},{0x7418, 0xAC59},{0x7419, 0xAC5A},{0x741A, 0xE8A2},{0x741B, 0xE8A1},{0x741C, 0xAC5B}, - {0x741D, 0xAC5C},{0x741E, 0xAC5D},{0x741F, 0xAC5E},{0x7420, 0xAC5F},{0x7421, 0xAC60},{0x7422, 0xD7C1},{0x7423, 0xAC61},{0x7424, 0xAC62}, - {0x7425, 0xE7FA},{0x7426, 0xE7F9},{0x7427, 0xAC63},{0x7428, 0xE7FB},{0x7429, 0xAC64},{0x742A, 0xE7F7},{0x742B, 0xAC65},{0x742C, 0xE7FE}, - {0x742D, 0xAC66},{0x742E, 0xE7FD},{0x742F, 0xAC67},{0x7430, 0xE7FC},{0x7431, 0xAC68},{0x7432, 0xAC69},{0x7433, 0xC1D5},{0x7434, 0xC7D9}, - {0x7435, 0xC5FD},{0x7436, 0xC5C3},{0x7437, 0xAC6A},{0x7438, 0xAC6B},{0x7439, 0xAC6C},{0x743A, 0xAC6D},{0x743B, 0xAC6E},{0x743C, 0xC7ED}, - {0x743D, 0xAC6F},{0x743E, 0xAC70},{0x743F, 0xAC71},{0x7440, 0xAC72},{0x7441, 0xE8A3},{0x7442, 0xAC73},{0x7443, 0xAC74},{0x7444, 0xAC75}, - {0x7445, 0xAC76},{0x7446, 0xAC77},{0x7447, 0xAC78},{0x7448, 0xAC79},{0x7449, 0xAC7A},{0x744A, 0xAC7B},{0x744B, 0xAC7C},{0x744C, 0xAC7D}, - {0x744D, 0xAC7E},{0x744E, 0xAC80},{0x744F, 0xAC81},{0x7450, 0xAC82},{0x7451, 0xAC83},{0x7452, 0xAC84},{0x7453, 0xAC85},{0x7454, 0xAC86}, - {0x7455, 0xE8A6},{0x7456, 0xAC87},{0x7457, 0xE8A5},{0x7458, 0xAC88},{0x7459, 0xE8A7},{0x745A, 0xBAF7},{0x745B, 0xE7F8},{0x745C, 0xE8A4}, - {0x745D, 0xAC89},{0x745E, 0xC8F0},{0x745F, 0xC9AA},{0x7460, 0xAC8A},{0x7461, 0xAC8B},{0x7462, 0xAC8C},{0x7463, 0xAC8D},{0x7464, 0xAC8E}, - {0x7465, 0xAC8F},{0x7466, 0xAC90},{0x7467, 0xAC91},{0x7468, 0xAC92},{0x7469, 0xAC93},{0x746A, 0xAC94},{0x746B, 0xAC95},{0x746C, 0xAC96}, - {0x746D, 0xE8A9},{0x746E, 0xAC97},{0x746F, 0xAC98},{0x7470, 0xB9E5},{0x7471, 0xAC99},{0x7472, 0xAC9A},{0x7473, 0xAC9B},{0x7474, 0xAC9C}, - {0x7475, 0xAC9D},{0x7476, 0xD1FE},{0x7477, 0xE8A8},{0x7478, 0xAC9E},{0x7479, 0xAC9F},{0x747A, 0xACA0},{0x747B, 0xAD40},{0x747C, 0xAD41}, - {0x747D, 0xAD42},{0x747E, 0xE8AA},{0x747F, 0xAD43},{0x7480, 0xE8AD},{0x7481, 0xE8AE},{0x7482, 0xAD44},{0x7483, 0xC1A7},{0x7484, 0xAD45}, - {0x7485, 0xAD46},{0x7486, 0xAD47},{0x7487, 0xE8AF},{0x7488, 0xAD48},{0x7489, 0xAD49},{0x748A, 0xAD4A},{0x748B, 0xE8B0},{0x748C, 0xAD4B}, - {0x748D, 0xAD4C},{0x748E, 0xE8AC},{0x748F, 0xAD4D},{0x7490, 0xE8B4},{0x7491, 0xAD4E},{0x7492, 0xAD4F},{0x7493, 0xAD50},{0x7494, 0xAD51}, - {0x7495, 0xAD52},{0x7496, 0xAD53},{0x7497, 0xAD54},{0x7498, 0xAD55},{0x7499, 0xAD56},{0x749A, 0xAD57},{0x749B, 0xAD58},{0x749C, 0xE8AB}, - {0x749D, 0xAD59},{0x749E, 0xE8B1},{0x749F, 0xAD5A},{0x74A0, 0xAD5B},{0x74A1, 0xAD5C},{0x74A2, 0xAD5D},{0x74A3, 0xAD5E},{0x74A4, 0xAD5F}, - {0x74A5, 0xAD60},{0x74A6, 0xAD61},{0x74A7, 0xE8B5},{0x74A8, 0xE8B2},{0x74A9, 0xE8B3},{0x74AA, 0xAD62},{0x74AB, 0xAD63},{0x74AC, 0xAD64}, - {0x74AD, 0xAD65},{0x74AE, 0xAD66},{0x74AF, 0xAD67},{0x74B0, 0xAD68},{0x74B1, 0xAD69},{0x74B2, 0xAD6A},{0x74B3, 0xAD6B},{0x74B4, 0xAD6C}, - {0x74B5, 0xAD6D},{0x74B6, 0xAD6E},{0x74B7, 0xAD6F},{0x74B8, 0xAD70},{0x74B9, 0xAD71},{0x74BA, 0xE8B7},{0x74BB, 0xAD72},{0x74BC, 0xAD73}, - {0x74BD, 0xAD74},{0x74BE, 0xAD75},{0x74BF, 0xAD76},{0x74C0, 0xAD77},{0x74C1, 0xAD78},{0x74C2, 0xAD79},{0x74C3, 0xAD7A},{0x74C4, 0xAD7B}, - {0x74C5, 0xAD7C},{0x74C6, 0xAD7D},{0x74C7, 0xAD7E},{0x74C8, 0xAD80},{0x74C9, 0xAD81},{0x74CA, 0xAD82},{0x74CB, 0xAD83},{0x74CC, 0xAD84}, - {0x74CD, 0xAD85},{0x74CE, 0xAD86},{0x74CF, 0xAD87},{0x74D0, 0xAD88},{0x74D1, 0xAD89},{0x74D2, 0xE8B6},{0x74D3, 0xAD8A},{0x74D4, 0xAD8B}, - {0x74D5, 0xAD8C},{0x74D6, 0xAD8D},{0x74D7, 0xAD8E},{0x74D8, 0xAD8F},{0x74D9, 0xAD90},{0x74DA, 0xAD91},{0x74DB, 0xAD92},{0x74DC, 0xB9CF}, - {0x74DD, 0xAD93},{0x74DE, 0xF0AC},{0x74DF, 0xAD94},{0x74E0, 0xF0AD},{0x74E1, 0xAD95},{0x74E2, 0xC6B0},{0x74E3, 0xB0EA},{0x74E4, 0xC8BF}, - {0x74E5, 0xAD96},{0x74E6, 0xCDDF},{0x74E7, 0xAD97},{0x74E8, 0xAD98},{0x74E9, 0xAD99},{0x74EA, 0xAD9A},{0x74EB, 0xAD9B},{0x74EC, 0xAD9C}, - {0x74ED, 0xAD9D},{0x74EE, 0xCECD},{0x74EF, 0xEAB1},{0x74F0, 0xAD9E},{0x74F1, 0xAD9F},{0x74F2, 0xADA0},{0x74F3, 0xAE40},{0x74F4, 0xEAB2}, - {0x74F5, 0xAE41},{0x74F6, 0xC6BF},{0x74F7, 0xB4C9},{0x74F8, 0xAE42},{0x74F9, 0xAE43},{0x74FA, 0xAE44},{0x74FB, 0xAE45},{0x74FC, 0xAE46}, - {0x74FD, 0xAE47},{0x74FE, 0xAE48},{0x74FF, 0xEAB3},{0x7500, 0xAE49},{0x7501, 0xAE4A},{0x7502, 0xAE4B},{0x7503, 0xAE4C},{0x7504, 0xD5E7}, - {0x7505, 0xAE4D},{0x7506, 0xAE4E},{0x7507, 0xAE4F},{0x7508, 0xAE50},{0x7509, 0xAE51},{0x750A, 0xAE52},{0x750B, 0xAE53},{0x750C, 0xAE54}, - {0x750D, 0xDDF9},{0x750E, 0xAE55},{0x750F, 0xEAB4},{0x7510, 0xAE56},{0x7511, 0xEAB5},{0x7512, 0xAE57},{0x7513, 0xEAB6},{0x7514, 0xAE58}, - {0x7515, 0xAE59},{0x7516, 0xAE5A},{0x7517, 0xAE5B},{0x7518, 0xB8CA},{0x7519, 0xDFB0},{0x751A, 0xC9F5},{0x751B, 0xAE5C},{0x751C, 0xCCF0}, - {0x751D, 0xAE5D},{0x751E, 0xAE5E},{0x751F, 0xC9FA},{0x7520, 0xAE5F},{0x7521, 0xAE60},{0x7522, 0xAE61},{0x7523, 0xAE62},{0x7524, 0xAE63}, - {0x7525, 0xC9FB},{0x7526, 0xAE64},{0x7527, 0xAE65},{0x7528, 0xD3C3},{0x7529, 0xCBA6},{0x752A, 0xAE66},{0x752B, 0xB8A6},{0x752C, 0xF0AE}, - {0x752D, 0xB1C2},{0x752E, 0xAE67},{0x752F, 0xE5B8},{0x7530, 0xCCEF},{0x7531, 0xD3C9},{0x7532, 0xBCD7},{0x7533, 0xC9EA},{0x7534, 0xAE68}, - {0x7535, 0xB5E7},{0x7536, 0xAE69},{0x7537, 0xC4D0},{0x7538, 0xB5E9},{0x7539, 0xAE6A},{0x753A, 0xEEAE},{0x753B, 0xBBAD},{0x753C, 0xAE6B}, - {0x753D, 0xAE6C},{0x753E, 0xE7DE},{0x753F, 0xAE6D},{0x7540, 0xEEAF},{0x7541, 0xAE6E},{0x7542, 0xAE6F},{0x7543, 0xAE70},{0x7544, 0xAE71}, - {0x7545, 0xB3A9},{0x7546, 0xAE72},{0x7547, 0xAE73},{0x7548, 0xEEB2},{0x7549, 0xAE74},{0x754A, 0xAE75},{0x754B, 0xEEB1},{0x754C, 0xBDE7}, - {0x754D, 0xAE76},{0x754E, 0xEEB0},{0x754F, 0xCEB7},{0x7550, 0xAE77},{0x7551, 0xAE78},{0x7552, 0xAE79},{0x7553, 0xAE7A},{0x7554, 0xC5CF}, - {0x7555, 0xAE7B},{0x7556, 0xAE7C},{0x7557, 0xAE7D},{0x7558, 0xAE7E},{0x7559, 0xC1F4},{0x755A, 0xDBCE},{0x755B, 0xEEB3},{0x755C, 0xD0F3}, - {0x755D, 0xAE80},{0x755E, 0xAE81},{0x755F, 0xAE82},{0x7560, 0xAE83},{0x7561, 0xAE84},{0x7562, 0xAE85},{0x7563, 0xAE86},{0x7564, 0xAE87}, - {0x7565, 0xC2D4},{0x7566, 0xC6E8},{0x7567, 0xAE88},{0x7568, 0xAE89},{0x7569, 0xAE8A},{0x756A, 0xB7AC},{0x756B, 0xAE8B},{0x756C, 0xAE8C}, - {0x756D, 0xAE8D},{0x756E, 0xAE8E},{0x756F, 0xAE8F},{0x7570, 0xAE90},{0x7571, 0xAE91},{0x7572, 0xEEB4},{0x7573, 0xAE92},{0x7574, 0xB3EB}, - {0x7575, 0xAE93},{0x7576, 0xAE94},{0x7577, 0xAE95},{0x7578, 0xBBFB},{0x7579, 0xEEB5},{0x757A, 0xAE96},{0x757B, 0xAE97},{0x757C, 0xAE98}, - {0x757D, 0xAE99},{0x757E, 0xAE9A},{0x757F, 0xE7DC},{0x7580, 0xAE9B},{0x7581, 0xAE9C},{0x7582, 0xAE9D},{0x7583, 0xEEB6},{0x7584, 0xAE9E}, - {0x7585, 0xAE9F},{0x7586, 0xBDAE},{0x7587, 0xAEA0},{0x7588, 0xAF40},{0x7589, 0xAF41},{0x758A, 0xAF42},{0x758B, 0xF1E2},{0x758C, 0xAF43}, - {0x758D, 0xAF44},{0x758E, 0xAF45},{0x758F, 0xCAE8},{0x7590, 0xAF46},{0x7591, 0xD2C9},{0x7592, 0xF0DA},{0x7593, 0xAF47},{0x7594, 0xF0DB}, - {0x7595, 0xAF48},{0x7596, 0xF0DC},{0x7597, 0xC1C6},{0x7598, 0xAF49},{0x7599, 0xB8ED},{0x759A, 0xBECE},{0x759B, 0xAF4A},{0x759C, 0xAF4B}, - {0x759D, 0xF0DE},{0x759E, 0xAF4C},{0x759F, 0xC5B1},{0x75A0, 0xF0DD},{0x75A1, 0xD1F1},{0x75A2, 0xAF4D},{0x75A3, 0xF0E0},{0x75A4, 0xB0CC}, - {0x75A5, 0xBDEA},{0x75A6, 0xAF4E},{0x75A7, 0xAF4F},{0x75A8, 0xAF50},{0x75A9, 0xAF51},{0x75AA, 0xAF52},{0x75AB, 0xD2DF},{0x75AC, 0xF0DF}, - {0x75AD, 0xAF53},{0x75AE, 0xB4AF},{0x75AF, 0xB7E8},{0x75B0, 0xF0E6},{0x75B1, 0xF0E5},{0x75B2, 0xC6A3},{0x75B3, 0xF0E1},{0x75B4, 0xF0E2}, - {0x75B5, 0xB4C3},{0x75B6, 0xAF54},{0x75B7, 0xAF55},{0x75B8, 0xF0E3},{0x75B9, 0xD5EE},{0x75BA, 0xAF56},{0x75BB, 0xAF57},{0x75BC, 0xCCDB}, - {0x75BD, 0xBED2},{0x75BE, 0xBCB2},{0x75BF, 0xAF58},{0x75C0, 0xAF59},{0x75C1, 0xAF5A},{0x75C2, 0xF0E8},{0x75C3, 0xF0E7},{0x75C4, 0xF0E4}, - {0x75C5, 0xB2A1},{0x75C6, 0xAF5B},{0x75C7, 0xD6A2},{0x75C8, 0xD3B8},{0x75C9, 0xBEB7},{0x75CA, 0xC8AC},{0x75CB, 0xAF5C},{0x75CC, 0xAF5D}, - {0x75CD, 0xF0EA},{0x75CE, 0xAF5E},{0x75CF, 0xAF5F},{0x75D0, 0xAF60},{0x75D1, 0xAF61},{0x75D2, 0xD1F7},{0x75D3, 0xAF62},{0x75D4, 0xD6CC}, - {0x75D5, 0xBADB},{0x75D6, 0xF0E9},{0x75D7, 0xAF63},{0x75D8, 0xB6BB},{0x75D9, 0xAF64},{0x75DA, 0xAF65},{0x75DB, 0xCDB4},{0x75DC, 0xAF66}, - {0x75DD, 0xAF67},{0x75DE, 0xC6A6},{0x75DF, 0xAF68},{0x75E0, 0xAF69},{0x75E1, 0xAF6A},{0x75E2, 0xC1A1},{0x75E3, 0xF0EB},{0x75E4, 0xF0EE}, - {0x75E5, 0xAF6B},{0x75E6, 0xF0ED},{0x75E7, 0xF0F0},{0x75E8, 0xF0EC},{0x75E9, 0xAF6C},{0x75EA, 0xBBBE},{0x75EB, 0xF0EF},{0x75EC, 0xAF6D}, - {0x75ED, 0xAF6E},{0x75EE, 0xAF6F},{0x75EF, 0xAF70},{0x75F0, 0xCCB5},{0x75F1, 0xF0F2},{0x75F2, 0xAF71},{0x75F3, 0xAF72},{0x75F4, 0xB3D5}, - {0x75F5, 0xAF73},{0x75F6, 0xAF74},{0x75F7, 0xAF75},{0x75F8, 0xAF76},{0x75F9, 0xB1D4},{0x75FA, 0xAF77},{0x75FB, 0xAF78},{0x75FC, 0xF0F3}, - {0x75FD, 0xAF79},{0x75FE, 0xAF7A},{0x75FF, 0xF0F4},{0x7600, 0xF0F6},{0x7601, 0xB4E1},{0x7602, 0xAF7B},{0x7603, 0xF0F1},{0x7604, 0xAF7C}, - {0x7605, 0xF0F7},{0x7606, 0xAF7D},{0x7607, 0xAF7E},{0x7608, 0xAF80},{0x7609, 0xAF81},{0x760A, 0xF0FA},{0x760B, 0xAF82},{0x760C, 0xF0F8}, - {0x760D, 0xAF83},{0x760E, 0xAF84},{0x760F, 0xAF85},{0x7610, 0xF0F5},{0x7611, 0xAF86},{0x7612, 0xAF87},{0x7613, 0xAF88},{0x7614, 0xAF89}, - {0x7615, 0xF0FD},{0x7616, 0xAF8A},{0x7617, 0xF0F9},{0x7618, 0xF0FC},{0x7619, 0xF0FE},{0x761A, 0xAF8B},{0x761B, 0xF1A1},{0x761C, 0xAF8C}, - {0x761D, 0xAF8D},{0x761E, 0xAF8E},{0x761F, 0xCEC1},{0x7620, 0xF1A4},{0x7621, 0xAF8F},{0x7622, 0xF1A3},{0x7623, 0xAF90},{0x7624, 0xC1F6}, - {0x7625, 0xF0FB},{0x7626, 0xCADD},{0x7627, 0xAF91},{0x7628, 0xAF92},{0x7629, 0xB4F1},{0x762A, 0xB1F1},{0x762B, 0xCCB1},{0x762C, 0xAF93}, - {0x762D, 0xF1A6},{0x762E, 0xAF94},{0x762F, 0xAF95},{0x7630, 0xF1A7},{0x7631, 0xAF96},{0x7632, 0xAF97},{0x7633, 0xF1AC},{0x7634, 0xD5CE}, - {0x7635, 0xF1A9},{0x7636, 0xAF98},{0x7637, 0xAF99},{0x7638, 0xC8B3},{0x7639, 0xAF9A},{0x763A, 0xAF9B},{0x763B, 0xAF9C},{0x763C, 0xF1A2}, - {0x763D, 0xAF9D},{0x763E, 0xF1AB},{0x763F, 0xF1A8},{0x7640, 0xF1A5},{0x7641, 0xAF9E},{0x7642, 0xAF9F},{0x7643, 0xF1AA},{0x7644, 0xAFA0}, - {0x7645, 0xB040},{0x7646, 0xB041},{0x7647, 0xB042},{0x7648, 0xB043},{0x7649, 0xB044},{0x764A, 0xB045},{0x764B, 0xB046},{0x764C, 0xB0A9}, - {0x764D, 0xF1AD},{0x764E, 0xB047},{0x764F, 0xB048},{0x7650, 0xB049},{0x7651, 0xB04A},{0x7652, 0xB04B},{0x7653, 0xB04C},{0x7654, 0xF1AF}, - {0x7655, 0xB04D},{0x7656, 0xF1B1},{0x7657, 0xB04E},{0x7658, 0xB04F},{0x7659, 0xB050},{0x765A, 0xB051},{0x765B, 0xB052},{0x765C, 0xF1B0}, - {0x765D, 0xB053},{0x765E, 0xF1AE},{0x765F, 0xB054},{0x7660, 0xB055},{0x7661, 0xB056},{0x7662, 0xB057},{0x7663, 0xD1A2},{0x7664, 0xB058}, - {0x7665, 0xB059},{0x7666, 0xB05A},{0x7667, 0xB05B},{0x7668, 0xB05C},{0x7669, 0xB05D},{0x766A, 0xB05E},{0x766B, 0xF1B2},{0x766C, 0xB05F}, - {0x766D, 0xB060},{0x766E, 0xB061},{0x766F, 0xF1B3},{0x7670, 0xB062},{0x7671, 0xB063},{0x7672, 0xB064},{0x7673, 0xB065},{0x7674, 0xB066}, - {0x7675, 0xB067},{0x7676, 0xB068},{0x7677, 0xB069},{0x7678, 0xB9EF},{0x7679, 0xB06A},{0x767A, 0xB06B},{0x767B, 0xB5C7},{0x767C, 0xB06C}, - {0x767D, 0xB0D7},{0x767E, 0xB0D9},{0x767F, 0xB06D},{0x7680, 0xB06E},{0x7681, 0xB06F},{0x7682, 0xD4ED},{0x7683, 0xB070},{0x7684, 0xB5C4}, - {0x7685, 0xB071},{0x7686, 0xBDD4},{0x7687, 0xBBCA},{0x7688, 0xF0A7},{0x7689, 0xB072},{0x768A, 0xB073},{0x768B, 0xB8DE},{0x768C, 0xB074}, - {0x768D, 0xB075},{0x768E, 0xF0A8},{0x768F, 0xB076},{0x7690, 0xB077},{0x7691, 0xB0A8},{0x7692, 0xB078},{0x7693, 0xF0A9},{0x7694, 0xB079}, - {0x7695, 0xB07A},{0x7696, 0xCDEE},{0x7697, 0xB07B},{0x7698, 0xB07C},{0x7699, 0xF0AA},{0x769A, 0xB07D},{0x769B, 0xB07E},{0x769C, 0xB080}, - {0x769D, 0xB081},{0x769E, 0xB082},{0x769F, 0xB083},{0x76A0, 0xB084},{0x76A1, 0xB085},{0x76A2, 0xB086},{0x76A3, 0xB087},{0x76A4, 0xF0AB}, - {0x76A5, 0xB088},{0x76A6, 0xB089},{0x76A7, 0xB08A},{0x76A8, 0xB08B},{0x76A9, 0xB08C},{0x76AA, 0xB08D},{0x76AB, 0xB08E},{0x76AC, 0xB08F}, - {0x76AD, 0xB090},{0x76AE, 0xC6A4},{0x76AF, 0xB091},{0x76B0, 0xB092},{0x76B1, 0xD6E5},{0x76B2, 0xF1E4},{0x76B3, 0xB093},{0x76B4, 0xF1E5}, - {0x76B5, 0xB094},{0x76B6, 0xB095},{0x76B7, 0xB096},{0x76B8, 0xB097},{0x76B9, 0xB098},{0x76BA, 0xB099},{0x76BB, 0xB09A},{0x76BC, 0xB09B}, - {0x76BD, 0xB09C},{0x76BE, 0xB09D},{0x76BF, 0xC3F3},{0x76C0, 0xB09E},{0x76C1, 0xB09F},{0x76C2, 0xD3DB},{0x76C3, 0xB0A0},{0x76C4, 0xB140}, - {0x76C5, 0xD6D1},{0x76C6, 0xC5E8},{0x76C7, 0xB141},{0x76C8, 0xD3AF},{0x76C9, 0xB142},{0x76CA, 0xD2E6},{0x76CB, 0xB143},{0x76CC, 0xB144}, - {0x76CD, 0xEEC1},{0x76CE, 0xB0BB},{0x76CF, 0xD5B5},{0x76D0, 0xD1CE},{0x76D1, 0xBCE0},{0x76D2, 0xBAD0},{0x76D3, 0xB145},{0x76D4, 0xBFF8}, - {0x76D5, 0xB146},{0x76D6, 0xB8C7},{0x76D7, 0xB5C1},{0x76D8, 0xC5CC},{0x76D9, 0xB147},{0x76DA, 0xB148},{0x76DB, 0xCAA2},{0x76DC, 0xB149}, - {0x76DD, 0xB14A},{0x76DE, 0xB14B},{0x76DF, 0xC3CB},{0x76E0, 0xB14C},{0x76E1, 0xB14D},{0x76E2, 0xB14E},{0x76E3, 0xB14F},{0x76E4, 0xB150}, - {0x76E5, 0xEEC2},{0x76E6, 0xB151},{0x76E7, 0xB152},{0x76E8, 0xB153},{0x76E9, 0xB154},{0x76EA, 0xB155},{0x76EB, 0xB156},{0x76EC, 0xB157}, - {0x76ED, 0xB158},{0x76EE, 0xC4BF},{0x76EF, 0xB6A2},{0x76F0, 0xB159},{0x76F1, 0xEDEC},{0x76F2, 0xC3A4},{0x76F3, 0xB15A},{0x76F4, 0xD6B1}, - {0x76F5, 0xB15B},{0x76F6, 0xB15C},{0x76F7, 0xB15D},{0x76F8, 0xCFE0},{0x76F9, 0xEDEF},{0x76FA, 0xB15E},{0x76FB, 0xB15F},{0x76FC, 0xC5CE}, - {0x76FD, 0xB160},{0x76FE, 0xB6DC},{0x76FF, 0xB161},{0x7700, 0xB162},{0x7701, 0xCAA1},{0x7702, 0xB163},{0x7703, 0xB164},{0x7704, 0xEDED}, - {0x7705, 0xB165},{0x7706, 0xB166},{0x7707, 0xEDF0},{0x7708, 0xEDF1},{0x7709, 0xC3BC},{0x770A, 0xB167},{0x770B, 0xBFB4},{0x770C, 0xB168}, - {0x770D, 0xEDEE},{0x770E, 0xB169},{0x770F, 0xB16A},{0x7710, 0xB16B},{0x7711, 0xB16C},{0x7712, 0xB16D},{0x7713, 0xB16E},{0x7714, 0xB16F}, - {0x7715, 0xB170},{0x7716, 0xB171},{0x7717, 0xB172},{0x7718, 0xB173},{0x7719, 0xEDF4},{0x771A, 0xEDF2},{0x771B, 0xB174},{0x771C, 0xB175}, - {0x771D, 0xB176},{0x771E, 0xB177},{0x771F, 0xD5E6},{0x7720, 0xC3DF},{0x7721, 0xB178},{0x7722, 0xEDF3},{0x7723, 0xB179},{0x7724, 0xB17A}, - {0x7725, 0xB17B},{0x7726, 0xEDF6},{0x7727, 0xB17C},{0x7728, 0xD5A3},{0x7729, 0xD1A3},{0x772A, 0xB17D},{0x772B, 0xB17E},{0x772C, 0xB180}, - {0x772D, 0xEDF5},{0x772E, 0xB181},{0x772F, 0xC3D0},{0x7730, 0xB182},{0x7731, 0xB183},{0x7732, 0xB184},{0x7733, 0xB185},{0x7734, 0xB186}, - {0x7735, 0xEDF7},{0x7736, 0xBFF4},{0x7737, 0xBEEC},{0x7738, 0xEDF8},{0x7739, 0xB187},{0x773A, 0xCCF7},{0x773B, 0xB188},{0x773C, 0xD1DB}, - {0x773D, 0xB189},{0x773E, 0xB18A},{0x773F, 0xB18B},{0x7740, 0xD7C5},{0x7741, 0xD5F6},{0x7742, 0xB18C},{0x7743, 0xEDFC},{0x7744, 0xB18D}, - {0x7745, 0xB18E},{0x7746, 0xB18F},{0x7747, 0xEDFB},{0x7748, 0xB190},{0x7749, 0xB191},{0x774A, 0xB192},{0x774B, 0xB193},{0x774C, 0xB194}, - {0x774D, 0xB195},{0x774E, 0xB196},{0x774F, 0xB197},{0x7750, 0xEDF9},{0x7751, 0xEDFA},{0x7752, 0xB198},{0x7753, 0xB199},{0x7754, 0xB19A}, - {0x7755, 0xB19B},{0x7756, 0xB19C},{0x7757, 0xB19D},{0x7758, 0xB19E},{0x7759, 0xB19F},{0x775A, 0xEDFD},{0x775B, 0xBEA6},{0x775C, 0xB1A0}, - {0x775D, 0xB240},{0x775E, 0xB241},{0x775F, 0xB242},{0x7760, 0xB243},{0x7761, 0xCBAF},{0x7762, 0xEEA1},{0x7763, 0xB6BD},{0x7764, 0xB244}, - {0x7765, 0xEEA2},{0x7766, 0xC4C0},{0x7767, 0xB245},{0x7768, 0xEDFE},{0x7769, 0xB246},{0x776A, 0xB247},{0x776B, 0xBDDE},{0x776C, 0xB2C7}, - {0x776D, 0xB248},{0x776E, 0xB249},{0x776F, 0xB24A},{0x7770, 0xB24B},{0x7771, 0xB24C},{0x7772, 0xB24D},{0x7773, 0xB24E},{0x7774, 0xB24F}, - {0x7775, 0xB250},{0x7776, 0xB251},{0x7777, 0xB252},{0x7778, 0xB253},{0x7779, 0xB6C3},{0x777A, 0xB254},{0x777B, 0xB255},{0x777C, 0xB256}, - {0x777D, 0xEEA5},{0x777E, 0xD8BA},{0x777F, 0xEEA3},{0x7780, 0xEEA6},{0x7781, 0xB257},{0x7782, 0xB258},{0x7783, 0xB259},{0x7784, 0xC3E9}, - {0x7785, 0xB3F2},{0x7786, 0xB25A},{0x7787, 0xB25B},{0x7788, 0xB25C},{0x7789, 0xB25D},{0x778A, 0xB25E},{0x778B, 0xB25F},{0x778C, 0xEEA7}, - {0x778D, 0xEEA4},{0x778E, 0xCFB9},{0x778F, 0xB260},{0x7790, 0xB261},{0x7791, 0xEEA8},{0x7792, 0xC2F7},{0x7793, 0xB262},{0x7794, 0xB263}, - {0x7795, 0xB264},{0x7796, 0xB265},{0x7797, 0xB266},{0x7798, 0xB267},{0x7799, 0xB268},{0x779A, 0xB269},{0x779B, 0xB26A},{0x779C, 0xB26B}, - {0x779D, 0xB26C},{0x779E, 0xB26D},{0x779F, 0xEEA9},{0x77A0, 0xEEAA},{0x77A1, 0xB26E},{0x77A2, 0xDEAB},{0x77A3, 0xB26F},{0x77A4, 0xB270}, - {0x77A5, 0xC6B3},{0x77A6, 0xB271},{0x77A7, 0xC7C6},{0x77A8, 0xB272},{0x77A9, 0xD6F5},{0x77AA, 0xB5C9},{0x77AB, 0xB273},{0x77AC, 0xCBB2}, - {0x77AD, 0xB274},{0x77AE, 0xB275},{0x77AF, 0xB276},{0x77B0, 0xEEAB},{0x77B1, 0xB277},{0x77B2, 0xB278},{0x77B3, 0xCDAB},{0x77B4, 0xB279}, - {0x77B5, 0xEEAC},{0x77B6, 0xB27A},{0x77B7, 0xB27B},{0x77B8, 0xB27C},{0x77B9, 0xB27D},{0x77BA, 0xB27E},{0x77BB, 0xD5B0},{0x77BC, 0xB280}, - {0x77BD, 0xEEAD},{0x77BE, 0xB281},{0x77BF, 0xF6C4},{0x77C0, 0xB282},{0x77C1, 0xB283},{0x77C2, 0xB284},{0x77C3, 0xB285},{0x77C4, 0xB286}, - {0x77C5, 0xB287},{0x77C6, 0xB288},{0x77C7, 0xB289},{0x77C8, 0xB28A},{0x77C9, 0xB28B},{0x77CA, 0xB28C},{0x77CB, 0xB28D},{0x77CC, 0xB28E}, - {0x77CD, 0xDBC7},{0x77CE, 0xB28F},{0x77CF, 0xB290},{0x77D0, 0xB291},{0x77D1, 0xB292},{0x77D2, 0xB293},{0x77D3, 0xB294},{0x77D4, 0xB295}, - {0x77D5, 0xB296},{0x77D6, 0xB297},{0x77D7, 0xB4A3},{0x77D8, 0xB298},{0x77D9, 0xB299},{0x77DA, 0xB29A},{0x77DB, 0xC3AC},{0x77DC, 0xF1E6}, - {0x77DD, 0xB29B},{0x77DE, 0xB29C},{0x77DF, 0xB29D},{0x77E0, 0xB29E},{0x77E1, 0xB29F},{0x77E2, 0xCAB8},{0x77E3, 0xD2D3},{0x77E4, 0xB2A0}, - {0x77E5, 0xD6AA},{0x77E6, 0xB340},{0x77E7, 0xEFF2},{0x77E8, 0xB341},{0x77E9, 0xBED8},{0x77EA, 0xB342},{0x77EB, 0xBDC3},{0x77EC, 0xEFF3}, - {0x77ED, 0xB6CC},{0x77EE, 0xB0AB},{0x77EF, 0xB343},{0x77F0, 0xB344},{0x77F1, 0xB345},{0x77F2, 0xB346},{0x77F3, 0xCAAF},{0x77F4, 0xB347}, - {0x77F5, 0xB348},{0x77F6, 0xEDB6},{0x77F7, 0xB349},{0x77F8, 0xEDB7},{0x77F9, 0xB34A},{0x77FA, 0xB34B},{0x77FB, 0xB34C},{0x77FC, 0xB34D}, - {0x77FD, 0xCEF9},{0x77FE, 0xB7AF},{0x77FF, 0xBFF3},{0x7800, 0xEDB8},{0x7801, 0xC2EB},{0x7802, 0xC9B0},{0x7803, 0xB34E},{0x7804, 0xB34F}, - {0x7805, 0xB350},{0x7806, 0xB351},{0x7807, 0xB352},{0x7808, 0xB353},{0x7809, 0xEDB9},{0x780A, 0xB354},{0x780B, 0xB355},{0x780C, 0xC6F6}, - {0x780D, 0xBFB3},{0x780E, 0xB356},{0x780F, 0xB357},{0x7810, 0xB358},{0x7811, 0xEDBC},{0x7812, 0xC5F8},{0x7813, 0xB359},{0x7814, 0xD1D0}, - {0x7815, 0xB35A},{0x7816, 0xD7A9},{0x7817, 0xEDBA},{0x7818, 0xEDBB},{0x7819, 0xB35B},{0x781A, 0xD1E2},{0x781B, 0xB35C},{0x781C, 0xEDBF}, - {0x781D, 0xEDC0},{0x781E, 0xB35D},{0x781F, 0xEDC4},{0x7820, 0xB35E},{0x7821, 0xB35F},{0x7822, 0xB360},{0x7823, 0xEDC8},{0x7824, 0xB361}, - {0x7825, 0xEDC6},{0x7826, 0xEDCE},{0x7827, 0xD5E8},{0x7828, 0xB362},{0x7829, 0xEDC9},{0x782A, 0xB363},{0x782B, 0xB364},{0x782C, 0xEDC7}, - {0x782D, 0xEDBE},{0x782E, 0xB365},{0x782F, 0xB366},{0x7830, 0xC5E9},{0x7831, 0xB367},{0x7832, 0xB368},{0x7833, 0xB369},{0x7834, 0xC6C6}, - {0x7835, 0xB36A},{0x7836, 0xB36B},{0x7837, 0xC9E9},{0x7838, 0xD4D2},{0x7839, 0xEDC1},{0x783A, 0xEDC2},{0x783B, 0xEDC3},{0x783C, 0xEDC5}, - {0x783D, 0xB36C},{0x783E, 0xC0F9},{0x783F, 0xB36D},{0x7840, 0xB4A1},{0x7841, 0xB36E},{0x7842, 0xB36F},{0x7843, 0xB370},{0x7844, 0xB371}, - {0x7845, 0xB9E8},{0x7846, 0xB372},{0x7847, 0xEDD0},{0x7848, 0xB373},{0x7849, 0xB374},{0x784A, 0xB375},{0x784B, 0xB376},{0x784C, 0xEDD1}, - {0x784D, 0xB377},{0x784E, 0xEDCA},{0x784F, 0xB378},{0x7850, 0xEDCF},{0x7851, 0xB379},{0x7852, 0xCEF8},{0x7853, 0xB37A},{0x7854, 0xB37B}, - {0x7855, 0xCBB6},{0x7856, 0xEDCC},{0x7857, 0xEDCD},{0x7858, 0xB37C},{0x7859, 0xB37D},{0x785A, 0xB37E},{0x785B, 0xB380},{0x785C, 0xB381}, - {0x785D, 0xCFF5},{0x785E, 0xB382},{0x785F, 0xB383},{0x7860, 0xB384},{0x7861, 0xB385},{0x7862, 0xB386},{0x7863, 0xB387},{0x7864, 0xB388}, - {0x7865, 0xB389},{0x7866, 0xB38A},{0x7867, 0xB38B},{0x7868, 0xB38C},{0x7869, 0xB38D},{0x786A, 0xEDD2},{0x786B, 0xC1F2},{0x786C, 0xD3B2}, - {0x786D, 0xEDCB},{0x786E, 0xC8B7},{0x786F, 0xB38E},{0x7870, 0xB38F},{0x7871, 0xB390},{0x7872, 0xB391},{0x7873, 0xB392},{0x7874, 0xB393}, - {0x7875, 0xB394},{0x7876, 0xB395},{0x7877, 0xBCEF},{0x7878, 0xB396},{0x7879, 0xB397},{0x787A, 0xB398},{0x787B, 0xB399},{0x787C, 0xC5F0}, - {0x787D, 0xB39A},{0x787E, 0xB39B},{0x787F, 0xB39C},{0x7880, 0xB39D},{0x7881, 0xB39E},{0x7882, 0xB39F},{0x7883, 0xB3A0},{0x7884, 0xB440}, - {0x7885, 0xB441},{0x7886, 0xB442},{0x7887, 0xEDD6},{0x7888, 0xB443},{0x7889, 0xB5EF},{0x788A, 0xB444},{0x788B, 0xB445},{0x788C, 0xC2B5}, - {0x788D, 0xB0AD},{0x788E, 0xCBE9},{0x788F, 0xB446},{0x7890, 0xB447},{0x7891, 0xB1AE},{0x7892, 0xB448},{0x7893, 0xEDD4},{0x7894, 0xB449}, - {0x7895, 0xB44A},{0x7896, 0xB44B},{0x7897, 0xCDEB},{0x7898, 0xB5E2},{0x7899, 0xB44C},{0x789A, 0xEDD5},{0x789B, 0xEDD3},{0x789C, 0xEDD7}, - {0x789D, 0xB44D},{0x789E, 0xB44E},{0x789F, 0xB5FA},{0x78A0, 0xB44F},{0x78A1, 0xEDD8},{0x78A2, 0xB450},{0x78A3, 0xEDD9},{0x78A4, 0xB451}, - {0x78A5, 0xEDDC},{0x78A6, 0xB452},{0x78A7, 0xB1CC},{0x78A8, 0xB453},{0x78A9, 0xB454},{0x78AA, 0xB455},{0x78AB, 0xB456},{0x78AC, 0xB457}, - {0x78AD, 0xB458},{0x78AE, 0xB459},{0x78AF, 0xB45A},{0x78B0, 0xC5F6},{0x78B1, 0xBCEE},{0x78B2, 0xEDDA},{0x78B3, 0xCCBC},{0x78B4, 0xB2EA}, - {0x78B5, 0xB45B},{0x78B6, 0xB45C},{0x78B7, 0xB45D},{0x78B8, 0xB45E},{0x78B9, 0xEDDB},{0x78BA, 0xB45F},{0x78BB, 0xB460},{0x78BC, 0xB461}, - {0x78BD, 0xB462},{0x78BE, 0xC4EB},{0x78BF, 0xB463},{0x78C0, 0xB464},{0x78C1, 0xB4C5},{0x78C2, 0xB465},{0x78C3, 0xB466},{0x78C4, 0xB467}, - {0x78C5, 0xB0F5},{0x78C6, 0xB468},{0x78C7, 0xB469},{0x78C8, 0xB46A},{0x78C9, 0xEDDF},{0x78CA, 0xC0DA},{0x78CB, 0xB4E8},{0x78CC, 0xB46B}, - {0x78CD, 0xB46C},{0x78CE, 0xB46D},{0x78CF, 0xB46E},{0x78D0, 0xC5CD},{0x78D1, 0xB46F},{0x78D2, 0xB470},{0x78D3, 0xB471},{0x78D4, 0xEDDD}, - {0x78D5, 0xBFC4},{0x78D6, 0xB472},{0x78D7, 0xB473},{0x78D8, 0xB474},{0x78D9, 0xEDDE},{0x78DA, 0xB475},{0x78DB, 0xB476},{0x78DC, 0xB477}, - {0x78DD, 0xB478},{0x78DE, 0xB479},{0x78DF, 0xB47A},{0x78E0, 0xB47B},{0x78E1, 0xB47C},{0x78E2, 0xB47D},{0x78E3, 0xB47E},{0x78E4, 0xB480}, - {0x78E5, 0xB481},{0x78E6, 0xB482},{0x78E7, 0xB483},{0x78E8, 0xC4A5},{0x78E9, 0xB484},{0x78EA, 0xB485},{0x78EB, 0xB486},{0x78EC, 0xEDE0}, - {0x78ED, 0xB487},{0x78EE, 0xB488},{0x78EF, 0xB489},{0x78F0, 0xB48A},{0x78F1, 0xB48B},{0x78F2, 0xEDE1},{0x78F3, 0xB48C},{0x78F4, 0xEDE3}, - {0x78F5, 0xB48D},{0x78F6, 0xB48E},{0x78F7, 0xC1D7},{0x78F8, 0xB48F},{0x78F9, 0xB490},{0x78FA, 0xBBC7},{0x78FB, 0xB491},{0x78FC, 0xB492}, - {0x78FD, 0xB493},{0x78FE, 0xB494},{0x78FF, 0xB495},{0x7900, 0xB496},{0x7901, 0xBDB8},{0x7902, 0xB497},{0x7903, 0xB498},{0x7904, 0xB499}, - {0x7905, 0xEDE2},{0x7906, 0xB49A},{0x7907, 0xB49B},{0x7908, 0xB49C},{0x7909, 0xB49D},{0x790A, 0xB49E},{0x790B, 0xB49F},{0x790C, 0xB4A0}, - {0x790D, 0xB540},{0x790E, 0xB541},{0x790F, 0xB542},{0x7910, 0xB543},{0x7911, 0xB544},{0x7912, 0xB545},{0x7913, 0xEDE4},{0x7914, 0xB546}, - {0x7915, 0xB547},{0x7916, 0xB548},{0x7917, 0xB549},{0x7918, 0xB54A},{0x7919, 0xB54B},{0x791A, 0xB54C},{0x791B, 0xB54D},{0x791C, 0xB54E}, - {0x791D, 0xB54F},{0x791E, 0xEDE6},{0x791F, 0xB550},{0x7920, 0xB551},{0x7921, 0xB552},{0x7922, 0xB553},{0x7923, 0xB554},{0x7924, 0xEDE5}, - {0x7925, 0xB555},{0x7926, 0xB556},{0x7927, 0xB557},{0x7928, 0xB558},{0x7929, 0xB559},{0x792A, 0xB55A},{0x792B, 0xB55B},{0x792C, 0xB55C}, - {0x792D, 0xB55D},{0x792E, 0xB55E},{0x792F, 0xB55F},{0x7930, 0xB560},{0x7931, 0xB561},{0x7932, 0xB562},{0x7933, 0xB563},{0x7934, 0xEDE7}, - {0x7935, 0xB564},{0x7936, 0xB565},{0x7937, 0xB566},{0x7938, 0xB567},{0x7939, 0xB568},{0x793A, 0xCABE},{0x793B, 0xECEA},{0x793C, 0xC0F1}, - {0x793D, 0xB569},{0x793E, 0xC9E7},{0x793F, 0xB56A},{0x7940, 0xECEB},{0x7941, 0xC6EE},{0x7942, 0xB56B},{0x7943, 0xB56C},{0x7944, 0xB56D}, - {0x7945, 0xB56E},{0x7946, 0xECEC},{0x7947, 0xB56F},{0x7948, 0xC6ED},{0x7949, 0xECED},{0x794A, 0xB570},{0x794B, 0xB571},{0x794C, 0xB572}, - {0x794D, 0xB573},{0x794E, 0xB574},{0x794F, 0xB575},{0x7950, 0xB576},{0x7951, 0xB577},{0x7952, 0xB578},{0x7953, 0xECF0},{0x7954, 0xB579}, - {0x7955, 0xB57A},{0x7956, 0xD7E6},{0x7957, 0xECF3},{0x7958, 0xB57B},{0x7959, 0xB57C},{0x795A, 0xECF1},{0x795B, 0xECEE},{0x795C, 0xECEF}, - {0x795D, 0xD7A3},{0x795E, 0xC9F1},{0x795F, 0xCBEE},{0x7960, 0xECF4},{0x7961, 0xB57D},{0x7962, 0xECF2},{0x7963, 0xB57E},{0x7964, 0xB580}, - {0x7965, 0xCFE9},{0x7966, 0xB581},{0x7967, 0xECF6},{0x7968, 0xC6B1},{0x7969, 0xB582},{0x796A, 0xB583},{0x796B, 0xB584},{0x796C, 0xB585}, - {0x796D, 0xBCC0},{0x796E, 0xB586},{0x796F, 0xECF5},{0x7970, 0xB587},{0x7971, 0xB588},{0x7972, 0xB589},{0x7973, 0xB58A},{0x7974, 0xB58B}, - {0x7975, 0xB58C},{0x7976, 0xB58D},{0x7977, 0xB5BB},{0x7978, 0xBBF6},{0x7979, 0xB58E},{0x797A, 0xECF7},{0x797B, 0xB58F},{0x797C, 0xB590}, - {0x797D, 0xB591},{0x797E, 0xB592},{0x797F, 0xB593},{0x7980, 0xD9F7},{0x7981, 0xBDFB},{0x7982, 0xB594},{0x7983, 0xB595},{0x7984, 0xC2BB}, - {0x7985, 0xECF8},{0x7986, 0xB596},{0x7987, 0xB597},{0x7988, 0xB598},{0x7989, 0xB599},{0x798A, 0xECF9},{0x798B, 0xB59A},{0x798C, 0xB59B}, - {0x798D, 0xB59C},{0x798E, 0xB59D},{0x798F, 0xB8A3},{0x7990, 0xB59E},{0x7991, 0xB59F},{0x7992, 0xB5A0},{0x7993, 0xB640},{0x7994, 0xB641}, - {0x7995, 0xB642},{0x7996, 0xB643},{0x7997, 0xB644},{0x7998, 0xB645},{0x7999, 0xB646},{0x799A, 0xECFA},{0x799B, 0xB647},{0x799C, 0xB648}, - {0x799D, 0xB649},{0x799E, 0xB64A},{0x799F, 0xB64B},{0x79A0, 0xB64C},{0x79A1, 0xB64D},{0x79A2, 0xB64E},{0x79A3, 0xB64F},{0x79A4, 0xB650}, - {0x79A5, 0xB651},{0x79A6, 0xB652},{0x79A7, 0xECFB},{0x79A8, 0xB653},{0x79A9, 0xB654},{0x79AA, 0xB655},{0x79AB, 0xB656},{0x79AC, 0xB657}, - {0x79AD, 0xB658},{0x79AE, 0xB659},{0x79AF, 0xB65A},{0x79B0, 0xB65B},{0x79B1, 0xB65C},{0x79B2, 0xB65D},{0x79B3, 0xECFC},{0x79B4, 0xB65E}, - {0x79B5, 0xB65F},{0x79B6, 0xB660},{0x79B7, 0xB661},{0x79B8, 0xB662},{0x79B9, 0xD3ED},{0x79BA, 0xD8AE},{0x79BB, 0xC0EB},{0x79BC, 0xB663}, - {0x79BD, 0xC7DD},{0x79BE, 0xBACC},{0x79BF, 0xB664},{0x79C0, 0xD0E3},{0x79C1, 0xCBBD},{0x79C2, 0xB665},{0x79C3, 0xCDBA},{0x79C4, 0xB666}, - {0x79C5, 0xB667},{0x79C6, 0xB8D1},{0x79C7, 0xB668},{0x79C8, 0xB669},{0x79C9, 0xB1FC},{0x79CA, 0xB66A},{0x79CB, 0xC7EF},{0x79CC, 0xB66B}, - {0x79CD, 0xD6D6},{0x79CE, 0xB66C},{0x79CF, 0xB66D},{0x79D0, 0xB66E},{0x79D1, 0xBFC6},{0x79D2, 0xC3EB},{0x79D3, 0xB66F},{0x79D4, 0xB670}, - {0x79D5, 0xEFF5},{0x79D6, 0xB671},{0x79D7, 0xB672},{0x79D8, 0xC3D8},{0x79D9, 0xB673},{0x79DA, 0xB674},{0x79DB, 0xB675},{0x79DC, 0xB676}, - {0x79DD, 0xB677},{0x79DE, 0xB678},{0x79DF, 0xD7E2},{0x79E0, 0xB679},{0x79E1, 0xB67A},{0x79E2, 0xB67B},{0x79E3, 0xEFF7},{0x79E4, 0xB3D3}, - {0x79E5, 0xB67C},{0x79E6, 0xC7D8},{0x79E7, 0xD1ED},{0x79E8, 0xB67D},{0x79E9, 0xD6C8},{0x79EA, 0xB67E},{0x79EB, 0xEFF8},{0x79EC, 0xB680}, - {0x79ED, 0xEFF6},{0x79EE, 0xB681},{0x79EF, 0xBBFD},{0x79F0, 0xB3C6},{0x79F1, 0xB682},{0x79F2, 0xB683},{0x79F3, 0xB684},{0x79F4, 0xB685}, - {0x79F5, 0xB686},{0x79F6, 0xB687},{0x79F7, 0xB688},{0x79F8, 0xBDD5},{0x79F9, 0xB689},{0x79FA, 0xB68A},{0x79FB, 0xD2C6},{0x79FC, 0xB68B}, - {0x79FD, 0xBBE0},{0x79FE, 0xB68C},{0x79FF, 0xB68D},{0x7A00, 0xCFA1},{0x7A01, 0xB68E},{0x7A02, 0xEFFC},{0x7A03, 0xEFFB},{0x7A04, 0xB68F}, - {0x7A05, 0xB690},{0x7A06, 0xEFF9},{0x7A07, 0xB691},{0x7A08, 0xB692},{0x7A09, 0xB693},{0x7A0A, 0xB694},{0x7A0B, 0xB3CC},{0x7A0C, 0xB695}, - {0x7A0D, 0xC9D4},{0x7A0E, 0xCBB0},{0x7A0F, 0xB696},{0x7A10, 0xB697},{0x7A11, 0xB698},{0x7A12, 0xB699},{0x7A13, 0xB69A},{0x7A14, 0xEFFE}, - {0x7A15, 0xB69B},{0x7A16, 0xB69C},{0x7A17, 0xB0DE},{0x7A18, 0xB69D},{0x7A19, 0xB69E},{0x7A1A, 0xD6C9},{0x7A1B, 0xB69F},{0x7A1C, 0xB6A0}, - {0x7A1D, 0xB740},{0x7A1E, 0xEFFD},{0x7A1F, 0xB741},{0x7A20, 0xB3ED},{0x7A21, 0xB742},{0x7A22, 0xB743},{0x7A23, 0xF6D5},{0x7A24, 0xB744}, - {0x7A25, 0xB745},{0x7A26, 0xB746},{0x7A27, 0xB747},{0x7A28, 0xB748},{0x7A29, 0xB749},{0x7A2A, 0xB74A},{0x7A2B, 0xB74B},{0x7A2C, 0xB74C}, - {0x7A2D, 0xB74D},{0x7A2E, 0xB74E},{0x7A2F, 0xB74F},{0x7A30, 0xB750},{0x7A31, 0xB751},{0x7A32, 0xB752},{0x7A33, 0xCEC8},{0x7A34, 0xB753}, - {0x7A35, 0xB754},{0x7A36, 0xB755},{0x7A37, 0xF0A2},{0x7A38, 0xB756},{0x7A39, 0xF0A1},{0x7A3A, 0xB757},{0x7A3B, 0xB5BE},{0x7A3C, 0xBCDA}, - {0x7A3D, 0xBBFC},{0x7A3E, 0xB758},{0x7A3F, 0xB8E5},{0x7A40, 0xB759},{0x7A41, 0xB75A},{0x7A42, 0xB75B},{0x7A43, 0xB75C},{0x7A44, 0xB75D}, - {0x7A45, 0xB75E},{0x7A46, 0xC4C2},{0x7A47, 0xB75F},{0x7A48, 0xB760},{0x7A49, 0xB761},{0x7A4A, 0xB762},{0x7A4B, 0xB763},{0x7A4C, 0xB764}, - {0x7A4D, 0xB765},{0x7A4E, 0xB766},{0x7A4F, 0xB767},{0x7A50, 0xB768},{0x7A51, 0xF0A3},{0x7A52, 0xB769},{0x7A53, 0xB76A},{0x7A54, 0xB76B}, - {0x7A55, 0xB76C},{0x7A56, 0xB76D},{0x7A57, 0xCBEB},{0x7A58, 0xB76E},{0x7A59, 0xB76F},{0x7A5A, 0xB770},{0x7A5B, 0xB771},{0x7A5C, 0xB772}, - {0x7A5D, 0xB773},{0x7A5E, 0xB774},{0x7A5F, 0xB775},{0x7A60, 0xB776},{0x7A61, 0xB777},{0x7A62, 0xB778},{0x7A63, 0xB779},{0x7A64, 0xB77A}, - {0x7A65, 0xB77B},{0x7A66, 0xB77C},{0x7A67, 0xB77D},{0x7A68, 0xB77E},{0x7A69, 0xB780},{0x7A6A, 0xB781},{0x7A6B, 0xB782},{0x7A6C, 0xB783}, - {0x7A6D, 0xB784},{0x7A6E, 0xB785},{0x7A6F, 0xB786},{0x7A70, 0xF0A6},{0x7A71, 0xB787},{0x7A72, 0xB788},{0x7A73, 0xB789},{0x7A74, 0xD1A8}, - {0x7A75, 0xB78A},{0x7A76, 0xBEBF},{0x7A77, 0xC7EE},{0x7A78, 0xF1B6},{0x7A79, 0xF1B7},{0x7A7A, 0xBFD5},{0x7A7B, 0xB78B},{0x7A7C, 0xB78C}, - {0x7A7D, 0xB78D},{0x7A7E, 0xB78E},{0x7A7F, 0xB4A9},{0x7A80, 0xF1B8},{0x7A81, 0xCDBB},{0x7A82, 0xB78F},{0x7A83, 0xC7D4},{0x7A84, 0xD5AD}, - {0x7A85, 0xB790},{0x7A86, 0xF1B9},{0x7A87, 0xB791},{0x7A88, 0xF1BA},{0x7A89, 0xB792},{0x7A8A, 0xB793},{0x7A8B, 0xB794},{0x7A8C, 0xB795}, - {0x7A8D, 0xC7CF},{0x7A8E, 0xB796},{0x7A8F, 0xB797},{0x7A90, 0xB798},{0x7A91, 0xD2A4},{0x7A92, 0xD6CF},{0x7A93, 0xB799},{0x7A94, 0xB79A}, - {0x7A95, 0xF1BB},{0x7A96, 0xBDD1},{0x7A97, 0xB4B0},{0x7A98, 0xBEBD},{0x7A99, 0xB79B},{0x7A9A, 0xB79C},{0x7A9B, 0xB79D},{0x7A9C, 0xB4DC}, - {0x7A9D, 0xCED1},{0x7A9E, 0xB79E},{0x7A9F, 0xBFDF},{0x7AA0, 0xF1BD},{0x7AA1, 0xB79F},{0x7AA2, 0xB7A0},{0x7AA3, 0xB840},{0x7AA4, 0xB841}, - {0x7AA5, 0xBFFA},{0x7AA6, 0xF1BC},{0x7AA7, 0xB842},{0x7AA8, 0xF1BF},{0x7AA9, 0xB843},{0x7AAA, 0xB844},{0x7AAB, 0xB845},{0x7AAC, 0xF1BE}, - {0x7AAD, 0xF1C0},{0x7AAE, 0xB846},{0x7AAF, 0xB847},{0x7AB0, 0xB848},{0x7AB1, 0xB849},{0x7AB2, 0xB84A},{0x7AB3, 0xF1C1},{0x7AB4, 0xB84B}, - {0x7AB5, 0xB84C},{0x7AB6, 0xB84D},{0x7AB7, 0xB84E},{0x7AB8, 0xB84F},{0x7AB9, 0xB850},{0x7ABA, 0xB851},{0x7ABB, 0xB852},{0x7ABC, 0xB853}, - {0x7ABD, 0xB854},{0x7ABE, 0xB855},{0x7ABF, 0xC1FE},{0x7AC0, 0xB856},{0x7AC1, 0xB857},{0x7AC2, 0xB858},{0x7AC3, 0xB859},{0x7AC4, 0xB85A}, - {0x7AC5, 0xB85B},{0x7AC6, 0xB85C},{0x7AC7, 0xB85D},{0x7AC8, 0xB85E},{0x7AC9, 0xB85F},{0x7ACA, 0xB860},{0x7ACB, 0xC1A2},{0x7ACC, 0xB861}, - {0x7ACD, 0xB862},{0x7ACE, 0xB863},{0x7ACF, 0xB864},{0x7AD0, 0xB865},{0x7AD1, 0xB866},{0x7AD2, 0xB867},{0x7AD3, 0xB868},{0x7AD4, 0xB869}, - {0x7AD5, 0xB86A},{0x7AD6, 0xCAFA},{0x7AD7, 0xB86B},{0x7AD8, 0xB86C},{0x7AD9, 0xD5BE},{0x7ADA, 0xB86D},{0x7ADB, 0xB86E},{0x7ADC, 0xB86F}, - {0x7ADD, 0xB870},{0x7ADE, 0xBEBA},{0x7ADF, 0xBEB9},{0x7AE0, 0xD5C2},{0x7AE1, 0xB871},{0x7AE2, 0xB872},{0x7AE3, 0xBFA2},{0x7AE4, 0xB873}, - {0x7AE5, 0xCDAF},{0x7AE6, 0xF1B5},{0x7AE7, 0xB874},{0x7AE8, 0xB875},{0x7AE9, 0xB876},{0x7AEA, 0xB877},{0x7AEB, 0xB878},{0x7AEC, 0xB879}, - {0x7AED, 0xBDDF},{0x7AEE, 0xB87A},{0x7AEF, 0xB6CB},{0x7AF0, 0xB87B},{0x7AF1, 0xB87C},{0x7AF2, 0xB87D},{0x7AF3, 0xB87E},{0x7AF4, 0xB880}, - {0x7AF5, 0xB881},{0x7AF6, 0xB882},{0x7AF7, 0xB883},{0x7AF8, 0xB884},{0x7AF9, 0xD6F1},{0x7AFA, 0xF3C3},{0x7AFB, 0xB885},{0x7AFC, 0xB886}, - {0x7AFD, 0xF3C4},{0x7AFE, 0xB887},{0x7AFF, 0xB8CD},{0x7B00, 0xB888},{0x7B01, 0xB889},{0x7B02, 0xB88A},{0x7B03, 0xF3C6},{0x7B04, 0xF3C7}, - {0x7B05, 0xB88B},{0x7B06, 0xB0CA},{0x7B07, 0xB88C},{0x7B08, 0xF3C5},{0x7B09, 0xB88D},{0x7B0A, 0xF3C9},{0x7B0B, 0xCBF1},{0x7B0C, 0xB88E}, - {0x7B0D, 0xB88F},{0x7B0E, 0xB890},{0x7B0F, 0xF3CB},{0x7B10, 0xB891},{0x7B11, 0xD0A6},{0x7B12, 0xB892},{0x7B13, 0xB893},{0x7B14, 0xB1CA}, - {0x7B15, 0xF3C8},{0x7B16, 0xB894},{0x7B17, 0xB895},{0x7B18, 0xB896},{0x7B19, 0xF3CF},{0x7B1A, 0xB897},{0x7B1B, 0xB5D1},{0x7B1C, 0xB898}, - {0x7B1D, 0xB899},{0x7B1E, 0xF3D7},{0x7B1F, 0xB89A},{0x7B20, 0xF3D2},{0x7B21, 0xB89B},{0x7B22, 0xB89C},{0x7B23, 0xB89D},{0x7B24, 0xF3D4}, - {0x7B25, 0xF3D3},{0x7B26, 0xB7FB},{0x7B27, 0xB89E},{0x7B28, 0xB1BF},{0x7B29, 0xB89F},{0x7B2A, 0xF3CE},{0x7B2B, 0xF3CA},{0x7B2C, 0xB5DA}, - {0x7B2D, 0xB8A0},{0x7B2E, 0xF3D0},{0x7B2F, 0xB940},{0x7B30, 0xB941},{0x7B31, 0xF3D1},{0x7B32, 0xB942},{0x7B33, 0xF3D5},{0x7B34, 0xB943}, - {0x7B35, 0xB944},{0x7B36, 0xB945},{0x7B37, 0xB946},{0x7B38, 0xF3CD},{0x7B39, 0xB947},{0x7B3A, 0xBCE3},{0x7B3B, 0xB948},{0x7B3C, 0xC1FD}, - {0x7B3D, 0xB949},{0x7B3E, 0xF3D6},{0x7B3F, 0xB94A},{0x7B40, 0xB94B},{0x7B41, 0xB94C},{0x7B42, 0xB94D},{0x7B43, 0xB94E},{0x7B44, 0xB94F}, - {0x7B45, 0xF3DA},{0x7B46, 0xB950},{0x7B47, 0xF3CC},{0x7B48, 0xB951},{0x7B49, 0xB5C8},{0x7B4A, 0xB952},{0x7B4B, 0xBDEE},{0x7B4C, 0xF3DC}, - {0x7B4D, 0xB953},{0x7B4E, 0xB954},{0x7B4F, 0xB7A4},{0x7B50, 0xBFF0},{0x7B51, 0xD6FE},{0x7B52, 0xCDB2},{0x7B53, 0xB955},{0x7B54, 0xB4F0}, - {0x7B55, 0xB956},{0x7B56, 0xB2DF},{0x7B57, 0xB957},{0x7B58, 0xF3D8},{0x7B59, 0xB958},{0x7B5A, 0xF3D9},{0x7B5B, 0xC9B8},{0x7B5C, 0xB959}, - {0x7B5D, 0xF3DD},{0x7B5E, 0xB95A},{0x7B5F, 0xB95B},{0x7B60, 0xF3DE},{0x7B61, 0xB95C},{0x7B62, 0xF3E1},{0x7B63, 0xB95D},{0x7B64, 0xB95E}, - {0x7B65, 0xB95F},{0x7B66, 0xB960},{0x7B67, 0xB961},{0x7B68, 0xB962},{0x7B69, 0xB963},{0x7B6A, 0xB964},{0x7B6B, 0xB965},{0x7B6C, 0xB966}, - {0x7B6D, 0xB967},{0x7B6E, 0xF3DF},{0x7B6F, 0xB968},{0x7B70, 0xB969},{0x7B71, 0xF3E3},{0x7B72, 0xF3E2},{0x7B73, 0xB96A},{0x7B74, 0xB96B}, - {0x7B75, 0xF3DB},{0x7B76, 0xB96C},{0x7B77, 0xBFEA},{0x7B78, 0xB96D},{0x7B79, 0xB3EF},{0x7B7A, 0xB96E},{0x7B7B, 0xF3E0},{0x7B7C, 0xB96F}, - {0x7B7D, 0xB970},{0x7B7E, 0xC7A9},{0x7B7F, 0xB971},{0x7B80, 0xBCF2},{0x7B81, 0xB972},{0x7B82, 0xB973},{0x7B83, 0xB974},{0x7B84, 0xB975}, - {0x7B85, 0xF3EB},{0x7B86, 0xB976},{0x7B87, 0xB977},{0x7B88, 0xB978},{0x7B89, 0xB979},{0x7B8A, 0xB97A},{0x7B8B, 0xB97B},{0x7B8C, 0xB97C}, - {0x7B8D, 0xB9BF},{0x7B8E, 0xB97D},{0x7B8F, 0xB97E},{0x7B90, 0xF3E4},{0x7B91, 0xB980},{0x7B92, 0xB981},{0x7B93, 0xB982},{0x7B94, 0xB2AD}, - {0x7B95, 0xBBFE},{0x7B96, 0xB983},{0x7B97, 0xCBE3},{0x7B98, 0xB984},{0x7B99, 0xB985},{0x7B9A, 0xB986},{0x7B9B, 0xB987},{0x7B9C, 0xF3ED}, - {0x7B9D, 0xF3E9},{0x7B9E, 0xB988},{0x7B9F, 0xB989},{0x7BA0, 0xB98A},{0x7BA1, 0xB9DC},{0x7BA2, 0xF3EE},{0x7BA3, 0xB98B},{0x7BA4, 0xB98C}, - {0x7BA5, 0xB98D},{0x7BA6, 0xF3E5},{0x7BA7, 0xF3E6},{0x7BA8, 0xF3EA},{0x7BA9, 0xC2E1},{0x7BAA, 0xF3EC},{0x7BAB, 0xF3EF},{0x7BAC, 0xF3E8}, - {0x7BAD, 0xBCFD},{0x7BAE, 0xB98E},{0x7BAF, 0xB98F},{0x7BB0, 0xB990},{0x7BB1, 0xCFE4},{0x7BB2, 0xB991},{0x7BB3, 0xB992},{0x7BB4, 0xF3F0}, - {0x7BB5, 0xB993},{0x7BB6, 0xB994},{0x7BB7, 0xB995},{0x7BB8, 0xF3E7},{0x7BB9, 0xB996},{0x7BBA, 0xB997},{0x7BBB, 0xB998},{0x7BBC, 0xB999}, - {0x7BBD, 0xB99A},{0x7BBE, 0xB99B},{0x7BBF, 0xB99C},{0x7BC0, 0xB99D},{0x7BC1, 0xF3F2},{0x7BC2, 0xB99E},{0x7BC3, 0xB99F},{0x7BC4, 0xB9A0}, - {0x7BC5, 0xBA40},{0x7BC6, 0xD7AD},{0x7BC7, 0xC6AA},{0x7BC8, 0xBA41},{0x7BC9, 0xBA42},{0x7BCA, 0xBA43},{0x7BCB, 0xBA44},{0x7BCC, 0xF3F3}, - {0x7BCD, 0xBA45},{0x7BCE, 0xBA46},{0x7BCF, 0xBA47},{0x7BD0, 0xBA48},{0x7BD1, 0xF3F1},{0x7BD2, 0xBA49},{0x7BD3, 0xC2A8},{0x7BD4, 0xBA4A}, - {0x7BD5, 0xBA4B},{0x7BD6, 0xBA4C},{0x7BD7, 0xBA4D},{0x7BD8, 0xBA4E},{0x7BD9, 0xB8DD},{0x7BDA, 0xF3F5},{0x7BDB, 0xBA4F},{0x7BDC, 0xBA50}, - {0x7BDD, 0xF3F4},{0x7BDE, 0xBA51},{0x7BDF, 0xBA52},{0x7BE0, 0xBA53},{0x7BE1, 0xB4DB},{0x7BE2, 0xBA54},{0x7BE3, 0xBA55},{0x7BE4, 0xBA56}, - {0x7BE5, 0xF3F6},{0x7BE6, 0xF3F7},{0x7BE7, 0xBA57},{0x7BE8, 0xBA58},{0x7BE9, 0xBA59},{0x7BEA, 0xF3F8},{0x7BEB, 0xBA5A},{0x7BEC, 0xBA5B}, - {0x7BED, 0xBA5C},{0x7BEE, 0xC0BA},{0x7BEF, 0xBA5D},{0x7BF0, 0xBA5E},{0x7BF1, 0xC0E9},{0x7BF2, 0xBA5F},{0x7BF3, 0xBA60},{0x7BF4, 0xBA61}, - {0x7BF5, 0xBA62},{0x7BF6, 0xBA63},{0x7BF7, 0xC5F1},{0x7BF8, 0xBA64},{0x7BF9, 0xBA65},{0x7BFA, 0xBA66},{0x7BFB, 0xBA67},{0x7BFC, 0xF3FB}, - {0x7BFD, 0xBA68},{0x7BFE, 0xF3FA},{0x7BFF, 0xBA69},{0x7C00, 0xBA6A},{0x7C01, 0xBA6B},{0x7C02, 0xBA6C},{0x7C03, 0xBA6D},{0x7C04, 0xBA6E}, - {0x7C05, 0xBA6F},{0x7C06, 0xBA70},{0x7C07, 0xB4D8},{0x7C08, 0xBA71},{0x7C09, 0xBA72},{0x7C0A, 0xBA73},{0x7C0B, 0xF3FE},{0x7C0C, 0xF3F9}, - {0x7C0D, 0xBA74},{0x7C0E, 0xBA75},{0x7C0F, 0xF3FC},{0x7C10, 0xBA76},{0x7C11, 0xBA77},{0x7C12, 0xBA78},{0x7C13, 0xBA79},{0x7C14, 0xBA7A}, - {0x7C15, 0xBA7B},{0x7C16, 0xF3FD},{0x7C17, 0xBA7C},{0x7C18, 0xBA7D},{0x7C19, 0xBA7E},{0x7C1A, 0xBA80},{0x7C1B, 0xBA81},{0x7C1C, 0xBA82}, - {0x7C1D, 0xBA83},{0x7C1E, 0xBA84},{0x7C1F, 0xF4A1},{0x7C20, 0xBA85},{0x7C21, 0xBA86},{0x7C22, 0xBA87},{0x7C23, 0xBA88},{0x7C24, 0xBA89}, - {0x7C25, 0xBA8A},{0x7C26, 0xF4A3},{0x7C27, 0xBBC9},{0x7C28, 0xBA8B},{0x7C29, 0xBA8C},{0x7C2A, 0xF4A2},{0x7C2B, 0xBA8D},{0x7C2C, 0xBA8E}, - {0x7C2D, 0xBA8F},{0x7C2E, 0xBA90},{0x7C2F, 0xBA91},{0x7C30, 0xBA92},{0x7C31, 0xBA93},{0x7C32, 0xBA94},{0x7C33, 0xBA95},{0x7C34, 0xBA96}, - {0x7C35, 0xBA97},{0x7C36, 0xBA98},{0x7C37, 0xBA99},{0x7C38, 0xF4A4},{0x7C39, 0xBA9A},{0x7C3A, 0xBA9B},{0x7C3B, 0xBA9C},{0x7C3C, 0xBA9D}, - {0x7C3D, 0xBA9E},{0x7C3E, 0xBA9F},{0x7C3F, 0xB2BE},{0x7C40, 0xF4A6},{0x7C41, 0xF4A5},{0x7C42, 0xBAA0},{0x7C43, 0xBB40},{0x7C44, 0xBB41}, - {0x7C45, 0xBB42},{0x7C46, 0xBB43},{0x7C47, 0xBB44},{0x7C48, 0xBB45},{0x7C49, 0xBB46},{0x7C4A, 0xBB47},{0x7C4B, 0xBB48},{0x7C4C, 0xBB49}, - {0x7C4D, 0xBCAE},{0x7C4E, 0xBB4A},{0x7C4F, 0xBB4B},{0x7C50, 0xBB4C},{0x7C51, 0xBB4D},{0x7C52, 0xBB4E},{0x7C53, 0xBB4F},{0x7C54, 0xBB50}, - {0x7C55, 0xBB51},{0x7C56, 0xBB52},{0x7C57, 0xBB53},{0x7C58, 0xBB54},{0x7C59, 0xBB55},{0x7C5A, 0xBB56},{0x7C5B, 0xBB57},{0x7C5C, 0xBB58}, - {0x7C5D, 0xBB59},{0x7C5E, 0xBB5A},{0x7C5F, 0xBB5B},{0x7C60, 0xBB5C},{0x7C61, 0xBB5D},{0x7C62, 0xBB5E},{0x7C63, 0xBB5F},{0x7C64, 0xBB60}, - {0x7C65, 0xBB61},{0x7C66, 0xBB62},{0x7C67, 0xBB63},{0x7C68, 0xBB64},{0x7C69, 0xBB65},{0x7C6A, 0xBB66},{0x7C6B, 0xBB67},{0x7C6C, 0xBB68}, - {0x7C6D, 0xBB69},{0x7C6E, 0xBB6A},{0x7C6F, 0xBB6B},{0x7C70, 0xBB6C},{0x7C71, 0xBB6D},{0x7C72, 0xBB6E},{0x7C73, 0xC3D7},{0x7C74, 0xD9E1}, - {0x7C75, 0xBB6F},{0x7C76, 0xBB70},{0x7C77, 0xBB71},{0x7C78, 0xBB72},{0x7C79, 0xBB73},{0x7C7A, 0xBB74},{0x7C7B, 0xC0E0},{0x7C7C, 0xF4CC}, - {0x7C7D, 0xD7D1},{0x7C7E, 0xBB75},{0x7C7F, 0xBB76},{0x7C80, 0xBB77},{0x7C81, 0xBB78},{0x7C82, 0xBB79},{0x7C83, 0xBB7A},{0x7C84, 0xBB7B}, - {0x7C85, 0xBB7C},{0x7C86, 0xBB7D},{0x7C87, 0xBB7E},{0x7C88, 0xBB80},{0x7C89, 0xB7DB},{0x7C8A, 0xBB81},{0x7C8B, 0xBB82},{0x7C8C, 0xBB83}, - {0x7C8D, 0xBB84},{0x7C8E, 0xBB85},{0x7C8F, 0xBB86},{0x7C90, 0xBB87},{0x7C91, 0xF4CE},{0x7C92, 0xC1A3},{0x7C93, 0xBB88},{0x7C94, 0xBB89}, - {0x7C95, 0xC6C9},{0x7C96, 0xBB8A},{0x7C97, 0xB4D6},{0x7C98, 0xD5B3},{0x7C99, 0xBB8B},{0x7C9A, 0xBB8C},{0x7C9B, 0xBB8D},{0x7C9C, 0xF4D0}, - {0x7C9D, 0xF4CF},{0x7C9E, 0xF4D1},{0x7C9F, 0xCBDA},{0x7CA0, 0xBB8E},{0x7CA1, 0xBB8F},{0x7CA2, 0xF4D2},{0x7CA3, 0xBB90},{0x7CA4, 0xD4C1}, - {0x7CA5, 0xD6E0},{0x7CA6, 0xBB91},{0x7CA7, 0xBB92},{0x7CA8, 0xBB93},{0x7CA9, 0xBB94},{0x7CAA, 0xB7E0},{0x7CAB, 0xBB95},{0x7CAC, 0xBB96}, - {0x7CAD, 0xBB97},{0x7CAE, 0xC1B8},{0x7CAF, 0xBB98},{0x7CB0, 0xBB99},{0x7CB1, 0xC1BB},{0x7CB2, 0xF4D3},{0x7CB3, 0xBEAC},{0x7CB4, 0xBB9A}, - {0x7CB5, 0xBB9B},{0x7CB6, 0xBB9C},{0x7CB7, 0xBB9D},{0x7CB8, 0xBB9E},{0x7CB9, 0xB4E2},{0x7CBA, 0xBB9F},{0x7CBB, 0xBBA0},{0x7CBC, 0xF4D4}, - {0x7CBD, 0xF4D5},{0x7CBE, 0xBEAB},{0x7CBF, 0xBC40},{0x7CC0, 0xBC41},{0x7CC1, 0xF4D6},{0x7CC2, 0xBC42},{0x7CC3, 0xBC43},{0x7CC4, 0xBC44}, - {0x7CC5, 0xF4DB},{0x7CC6, 0xBC45},{0x7CC7, 0xF4D7},{0x7CC8, 0xF4DA},{0x7CC9, 0xBC46},{0x7CCA, 0xBAFD},{0x7CCB, 0xBC47},{0x7CCC, 0xF4D8}, - {0x7CCD, 0xF4D9},{0x7CCE, 0xBC48},{0x7CCF, 0xBC49},{0x7CD0, 0xBC4A},{0x7CD1, 0xBC4B},{0x7CD2, 0xBC4C},{0x7CD3, 0xBC4D},{0x7CD4, 0xBC4E}, - {0x7CD5, 0xB8E2},{0x7CD6, 0xCCC7},{0x7CD7, 0xF4DC},{0x7CD8, 0xBC4F},{0x7CD9, 0xB2DA},{0x7CDA, 0xBC50},{0x7CDB, 0xBC51},{0x7CDC, 0xC3D3}, - {0x7CDD, 0xBC52},{0x7CDE, 0xBC53},{0x7CDF, 0xD4E3},{0x7CE0, 0xBFB7},{0x7CE1, 0xBC54},{0x7CE2, 0xBC55},{0x7CE3, 0xBC56},{0x7CE4, 0xBC57}, - {0x7CE5, 0xBC58},{0x7CE6, 0xBC59},{0x7CE7, 0xBC5A},{0x7CE8, 0xF4DD},{0x7CE9, 0xBC5B},{0x7CEA, 0xBC5C},{0x7CEB, 0xBC5D},{0x7CEC, 0xBC5E}, - {0x7CED, 0xBC5F},{0x7CEE, 0xBC60},{0x7CEF, 0xC5B4},{0x7CF0, 0xBC61},{0x7CF1, 0xBC62},{0x7CF2, 0xBC63},{0x7CF3, 0xBC64},{0x7CF4, 0xBC65}, - {0x7CF5, 0xBC66},{0x7CF6, 0xBC67},{0x7CF7, 0xBC68},{0x7CF8, 0xF4E9},{0x7CF9, 0xBC69},{0x7CFA, 0xBC6A},{0x7CFB, 0xCFB5},{0x7CFC, 0xBC6B}, - {0x7CFD, 0xBC6C},{0x7CFE, 0xBC6D},{0x7CFF, 0xBC6E},{0x7D00, 0xBC6F},{0x7D01, 0xBC70},{0x7D02, 0xBC71},{0x7D03, 0xBC72},{0x7D04, 0xBC73}, - {0x7D05, 0xBC74},{0x7D06, 0xBC75},{0x7D07, 0xBC76},{0x7D08, 0xBC77},{0x7D09, 0xBC78},{0x7D0A, 0xCEC9},{0x7D0B, 0xBC79},{0x7D0C, 0xBC7A}, - {0x7D0D, 0xBC7B},{0x7D0E, 0xBC7C},{0x7D0F, 0xBC7D},{0x7D10, 0xBC7E},{0x7D11, 0xBC80},{0x7D12, 0xBC81},{0x7D13, 0xBC82},{0x7D14, 0xBC83}, - {0x7D15, 0xBC84},{0x7D16, 0xBC85},{0x7D17, 0xBC86},{0x7D18, 0xBC87},{0x7D19, 0xBC88},{0x7D1A, 0xBC89},{0x7D1B, 0xBC8A},{0x7D1C, 0xBC8B}, - {0x7D1D, 0xBC8C},{0x7D1E, 0xBC8D},{0x7D1F, 0xBC8E},{0x7D20, 0xCBD8},{0x7D21, 0xBC8F},{0x7D22, 0xCBF7},{0x7D23, 0xBC90},{0x7D24, 0xBC91}, - {0x7D25, 0xBC92},{0x7D26, 0xBC93},{0x7D27, 0xBDF4},{0x7D28, 0xBC94},{0x7D29, 0xBC95},{0x7D2A, 0xBC96},{0x7D2B, 0xD7CF},{0x7D2C, 0xBC97}, - {0x7D2D, 0xBC98},{0x7D2E, 0xBC99},{0x7D2F, 0xC0DB},{0x7D30, 0xBC9A},{0x7D31, 0xBC9B},{0x7D32, 0xBC9C},{0x7D33, 0xBC9D},{0x7D34, 0xBC9E}, - {0x7D35, 0xBC9F},{0x7D36, 0xBCA0},{0x7D37, 0xBD40},{0x7D38, 0xBD41},{0x7D39, 0xBD42},{0x7D3A, 0xBD43},{0x7D3B, 0xBD44},{0x7D3C, 0xBD45}, - {0x7D3D, 0xBD46},{0x7D3E, 0xBD47},{0x7D3F, 0xBD48},{0x7D40, 0xBD49},{0x7D41, 0xBD4A},{0x7D42, 0xBD4B},{0x7D43, 0xBD4C},{0x7D44, 0xBD4D}, - {0x7D45, 0xBD4E},{0x7D46, 0xBD4F},{0x7D47, 0xBD50},{0x7D48, 0xBD51},{0x7D49, 0xBD52},{0x7D4A, 0xBD53},{0x7D4B, 0xBD54},{0x7D4C, 0xBD55}, - {0x7D4D, 0xBD56},{0x7D4E, 0xBD57},{0x7D4F, 0xBD58},{0x7D50, 0xBD59},{0x7D51, 0xBD5A},{0x7D52, 0xBD5B},{0x7D53, 0xBD5C},{0x7D54, 0xBD5D}, - {0x7D55, 0xBD5E},{0x7D56, 0xBD5F},{0x7D57, 0xBD60},{0x7D58, 0xBD61},{0x7D59, 0xBD62},{0x7D5A, 0xBD63},{0x7D5B, 0xBD64},{0x7D5C, 0xBD65}, - {0x7D5D, 0xBD66},{0x7D5E, 0xBD67},{0x7D5F, 0xBD68},{0x7D60, 0xBD69},{0x7D61, 0xBD6A},{0x7D62, 0xBD6B},{0x7D63, 0xBD6C},{0x7D64, 0xBD6D}, - {0x7D65, 0xBD6E},{0x7D66, 0xBD6F},{0x7D67, 0xBD70},{0x7D68, 0xBD71},{0x7D69, 0xBD72},{0x7D6A, 0xBD73},{0x7D6B, 0xBD74},{0x7D6C, 0xBD75}, - {0x7D6D, 0xBD76},{0x7D6E, 0xD0F5},{0x7D6F, 0xBD77},{0x7D70, 0xBD78},{0x7D71, 0xBD79},{0x7D72, 0xBD7A},{0x7D73, 0xBD7B},{0x7D74, 0xBD7C}, - {0x7D75, 0xBD7D},{0x7D76, 0xBD7E},{0x7D77, 0xF4EA},{0x7D78, 0xBD80},{0x7D79, 0xBD81},{0x7D7A, 0xBD82},{0x7D7B, 0xBD83},{0x7D7C, 0xBD84}, - {0x7D7D, 0xBD85},{0x7D7E, 0xBD86},{0x7D7F, 0xBD87},{0x7D80, 0xBD88},{0x7D81, 0xBD89},{0x7D82, 0xBD8A},{0x7D83, 0xBD8B},{0x7D84, 0xBD8C}, - {0x7D85, 0xBD8D},{0x7D86, 0xBD8E},{0x7D87, 0xBD8F},{0x7D88, 0xBD90},{0x7D89, 0xBD91},{0x7D8A, 0xBD92},{0x7D8B, 0xBD93},{0x7D8C, 0xBD94}, - {0x7D8D, 0xBD95},{0x7D8E, 0xBD96},{0x7D8F, 0xBD97},{0x7D90, 0xBD98},{0x7D91, 0xBD99},{0x7D92, 0xBD9A},{0x7D93, 0xBD9B},{0x7D94, 0xBD9C}, - {0x7D95, 0xBD9D},{0x7D96, 0xBD9E},{0x7D97, 0xBD9F},{0x7D98, 0xBDA0},{0x7D99, 0xBE40},{0x7D9A, 0xBE41},{0x7D9B, 0xBE42},{0x7D9C, 0xBE43}, - {0x7D9D, 0xBE44},{0x7D9E, 0xBE45},{0x7D9F, 0xBE46},{0x7DA0, 0xBE47},{0x7DA1, 0xBE48},{0x7DA2, 0xBE49},{0x7DA3, 0xBE4A},{0x7DA4, 0xBE4B}, - {0x7DA5, 0xBE4C},{0x7DA6, 0xF4EB},{0x7DA7, 0xBE4D},{0x7DA8, 0xBE4E},{0x7DA9, 0xBE4F},{0x7DAA, 0xBE50},{0x7DAB, 0xBE51},{0x7DAC, 0xBE52}, - {0x7DAD, 0xBE53},{0x7DAE, 0xF4EC},{0x7DAF, 0xBE54},{0x7DB0, 0xBE55},{0x7DB1, 0xBE56},{0x7DB2, 0xBE57},{0x7DB3, 0xBE58},{0x7DB4, 0xBE59}, - {0x7DB5, 0xBE5A},{0x7DB6, 0xBE5B},{0x7DB7, 0xBE5C},{0x7DB8, 0xBE5D},{0x7DB9, 0xBE5E},{0x7DBA, 0xBE5F},{0x7DBB, 0xBE60},{0x7DBC, 0xBE61}, - {0x7DBD, 0xBE62},{0x7DBE, 0xBE63},{0x7DBF, 0xBE64},{0x7DC0, 0xBE65},{0x7DC1, 0xBE66},{0x7DC2, 0xBE67},{0x7DC3, 0xBE68},{0x7DC4, 0xBE69}, - {0x7DC5, 0xBE6A},{0x7DC6, 0xBE6B},{0x7DC7, 0xBE6C},{0x7DC8, 0xBE6D},{0x7DC9, 0xBE6E},{0x7DCA, 0xBE6F},{0x7DCB, 0xBE70},{0x7DCC, 0xBE71}, - {0x7DCD, 0xBE72},{0x7DCE, 0xBE73},{0x7DCF, 0xBE74},{0x7DD0, 0xBE75},{0x7DD1, 0xBE76},{0x7DD2, 0xBE77},{0x7DD3, 0xBE78},{0x7DD4, 0xBE79}, - {0x7DD5, 0xBE7A},{0x7DD6, 0xBE7B},{0x7DD7, 0xBE7C},{0x7DD8, 0xBE7D},{0x7DD9, 0xBE7E},{0x7DDA, 0xBE80},{0x7DDB, 0xBE81},{0x7DDC, 0xBE82}, - {0x7DDD, 0xBE83},{0x7DDE, 0xBE84},{0x7DDF, 0xBE85},{0x7DE0, 0xBE86},{0x7DE1, 0xBE87},{0x7DE2, 0xBE88},{0x7DE3, 0xBE89},{0x7DE4, 0xBE8A}, - {0x7DE5, 0xBE8B},{0x7DE6, 0xBE8C},{0x7DE7, 0xBE8D},{0x7DE8, 0xBE8E},{0x7DE9, 0xBE8F},{0x7DEA, 0xBE90},{0x7DEB, 0xBE91},{0x7DEC, 0xBE92}, - {0x7DED, 0xBE93},{0x7DEE, 0xBE94},{0x7DEF, 0xBE95},{0x7DF0, 0xBE96},{0x7DF1, 0xBE97},{0x7DF2, 0xBE98},{0x7DF3, 0xBE99},{0x7DF4, 0xBE9A}, - {0x7DF5, 0xBE9B},{0x7DF6, 0xBE9C},{0x7DF7, 0xBE9D},{0x7DF8, 0xBE9E},{0x7DF9, 0xBE9F},{0x7DFA, 0xBEA0},{0x7DFB, 0xBF40},{0x7DFC, 0xBF41}, - {0x7DFD, 0xBF42},{0x7DFE, 0xBF43},{0x7DFF, 0xBF44},{0x7E00, 0xBF45},{0x7E01, 0xBF46},{0x7E02, 0xBF47},{0x7E03, 0xBF48},{0x7E04, 0xBF49}, - {0x7E05, 0xBF4A},{0x7E06, 0xBF4B},{0x7E07, 0xBF4C},{0x7E08, 0xBF4D},{0x7E09, 0xBF4E},{0x7E0A, 0xBF4F},{0x7E0B, 0xBF50},{0x7E0C, 0xBF51}, - {0x7E0D, 0xBF52},{0x7E0E, 0xBF53},{0x7E0F, 0xBF54},{0x7E10, 0xBF55},{0x7E11, 0xBF56},{0x7E12, 0xBF57},{0x7E13, 0xBF58},{0x7E14, 0xBF59}, - {0x7E15, 0xBF5A},{0x7E16, 0xBF5B},{0x7E17, 0xBF5C},{0x7E18, 0xBF5D},{0x7E19, 0xBF5E},{0x7E1A, 0xBF5F},{0x7E1B, 0xBF60},{0x7E1C, 0xBF61}, - {0x7E1D, 0xBF62},{0x7E1E, 0xBF63},{0x7E1F, 0xBF64},{0x7E20, 0xBF65},{0x7E21, 0xBF66},{0x7E22, 0xBF67},{0x7E23, 0xBF68},{0x7E24, 0xBF69}, - {0x7E25, 0xBF6A},{0x7E26, 0xBF6B},{0x7E27, 0xBF6C},{0x7E28, 0xBF6D},{0x7E29, 0xBF6E},{0x7E2A, 0xBF6F},{0x7E2B, 0xBF70},{0x7E2C, 0xBF71}, - {0x7E2D, 0xBF72},{0x7E2E, 0xBF73},{0x7E2F, 0xBF74},{0x7E30, 0xBF75},{0x7E31, 0xBF76},{0x7E32, 0xBF77},{0x7E33, 0xBF78},{0x7E34, 0xBF79}, - {0x7E35, 0xBF7A},{0x7E36, 0xBF7B},{0x7E37, 0xBF7C},{0x7E38, 0xBF7D},{0x7E39, 0xBF7E},{0x7E3A, 0xBF80},{0x7E3B, 0xF7E3},{0x7E3C, 0xBF81}, - {0x7E3D, 0xBF82},{0x7E3E, 0xBF83},{0x7E3F, 0xBF84},{0x7E40, 0xBF85},{0x7E41, 0xB7B1},{0x7E42, 0xBF86},{0x7E43, 0xBF87},{0x7E44, 0xBF88}, - {0x7E45, 0xBF89},{0x7E46, 0xBF8A},{0x7E47, 0xF4ED},{0x7E48, 0xBF8B},{0x7E49, 0xBF8C},{0x7E4A, 0xBF8D},{0x7E4B, 0xBF8E},{0x7E4C, 0xBF8F}, - {0x7E4D, 0xBF90},{0x7E4E, 0xBF91},{0x7E4F, 0xBF92},{0x7E50, 0xBF93},{0x7E51, 0xBF94},{0x7E52, 0xBF95},{0x7E53, 0xBF96},{0x7E54, 0xBF97}, - {0x7E55, 0xBF98},{0x7E56, 0xBF99},{0x7E57, 0xBF9A},{0x7E58, 0xBF9B},{0x7E59, 0xBF9C},{0x7E5A, 0xBF9D},{0x7E5B, 0xBF9E},{0x7E5C, 0xBF9F}, - {0x7E5D, 0xBFA0},{0x7E5E, 0xC040},{0x7E5F, 0xC041},{0x7E60, 0xC042},{0x7E61, 0xC043},{0x7E62, 0xC044},{0x7E63, 0xC045},{0x7E64, 0xC046}, - {0x7E65, 0xC047},{0x7E66, 0xC048},{0x7E67, 0xC049},{0x7E68, 0xC04A},{0x7E69, 0xC04B},{0x7E6A, 0xC04C},{0x7E6B, 0xC04D},{0x7E6C, 0xC04E}, - {0x7E6D, 0xC04F},{0x7E6E, 0xC050},{0x7E6F, 0xC051},{0x7E70, 0xC052},{0x7E71, 0xC053},{0x7E72, 0xC054},{0x7E73, 0xC055},{0x7E74, 0xC056}, - {0x7E75, 0xC057},{0x7E76, 0xC058},{0x7E77, 0xC059},{0x7E78, 0xC05A},{0x7E79, 0xC05B},{0x7E7A, 0xC05C},{0x7E7B, 0xC05D},{0x7E7C, 0xC05E}, - {0x7E7D, 0xC05F},{0x7E7E, 0xC060},{0x7E7F, 0xC061},{0x7E80, 0xC062},{0x7E81, 0xC063},{0x7E82, 0xD7EB},{0x7E83, 0xC064},{0x7E84, 0xC065}, - {0x7E85, 0xC066},{0x7E86, 0xC067},{0x7E87, 0xC068},{0x7E88, 0xC069},{0x7E89, 0xC06A},{0x7E8A, 0xC06B},{0x7E8B, 0xC06C},{0x7E8C, 0xC06D}, - {0x7E8D, 0xC06E},{0x7E8E, 0xC06F},{0x7E8F, 0xC070},{0x7E90, 0xC071},{0x7E91, 0xC072},{0x7E92, 0xC073},{0x7E93, 0xC074},{0x7E94, 0xC075}, - {0x7E95, 0xC076},{0x7E96, 0xC077},{0x7E97, 0xC078},{0x7E98, 0xC079},{0x7E99, 0xC07A},{0x7E9A, 0xC07B},{0x7E9B, 0xF4EE},{0x7E9C, 0xC07C}, - {0x7E9D, 0xC07D},{0x7E9E, 0xC07E},{0x7E9F, 0xE6F9},{0x7EA0, 0xBEC0},{0x7EA1, 0xE6FA},{0x7EA2, 0xBAEC},{0x7EA3, 0xE6FB},{0x7EA4, 0xCFCB}, - {0x7EA5, 0xE6FC},{0x7EA6, 0xD4BC},{0x7EA7, 0xBCB6},{0x7EA8, 0xE6FD},{0x7EA9, 0xE6FE},{0x7EAA, 0xBCCD},{0x7EAB, 0xC8D2},{0x7EAC, 0xCEB3}, - {0x7EAD, 0xE7A1},{0x7EAE, 0xC080},{0x7EAF, 0xB4BF},{0x7EB0, 0xE7A2},{0x7EB1, 0xC9B4},{0x7EB2, 0xB8D9},{0x7EB3, 0xC4C9},{0x7EB4, 0xC081}, - {0x7EB5, 0xD7DD},{0x7EB6, 0xC2DA},{0x7EB7, 0xB7D7},{0x7EB8, 0xD6BD},{0x7EB9, 0xCEC6},{0x7EBA, 0xB7C4},{0x7EBB, 0xC082},{0x7EBC, 0xC083}, - {0x7EBD, 0xC5A6},{0x7EBE, 0xE7A3},{0x7EBF, 0xCFDF},{0x7EC0, 0xE7A4},{0x7EC1, 0xE7A5},{0x7EC2, 0xE7A6},{0x7EC3, 0xC1B7},{0x7EC4, 0xD7E9}, - {0x7EC5, 0xC9F0},{0x7EC6, 0xCFB8},{0x7EC7, 0xD6AF},{0x7EC8, 0xD6D5},{0x7EC9, 0xE7A7},{0x7ECA, 0xB0ED},{0x7ECB, 0xE7A8},{0x7ECC, 0xE7A9}, - {0x7ECD, 0xC9DC},{0x7ECE, 0xD2EF},{0x7ECF, 0xBEAD},{0x7ED0, 0xE7AA},{0x7ED1, 0xB0F3},{0x7ED2, 0xC8DE},{0x7ED3, 0xBDE1},{0x7ED4, 0xE7AB}, - {0x7ED5, 0xC8C6},{0x7ED6, 0xC084},{0x7ED7, 0xE7AC},{0x7ED8, 0xBBE6},{0x7ED9, 0xB8F8},{0x7EDA, 0xD1A4},{0x7EDB, 0xE7AD},{0x7EDC, 0xC2E7}, - {0x7EDD, 0xBEF8},{0x7EDE, 0xBDCA},{0x7EDF, 0xCDB3},{0x7EE0, 0xE7AE},{0x7EE1, 0xE7AF},{0x7EE2, 0xBEEE},{0x7EE3, 0xD0E5},{0x7EE4, 0xC085}, - {0x7EE5, 0xCBE7},{0x7EE6, 0xCCD0},{0x7EE7, 0xBCCC},{0x7EE8, 0xE7B0},{0x7EE9, 0xBCA8},{0x7EEA, 0xD0F7},{0x7EEB, 0xE7B1},{0x7EEC, 0xC086}, - {0x7EED, 0xD0F8},{0x7EEE, 0xE7B2},{0x7EEF, 0xE7B3},{0x7EF0, 0xB4C2},{0x7EF1, 0xE7B4},{0x7EF2, 0xE7B5},{0x7EF3, 0xC9FE},{0x7EF4, 0xCEAC}, - {0x7EF5, 0xC3E0},{0x7EF6, 0xE7B7},{0x7EF7, 0xB1C1},{0x7EF8, 0xB3F1},{0x7EF9, 0xC087},{0x7EFA, 0xE7B8},{0x7EFB, 0xE7B9},{0x7EFC, 0xD7DB}, - {0x7EFD, 0xD5C0},{0x7EFE, 0xE7BA},{0x7EFF, 0xC2CC},{0x7F00, 0xD7BA},{0x7F01, 0xE7BB},{0x7F02, 0xE7BC},{0x7F03, 0xE7BD},{0x7F04, 0xBCEA}, - {0x7F05, 0xC3E5},{0x7F06, 0xC0C2},{0x7F07, 0xE7BE},{0x7F08, 0xE7BF},{0x7F09, 0xBCA9},{0x7F0A, 0xC088},{0x7F0B, 0xE7C0},{0x7F0C, 0xE7C1}, - {0x7F0D, 0xE7B6},{0x7F0E, 0xB6D0},{0x7F0F, 0xE7C2},{0x7F10, 0xC089},{0x7F11, 0xE7C3},{0x7F12, 0xE7C4},{0x7F13, 0xBBBA},{0x7F14, 0xB5DE}, - {0x7F15, 0xC2C6},{0x7F16, 0xB1E0},{0x7F17, 0xE7C5},{0x7F18, 0xD4B5},{0x7F19, 0xE7C6},{0x7F1A, 0xB8BF},{0x7F1B, 0xE7C8},{0x7F1C, 0xE7C7}, - {0x7F1D, 0xB7EC},{0x7F1E, 0xC08A},{0x7F1F, 0xE7C9},{0x7F20, 0xB2F8},{0x7F21, 0xE7CA},{0x7F22, 0xE7CB},{0x7F23, 0xE7CC},{0x7F24, 0xE7CD}, - {0x7F25, 0xE7CE},{0x7F26, 0xE7CF},{0x7F27, 0xE7D0},{0x7F28, 0xD3A7},{0x7F29, 0xCBF5},{0x7F2A, 0xE7D1},{0x7F2B, 0xE7D2},{0x7F2C, 0xE7D3}, - {0x7F2D, 0xE7D4},{0x7F2E, 0xC9C9},{0x7F2F, 0xE7D5},{0x7F30, 0xE7D6},{0x7F31, 0xE7D7},{0x7F32, 0xE7D8},{0x7F33, 0xE7D9},{0x7F34, 0xBDC9}, - {0x7F35, 0xE7DA},{0x7F36, 0xF3BE},{0x7F37, 0xC08B},{0x7F38, 0xB8D7},{0x7F39, 0xC08C},{0x7F3A, 0xC8B1},{0x7F3B, 0xC08D},{0x7F3C, 0xC08E}, - {0x7F3D, 0xC08F},{0x7F3E, 0xC090},{0x7F3F, 0xC091},{0x7F40, 0xC092},{0x7F41, 0xC093},{0x7F42, 0xF3BF},{0x7F43, 0xC094},{0x7F44, 0xF3C0}, - {0x7F45, 0xF3C1},{0x7F46, 0xC095},{0x7F47, 0xC096},{0x7F48, 0xC097},{0x7F49, 0xC098},{0x7F4A, 0xC099},{0x7F4B, 0xC09A},{0x7F4C, 0xC09B}, - {0x7F4D, 0xC09C},{0x7F4E, 0xC09D},{0x7F4F, 0xC09E},{0x7F50, 0xB9DE},{0x7F51, 0xCDF8},{0x7F52, 0xC09F},{0x7F53, 0xC0A0},{0x7F54, 0xD8E8}, - {0x7F55, 0xBAB1},{0x7F56, 0xC140},{0x7F57, 0xC2DE},{0x7F58, 0xEEB7},{0x7F59, 0xC141},{0x7F5A, 0xB7A3},{0x7F5B, 0xC142},{0x7F5C, 0xC143}, - {0x7F5D, 0xC144},{0x7F5E, 0xC145},{0x7F5F, 0xEEB9},{0x7F60, 0xC146},{0x7F61, 0xEEB8},{0x7F62, 0xB0D5},{0x7F63, 0xC147},{0x7F64, 0xC148}, - {0x7F65, 0xC149},{0x7F66, 0xC14A},{0x7F67, 0xC14B},{0x7F68, 0xEEBB},{0x7F69, 0xD5D6},{0x7F6A, 0xD7EF},{0x7F6B, 0xC14C},{0x7F6C, 0xC14D}, - {0x7F6D, 0xC14E},{0x7F6E, 0xD6C3},{0x7F6F, 0xC14F},{0x7F70, 0xC150},{0x7F71, 0xEEBD},{0x7F72, 0xCAF0},{0x7F73, 0xC151},{0x7F74, 0xEEBC}, - {0x7F75, 0xC152},{0x7F76, 0xC153},{0x7F77, 0xC154},{0x7F78, 0xC155},{0x7F79, 0xEEBE},{0x7F7A, 0xC156},{0x7F7B, 0xC157},{0x7F7C, 0xC158}, - {0x7F7D, 0xC159},{0x7F7E, 0xEEC0},{0x7F7F, 0xC15A},{0x7F80, 0xC15B},{0x7F81, 0xEEBF},{0x7F82, 0xC15C},{0x7F83, 0xC15D},{0x7F84, 0xC15E}, - {0x7F85, 0xC15F},{0x7F86, 0xC160},{0x7F87, 0xC161},{0x7F88, 0xC162},{0x7F89, 0xC163},{0x7F8A, 0xD1F2},{0x7F8B, 0xC164},{0x7F8C, 0xC7BC}, - {0x7F8D, 0xC165},{0x7F8E, 0xC3C0},{0x7F8F, 0xC166},{0x7F90, 0xC167},{0x7F91, 0xC168},{0x7F92, 0xC169},{0x7F93, 0xC16A},{0x7F94, 0xB8E1}, - {0x7F95, 0xC16B},{0x7F96, 0xC16C},{0x7F97, 0xC16D},{0x7F98, 0xC16E},{0x7F99, 0xC16F},{0x7F9A, 0xC1E7},{0x7F9B, 0xC170},{0x7F9C, 0xC171}, - {0x7F9D, 0xF4C6},{0x7F9E, 0xD0DF},{0x7F9F, 0xF4C7},{0x7FA0, 0xC172},{0x7FA1, 0xCFDB},{0x7FA2, 0xC173},{0x7FA3, 0xC174},{0x7FA4, 0xC8BA}, - {0x7FA5, 0xC175},{0x7FA6, 0xC176},{0x7FA7, 0xF4C8},{0x7FA8, 0xC177},{0x7FA9, 0xC178},{0x7FAA, 0xC179},{0x7FAB, 0xC17A},{0x7FAC, 0xC17B}, - {0x7FAD, 0xC17C},{0x7FAE, 0xC17D},{0x7FAF, 0xF4C9},{0x7FB0, 0xF4CA},{0x7FB1, 0xC17E},{0x7FB2, 0xF4CB},{0x7FB3, 0xC180},{0x7FB4, 0xC181}, - {0x7FB5, 0xC182},{0x7FB6, 0xC183},{0x7FB7, 0xC184},{0x7FB8, 0xD9FA},{0x7FB9, 0xB8FE},{0x7FBA, 0xC185},{0x7FBB, 0xC186},{0x7FBC, 0xE5F1}, - {0x7FBD, 0xD3F0},{0x7FBE, 0xC187},{0x7FBF, 0xF4E0},{0x7FC0, 0xC188},{0x7FC1, 0xCECC},{0x7FC2, 0xC189},{0x7FC3, 0xC18A},{0x7FC4, 0xC18B}, - {0x7FC5, 0xB3E1},{0x7FC6, 0xC18C},{0x7FC7, 0xC18D},{0x7FC8, 0xC18E},{0x7FC9, 0xC18F},{0x7FCA, 0xF1B4},{0x7FCB, 0xC190},{0x7FCC, 0xD2EE}, - {0x7FCD, 0xC191},{0x7FCE, 0xF4E1},{0x7FCF, 0xC192},{0x7FD0, 0xC193},{0x7FD1, 0xC194},{0x7FD2, 0xC195},{0x7FD3, 0xC196},{0x7FD4, 0xCFE8}, - {0x7FD5, 0xF4E2},{0x7FD6, 0xC197},{0x7FD7, 0xC198},{0x7FD8, 0xC7CC},{0x7FD9, 0xC199},{0x7FDA, 0xC19A},{0x7FDB, 0xC19B},{0x7FDC, 0xC19C}, - {0x7FDD, 0xC19D},{0x7FDE, 0xC19E},{0x7FDF, 0xB5D4},{0x7FE0, 0xB4E4},{0x7FE1, 0xF4E4},{0x7FE2, 0xC19F},{0x7FE3, 0xC1A0},{0x7FE4, 0xC240}, - {0x7FE5, 0xF4E3},{0x7FE6, 0xF4E5},{0x7FE7, 0xC241},{0x7FE8, 0xC242},{0x7FE9, 0xF4E6},{0x7FEA, 0xC243},{0x7FEB, 0xC244},{0x7FEC, 0xC245}, - {0x7FED, 0xC246},{0x7FEE, 0xF4E7},{0x7FEF, 0xC247},{0x7FF0, 0xBAB2},{0x7FF1, 0xB0BF},{0x7FF2, 0xC248},{0x7FF3, 0xF4E8},{0x7FF4, 0xC249}, - {0x7FF5, 0xC24A},{0x7FF6, 0xC24B},{0x7FF7, 0xC24C},{0x7FF8, 0xC24D},{0x7FF9, 0xC24E},{0x7FFA, 0xC24F},{0x7FFB, 0xB7AD},{0x7FFC, 0xD2ED}, - {0x7FFD, 0xC250},{0x7FFE, 0xC251},{0x7FFF, 0xC252},{0x8000, 0xD2AB},{0x8001, 0xC0CF},{0x8002, 0xC253},{0x8003, 0xBFBC},{0x8004, 0xEBA3}, - {0x8005, 0xD5DF},{0x8006, 0xEAC8},{0x8007, 0xC254},{0x8008, 0xC255},{0x8009, 0xC256},{0x800A, 0xC257},{0x800B, 0xF1F3},{0x800C, 0xB6F8}, - {0x800D, 0xCBA3},{0x800E, 0xC258},{0x800F, 0xC259},{0x8010, 0xC4CD},{0x8011, 0xC25A},{0x8012, 0xF1E7},{0x8013, 0xC25B},{0x8014, 0xF1E8}, - {0x8015, 0xB8FB},{0x8016, 0xF1E9},{0x8017, 0xBAC4},{0x8018, 0xD4C5},{0x8019, 0xB0D2},{0x801A, 0xC25C},{0x801B, 0xC25D},{0x801C, 0xF1EA}, - {0x801D, 0xC25E},{0x801E, 0xC25F},{0x801F, 0xC260},{0x8020, 0xF1EB},{0x8021, 0xC261},{0x8022, 0xF1EC},{0x8023, 0xC262},{0x8024, 0xC263}, - {0x8025, 0xF1ED},{0x8026, 0xF1EE},{0x8027, 0xF1EF},{0x8028, 0xF1F1},{0x8029, 0xF1F0},{0x802A, 0xC5D5},{0x802B, 0xC264},{0x802C, 0xC265}, - {0x802D, 0xC266},{0x802E, 0xC267},{0x802F, 0xC268},{0x8030, 0xC269},{0x8031, 0xF1F2},{0x8032, 0xC26A},{0x8033, 0xB6FA},{0x8034, 0xC26B}, - {0x8035, 0xF1F4},{0x8036, 0xD2AE},{0x8037, 0xDEC7},{0x8038, 0xCBCA},{0x8039, 0xC26C},{0x803A, 0xC26D},{0x803B, 0xB3DC},{0x803C, 0xC26E}, - {0x803D, 0xB5A2},{0x803E, 0xC26F},{0x803F, 0xB9A2},{0x8040, 0xC270},{0x8041, 0xC271},{0x8042, 0xC4F4},{0x8043, 0xF1F5},{0x8044, 0xC272}, - {0x8045, 0xC273},{0x8046, 0xF1F6},{0x8047, 0xC274},{0x8048, 0xC275},{0x8049, 0xC276},{0x804A, 0xC1C4},{0x804B, 0xC1FB},{0x804C, 0xD6B0}, - {0x804D, 0xF1F7},{0x804E, 0xC277},{0x804F, 0xC278},{0x8050, 0xC279},{0x8051, 0xC27A},{0x8052, 0xF1F8},{0x8053, 0xC27B},{0x8054, 0xC1AA}, - {0x8055, 0xC27C},{0x8056, 0xC27D},{0x8057, 0xC27E},{0x8058, 0xC6B8},{0x8059, 0xC280},{0x805A, 0xBEDB},{0x805B, 0xC281},{0x805C, 0xC282}, - {0x805D, 0xC283},{0x805E, 0xC284},{0x805F, 0xC285},{0x8060, 0xC286},{0x8061, 0xC287},{0x8062, 0xC288},{0x8063, 0xC289},{0x8064, 0xC28A}, - {0x8065, 0xC28B},{0x8066, 0xC28C},{0x8067, 0xC28D},{0x8068, 0xC28E},{0x8069, 0xF1F9},{0x806A, 0xB4CF},{0x806B, 0xC28F},{0x806C, 0xC290}, - {0x806D, 0xC291},{0x806E, 0xC292},{0x806F, 0xC293},{0x8070, 0xC294},{0x8071, 0xF1FA},{0x8072, 0xC295},{0x8073, 0xC296},{0x8074, 0xC297}, - {0x8075, 0xC298},{0x8076, 0xC299},{0x8077, 0xC29A},{0x8078, 0xC29B},{0x8079, 0xC29C},{0x807A, 0xC29D},{0x807B, 0xC29E},{0x807C, 0xC29F}, - {0x807D, 0xC2A0},{0x807E, 0xC340},{0x807F, 0xEDB2},{0x8080, 0xEDB1},{0x8081, 0xC341},{0x8082, 0xC342},{0x8083, 0xCBE0},{0x8084, 0xD2DE}, - {0x8085, 0xC343},{0x8086, 0xCBC1},{0x8087, 0xD5D8},{0x8088, 0xC344},{0x8089, 0xC8E2},{0x808A, 0xC345},{0x808B, 0xC0DF},{0x808C, 0xBCA1}, - {0x808D, 0xC346},{0x808E, 0xC347},{0x808F, 0xC348},{0x8090, 0xC349},{0x8091, 0xC34A},{0x8092, 0xC34B},{0x8093, 0xEBC1},{0x8094, 0xC34C}, - {0x8095, 0xC34D},{0x8096, 0xD0A4},{0x8097, 0xC34E},{0x8098, 0xD6E2},{0x8099, 0xC34F},{0x809A, 0xB6C7},{0x809B, 0xB8D8},{0x809C, 0xEBC0}, - {0x809D, 0xB8CE},{0x809E, 0xC350},{0x809F, 0xEBBF},{0x80A0, 0xB3A6},{0x80A1, 0xB9C9},{0x80A2, 0xD6AB},{0x80A3, 0xC351},{0x80A4, 0xB7F4}, - {0x80A5, 0xB7CA},{0x80A6, 0xC352},{0x80A7, 0xC353},{0x80A8, 0xC354},{0x80A9, 0xBCE7},{0x80AA, 0xB7BE},{0x80AB, 0xEBC6},{0x80AC, 0xC355}, - {0x80AD, 0xEBC7},{0x80AE, 0xB0B9},{0x80AF, 0xBFCF},{0x80B0, 0xC356},{0x80B1, 0xEBC5},{0x80B2, 0xD3FD},{0x80B3, 0xC357},{0x80B4, 0xEBC8}, - {0x80B5, 0xC358},{0x80B6, 0xC359},{0x80B7, 0xEBC9},{0x80B8, 0xC35A},{0x80B9, 0xC35B},{0x80BA, 0xB7CE},{0x80BB, 0xC35C},{0x80BC, 0xEBC2}, - {0x80BD, 0xEBC4},{0x80BE, 0xC9F6},{0x80BF, 0xD6D7},{0x80C0, 0xD5CD},{0x80C1, 0xD0B2},{0x80C2, 0xEBCF},{0x80C3, 0xCEB8},{0x80C4, 0xEBD0}, - {0x80C5, 0xC35D},{0x80C6, 0xB5A8},{0x80C7, 0xC35E},{0x80C8, 0xC35F},{0x80C9, 0xC360},{0x80CA, 0xC361},{0x80CB, 0xC362},{0x80CC, 0xB1B3}, - {0x80CD, 0xEBD2},{0x80CE, 0xCCA5},{0x80CF, 0xC363},{0x80D0, 0xC364},{0x80D1, 0xC365},{0x80D2, 0xC366},{0x80D3, 0xC367},{0x80D4, 0xC368}, - {0x80D5, 0xC369},{0x80D6, 0xC5D6},{0x80D7, 0xEBD3},{0x80D8, 0xC36A},{0x80D9, 0xEBD1},{0x80DA, 0xC5DF},{0x80DB, 0xEBCE},{0x80DC, 0xCAA4}, - {0x80DD, 0xEBD5},{0x80DE, 0xB0FB},{0x80DF, 0xC36B},{0x80E0, 0xC36C},{0x80E1, 0xBAFA},{0x80E2, 0xC36D},{0x80E3, 0xC36E},{0x80E4, 0xD8B7}, - {0x80E5, 0xF1E3},{0x80E6, 0xC36F},{0x80E7, 0xEBCA},{0x80E8, 0xEBCB},{0x80E9, 0xEBCC},{0x80EA, 0xEBCD},{0x80EB, 0xEBD6},{0x80EC, 0xE6C0}, - {0x80ED, 0xEBD9},{0x80EE, 0xC370},{0x80EF, 0xBFE8},{0x80F0, 0xD2C8},{0x80F1, 0xEBD7},{0x80F2, 0xEBDC},{0x80F3, 0xB8EC},{0x80F4, 0xEBD8}, - {0x80F5, 0xC371},{0x80F6, 0xBDBA},{0x80F7, 0xC372},{0x80F8, 0xD0D8},{0x80F9, 0xC373},{0x80FA, 0xB0B7},{0x80FB, 0xC374},{0x80FC, 0xEBDD}, - {0x80FD, 0xC4DC},{0x80FE, 0xC375},{0x80FF, 0xC376},{0x8100, 0xC377},{0x8101, 0xC378},{0x8102, 0xD6AC},{0x8103, 0xC379},{0x8104, 0xC37A}, - {0x8105, 0xC37B},{0x8106, 0xB4E0},{0x8107, 0xC37C},{0x8108, 0xC37D},{0x8109, 0xC2F6},{0x810A, 0xBCB9},{0x810B, 0xC37E},{0x810C, 0xC380}, - {0x810D, 0xEBDA},{0x810E, 0xEBDB},{0x810F, 0xD4E0},{0x8110, 0xC6EA},{0x8111, 0xC4D4},{0x8112, 0xEBDF},{0x8113, 0xC5A7},{0x8114, 0xD9F5}, - {0x8115, 0xC381},{0x8116, 0xB2B1},{0x8117, 0xC382},{0x8118, 0xEBE4},{0x8119, 0xC383},{0x811A, 0xBDC5},{0x811B, 0xC384},{0x811C, 0xC385}, - {0x811D, 0xC386},{0x811E, 0xEBE2},{0x811F, 0xC387},{0x8120, 0xC388},{0x8121, 0xC389},{0x8122, 0xC38A},{0x8123, 0xC38B},{0x8124, 0xC38C}, - {0x8125, 0xC38D},{0x8126, 0xC38E},{0x8127, 0xC38F},{0x8128, 0xC390},{0x8129, 0xC391},{0x812A, 0xC392},{0x812B, 0xC393},{0x812C, 0xEBE3}, - {0x812D, 0xC394},{0x812E, 0xC395},{0x812F, 0xB8AC},{0x8130, 0xC396},{0x8131, 0xCDD1},{0x8132, 0xEBE5},{0x8133, 0xC397},{0x8134, 0xC398}, - {0x8135, 0xC399},{0x8136, 0xEBE1},{0x8137, 0xC39A},{0x8138, 0xC1B3},{0x8139, 0xC39B},{0x813A, 0xC39C},{0x813B, 0xC39D},{0x813C, 0xC39E}, - {0x813D, 0xC39F},{0x813E, 0xC6A2},{0x813F, 0xC3A0},{0x8140, 0xC440},{0x8141, 0xC441},{0x8142, 0xC442},{0x8143, 0xC443},{0x8144, 0xC444}, - {0x8145, 0xC445},{0x8146, 0xCCF3},{0x8147, 0xC446},{0x8148, 0xEBE6},{0x8149, 0xC447},{0x814A, 0xC0B0},{0x814B, 0xD2B8},{0x814C, 0xEBE7}, - {0x814D, 0xC448},{0x814E, 0xC449},{0x814F, 0xC44A},{0x8150, 0xB8AF},{0x8151, 0xB8AD},{0x8152, 0xC44B},{0x8153, 0xEBE8},{0x8154, 0xC7BB}, - {0x8155, 0xCDF3},{0x8156, 0xC44C},{0x8157, 0xC44D},{0x8158, 0xC44E},{0x8159, 0xEBEA},{0x815A, 0xEBEB},{0x815B, 0xC44F},{0x815C, 0xC450}, - {0x815D, 0xC451},{0x815E, 0xC452},{0x815F, 0xC453},{0x8160, 0xEBED},{0x8161, 0xC454},{0x8162, 0xC455},{0x8163, 0xC456},{0x8164, 0xC457}, - {0x8165, 0xD0C8},{0x8166, 0xC458},{0x8167, 0xEBF2},{0x8168, 0xC459},{0x8169, 0xEBEE},{0x816A, 0xC45A},{0x816B, 0xC45B},{0x816C, 0xC45C}, - {0x816D, 0xEBF1},{0x816E, 0xC8F9},{0x816F, 0xC45D},{0x8170, 0xD1FC},{0x8171, 0xEBEC},{0x8172, 0xC45E},{0x8173, 0xC45F},{0x8174, 0xEBE9}, - {0x8175, 0xC460},{0x8176, 0xC461},{0x8177, 0xC462},{0x8178, 0xC463},{0x8179, 0xB8B9},{0x817A, 0xCFD9},{0x817B, 0xC4E5},{0x817C, 0xEBEF}, - {0x817D, 0xEBF0},{0x817E, 0xCCDA},{0x817F, 0xCDC8},{0x8180, 0xB0F2},{0x8181, 0xC464},{0x8182, 0xEBF6},{0x8183, 0xC465},{0x8184, 0xC466}, - {0x8185, 0xC467},{0x8186, 0xC468},{0x8187, 0xC469},{0x8188, 0xEBF5},{0x8189, 0xC46A},{0x818A, 0xB2B2},{0x818B, 0xC46B},{0x818C, 0xC46C}, - {0x818D, 0xC46D},{0x818E, 0xC46E},{0x818F, 0xB8E0},{0x8190, 0xC46F},{0x8191, 0xEBF7},{0x8192, 0xC470},{0x8193, 0xC471},{0x8194, 0xC472}, - {0x8195, 0xC473},{0x8196, 0xC474},{0x8197, 0xC475},{0x8198, 0xB1EC},{0x8199, 0xC476},{0x819A, 0xC477},{0x819B, 0xCCC5},{0x819C, 0xC4A4}, - {0x819D, 0xCFA5},{0x819E, 0xC478},{0x819F, 0xC479},{0x81A0, 0xC47A},{0x81A1, 0xC47B},{0x81A2, 0xC47C},{0x81A3, 0xEBF9},{0x81A4, 0xC47D}, - {0x81A5, 0xC47E},{0x81A6, 0xECA2},{0x81A7, 0xC480},{0x81A8, 0xC5F2},{0x81A9, 0xC481},{0x81AA, 0xEBFA},{0x81AB, 0xC482},{0x81AC, 0xC483}, - {0x81AD, 0xC484},{0x81AE, 0xC485},{0x81AF, 0xC486},{0x81B0, 0xC487},{0x81B1, 0xC488},{0x81B2, 0xC489},{0x81B3, 0xC9C5},{0x81B4, 0xC48A}, - {0x81B5, 0xC48B},{0x81B6, 0xC48C},{0x81B7, 0xC48D},{0x81B8, 0xC48E},{0x81B9, 0xC48F},{0x81BA, 0xE2DF},{0x81BB, 0xEBFE},{0x81BC, 0xC490}, - {0x81BD, 0xC491},{0x81BE, 0xC492},{0x81BF, 0xC493},{0x81C0, 0xCDCE},{0x81C1, 0xECA1},{0x81C2, 0xB1DB},{0x81C3, 0xD3B7},{0x81C4, 0xC494}, - {0x81C5, 0xC495},{0x81C6, 0xD2DC},{0x81C7, 0xC496},{0x81C8, 0xC497},{0x81C9, 0xC498},{0x81CA, 0xEBFD},{0x81CB, 0xC499},{0x81CC, 0xEBFB}, - {0x81CD, 0xC49A},{0x81CE, 0xC49B},{0x81CF, 0xC49C},{0x81D0, 0xC49D},{0x81D1, 0xC49E},{0x81D2, 0xC49F},{0x81D3, 0xC4A0},{0x81D4, 0xC540}, - {0x81D5, 0xC541},{0x81D6, 0xC542},{0x81D7, 0xC543},{0x81D8, 0xC544},{0x81D9, 0xC545},{0x81DA, 0xC546},{0x81DB, 0xC547},{0x81DC, 0xC548}, - {0x81DD, 0xC549},{0x81DE, 0xC54A},{0x81DF, 0xC54B},{0x81E0, 0xC54C},{0x81E1, 0xC54D},{0x81E2, 0xC54E},{0x81E3, 0xB3BC},{0x81E4, 0xC54F}, - {0x81E5, 0xC550},{0x81E6, 0xC551},{0x81E7, 0xEAB0},{0x81E8, 0xC552},{0x81E9, 0xC553},{0x81EA, 0xD7D4},{0x81EB, 0xC554},{0x81EC, 0xF4AB}, - {0x81ED, 0xB3F4},{0x81EE, 0xC555},{0x81EF, 0xC556},{0x81F0, 0xC557},{0x81F1, 0xC558},{0x81F2, 0xC559},{0x81F3, 0xD6C1},{0x81F4, 0xD6C2}, - {0x81F5, 0xC55A},{0x81F6, 0xC55B},{0x81F7, 0xC55C},{0x81F8, 0xC55D},{0x81F9, 0xC55E},{0x81FA, 0xC55F},{0x81FB, 0xD5E9},{0x81FC, 0xBECA}, - {0x81FD, 0xC560},{0x81FE, 0xF4A7},{0x81FF, 0xC561},{0x8200, 0xD2A8},{0x8201, 0xF4A8},{0x8202, 0xF4A9},{0x8203, 0xC562},{0x8204, 0xF4AA}, - {0x8205, 0xBECB},{0x8206, 0xD3DF},{0x8207, 0xC563},{0x8208, 0xC564},{0x8209, 0xC565},{0x820A, 0xC566},{0x820B, 0xC567},{0x820C, 0xC9E0}, - {0x820D, 0xC9E1},{0x820E, 0xC568},{0x820F, 0xC569},{0x8210, 0xF3C2},{0x8211, 0xC56A},{0x8212, 0xCAE6},{0x8213, 0xC56B},{0x8214, 0xCCF2}, - {0x8215, 0xC56C},{0x8216, 0xC56D},{0x8217, 0xC56E},{0x8218, 0xC56F},{0x8219, 0xC570},{0x821A, 0xC571},{0x821B, 0xE2B6},{0x821C, 0xCBB4}, - {0x821D, 0xC572},{0x821E, 0xCEE8},{0x821F, 0xD6DB},{0x8220, 0xC573},{0x8221, 0xF4AD},{0x8222, 0xF4AE},{0x8223, 0xF4AF},{0x8224, 0xC574}, - {0x8225, 0xC575},{0x8226, 0xC576},{0x8227, 0xC577},{0x8228, 0xF4B2},{0x8229, 0xC578},{0x822A, 0xBABD},{0x822B, 0xF4B3},{0x822C, 0xB0E3}, - {0x822D, 0xF4B0},{0x822E, 0xC579},{0x822F, 0xF4B1},{0x8230, 0xBDA2},{0x8231, 0xB2D5},{0x8232, 0xC57A},{0x8233, 0xF4B6},{0x8234, 0xF4B7}, - {0x8235, 0xB6E6},{0x8236, 0xB2B0},{0x8237, 0xCFCF},{0x8238, 0xF4B4},{0x8239, 0xB4AC},{0x823A, 0xC57B},{0x823B, 0xF4B5},{0x823C, 0xC57C}, - {0x823D, 0xC57D},{0x823E, 0xF4B8},{0x823F, 0xC57E},{0x8240, 0xC580},{0x8241, 0xC581},{0x8242, 0xC582},{0x8243, 0xC583},{0x8244, 0xF4B9}, - {0x8245, 0xC584},{0x8246, 0xC585},{0x8247, 0xCDA7},{0x8248, 0xC586},{0x8249, 0xF4BA},{0x824A, 0xC587},{0x824B, 0xF4BB},{0x824C, 0xC588}, - {0x824D, 0xC589},{0x824E, 0xC58A},{0x824F, 0xF4BC},{0x8250, 0xC58B},{0x8251, 0xC58C},{0x8252, 0xC58D},{0x8253, 0xC58E},{0x8254, 0xC58F}, - {0x8255, 0xC590},{0x8256, 0xC591},{0x8257, 0xC592},{0x8258, 0xCBD2},{0x8259, 0xC593},{0x825A, 0xF4BD},{0x825B, 0xC594},{0x825C, 0xC595}, - {0x825D, 0xC596},{0x825E, 0xC597},{0x825F, 0xF4BE},{0x8260, 0xC598},{0x8261, 0xC599},{0x8262, 0xC59A},{0x8263, 0xC59B},{0x8264, 0xC59C}, - {0x8265, 0xC59D},{0x8266, 0xC59E},{0x8267, 0xC59F},{0x8268, 0xF4BF},{0x8269, 0xC5A0},{0x826A, 0xC640},{0x826B, 0xC641},{0x826C, 0xC642}, - {0x826D, 0xC643},{0x826E, 0xF4DE},{0x826F, 0xC1BC},{0x8270, 0xBCE8},{0x8271, 0xC644},{0x8272, 0xC9AB},{0x8273, 0xD1DE},{0x8274, 0xE5F5}, - {0x8275, 0xC645},{0x8276, 0xC646},{0x8277, 0xC647},{0x8278, 0xC648},{0x8279, 0xDCB3},{0x827A, 0xD2D5},{0x827B, 0xC649},{0x827C, 0xC64A}, - {0x827D, 0xDCB4},{0x827E, 0xB0AC},{0x827F, 0xDCB5},{0x8280, 0xC64B},{0x8281, 0xC64C},{0x8282, 0xBDDA},{0x8283, 0xC64D},{0x8284, 0xDCB9}, - {0x8285, 0xC64E},{0x8286, 0xC64F},{0x8287, 0xC650},{0x8288, 0xD8C2},{0x8289, 0xC651},{0x828A, 0xDCB7},{0x828B, 0xD3F3},{0x828C, 0xC652}, - {0x828D, 0xC9D6},{0x828E, 0xDCBA},{0x828F, 0xDCB6},{0x8290, 0xC653},{0x8291, 0xDCBB},{0x8292, 0xC3A2},{0x8293, 0xC654},{0x8294, 0xC655}, - {0x8295, 0xC656},{0x8296, 0xC657},{0x8297, 0xDCBC},{0x8298, 0xDCC5},{0x8299, 0xDCBD},{0x829A, 0xC658},{0x829B, 0xC659},{0x829C, 0xCEDF}, - {0x829D, 0xD6A5},{0x829E, 0xC65A},{0x829F, 0xDCCF},{0x82A0, 0xC65B},{0x82A1, 0xDCCD},{0x82A2, 0xC65C},{0x82A3, 0xC65D},{0x82A4, 0xDCD2}, - {0x82A5, 0xBDE6},{0x82A6, 0xC2AB},{0x82A7, 0xC65E},{0x82A8, 0xDCB8},{0x82A9, 0xDCCB},{0x82AA, 0xDCCE},{0x82AB, 0xDCBE},{0x82AC, 0xB7D2}, - {0x82AD, 0xB0C5},{0x82AE, 0xDCC7},{0x82AF, 0xD0BE},{0x82B0, 0xDCC1},{0x82B1, 0xBBA8},{0x82B2, 0xC65F},{0x82B3, 0xB7BC},{0x82B4, 0xDCCC}, - {0x82B5, 0xC660},{0x82B6, 0xC661},{0x82B7, 0xDCC6},{0x82B8, 0xDCBF},{0x82B9, 0xC7DB},{0x82BA, 0xC662},{0x82BB, 0xC663},{0x82BC, 0xC664}, - {0x82BD, 0xD1BF},{0x82BE, 0xDCC0},{0x82BF, 0xC665},{0x82C0, 0xC666},{0x82C1, 0xDCCA},{0x82C2, 0xC667},{0x82C3, 0xC668},{0x82C4, 0xDCD0}, - {0x82C5, 0xC669},{0x82C6, 0xC66A},{0x82C7, 0xCEAD},{0x82C8, 0xDCC2},{0x82C9, 0xC66B},{0x82CA, 0xDCC3},{0x82CB, 0xDCC8},{0x82CC, 0xDCC9}, - {0x82CD, 0xB2D4},{0x82CE, 0xDCD1},{0x82CF, 0xCBD5},{0x82D0, 0xC66C},{0x82D1, 0xD4B7},{0x82D2, 0xDCDB},{0x82D3, 0xDCDF},{0x82D4, 0xCCA6}, - {0x82D5, 0xDCE6},{0x82D6, 0xC66D},{0x82D7, 0xC3E7},{0x82D8, 0xDCDC},{0x82D9, 0xC66E},{0x82DA, 0xC66F},{0x82DB, 0xBFC1},{0x82DC, 0xDCD9}, - {0x82DD, 0xC670},{0x82DE, 0xB0FA},{0x82DF, 0xB9B6},{0x82E0, 0xDCE5},{0x82E1, 0xDCD3},{0x82E2, 0xC671},{0x82E3, 0xDCC4},{0x82E4, 0xDCD6}, - {0x82E5, 0xC8F4},{0x82E6, 0xBFE0},{0x82E7, 0xC672},{0x82E8, 0xC673},{0x82E9, 0xC674},{0x82EA, 0xC675},{0x82EB, 0xC9BB},{0x82EC, 0xC676}, - {0x82ED, 0xC677},{0x82EE, 0xC678},{0x82EF, 0xB1BD},{0x82F0, 0xC679},{0x82F1, 0xD3A2},{0x82F2, 0xC67A},{0x82F3, 0xC67B},{0x82F4, 0xDCDA}, - {0x82F5, 0xC67C},{0x82F6, 0xC67D},{0x82F7, 0xDCD5},{0x82F8, 0xC67E},{0x82F9, 0xC6BB},{0x82FA, 0xC680},{0x82FB, 0xDCDE},{0x82FC, 0xC681}, - {0x82FD, 0xC682},{0x82FE, 0xC683},{0x82FF, 0xC684},{0x8300, 0xC685},{0x8301, 0xD7C2},{0x8302, 0xC3AF},{0x8303, 0xB7B6},{0x8304, 0xC7D1}, - {0x8305, 0xC3A9},{0x8306, 0xDCE2},{0x8307, 0xDCD8},{0x8308, 0xDCEB},{0x8309, 0xDCD4},{0x830A, 0xC686},{0x830B, 0xC687},{0x830C, 0xDCDD}, - {0x830D, 0xC688},{0x830E, 0xBEA5},{0x830F, 0xDCD7},{0x8310, 0xC689},{0x8311, 0xDCE0},{0x8312, 0xC68A},{0x8313, 0xC68B},{0x8314, 0xDCE3}, - {0x8315, 0xDCE4},{0x8316, 0xC68C},{0x8317, 0xDCF8},{0x8318, 0xC68D},{0x8319, 0xC68E},{0x831A, 0xDCE1},{0x831B, 0xDDA2},{0x831C, 0xDCE7}, - {0x831D, 0xC68F},{0x831E, 0xC690},{0x831F, 0xC691},{0x8320, 0xC692},{0x8321, 0xC693},{0x8322, 0xC694},{0x8323, 0xC695},{0x8324, 0xC696}, - {0x8325, 0xC697},{0x8326, 0xC698},{0x8327, 0xBCEB},{0x8328, 0xB4C4},{0x8329, 0xC699},{0x832A, 0xC69A},{0x832B, 0xC3A3},{0x832C, 0xB2E7}, - {0x832D, 0xDCFA},{0x832E, 0xC69B},{0x832F, 0xDCF2},{0x8330, 0xC69C},{0x8331, 0xDCEF},{0x8332, 0xC69D},{0x8333, 0xDCFC},{0x8334, 0xDCEE}, - {0x8335, 0xD2F0},{0x8336, 0xB2E8},{0x8337, 0xC69E},{0x8338, 0xC8D7},{0x8339, 0xC8E3},{0x833A, 0xDCFB},{0x833B, 0xC69F},{0x833C, 0xDCED}, - {0x833D, 0xC6A0},{0x833E, 0xC740},{0x833F, 0xC741},{0x8340, 0xDCF7},{0x8341, 0xC742},{0x8342, 0xC743},{0x8343, 0xDCF5},{0x8344, 0xC744}, - {0x8345, 0xC745},{0x8346, 0xBEA3},{0x8347, 0xDCF4},{0x8348, 0xC746},{0x8349, 0xB2DD},{0x834A, 0xC747},{0x834B, 0xC748},{0x834C, 0xC749}, - {0x834D, 0xC74A},{0x834E, 0xC74B},{0x834F, 0xDCF3},{0x8350, 0xBCF6},{0x8351, 0xDCE8},{0x8352, 0xBBC4},{0x8353, 0xC74C},{0x8354, 0xC0F3}, - {0x8355, 0xC74D},{0x8356, 0xC74E},{0x8357, 0xC74F},{0x8358, 0xC750},{0x8359, 0xC751},{0x835A, 0xBCD4},{0x835B, 0xDCE9},{0x835C, 0xDCEA}, - {0x835D, 0xC752},{0x835E, 0xDCF1},{0x835F, 0xDCF6},{0x8360, 0xDCF9},{0x8361, 0xB5B4},{0x8362, 0xC753},{0x8363, 0xC8D9},{0x8364, 0xBBE7}, - {0x8365, 0xDCFE},{0x8366, 0xDCFD},{0x8367, 0xD3AB},{0x8368, 0xDDA1},{0x8369, 0xDDA3},{0x836A, 0xDDA5},{0x836B, 0xD2F1},{0x836C, 0xDDA4}, - {0x836D, 0xDDA6},{0x836E, 0xDDA7},{0x836F, 0xD2A9},{0x8370, 0xC754},{0x8371, 0xC755},{0x8372, 0xC756},{0x8373, 0xC757},{0x8374, 0xC758}, - {0x8375, 0xC759},{0x8376, 0xC75A},{0x8377, 0xBAC9},{0x8378, 0xDDA9},{0x8379, 0xC75B},{0x837A, 0xC75C},{0x837B, 0xDDB6},{0x837C, 0xDDB1}, - {0x837D, 0xDDB4},{0x837E, 0xC75D},{0x837F, 0xC75E},{0x8380, 0xC75F},{0x8381, 0xC760},{0x8382, 0xC761},{0x8383, 0xC762},{0x8384, 0xC763}, - {0x8385, 0xDDB0},{0x8386, 0xC6CE},{0x8387, 0xC764},{0x8388, 0xC765},{0x8389, 0xC0F2},{0x838A, 0xC766},{0x838B, 0xC767},{0x838C, 0xC768}, - {0x838D, 0xC769},{0x838E, 0xC9AF},{0x838F, 0xC76A},{0x8390, 0xC76B},{0x8391, 0xC76C},{0x8392, 0xDCEC},{0x8393, 0xDDAE},{0x8394, 0xC76D}, - {0x8395, 0xC76E},{0x8396, 0xC76F},{0x8397, 0xC770},{0x8398, 0xDDB7},{0x8399, 0xC771},{0x839A, 0xC772},{0x839B, 0xDCF0},{0x839C, 0xDDAF}, - {0x839D, 0xC773},{0x839E, 0xDDB8},{0x839F, 0xC774},{0x83A0, 0xDDAC},{0x83A1, 0xC775},{0x83A2, 0xC776},{0x83A3, 0xC777},{0x83A4, 0xC778}, - {0x83A5, 0xC779},{0x83A6, 0xC77A},{0x83A7, 0xC77B},{0x83A8, 0xDDB9},{0x83A9, 0xDDB3},{0x83AA, 0xDDAD},{0x83AB, 0xC4AA},{0x83AC, 0xC77C}, - {0x83AD, 0xC77D},{0x83AE, 0xC77E},{0x83AF, 0xC780},{0x83B0, 0xDDA8},{0x83B1, 0xC0B3},{0x83B2, 0xC1AB},{0x83B3, 0xDDAA},{0x83B4, 0xDDAB}, - {0x83B5, 0xC781},{0x83B6, 0xDDB2},{0x83B7, 0xBBF1},{0x83B8, 0xDDB5},{0x83B9, 0xD3A8},{0x83BA, 0xDDBA},{0x83BB, 0xC782},{0x83BC, 0xDDBB}, - {0x83BD, 0xC3A7},{0x83BE, 0xC783},{0x83BF, 0xC784},{0x83C0, 0xDDD2},{0x83C1, 0xDDBC},{0x83C2, 0xC785},{0x83C3, 0xC786},{0x83C4, 0xC787}, - {0x83C5, 0xDDD1},{0x83C6, 0xC788},{0x83C7, 0xB9BD},{0x83C8, 0xC789},{0x83C9, 0xC78A},{0x83CA, 0xBED5},{0x83CB, 0xC78B},{0x83CC, 0xBEFA}, - {0x83CD, 0xC78C},{0x83CE, 0xC78D},{0x83CF, 0xBACA},{0x83D0, 0xC78E},{0x83D1, 0xC78F},{0x83D2, 0xC790},{0x83D3, 0xC791},{0x83D4, 0xDDCA}, - {0x83D5, 0xC792},{0x83D6, 0xDDC5},{0x83D7, 0xC793},{0x83D8, 0xDDBF},{0x83D9, 0xC794},{0x83DA, 0xC795},{0x83DB, 0xC796},{0x83DC, 0xB2CB}, - {0x83DD, 0xDDC3},{0x83DE, 0xC797},{0x83DF, 0xDDCB},{0x83E0, 0xB2A4},{0x83E1, 0xDDD5},{0x83E2, 0xC798},{0x83E3, 0xC799},{0x83E4, 0xC79A}, - {0x83E5, 0xDDBE},{0x83E6, 0xC79B},{0x83E7, 0xC79C},{0x83E8, 0xC79D},{0x83E9, 0xC6D0},{0x83EA, 0xDDD0},{0x83EB, 0xC79E},{0x83EC, 0xC79F}, - {0x83ED, 0xC7A0},{0x83EE, 0xC840},{0x83EF, 0xC841},{0x83F0, 0xDDD4},{0x83F1, 0xC1E2},{0x83F2, 0xB7C6},{0x83F3, 0xC842},{0x83F4, 0xC843}, - {0x83F5, 0xC844},{0x83F6, 0xC845},{0x83F7, 0xC846},{0x83F8, 0xDDCE},{0x83F9, 0xDDCF},{0x83FA, 0xC847},{0x83FB, 0xC848},{0x83FC, 0xC849}, - {0x83FD, 0xDDC4},{0x83FE, 0xC84A},{0x83FF, 0xC84B},{0x8400, 0xC84C},{0x8401, 0xDDBD},{0x8402, 0xC84D},{0x8403, 0xDDCD},{0x8404, 0xCCD1}, - {0x8405, 0xC84E},{0x8406, 0xDDC9},{0x8407, 0xC84F},{0x8408, 0xC850},{0x8409, 0xC851},{0x840A, 0xC852},{0x840B, 0xDDC2},{0x840C, 0xC3C8}, - {0x840D, 0xC6BC},{0x840E, 0xCEAE},{0x840F, 0xDDCC},{0x8410, 0xC853},{0x8411, 0xDDC8},{0x8412, 0xC854},{0x8413, 0xC855},{0x8414, 0xC856}, - {0x8415, 0xC857},{0x8416, 0xC858},{0x8417, 0xC859},{0x8418, 0xDDC1},{0x8419, 0xC85A},{0x841A, 0xC85B},{0x841B, 0xC85C},{0x841C, 0xDDC6}, - {0x841D, 0xC2DC},{0x841E, 0xC85D},{0x841F, 0xC85E},{0x8420, 0xC85F},{0x8421, 0xC860},{0x8422, 0xC861},{0x8423, 0xC862},{0x8424, 0xD3A9}, - {0x8425, 0xD3AA},{0x8426, 0xDDD3},{0x8427, 0xCFF4},{0x8428, 0xC8F8},{0x8429, 0xC863},{0x842A, 0xC864},{0x842B, 0xC865},{0x842C, 0xC866}, - {0x842D, 0xC867},{0x842E, 0xC868},{0x842F, 0xC869},{0x8430, 0xC86A},{0x8431, 0xDDE6},{0x8432, 0xC86B},{0x8433, 0xC86C},{0x8434, 0xC86D}, - {0x8435, 0xC86E},{0x8436, 0xC86F},{0x8437, 0xC870},{0x8438, 0xDDC7},{0x8439, 0xC871},{0x843A, 0xC872},{0x843B, 0xC873},{0x843C, 0xDDE0}, - {0x843D, 0xC2E4},{0x843E, 0xC874},{0x843F, 0xC875},{0x8440, 0xC876},{0x8441, 0xC877},{0x8442, 0xC878},{0x8443, 0xC879},{0x8444, 0xC87A}, - {0x8445, 0xC87B},{0x8446, 0xDDE1},{0x8447, 0xC87C},{0x8448, 0xC87D},{0x8449, 0xC87E},{0x844A, 0xC880},{0x844B, 0xC881},{0x844C, 0xC882}, - {0x844D, 0xC883},{0x844E, 0xC884},{0x844F, 0xC885},{0x8450, 0xC886},{0x8451, 0xDDD7},{0x8452, 0xC887},{0x8453, 0xC888},{0x8454, 0xC889}, - {0x8455, 0xC88A},{0x8456, 0xC88B},{0x8457, 0xD6F8},{0x8458, 0xC88C},{0x8459, 0xDDD9},{0x845A, 0xDDD8},{0x845B, 0xB8F0},{0x845C, 0xDDD6}, - {0x845D, 0xC88D},{0x845E, 0xC88E},{0x845F, 0xC88F},{0x8460, 0xC890},{0x8461, 0xC6CF},{0x8462, 0xC891},{0x8463, 0xB6AD},{0x8464, 0xC892}, - {0x8465, 0xC893},{0x8466, 0xC894},{0x8467, 0xC895},{0x8468, 0xC896},{0x8469, 0xDDE2},{0x846A, 0xC897},{0x846B, 0xBAF9},{0x846C, 0xD4E1}, - {0x846D, 0xDDE7},{0x846E, 0xC898},{0x846F, 0xC899},{0x8470, 0xC89A},{0x8471, 0xB4D0},{0x8472, 0xC89B},{0x8473, 0xDDDA},{0x8474, 0xC89C}, - {0x8475, 0xBFFB},{0x8476, 0xDDE3},{0x8477, 0xC89D},{0x8478, 0xDDDF},{0x8479, 0xC89E},{0x847A, 0xDDDD},{0x847B, 0xC89F},{0x847C, 0xC8A0}, - {0x847D, 0xC940},{0x847E, 0xC941},{0x847F, 0xC942},{0x8480, 0xC943},{0x8481, 0xC944},{0x8482, 0xB5D9},{0x8483, 0xC945},{0x8484, 0xC946}, - {0x8485, 0xC947},{0x8486, 0xC948},{0x8487, 0xDDDB},{0x8488, 0xDDDC},{0x8489, 0xDDDE},{0x848A, 0xC949},{0x848B, 0xBDAF},{0x848C, 0xDDE4}, - {0x848D, 0xC94A},{0x848E, 0xDDE5},{0x848F, 0xC94B},{0x8490, 0xC94C},{0x8491, 0xC94D},{0x8492, 0xC94E},{0x8493, 0xC94F},{0x8494, 0xC950}, - {0x8495, 0xC951},{0x8496, 0xC952},{0x8497, 0xDDF5},{0x8498, 0xC953},{0x8499, 0xC3C9},{0x849A, 0xC954},{0x849B, 0xC955},{0x849C, 0xCBE2}, - {0x849D, 0xC956},{0x849E, 0xC957},{0x849F, 0xC958},{0x84A0, 0xC959},{0x84A1, 0xDDF2},{0x84A2, 0xC95A},{0x84A3, 0xC95B},{0x84A4, 0xC95C}, - {0x84A5, 0xC95D},{0x84A6, 0xC95E},{0x84A7, 0xC95F},{0x84A8, 0xC960},{0x84A9, 0xC961},{0x84AA, 0xC962},{0x84AB, 0xC963},{0x84AC, 0xC964}, - {0x84AD, 0xC965},{0x84AE, 0xC966},{0x84AF, 0xD8E1},{0x84B0, 0xC967},{0x84B1, 0xC968},{0x84B2, 0xC6D1},{0x84B3, 0xC969},{0x84B4, 0xDDF4}, - {0x84B5, 0xC96A},{0x84B6, 0xC96B},{0x84B7, 0xC96C},{0x84B8, 0xD5F4},{0x84B9, 0xDDF3},{0x84BA, 0xDDF0},{0x84BB, 0xC96D},{0x84BC, 0xC96E}, - {0x84BD, 0xDDEC},{0x84BE, 0xC96F},{0x84BF, 0xDDEF},{0x84C0, 0xC970},{0x84C1, 0xDDE8},{0x84C2, 0xC971},{0x84C3, 0xC972},{0x84C4, 0xD0EE}, - {0x84C5, 0xC973},{0x84C6, 0xC974},{0x84C7, 0xC975},{0x84C8, 0xC976},{0x84C9, 0xC8D8},{0x84CA, 0xDDEE},{0x84CB, 0xC977},{0x84CC, 0xC978}, - {0x84CD, 0xDDE9},{0x84CE, 0xC979},{0x84CF, 0xC97A},{0x84D0, 0xDDEA},{0x84D1, 0xCBF2},{0x84D2, 0xC97B},{0x84D3, 0xDDED},{0x84D4, 0xC97C}, - {0x84D5, 0xC97D},{0x84D6, 0xB1CD},{0x84D7, 0xC97E},{0x84D8, 0xC980},{0x84D9, 0xC981},{0x84DA, 0xC982},{0x84DB, 0xC983},{0x84DC, 0xC984}, - {0x84DD, 0xC0B6},{0x84DE, 0xC985},{0x84DF, 0xBCBB},{0x84E0, 0xDDF1},{0x84E1, 0xC986},{0x84E2, 0xC987},{0x84E3, 0xDDF7},{0x84E4, 0xC988}, - {0x84E5, 0xDDF6},{0x84E6, 0xDDEB},{0x84E7, 0xC989},{0x84E8, 0xC98A},{0x84E9, 0xC98B},{0x84EA, 0xC98C},{0x84EB, 0xC98D},{0x84EC, 0xC5EE}, - {0x84ED, 0xC98E},{0x84EE, 0xC98F},{0x84EF, 0xC990},{0x84F0, 0xDDFB},{0x84F1, 0xC991},{0x84F2, 0xC992},{0x84F3, 0xC993},{0x84F4, 0xC994}, - {0x84F5, 0xC995},{0x84F6, 0xC996},{0x84F7, 0xC997},{0x84F8, 0xC998},{0x84F9, 0xC999},{0x84FA, 0xC99A},{0x84FB, 0xC99B},{0x84FC, 0xDEA4}, - {0x84FD, 0xC99C},{0x84FE, 0xC99D},{0x84FF, 0xDEA3},{0x8500, 0xC99E},{0x8501, 0xC99F},{0x8502, 0xC9A0},{0x8503, 0xCA40},{0x8504, 0xCA41}, - {0x8505, 0xCA42},{0x8506, 0xCA43},{0x8507, 0xCA44},{0x8508, 0xCA45},{0x8509, 0xCA46},{0x850A, 0xCA47},{0x850B, 0xCA48},{0x850C, 0xDDF8}, - {0x850D, 0xCA49},{0x850E, 0xCA4A},{0x850F, 0xCA4B},{0x8510, 0xCA4C},{0x8511, 0xC3EF},{0x8512, 0xCA4D},{0x8513, 0xC2FB},{0x8514, 0xCA4E}, - {0x8515, 0xCA4F},{0x8516, 0xCA50},{0x8517, 0xD5E1},{0x8518, 0xCA51},{0x8519, 0xCA52},{0x851A, 0xCEB5},{0x851B, 0xCA53},{0x851C, 0xCA54}, - {0x851D, 0xCA55},{0x851E, 0xCA56},{0x851F, 0xDDFD},{0x8520, 0xCA57},{0x8521, 0xB2CC},{0x8522, 0xCA58},{0x8523, 0xCA59},{0x8524, 0xCA5A}, - {0x8525, 0xCA5B},{0x8526, 0xCA5C},{0x8527, 0xCA5D},{0x8528, 0xCA5E},{0x8529, 0xCA5F},{0x852A, 0xCA60},{0x852B, 0xC4E8},{0x852C, 0xCADF}, - {0x852D, 0xCA61},{0x852E, 0xCA62},{0x852F, 0xCA63},{0x8530, 0xCA64},{0x8531, 0xCA65},{0x8532, 0xCA66},{0x8533, 0xCA67},{0x8534, 0xCA68}, - {0x8535, 0xCA69},{0x8536, 0xCA6A},{0x8537, 0xC7BE},{0x8538, 0xDDFA},{0x8539, 0xDDFC},{0x853A, 0xDDFE},{0x853B, 0xDEA2},{0x853C, 0xB0AA}, - {0x853D, 0xB1CE},{0x853E, 0xCA6B},{0x853F, 0xCA6C},{0x8540, 0xCA6D},{0x8541, 0xCA6E},{0x8542, 0xCA6F},{0x8543, 0xDEAC},{0x8544, 0xCA70}, - {0x8545, 0xCA71},{0x8546, 0xCA72},{0x8547, 0xCA73},{0x8548, 0xDEA6},{0x8549, 0xBDB6},{0x854A, 0xC8EF},{0x854B, 0xCA74},{0x854C, 0xCA75}, - {0x854D, 0xCA76},{0x854E, 0xCA77},{0x854F, 0xCA78},{0x8550, 0xCA79},{0x8551, 0xCA7A},{0x8552, 0xCA7B},{0x8553, 0xCA7C},{0x8554, 0xCA7D}, - {0x8555, 0xCA7E},{0x8556, 0xDEA1},{0x8557, 0xCA80},{0x8558, 0xCA81},{0x8559, 0xDEA5},{0x855A, 0xCA82},{0x855B, 0xCA83},{0x855C, 0xCA84}, - {0x855D, 0xCA85},{0x855E, 0xDEA9},{0x855F, 0xCA86},{0x8560, 0xCA87},{0x8561, 0xCA88},{0x8562, 0xCA89},{0x8563, 0xCA8A},{0x8564, 0xDEA8}, - {0x8565, 0xCA8B},{0x8566, 0xCA8C},{0x8567, 0xCA8D},{0x8568, 0xDEA7},{0x8569, 0xCA8E},{0x856A, 0xCA8F},{0x856B, 0xCA90},{0x856C, 0xCA91}, - {0x856D, 0xCA92},{0x856E, 0xCA93},{0x856F, 0xCA94},{0x8570, 0xCA95},{0x8571, 0xCA96},{0x8572, 0xDEAD},{0x8573, 0xCA97},{0x8574, 0xD4CC}, - {0x8575, 0xCA98},{0x8576, 0xCA99},{0x8577, 0xCA9A},{0x8578, 0xCA9B},{0x8579, 0xDEB3},{0x857A, 0xDEAA},{0x857B, 0xDEAE},{0x857C, 0xCA9C}, - {0x857D, 0xCA9D},{0x857E, 0xC0D9},{0x857F, 0xCA9E},{0x8580, 0xCA9F},{0x8581, 0xCAA0},{0x8582, 0xCB40},{0x8583, 0xCB41},{0x8584, 0xB1A1}, - {0x8585, 0xDEB6},{0x8586, 0xCB42},{0x8587, 0xDEB1},{0x8588, 0xCB43},{0x8589, 0xCB44},{0x858A, 0xCB45},{0x858B, 0xCB46},{0x858C, 0xCB47}, - {0x858D, 0xCB48},{0x858E, 0xCB49},{0x858F, 0xDEB2},{0x8590, 0xCB4A},{0x8591, 0xCB4B},{0x8592, 0xCB4C},{0x8593, 0xCB4D},{0x8594, 0xCB4E}, - {0x8595, 0xCB4F},{0x8596, 0xCB50},{0x8597, 0xCB51},{0x8598, 0xCB52},{0x8599, 0xCB53},{0x859A, 0xCB54},{0x859B, 0xD1A6},{0x859C, 0xDEB5}, - {0x859D, 0xCB55},{0x859E, 0xCB56},{0x859F, 0xCB57},{0x85A0, 0xCB58},{0x85A1, 0xCB59},{0x85A2, 0xCB5A},{0x85A3, 0xCB5B},{0x85A4, 0xDEAF}, - {0x85A5, 0xCB5C},{0x85A6, 0xCB5D},{0x85A7, 0xCB5E},{0x85A8, 0xDEB0},{0x85A9, 0xCB5F},{0x85AA, 0xD0BD},{0x85AB, 0xCB60},{0x85AC, 0xCB61}, - {0x85AD, 0xCB62},{0x85AE, 0xDEB4},{0x85AF, 0xCAED},{0x85B0, 0xDEB9},{0x85B1, 0xCB63},{0x85B2, 0xCB64},{0x85B3, 0xCB65},{0x85B4, 0xCB66}, - {0x85B5, 0xCB67},{0x85B6, 0xCB68},{0x85B7, 0xDEB8},{0x85B8, 0xCB69},{0x85B9, 0xDEB7},{0x85BA, 0xCB6A},{0x85BB, 0xCB6B},{0x85BC, 0xCB6C}, - {0x85BD, 0xCB6D},{0x85BE, 0xCB6E},{0x85BF, 0xCB6F},{0x85C0, 0xCB70},{0x85C1, 0xDEBB},{0x85C2, 0xCB71},{0x85C3, 0xCB72},{0x85C4, 0xCB73}, - {0x85C5, 0xCB74},{0x85C6, 0xCB75},{0x85C7, 0xCB76},{0x85C8, 0xCB77},{0x85C9, 0xBDE5},{0x85CA, 0xCB78},{0x85CB, 0xCB79},{0x85CC, 0xCB7A}, - {0x85CD, 0xCB7B},{0x85CE, 0xCB7C},{0x85CF, 0xB2D8},{0x85D0, 0xC3EA},{0x85D1, 0xCB7D},{0x85D2, 0xCB7E},{0x85D3, 0xDEBA},{0x85D4, 0xCB80}, - {0x85D5, 0xC5BA},{0x85D6, 0xCB81},{0x85D7, 0xCB82},{0x85D8, 0xCB83},{0x85D9, 0xCB84},{0x85DA, 0xCB85},{0x85DB, 0xCB86},{0x85DC, 0xDEBC}, - {0x85DD, 0xCB87},{0x85DE, 0xCB88},{0x85DF, 0xCB89},{0x85E0, 0xCB8A},{0x85E1, 0xCB8B},{0x85E2, 0xCB8C},{0x85E3, 0xCB8D},{0x85E4, 0xCCD9}, - {0x85E5, 0xCB8E},{0x85E6, 0xCB8F},{0x85E7, 0xCB90},{0x85E8, 0xCB91},{0x85E9, 0xB7AA},{0x85EA, 0xCB92},{0x85EB, 0xCB93},{0x85EC, 0xCB94}, - {0x85ED, 0xCB95},{0x85EE, 0xCB96},{0x85EF, 0xCB97},{0x85F0, 0xCB98},{0x85F1, 0xCB99},{0x85F2, 0xCB9A},{0x85F3, 0xCB9B},{0x85F4, 0xCB9C}, - {0x85F5, 0xCB9D},{0x85F6, 0xCB9E},{0x85F7, 0xCB9F},{0x85F8, 0xCBA0},{0x85F9, 0xCC40},{0x85FA, 0xCC41},{0x85FB, 0xD4E5},{0x85FC, 0xCC42}, - {0x85FD, 0xCC43},{0x85FE, 0xCC44},{0x85FF, 0xDEBD},{0x8600, 0xCC45},{0x8601, 0xCC46},{0x8602, 0xCC47},{0x8603, 0xCC48},{0x8604, 0xCC49}, - {0x8605, 0xDEBF},{0x8606, 0xCC4A},{0x8607, 0xCC4B},{0x8608, 0xCC4C},{0x8609, 0xCC4D},{0x860A, 0xCC4E},{0x860B, 0xCC4F},{0x860C, 0xCC50}, - {0x860D, 0xCC51},{0x860E, 0xCC52},{0x860F, 0xCC53},{0x8610, 0xCC54},{0x8611, 0xC4A2},{0x8612, 0xCC55},{0x8613, 0xCC56},{0x8614, 0xCC57}, - {0x8615, 0xCC58},{0x8616, 0xDEC1},{0x8617, 0xCC59},{0x8618, 0xCC5A},{0x8619, 0xCC5B},{0x861A, 0xCC5C},{0x861B, 0xCC5D},{0x861C, 0xCC5E}, - {0x861D, 0xCC5F},{0x861E, 0xCC60},{0x861F, 0xCC61},{0x8620, 0xCC62},{0x8621, 0xCC63},{0x8622, 0xCC64},{0x8623, 0xCC65},{0x8624, 0xCC66}, - {0x8625, 0xCC67},{0x8626, 0xCC68},{0x8627, 0xDEBE},{0x8628, 0xCC69},{0x8629, 0xDEC0},{0x862A, 0xCC6A},{0x862B, 0xCC6B},{0x862C, 0xCC6C}, - {0x862D, 0xCC6D},{0x862E, 0xCC6E},{0x862F, 0xCC6F},{0x8630, 0xCC70},{0x8631, 0xCC71},{0x8632, 0xCC72},{0x8633, 0xCC73},{0x8634, 0xCC74}, - {0x8635, 0xCC75},{0x8636, 0xCC76},{0x8637, 0xCC77},{0x8638, 0xD5BA},{0x8639, 0xCC78},{0x863A, 0xCC79},{0x863B, 0xCC7A},{0x863C, 0xDEC2}, - {0x863D, 0xCC7B},{0x863E, 0xCC7C},{0x863F, 0xCC7D},{0x8640, 0xCC7E},{0x8641, 0xCC80},{0x8642, 0xCC81},{0x8643, 0xCC82},{0x8644, 0xCC83}, - {0x8645, 0xCC84},{0x8646, 0xCC85},{0x8647, 0xCC86},{0x8648, 0xCC87},{0x8649, 0xCC88},{0x864A, 0xCC89},{0x864B, 0xCC8A},{0x864C, 0xCC8B}, - {0x864D, 0xF2AE},{0x864E, 0xBBA2},{0x864F, 0xC2B2},{0x8650, 0xC5B0},{0x8651, 0xC2C7},{0x8652, 0xCC8C},{0x8653, 0xCC8D},{0x8654, 0xF2AF}, - {0x8655, 0xCC8E},{0x8656, 0xCC8F},{0x8657, 0xCC90},{0x8658, 0xCC91},{0x8659, 0xCC92},{0x865A, 0xD0E9},{0x865B, 0xCC93},{0x865C, 0xCC94}, - {0x865D, 0xCC95},{0x865E, 0xD3DD},{0x865F, 0xCC96},{0x8660, 0xCC97},{0x8661, 0xCC98},{0x8662, 0xEBBD},{0x8663, 0xCC99},{0x8664, 0xCC9A}, - {0x8665, 0xCC9B},{0x8666, 0xCC9C},{0x8667, 0xCC9D},{0x8668, 0xCC9E},{0x8669, 0xCC9F},{0x866A, 0xCCA0},{0x866B, 0xB3E6},{0x866C, 0xF2B0}, - {0x866D, 0xCD40},{0x866E, 0xF2B1},{0x866F, 0xCD41},{0x8670, 0xCD42},{0x8671, 0xCAAD},{0x8672, 0xCD43},{0x8673, 0xCD44},{0x8674, 0xCD45}, - {0x8675, 0xCD46},{0x8676, 0xCD47},{0x8677, 0xCD48},{0x8678, 0xCD49},{0x8679, 0xBAE7},{0x867A, 0xF2B3},{0x867B, 0xF2B5},{0x867C, 0xF2B4}, - {0x867D, 0xCBE4},{0x867E, 0xCFBA},{0x867F, 0xF2B2},{0x8680, 0xCAB4},{0x8681, 0xD2CF},{0x8682, 0xC2EC},{0x8683, 0xCD4A},{0x8684, 0xCD4B}, - {0x8685, 0xCD4C},{0x8686, 0xCD4D},{0x8687, 0xCD4E},{0x8688, 0xCD4F},{0x8689, 0xCD50},{0x868A, 0xCEC3},{0x868B, 0xF2B8},{0x868C, 0xB0F6}, - {0x868D, 0xF2B7},{0x868E, 0xCD51},{0x868F, 0xCD52},{0x8690, 0xCD53},{0x8691, 0xCD54},{0x8692, 0xCD55},{0x8693, 0xF2BE},{0x8694, 0xCD56}, - {0x8695, 0xB2CF},{0x8696, 0xCD57},{0x8697, 0xCD58},{0x8698, 0xCD59},{0x8699, 0xCD5A},{0x869A, 0xCD5B},{0x869B, 0xCD5C},{0x869C, 0xD1C1}, - {0x869D, 0xF2BA},{0x869E, 0xCD5D},{0x869F, 0xCD5E},{0x86A0, 0xCD5F},{0x86A1, 0xCD60},{0x86A2, 0xCD61},{0x86A3, 0xF2BC},{0x86A4, 0xD4E9}, - {0x86A5, 0xCD62},{0x86A6, 0xCD63},{0x86A7, 0xF2BB},{0x86A8, 0xF2B6},{0x86A9, 0xF2BF},{0x86AA, 0xF2BD},{0x86AB, 0xCD64},{0x86AC, 0xF2B9}, - {0x86AD, 0xCD65},{0x86AE, 0xCD66},{0x86AF, 0xF2C7},{0x86B0, 0xF2C4},{0x86B1, 0xF2C6},{0x86B2, 0xCD67},{0x86B3, 0xCD68},{0x86B4, 0xF2CA}, - {0x86B5, 0xF2C2},{0x86B6, 0xF2C0},{0x86B7, 0xCD69},{0x86B8, 0xCD6A},{0x86B9, 0xCD6B},{0x86BA, 0xF2C5},{0x86BB, 0xCD6C},{0x86BC, 0xCD6D}, - {0x86BD, 0xCD6E},{0x86BE, 0xCD6F},{0x86BF, 0xCD70},{0x86C0, 0xD6FB},{0x86C1, 0xCD71},{0x86C2, 0xCD72},{0x86C3, 0xCD73},{0x86C4, 0xF2C1}, - {0x86C5, 0xCD74},{0x86C6, 0xC7F9},{0x86C7, 0xC9DF},{0x86C8, 0xCD75},{0x86C9, 0xF2C8},{0x86CA, 0xB9C6},{0x86CB, 0xB5B0},{0x86CC, 0xCD76}, - {0x86CD, 0xCD77},{0x86CE, 0xF2C3},{0x86CF, 0xF2C9},{0x86D0, 0xF2D0},{0x86D1, 0xF2D6},{0x86D2, 0xCD78},{0x86D3, 0xCD79},{0x86D4, 0xBBD7}, - {0x86D5, 0xCD7A},{0x86D6, 0xCD7B},{0x86D7, 0xCD7C},{0x86D8, 0xF2D5},{0x86D9, 0xCDDC},{0x86DA, 0xCD7D},{0x86DB, 0xD6EB},{0x86DC, 0xCD7E}, - {0x86DD, 0xCD80},{0x86DE, 0xF2D2},{0x86DF, 0xF2D4},{0x86E0, 0xCD81},{0x86E1, 0xCD82},{0x86E2, 0xCD83},{0x86E3, 0xCD84},{0x86E4, 0xB8F2}, - {0x86E5, 0xCD85},{0x86E6, 0xCD86},{0x86E7, 0xCD87},{0x86E8, 0xCD88},{0x86E9, 0xF2CB},{0x86EA, 0xCD89},{0x86EB, 0xCD8A},{0x86EC, 0xCD8B}, - {0x86ED, 0xF2CE},{0x86EE, 0xC2F9},{0x86EF, 0xCD8C},{0x86F0, 0xD5DD},{0x86F1, 0xF2CC},{0x86F2, 0xF2CD},{0x86F3, 0xF2CF},{0x86F4, 0xF2D3}, - {0x86F5, 0xCD8D},{0x86F6, 0xCD8E},{0x86F7, 0xCD8F},{0x86F8, 0xF2D9},{0x86F9, 0xD3BC},{0x86FA, 0xCD90},{0x86FB, 0xCD91},{0x86FC, 0xCD92}, - {0x86FD, 0xCD93},{0x86FE, 0xB6EA},{0x86FF, 0xCD94},{0x8700, 0xCAF1},{0x8701, 0xCD95},{0x8702, 0xB7E4},{0x8703, 0xF2D7},{0x8704, 0xCD96}, - {0x8705, 0xCD97},{0x8706, 0xCD98},{0x8707, 0xF2D8},{0x8708, 0xF2DA},{0x8709, 0xF2DD},{0x870A, 0xF2DB},{0x870B, 0xCD99},{0x870C, 0xCD9A}, - {0x870D, 0xF2DC},{0x870E, 0xCD9B},{0x870F, 0xCD9C},{0x8710, 0xCD9D},{0x8711, 0xCD9E},{0x8712, 0xD1D1},{0x8713, 0xF2D1},{0x8714, 0xCD9F}, - {0x8715, 0xCDC9},{0x8716, 0xCDA0},{0x8717, 0xCECF},{0x8718, 0xD6A9},{0x8719, 0xCE40},{0x871A, 0xF2E3},{0x871B, 0xCE41},{0x871C, 0xC3DB}, - {0x871D, 0xCE42},{0x871E, 0xF2E0},{0x871F, 0xCE43},{0x8720, 0xCE44},{0x8721, 0xC0AF},{0x8722, 0xF2EC},{0x8723, 0xF2DE},{0x8724, 0xCE45}, - {0x8725, 0xF2E1},{0x8726, 0xCE46},{0x8727, 0xCE47},{0x8728, 0xCE48},{0x8729, 0xF2E8},{0x872A, 0xCE49},{0x872B, 0xCE4A},{0x872C, 0xCE4B}, - {0x872D, 0xCE4C},{0x872E, 0xF2E2},{0x872F, 0xCE4D},{0x8730, 0xCE4E},{0x8731, 0xF2E7},{0x8732, 0xCE4F},{0x8733, 0xCE50},{0x8734, 0xF2E6}, - {0x8735, 0xCE51},{0x8736, 0xCE52},{0x8737, 0xF2E9},{0x8738, 0xCE53},{0x8739, 0xCE54},{0x873A, 0xCE55},{0x873B, 0xF2DF},{0x873C, 0xCE56}, - {0x873D, 0xCE57},{0x873E, 0xF2E4},{0x873F, 0xF2EA},{0x8740, 0xCE58},{0x8741, 0xCE59},{0x8742, 0xCE5A},{0x8743, 0xCE5B},{0x8744, 0xCE5C}, - {0x8745, 0xCE5D},{0x8746, 0xCE5E},{0x8747, 0xD3AC},{0x8748, 0xF2E5},{0x8749, 0xB2F5},{0x874A, 0xCE5F},{0x874B, 0xCE60},{0x874C, 0xF2F2}, - {0x874D, 0xCE61},{0x874E, 0xD0AB},{0x874F, 0xCE62},{0x8750, 0xCE63},{0x8751, 0xCE64},{0x8752, 0xCE65},{0x8753, 0xF2F5},{0x8754, 0xCE66}, - {0x8755, 0xCE67},{0x8756, 0xCE68},{0x8757, 0xBBC8},{0x8758, 0xCE69},{0x8759, 0xF2F9},{0x875A, 0xCE6A},{0x875B, 0xCE6B},{0x875C, 0xCE6C}, - {0x875D, 0xCE6D},{0x875E, 0xCE6E},{0x875F, 0xCE6F},{0x8760, 0xF2F0},{0x8761, 0xCE70},{0x8762, 0xCE71},{0x8763, 0xF2F6},{0x8764, 0xF2F8}, - {0x8765, 0xF2FA},{0x8766, 0xCE72},{0x8767, 0xCE73},{0x8768, 0xCE74},{0x8769, 0xCE75},{0x876A, 0xCE76},{0x876B, 0xCE77},{0x876C, 0xCE78}, - {0x876D, 0xCE79},{0x876E, 0xF2F3},{0x876F, 0xCE7A},{0x8770, 0xF2F1},{0x8771, 0xCE7B},{0x8772, 0xCE7C},{0x8773, 0xCE7D},{0x8774, 0xBAFB}, - {0x8775, 0xCE7E},{0x8776, 0xB5FB},{0x8777, 0xCE80},{0x8778, 0xCE81},{0x8779, 0xCE82},{0x877A, 0xCE83},{0x877B, 0xF2EF},{0x877C, 0xF2F7}, - {0x877D, 0xF2ED},{0x877E, 0xF2EE},{0x877F, 0xCE84},{0x8780, 0xCE85},{0x8781, 0xCE86},{0x8782, 0xF2EB},{0x8783, 0xF3A6},{0x8784, 0xCE87}, - {0x8785, 0xF3A3},{0x8786, 0xCE88},{0x8787, 0xCE89},{0x8788, 0xF3A2},{0x8789, 0xCE8A},{0x878A, 0xCE8B},{0x878B, 0xF2F4},{0x878C, 0xCE8C}, - {0x878D, 0xC8DA},{0x878E, 0xCE8D},{0x878F, 0xCE8E},{0x8790, 0xCE8F},{0x8791, 0xCE90},{0x8792, 0xCE91},{0x8793, 0xF2FB},{0x8794, 0xCE92}, - {0x8795, 0xCE93},{0x8796, 0xCE94},{0x8797, 0xF3A5},{0x8798, 0xCE95},{0x8799, 0xCE96},{0x879A, 0xCE97},{0x879B, 0xCE98},{0x879C, 0xCE99}, - {0x879D, 0xCE9A},{0x879E, 0xCE9B},{0x879F, 0xC3F8},{0x87A0, 0xCE9C},{0x87A1, 0xCE9D},{0x87A2, 0xCE9E},{0x87A3, 0xCE9F},{0x87A4, 0xCEA0}, - {0x87A5, 0xCF40},{0x87A6, 0xCF41},{0x87A7, 0xCF42},{0x87A8, 0xF2FD},{0x87A9, 0xCF43},{0x87AA, 0xCF44},{0x87AB, 0xF3A7},{0x87AC, 0xF3A9}, - {0x87AD, 0xF3A4},{0x87AE, 0xCF45},{0x87AF, 0xF2FC},{0x87B0, 0xCF46},{0x87B1, 0xCF47},{0x87B2, 0xCF48},{0x87B3, 0xF3AB},{0x87B4, 0xCF49}, - {0x87B5, 0xF3AA},{0x87B6, 0xCF4A},{0x87B7, 0xCF4B},{0x87B8, 0xCF4C},{0x87B9, 0xCF4D},{0x87BA, 0xC2DD},{0x87BB, 0xCF4E},{0x87BC, 0xCF4F}, - {0x87BD, 0xF3AE},{0x87BE, 0xCF50},{0x87BF, 0xCF51},{0x87C0, 0xF3B0},{0x87C1, 0xCF52},{0x87C2, 0xCF53},{0x87C3, 0xCF54},{0x87C4, 0xCF55}, - {0x87C5, 0xCF56},{0x87C6, 0xF3A1},{0x87C7, 0xCF57},{0x87C8, 0xCF58},{0x87C9, 0xCF59},{0x87CA, 0xF3B1},{0x87CB, 0xF3AC},{0x87CC, 0xCF5A}, - {0x87CD, 0xCF5B},{0x87CE, 0xCF5C},{0x87CF, 0xCF5D},{0x87D0, 0xCF5E},{0x87D1, 0xF3AF},{0x87D2, 0xF2FE},{0x87D3, 0xF3AD},{0x87D4, 0xCF5F}, - {0x87D5, 0xCF60},{0x87D6, 0xCF61},{0x87D7, 0xCF62},{0x87D8, 0xCF63},{0x87D9, 0xCF64},{0x87DA, 0xCF65},{0x87DB, 0xF3B2},{0x87DC, 0xCF66}, - {0x87DD, 0xCF67},{0x87DE, 0xCF68},{0x87DF, 0xCF69},{0x87E0, 0xF3B4},{0x87E1, 0xCF6A},{0x87E2, 0xCF6B},{0x87E3, 0xCF6C},{0x87E4, 0xCF6D}, - {0x87E5, 0xF3A8},{0x87E6, 0xCF6E},{0x87E7, 0xCF6F},{0x87E8, 0xCF70},{0x87E9, 0xCF71},{0x87EA, 0xF3B3},{0x87EB, 0xCF72},{0x87EC, 0xCF73}, - {0x87ED, 0xCF74},{0x87EE, 0xF3B5},{0x87EF, 0xCF75},{0x87F0, 0xCF76},{0x87F1, 0xCF77},{0x87F2, 0xCF78},{0x87F3, 0xCF79},{0x87F4, 0xCF7A}, - {0x87F5, 0xCF7B},{0x87F6, 0xCF7C},{0x87F7, 0xCF7D},{0x87F8, 0xCF7E},{0x87F9, 0xD0B7},{0x87FA, 0xCF80},{0x87FB, 0xCF81},{0x87FC, 0xCF82}, - {0x87FD, 0xCF83},{0x87FE, 0xF3B8},{0x87FF, 0xCF84},{0x8800, 0xCF85},{0x8801, 0xCF86},{0x8802, 0xCF87},{0x8803, 0xD9F9},{0x8804, 0xCF88}, - {0x8805, 0xCF89},{0x8806, 0xCF8A},{0x8807, 0xCF8B},{0x8808, 0xCF8C},{0x8809, 0xCF8D},{0x880A, 0xF3B9},{0x880B, 0xCF8E},{0x880C, 0xCF8F}, - {0x880D, 0xCF90},{0x880E, 0xCF91},{0x880F, 0xCF92},{0x8810, 0xCF93},{0x8811, 0xCF94},{0x8812, 0xCF95},{0x8813, 0xF3B7},{0x8814, 0xCF96}, - {0x8815, 0xC8E4},{0x8816, 0xF3B6},{0x8817, 0xCF97},{0x8818, 0xCF98},{0x8819, 0xCF99},{0x881A, 0xCF9A},{0x881B, 0xF3BA},{0x881C, 0xCF9B}, - {0x881D, 0xCF9C},{0x881E, 0xCF9D},{0x881F, 0xCF9E},{0x8820, 0xCF9F},{0x8821, 0xF3BB},{0x8822, 0xB4C0},{0x8823, 0xCFA0},{0x8824, 0xD040}, - {0x8825, 0xD041},{0x8826, 0xD042},{0x8827, 0xD043},{0x8828, 0xD044},{0x8829, 0xD045},{0x882A, 0xD046},{0x882B, 0xD047},{0x882C, 0xD048}, - {0x882D, 0xD049},{0x882E, 0xD04A},{0x882F, 0xD04B},{0x8830, 0xD04C},{0x8831, 0xD04D},{0x8832, 0xEEC3},{0x8833, 0xD04E},{0x8834, 0xD04F}, - {0x8835, 0xD050},{0x8836, 0xD051},{0x8837, 0xD052},{0x8838, 0xD053},{0x8839, 0xF3BC},{0x883A, 0xD054},{0x883B, 0xD055},{0x883C, 0xF3BD}, - {0x883D, 0xD056},{0x883E, 0xD057},{0x883F, 0xD058},{0x8840, 0xD1AA},{0x8841, 0xD059},{0x8842, 0xD05A},{0x8843, 0xD05B},{0x8844, 0xF4AC}, - {0x8845, 0xD0C6},{0x8846, 0xD05C},{0x8847, 0xD05D},{0x8848, 0xD05E},{0x8849, 0xD05F},{0x884A, 0xD060},{0x884B, 0xD061},{0x884C, 0xD0D0}, - {0x884D, 0xD1DC},{0x884E, 0xD062},{0x884F, 0xD063},{0x8850, 0xD064},{0x8851, 0xD065},{0x8852, 0xD066},{0x8853, 0xD067},{0x8854, 0xCFCE}, - {0x8855, 0xD068},{0x8856, 0xD069},{0x8857, 0xBDD6},{0x8858, 0xD06A},{0x8859, 0xD1C3},{0x885A, 0xD06B},{0x885B, 0xD06C},{0x885C, 0xD06D}, - {0x885D, 0xD06E},{0x885E, 0xD06F},{0x885F, 0xD070},{0x8860, 0xD071},{0x8861, 0xBAE2},{0x8862, 0xE1E9},{0x8863, 0xD2C2},{0x8864, 0xF1C2}, - {0x8865, 0xB2B9},{0x8866, 0xD072},{0x8867, 0xD073},{0x8868, 0xB1ED},{0x8869, 0xF1C3},{0x886A, 0xD074},{0x886B, 0xC9C0},{0x886C, 0xB3C4}, - {0x886D, 0xD075},{0x886E, 0xD9F2},{0x886F, 0xD076},{0x8870, 0xCBA5},{0x8871, 0xD077},{0x8872, 0xF1C4},{0x8873, 0xD078},{0x8874, 0xD079}, - {0x8875, 0xD07A},{0x8876, 0xD07B},{0x8877, 0xD6D4},{0x8878, 0xD07C},{0x8879, 0xD07D},{0x887A, 0xD07E},{0x887B, 0xD080},{0x887C, 0xD081}, - {0x887D, 0xF1C5},{0x887E, 0xF4C0},{0x887F, 0xF1C6},{0x8880, 0xD082},{0x8881, 0xD4AC},{0x8882, 0xF1C7},{0x8883, 0xD083},{0x8884, 0xB0C0}, - {0x8885, 0xF4C1},{0x8886, 0xD084},{0x8887, 0xD085},{0x8888, 0xF4C2},{0x8889, 0xD086},{0x888A, 0xD087},{0x888B, 0xB4FC},{0x888C, 0xD088}, - {0x888D, 0xC5DB},{0x888E, 0xD089},{0x888F, 0xD08A},{0x8890, 0xD08B},{0x8891, 0xD08C},{0x8892, 0xCCBB},{0x8893, 0xD08D},{0x8894, 0xD08E}, - {0x8895, 0xD08F},{0x8896, 0xD0E4},{0x8897, 0xD090},{0x8898, 0xD091},{0x8899, 0xD092},{0x889A, 0xD093},{0x889B, 0xD094},{0x889C, 0xCDE0}, - {0x889D, 0xD095},{0x889E, 0xD096},{0x889F, 0xD097},{0x88A0, 0xD098},{0x88A1, 0xD099},{0x88A2, 0xF1C8},{0x88A3, 0xD09A},{0x88A4, 0xD9F3}, - {0x88A5, 0xD09B},{0x88A6, 0xD09C},{0x88A7, 0xD09D},{0x88A8, 0xD09E},{0x88A9, 0xD09F},{0x88AA, 0xD0A0},{0x88AB, 0xB1BB},{0x88AC, 0xD140}, - {0x88AD, 0xCFAE},{0x88AE, 0xD141},{0x88AF, 0xD142},{0x88B0, 0xD143},{0x88B1, 0xB8A4},{0x88B2, 0xD144},{0x88B3, 0xD145},{0x88B4, 0xD146}, - {0x88B5, 0xD147},{0x88B6, 0xD148},{0x88B7, 0xF1CA},{0x88B8, 0xD149},{0x88B9, 0xD14A},{0x88BA, 0xD14B},{0x88BB, 0xD14C},{0x88BC, 0xF1CB}, - {0x88BD, 0xD14D},{0x88BE, 0xD14E},{0x88BF, 0xD14F},{0x88C0, 0xD150},{0x88C1, 0xB2C3},{0x88C2, 0xC1D1},{0x88C3, 0xD151},{0x88C4, 0xD152}, - {0x88C5, 0xD7B0},{0x88C6, 0xF1C9},{0x88C7, 0xD153},{0x88C8, 0xD154},{0x88C9, 0xF1CC},{0x88CA, 0xD155},{0x88CB, 0xD156},{0x88CC, 0xD157}, - {0x88CD, 0xD158},{0x88CE, 0xF1CE},{0x88CF, 0xD159},{0x88D0, 0xD15A},{0x88D1, 0xD15B},{0x88D2, 0xD9F6},{0x88D3, 0xD15C},{0x88D4, 0xD2E1}, - {0x88D5, 0xD4A3},{0x88D6, 0xD15D},{0x88D7, 0xD15E},{0x88D8, 0xF4C3},{0x88D9, 0xC8B9},{0x88DA, 0xD15F},{0x88DB, 0xD160},{0x88DC, 0xD161}, - {0x88DD, 0xD162},{0x88DE, 0xD163},{0x88DF, 0xF4C4},{0x88E0, 0xD164},{0x88E1, 0xD165},{0x88E2, 0xF1CD},{0x88E3, 0xF1CF},{0x88E4, 0xBFE3}, - {0x88E5, 0xF1D0},{0x88E6, 0xD166},{0x88E7, 0xD167},{0x88E8, 0xF1D4},{0x88E9, 0xD168},{0x88EA, 0xD169},{0x88EB, 0xD16A},{0x88EC, 0xD16B}, - {0x88ED, 0xD16C},{0x88EE, 0xD16D},{0x88EF, 0xD16E},{0x88F0, 0xF1D6},{0x88F1, 0xF1D1},{0x88F2, 0xD16F},{0x88F3, 0xC9D1},{0x88F4, 0xC5E1}, - {0x88F5, 0xD170},{0x88F6, 0xD171},{0x88F7, 0xD172},{0x88F8, 0xC2E3},{0x88F9, 0xB9FC},{0x88FA, 0xD173},{0x88FB, 0xD174},{0x88FC, 0xF1D3}, - {0x88FD, 0xD175},{0x88FE, 0xF1D5},{0x88FF, 0xD176},{0x8900, 0xD177},{0x8901, 0xD178},{0x8902, 0xB9D3},{0x8903, 0xD179},{0x8904, 0xD17A}, - {0x8905, 0xD17B},{0x8906, 0xD17C},{0x8907, 0xD17D},{0x8908, 0xD17E},{0x8909, 0xD180},{0x890A, 0xF1DB},{0x890B, 0xD181},{0x890C, 0xD182}, - {0x890D, 0xD183},{0x890E, 0xD184},{0x890F, 0xD185},{0x8910, 0xBAD6},{0x8911, 0xD186},{0x8912, 0xB0FD},{0x8913, 0xF1D9},{0x8914, 0xD187}, - {0x8915, 0xD188},{0x8916, 0xD189},{0x8917, 0xD18A},{0x8918, 0xD18B},{0x8919, 0xF1D8},{0x891A, 0xF1D2},{0x891B, 0xF1DA},{0x891C, 0xD18C}, - {0x891D, 0xD18D},{0x891E, 0xD18E},{0x891F, 0xD18F},{0x8920, 0xD190},{0x8921, 0xF1D7},{0x8922, 0xD191},{0x8923, 0xD192},{0x8924, 0xD193}, - {0x8925, 0xC8EC},{0x8926, 0xD194},{0x8927, 0xD195},{0x8928, 0xD196},{0x8929, 0xD197},{0x892A, 0xCDCA},{0x892B, 0xF1DD},{0x892C, 0xD198}, - {0x892D, 0xD199},{0x892E, 0xD19A},{0x892F, 0xD19B},{0x8930, 0xE5BD},{0x8931, 0xD19C},{0x8932, 0xD19D},{0x8933, 0xD19E},{0x8934, 0xF1DC}, - {0x8935, 0xD19F},{0x8936, 0xF1DE},{0x8937, 0xD1A0},{0x8938, 0xD240},{0x8939, 0xD241},{0x893A, 0xD242},{0x893B, 0xD243},{0x893C, 0xD244}, - {0x893D, 0xD245},{0x893E, 0xD246},{0x893F, 0xD247},{0x8940, 0xD248},{0x8941, 0xF1DF},{0x8942, 0xD249},{0x8943, 0xD24A},{0x8944, 0xCFE5}, - {0x8945, 0xD24B},{0x8946, 0xD24C},{0x8947, 0xD24D},{0x8948, 0xD24E},{0x8949, 0xD24F},{0x894A, 0xD250},{0x894B, 0xD251},{0x894C, 0xD252}, - {0x894D, 0xD253},{0x894E, 0xD254},{0x894F, 0xD255},{0x8950, 0xD256},{0x8951, 0xD257},{0x8952, 0xD258},{0x8953, 0xD259},{0x8954, 0xD25A}, - {0x8955, 0xD25B},{0x8956, 0xD25C},{0x8957, 0xD25D},{0x8958, 0xD25E},{0x8959, 0xD25F},{0x895A, 0xD260},{0x895B, 0xD261},{0x895C, 0xD262}, - {0x895D, 0xD263},{0x895E, 0xF4C5},{0x895F, 0xBDF3},{0x8960, 0xD264},{0x8961, 0xD265},{0x8962, 0xD266},{0x8963, 0xD267},{0x8964, 0xD268}, - {0x8965, 0xD269},{0x8966, 0xF1E0},{0x8967, 0xD26A},{0x8968, 0xD26B},{0x8969, 0xD26C},{0x896A, 0xD26D},{0x896B, 0xD26E},{0x896C, 0xD26F}, - {0x896D, 0xD270},{0x896E, 0xD271},{0x896F, 0xD272},{0x8970, 0xD273},{0x8971, 0xD274},{0x8972, 0xD275},{0x8973, 0xD276},{0x8974, 0xD277}, - {0x8975, 0xD278},{0x8976, 0xD279},{0x8977, 0xD27A},{0x8978, 0xD27B},{0x8979, 0xD27C},{0x897A, 0xD27D},{0x897B, 0xF1E1},{0x897C, 0xD27E}, - {0x897D, 0xD280},{0x897E, 0xD281},{0x897F, 0xCEF7},{0x8980, 0xD282},{0x8981, 0xD2AA},{0x8982, 0xD283},{0x8983, 0xF1FB},{0x8984, 0xD284}, - {0x8985, 0xD285},{0x8986, 0xB8B2},{0x8987, 0xD286},{0x8988, 0xD287},{0x8989, 0xD288},{0x898A, 0xD289},{0x898B, 0xD28A},{0x898C, 0xD28B}, - {0x898D, 0xD28C},{0x898E, 0xD28D},{0x898F, 0xD28E},{0x8990, 0xD28F},{0x8991, 0xD290},{0x8992, 0xD291},{0x8993, 0xD292},{0x8994, 0xD293}, - {0x8995, 0xD294},{0x8996, 0xD295},{0x8997, 0xD296},{0x8998, 0xD297},{0x8999, 0xD298},{0x899A, 0xD299},{0x899B, 0xD29A},{0x899C, 0xD29B}, - {0x899D, 0xD29C},{0x899E, 0xD29D},{0x899F, 0xD29E},{0x89A0, 0xD29F},{0x89A1, 0xD2A0},{0x89A2, 0xD340},{0x89A3, 0xD341},{0x89A4, 0xD342}, - {0x89A5, 0xD343},{0x89A6, 0xD344},{0x89A7, 0xD345},{0x89A8, 0xD346},{0x89A9, 0xD347},{0x89AA, 0xD348},{0x89AB, 0xD349},{0x89AC, 0xD34A}, - {0x89AD, 0xD34B},{0x89AE, 0xD34C},{0x89AF, 0xD34D},{0x89B0, 0xD34E},{0x89B1, 0xD34F},{0x89B2, 0xD350},{0x89B3, 0xD351},{0x89B4, 0xD352}, - {0x89B5, 0xD353},{0x89B6, 0xD354},{0x89B7, 0xD355},{0x89B8, 0xD356},{0x89B9, 0xD357},{0x89BA, 0xD358},{0x89BB, 0xD359},{0x89BC, 0xD35A}, - {0x89BD, 0xD35B},{0x89BE, 0xD35C},{0x89BF, 0xD35D},{0x89C0, 0xD35E},{0x89C1, 0xBCFB},{0x89C2, 0xB9DB},{0x89C3, 0xD35F},{0x89C4, 0xB9E6}, - {0x89C5, 0xC3D9},{0x89C6, 0xCAD3},{0x89C7, 0xEAE8},{0x89C8, 0xC0C0},{0x89C9, 0xBEF5},{0x89CA, 0xEAE9},{0x89CB, 0xEAEA},{0x89CC, 0xEAEB}, - {0x89CD, 0xD360},{0x89CE, 0xEAEC},{0x89CF, 0xEAED},{0x89D0, 0xEAEE},{0x89D1, 0xEAEF},{0x89D2, 0xBDC7},{0x89D3, 0xD361},{0x89D4, 0xD362}, - {0x89D5, 0xD363},{0x89D6, 0xF5FB},{0x89D7, 0xD364},{0x89D8, 0xD365},{0x89D9, 0xD366},{0x89DA, 0xF5FD},{0x89DB, 0xD367},{0x89DC, 0xF5FE}, - {0x89DD, 0xD368},{0x89DE, 0xF5FC},{0x89DF, 0xD369},{0x89E0, 0xD36A},{0x89E1, 0xD36B},{0x89E2, 0xD36C},{0x89E3, 0xBDE2},{0x89E4, 0xD36D}, - {0x89E5, 0xF6A1},{0x89E6, 0xB4A5},{0x89E7, 0xD36E},{0x89E8, 0xD36F},{0x89E9, 0xD370},{0x89EA, 0xD371},{0x89EB, 0xF6A2},{0x89EC, 0xD372}, - {0x89ED, 0xD373},{0x89EE, 0xD374},{0x89EF, 0xF6A3},{0x89F0, 0xD375},{0x89F1, 0xD376},{0x89F2, 0xD377},{0x89F3, 0xECB2},{0x89F4, 0xD378}, - {0x89F5, 0xD379},{0x89F6, 0xD37A},{0x89F7, 0xD37B},{0x89F8, 0xD37C},{0x89F9, 0xD37D},{0x89FA, 0xD37E},{0x89FB, 0xD380},{0x89FC, 0xD381}, - {0x89FD, 0xD382},{0x89FE, 0xD383},{0x89FF, 0xD384},{0x8A00, 0xD1D4},{0x8A01, 0xD385},{0x8A02, 0xD386},{0x8A03, 0xD387},{0x8A04, 0xD388}, - {0x8A05, 0xD389},{0x8A06, 0xD38A},{0x8A07, 0xD9EA},{0x8A08, 0xD38B},{0x8A09, 0xD38C},{0x8A0A, 0xD38D},{0x8A0B, 0xD38E},{0x8A0C, 0xD38F}, - {0x8A0D, 0xD390},{0x8A0E, 0xD391},{0x8A0F, 0xD392},{0x8A10, 0xD393},{0x8A11, 0xD394},{0x8A12, 0xD395},{0x8A13, 0xD396},{0x8A14, 0xD397}, - {0x8A15, 0xD398},{0x8A16, 0xD399},{0x8A17, 0xD39A},{0x8A18, 0xD39B},{0x8A19, 0xD39C},{0x8A1A, 0xD39D},{0x8A1B, 0xD39E},{0x8A1C, 0xD39F}, - {0x8A1D, 0xD3A0},{0x8A1E, 0xD440},{0x8A1F, 0xD441},{0x8A20, 0xD442},{0x8A21, 0xD443},{0x8A22, 0xD444},{0x8A23, 0xD445},{0x8A24, 0xD446}, - {0x8A25, 0xD447},{0x8A26, 0xD448},{0x8A27, 0xD449},{0x8A28, 0xD44A},{0x8A29, 0xD44B},{0x8A2A, 0xD44C},{0x8A2B, 0xD44D},{0x8A2C, 0xD44E}, - {0x8A2D, 0xD44F},{0x8A2E, 0xD450},{0x8A2F, 0xD451},{0x8A30, 0xD452},{0x8A31, 0xD453},{0x8A32, 0xD454},{0x8A33, 0xD455},{0x8A34, 0xD456}, - {0x8A35, 0xD457},{0x8A36, 0xD458},{0x8A37, 0xD459},{0x8A38, 0xD45A},{0x8A39, 0xD45B},{0x8A3A, 0xD45C},{0x8A3B, 0xD45D},{0x8A3C, 0xD45E}, - {0x8A3D, 0xD45F},{0x8A3E, 0xF6A4},{0x8A3F, 0xD460},{0x8A40, 0xD461},{0x8A41, 0xD462},{0x8A42, 0xD463},{0x8A43, 0xD464},{0x8A44, 0xD465}, - {0x8A45, 0xD466},{0x8A46, 0xD467},{0x8A47, 0xD468},{0x8A48, 0xEEBA},{0x8A49, 0xD469},{0x8A4A, 0xD46A},{0x8A4B, 0xD46B},{0x8A4C, 0xD46C}, - {0x8A4D, 0xD46D},{0x8A4E, 0xD46E},{0x8A4F, 0xD46F},{0x8A50, 0xD470},{0x8A51, 0xD471},{0x8A52, 0xD472},{0x8A53, 0xD473},{0x8A54, 0xD474}, - {0x8A55, 0xD475},{0x8A56, 0xD476},{0x8A57, 0xD477},{0x8A58, 0xD478},{0x8A59, 0xD479},{0x8A5A, 0xD47A},{0x8A5B, 0xD47B},{0x8A5C, 0xD47C}, - {0x8A5D, 0xD47D},{0x8A5E, 0xD47E},{0x8A5F, 0xD480},{0x8A60, 0xD481},{0x8A61, 0xD482},{0x8A62, 0xD483},{0x8A63, 0xD484},{0x8A64, 0xD485}, - {0x8A65, 0xD486},{0x8A66, 0xD487},{0x8A67, 0xD488},{0x8A68, 0xD489},{0x8A69, 0xD48A},{0x8A6A, 0xD48B},{0x8A6B, 0xD48C},{0x8A6C, 0xD48D}, - {0x8A6D, 0xD48E},{0x8A6E, 0xD48F},{0x8A6F, 0xD490},{0x8A70, 0xD491},{0x8A71, 0xD492},{0x8A72, 0xD493},{0x8A73, 0xD494},{0x8A74, 0xD495}, - {0x8A75, 0xD496},{0x8A76, 0xD497},{0x8A77, 0xD498},{0x8A78, 0xD499},{0x8A79, 0xD5B2},{0x8A7A, 0xD49A},{0x8A7B, 0xD49B},{0x8A7C, 0xD49C}, - {0x8A7D, 0xD49D},{0x8A7E, 0xD49E},{0x8A7F, 0xD49F},{0x8A80, 0xD4A0},{0x8A81, 0xD540},{0x8A82, 0xD541},{0x8A83, 0xD542},{0x8A84, 0xD543}, - {0x8A85, 0xD544},{0x8A86, 0xD545},{0x8A87, 0xD546},{0x8A88, 0xD547},{0x8A89, 0xD3FE},{0x8A8A, 0xCCDC},{0x8A8B, 0xD548},{0x8A8C, 0xD549}, - {0x8A8D, 0xD54A},{0x8A8E, 0xD54B},{0x8A8F, 0xD54C},{0x8A90, 0xD54D},{0x8A91, 0xD54E},{0x8A92, 0xD54F},{0x8A93, 0xCAC4},{0x8A94, 0xD550}, - {0x8A95, 0xD551},{0x8A96, 0xD552},{0x8A97, 0xD553},{0x8A98, 0xD554},{0x8A99, 0xD555},{0x8A9A, 0xD556},{0x8A9B, 0xD557},{0x8A9C, 0xD558}, - {0x8A9D, 0xD559},{0x8A9E, 0xD55A},{0x8A9F, 0xD55B},{0x8AA0, 0xD55C},{0x8AA1, 0xD55D},{0x8AA2, 0xD55E},{0x8AA3, 0xD55F},{0x8AA4, 0xD560}, - {0x8AA5, 0xD561},{0x8AA6, 0xD562},{0x8AA7, 0xD563},{0x8AA8, 0xD564},{0x8AA9, 0xD565},{0x8AAA, 0xD566},{0x8AAB, 0xD567},{0x8AAC, 0xD568}, - {0x8AAD, 0xD569},{0x8AAE, 0xD56A},{0x8AAF, 0xD56B},{0x8AB0, 0xD56C},{0x8AB1, 0xD56D},{0x8AB2, 0xD56E},{0x8AB3, 0xD56F},{0x8AB4, 0xD570}, - {0x8AB5, 0xD571},{0x8AB6, 0xD572},{0x8AB7, 0xD573},{0x8AB8, 0xD574},{0x8AB9, 0xD575},{0x8ABA, 0xD576},{0x8ABB, 0xD577},{0x8ABC, 0xD578}, - {0x8ABD, 0xD579},{0x8ABE, 0xD57A},{0x8ABF, 0xD57B},{0x8AC0, 0xD57C},{0x8AC1, 0xD57D},{0x8AC2, 0xD57E},{0x8AC3, 0xD580},{0x8AC4, 0xD581}, - {0x8AC5, 0xD582},{0x8AC6, 0xD583},{0x8AC7, 0xD584},{0x8AC8, 0xD585},{0x8AC9, 0xD586},{0x8ACA, 0xD587},{0x8ACB, 0xD588},{0x8ACC, 0xD589}, - {0x8ACD, 0xD58A},{0x8ACE, 0xD58B},{0x8ACF, 0xD58C},{0x8AD0, 0xD58D},{0x8AD1, 0xD58E},{0x8AD2, 0xD58F},{0x8AD3, 0xD590},{0x8AD4, 0xD591}, - {0x8AD5, 0xD592},{0x8AD6, 0xD593},{0x8AD7, 0xD594},{0x8AD8, 0xD595},{0x8AD9, 0xD596},{0x8ADA, 0xD597},{0x8ADB, 0xD598},{0x8ADC, 0xD599}, - {0x8ADD, 0xD59A},{0x8ADE, 0xD59B},{0x8ADF, 0xD59C},{0x8AE0, 0xD59D},{0x8AE1, 0xD59E},{0x8AE2, 0xD59F},{0x8AE3, 0xD5A0},{0x8AE4, 0xD640}, - {0x8AE5, 0xD641},{0x8AE6, 0xD642},{0x8AE7, 0xD643},{0x8AE8, 0xD644},{0x8AE9, 0xD645},{0x8AEA, 0xD646},{0x8AEB, 0xD647},{0x8AEC, 0xD648}, - {0x8AED, 0xD649},{0x8AEE, 0xD64A},{0x8AEF, 0xD64B},{0x8AF0, 0xD64C},{0x8AF1, 0xD64D},{0x8AF2, 0xD64E},{0x8AF3, 0xD64F},{0x8AF4, 0xD650}, - {0x8AF5, 0xD651},{0x8AF6, 0xD652},{0x8AF7, 0xD653},{0x8AF8, 0xD654},{0x8AF9, 0xD655},{0x8AFA, 0xD656},{0x8AFB, 0xD657},{0x8AFC, 0xD658}, - {0x8AFD, 0xD659},{0x8AFE, 0xD65A},{0x8AFF, 0xD65B},{0x8B00, 0xD65C},{0x8B01, 0xD65D},{0x8B02, 0xD65E},{0x8B03, 0xD65F},{0x8B04, 0xD660}, - {0x8B05, 0xD661},{0x8B06, 0xD662},{0x8B07, 0xE5C0},{0x8B08, 0xD663},{0x8B09, 0xD664},{0x8B0A, 0xD665},{0x8B0B, 0xD666},{0x8B0C, 0xD667}, - {0x8B0D, 0xD668},{0x8B0E, 0xD669},{0x8B0F, 0xD66A},{0x8B10, 0xD66B},{0x8B11, 0xD66C},{0x8B12, 0xD66D},{0x8B13, 0xD66E},{0x8B14, 0xD66F}, - {0x8B15, 0xD670},{0x8B16, 0xD671},{0x8B17, 0xD672},{0x8B18, 0xD673},{0x8B19, 0xD674},{0x8B1A, 0xD675},{0x8B1B, 0xD676},{0x8B1C, 0xD677}, - {0x8B1D, 0xD678},{0x8B1E, 0xD679},{0x8B1F, 0xD67A},{0x8B20, 0xD67B},{0x8B21, 0xD67C},{0x8B22, 0xD67D},{0x8B23, 0xD67E},{0x8B24, 0xD680}, - {0x8B25, 0xD681},{0x8B26, 0xF6A5},{0x8B27, 0xD682},{0x8B28, 0xD683},{0x8B29, 0xD684},{0x8B2A, 0xD685},{0x8B2B, 0xD686},{0x8B2C, 0xD687}, - {0x8B2D, 0xD688},{0x8B2E, 0xD689},{0x8B2F, 0xD68A},{0x8B30, 0xD68B},{0x8B31, 0xD68C},{0x8B32, 0xD68D},{0x8B33, 0xD68E},{0x8B34, 0xD68F}, - {0x8B35, 0xD690},{0x8B36, 0xD691},{0x8B37, 0xD692},{0x8B38, 0xD693},{0x8B39, 0xD694},{0x8B3A, 0xD695},{0x8B3B, 0xD696},{0x8B3C, 0xD697}, - {0x8B3D, 0xD698},{0x8B3E, 0xD699},{0x8B3F, 0xD69A},{0x8B40, 0xD69B},{0x8B41, 0xD69C},{0x8B42, 0xD69D},{0x8B43, 0xD69E},{0x8B44, 0xD69F}, - {0x8B45, 0xD6A0},{0x8B46, 0xD740},{0x8B47, 0xD741},{0x8B48, 0xD742},{0x8B49, 0xD743},{0x8B4A, 0xD744},{0x8B4B, 0xD745},{0x8B4C, 0xD746}, - {0x8B4D, 0xD747},{0x8B4E, 0xD748},{0x8B4F, 0xD749},{0x8B50, 0xD74A},{0x8B51, 0xD74B},{0x8B52, 0xD74C},{0x8B53, 0xD74D},{0x8B54, 0xD74E}, - {0x8B55, 0xD74F},{0x8B56, 0xD750},{0x8B57, 0xD751},{0x8B58, 0xD752},{0x8B59, 0xD753},{0x8B5A, 0xD754},{0x8B5B, 0xD755},{0x8B5C, 0xD756}, - {0x8B5D, 0xD757},{0x8B5E, 0xD758},{0x8B5F, 0xD759},{0x8B60, 0xD75A},{0x8B61, 0xD75B},{0x8B62, 0xD75C},{0x8B63, 0xD75D},{0x8B64, 0xD75E}, - {0x8B65, 0xD75F},{0x8B66, 0xBEAF},{0x8B67, 0xD760},{0x8B68, 0xD761},{0x8B69, 0xD762},{0x8B6A, 0xD763},{0x8B6B, 0xD764},{0x8B6C, 0xC6A9}, - {0x8B6D, 0xD765},{0x8B6E, 0xD766},{0x8B6F, 0xD767},{0x8B70, 0xD768},{0x8B71, 0xD769},{0x8B72, 0xD76A},{0x8B73, 0xD76B},{0x8B74, 0xD76C}, - {0x8B75, 0xD76D},{0x8B76, 0xD76E},{0x8B77, 0xD76F},{0x8B78, 0xD770},{0x8B79, 0xD771},{0x8B7A, 0xD772},{0x8B7B, 0xD773},{0x8B7C, 0xD774}, - {0x8B7D, 0xD775},{0x8B7E, 0xD776},{0x8B7F, 0xD777},{0x8B80, 0xD778},{0x8B81, 0xD779},{0x8B82, 0xD77A},{0x8B83, 0xD77B},{0x8B84, 0xD77C}, - {0x8B85, 0xD77D},{0x8B86, 0xD77E},{0x8B87, 0xD780},{0x8B88, 0xD781},{0x8B89, 0xD782},{0x8B8A, 0xD783},{0x8B8B, 0xD784},{0x8B8C, 0xD785}, - {0x8B8D, 0xD786},{0x8B8E, 0xD787},{0x8B8F, 0xD788},{0x8B90, 0xD789},{0x8B91, 0xD78A},{0x8B92, 0xD78B},{0x8B93, 0xD78C},{0x8B94, 0xD78D}, - {0x8B95, 0xD78E},{0x8B96, 0xD78F},{0x8B97, 0xD790},{0x8B98, 0xD791},{0x8B99, 0xD792},{0x8B9A, 0xD793},{0x8B9B, 0xD794},{0x8B9C, 0xD795}, - {0x8B9D, 0xD796},{0x8B9E, 0xD797},{0x8B9F, 0xD798},{0x8BA0, 0xDAA5},{0x8BA1, 0xBCC6},{0x8BA2, 0xB6A9},{0x8BA3, 0xB8BC},{0x8BA4, 0xC8CF}, - {0x8BA5, 0xBCA5},{0x8BA6, 0xDAA6},{0x8BA7, 0xDAA7},{0x8BA8, 0xCCD6},{0x8BA9, 0xC8C3},{0x8BAA, 0xDAA8},{0x8BAB, 0xC6FD},{0x8BAC, 0xD799}, - {0x8BAD, 0xD1B5},{0x8BAE, 0xD2E9},{0x8BAF, 0xD1B6},{0x8BB0, 0xBCC7},{0x8BB1, 0xD79A},{0x8BB2, 0xBDB2},{0x8BB3, 0xBBE4},{0x8BB4, 0xDAA9}, - {0x8BB5, 0xDAAA},{0x8BB6, 0xD1C8},{0x8BB7, 0xDAAB},{0x8BB8, 0xD0ED},{0x8BB9, 0xB6EF},{0x8BBA, 0xC2DB},{0x8BBB, 0xD79B},{0x8BBC, 0xCBCF}, - {0x8BBD, 0xB7ED},{0x8BBE, 0xC9E8},{0x8BBF, 0xB7C3},{0x8BC0, 0xBEF7},{0x8BC1, 0xD6A4},{0x8BC2, 0xDAAC},{0x8BC3, 0xDAAD},{0x8BC4, 0xC6C0}, - {0x8BC5, 0xD7E7},{0x8BC6, 0xCAB6},{0x8BC7, 0xD79C},{0x8BC8, 0xD5A9},{0x8BC9, 0xCBDF},{0x8BCA, 0xD5EF},{0x8BCB, 0xDAAE},{0x8BCC, 0xD6DF}, - {0x8BCD, 0xB4CA},{0x8BCE, 0xDAB0},{0x8BCF, 0xDAAF},{0x8BD0, 0xD79D},{0x8BD1, 0xD2EB},{0x8BD2, 0xDAB1},{0x8BD3, 0xDAB2},{0x8BD4, 0xDAB3}, - {0x8BD5, 0xCAD4},{0x8BD6, 0xDAB4},{0x8BD7, 0xCAAB},{0x8BD8, 0xDAB5},{0x8BD9, 0xDAB6},{0x8BDA, 0xB3CF},{0x8BDB, 0xD6EF},{0x8BDC, 0xDAB7}, - {0x8BDD, 0xBBB0},{0x8BDE, 0xB5AE},{0x8BDF, 0xDAB8},{0x8BE0, 0xDAB9},{0x8BE1, 0xB9EE},{0x8BE2, 0xD1AF},{0x8BE3, 0xD2E8},{0x8BE4, 0xDABA}, - {0x8BE5, 0xB8C3},{0x8BE6, 0xCFEA},{0x8BE7, 0xB2EF},{0x8BE8, 0xDABB},{0x8BE9, 0xDABC},{0x8BEA, 0xD79E},{0x8BEB, 0xBDEB},{0x8BEC, 0xCEDC}, - {0x8BED, 0xD3EF},{0x8BEE, 0xDABD},{0x8BEF, 0xCEF3},{0x8BF0, 0xDABE},{0x8BF1, 0xD3D5},{0x8BF2, 0xBBE5},{0x8BF3, 0xDABF},{0x8BF4, 0xCBB5}, - {0x8BF5, 0xCBD0},{0x8BF6, 0xDAC0},{0x8BF7, 0xC7EB},{0x8BF8, 0xD6EE},{0x8BF9, 0xDAC1},{0x8BFA, 0xC5B5},{0x8BFB, 0xB6C1},{0x8BFC, 0xDAC2}, - {0x8BFD, 0xB7CC},{0x8BFE, 0xBFCE},{0x8BFF, 0xDAC3},{0x8C00, 0xDAC4},{0x8C01, 0xCBAD},{0x8C02, 0xDAC5},{0x8C03, 0xB5F7},{0x8C04, 0xDAC6}, - {0x8C05, 0xC1C2},{0x8C06, 0xD7BB},{0x8C07, 0xDAC7},{0x8C08, 0xCCB8},{0x8C09, 0xD79F},{0x8C0A, 0xD2EA},{0x8C0B, 0xC4B1},{0x8C0C, 0xDAC8}, - {0x8C0D, 0xB5FD},{0x8C0E, 0xBBD1},{0x8C0F, 0xDAC9},{0x8C10, 0xD0B3},{0x8C11, 0xDACA},{0x8C12, 0xDACB},{0x8C13, 0xCEBD},{0x8C14, 0xDACC}, - {0x8C15, 0xDACD},{0x8C16, 0xDACE},{0x8C17, 0xB2F7},{0x8C18, 0xDAD1},{0x8C19, 0xDACF},{0x8C1A, 0xD1E8},{0x8C1B, 0xDAD0},{0x8C1C, 0xC3D5}, - {0x8C1D, 0xDAD2},{0x8C1E, 0xD7A0},{0x8C1F, 0xDAD3},{0x8C20, 0xDAD4},{0x8C21, 0xDAD5},{0x8C22, 0xD0BB},{0x8C23, 0xD2A5},{0x8C24, 0xB0F9}, - {0x8C25, 0xDAD6},{0x8C26, 0xC7AB},{0x8C27, 0xDAD7},{0x8C28, 0xBDF7},{0x8C29, 0xC3A1},{0x8C2A, 0xDAD8},{0x8C2B, 0xDAD9},{0x8C2C, 0xC3FD}, - {0x8C2D, 0xCCB7},{0x8C2E, 0xDADA},{0x8C2F, 0xDADB},{0x8C30, 0xC0BE},{0x8C31, 0xC6D7},{0x8C32, 0xDADC},{0x8C33, 0xDADD},{0x8C34, 0xC7B4}, - {0x8C35, 0xDADE},{0x8C36, 0xDADF},{0x8C37, 0xB9C8},{0x8C38, 0xD840},{0x8C39, 0xD841},{0x8C3A, 0xD842},{0x8C3B, 0xD843},{0x8C3C, 0xD844}, - {0x8C3D, 0xD845},{0x8C3E, 0xD846},{0x8C3F, 0xD847},{0x8C40, 0xD848},{0x8C41, 0xBBED},{0x8C42, 0xD849},{0x8C43, 0xD84A},{0x8C44, 0xD84B}, - {0x8C45, 0xD84C},{0x8C46, 0xB6B9},{0x8C47, 0xF4F8},{0x8C48, 0xD84D},{0x8C49, 0xF4F9},{0x8C4A, 0xD84E},{0x8C4B, 0xD84F},{0x8C4C, 0xCDE3}, - {0x8C4D, 0xD850},{0x8C4E, 0xD851},{0x8C4F, 0xD852},{0x8C50, 0xD853},{0x8C51, 0xD854},{0x8C52, 0xD855},{0x8C53, 0xD856},{0x8C54, 0xD857}, - {0x8C55, 0xF5B9},{0x8C56, 0xD858},{0x8C57, 0xD859},{0x8C58, 0xD85A},{0x8C59, 0xD85B},{0x8C5A, 0xEBE0},{0x8C5B, 0xD85C},{0x8C5C, 0xD85D}, - {0x8C5D, 0xD85E},{0x8C5E, 0xD85F},{0x8C5F, 0xD860},{0x8C60, 0xD861},{0x8C61, 0xCFF3},{0x8C62, 0xBBBF},{0x8C63, 0xD862},{0x8C64, 0xD863}, - {0x8C65, 0xD864},{0x8C66, 0xD865},{0x8C67, 0xD866},{0x8C68, 0xD867},{0x8C69, 0xD868},{0x8C6A, 0xBAC0},{0x8C6B, 0xD4A5},{0x8C6C, 0xD869}, - {0x8C6D, 0xD86A},{0x8C6E, 0xD86B},{0x8C6F, 0xD86C},{0x8C70, 0xD86D},{0x8C71, 0xD86E},{0x8C72, 0xD86F},{0x8C73, 0xE1D9},{0x8C74, 0xD870}, - {0x8C75, 0xD871},{0x8C76, 0xD872},{0x8C77, 0xD873},{0x8C78, 0xF5F4},{0x8C79, 0xB1AA},{0x8C7A, 0xB2F2},{0x8C7B, 0xD874},{0x8C7C, 0xD875}, - {0x8C7D, 0xD876},{0x8C7E, 0xD877},{0x8C7F, 0xD878},{0x8C80, 0xD879},{0x8C81, 0xD87A},{0x8C82, 0xF5F5},{0x8C83, 0xD87B},{0x8C84, 0xD87C}, - {0x8C85, 0xF5F7},{0x8C86, 0xD87D},{0x8C87, 0xD87E},{0x8C88, 0xD880},{0x8C89, 0xBAD1},{0x8C8A, 0xF5F6},{0x8C8B, 0xD881},{0x8C8C, 0xC3B2}, - {0x8C8D, 0xD882},{0x8C8E, 0xD883},{0x8C8F, 0xD884},{0x8C90, 0xD885},{0x8C91, 0xD886},{0x8C92, 0xD887},{0x8C93, 0xD888},{0x8C94, 0xF5F9}, - {0x8C95, 0xD889},{0x8C96, 0xD88A},{0x8C97, 0xD88B},{0x8C98, 0xF5F8},{0x8C99, 0xD88C},{0x8C9A, 0xD88D},{0x8C9B, 0xD88E},{0x8C9C, 0xD88F}, - {0x8C9D, 0xD890},{0x8C9E, 0xD891},{0x8C9F, 0xD892},{0x8CA0, 0xD893},{0x8CA1, 0xD894},{0x8CA2, 0xD895},{0x8CA3, 0xD896},{0x8CA4, 0xD897}, - {0x8CA5, 0xD898},{0x8CA6, 0xD899},{0x8CA7, 0xD89A},{0x8CA8, 0xD89B},{0x8CA9, 0xD89C},{0x8CAA, 0xD89D},{0x8CAB, 0xD89E},{0x8CAC, 0xD89F}, - {0x8CAD, 0xD8A0},{0x8CAE, 0xD940},{0x8CAF, 0xD941},{0x8CB0, 0xD942},{0x8CB1, 0xD943},{0x8CB2, 0xD944},{0x8CB3, 0xD945},{0x8CB4, 0xD946}, - {0x8CB5, 0xD947},{0x8CB6, 0xD948},{0x8CB7, 0xD949},{0x8CB8, 0xD94A},{0x8CB9, 0xD94B},{0x8CBA, 0xD94C},{0x8CBB, 0xD94D},{0x8CBC, 0xD94E}, - {0x8CBD, 0xD94F},{0x8CBE, 0xD950},{0x8CBF, 0xD951},{0x8CC0, 0xD952},{0x8CC1, 0xD953},{0x8CC2, 0xD954},{0x8CC3, 0xD955},{0x8CC4, 0xD956}, - {0x8CC5, 0xD957},{0x8CC6, 0xD958},{0x8CC7, 0xD959},{0x8CC8, 0xD95A},{0x8CC9, 0xD95B},{0x8CCA, 0xD95C},{0x8CCB, 0xD95D},{0x8CCC, 0xD95E}, - {0x8CCD, 0xD95F},{0x8CCE, 0xD960},{0x8CCF, 0xD961},{0x8CD0, 0xD962},{0x8CD1, 0xD963},{0x8CD2, 0xD964},{0x8CD3, 0xD965},{0x8CD4, 0xD966}, - {0x8CD5, 0xD967},{0x8CD6, 0xD968},{0x8CD7, 0xD969},{0x8CD8, 0xD96A},{0x8CD9, 0xD96B},{0x8CDA, 0xD96C},{0x8CDB, 0xD96D},{0x8CDC, 0xD96E}, - {0x8CDD, 0xD96F},{0x8CDE, 0xD970},{0x8CDF, 0xD971},{0x8CE0, 0xD972},{0x8CE1, 0xD973},{0x8CE2, 0xD974},{0x8CE3, 0xD975},{0x8CE4, 0xD976}, - {0x8CE5, 0xD977},{0x8CE6, 0xD978},{0x8CE7, 0xD979},{0x8CE8, 0xD97A},{0x8CE9, 0xD97B},{0x8CEA, 0xD97C},{0x8CEB, 0xD97D},{0x8CEC, 0xD97E}, - {0x8CED, 0xD980},{0x8CEE, 0xD981},{0x8CEF, 0xD982},{0x8CF0, 0xD983},{0x8CF1, 0xD984},{0x8CF2, 0xD985},{0x8CF3, 0xD986},{0x8CF4, 0xD987}, - {0x8CF5, 0xD988},{0x8CF6, 0xD989},{0x8CF7, 0xD98A},{0x8CF8, 0xD98B},{0x8CF9, 0xD98C},{0x8CFA, 0xD98D},{0x8CFB, 0xD98E},{0x8CFC, 0xD98F}, - {0x8CFD, 0xD990},{0x8CFE, 0xD991},{0x8CFF, 0xD992},{0x8D00, 0xD993},{0x8D01, 0xD994},{0x8D02, 0xD995},{0x8D03, 0xD996},{0x8D04, 0xD997}, - {0x8D05, 0xD998},{0x8D06, 0xD999},{0x8D07, 0xD99A},{0x8D08, 0xD99B},{0x8D09, 0xD99C},{0x8D0A, 0xD99D},{0x8D0B, 0xD99E},{0x8D0C, 0xD99F}, - {0x8D0D, 0xD9A0},{0x8D0E, 0xDA40},{0x8D0F, 0xDA41},{0x8D10, 0xDA42},{0x8D11, 0xDA43},{0x8D12, 0xDA44},{0x8D13, 0xDA45},{0x8D14, 0xDA46}, - {0x8D15, 0xDA47},{0x8D16, 0xDA48},{0x8D17, 0xDA49},{0x8D18, 0xDA4A},{0x8D19, 0xDA4B},{0x8D1A, 0xDA4C},{0x8D1B, 0xDA4D},{0x8D1C, 0xDA4E}, - {0x8D1D, 0xB1B4},{0x8D1E, 0xD5EA},{0x8D1F, 0xB8BA},{0x8D20, 0xDA4F},{0x8D21, 0xB9B1},{0x8D22, 0xB2C6},{0x8D23, 0xD4F0},{0x8D24, 0xCFCD}, - {0x8D25, 0xB0DC},{0x8D26, 0xD5CB},{0x8D27, 0xBBF5},{0x8D28, 0xD6CA},{0x8D29, 0xB7B7},{0x8D2A, 0xCCB0},{0x8D2B, 0xC6B6},{0x8D2C, 0xB1E1}, - {0x8D2D, 0xB9BA},{0x8D2E, 0xD6FC},{0x8D2F, 0xB9E1},{0x8D30, 0xB7A1},{0x8D31, 0xBCFA},{0x8D32, 0xEADA},{0x8D33, 0xEADB},{0x8D34, 0xCCF9}, - {0x8D35, 0xB9F3},{0x8D36, 0xEADC},{0x8D37, 0xB4FB},{0x8D38, 0xC3B3},{0x8D39, 0xB7D1},{0x8D3A, 0xBAD8},{0x8D3B, 0xEADD},{0x8D3C, 0xD4F4}, - {0x8D3D, 0xEADE},{0x8D3E, 0xBCD6},{0x8D3F, 0xBBDF},{0x8D40, 0xEADF},{0x8D41, 0xC1DE},{0x8D42, 0xC2B8},{0x8D43, 0xD4DF},{0x8D44, 0xD7CA}, - {0x8D45, 0xEAE0},{0x8D46, 0xEAE1},{0x8D47, 0xEAE4},{0x8D48, 0xEAE2},{0x8D49, 0xEAE3},{0x8D4A, 0xC9DE},{0x8D4B, 0xB8B3},{0x8D4C, 0xB6C4}, - {0x8D4D, 0xEAE5},{0x8D4E, 0xCAEA},{0x8D4F, 0xC9CD},{0x8D50, 0xB4CD},{0x8D51, 0xDA50},{0x8D52, 0xDA51},{0x8D53, 0xE2D9},{0x8D54, 0xC5E2}, - {0x8D55, 0xEAE6},{0x8D56, 0xC0B5},{0x8D57, 0xDA52},{0x8D58, 0xD7B8},{0x8D59, 0xEAE7},{0x8D5A, 0xD7AC},{0x8D5B, 0xC8FC},{0x8D5C, 0xD8D3}, - {0x8D5D, 0xD8CD},{0x8D5E, 0xD4DE},{0x8D5F, 0xDA53},{0x8D60, 0xD4F9},{0x8D61, 0xC9C4},{0x8D62, 0xD3AE},{0x8D63, 0xB8D3},{0x8D64, 0xB3E0}, - {0x8D65, 0xDA54},{0x8D66, 0xC9E2},{0x8D67, 0xF4F6},{0x8D68, 0xDA55},{0x8D69, 0xDA56},{0x8D6A, 0xDA57},{0x8D6B, 0xBAD5},{0x8D6C, 0xDA58}, - {0x8D6D, 0xF4F7},{0x8D6E, 0xDA59},{0x8D6F, 0xDA5A},{0x8D70, 0xD7DF},{0x8D71, 0xDA5B},{0x8D72, 0xDA5C},{0x8D73, 0xF4F1},{0x8D74, 0xB8B0}, - {0x8D75, 0xD5D4},{0x8D76, 0xB8CF},{0x8D77, 0xC6F0},{0x8D78, 0xDA5D},{0x8D79, 0xDA5E},{0x8D7A, 0xDA5F},{0x8D7B, 0xDA60},{0x8D7C, 0xDA61}, - {0x8D7D, 0xDA62},{0x8D7E, 0xDA63},{0x8D7F, 0xDA64},{0x8D80, 0xDA65},{0x8D81, 0xB3C3},{0x8D82, 0xDA66},{0x8D83, 0xDA67},{0x8D84, 0xF4F2}, - {0x8D85, 0xB3AC},{0x8D86, 0xDA68},{0x8D87, 0xDA69},{0x8D88, 0xDA6A},{0x8D89, 0xDA6B},{0x8D8A, 0xD4BD},{0x8D8B, 0xC7F7},{0x8D8C, 0xDA6C}, - {0x8D8D, 0xDA6D},{0x8D8E, 0xDA6E},{0x8D8F, 0xDA6F},{0x8D90, 0xDA70},{0x8D91, 0xF4F4},{0x8D92, 0xDA71},{0x8D93, 0xDA72},{0x8D94, 0xF4F3}, - {0x8D95, 0xDA73},{0x8D96, 0xDA74},{0x8D97, 0xDA75},{0x8D98, 0xDA76},{0x8D99, 0xDA77},{0x8D9A, 0xDA78},{0x8D9B, 0xDA79},{0x8D9C, 0xDA7A}, - {0x8D9D, 0xDA7B},{0x8D9E, 0xDA7C},{0x8D9F, 0xCCCB},{0x8DA0, 0xDA7D},{0x8DA1, 0xDA7E},{0x8DA2, 0xDA80},{0x8DA3, 0xC8A4},{0x8DA4, 0xDA81}, - {0x8DA5, 0xDA82},{0x8DA6, 0xDA83},{0x8DA7, 0xDA84},{0x8DA8, 0xDA85},{0x8DA9, 0xDA86},{0x8DAA, 0xDA87},{0x8DAB, 0xDA88},{0x8DAC, 0xDA89}, - {0x8DAD, 0xDA8A},{0x8DAE, 0xDA8B},{0x8DAF, 0xDA8C},{0x8DB0, 0xDA8D},{0x8DB1, 0xF4F5},{0x8DB2, 0xDA8E},{0x8DB3, 0xD7E3},{0x8DB4, 0xC5BF}, - {0x8DB5, 0xF5C0},{0x8DB6, 0xDA8F},{0x8DB7, 0xDA90},{0x8DB8, 0xF5BB},{0x8DB9, 0xDA91},{0x8DBA, 0xF5C3},{0x8DBB, 0xDA92},{0x8DBC, 0xF5C2}, - {0x8DBD, 0xDA93},{0x8DBE, 0xD6BA},{0x8DBF, 0xF5C1},{0x8DC0, 0xDA94},{0x8DC1, 0xDA95},{0x8DC2, 0xDA96},{0x8DC3, 0xD4BE},{0x8DC4, 0xF5C4}, - {0x8DC5, 0xDA97},{0x8DC6, 0xF5CC},{0x8DC7, 0xDA98},{0x8DC8, 0xDA99},{0x8DC9, 0xDA9A},{0x8DCA, 0xDA9B},{0x8DCB, 0xB0CF},{0x8DCC, 0xB5F8}, - {0x8DCD, 0xDA9C},{0x8DCE, 0xF5C9},{0x8DCF, 0xF5CA},{0x8DD0, 0xDA9D},{0x8DD1, 0xC5DC},{0x8DD2, 0xDA9E},{0x8DD3, 0xDA9F},{0x8DD4, 0xDAA0}, - {0x8DD5, 0xDB40},{0x8DD6, 0xF5C5},{0x8DD7, 0xF5C6},{0x8DD8, 0xDB41},{0x8DD9, 0xDB42},{0x8DDA, 0xF5C7},{0x8DDB, 0xF5CB},{0x8DDC, 0xDB43}, - {0x8DDD, 0xBEE0},{0x8DDE, 0xF5C8},{0x8DDF, 0xB8FA},{0x8DE0, 0xDB44},{0x8DE1, 0xDB45},{0x8DE2, 0xDB46},{0x8DE3, 0xF5D0},{0x8DE4, 0xF5D3}, - {0x8DE5, 0xDB47},{0x8DE6, 0xDB48},{0x8DE7, 0xDB49},{0x8DE8, 0xBFE7},{0x8DE9, 0xDB4A},{0x8DEA, 0xB9F2},{0x8DEB, 0xF5BC},{0x8DEC, 0xF5CD}, - {0x8DED, 0xDB4B},{0x8DEE, 0xDB4C},{0x8DEF, 0xC2B7},{0x8DF0, 0xDB4D},{0x8DF1, 0xDB4E},{0x8DF2, 0xDB4F},{0x8DF3, 0xCCF8},{0x8DF4, 0xDB50}, - {0x8DF5, 0xBCF9},{0x8DF6, 0xDB51},{0x8DF7, 0xF5CE},{0x8DF8, 0xF5CF},{0x8DF9, 0xF5D1},{0x8DFA, 0xB6E5},{0x8DFB, 0xF5D2},{0x8DFC, 0xDB52}, - {0x8DFD, 0xF5D5},{0x8DFE, 0xDB53},{0x8DFF, 0xDB54},{0x8E00, 0xDB55},{0x8E01, 0xDB56},{0x8E02, 0xDB57},{0x8E03, 0xDB58},{0x8E04, 0xDB59}, - {0x8E05, 0xF5BD},{0x8E06, 0xDB5A},{0x8E07, 0xDB5B},{0x8E08, 0xDB5C},{0x8E09, 0xF5D4},{0x8E0A, 0xD3BB},{0x8E0B, 0xDB5D},{0x8E0C, 0xB3EC}, - {0x8E0D, 0xDB5E},{0x8E0E, 0xDB5F},{0x8E0F, 0xCCA4},{0x8E10, 0xDB60},{0x8E11, 0xDB61},{0x8E12, 0xDB62},{0x8E13, 0xDB63},{0x8E14, 0xF5D6}, - {0x8E15, 0xDB64},{0x8E16, 0xDB65},{0x8E17, 0xDB66},{0x8E18, 0xDB67},{0x8E19, 0xDB68},{0x8E1A, 0xDB69},{0x8E1B, 0xDB6A},{0x8E1C, 0xDB6B}, - {0x8E1D, 0xF5D7},{0x8E1E, 0xBEE1},{0x8E1F, 0xF5D8},{0x8E20, 0xDB6C},{0x8E21, 0xDB6D},{0x8E22, 0xCCDF},{0x8E23, 0xF5DB},{0x8E24, 0xDB6E}, - {0x8E25, 0xDB6F},{0x8E26, 0xDB70},{0x8E27, 0xDB71},{0x8E28, 0xDB72},{0x8E29, 0xB2C8},{0x8E2A, 0xD7D9},{0x8E2B, 0xDB73},{0x8E2C, 0xF5D9}, - {0x8E2D, 0xDB74},{0x8E2E, 0xF5DA},{0x8E2F, 0xF5DC},{0x8E30, 0xDB75},{0x8E31, 0xF5E2},{0x8E32, 0xDB76},{0x8E33, 0xDB77},{0x8E34, 0xDB78}, - {0x8E35, 0xF5E0},{0x8E36, 0xDB79},{0x8E37, 0xDB7A},{0x8E38, 0xDB7B},{0x8E39, 0xF5DF},{0x8E3A, 0xF5DD},{0x8E3B, 0xDB7C},{0x8E3C, 0xDB7D}, - {0x8E3D, 0xF5E1},{0x8E3E, 0xDB7E},{0x8E3F, 0xDB80},{0x8E40, 0xF5DE},{0x8E41, 0xF5E4},{0x8E42, 0xF5E5},{0x8E43, 0xDB81},{0x8E44, 0xCCE3}, - {0x8E45, 0xDB82},{0x8E46, 0xDB83},{0x8E47, 0xE5BF},{0x8E48, 0xB5B8},{0x8E49, 0xF5E3},{0x8E4A, 0xF5E8},{0x8E4B, 0xCCA3},{0x8E4C, 0xDB84}, - {0x8E4D, 0xDB85},{0x8E4E, 0xDB86},{0x8E4F, 0xDB87},{0x8E50, 0xDB88},{0x8E51, 0xF5E6},{0x8E52, 0xF5E7},{0x8E53, 0xDB89},{0x8E54, 0xDB8A}, - {0x8E55, 0xDB8B},{0x8E56, 0xDB8C},{0x8E57, 0xDB8D},{0x8E58, 0xDB8E},{0x8E59, 0xF5BE},{0x8E5A, 0xDB8F},{0x8E5B, 0xDB90},{0x8E5C, 0xDB91}, - {0x8E5D, 0xDB92},{0x8E5E, 0xDB93},{0x8E5F, 0xDB94},{0x8E60, 0xDB95},{0x8E61, 0xDB96},{0x8E62, 0xDB97},{0x8E63, 0xDB98},{0x8E64, 0xDB99}, - {0x8E65, 0xDB9A},{0x8E66, 0xB1C4},{0x8E67, 0xDB9B},{0x8E68, 0xDB9C},{0x8E69, 0xF5BF},{0x8E6A, 0xDB9D},{0x8E6B, 0xDB9E},{0x8E6C, 0xB5C5}, - {0x8E6D, 0xB2E4},{0x8E6E, 0xDB9F},{0x8E6F, 0xF5EC},{0x8E70, 0xF5E9},{0x8E71, 0xDBA0},{0x8E72, 0xB6D7},{0x8E73, 0xDC40},{0x8E74, 0xF5ED}, - {0x8E75, 0xDC41},{0x8E76, 0xF5EA},{0x8E77, 0xDC42},{0x8E78, 0xDC43},{0x8E79, 0xDC44},{0x8E7A, 0xDC45},{0x8E7B, 0xDC46},{0x8E7C, 0xF5EB}, - {0x8E7D, 0xDC47},{0x8E7E, 0xDC48},{0x8E7F, 0xB4DA},{0x8E80, 0xDC49},{0x8E81, 0xD4EA},{0x8E82, 0xDC4A},{0x8E83, 0xDC4B},{0x8E84, 0xDC4C}, - {0x8E85, 0xF5EE},{0x8E86, 0xDC4D},{0x8E87, 0xB3F9},{0x8E88, 0xDC4E},{0x8E89, 0xDC4F},{0x8E8A, 0xDC50},{0x8E8B, 0xDC51},{0x8E8C, 0xDC52}, - {0x8E8D, 0xDC53},{0x8E8E, 0xDC54},{0x8E8F, 0xF5EF},{0x8E90, 0xF5F1},{0x8E91, 0xDC55},{0x8E92, 0xDC56},{0x8E93, 0xDC57},{0x8E94, 0xF5F0}, - {0x8E95, 0xDC58},{0x8E96, 0xDC59},{0x8E97, 0xDC5A},{0x8E98, 0xDC5B},{0x8E99, 0xDC5C},{0x8E9A, 0xDC5D},{0x8E9B, 0xDC5E},{0x8E9C, 0xF5F2}, - {0x8E9D, 0xDC5F},{0x8E9E, 0xF5F3},{0x8E9F, 0xDC60},{0x8EA0, 0xDC61},{0x8EA1, 0xDC62},{0x8EA2, 0xDC63},{0x8EA3, 0xDC64},{0x8EA4, 0xDC65}, - {0x8EA5, 0xDC66},{0x8EA6, 0xDC67},{0x8EA7, 0xDC68},{0x8EA8, 0xDC69},{0x8EA9, 0xDC6A},{0x8EAA, 0xDC6B},{0x8EAB, 0xC9ED},{0x8EAC, 0xB9AA}, - {0x8EAD, 0xDC6C},{0x8EAE, 0xDC6D},{0x8EAF, 0xC7FB},{0x8EB0, 0xDC6E},{0x8EB1, 0xDC6F},{0x8EB2, 0xB6E3},{0x8EB3, 0xDC70},{0x8EB4, 0xDC71}, - {0x8EB5, 0xDC72},{0x8EB6, 0xDC73},{0x8EB7, 0xDC74},{0x8EB8, 0xDC75},{0x8EB9, 0xDC76},{0x8EBA, 0xCCC9},{0x8EBB, 0xDC77},{0x8EBC, 0xDC78}, - {0x8EBD, 0xDC79},{0x8EBE, 0xDC7A},{0x8EBF, 0xDC7B},{0x8EC0, 0xDC7C},{0x8EC1, 0xDC7D},{0x8EC2, 0xDC7E},{0x8EC3, 0xDC80},{0x8EC4, 0xDC81}, - {0x8EC5, 0xDC82},{0x8EC6, 0xDC83},{0x8EC7, 0xDC84},{0x8EC8, 0xDC85},{0x8EC9, 0xDC86},{0x8ECA, 0xDC87},{0x8ECB, 0xDC88},{0x8ECC, 0xDC89}, - {0x8ECD, 0xDC8A},{0x8ECE, 0xEAA6},{0x8ECF, 0xDC8B},{0x8ED0, 0xDC8C},{0x8ED1, 0xDC8D},{0x8ED2, 0xDC8E},{0x8ED3, 0xDC8F},{0x8ED4, 0xDC90}, - {0x8ED5, 0xDC91},{0x8ED6, 0xDC92},{0x8ED7, 0xDC93},{0x8ED8, 0xDC94},{0x8ED9, 0xDC95},{0x8EDA, 0xDC96},{0x8EDB, 0xDC97},{0x8EDC, 0xDC98}, - {0x8EDD, 0xDC99},{0x8EDE, 0xDC9A},{0x8EDF, 0xDC9B},{0x8EE0, 0xDC9C},{0x8EE1, 0xDC9D},{0x8EE2, 0xDC9E},{0x8EE3, 0xDC9F},{0x8EE4, 0xDCA0}, - {0x8EE5, 0xDD40},{0x8EE6, 0xDD41},{0x8EE7, 0xDD42},{0x8EE8, 0xDD43},{0x8EE9, 0xDD44},{0x8EEA, 0xDD45},{0x8EEB, 0xDD46},{0x8EEC, 0xDD47}, - {0x8EED, 0xDD48},{0x8EEE, 0xDD49},{0x8EEF, 0xDD4A},{0x8EF0, 0xDD4B},{0x8EF1, 0xDD4C},{0x8EF2, 0xDD4D},{0x8EF3, 0xDD4E},{0x8EF4, 0xDD4F}, - {0x8EF5, 0xDD50},{0x8EF6, 0xDD51},{0x8EF7, 0xDD52},{0x8EF8, 0xDD53},{0x8EF9, 0xDD54},{0x8EFA, 0xDD55},{0x8EFB, 0xDD56},{0x8EFC, 0xDD57}, - {0x8EFD, 0xDD58},{0x8EFE, 0xDD59},{0x8EFF, 0xDD5A},{0x8F00, 0xDD5B},{0x8F01, 0xDD5C},{0x8F02, 0xDD5D},{0x8F03, 0xDD5E},{0x8F04, 0xDD5F}, - {0x8F05, 0xDD60},{0x8F06, 0xDD61},{0x8F07, 0xDD62},{0x8F08, 0xDD63},{0x8F09, 0xDD64},{0x8F0A, 0xDD65},{0x8F0B, 0xDD66},{0x8F0C, 0xDD67}, - {0x8F0D, 0xDD68},{0x8F0E, 0xDD69},{0x8F0F, 0xDD6A},{0x8F10, 0xDD6B},{0x8F11, 0xDD6C},{0x8F12, 0xDD6D},{0x8F13, 0xDD6E},{0x8F14, 0xDD6F}, - {0x8F15, 0xDD70},{0x8F16, 0xDD71},{0x8F17, 0xDD72},{0x8F18, 0xDD73},{0x8F19, 0xDD74},{0x8F1A, 0xDD75},{0x8F1B, 0xDD76},{0x8F1C, 0xDD77}, - {0x8F1D, 0xDD78},{0x8F1E, 0xDD79},{0x8F1F, 0xDD7A},{0x8F20, 0xDD7B},{0x8F21, 0xDD7C},{0x8F22, 0xDD7D},{0x8F23, 0xDD7E},{0x8F24, 0xDD80}, - {0x8F25, 0xDD81},{0x8F26, 0xDD82},{0x8F27, 0xDD83},{0x8F28, 0xDD84},{0x8F29, 0xDD85},{0x8F2A, 0xDD86},{0x8F2B, 0xDD87},{0x8F2C, 0xDD88}, - {0x8F2D, 0xDD89},{0x8F2E, 0xDD8A},{0x8F2F, 0xDD8B},{0x8F30, 0xDD8C},{0x8F31, 0xDD8D},{0x8F32, 0xDD8E},{0x8F33, 0xDD8F},{0x8F34, 0xDD90}, - {0x8F35, 0xDD91},{0x8F36, 0xDD92},{0x8F37, 0xDD93},{0x8F38, 0xDD94},{0x8F39, 0xDD95},{0x8F3A, 0xDD96},{0x8F3B, 0xDD97},{0x8F3C, 0xDD98}, - {0x8F3D, 0xDD99},{0x8F3E, 0xDD9A},{0x8F3F, 0xDD9B},{0x8F40, 0xDD9C},{0x8F41, 0xDD9D},{0x8F42, 0xDD9E},{0x8F43, 0xDD9F},{0x8F44, 0xDDA0}, - {0x8F45, 0xDE40},{0x8F46, 0xDE41},{0x8F47, 0xDE42},{0x8F48, 0xDE43},{0x8F49, 0xDE44},{0x8F4A, 0xDE45},{0x8F4B, 0xDE46},{0x8F4C, 0xDE47}, - {0x8F4D, 0xDE48},{0x8F4E, 0xDE49},{0x8F4F, 0xDE4A},{0x8F50, 0xDE4B},{0x8F51, 0xDE4C},{0x8F52, 0xDE4D},{0x8F53, 0xDE4E},{0x8F54, 0xDE4F}, - {0x8F55, 0xDE50},{0x8F56, 0xDE51},{0x8F57, 0xDE52},{0x8F58, 0xDE53},{0x8F59, 0xDE54},{0x8F5A, 0xDE55},{0x8F5B, 0xDE56},{0x8F5C, 0xDE57}, - {0x8F5D, 0xDE58},{0x8F5E, 0xDE59},{0x8F5F, 0xDE5A},{0x8F60, 0xDE5B},{0x8F61, 0xDE5C},{0x8F62, 0xDE5D},{0x8F63, 0xDE5E},{0x8F64, 0xDE5F}, - {0x8F65, 0xDE60},{0x8F66, 0xB3B5},{0x8F67, 0xD4FE},{0x8F68, 0xB9EC},{0x8F69, 0xD0F9},{0x8F6A, 0xDE61},{0x8F6B, 0xE9ED},{0x8F6C, 0xD7AA}, - {0x8F6D, 0xE9EE},{0x8F6E, 0xC2D6},{0x8F6F, 0xC8ED},{0x8F70, 0xBAE4},{0x8F71, 0xE9EF},{0x8F72, 0xE9F0},{0x8F73, 0xE9F1},{0x8F74, 0xD6E1}, - {0x8F75, 0xE9F2},{0x8F76, 0xE9F3},{0x8F77, 0xE9F5},{0x8F78, 0xE9F4},{0x8F79, 0xE9F6},{0x8F7A, 0xE9F7},{0x8F7B, 0xC7E1},{0x8F7C, 0xE9F8}, - {0x8F7D, 0xD4D8},{0x8F7E, 0xE9F9},{0x8F7F, 0xBDCE},{0x8F80, 0xDE62},{0x8F81, 0xE9FA},{0x8F82, 0xE9FB},{0x8F83, 0xBDCF},{0x8F84, 0xE9FC}, - {0x8F85, 0xB8A8},{0x8F86, 0xC1BE},{0x8F87, 0xE9FD},{0x8F88, 0xB1B2},{0x8F89, 0xBBD4},{0x8F8A, 0xB9F5},{0x8F8B, 0xE9FE},{0x8F8C, 0xDE63}, - {0x8F8D, 0xEAA1},{0x8F8E, 0xEAA2},{0x8F8F, 0xEAA3},{0x8F90, 0xB7F8},{0x8F91, 0xBCAD},{0x8F92, 0xDE64},{0x8F93, 0xCAE4},{0x8F94, 0xE0CE}, - {0x8F95, 0xD4AF},{0x8F96, 0xCFBD},{0x8F97, 0xD5B7},{0x8F98, 0xEAA4},{0x8F99, 0xD5DE},{0x8F9A, 0xEAA5},{0x8F9B, 0xD0C1},{0x8F9C, 0xB9BC}, - {0x8F9D, 0xDE65},{0x8F9E, 0xB4C7},{0x8F9F, 0xB1D9},{0x8FA0, 0xDE66},{0x8FA1, 0xDE67},{0x8FA2, 0xDE68},{0x8FA3, 0xC0B1},{0x8FA4, 0xDE69}, - {0x8FA5, 0xDE6A},{0x8FA6, 0xDE6B},{0x8FA7, 0xDE6C},{0x8FA8, 0xB1E6},{0x8FA9, 0xB1E7},{0x8FAA, 0xDE6D},{0x8FAB, 0xB1E8},{0x8FAC, 0xDE6E}, - {0x8FAD, 0xDE6F},{0x8FAE, 0xDE70},{0x8FAF, 0xDE71},{0x8FB0, 0xB3BD},{0x8FB1, 0xC8E8},{0x8FB2, 0xDE72},{0x8FB3, 0xDE73},{0x8FB4, 0xDE74}, - {0x8FB5, 0xDE75},{0x8FB6, 0xE5C1},{0x8FB7, 0xDE76},{0x8FB8, 0xDE77},{0x8FB9, 0xB1DF},{0x8FBA, 0xDE78},{0x8FBB, 0xDE79},{0x8FBC, 0xDE7A}, - {0x8FBD, 0xC1C9},{0x8FBE, 0xB4EF},{0x8FBF, 0xDE7B},{0x8FC0, 0xDE7C},{0x8FC1, 0xC7A8},{0x8FC2, 0xD3D8},{0x8FC3, 0xDE7D},{0x8FC4, 0xC6F9}, - {0x8FC5, 0xD1B8},{0x8FC6, 0xDE7E},{0x8FC7, 0xB9FD},{0x8FC8, 0xC2F5},{0x8FC9, 0xDE80},{0x8FCA, 0xDE81},{0x8FCB, 0xDE82},{0x8FCC, 0xDE83}, - {0x8FCD, 0xDE84},{0x8FCE, 0xD3AD},{0x8FCF, 0xDE85},{0x8FD0, 0xD4CB},{0x8FD1, 0xBDFC},{0x8FD2, 0xDE86},{0x8FD3, 0xE5C2},{0x8FD4, 0xB7B5}, - {0x8FD5, 0xE5C3},{0x8FD6, 0xDE87},{0x8FD7, 0xDE88},{0x8FD8, 0xBBB9},{0x8FD9, 0xD5E2},{0x8FDA, 0xDE89},{0x8FDB, 0xBDF8},{0x8FDC, 0xD4B6}, - {0x8FDD, 0xCEA5},{0x8FDE, 0xC1AC},{0x8FDF, 0xB3D9},{0x8FE0, 0xDE8A},{0x8FE1, 0xDE8B},{0x8FE2, 0xCCF6},{0x8FE3, 0xDE8C},{0x8FE4, 0xE5C6}, - {0x8FE5, 0xE5C4},{0x8FE6, 0xE5C8},{0x8FE7, 0xDE8D},{0x8FE8, 0xE5CA},{0x8FE9, 0xE5C7},{0x8FEA, 0xB5CF},{0x8FEB, 0xC6C8},{0x8FEC, 0xDE8E}, - {0x8FED, 0xB5FC},{0x8FEE, 0xE5C5},{0x8FEF, 0xDE8F},{0x8FF0, 0xCAF6},{0x8FF1, 0xDE90},{0x8FF2, 0xDE91},{0x8FF3, 0xE5C9},{0x8FF4, 0xDE92}, - {0x8FF5, 0xDE93},{0x8FF6, 0xDE94},{0x8FF7, 0xC3D4},{0x8FF8, 0xB1C5},{0x8FF9, 0xBCA3},{0x8FFA, 0xDE95},{0x8FFB, 0xDE96},{0x8FFC, 0xDE97}, - {0x8FFD, 0xD7B7},{0x8FFE, 0xDE98},{0x8FFF, 0xDE99},{0x9000, 0xCDCB},{0x9001, 0xCBCD},{0x9002, 0xCACA},{0x9003, 0xCCD3},{0x9004, 0xE5CC}, - {0x9005, 0xE5CB},{0x9006, 0xC4E6},{0x9007, 0xDE9A},{0x9008, 0xDE9B},{0x9009, 0xD1A1},{0x900A, 0xD1B7},{0x900B, 0xE5CD},{0x900C, 0xDE9C}, - {0x900D, 0xE5D0},{0x900E, 0xDE9D},{0x900F, 0xCDB8},{0x9010, 0xD6F0},{0x9011, 0xE5CF},{0x9012, 0xB5DD},{0x9013, 0xDE9E},{0x9014, 0xCDBE}, - {0x9015, 0xDE9F},{0x9016, 0xE5D1},{0x9017, 0xB6BA},{0x9018, 0xDEA0},{0x9019, 0xDF40},{0x901A, 0xCDA8},{0x901B, 0xB9E4},{0x901C, 0xDF41}, - {0x901D, 0xCAC5},{0x901E, 0xB3D1},{0x901F, 0xCBD9},{0x9020, 0xD4EC},{0x9021, 0xE5D2},{0x9022, 0xB7EA},{0x9023, 0xDF42},{0x9024, 0xDF43}, - {0x9025, 0xDF44},{0x9026, 0xE5CE},{0x9027, 0xDF45},{0x9028, 0xDF46},{0x9029, 0xDF47},{0x902A, 0xDF48},{0x902B, 0xDF49},{0x902C, 0xDF4A}, - {0x902D, 0xE5D5},{0x902E, 0xB4FE},{0x902F, 0xE5D6},{0x9030, 0xDF4B},{0x9031, 0xDF4C},{0x9032, 0xDF4D},{0x9033, 0xDF4E},{0x9034, 0xDF4F}, - {0x9035, 0xE5D3},{0x9036, 0xE5D4},{0x9037, 0xDF50},{0x9038, 0xD2DD},{0x9039, 0xDF51},{0x903A, 0xDF52},{0x903B, 0xC2DF},{0x903C, 0xB1C6}, - {0x903D, 0xDF53},{0x903E, 0xD3E2},{0x903F, 0xDF54},{0x9040, 0xDF55},{0x9041, 0xB6DD},{0x9042, 0xCBEC},{0x9043, 0xDF56},{0x9044, 0xE5D7}, - {0x9045, 0xDF57},{0x9046, 0xDF58},{0x9047, 0xD3F6},{0x9048, 0xDF59},{0x9049, 0xDF5A},{0x904A, 0xDF5B},{0x904B, 0xDF5C},{0x904C, 0xDF5D}, - {0x904D, 0xB1E9},{0x904E, 0xDF5E},{0x904F, 0xB6F4},{0x9050, 0xE5DA},{0x9051, 0xE5D8},{0x9052, 0xE5D9},{0x9053, 0xB5C0},{0x9054, 0xDF5F}, - {0x9055, 0xDF60},{0x9056, 0xDF61},{0x9057, 0xD2C5},{0x9058, 0xE5DC},{0x9059, 0xDF62},{0x905A, 0xDF63},{0x905B, 0xE5DE},{0x905C, 0xDF64}, - {0x905D, 0xDF65},{0x905E, 0xDF66},{0x905F, 0xDF67},{0x9060, 0xDF68},{0x9061, 0xDF69},{0x9062, 0xE5DD},{0x9063, 0xC7B2},{0x9064, 0xDF6A}, - {0x9065, 0xD2A3},{0x9066, 0xDF6B},{0x9067, 0xDF6C},{0x9068, 0xE5DB},{0x9069, 0xDF6D},{0x906A, 0xDF6E},{0x906B, 0xDF6F},{0x906C, 0xDF70}, - {0x906D, 0xD4E2},{0x906E, 0xD5DA},{0x906F, 0xDF71},{0x9070, 0xDF72},{0x9071, 0xDF73},{0x9072, 0xDF74},{0x9073, 0xDF75},{0x9074, 0xE5E0}, - {0x9075, 0xD7F1},{0x9076, 0xDF76},{0x9077, 0xDF77},{0x9078, 0xDF78},{0x9079, 0xDF79},{0x907A, 0xDF7A},{0x907B, 0xDF7B},{0x907C, 0xDF7C}, - {0x907D, 0xE5E1},{0x907E, 0xDF7D},{0x907F, 0xB1DC},{0x9080, 0xD1FB},{0x9081, 0xDF7E},{0x9082, 0xE5E2},{0x9083, 0xE5E4},{0x9084, 0xDF80}, - {0x9085, 0xDF81},{0x9086, 0xDF82},{0x9087, 0xDF83},{0x9088, 0xE5E3},{0x9089, 0xDF84},{0x908A, 0xDF85},{0x908B, 0xE5E5},{0x908C, 0xDF86}, - {0x908D, 0xDF87},{0x908E, 0xDF88},{0x908F, 0xDF89},{0x9090, 0xDF8A},{0x9091, 0xD2D8},{0x9092, 0xDF8B},{0x9093, 0xB5CB},{0x9094, 0xDF8C}, - {0x9095, 0xE7DF},{0x9096, 0xDF8D},{0x9097, 0xDAF5},{0x9098, 0xDF8E},{0x9099, 0xDAF8},{0x909A, 0xDF8F},{0x909B, 0xDAF6},{0x909C, 0xDF90}, - {0x909D, 0xDAF7},{0x909E, 0xDF91},{0x909F, 0xDF92},{0x90A0, 0xDF93},{0x90A1, 0xDAFA},{0x90A2, 0xD0CF},{0x90A3, 0xC4C7},{0x90A4, 0xDF94}, - {0x90A5, 0xDF95},{0x90A6, 0xB0EE},{0x90A7, 0xDF96},{0x90A8, 0xDF97},{0x90A9, 0xDF98},{0x90AA, 0xD0B0},{0x90AB, 0xDF99},{0x90AC, 0xDAF9}, - {0x90AD, 0xDF9A},{0x90AE, 0xD3CA},{0x90AF, 0xBAAA},{0x90B0, 0xDBA2},{0x90B1, 0xC7F1},{0x90B2, 0xDF9B},{0x90B3, 0xDAFC},{0x90B4, 0xDAFB}, - {0x90B5, 0xC9DB},{0x90B6, 0xDAFD},{0x90B7, 0xDF9C},{0x90B8, 0xDBA1},{0x90B9, 0xD7DE},{0x90BA, 0xDAFE},{0x90BB, 0xC1DA},{0x90BC, 0xDF9D}, - {0x90BD, 0xDF9E},{0x90BE, 0xDBA5},{0x90BF, 0xDF9F},{0x90C0, 0xDFA0},{0x90C1, 0xD3F4},{0x90C2, 0xE040},{0x90C3, 0xE041},{0x90C4, 0xDBA7}, - {0x90C5, 0xDBA4},{0x90C6, 0xE042},{0x90C7, 0xDBA8},{0x90C8, 0xE043},{0x90C9, 0xE044},{0x90CA, 0xBDBC},{0x90CB, 0xE045},{0x90CC, 0xE046}, - {0x90CD, 0xE047},{0x90CE, 0xC0C9},{0x90CF, 0xDBA3},{0x90D0, 0xDBA6},{0x90D1, 0xD6A3},{0x90D2, 0xE048},{0x90D3, 0xDBA9},{0x90D4, 0xE049}, - {0x90D5, 0xE04A},{0x90D6, 0xE04B},{0x90D7, 0xDBAD},{0x90D8, 0xE04C},{0x90D9, 0xE04D},{0x90DA, 0xE04E},{0x90DB, 0xDBAE},{0x90DC, 0xDBAC}, - {0x90DD, 0xBAC2},{0x90DE, 0xE04F},{0x90DF, 0xE050},{0x90E0, 0xE051},{0x90E1, 0xBFA4},{0x90E2, 0xDBAB},{0x90E3, 0xE052},{0x90E4, 0xE053}, - {0x90E5, 0xE054},{0x90E6, 0xDBAA},{0x90E7, 0xD4C7},{0x90E8, 0xB2BF},{0x90E9, 0xE055},{0x90EA, 0xE056},{0x90EB, 0xDBAF},{0x90EC, 0xE057}, - {0x90ED, 0xB9F9},{0x90EE, 0xE058},{0x90EF, 0xDBB0},{0x90F0, 0xE059},{0x90F1, 0xE05A},{0x90F2, 0xE05B},{0x90F3, 0xE05C},{0x90F4, 0xB3BB}, - {0x90F5, 0xE05D},{0x90F6, 0xE05E},{0x90F7, 0xE05F},{0x90F8, 0xB5A6},{0x90F9, 0xE060},{0x90FA, 0xE061},{0x90FB, 0xE062},{0x90FC, 0xE063}, - {0x90FD, 0xB6BC},{0x90FE, 0xDBB1},{0x90FF, 0xE064},{0x9100, 0xE065},{0x9101, 0xE066},{0x9102, 0xB6F5},{0x9103, 0xE067},{0x9104, 0xDBB2}, - {0x9105, 0xE068},{0x9106, 0xE069},{0x9107, 0xE06A},{0x9108, 0xE06B},{0x9109, 0xE06C},{0x910A, 0xE06D},{0x910B, 0xE06E},{0x910C, 0xE06F}, - {0x910D, 0xE070},{0x910E, 0xE071},{0x910F, 0xE072},{0x9110, 0xE073},{0x9111, 0xE074},{0x9112, 0xE075},{0x9113, 0xE076},{0x9114, 0xE077}, - {0x9115, 0xE078},{0x9116, 0xE079},{0x9117, 0xE07A},{0x9118, 0xE07B},{0x9119, 0xB1C9},{0x911A, 0xE07C},{0x911B, 0xE07D},{0x911C, 0xE07E}, - {0x911D, 0xE080},{0x911E, 0xDBB4},{0x911F, 0xE081},{0x9120, 0xE082},{0x9121, 0xE083},{0x9122, 0xDBB3},{0x9123, 0xDBB5},{0x9124, 0xE084}, - {0x9125, 0xE085},{0x9126, 0xE086},{0x9127, 0xE087},{0x9128, 0xE088},{0x9129, 0xE089},{0x912A, 0xE08A},{0x912B, 0xE08B},{0x912C, 0xE08C}, - {0x912D, 0xE08D},{0x912E, 0xE08E},{0x912F, 0xDBB7},{0x9130, 0xE08F},{0x9131, 0xDBB6},{0x9132, 0xE090},{0x9133, 0xE091},{0x9134, 0xE092}, - {0x9135, 0xE093},{0x9136, 0xE094},{0x9137, 0xE095},{0x9138, 0xE096},{0x9139, 0xDBB8},{0x913A, 0xE097},{0x913B, 0xE098},{0x913C, 0xE099}, - {0x913D, 0xE09A},{0x913E, 0xE09B},{0x913F, 0xE09C},{0x9140, 0xE09D},{0x9141, 0xE09E},{0x9142, 0xE09F},{0x9143, 0xDBB9},{0x9144, 0xE0A0}, - {0x9145, 0xE140},{0x9146, 0xDBBA},{0x9147, 0xE141},{0x9148, 0xE142},{0x9149, 0xD3CF},{0x914A, 0xF4FA},{0x914B, 0xC7F5},{0x914C, 0xD7C3}, - {0x914D, 0xC5E4},{0x914E, 0xF4FC},{0x914F, 0xF4FD},{0x9150, 0xF4FB},{0x9151, 0xE143},{0x9152, 0xBEC6},{0x9153, 0xE144},{0x9154, 0xE145}, - {0x9155, 0xE146},{0x9156, 0xE147},{0x9157, 0xD0EF},{0x9158, 0xE148},{0x9159, 0xE149},{0x915A, 0xB7D3},{0x915B, 0xE14A},{0x915C, 0xE14B}, - {0x915D, 0xD4CD},{0x915E, 0xCCAA},{0x915F, 0xE14C},{0x9160, 0xE14D},{0x9161, 0xF5A2},{0x9162, 0xF5A1},{0x9163, 0xBAA8},{0x9164, 0xF4FE}, - {0x9165, 0xCBD6},{0x9166, 0xE14E},{0x9167, 0xE14F},{0x9168, 0xE150},{0x9169, 0xF5A4},{0x916A, 0xC0D2},{0x916B, 0xE151},{0x916C, 0xB3EA}, - {0x916D, 0xE152},{0x916E, 0xCDAA},{0x916F, 0xF5A5},{0x9170, 0xF5A3},{0x9171, 0xBDB4},{0x9172, 0xF5A8},{0x9173, 0xE153},{0x9174, 0xF5A9}, - {0x9175, 0xBDCD},{0x9176, 0xC3B8},{0x9177, 0xBFE1},{0x9178, 0xCBE1},{0x9179, 0xF5AA},{0x917A, 0xE154},{0x917B, 0xE155},{0x917C, 0xE156}, - {0x917D, 0xF5A6},{0x917E, 0xF5A7},{0x917F, 0xC4F0},{0x9180, 0xE157},{0x9181, 0xE158},{0x9182, 0xE159},{0x9183, 0xE15A},{0x9184, 0xE15B}, - {0x9185, 0xF5AC},{0x9186, 0xE15C},{0x9187, 0xB4BC},{0x9188, 0xE15D},{0x9189, 0xD7ED},{0x918A, 0xE15E},{0x918B, 0xB4D7},{0x918C, 0xF5AB}, - {0x918D, 0xF5AE},{0x918E, 0xE15F},{0x918F, 0xE160},{0x9190, 0xF5AD},{0x9191, 0xF5AF},{0x9192, 0xD0D1},{0x9193, 0xE161},{0x9194, 0xE162}, - {0x9195, 0xE163},{0x9196, 0xE164},{0x9197, 0xE165},{0x9198, 0xE166},{0x9199, 0xE167},{0x919A, 0xC3D1},{0x919B, 0xC8A9},{0x919C, 0xE168}, - {0x919D, 0xE169},{0x919E, 0xE16A},{0x919F, 0xE16B},{0x91A0, 0xE16C},{0x91A1, 0xE16D},{0x91A2, 0xF5B0},{0x91A3, 0xF5B1},{0x91A4, 0xE16E}, - {0x91A5, 0xE16F},{0x91A6, 0xE170},{0x91A7, 0xE171},{0x91A8, 0xE172},{0x91A9, 0xE173},{0x91AA, 0xF5B2},{0x91AB, 0xE174},{0x91AC, 0xE175}, - {0x91AD, 0xF5B3},{0x91AE, 0xF5B4},{0x91AF, 0xF5B5},{0x91B0, 0xE176},{0x91B1, 0xE177},{0x91B2, 0xE178},{0x91B3, 0xE179},{0x91B4, 0xF5B7}, - {0x91B5, 0xF5B6},{0x91B6, 0xE17A},{0x91B7, 0xE17B},{0x91B8, 0xE17C},{0x91B9, 0xE17D},{0x91BA, 0xF5B8},{0x91BB, 0xE17E},{0x91BC, 0xE180}, - {0x91BD, 0xE181},{0x91BE, 0xE182},{0x91BF, 0xE183},{0x91C0, 0xE184},{0x91C1, 0xE185},{0x91C2, 0xE186},{0x91C3, 0xE187},{0x91C4, 0xE188}, - {0x91C5, 0xE189},{0x91C6, 0xE18A},{0x91C7, 0xB2C9},{0x91C8, 0xE18B},{0x91C9, 0xD3D4},{0x91CA, 0xCACD},{0x91CB, 0xE18C},{0x91CC, 0xC0EF}, - {0x91CD, 0xD6D8},{0x91CE, 0xD2B0},{0x91CF, 0xC1BF},{0x91D0, 0xE18D},{0x91D1, 0xBDF0},{0x91D2, 0xE18E},{0x91D3, 0xE18F},{0x91D4, 0xE190}, - {0x91D5, 0xE191},{0x91D6, 0xE192},{0x91D7, 0xE193},{0x91D8, 0xE194},{0x91D9, 0xE195},{0x91DA, 0xE196},{0x91DB, 0xE197},{0x91DC, 0xB8AA}, - {0x91DD, 0xE198},{0x91DE, 0xE199},{0x91DF, 0xE19A},{0x91E0, 0xE19B},{0x91E1, 0xE19C},{0x91E2, 0xE19D},{0x91E3, 0xE19E},{0x91E4, 0xE19F}, - {0x91E5, 0xE1A0},{0x91E6, 0xE240},{0x91E7, 0xE241},{0x91E8, 0xE242},{0x91E9, 0xE243},{0x91EA, 0xE244},{0x91EB, 0xE245},{0x91EC, 0xE246}, - {0x91ED, 0xE247},{0x91EE, 0xE248},{0x91EF, 0xE249},{0x91F0, 0xE24A},{0x91F1, 0xE24B},{0x91F2, 0xE24C},{0x91F3, 0xE24D},{0x91F4, 0xE24E}, - {0x91F5, 0xE24F},{0x91F6, 0xE250},{0x91F7, 0xE251},{0x91F8, 0xE252},{0x91F9, 0xE253},{0x91FA, 0xE254},{0x91FB, 0xE255},{0x91FC, 0xE256}, - {0x91FD, 0xE257},{0x91FE, 0xE258},{0x91FF, 0xE259},{0x9200, 0xE25A},{0x9201, 0xE25B},{0x9202, 0xE25C},{0x9203, 0xE25D},{0x9204, 0xE25E}, - {0x9205, 0xE25F},{0x9206, 0xE260},{0x9207, 0xE261},{0x9208, 0xE262},{0x9209, 0xE263},{0x920A, 0xE264},{0x920B, 0xE265},{0x920C, 0xE266}, - {0x920D, 0xE267},{0x920E, 0xE268},{0x920F, 0xE269},{0x9210, 0xE26A},{0x9211, 0xE26B},{0x9212, 0xE26C},{0x9213, 0xE26D},{0x9214, 0xE26E}, - {0x9215, 0xE26F},{0x9216, 0xE270},{0x9217, 0xE271},{0x9218, 0xE272},{0x9219, 0xE273},{0x921A, 0xE274},{0x921B, 0xE275},{0x921C, 0xE276}, - {0x921D, 0xE277},{0x921E, 0xE278},{0x921F, 0xE279},{0x9220, 0xE27A},{0x9221, 0xE27B},{0x9222, 0xE27C},{0x9223, 0xE27D},{0x9224, 0xE27E}, - {0x9225, 0xE280},{0x9226, 0xE281},{0x9227, 0xE282},{0x9228, 0xE283},{0x9229, 0xE284},{0x922A, 0xE285},{0x922B, 0xE286},{0x922C, 0xE287}, - {0x922D, 0xE288},{0x922E, 0xE289},{0x922F, 0xE28A},{0x9230, 0xE28B},{0x9231, 0xE28C},{0x9232, 0xE28D},{0x9233, 0xE28E},{0x9234, 0xE28F}, - {0x9235, 0xE290},{0x9236, 0xE291},{0x9237, 0xE292},{0x9238, 0xE293},{0x9239, 0xE294},{0x923A, 0xE295},{0x923B, 0xE296},{0x923C, 0xE297}, - {0x923D, 0xE298},{0x923E, 0xE299},{0x923F, 0xE29A},{0x9240, 0xE29B},{0x9241, 0xE29C},{0x9242, 0xE29D},{0x9243, 0xE29E},{0x9244, 0xE29F}, - {0x9245, 0xE2A0},{0x9246, 0xE340},{0x9247, 0xE341},{0x9248, 0xE342},{0x9249, 0xE343},{0x924A, 0xE344},{0x924B, 0xE345},{0x924C, 0xE346}, - {0x924D, 0xE347},{0x924E, 0xE348},{0x924F, 0xE349},{0x9250, 0xE34A},{0x9251, 0xE34B},{0x9252, 0xE34C},{0x9253, 0xE34D},{0x9254, 0xE34E}, - {0x9255, 0xE34F},{0x9256, 0xE350},{0x9257, 0xE351},{0x9258, 0xE352},{0x9259, 0xE353},{0x925A, 0xE354},{0x925B, 0xE355},{0x925C, 0xE356}, - {0x925D, 0xE357},{0x925E, 0xE358},{0x925F, 0xE359},{0x9260, 0xE35A},{0x9261, 0xE35B},{0x9262, 0xE35C},{0x9263, 0xE35D},{0x9264, 0xE35E}, - {0x9265, 0xE35F},{0x9266, 0xE360},{0x9267, 0xE361},{0x9268, 0xE362},{0x9269, 0xE363},{0x926A, 0xE364},{0x926B, 0xE365},{0x926C, 0xE366}, - {0x926D, 0xE367},{0x926E, 0xE368},{0x926F, 0xE369},{0x9270, 0xE36A},{0x9271, 0xE36B},{0x9272, 0xE36C},{0x9273, 0xE36D},{0x9274, 0xBCF8}, - {0x9275, 0xE36E},{0x9276, 0xE36F},{0x9277, 0xE370},{0x9278, 0xE371},{0x9279, 0xE372},{0x927A, 0xE373},{0x927B, 0xE374},{0x927C, 0xE375}, - {0x927D, 0xE376},{0x927E, 0xE377},{0x927F, 0xE378},{0x9280, 0xE379},{0x9281, 0xE37A},{0x9282, 0xE37B},{0x9283, 0xE37C},{0x9284, 0xE37D}, - {0x9285, 0xE37E},{0x9286, 0xE380},{0x9287, 0xE381},{0x9288, 0xE382},{0x9289, 0xE383},{0x928A, 0xE384},{0x928B, 0xE385},{0x928C, 0xE386}, - {0x928D, 0xE387},{0x928E, 0xF6C6},{0x928F, 0xE388},{0x9290, 0xE389},{0x9291, 0xE38A},{0x9292, 0xE38B},{0x9293, 0xE38C},{0x9294, 0xE38D}, - {0x9295, 0xE38E},{0x9296, 0xE38F},{0x9297, 0xE390},{0x9298, 0xE391},{0x9299, 0xE392},{0x929A, 0xE393},{0x929B, 0xE394},{0x929C, 0xE395}, - {0x929D, 0xE396},{0x929E, 0xE397},{0x929F, 0xE398},{0x92A0, 0xE399},{0x92A1, 0xE39A},{0x92A2, 0xE39B},{0x92A3, 0xE39C},{0x92A4, 0xE39D}, - {0x92A5, 0xE39E},{0x92A6, 0xE39F},{0x92A7, 0xE3A0},{0x92A8, 0xE440},{0x92A9, 0xE441},{0x92AA, 0xE442},{0x92AB, 0xE443},{0x92AC, 0xE444}, - {0x92AD, 0xE445},{0x92AE, 0xF6C7},{0x92AF, 0xE446},{0x92B0, 0xE447},{0x92B1, 0xE448},{0x92B2, 0xE449},{0x92B3, 0xE44A},{0x92B4, 0xE44B}, - {0x92B5, 0xE44C},{0x92B6, 0xE44D},{0x92B7, 0xE44E},{0x92B8, 0xE44F},{0x92B9, 0xE450},{0x92BA, 0xE451},{0x92BB, 0xE452},{0x92BC, 0xE453}, - {0x92BD, 0xE454},{0x92BE, 0xE455},{0x92BF, 0xE456},{0x92C0, 0xE457},{0x92C1, 0xE458},{0x92C2, 0xE459},{0x92C3, 0xE45A},{0x92C4, 0xE45B}, - {0x92C5, 0xE45C},{0x92C6, 0xE45D},{0x92C7, 0xE45E},{0x92C8, 0xF6C8},{0x92C9, 0xE45F},{0x92CA, 0xE460},{0x92CB, 0xE461},{0x92CC, 0xE462}, - {0x92CD, 0xE463},{0x92CE, 0xE464},{0x92CF, 0xE465},{0x92D0, 0xE466},{0x92D1, 0xE467},{0x92D2, 0xE468},{0x92D3, 0xE469},{0x92D4, 0xE46A}, - {0x92D5, 0xE46B},{0x92D6, 0xE46C},{0x92D7, 0xE46D},{0x92D8, 0xE46E},{0x92D9, 0xE46F},{0x92DA, 0xE470},{0x92DB, 0xE471},{0x92DC, 0xE472}, - {0x92DD, 0xE473},{0x92DE, 0xE474},{0x92DF, 0xE475},{0x92E0, 0xE476},{0x92E1, 0xE477},{0x92E2, 0xE478},{0x92E3, 0xE479},{0x92E4, 0xE47A}, - {0x92E5, 0xE47B},{0x92E6, 0xE47C},{0x92E7, 0xE47D},{0x92E8, 0xE47E},{0x92E9, 0xE480},{0x92EA, 0xE481},{0x92EB, 0xE482},{0x92EC, 0xE483}, - {0x92ED, 0xE484},{0x92EE, 0xE485},{0x92EF, 0xE486},{0x92F0, 0xE487},{0x92F1, 0xE488},{0x92F2, 0xE489},{0x92F3, 0xE48A},{0x92F4, 0xE48B}, - {0x92F5, 0xE48C},{0x92F6, 0xE48D},{0x92F7, 0xE48E},{0x92F8, 0xE48F},{0x92F9, 0xE490},{0x92FA, 0xE491},{0x92FB, 0xE492},{0x92FC, 0xE493}, - {0x92FD, 0xE494},{0x92FE, 0xE495},{0x92FF, 0xE496},{0x9300, 0xE497},{0x9301, 0xE498},{0x9302, 0xE499},{0x9303, 0xE49A},{0x9304, 0xE49B}, - {0x9305, 0xE49C},{0x9306, 0xE49D},{0x9307, 0xE49E},{0x9308, 0xE49F},{0x9309, 0xE4A0},{0x930A, 0xE540},{0x930B, 0xE541},{0x930C, 0xE542}, - {0x930D, 0xE543},{0x930E, 0xE544},{0x930F, 0xE545},{0x9310, 0xE546},{0x9311, 0xE547},{0x9312, 0xE548},{0x9313, 0xE549},{0x9314, 0xE54A}, - {0x9315, 0xE54B},{0x9316, 0xE54C},{0x9317, 0xE54D},{0x9318, 0xE54E},{0x9319, 0xE54F},{0x931A, 0xE550},{0x931B, 0xE551},{0x931C, 0xE552}, - {0x931D, 0xE553},{0x931E, 0xE554},{0x931F, 0xE555},{0x9320, 0xE556},{0x9321, 0xE557},{0x9322, 0xE558},{0x9323, 0xE559},{0x9324, 0xE55A}, - {0x9325, 0xE55B},{0x9326, 0xE55C},{0x9327, 0xE55D},{0x9328, 0xE55E},{0x9329, 0xE55F},{0x932A, 0xE560},{0x932B, 0xE561},{0x932C, 0xE562}, - {0x932D, 0xE563},{0x932E, 0xE564},{0x932F, 0xE565},{0x9330, 0xE566},{0x9331, 0xE567},{0x9332, 0xE568},{0x9333, 0xE569},{0x9334, 0xE56A}, - {0x9335, 0xE56B},{0x9336, 0xE56C},{0x9337, 0xE56D},{0x9338, 0xE56E},{0x9339, 0xE56F},{0x933A, 0xE570},{0x933B, 0xE571},{0x933C, 0xE572}, - {0x933D, 0xE573},{0x933E, 0xF6C9},{0x933F, 0xE574},{0x9340, 0xE575},{0x9341, 0xE576},{0x9342, 0xE577},{0x9343, 0xE578},{0x9344, 0xE579}, - {0x9345, 0xE57A},{0x9346, 0xE57B},{0x9347, 0xE57C},{0x9348, 0xE57D},{0x9349, 0xE57E},{0x934A, 0xE580},{0x934B, 0xE581},{0x934C, 0xE582}, - {0x934D, 0xE583},{0x934E, 0xE584},{0x934F, 0xE585},{0x9350, 0xE586},{0x9351, 0xE587},{0x9352, 0xE588},{0x9353, 0xE589},{0x9354, 0xE58A}, - {0x9355, 0xE58B},{0x9356, 0xE58C},{0x9357, 0xE58D},{0x9358, 0xE58E},{0x9359, 0xE58F},{0x935A, 0xE590},{0x935B, 0xE591},{0x935C, 0xE592}, - {0x935D, 0xE593},{0x935E, 0xE594},{0x935F, 0xE595},{0x9360, 0xE596},{0x9361, 0xE597},{0x9362, 0xE598},{0x9363, 0xE599},{0x9364, 0xE59A}, - {0x9365, 0xE59B},{0x9366, 0xE59C},{0x9367, 0xE59D},{0x9368, 0xE59E},{0x9369, 0xE59F},{0x936A, 0xF6CA},{0x936B, 0xE5A0},{0x936C, 0xE640}, - {0x936D, 0xE641},{0x936E, 0xE642},{0x936F, 0xE643},{0x9370, 0xE644},{0x9371, 0xE645},{0x9372, 0xE646},{0x9373, 0xE647},{0x9374, 0xE648}, - {0x9375, 0xE649},{0x9376, 0xE64A},{0x9377, 0xE64B},{0x9378, 0xE64C},{0x9379, 0xE64D},{0x937A, 0xE64E},{0x937B, 0xE64F},{0x937C, 0xE650}, - {0x937D, 0xE651},{0x937E, 0xE652},{0x937F, 0xE653},{0x9380, 0xE654},{0x9381, 0xE655},{0x9382, 0xE656},{0x9383, 0xE657},{0x9384, 0xE658}, - {0x9385, 0xE659},{0x9386, 0xE65A},{0x9387, 0xE65B},{0x9388, 0xE65C},{0x9389, 0xE65D},{0x938A, 0xE65E},{0x938B, 0xE65F},{0x938C, 0xE660}, - {0x938D, 0xE661},{0x938E, 0xE662},{0x938F, 0xF6CC},{0x9390, 0xE663},{0x9391, 0xE664},{0x9392, 0xE665},{0x9393, 0xE666},{0x9394, 0xE667}, - {0x9395, 0xE668},{0x9396, 0xE669},{0x9397, 0xE66A},{0x9398, 0xE66B},{0x9399, 0xE66C},{0x939A, 0xE66D},{0x939B, 0xE66E},{0x939C, 0xE66F}, - {0x939D, 0xE670},{0x939E, 0xE671},{0x939F, 0xE672},{0x93A0, 0xE673},{0x93A1, 0xE674},{0x93A2, 0xE675},{0x93A3, 0xE676},{0x93A4, 0xE677}, - {0x93A5, 0xE678},{0x93A6, 0xE679},{0x93A7, 0xE67A},{0x93A8, 0xE67B},{0x93A9, 0xE67C},{0x93AA, 0xE67D},{0x93AB, 0xE67E},{0x93AC, 0xE680}, - {0x93AD, 0xE681},{0x93AE, 0xE682},{0x93AF, 0xE683},{0x93B0, 0xE684},{0x93B1, 0xE685},{0x93B2, 0xE686},{0x93B3, 0xE687},{0x93B4, 0xE688}, - {0x93B5, 0xE689},{0x93B6, 0xE68A},{0x93B7, 0xE68B},{0x93B8, 0xE68C},{0x93B9, 0xE68D},{0x93BA, 0xE68E},{0x93BB, 0xE68F},{0x93BC, 0xE690}, - {0x93BD, 0xE691},{0x93BE, 0xE692},{0x93BF, 0xE693},{0x93C0, 0xE694},{0x93C1, 0xE695},{0x93C2, 0xE696},{0x93C3, 0xE697},{0x93C4, 0xE698}, - {0x93C5, 0xE699},{0x93C6, 0xE69A},{0x93C7, 0xE69B},{0x93C8, 0xE69C},{0x93C9, 0xE69D},{0x93CA, 0xF6CB},{0x93CB, 0xE69E},{0x93CC, 0xE69F}, - {0x93CD, 0xE6A0},{0x93CE, 0xE740},{0x93CF, 0xE741},{0x93D0, 0xE742},{0x93D1, 0xE743},{0x93D2, 0xE744},{0x93D3, 0xE745},{0x93D4, 0xE746}, - {0x93D5, 0xE747},{0x93D6, 0xF7E9},{0x93D7, 0xE748},{0x93D8, 0xE749},{0x93D9, 0xE74A},{0x93DA, 0xE74B},{0x93DB, 0xE74C},{0x93DC, 0xE74D}, - {0x93DD, 0xE74E},{0x93DE, 0xE74F},{0x93DF, 0xE750},{0x93E0, 0xE751},{0x93E1, 0xE752},{0x93E2, 0xE753},{0x93E3, 0xE754},{0x93E4, 0xE755}, - {0x93E5, 0xE756},{0x93E6, 0xE757},{0x93E7, 0xE758},{0x93E8, 0xE759},{0x93E9, 0xE75A},{0x93EA, 0xE75B},{0x93EB, 0xE75C},{0x93EC, 0xE75D}, - {0x93ED, 0xE75E},{0x93EE, 0xE75F},{0x93EF, 0xE760},{0x93F0, 0xE761},{0x93F1, 0xE762},{0x93F2, 0xE763},{0x93F3, 0xE764},{0x93F4, 0xE765}, - {0x93F5, 0xE766},{0x93F6, 0xE767},{0x93F7, 0xE768},{0x93F8, 0xE769},{0x93F9, 0xE76A},{0x93FA, 0xE76B},{0x93FB, 0xE76C},{0x93FC, 0xE76D}, - {0x93FD, 0xE76E},{0x93FE, 0xE76F},{0x93FF, 0xE770},{0x9400, 0xE771},{0x9401, 0xE772},{0x9402, 0xE773},{0x9403, 0xE774},{0x9404, 0xE775}, - {0x9405, 0xE776},{0x9406, 0xE777},{0x9407, 0xE778},{0x9408, 0xE779},{0x9409, 0xE77A},{0x940A, 0xE77B},{0x940B, 0xE77C},{0x940C, 0xE77D}, - {0x940D, 0xE77E},{0x940E, 0xE780},{0x940F, 0xE781},{0x9410, 0xE782},{0x9411, 0xE783},{0x9412, 0xE784},{0x9413, 0xE785},{0x9414, 0xE786}, - {0x9415, 0xE787},{0x9416, 0xE788},{0x9417, 0xE789},{0x9418, 0xE78A},{0x9419, 0xE78B},{0x941A, 0xE78C},{0x941B, 0xE78D},{0x941C, 0xE78E}, - {0x941D, 0xE78F},{0x941E, 0xE790},{0x941F, 0xE791},{0x9420, 0xE792},{0x9421, 0xE793},{0x9422, 0xE794},{0x9423, 0xE795},{0x9424, 0xE796}, - {0x9425, 0xE797},{0x9426, 0xE798},{0x9427, 0xE799},{0x9428, 0xE79A},{0x9429, 0xE79B},{0x942A, 0xE79C},{0x942B, 0xE79D},{0x942C, 0xE79E}, - {0x942D, 0xE79F},{0x942E, 0xE7A0},{0x942F, 0xE840},{0x9430, 0xE841},{0x9431, 0xE842},{0x9432, 0xE843},{0x9433, 0xE844},{0x9434, 0xE845}, - {0x9435, 0xE846},{0x9436, 0xE847},{0x9437, 0xE848},{0x9438, 0xE849},{0x9439, 0xE84A},{0x943A, 0xE84B},{0x943B, 0xE84C},{0x943C, 0xE84D}, - {0x943D, 0xE84E},{0x943E, 0xF6CD},{0x943F, 0xE84F},{0x9440, 0xE850},{0x9441, 0xE851},{0x9442, 0xE852},{0x9443, 0xE853},{0x9444, 0xE854}, - {0x9445, 0xE855},{0x9446, 0xE856},{0x9447, 0xE857},{0x9448, 0xE858},{0x9449, 0xE859},{0x944A, 0xE85A},{0x944B, 0xE85B},{0x944C, 0xE85C}, - {0x944D, 0xE85D},{0x944E, 0xE85E},{0x944F, 0xE85F},{0x9450, 0xE860},{0x9451, 0xE861},{0x9452, 0xE862},{0x9453, 0xE863},{0x9454, 0xE864}, - {0x9455, 0xE865},{0x9456, 0xE866},{0x9457, 0xE867},{0x9458, 0xE868},{0x9459, 0xE869},{0x945A, 0xE86A},{0x945B, 0xE86B},{0x945C, 0xE86C}, - {0x945D, 0xE86D},{0x945E, 0xE86E},{0x945F, 0xE86F},{0x9460, 0xE870},{0x9461, 0xE871},{0x9462, 0xE872},{0x9463, 0xE873},{0x9464, 0xE874}, - {0x9465, 0xE875},{0x9466, 0xE876},{0x9467, 0xE877},{0x9468, 0xE878},{0x9469, 0xE879},{0x946A, 0xE87A},{0x946B, 0xF6CE},{0x946C, 0xE87B}, - {0x946D, 0xE87C},{0x946E, 0xE87D},{0x946F, 0xE87E},{0x9470, 0xE880},{0x9471, 0xE881},{0x9472, 0xE882},{0x9473, 0xE883},{0x9474, 0xE884}, - {0x9475, 0xE885},{0x9476, 0xE886},{0x9477, 0xE887},{0x9478, 0xE888},{0x9479, 0xE889},{0x947A, 0xE88A},{0x947B, 0xE88B},{0x947C, 0xE88C}, - {0x947D, 0xE88D},{0x947E, 0xE88E},{0x947F, 0xE88F},{0x9480, 0xE890},{0x9481, 0xE891},{0x9482, 0xE892},{0x9483, 0xE893},{0x9484, 0xE894}, - {0x9485, 0xEEC4},{0x9486, 0xEEC5},{0x9487, 0xEEC6},{0x9488, 0xD5EB},{0x9489, 0xB6A4},{0x948A, 0xEEC8},{0x948B, 0xEEC7},{0x948C, 0xEEC9}, - {0x948D, 0xEECA},{0x948E, 0xC7A5},{0x948F, 0xEECB},{0x9490, 0xEECC},{0x9491, 0xE895},{0x9492, 0xB7B0},{0x9493, 0xB5F6},{0x9494, 0xEECD}, - {0x9495, 0xEECF},{0x9496, 0xE896},{0x9497, 0xEECE},{0x9498, 0xE897},{0x9499, 0xB8C6},{0x949A, 0xEED0},{0x949B, 0xEED1},{0x949C, 0xEED2}, - {0x949D, 0xB6DB},{0x949E, 0xB3AE},{0x949F, 0xD6D3},{0x94A0, 0xC4C6},{0x94A1, 0xB1B5},{0x94A2, 0xB8D6},{0x94A3, 0xEED3},{0x94A4, 0xEED4}, - {0x94A5, 0xD4BF},{0x94A6, 0xC7D5},{0x94A7, 0xBEFB},{0x94A8, 0xCED9},{0x94A9, 0xB9B3},{0x94AA, 0xEED6},{0x94AB, 0xEED5},{0x94AC, 0xEED8}, - {0x94AD, 0xEED7},{0x94AE, 0xC5A5},{0x94AF, 0xEED9},{0x94B0, 0xEEDA},{0x94B1, 0xC7AE},{0x94B2, 0xEEDB},{0x94B3, 0xC7AF},{0x94B4, 0xEEDC}, - {0x94B5, 0xB2A7},{0x94B6, 0xEEDD},{0x94B7, 0xEEDE},{0x94B8, 0xEEDF},{0x94B9, 0xEEE0},{0x94BA, 0xEEE1},{0x94BB, 0xD7EA},{0x94BC, 0xEEE2}, - {0x94BD, 0xEEE3},{0x94BE, 0xBCD8},{0x94BF, 0xEEE4},{0x94C0, 0xD3CB},{0x94C1, 0xCCFA},{0x94C2, 0xB2AC},{0x94C3, 0xC1E5},{0x94C4, 0xEEE5}, - {0x94C5, 0xC7A6},{0x94C6, 0xC3AD},{0x94C7, 0xE898},{0x94C8, 0xEEE6},{0x94C9, 0xEEE7},{0x94CA, 0xEEE8},{0x94CB, 0xEEE9},{0x94CC, 0xEEEA}, - {0x94CD, 0xEEEB},{0x94CE, 0xEEEC},{0x94CF, 0xE899},{0x94D0, 0xEEED},{0x94D1, 0xEEEE},{0x94D2, 0xEEEF},{0x94D3, 0xE89A},{0x94D4, 0xE89B}, - {0x94D5, 0xEEF0},{0x94D6, 0xEEF1},{0x94D7, 0xEEF2},{0x94D8, 0xEEF4},{0x94D9, 0xEEF3},{0x94DA, 0xE89C},{0x94DB, 0xEEF5},{0x94DC, 0xCDAD}, - {0x94DD, 0xC2C1},{0x94DE, 0xEEF6},{0x94DF, 0xEEF7},{0x94E0, 0xEEF8},{0x94E1, 0xD5A1},{0x94E2, 0xEEF9},{0x94E3, 0xCFB3},{0x94E4, 0xEEFA}, - {0x94E5, 0xEEFB},{0x94E6, 0xE89D},{0x94E7, 0xEEFC},{0x94E8, 0xEEFD},{0x94E9, 0xEFA1},{0x94EA, 0xEEFE},{0x94EB, 0xEFA2},{0x94EC, 0xB8F5}, - {0x94ED, 0xC3FA},{0x94EE, 0xEFA3},{0x94EF, 0xEFA4},{0x94F0, 0xBDC2},{0x94F1, 0xD2BF},{0x94F2, 0xB2F9},{0x94F3, 0xEFA5},{0x94F4, 0xEFA6}, - {0x94F5, 0xEFA7},{0x94F6, 0xD2F8},{0x94F7, 0xEFA8},{0x94F8, 0xD6FD},{0x94F9, 0xEFA9},{0x94FA, 0xC6CC},{0x94FB, 0xE89E},{0x94FC, 0xEFAA}, - {0x94FD, 0xEFAB},{0x94FE, 0xC1B4},{0x94FF, 0xEFAC},{0x9500, 0xCFFA},{0x9501, 0xCBF8},{0x9502, 0xEFAE},{0x9503, 0xEFAD},{0x9504, 0xB3FA}, - {0x9505, 0xB9F8},{0x9506, 0xEFAF},{0x9507, 0xEFB0},{0x9508, 0xD0E2},{0x9509, 0xEFB1},{0x950A, 0xEFB2},{0x950B, 0xB7E6},{0x950C, 0xD0BF}, - {0x950D, 0xEFB3},{0x950E, 0xEFB4},{0x950F, 0xEFB5},{0x9510, 0xC8F1},{0x9511, 0xCCE0},{0x9512, 0xEFB6},{0x9513, 0xEFB7},{0x9514, 0xEFB8}, - {0x9515, 0xEFB9},{0x9516, 0xEFBA},{0x9517, 0xD5E0},{0x9518, 0xEFBB},{0x9519, 0xB4ED},{0x951A, 0xC3AA},{0x951B, 0xEFBC},{0x951C, 0xE89F}, - {0x951D, 0xEFBD},{0x951E, 0xEFBE},{0x951F, 0xEFBF},{0x9520, 0xE8A0},{0x9521, 0xCEFD},{0x9522, 0xEFC0},{0x9523, 0xC2E0},{0x9524, 0xB4B8}, - {0x9525, 0xD7B6},{0x9526, 0xBDF5},{0x9527, 0xE940},{0x9528, 0xCFC7},{0x9529, 0xEFC3},{0x952A, 0xEFC1},{0x952B, 0xEFC2},{0x952C, 0xEFC4}, - {0x952D, 0xB6A7},{0x952E, 0xBCFC},{0x952F, 0xBEE2},{0x9530, 0xC3CC},{0x9531, 0xEFC5},{0x9532, 0xEFC6},{0x9533, 0xE941},{0x9534, 0xEFC7}, - {0x9535, 0xEFCF},{0x9536, 0xEFC8},{0x9537, 0xEFC9},{0x9538, 0xEFCA},{0x9539, 0xC7C2},{0x953A, 0xEFF1},{0x953B, 0xB6CD},{0x953C, 0xEFCB}, - {0x953D, 0xE942},{0x953E, 0xEFCC},{0x953F, 0xEFCD},{0x9540, 0xB6C6},{0x9541, 0xC3BE},{0x9542, 0xEFCE},{0x9543, 0xE943},{0x9544, 0xEFD0}, - {0x9545, 0xEFD1},{0x9546, 0xEFD2},{0x9547, 0xD5F2},{0x9548, 0xE944},{0x9549, 0xEFD3},{0x954A, 0xC4F7},{0x954B, 0xE945},{0x954C, 0xEFD4}, - {0x954D, 0xC4F8},{0x954E, 0xEFD5},{0x954F, 0xEFD6},{0x9550, 0xB8E4},{0x9551, 0xB0F7},{0x9552, 0xEFD7},{0x9553, 0xEFD8},{0x9554, 0xEFD9}, - {0x9555, 0xE946},{0x9556, 0xEFDA},{0x9557, 0xEFDB},{0x9558, 0xEFDC},{0x9559, 0xEFDD},{0x955A, 0xE947},{0x955B, 0xEFDE},{0x955C, 0xBEB5}, - {0x955D, 0xEFE1},{0x955E, 0xEFDF},{0x955F, 0xEFE0},{0x9560, 0xE948},{0x9561, 0xEFE2},{0x9562, 0xEFE3},{0x9563, 0xC1CD},{0x9564, 0xEFE4}, - {0x9565, 0xEFE5},{0x9566, 0xEFE6},{0x9567, 0xEFE7},{0x9568, 0xEFE8},{0x9569, 0xEFE9},{0x956A, 0xEFEA},{0x956B, 0xEFEB},{0x956C, 0xEFEC}, - {0x956D, 0xC0D8},{0x956E, 0xE949},{0x956F, 0xEFED},{0x9570, 0xC1AD},{0x9571, 0xEFEE},{0x9572, 0xEFEF},{0x9573, 0xEFF0},{0x9574, 0xE94A}, - {0x9575, 0xE94B},{0x9576, 0xCFE2},{0x9577, 0xE94C},{0x9578, 0xE94D},{0x9579, 0xE94E},{0x957A, 0xE94F},{0x957B, 0xE950},{0x957C, 0xE951}, - {0x957D, 0xE952},{0x957E, 0xE953},{0x957F, 0xB3A4},{0x9580, 0xE954},{0x9581, 0xE955},{0x9582, 0xE956},{0x9583, 0xE957},{0x9584, 0xE958}, - {0x9585, 0xE959},{0x9586, 0xE95A},{0x9587, 0xE95B},{0x9588, 0xE95C},{0x9589, 0xE95D},{0x958A, 0xE95E},{0x958B, 0xE95F},{0x958C, 0xE960}, - {0x958D, 0xE961},{0x958E, 0xE962},{0x958F, 0xE963},{0x9590, 0xE964},{0x9591, 0xE965},{0x9592, 0xE966},{0x9593, 0xE967},{0x9594, 0xE968}, - {0x9595, 0xE969},{0x9596, 0xE96A},{0x9597, 0xE96B},{0x9598, 0xE96C},{0x9599, 0xE96D},{0x959A, 0xE96E},{0x959B, 0xE96F},{0x959C, 0xE970}, - {0x959D, 0xE971},{0x959E, 0xE972},{0x959F, 0xE973},{0x95A0, 0xE974},{0x95A1, 0xE975},{0x95A2, 0xE976},{0x95A3, 0xE977},{0x95A4, 0xE978}, - {0x95A5, 0xE979},{0x95A6, 0xE97A},{0x95A7, 0xE97B},{0x95A8, 0xE97C},{0x95A9, 0xE97D},{0x95AA, 0xE97E},{0x95AB, 0xE980},{0x95AC, 0xE981}, - {0x95AD, 0xE982},{0x95AE, 0xE983},{0x95AF, 0xE984},{0x95B0, 0xE985},{0x95B1, 0xE986},{0x95B2, 0xE987},{0x95B3, 0xE988},{0x95B4, 0xE989}, - {0x95B5, 0xE98A},{0x95B6, 0xE98B},{0x95B7, 0xE98C},{0x95B8, 0xE98D},{0x95B9, 0xE98E},{0x95BA, 0xE98F},{0x95BB, 0xE990},{0x95BC, 0xE991}, - {0x95BD, 0xE992},{0x95BE, 0xE993},{0x95BF, 0xE994},{0x95C0, 0xE995},{0x95C1, 0xE996},{0x95C2, 0xE997},{0x95C3, 0xE998},{0x95C4, 0xE999}, - {0x95C5, 0xE99A},{0x95C6, 0xE99B},{0x95C7, 0xE99C},{0x95C8, 0xE99D},{0x95C9, 0xE99E},{0x95CA, 0xE99F},{0x95CB, 0xE9A0},{0x95CC, 0xEA40}, - {0x95CD, 0xEA41},{0x95CE, 0xEA42},{0x95CF, 0xEA43},{0x95D0, 0xEA44},{0x95D1, 0xEA45},{0x95D2, 0xEA46},{0x95D3, 0xEA47},{0x95D4, 0xEA48}, - {0x95D5, 0xEA49},{0x95D6, 0xEA4A},{0x95D7, 0xEA4B},{0x95D8, 0xEA4C},{0x95D9, 0xEA4D},{0x95DA, 0xEA4E},{0x95DB, 0xEA4F},{0x95DC, 0xEA50}, - {0x95DD, 0xEA51},{0x95DE, 0xEA52},{0x95DF, 0xEA53},{0x95E0, 0xEA54},{0x95E1, 0xEA55},{0x95E2, 0xEA56},{0x95E3, 0xEA57},{0x95E4, 0xEA58}, - {0x95E5, 0xEA59},{0x95E6, 0xEA5A},{0x95E7, 0xEA5B},{0x95E8, 0xC3C5},{0x95E9, 0xE3C5},{0x95EA, 0xC9C1},{0x95EB, 0xE3C6},{0x95EC, 0xEA5C}, - {0x95ED, 0xB1D5},{0x95EE, 0xCECA},{0x95EF, 0xB4B3},{0x95F0, 0xC8F2},{0x95F1, 0xE3C7},{0x95F2, 0xCFD0},{0x95F3, 0xE3C8},{0x95F4, 0xBCE4}, - {0x95F5, 0xE3C9},{0x95F6, 0xE3CA},{0x95F7, 0xC3C6},{0x95F8, 0xD5A2},{0x95F9, 0xC4D6},{0x95FA, 0xB9EB},{0x95FB, 0xCEC5},{0x95FC, 0xE3CB}, - {0x95FD, 0xC3F6},{0x95FE, 0xE3CC},{0x95FF, 0xEA5D},{0x9600, 0xB7A7},{0x9601, 0xB8F3},{0x9602, 0xBAD2},{0x9603, 0xE3CD},{0x9604, 0xE3CE}, - {0x9605, 0xD4C4},{0x9606, 0xE3CF},{0x9607, 0xEA5E},{0x9608, 0xE3D0},{0x9609, 0xD1CB},{0x960A, 0xE3D1},{0x960B, 0xE3D2},{0x960C, 0xE3D3}, - {0x960D, 0xE3D4},{0x960E, 0xD1D6},{0x960F, 0xE3D5},{0x9610, 0xB2FB},{0x9611, 0xC0BB},{0x9612, 0xE3D6},{0x9613, 0xEA5F},{0x9614, 0xC0AB}, - {0x9615, 0xE3D7},{0x9616, 0xE3D8},{0x9617, 0xE3D9},{0x9618, 0xEA60},{0x9619, 0xE3DA},{0x961A, 0xE3DB},{0x961B, 0xEA61},{0x961C, 0xB8B7}, - {0x961D, 0xDAE2},{0x961E, 0xEA62},{0x961F, 0xB6D3},{0x9620, 0xEA63},{0x9621, 0xDAE4},{0x9622, 0xDAE3},{0x9623, 0xEA64},{0x9624, 0xEA65}, - {0x9625, 0xEA66},{0x9626, 0xEA67},{0x9627, 0xEA68},{0x9628, 0xEA69},{0x9629, 0xEA6A},{0x962A, 0xDAE6},{0x962B, 0xEA6B},{0x962C, 0xEA6C}, - {0x962D, 0xEA6D},{0x962E, 0xC8EE},{0x962F, 0xEA6E},{0x9630, 0xEA6F},{0x9631, 0xDAE5},{0x9632, 0xB7C0},{0x9633, 0xD1F4},{0x9634, 0xD2F5}, - {0x9635, 0xD5F3},{0x9636, 0xBDD7},{0x9637, 0xEA70},{0x9638, 0xEA71},{0x9639, 0xEA72},{0x963A, 0xEA73},{0x963B, 0xD7E8},{0x963C, 0xDAE8}, - {0x963D, 0xDAE7},{0x963E, 0xEA74},{0x963F, 0xB0A2},{0x9640, 0xCDD3},{0x9641, 0xEA75},{0x9642, 0xDAE9},{0x9643, 0xEA76},{0x9644, 0xB8BD}, - {0x9645, 0xBCCA},{0x9646, 0xC2BD},{0x9647, 0xC2A4},{0x9648, 0xB3C2},{0x9649, 0xDAEA},{0x964A, 0xEA77},{0x964B, 0xC2AA},{0x964C, 0xC4B0}, - {0x964D, 0xBDB5},{0x964E, 0xEA78},{0x964F, 0xEA79},{0x9650, 0xCFDE},{0x9651, 0xEA7A},{0x9652, 0xEA7B},{0x9653, 0xEA7C},{0x9654, 0xDAEB}, - {0x9655, 0xC9C2},{0x9656, 0xEA7D},{0x9657, 0xEA7E},{0x9658, 0xEA80},{0x9659, 0xEA81},{0x965A, 0xEA82},{0x965B, 0xB1DD},{0x965C, 0xEA83}, - {0x965D, 0xEA84},{0x965E, 0xEA85},{0x965F, 0xDAEC},{0x9660, 0xEA86},{0x9661, 0xB6B8},{0x9662, 0xD4BA},{0x9663, 0xEA87},{0x9664, 0xB3FD}, - {0x9665, 0xEA88},{0x9666, 0xEA89},{0x9667, 0xDAED},{0x9668, 0xD4C9},{0x9669, 0xCFD5},{0x966A, 0xC5E3},{0x966B, 0xEA8A},{0x966C, 0xDAEE}, - {0x966D, 0xEA8B},{0x966E, 0xEA8C},{0x966F, 0xEA8D},{0x9670, 0xEA8E},{0x9671, 0xEA8F},{0x9672, 0xDAEF},{0x9673, 0xEA90},{0x9674, 0xDAF0}, - {0x9675, 0xC1EA},{0x9676, 0xCCD5},{0x9677, 0xCFDD},{0x9678, 0xEA91},{0x9679, 0xEA92},{0x967A, 0xEA93},{0x967B, 0xEA94},{0x967C, 0xEA95}, - {0x967D, 0xEA96},{0x967E, 0xEA97},{0x967F, 0xEA98},{0x9680, 0xEA99},{0x9681, 0xEA9A},{0x9682, 0xEA9B},{0x9683, 0xEA9C},{0x9684, 0xEA9D}, - {0x9685, 0xD3E7},{0x9686, 0xC2A1},{0x9687, 0xEA9E},{0x9688, 0xDAF1},{0x9689, 0xEA9F},{0x968A, 0xEAA0},{0x968B, 0xCBE5},{0x968C, 0xEB40}, - {0x968D, 0xDAF2},{0x968E, 0xEB41},{0x968F, 0xCBE6},{0x9690, 0xD2FE},{0x9691, 0xEB42},{0x9692, 0xEB43},{0x9693, 0xEB44},{0x9694, 0xB8F4}, - {0x9695, 0xEB45},{0x9696, 0xEB46},{0x9697, 0xDAF3},{0x9698, 0xB0AF},{0x9699, 0xCFB6},{0x969A, 0xEB47},{0x969B, 0xEB48},{0x969C, 0xD5CF}, - {0x969D, 0xEB49},{0x969E, 0xEB4A},{0x969F, 0xEB4B},{0x96A0, 0xEB4C},{0x96A1, 0xEB4D},{0x96A2, 0xEB4E},{0x96A3, 0xEB4F},{0x96A4, 0xEB50}, - {0x96A5, 0xEB51},{0x96A6, 0xEB52},{0x96A7, 0xCBED},{0x96A8, 0xEB53},{0x96A9, 0xEB54},{0x96AA, 0xEB55},{0x96AB, 0xEB56},{0x96AC, 0xEB57}, - {0x96AD, 0xEB58},{0x96AE, 0xEB59},{0x96AF, 0xEB5A},{0x96B0, 0xDAF4},{0x96B1, 0xEB5B},{0x96B2, 0xEB5C},{0x96B3, 0xE3C4},{0x96B4, 0xEB5D}, - {0x96B5, 0xEB5E},{0x96B6, 0xC1A5},{0x96B7, 0xEB5F},{0x96B8, 0xEB60},{0x96B9, 0xF6BF},{0x96BA, 0xEB61},{0x96BB, 0xEB62},{0x96BC, 0xF6C0}, - {0x96BD, 0xF6C1},{0x96BE, 0xC4D1},{0x96BF, 0xEB63},{0x96C0, 0xC8B8},{0x96C1, 0xD1E3},{0x96C2, 0xEB64},{0x96C3, 0xEB65},{0x96C4, 0xD0DB}, - {0x96C5, 0xD1C5},{0x96C6, 0xBCAF},{0x96C7, 0xB9CD},{0x96C8, 0xEB66},{0x96C9, 0xEFF4},{0x96CA, 0xEB67},{0x96CB, 0xEB68},{0x96CC, 0xB4C6}, - {0x96CD, 0xD3BA},{0x96CE, 0xF6C2},{0x96CF, 0xB3FB},{0x96D0, 0xEB69},{0x96D1, 0xEB6A},{0x96D2, 0xF6C3},{0x96D3, 0xEB6B},{0x96D4, 0xEB6C}, - {0x96D5, 0xB5F1},{0x96D6, 0xEB6D},{0x96D7, 0xEB6E},{0x96D8, 0xEB6F},{0x96D9, 0xEB70},{0x96DA, 0xEB71},{0x96DB, 0xEB72},{0x96DC, 0xEB73}, - {0x96DD, 0xEB74},{0x96DE, 0xEB75},{0x96DF, 0xEB76},{0x96E0, 0xF6C5},{0x96E1, 0xEB77},{0x96E2, 0xEB78},{0x96E3, 0xEB79},{0x96E4, 0xEB7A}, - {0x96E5, 0xEB7B},{0x96E6, 0xEB7C},{0x96E7, 0xEB7D},{0x96E8, 0xD3EA},{0x96E9, 0xF6A7},{0x96EA, 0xD1A9},{0x96EB, 0xEB7E},{0x96EC, 0xEB80}, - {0x96ED, 0xEB81},{0x96EE, 0xEB82},{0x96EF, 0xF6A9},{0x96F0, 0xEB83},{0x96F1, 0xEB84},{0x96F2, 0xEB85},{0x96F3, 0xF6A8},{0x96F4, 0xEB86}, - {0x96F5, 0xEB87},{0x96F6, 0xC1E3},{0x96F7, 0xC0D7},{0x96F8, 0xEB88},{0x96F9, 0xB1A2},{0x96FA, 0xEB89},{0x96FB, 0xEB8A},{0x96FC, 0xEB8B}, - {0x96FD, 0xEB8C},{0x96FE, 0xCEED},{0x96FF, 0xEB8D},{0x9700, 0xD0E8},{0x9701, 0xF6AB},{0x9702, 0xEB8E},{0x9703, 0xEB8F},{0x9704, 0xCFF6}, - {0x9705, 0xEB90},{0x9706, 0xF6AA},{0x9707, 0xD5F0},{0x9708, 0xF6AC},{0x9709, 0xC3B9},{0x970A, 0xEB91},{0x970B, 0xEB92},{0x970C, 0xEB93}, - {0x970D, 0xBBF4},{0x970E, 0xF6AE},{0x970F, 0xF6AD},{0x9710, 0xEB94},{0x9711, 0xEB95},{0x9712, 0xEB96},{0x9713, 0xC4DE},{0x9714, 0xEB97}, - {0x9715, 0xEB98},{0x9716, 0xC1D8},{0x9717, 0xEB99},{0x9718, 0xEB9A},{0x9719, 0xEB9B},{0x971A, 0xEB9C},{0x971B, 0xEB9D},{0x971C, 0xCBAA}, - {0x971D, 0xEB9E},{0x971E, 0xCFBC},{0x971F, 0xEB9F},{0x9720, 0xEBA0},{0x9721, 0xEC40},{0x9722, 0xEC41},{0x9723, 0xEC42},{0x9724, 0xEC43}, - {0x9725, 0xEC44},{0x9726, 0xEC45},{0x9727, 0xEC46},{0x9728, 0xEC47},{0x9729, 0xEC48},{0x972A, 0xF6AF},{0x972B, 0xEC49},{0x972C, 0xEC4A}, - {0x972D, 0xF6B0},{0x972E, 0xEC4B},{0x972F, 0xEC4C},{0x9730, 0xF6B1},{0x9731, 0xEC4D},{0x9732, 0xC2B6},{0x9733, 0xEC4E},{0x9734, 0xEC4F}, - {0x9735, 0xEC50},{0x9736, 0xEC51},{0x9737, 0xEC52},{0x9738, 0xB0D4},{0x9739, 0xC5F9},{0x973A, 0xEC53},{0x973B, 0xEC54},{0x973C, 0xEC55}, - {0x973D, 0xEC56},{0x973E, 0xF6B2},{0x973F, 0xEC57},{0x9740, 0xEC58},{0x9741, 0xEC59},{0x9742, 0xEC5A},{0x9743, 0xEC5B},{0x9744, 0xEC5C}, - {0x9745, 0xEC5D},{0x9746, 0xEC5E},{0x9747, 0xEC5F},{0x9748, 0xEC60},{0x9749, 0xEC61},{0x974A, 0xEC62},{0x974B, 0xEC63},{0x974C, 0xEC64}, - {0x974D, 0xEC65},{0x974E, 0xEC66},{0x974F, 0xEC67},{0x9750, 0xEC68},{0x9751, 0xEC69},{0x9752, 0xC7E0},{0x9753, 0xF6A6},{0x9754, 0xEC6A}, - {0x9755, 0xEC6B},{0x9756, 0xBEB8},{0x9757, 0xEC6C},{0x9758, 0xEC6D},{0x9759, 0xBEB2},{0x975A, 0xEC6E},{0x975B, 0xB5E5},{0x975C, 0xEC6F}, - {0x975D, 0xEC70},{0x975E, 0xB7C7},{0x975F, 0xEC71},{0x9760, 0xBFBF},{0x9761, 0xC3D2},{0x9762, 0xC3E6},{0x9763, 0xEC72},{0x9764, 0xEC73}, - {0x9765, 0xD8CC},{0x9766, 0xEC74},{0x9767, 0xEC75},{0x9768, 0xEC76},{0x9769, 0xB8EF},{0x976A, 0xEC77},{0x976B, 0xEC78},{0x976C, 0xEC79}, - {0x976D, 0xEC7A},{0x976E, 0xEC7B},{0x976F, 0xEC7C},{0x9770, 0xEC7D},{0x9771, 0xEC7E},{0x9772, 0xEC80},{0x9773, 0xBDF9},{0x9774, 0xD1A5}, - {0x9775, 0xEC81},{0x9776, 0xB0D0},{0x9777, 0xEC82},{0x9778, 0xEC83},{0x9779, 0xEC84},{0x977A, 0xEC85},{0x977B, 0xEC86},{0x977C, 0xF7B0}, - {0x977D, 0xEC87},{0x977E, 0xEC88},{0x977F, 0xEC89},{0x9780, 0xEC8A},{0x9781, 0xEC8B},{0x9782, 0xEC8C},{0x9783, 0xEC8D},{0x9784, 0xEC8E}, - {0x9785, 0xF7B1},{0x9786, 0xEC8F},{0x9787, 0xEC90},{0x9788, 0xEC91},{0x9789, 0xEC92},{0x978A, 0xEC93},{0x978B, 0xD0AC},{0x978C, 0xEC94}, - {0x978D, 0xB0B0},{0x978E, 0xEC95},{0x978F, 0xEC96},{0x9790, 0xEC97},{0x9791, 0xF7B2},{0x9792, 0xF7B3},{0x9793, 0xEC98},{0x9794, 0xF7B4}, - {0x9795, 0xEC99},{0x9796, 0xEC9A},{0x9797, 0xEC9B},{0x9798, 0xC7CA},{0x9799, 0xEC9C},{0x979A, 0xEC9D},{0x979B, 0xEC9E},{0x979C, 0xEC9F}, - {0x979D, 0xECA0},{0x979E, 0xED40},{0x979F, 0xED41},{0x97A0, 0xBECF},{0x97A1, 0xED42},{0x97A2, 0xED43},{0x97A3, 0xF7B7},{0x97A4, 0xED44}, - {0x97A5, 0xED45},{0x97A6, 0xED46},{0x97A7, 0xED47},{0x97A8, 0xED48},{0x97A9, 0xED49},{0x97AA, 0xED4A},{0x97AB, 0xF7B6},{0x97AC, 0xED4B}, - {0x97AD, 0xB1DE},{0x97AE, 0xED4C},{0x97AF, 0xF7B5},{0x97B0, 0xED4D},{0x97B1, 0xED4E},{0x97B2, 0xF7B8},{0x97B3, 0xED4F},{0x97B4, 0xF7B9}, - {0x97B5, 0xED50},{0x97B6, 0xED51},{0x97B7, 0xED52},{0x97B8, 0xED53},{0x97B9, 0xED54},{0x97BA, 0xED55},{0x97BB, 0xED56},{0x97BC, 0xED57}, - {0x97BD, 0xED58},{0x97BE, 0xED59},{0x97BF, 0xED5A},{0x97C0, 0xED5B},{0x97C1, 0xED5C},{0x97C2, 0xED5D},{0x97C3, 0xED5E},{0x97C4, 0xED5F}, - {0x97C5, 0xED60},{0x97C6, 0xED61},{0x97C7, 0xED62},{0x97C8, 0xED63},{0x97C9, 0xED64},{0x97CA, 0xED65},{0x97CB, 0xED66},{0x97CC, 0xED67}, - {0x97CD, 0xED68},{0x97CE, 0xED69},{0x97CF, 0xED6A},{0x97D0, 0xED6B},{0x97D1, 0xED6C},{0x97D2, 0xED6D},{0x97D3, 0xED6E},{0x97D4, 0xED6F}, - {0x97D5, 0xED70},{0x97D6, 0xED71},{0x97D7, 0xED72},{0x97D8, 0xED73},{0x97D9, 0xED74},{0x97DA, 0xED75},{0x97DB, 0xED76},{0x97DC, 0xED77}, - {0x97DD, 0xED78},{0x97DE, 0xED79},{0x97DF, 0xED7A},{0x97E0, 0xED7B},{0x97E1, 0xED7C},{0x97E2, 0xED7D},{0x97E3, 0xED7E},{0x97E4, 0xED80}, - {0x97E5, 0xED81},{0x97E6, 0xCEA4},{0x97E7, 0xC8CD},{0x97E8, 0xED82},{0x97E9, 0xBAAB},{0x97EA, 0xE8B8},{0x97EB, 0xE8B9},{0x97EC, 0xE8BA}, - {0x97ED, 0xBEC2},{0x97EE, 0xED83},{0x97EF, 0xED84},{0x97F0, 0xED85},{0x97F1, 0xED86},{0x97F2, 0xED87},{0x97F3, 0xD2F4},{0x97F4, 0xED88}, - {0x97F5, 0xD4CF},{0x97F6, 0xC9D8},{0x97F7, 0xED89},{0x97F8, 0xED8A},{0x97F9, 0xED8B},{0x97FA, 0xED8C},{0x97FB, 0xED8D},{0x97FC, 0xED8E}, - {0x97FD, 0xED8F},{0x97FE, 0xED90},{0x97FF, 0xED91},{0x9800, 0xED92},{0x9801, 0xED93},{0x9802, 0xED94},{0x9803, 0xED95},{0x9804, 0xED96}, - {0x9805, 0xED97},{0x9806, 0xED98},{0x9807, 0xED99},{0x9808, 0xED9A},{0x9809, 0xED9B},{0x980A, 0xED9C},{0x980B, 0xED9D},{0x980C, 0xED9E}, - {0x980D, 0xED9F},{0x980E, 0xEDA0},{0x980F, 0xEE40},{0x9810, 0xEE41},{0x9811, 0xEE42},{0x9812, 0xEE43},{0x9813, 0xEE44},{0x9814, 0xEE45}, - {0x9815, 0xEE46},{0x9816, 0xEE47},{0x9817, 0xEE48},{0x9818, 0xEE49},{0x9819, 0xEE4A},{0x981A, 0xEE4B},{0x981B, 0xEE4C},{0x981C, 0xEE4D}, - {0x981D, 0xEE4E},{0x981E, 0xEE4F},{0x981F, 0xEE50},{0x9820, 0xEE51},{0x9821, 0xEE52},{0x9822, 0xEE53},{0x9823, 0xEE54},{0x9824, 0xEE55}, - {0x9825, 0xEE56},{0x9826, 0xEE57},{0x9827, 0xEE58},{0x9828, 0xEE59},{0x9829, 0xEE5A},{0x982A, 0xEE5B},{0x982B, 0xEE5C},{0x982C, 0xEE5D}, - {0x982D, 0xEE5E},{0x982E, 0xEE5F},{0x982F, 0xEE60},{0x9830, 0xEE61},{0x9831, 0xEE62},{0x9832, 0xEE63},{0x9833, 0xEE64},{0x9834, 0xEE65}, - {0x9835, 0xEE66},{0x9836, 0xEE67},{0x9837, 0xEE68},{0x9838, 0xEE69},{0x9839, 0xEE6A},{0x983A, 0xEE6B},{0x983B, 0xEE6C},{0x983C, 0xEE6D}, - {0x983D, 0xEE6E},{0x983E, 0xEE6F},{0x983F, 0xEE70},{0x9840, 0xEE71},{0x9841, 0xEE72},{0x9842, 0xEE73},{0x9843, 0xEE74},{0x9844, 0xEE75}, - {0x9845, 0xEE76},{0x9846, 0xEE77},{0x9847, 0xEE78},{0x9848, 0xEE79},{0x9849, 0xEE7A},{0x984A, 0xEE7B},{0x984B, 0xEE7C},{0x984C, 0xEE7D}, - {0x984D, 0xEE7E},{0x984E, 0xEE80},{0x984F, 0xEE81},{0x9850, 0xEE82},{0x9851, 0xEE83},{0x9852, 0xEE84},{0x9853, 0xEE85},{0x9854, 0xEE86}, - {0x9855, 0xEE87},{0x9856, 0xEE88},{0x9857, 0xEE89},{0x9858, 0xEE8A},{0x9859, 0xEE8B},{0x985A, 0xEE8C},{0x985B, 0xEE8D},{0x985C, 0xEE8E}, - {0x985D, 0xEE8F},{0x985E, 0xEE90},{0x985F, 0xEE91},{0x9860, 0xEE92},{0x9861, 0xEE93},{0x9862, 0xEE94},{0x9863, 0xEE95},{0x9864, 0xEE96}, - {0x9865, 0xEE97},{0x9866, 0xEE98},{0x9867, 0xEE99},{0x9868, 0xEE9A},{0x9869, 0xEE9B},{0x986A, 0xEE9C},{0x986B, 0xEE9D},{0x986C, 0xEE9E}, - {0x986D, 0xEE9F},{0x986E, 0xEEA0},{0x986F, 0xEF40},{0x9870, 0xEF41},{0x9871, 0xEF42},{0x9872, 0xEF43},{0x9873, 0xEF44},{0x9874, 0xEF45}, - {0x9875, 0xD2B3},{0x9876, 0xB6A5},{0x9877, 0xC7EA},{0x9878, 0xF1FC},{0x9879, 0xCFEE},{0x987A, 0xCBB3},{0x987B, 0xD0EB},{0x987C, 0xE7EF}, - {0x987D, 0xCDE7},{0x987E, 0xB9CB},{0x987F, 0xB6D9},{0x9880, 0xF1FD},{0x9881, 0xB0E4},{0x9882, 0xCBCC},{0x9883, 0xF1FE},{0x9884, 0xD4A4}, - {0x9885, 0xC2AD},{0x9886, 0xC1EC},{0x9887, 0xC6C4},{0x9888, 0xBEB1},{0x9889, 0xF2A1},{0x988A, 0xBCD5},{0x988B, 0xEF46},{0x988C, 0xF2A2}, - {0x988D, 0xF2A3},{0x988E, 0xEF47},{0x988F, 0xF2A4},{0x9890, 0xD2C3},{0x9891, 0xC6B5},{0x9892, 0xEF48},{0x9893, 0xCDC7},{0x9894, 0xF2A5}, - {0x9895, 0xEF49},{0x9896, 0xD3B1},{0x9897, 0xBFC5},{0x9898, 0xCCE2},{0x9899, 0xEF4A},{0x989A, 0xF2A6},{0x989B, 0xF2A7},{0x989C, 0xD1D5}, - {0x989D, 0xB6EE},{0x989E, 0xF2A8},{0x989F, 0xF2A9},{0x98A0, 0xB5DF},{0x98A1, 0xF2AA},{0x98A2, 0xF2AB},{0x98A3, 0xEF4B},{0x98A4, 0xB2FC}, - {0x98A5, 0xF2AC},{0x98A6, 0xF2AD},{0x98A7, 0xC8A7},{0x98A8, 0xEF4C},{0x98A9, 0xEF4D},{0x98AA, 0xEF4E},{0x98AB, 0xEF4F},{0x98AC, 0xEF50}, - {0x98AD, 0xEF51},{0x98AE, 0xEF52},{0x98AF, 0xEF53},{0x98B0, 0xEF54},{0x98B1, 0xEF55},{0x98B2, 0xEF56},{0x98B3, 0xEF57},{0x98B4, 0xEF58}, - {0x98B5, 0xEF59},{0x98B6, 0xEF5A},{0x98B7, 0xEF5B},{0x98B8, 0xEF5C},{0x98B9, 0xEF5D},{0x98BA, 0xEF5E},{0x98BB, 0xEF5F},{0x98BC, 0xEF60}, - {0x98BD, 0xEF61},{0x98BE, 0xEF62},{0x98BF, 0xEF63},{0x98C0, 0xEF64},{0x98C1, 0xEF65},{0x98C2, 0xEF66},{0x98C3, 0xEF67},{0x98C4, 0xEF68}, - {0x98C5, 0xEF69},{0x98C6, 0xEF6A},{0x98C7, 0xEF6B},{0x98C8, 0xEF6C},{0x98C9, 0xEF6D},{0x98CA, 0xEF6E},{0x98CB, 0xEF6F},{0x98CC, 0xEF70}, - {0x98CD, 0xEF71},{0x98CE, 0xB7E7},{0x98CF, 0xEF72},{0x98D0, 0xEF73},{0x98D1, 0xECA9},{0x98D2, 0xECAA},{0x98D3, 0xECAB},{0x98D4, 0xEF74}, - {0x98D5, 0xECAC},{0x98D6, 0xEF75},{0x98D7, 0xEF76},{0x98D8, 0xC6AE},{0x98D9, 0xECAD},{0x98DA, 0xECAE},{0x98DB, 0xEF77},{0x98DC, 0xEF78}, - {0x98DD, 0xEF79},{0x98DE, 0xB7C9},{0x98DF, 0xCAB3},{0x98E0, 0xEF7A},{0x98E1, 0xEF7B},{0x98E2, 0xEF7C},{0x98E3, 0xEF7D},{0x98E4, 0xEF7E}, - {0x98E5, 0xEF80},{0x98E6, 0xEF81},{0x98E7, 0xE2B8},{0x98E8, 0xF7CF},{0x98E9, 0xEF82},{0x98EA, 0xEF83},{0x98EB, 0xEF84},{0x98EC, 0xEF85}, - {0x98ED, 0xEF86},{0x98EE, 0xEF87},{0x98EF, 0xEF88},{0x98F0, 0xEF89},{0x98F1, 0xEF8A},{0x98F2, 0xEF8B},{0x98F3, 0xEF8C},{0x98F4, 0xEF8D}, - {0x98F5, 0xEF8E},{0x98F6, 0xEF8F},{0x98F7, 0xEF90},{0x98F8, 0xEF91},{0x98F9, 0xEF92},{0x98FA, 0xEF93},{0x98FB, 0xEF94},{0x98FC, 0xEF95}, - {0x98FD, 0xEF96},{0x98FE, 0xEF97},{0x98FF, 0xEF98},{0x9900, 0xEF99},{0x9901, 0xEF9A},{0x9902, 0xEF9B},{0x9903, 0xEF9C},{0x9904, 0xEF9D}, - {0x9905, 0xEF9E},{0x9906, 0xEF9F},{0x9907, 0xEFA0},{0x9908, 0xF040},{0x9909, 0xF041},{0x990A, 0xF042},{0x990B, 0xF043},{0x990C, 0xF044}, - {0x990D, 0xF7D0},{0x990E, 0xF045},{0x990F, 0xF046},{0x9910, 0xB2CD},{0x9911, 0xF047},{0x9912, 0xF048},{0x9913, 0xF049},{0x9914, 0xF04A}, - {0x9915, 0xF04B},{0x9916, 0xF04C},{0x9917, 0xF04D},{0x9918, 0xF04E},{0x9919, 0xF04F},{0x991A, 0xF050},{0x991B, 0xF051},{0x991C, 0xF052}, - {0x991D, 0xF053},{0x991E, 0xF054},{0x991F, 0xF055},{0x9920, 0xF056},{0x9921, 0xF057},{0x9922, 0xF058},{0x9923, 0xF059},{0x9924, 0xF05A}, - {0x9925, 0xF05B},{0x9926, 0xF05C},{0x9927, 0xF05D},{0x9928, 0xF05E},{0x9929, 0xF05F},{0x992A, 0xF060},{0x992B, 0xF061},{0x992C, 0xF062}, - {0x992D, 0xF063},{0x992E, 0xF7D1},{0x992F, 0xF064},{0x9930, 0xF065},{0x9931, 0xF066},{0x9932, 0xF067},{0x9933, 0xF068},{0x9934, 0xF069}, - {0x9935, 0xF06A},{0x9936, 0xF06B},{0x9937, 0xF06C},{0x9938, 0xF06D},{0x9939, 0xF06E},{0x993A, 0xF06F},{0x993B, 0xF070},{0x993C, 0xF071}, - {0x993D, 0xF072},{0x993E, 0xF073},{0x993F, 0xF074},{0x9940, 0xF075},{0x9941, 0xF076},{0x9942, 0xF077},{0x9943, 0xF078},{0x9944, 0xF079}, - {0x9945, 0xF07A},{0x9946, 0xF07B},{0x9947, 0xF07C},{0x9948, 0xF07D},{0x9949, 0xF07E},{0x994A, 0xF080},{0x994B, 0xF081},{0x994C, 0xF082}, - {0x994D, 0xF083},{0x994E, 0xF084},{0x994F, 0xF085},{0x9950, 0xF086},{0x9951, 0xF087},{0x9952, 0xF088},{0x9953, 0xF089},{0x9954, 0xF7D3}, - {0x9955, 0xF7D2},{0x9956, 0xF08A},{0x9957, 0xF08B},{0x9958, 0xF08C},{0x9959, 0xF08D},{0x995A, 0xF08E},{0x995B, 0xF08F},{0x995C, 0xF090}, - {0x995D, 0xF091},{0x995E, 0xF092},{0x995F, 0xF093},{0x9960, 0xF094},{0x9961, 0xF095},{0x9962, 0xF096},{0x9963, 0xE2BB},{0x9964, 0xF097}, - {0x9965, 0xBCA2},{0x9966, 0xF098},{0x9967, 0xE2BC},{0x9968, 0xE2BD},{0x9969, 0xE2BE},{0x996A, 0xE2BF},{0x996B, 0xE2C0},{0x996C, 0xE2C1}, - {0x996D, 0xB7B9},{0x996E, 0xD2FB},{0x996F, 0xBDA4},{0x9970, 0xCACE},{0x9971, 0xB1A5},{0x9972, 0xCBC7},{0x9973, 0xF099},{0x9974, 0xE2C2}, - {0x9975, 0xB6FC},{0x9976, 0xC8C4},{0x9977, 0xE2C3},{0x9978, 0xF09A},{0x9979, 0xF09B},{0x997A, 0xBDC8},{0x997B, 0xF09C},{0x997C, 0xB1FD}, - {0x997D, 0xE2C4},{0x997E, 0xF09D},{0x997F, 0xB6F6},{0x9980, 0xE2C5},{0x9981, 0xC4D9},{0x9982, 0xF09E},{0x9983, 0xF09F},{0x9984, 0xE2C6}, - {0x9985, 0xCFDA},{0x9986, 0xB9DD},{0x9987, 0xE2C7},{0x9988, 0xC0A1},{0x9989, 0xF0A0},{0x998A, 0xE2C8},{0x998B, 0xB2F6},{0x998C, 0xF140}, - {0x998D, 0xE2C9},{0x998E, 0xF141},{0x998F, 0xC1F3},{0x9990, 0xE2CA},{0x9991, 0xE2CB},{0x9992, 0xC2F8},{0x9993, 0xE2CC},{0x9994, 0xE2CD}, - {0x9995, 0xE2CE},{0x9996, 0xCAD7},{0x9997, 0xD8B8},{0x9998, 0xD9E5},{0x9999, 0xCFE3},{0x999A, 0xF142},{0x999B, 0xF143},{0x999C, 0xF144}, - {0x999D, 0xF145},{0x999E, 0xF146},{0x999F, 0xF147},{0x99A0, 0xF148},{0x99A1, 0xF149},{0x99A2, 0xF14A},{0x99A3, 0xF14B},{0x99A4, 0xF14C}, - {0x99A5, 0xF0A5},{0x99A6, 0xF14D},{0x99A7, 0xF14E},{0x99A8, 0xDCB0},{0x99A9, 0xF14F},{0x99AA, 0xF150},{0x99AB, 0xF151},{0x99AC, 0xF152}, - {0x99AD, 0xF153},{0x99AE, 0xF154},{0x99AF, 0xF155},{0x99B0, 0xF156},{0x99B1, 0xF157},{0x99B2, 0xF158},{0x99B3, 0xF159},{0x99B4, 0xF15A}, - {0x99B5, 0xF15B},{0x99B6, 0xF15C},{0x99B7, 0xF15D},{0x99B8, 0xF15E},{0x99B9, 0xF15F},{0x99BA, 0xF160},{0x99BB, 0xF161},{0x99BC, 0xF162}, - {0x99BD, 0xF163},{0x99BE, 0xF164},{0x99BF, 0xF165},{0x99C0, 0xF166},{0x99C1, 0xF167},{0x99C2, 0xF168},{0x99C3, 0xF169},{0x99C4, 0xF16A}, - {0x99C5, 0xF16B},{0x99C6, 0xF16C},{0x99C7, 0xF16D},{0x99C8, 0xF16E},{0x99C9, 0xF16F},{0x99CA, 0xF170},{0x99CB, 0xF171},{0x99CC, 0xF172}, - {0x99CD, 0xF173},{0x99CE, 0xF174},{0x99CF, 0xF175},{0x99D0, 0xF176},{0x99D1, 0xF177},{0x99D2, 0xF178},{0x99D3, 0xF179},{0x99D4, 0xF17A}, - {0x99D5, 0xF17B},{0x99D6, 0xF17C},{0x99D7, 0xF17D},{0x99D8, 0xF17E},{0x99D9, 0xF180},{0x99DA, 0xF181},{0x99DB, 0xF182},{0x99DC, 0xF183}, - {0x99DD, 0xF184},{0x99DE, 0xF185},{0x99DF, 0xF186},{0x99E0, 0xF187},{0x99E1, 0xF188},{0x99E2, 0xF189},{0x99E3, 0xF18A},{0x99E4, 0xF18B}, - {0x99E5, 0xF18C},{0x99E6, 0xF18D},{0x99E7, 0xF18E},{0x99E8, 0xF18F},{0x99E9, 0xF190},{0x99EA, 0xF191},{0x99EB, 0xF192},{0x99EC, 0xF193}, - {0x99ED, 0xF194},{0x99EE, 0xF195},{0x99EF, 0xF196},{0x99F0, 0xF197},{0x99F1, 0xF198},{0x99F2, 0xF199},{0x99F3, 0xF19A},{0x99F4, 0xF19B}, - {0x99F5, 0xF19C},{0x99F6, 0xF19D},{0x99F7, 0xF19E},{0x99F8, 0xF19F},{0x99F9, 0xF1A0},{0x99FA, 0xF240},{0x99FB, 0xF241},{0x99FC, 0xF242}, - {0x99FD, 0xF243},{0x99FE, 0xF244},{0x99FF, 0xF245},{0x9A00, 0xF246},{0x9A01, 0xF247},{0x9A02, 0xF248},{0x9A03, 0xF249},{0x9A04, 0xF24A}, - {0x9A05, 0xF24B},{0x9A06, 0xF24C},{0x9A07, 0xF24D},{0x9A08, 0xF24E},{0x9A09, 0xF24F},{0x9A0A, 0xF250},{0x9A0B, 0xF251},{0x9A0C, 0xF252}, - {0x9A0D, 0xF253},{0x9A0E, 0xF254},{0x9A0F, 0xF255},{0x9A10, 0xF256},{0x9A11, 0xF257},{0x9A12, 0xF258},{0x9A13, 0xF259},{0x9A14, 0xF25A}, - {0x9A15, 0xF25B},{0x9A16, 0xF25C},{0x9A17, 0xF25D},{0x9A18, 0xF25E},{0x9A19, 0xF25F},{0x9A1A, 0xF260},{0x9A1B, 0xF261},{0x9A1C, 0xF262}, - {0x9A1D, 0xF263},{0x9A1E, 0xF264},{0x9A1F, 0xF265},{0x9A20, 0xF266},{0x9A21, 0xF267},{0x9A22, 0xF268},{0x9A23, 0xF269},{0x9A24, 0xF26A}, - {0x9A25, 0xF26B},{0x9A26, 0xF26C},{0x9A27, 0xF26D},{0x9A28, 0xF26E},{0x9A29, 0xF26F},{0x9A2A, 0xF270},{0x9A2B, 0xF271},{0x9A2C, 0xF272}, - {0x9A2D, 0xF273},{0x9A2E, 0xF274},{0x9A2F, 0xF275},{0x9A30, 0xF276},{0x9A31, 0xF277},{0x9A32, 0xF278},{0x9A33, 0xF279},{0x9A34, 0xF27A}, - {0x9A35, 0xF27B},{0x9A36, 0xF27C},{0x9A37, 0xF27D},{0x9A38, 0xF27E},{0x9A39, 0xF280},{0x9A3A, 0xF281},{0x9A3B, 0xF282},{0x9A3C, 0xF283}, - {0x9A3D, 0xF284},{0x9A3E, 0xF285},{0x9A3F, 0xF286},{0x9A40, 0xF287},{0x9A41, 0xF288},{0x9A42, 0xF289},{0x9A43, 0xF28A},{0x9A44, 0xF28B}, - {0x9A45, 0xF28C},{0x9A46, 0xF28D},{0x9A47, 0xF28E},{0x9A48, 0xF28F},{0x9A49, 0xF290},{0x9A4A, 0xF291},{0x9A4B, 0xF292},{0x9A4C, 0xF293}, - {0x9A4D, 0xF294},{0x9A4E, 0xF295},{0x9A4F, 0xF296},{0x9A50, 0xF297},{0x9A51, 0xF298},{0x9A52, 0xF299},{0x9A53, 0xF29A},{0x9A54, 0xF29B}, - {0x9A55, 0xF29C},{0x9A56, 0xF29D},{0x9A57, 0xF29E},{0x9A58, 0xF29F},{0x9A59, 0xF2A0},{0x9A5A, 0xF340},{0x9A5B, 0xF341},{0x9A5C, 0xF342}, - {0x9A5D, 0xF343},{0x9A5E, 0xF344},{0x9A5F, 0xF345},{0x9A60, 0xF346},{0x9A61, 0xF347},{0x9A62, 0xF348},{0x9A63, 0xF349},{0x9A64, 0xF34A}, - {0x9A65, 0xF34B},{0x9A66, 0xF34C},{0x9A67, 0xF34D},{0x9A68, 0xF34E},{0x9A69, 0xF34F},{0x9A6A, 0xF350},{0x9A6B, 0xF351},{0x9A6C, 0xC2ED}, - {0x9A6D, 0xD4A6},{0x9A6E, 0xCDD4},{0x9A6F, 0xD1B1},{0x9A70, 0xB3DB},{0x9A71, 0xC7FD},{0x9A72, 0xF352},{0x9A73, 0xB2B5},{0x9A74, 0xC2BF}, - {0x9A75, 0xE6E0},{0x9A76, 0xCABB},{0x9A77, 0xE6E1},{0x9A78, 0xE6E2},{0x9A79, 0xBED4},{0x9A7A, 0xE6E3},{0x9A7B, 0xD7A4},{0x9A7C, 0xCDD5}, - {0x9A7D, 0xE6E5},{0x9A7E, 0xBCDD},{0x9A7F, 0xE6E4},{0x9A80, 0xE6E6},{0x9A81, 0xE6E7},{0x9A82, 0xC2EE},{0x9A83, 0xF353},{0x9A84, 0xBDBE}, - {0x9A85, 0xE6E8},{0x9A86, 0xC2E6},{0x9A87, 0xBAA7},{0x9A88, 0xE6E9},{0x9A89, 0xF354},{0x9A8A, 0xE6EA},{0x9A8B, 0xB3D2},{0x9A8C, 0xD1E9}, - {0x9A8D, 0xF355},{0x9A8E, 0xF356},{0x9A8F, 0xBFA5},{0x9A90, 0xE6EB},{0x9A91, 0xC6EF},{0x9A92, 0xE6EC},{0x9A93, 0xE6ED},{0x9A94, 0xF357}, - {0x9A95, 0xF358},{0x9A96, 0xE6EE},{0x9A97, 0xC6AD},{0x9A98, 0xE6EF},{0x9A99, 0xF359},{0x9A9A, 0xC9A7},{0x9A9B, 0xE6F0},{0x9A9C, 0xE6F1}, - {0x9A9D, 0xE6F2},{0x9A9E, 0xE5B9},{0x9A9F, 0xE6F3},{0x9AA0, 0xE6F4},{0x9AA1, 0xC2E2},{0x9AA2, 0xE6F5},{0x9AA3, 0xE6F6},{0x9AA4, 0xD6E8}, - {0x9AA5, 0xE6F7},{0x9AA6, 0xF35A},{0x9AA7, 0xE6F8},{0x9AA8, 0xB9C7},{0x9AA9, 0xF35B},{0x9AAA, 0xF35C},{0x9AAB, 0xF35D},{0x9AAC, 0xF35E}, - {0x9AAD, 0xF35F},{0x9AAE, 0xF360},{0x9AAF, 0xF361},{0x9AB0, 0xF7BB},{0x9AB1, 0xF7BA},{0x9AB2, 0xF362},{0x9AB3, 0xF363},{0x9AB4, 0xF364}, - {0x9AB5, 0xF365},{0x9AB6, 0xF7BE},{0x9AB7, 0xF7BC},{0x9AB8, 0xBAA1},{0x9AB9, 0xF366},{0x9ABA, 0xF7BF},{0x9ABB, 0xF367},{0x9ABC, 0xF7C0}, - {0x9ABD, 0xF368},{0x9ABE, 0xF369},{0x9ABF, 0xF36A},{0x9AC0, 0xF7C2},{0x9AC1, 0xF7C1},{0x9AC2, 0xF7C4},{0x9AC3, 0xF36B},{0x9AC4, 0xF36C}, - {0x9AC5, 0xF7C3},{0x9AC6, 0xF36D},{0x9AC7, 0xF36E},{0x9AC8, 0xF36F},{0x9AC9, 0xF370},{0x9ACA, 0xF371},{0x9ACB, 0xF7C5},{0x9ACC, 0xF7C6}, - {0x9ACD, 0xF372},{0x9ACE, 0xF373},{0x9ACF, 0xF374},{0x9AD0, 0xF375},{0x9AD1, 0xF7C7},{0x9AD2, 0xF376},{0x9AD3, 0xCBE8},{0x9AD4, 0xF377}, - {0x9AD5, 0xF378},{0x9AD6, 0xF379},{0x9AD7, 0xF37A},{0x9AD8, 0xB8DF},{0x9AD9, 0xF37B},{0x9ADA, 0xF37C},{0x9ADB, 0xF37D},{0x9ADC, 0xF37E}, - {0x9ADD, 0xF380},{0x9ADE, 0xF381},{0x9ADF, 0xF7D4},{0x9AE0, 0xF382},{0x9AE1, 0xF7D5},{0x9AE2, 0xF383},{0x9AE3, 0xF384},{0x9AE4, 0xF385}, - {0x9AE5, 0xF386},{0x9AE6, 0xF7D6},{0x9AE7, 0xF387},{0x9AE8, 0xF388},{0x9AE9, 0xF389},{0x9AEA, 0xF38A},{0x9AEB, 0xF7D8},{0x9AEC, 0xF38B}, - {0x9AED, 0xF7DA},{0x9AEE, 0xF38C},{0x9AEF, 0xF7D7},{0x9AF0, 0xF38D},{0x9AF1, 0xF38E},{0x9AF2, 0xF38F},{0x9AF3, 0xF390},{0x9AF4, 0xF391}, - {0x9AF5, 0xF392},{0x9AF6, 0xF393},{0x9AF7, 0xF394},{0x9AF8, 0xF395},{0x9AF9, 0xF7DB},{0x9AFA, 0xF396},{0x9AFB, 0xF7D9},{0x9AFC, 0xF397}, - {0x9AFD, 0xF398},{0x9AFE, 0xF399},{0x9AFF, 0xF39A},{0x9B00, 0xF39B},{0x9B01, 0xF39C},{0x9B02, 0xF39D},{0x9B03, 0xD7D7},{0x9B04, 0xF39E}, - {0x9B05, 0xF39F},{0x9B06, 0xF3A0},{0x9B07, 0xF440},{0x9B08, 0xF7DC},{0x9B09, 0xF441},{0x9B0A, 0xF442},{0x9B0B, 0xF443},{0x9B0C, 0xF444}, - {0x9B0D, 0xF445},{0x9B0E, 0xF446},{0x9B0F, 0xF7DD},{0x9B10, 0xF447},{0x9B11, 0xF448},{0x9B12, 0xF449},{0x9B13, 0xF7DE},{0x9B14, 0xF44A}, - {0x9B15, 0xF44B},{0x9B16, 0xF44C},{0x9B17, 0xF44D},{0x9B18, 0xF44E},{0x9B19, 0xF44F},{0x9B1A, 0xF450},{0x9B1B, 0xF451},{0x9B1C, 0xF452}, - {0x9B1D, 0xF453},{0x9B1E, 0xF454},{0x9B1F, 0xF7DF},{0x9B20, 0xF455},{0x9B21, 0xF456},{0x9B22, 0xF457},{0x9B23, 0xF7E0},{0x9B24, 0xF458}, - {0x9B25, 0xF459},{0x9B26, 0xF45A},{0x9B27, 0xF45B},{0x9B28, 0xF45C},{0x9B29, 0xF45D},{0x9B2A, 0xF45E},{0x9B2B, 0xF45F},{0x9B2C, 0xF460}, - {0x9B2D, 0xF461},{0x9B2E, 0xF462},{0x9B2F, 0xDBCB},{0x9B30, 0xF463},{0x9B31, 0xF464},{0x9B32, 0xD8AA},{0x9B33, 0xF465},{0x9B34, 0xF466}, - {0x9B35, 0xF467},{0x9B36, 0xF468},{0x9B37, 0xF469},{0x9B38, 0xF46A},{0x9B39, 0xF46B},{0x9B3A, 0xF46C},{0x9B3B, 0xE5F7},{0x9B3C, 0xB9ED}, - {0x9B3D, 0xF46D},{0x9B3E, 0xF46E},{0x9B3F, 0xF46F},{0x9B40, 0xF470},{0x9B41, 0xBFFD},{0x9B42, 0xBBEA},{0x9B43, 0xF7C9},{0x9B44, 0xC6C7}, - {0x9B45, 0xF7C8},{0x9B46, 0xF471},{0x9B47, 0xF7CA},{0x9B48, 0xF7CC},{0x9B49, 0xF7CB},{0x9B4A, 0xF472},{0x9B4B, 0xF473},{0x9B4C, 0xF474}, - {0x9B4D, 0xF7CD},{0x9B4E, 0xF475},{0x9B4F, 0xCEBA},{0x9B50, 0xF476},{0x9B51, 0xF7CE},{0x9B52, 0xF477},{0x9B53, 0xF478},{0x9B54, 0xC4A7}, - {0x9B55, 0xF479},{0x9B56, 0xF47A},{0x9B57, 0xF47B},{0x9B58, 0xF47C},{0x9B59, 0xF47D},{0x9B5A, 0xF47E},{0x9B5B, 0xF480},{0x9B5C, 0xF481}, - {0x9B5D, 0xF482},{0x9B5E, 0xF483},{0x9B5F, 0xF484},{0x9B60, 0xF485},{0x9B61, 0xF486},{0x9B62, 0xF487},{0x9B63, 0xF488},{0x9B64, 0xF489}, - {0x9B65, 0xF48A},{0x9B66, 0xF48B},{0x9B67, 0xF48C},{0x9B68, 0xF48D},{0x9B69, 0xF48E},{0x9B6A, 0xF48F},{0x9B6B, 0xF490},{0x9B6C, 0xF491}, - {0x9B6D, 0xF492},{0x9B6E, 0xF493},{0x9B6F, 0xF494},{0x9B70, 0xF495},{0x9B71, 0xF496},{0x9B72, 0xF497},{0x9B73, 0xF498},{0x9B74, 0xF499}, - {0x9B75, 0xF49A},{0x9B76, 0xF49B},{0x9B77, 0xF49C},{0x9B78, 0xF49D},{0x9B79, 0xF49E},{0x9B7A, 0xF49F},{0x9B7B, 0xF4A0},{0x9B7C, 0xF540}, - {0x9B7D, 0xF541},{0x9B7E, 0xF542},{0x9B7F, 0xF543},{0x9B80, 0xF544},{0x9B81, 0xF545},{0x9B82, 0xF546},{0x9B83, 0xF547},{0x9B84, 0xF548}, - {0x9B85, 0xF549},{0x9B86, 0xF54A},{0x9B87, 0xF54B},{0x9B88, 0xF54C},{0x9B89, 0xF54D},{0x9B8A, 0xF54E},{0x9B8B, 0xF54F},{0x9B8C, 0xF550}, - {0x9B8D, 0xF551},{0x9B8E, 0xF552},{0x9B8F, 0xF553},{0x9B90, 0xF554},{0x9B91, 0xF555},{0x9B92, 0xF556},{0x9B93, 0xF557},{0x9B94, 0xF558}, - {0x9B95, 0xF559},{0x9B96, 0xF55A},{0x9B97, 0xF55B},{0x9B98, 0xF55C},{0x9B99, 0xF55D},{0x9B9A, 0xF55E},{0x9B9B, 0xF55F},{0x9B9C, 0xF560}, - {0x9B9D, 0xF561},{0x9B9E, 0xF562},{0x9B9F, 0xF563},{0x9BA0, 0xF564},{0x9BA1, 0xF565},{0x9BA2, 0xF566},{0x9BA3, 0xF567},{0x9BA4, 0xF568}, - {0x9BA5, 0xF569},{0x9BA6, 0xF56A},{0x9BA7, 0xF56B},{0x9BA8, 0xF56C},{0x9BA9, 0xF56D},{0x9BAA, 0xF56E},{0x9BAB, 0xF56F},{0x9BAC, 0xF570}, - {0x9BAD, 0xF571},{0x9BAE, 0xF572},{0x9BAF, 0xF573},{0x9BB0, 0xF574},{0x9BB1, 0xF575},{0x9BB2, 0xF576},{0x9BB3, 0xF577},{0x9BB4, 0xF578}, - {0x9BB5, 0xF579},{0x9BB6, 0xF57A},{0x9BB7, 0xF57B},{0x9BB8, 0xF57C},{0x9BB9, 0xF57D},{0x9BBA, 0xF57E},{0x9BBB, 0xF580},{0x9BBC, 0xF581}, - {0x9BBD, 0xF582},{0x9BBE, 0xF583},{0x9BBF, 0xF584},{0x9BC0, 0xF585},{0x9BC1, 0xF586},{0x9BC2, 0xF587},{0x9BC3, 0xF588},{0x9BC4, 0xF589}, - {0x9BC5, 0xF58A},{0x9BC6, 0xF58B},{0x9BC7, 0xF58C},{0x9BC8, 0xF58D},{0x9BC9, 0xF58E},{0x9BCA, 0xF58F},{0x9BCB, 0xF590},{0x9BCC, 0xF591}, - {0x9BCD, 0xF592},{0x9BCE, 0xF593},{0x9BCF, 0xF594},{0x9BD0, 0xF595},{0x9BD1, 0xF596},{0x9BD2, 0xF597},{0x9BD3, 0xF598},{0x9BD4, 0xF599}, - {0x9BD5, 0xF59A},{0x9BD6, 0xF59B},{0x9BD7, 0xF59C},{0x9BD8, 0xF59D},{0x9BD9, 0xF59E},{0x9BDA, 0xF59F},{0x9BDB, 0xF5A0},{0x9BDC, 0xF640}, - {0x9BDD, 0xF641},{0x9BDE, 0xF642},{0x9BDF, 0xF643},{0x9BE0, 0xF644},{0x9BE1, 0xF645},{0x9BE2, 0xF646},{0x9BE3, 0xF647},{0x9BE4, 0xF648}, - {0x9BE5, 0xF649},{0x9BE6, 0xF64A},{0x9BE7, 0xF64B},{0x9BE8, 0xF64C},{0x9BE9, 0xF64D},{0x9BEA, 0xF64E},{0x9BEB, 0xF64F},{0x9BEC, 0xF650}, - {0x9BED, 0xF651},{0x9BEE, 0xF652},{0x9BEF, 0xF653},{0x9BF0, 0xF654},{0x9BF1, 0xF655},{0x9BF2, 0xF656},{0x9BF3, 0xF657},{0x9BF4, 0xF658}, - {0x9BF5, 0xF659},{0x9BF6, 0xF65A},{0x9BF7, 0xF65B},{0x9BF8, 0xF65C},{0x9BF9, 0xF65D},{0x9BFA, 0xF65E},{0x9BFB, 0xF65F},{0x9BFC, 0xF660}, - {0x9BFD, 0xF661},{0x9BFE, 0xF662},{0x9BFF, 0xF663},{0x9C00, 0xF664},{0x9C01, 0xF665},{0x9C02, 0xF666},{0x9C03, 0xF667},{0x9C04, 0xF668}, - {0x9C05, 0xF669},{0x9C06, 0xF66A},{0x9C07, 0xF66B},{0x9C08, 0xF66C},{0x9C09, 0xF66D},{0x9C0A, 0xF66E},{0x9C0B, 0xF66F},{0x9C0C, 0xF670}, - {0x9C0D, 0xF671},{0x9C0E, 0xF672},{0x9C0F, 0xF673},{0x9C10, 0xF674},{0x9C11, 0xF675},{0x9C12, 0xF676},{0x9C13, 0xF677},{0x9C14, 0xF678}, - {0x9C15, 0xF679},{0x9C16, 0xF67A},{0x9C17, 0xF67B},{0x9C18, 0xF67C},{0x9C19, 0xF67D},{0x9C1A, 0xF67E},{0x9C1B, 0xF680},{0x9C1C, 0xF681}, - {0x9C1D, 0xF682},{0x9C1E, 0xF683},{0x9C1F, 0xF684},{0x9C20, 0xF685},{0x9C21, 0xF686},{0x9C22, 0xF687},{0x9C23, 0xF688},{0x9C24, 0xF689}, - {0x9C25, 0xF68A},{0x9C26, 0xF68B},{0x9C27, 0xF68C},{0x9C28, 0xF68D},{0x9C29, 0xF68E},{0x9C2A, 0xF68F},{0x9C2B, 0xF690},{0x9C2C, 0xF691}, - {0x9C2D, 0xF692},{0x9C2E, 0xF693},{0x9C2F, 0xF694},{0x9C30, 0xF695},{0x9C31, 0xF696},{0x9C32, 0xF697},{0x9C33, 0xF698},{0x9C34, 0xF699}, - {0x9C35, 0xF69A},{0x9C36, 0xF69B},{0x9C37, 0xF69C},{0x9C38, 0xF69D},{0x9C39, 0xF69E},{0x9C3A, 0xF69F},{0x9C3B, 0xF6A0},{0x9C3C, 0xF740}, - {0x9C3D, 0xF741},{0x9C3E, 0xF742},{0x9C3F, 0xF743},{0x9C40, 0xF744},{0x9C41, 0xF745},{0x9C42, 0xF746},{0x9C43, 0xF747},{0x9C44, 0xF748}, - {0x9C45, 0xF749},{0x9C46, 0xF74A},{0x9C47, 0xF74B},{0x9C48, 0xF74C},{0x9C49, 0xF74D},{0x9C4A, 0xF74E},{0x9C4B, 0xF74F},{0x9C4C, 0xF750}, - {0x9C4D, 0xF751},{0x9C4E, 0xF752},{0x9C4F, 0xF753},{0x9C50, 0xF754},{0x9C51, 0xF755},{0x9C52, 0xF756},{0x9C53, 0xF757},{0x9C54, 0xF758}, - {0x9C55, 0xF759},{0x9C56, 0xF75A},{0x9C57, 0xF75B},{0x9C58, 0xF75C},{0x9C59, 0xF75D},{0x9C5A, 0xF75E},{0x9C5B, 0xF75F},{0x9C5C, 0xF760}, - {0x9C5D, 0xF761},{0x9C5E, 0xF762},{0x9C5F, 0xF763},{0x9C60, 0xF764},{0x9C61, 0xF765},{0x9C62, 0xF766},{0x9C63, 0xF767},{0x9C64, 0xF768}, - {0x9C65, 0xF769},{0x9C66, 0xF76A},{0x9C67, 0xF76B},{0x9C68, 0xF76C},{0x9C69, 0xF76D},{0x9C6A, 0xF76E},{0x9C6B, 0xF76F},{0x9C6C, 0xF770}, - {0x9C6D, 0xF771},{0x9C6E, 0xF772},{0x9C6F, 0xF773},{0x9C70, 0xF774},{0x9C71, 0xF775},{0x9C72, 0xF776},{0x9C73, 0xF777},{0x9C74, 0xF778}, - {0x9C75, 0xF779},{0x9C76, 0xF77A},{0x9C77, 0xF77B},{0x9C78, 0xF77C},{0x9C79, 0xF77D},{0x9C7A, 0xF77E},{0x9C7B, 0xF780},{0x9C7C, 0xD3E3}, - {0x9C7D, 0xF781},{0x9C7E, 0xF782},{0x9C7F, 0xF6CF},{0x9C80, 0xF783},{0x9C81, 0xC2B3},{0x9C82, 0xF6D0},{0x9C83, 0xF784},{0x9C84, 0xF785}, - {0x9C85, 0xF6D1},{0x9C86, 0xF6D2},{0x9C87, 0xF6D3},{0x9C88, 0xF6D4},{0x9C89, 0xF786},{0x9C8A, 0xF787},{0x9C8B, 0xF6D6},{0x9C8C, 0xF788}, - {0x9C8D, 0xB1AB},{0x9C8E, 0xF6D7},{0x9C8F, 0xF789},{0x9C90, 0xF6D8},{0x9C91, 0xF6D9},{0x9C92, 0xF6DA},{0x9C93, 0xF78A},{0x9C94, 0xF6DB}, - {0x9C95, 0xF6DC},{0x9C96, 0xF78B},{0x9C97, 0xF78C},{0x9C98, 0xF78D},{0x9C99, 0xF78E},{0x9C9A, 0xF6DD},{0x9C9B, 0xF6DE},{0x9C9C, 0xCFCA}, - {0x9C9D, 0xF78F},{0x9C9E, 0xF6DF},{0x9C9F, 0xF6E0},{0x9CA0, 0xF6E1},{0x9CA1, 0xF6E2},{0x9CA2, 0xF6E3},{0x9CA3, 0xF6E4},{0x9CA4, 0xC0F0}, - {0x9CA5, 0xF6E5},{0x9CA6, 0xF6E6},{0x9CA7, 0xF6E7},{0x9CA8, 0xF6E8},{0x9CA9, 0xF6E9},{0x9CAA, 0xF790},{0x9CAB, 0xF6EA},{0x9CAC, 0xF791}, - {0x9CAD, 0xF6EB},{0x9CAE, 0xF6EC},{0x9CAF, 0xF792},{0x9CB0, 0xF6ED},{0x9CB1, 0xF6EE},{0x9CB2, 0xF6EF},{0x9CB3, 0xF6F0},{0x9CB4, 0xF6F1}, - {0x9CB5, 0xF6F2},{0x9CB6, 0xF6F3},{0x9CB7, 0xF6F4},{0x9CB8, 0xBEA8},{0x9CB9, 0xF793},{0x9CBA, 0xF6F5},{0x9CBB, 0xF6F6},{0x9CBC, 0xF6F7}, - {0x9CBD, 0xF6F8},{0x9CBE, 0xF794},{0x9CBF, 0xF795},{0x9CC0, 0xF796},{0x9CC1, 0xF797},{0x9CC2, 0xF798},{0x9CC3, 0xC8FA},{0x9CC4, 0xF6F9}, - {0x9CC5, 0xF6FA},{0x9CC6, 0xF6FB},{0x9CC7, 0xF6FC},{0x9CC8, 0xF799},{0x9CC9, 0xF79A},{0x9CCA, 0xF6FD},{0x9CCB, 0xF6FE},{0x9CCC, 0xF7A1}, - {0x9CCD, 0xF7A2},{0x9CCE, 0xF7A3},{0x9CCF, 0xF7A4},{0x9CD0, 0xF7A5},{0x9CD1, 0xF79B},{0x9CD2, 0xF79C},{0x9CD3, 0xF7A6},{0x9CD4, 0xF7A7}, - {0x9CD5, 0xF7A8},{0x9CD6, 0xB1EE},{0x9CD7, 0xF7A9},{0x9CD8, 0xF7AA},{0x9CD9, 0xF7AB},{0x9CDA, 0xF79D},{0x9CDB, 0xF79E},{0x9CDC, 0xF7AC}, - {0x9CDD, 0xF7AD},{0x9CDE, 0xC1DB},{0x9CDF, 0xF7AE},{0x9CE0, 0xF79F},{0x9CE1, 0xF7A0},{0x9CE2, 0xF7AF},{0x9CE3, 0xF840},{0x9CE4, 0xF841}, - {0x9CE5, 0xF842},{0x9CE6, 0xF843},{0x9CE7, 0xF844},{0x9CE8, 0xF845},{0x9CE9, 0xF846},{0x9CEA, 0xF847},{0x9CEB, 0xF848},{0x9CEC, 0xF849}, - {0x9CED, 0xF84A},{0x9CEE, 0xF84B},{0x9CEF, 0xF84C},{0x9CF0, 0xF84D},{0x9CF1, 0xF84E},{0x9CF2, 0xF84F},{0x9CF3, 0xF850},{0x9CF4, 0xF851}, - {0x9CF5, 0xF852},{0x9CF6, 0xF853},{0x9CF7, 0xF854},{0x9CF8, 0xF855},{0x9CF9, 0xF856},{0x9CFA, 0xF857},{0x9CFB, 0xF858},{0x9CFC, 0xF859}, - {0x9CFD, 0xF85A},{0x9CFE, 0xF85B},{0x9CFF, 0xF85C},{0x9D00, 0xF85D},{0x9D01, 0xF85E},{0x9D02, 0xF85F},{0x9D03, 0xF860},{0x9D04, 0xF861}, - {0x9D05, 0xF862},{0x9D06, 0xF863},{0x9D07, 0xF864},{0x9D08, 0xF865},{0x9D09, 0xF866},{0x9D0A, 0xF867},{0x9D0B, 0xF868},{0x9D0C, 0xF869}, - {0x9D0D, 0xF86A},{0x9D0E, 0xF86B},{0x9D0F, 0xF86C},{0x9D10, 0xF86D},{0x9D11, 0xF86E},{0x9D12, 0xF86F},{0x9D13, 0xF870},{0x9D14, 0xF871}, - {0x9D15, 0xF872},{0x9D16, 0xF873},{0x9D17, 0xF874},{0x9D18, 0xF875},{0x9D19, 0xF876},{0x9D1A, 0xF877},{0x9D1B, 0xF878},{0x9D1C, 0xF879}, - {0x9D1D, 0xF87A},{0x9D1E, 0xF87B},{0x9D1F, 0xF87C},{0x9D20, 0xF87D},{0x9D21, 0xF87E},{0x9D22, 0xF880},{0x9D23, 0xF881},{0x9D24, 0xF882}, - {0x9D25, 0xF883},{0x9D26, 0xF884},{0x9D27, 0xF885},{0x9D28, 0xF886},{0x9D29, 0xF887},{0x9D2A, 0xF888},{0x9D2B, 0xF889},{0x9D2C, 0xF88A}, - {0x9D2D, 0xF88B},{0x9D2E, 0xF88C},{0x9D2F, 0xF88D},{0x9D30, 0xF88E},{0x9D31, 0xF88F},{0x9D32, 0xF890},{0x9D33, 0xF891},{0x9D34, 0xF892}, - {0x9D35, 0xF893},{0x9D36, 0xF894},{0x9D37, 0xF895},{0x9D38, 0xF896},{0x9D39, 0xF897},{0x9D3A, 0xF898},{0x9D3B, 0xF899},{0x9D3C, 0xF89A}, - {0x9D3D, 0xF89B},{0x9D3E, 0xF89C},{0x9D3F, 0xF89D},{0x9D40, 0xF89E},{0x9D41, 0xF89F},{0x9D42, 0xF8A0},{0x9D43, 0xF940},{0x9D44, 0xF941}, - {0x9D45, 0xF942},{0x9D46, 0xF943},{0x9D47, 0xF944},{0x9D48, 0xF945},{0x9D49, 0xF946},{0x9D4A, 0xF947},{0x9D4B, 0xF948},{0x9D4C, 0xF949}, - {0x9D4D, 0xF94A},{0x9D4E, 0xF94B},{0x9D4F, 0xF94C},{0x9D50, 0xF94D},{0x9D51, 0xF94E},{0x9D52, 0xF94F},{0x9D53, 0xF950},{0x9D54, 0xF951}, - {0x9D55, 0xF952},{0x9D56, 0xF953},{0x9D57, 0xF954},{0x9D58, 0xF955},{0x9D59, 0xF956},{0x9D5A, 0xF957},{0x9D5B, 0xF958},{0x9D5C, 0xF959}, - {0x9D5D, 0xF95A},{0x9D5E, 0xF95B},{0x9D5F, 0xF95C},{0x9D60, 0xF95D},{0x9D61, 0xF95E},{0x9D62, 0xF95F},{0x9D63, 0xF960},{0x9D64, 0xF961}, - {0x9D65, 0xF962},{0x9D66, 0xF963},{0x9D67, 0xF964},{0x9D68, 0xF965},{0x9D69, 0xF966},{0x9D6A, 0xF967},{0x9D6B, 0xF968},{0x9D6C, 0xF969}, - {0x9D6D, 0xF96A},{0x9D6E, 0xF96B},{0x9D6F, 0xF96C},{0x9D70, 0xF96D},{0x9D71, 0xF96E},{0x9D72, 0xF96F},{0x9D73, 0xF970},{0x9D74, 0xF971}, - {0x9D75, 0xF972},{0x9D76, 0xF973},{0x9D77, 0xF974},{0x9D78, 0xF975},{0x9D79, 0xF976},{0x9D7A, 0xF977},{0x9D7B, 0xF978},{0x9D7C, 0xF979}, - {0x9D7D, 0xF97A},{0x9D7E, 0xF97B},{0x9D7F, 0xF97C},{0x9D80, 0xF97D},{0x9D81, 0xF97E},{0x9D82, 0xF980},{0x9D83, 0xF981},{0x9D84, 0xF982}, - {0x9D85, 0xF983},{0x9D86, 0xF984},{0x9D87, 0xF985},{0x9D88, 0xF986},{0x9D89, 0xF987},{0x9D8A, 0xF988},{0x9D8B, 0xF989},{0x9D8C, 0xF98A}, - {0x9D8D, 0xF98B},{0x9D8E, 0xF98C},{0x9D8F, 0xF98D},{0x9D90, 0xF98E},{0x9D91, 0xF98F},{0x9D92, 0xF990},{0x9D93, 0xF991},{0x9D94, 0xF992}, - {0x9D95, 0xF993},{0x9D96, 0xF994},{0x9D97, 0xF995},{0x9D98, 0xF996},{0x9D99, 0xF997},{0x9D9A, 0xF998},{0x9D9B, 0xF999},{0x9D9C, 0xF99A}, - {0x9D9D, 0xF99B},{0x9D9E, 0xF99C},{0x9D9F, 0xF99D},{0x9DA0, 0xF99E},{0x9DA1, 0xF99F},{0x9DA2, 0xF9A0},{0x9DA3, 0xFA40},{0x9DA4, 0xFA41}, - {0x9DA5, 0xFA42},{0x9DA6, 0xFA43},{0x9DA7, 0xFA44},{0x9DA8, 0xFA45},{0x9DA9, 0xFA46},{0x9DAA, 0xFA47},{0x9DAB, 0xFA48},{0x9DAC, 0xFA49}, - {0x9DAD, 0xFA4A},{0x9DAE, 0xFA4B},{0x9DAF, 0xFA4C},{0x9DB0, 0xFA4D},{0x9DB1, 0xFA4E},{0x9DB2, 0xFA4F},{0x9DB3, 0xFA50},{0x9DB4, 0xFA51}, - {0x9DB5, 0xFA52},{0x9DB6, 0xFA53},{0x9DB7, 0xFA54},{0x9DB8, 0xFA55},{0x9DB9, 0xFA56},{0x9DBA, 0xFA57},{0x9DBB, 0xFA58},{0x9DBC, 0xFA59}, - {0x9DBD, 0xFA5A},{0x9DBE, 0xFA5B},{0x9DBF, 0xFA5C},{0x9DC0, 0xFA5D},{0x9DC1, 0xFA5E},{0x9DC2, 0xFA5F},{0x9DC3, 0xFA60},{0x9DC4, 0xFA61}, - {0x9DC5, 0xFA62},{0x9DC6, 0xFA63},{0x9DC7, 0xFA64},{0x9DC8, 0xFA65},{0x9DC9, 0xFA66},{0x9DCA, 0xFA67},{0x9DCB, 0xFA68},{0x9DCC, 0xFA69}, - {0x9DCD, 0xFA6A},{0x9DCE, 0xFA6B},{0x9DCF, 0xFA6C},{0x9DD0, 0xFA6D},{0x9DD1, 0xFA6E},{0x9DD2, 0xFA6F},{0x9DD3, 0xFA70},{0x9DD4, 0xFA71}, - {0x9DD5, 0xFA72},{0x9DD6, 0xFA73},{0x9DD7, 0xFA74},{0x9DD8, 0xFA75},{0x9DD9, 0xFA76},{0x9DDA, 0xFA77},{0x9DDB, 0xFA78},{0x9DDC, 0xFA79}, - {0x9DDD, 0xFA7A},{0x9DDE, 0xFA7B},{0x9DDF, 0xFA7C},{0x9DE0, 0xFA7D},{0x9DE1, 0xFA7E},{0x9DE2, 0xFA80},{0x9DE3, 0xFA81},{0x9DE4, 0xFA82}, - {0x9DE5, 0xFA83},{0x9DE6, 0xFA84},{0x9DE7, 0xFA85},{0x9DE8, 0xFA86},{0x9DE9, 0xFA87},{0x9DEA, 0xFA88},{0x9DEB, 0xFA89},{0x9DEC, 0xFA8A}, - {0x9DED, 0xFA8B},{0x9DEE, 0xFA8C},{0x9DEF, 0xFA8D},{0x9DF0, 0xFA8E},{0x9DF1, 0xFA8F},{0x9DF2, 0xFA90},{0x9DF3, 0xFA91},{0x9DF4, 0xFA92}, - {0x9DF5, 0xFA93},{0x9DF6, 0xFA94},{0x9DF7, 0xFA95},{0x9DF8, 0xFA96},{0x9DF9, 0xFA97},{0x9DFA, 0xFA98},{0x9DFB, 0xFA99},{0x9DFC, 0xFA9A}, - {0x9DFD, 0xFA9B},{0x9DFE, 0xFA9C},{0x9DFF, 0xFA9D},{0x9E00, 0xFA9E},{0x9E01, 0xFA9F},{0x9E02, 0xFAA0},{0x9E03, 0xFB40},{0x9E04, 0xFB41}, - {0x9E05, 0xFB42},{0x9E06, 0xFB43},{0x9E07, 0xFB44},{0x9E08, 0xFB45},{0x9E09, 0xFB46},{0x9E0A, 0xFB47},{0x9E0B, 0xFB48},{0x9E0C, 0xFB49}, - {0x9E0D, 0xFB4A},{0x9E0E, 0xFB4B},{0x9E0F, 0xFB4C},{0x9E10, 0xFB4D},{0x9E11, 0xFB4E},{0x9E12, 0xFB4F},{0x9E13, 0xFB50},{0x9E14, 0xFB51}, - {0x9E15, 0xFB52},{0x9E16, 0xFB53},{0x9E17, 0xFB54},{0x9E18, 0xFB55},{0x9E19, 0xFB56},{0x9E1A, 0xFB57},{0x9E1B, 0xFB58},{0x9E1C, 0xFB59}, - {0x9E1D, 0xFB5A},{0x9E1E, 0xFB5B},{0x9E1F, 0xC4F1},{0x9E20, 0xF0AF},{0x9E21, 0xBCA6},{0x9E22, 0xF0B0},{0x9E23, 0xC3F9},{0x9E24, 0xFB5C}, - {0x9E25, 0xC5B8},{0x9E26, 0xD1BB},{0x9E27, 0xFB5D},{0x9E28, 0xF0B1},{0x9E29, 0xF0B2},{0x9E2A, 0xF0B3},{0x9E2B, 0xF0B4},{0x9E2C, 0xF0B5}, - {0x9E2D, 0xD1BC},{0x9E2E, 0xFB5E},{0x9E2F, 0xD1EC},{0x9E30, 0xFB5F},{0x9E31, 0xF0B7},{0x9E32, 0xF0B6},{0x9E33, 0xD4A7},{0x9E34, 0xFB60}, - {0x9E35, 0xCDD2},{0x9E36, 0xF0B8},{0x9E37, 0xF0BA},{0x9E38, 0xF0B9},{0x9E39, 0xF0BB},{0x9E3A, 0xF0BC},{0x9E3B, 0xFB61},{0x9E3C, 0xFB62}, - {0x9E3D, 0xB8EB},{0x9E3E, 0xF0BD},{0x9E3F, 0xBAE8},{0x9E40, 0xFB63},{0x9E41, 0xF0BE},{0x9E42, 0xF0BF},{0x9E43, 0xBEE9},{0x9E44, 0xF0C0}, - {0x9E45, 0xB6EC},{0x9E46, 0xF0C1},{0x9E47, 0xF0C2},{0x9E48, 0xF0C3},{0x9E49, 0xF0C4},{0x9E4A, 0xC8B5},{0x9E4B, 0xF0C5},{0x9E4C, 0xF0C6}, - {0x9E4D, 0xFB64},{0x9E4E, 0xF0C7},{0x9E4F, 0xC5F4},{0x9E50, 0xFB65},{0x9E51, 0xF0C8},{0x9E52, 0xFB66},{0x9E53, 0xFB67},{0x9E54, 0xFB68}, - {0x9E55, 0xF0C9},{0x9E56, 0xFB69},{0x9E57, 0xF0CA},{0x9E58, 0xF7BD},{0x9E59, 0xFB6A},{0x9E5A, 0xF0CB},{0x9E5B, 0xF0CC},{0x9E5C, 0xF0CD}, - {0x9E5D, 0xFB6B},{0x9E5E, 0xF0CE},{0x9E5F, 0xFB6C},{0x9E60, 0xFB6D},{0x9E61, 0xFB6E},{0x9E62, 0xFB6F},{0x9E63, 0xF0CF},{0x9E64, 0xBAD7}, - {0x9E65, 0xFB70},{0x9E66, 0xF0D0},{0x9E67, 0xF0D1},{0x9E68, 0xF0D2},{0x9E69, 0xF0D3},{0x9E6A, 0xF0D4},{0x9E6B, 0xF0D5},{0x9E6C, 0xF0D6}, - {0x9E6D, 0xF0D8},{0x9E6E, 0xFB71},{0x9E6F, 0xFB72},{0x9E70, 0xD3A5},{0x9E71, 0xF0D7},{0x9E72, 0xFB73},{0x9E73, 0xF0D9},{0x9E74, 0xFB74}, - {0x9E75, 0xFB75},{0x9E76, 0xFB76},{0x9E77, 0xFB77},{0x9E78, 0xFB78},{0x9E79, 0xFB79},{0x9E7A, 0xFB7A},{0x9E7B, 0xFB7B},{0x9E7C, 0xFB7C}, - {0x9E7D, 0xFB7D},{0x9E7E, 0xF5BA},{0x9E7F, 0xC2B9},{0x9E80, 0xFB7E},{0x9E81, 0xFB80},{0x9E82, 0xF7E4},{0x9E83, 0xFB81},{0x9E84, 0xFB82}, - {0x9E85, 0xFB83},{0x9E86, 0xFB84},{0x9E87, 0xF7E5},{0x9E88, 0xF7E6},{0x9E89, 0xFB85},{0x9E8A, 0xFB86},{0x9E8B, 0xF7E7},{0x9E8C, 0xFB87}, - {0x9E8D, 0xFB88},{0x9E8E, 0xFB89},{0x9E8F, 0xFB8A},{0x9E90, 0xFB8B},{0x9E91, 0xFB8C},{0x9E92, 0xF7E8},{0x9E93, 0xC2B4},{0x9E94, 0xFB8D}, - {0x9E95, 0xFB8E},{0x9E96, 0xFB8F},{0x9E97, 0xFB90},{0x9E98, 0xFB91},{0x9E99, 0xFB92},{0x9E9A, 0xFB93},{0x9E9B, 0xFB94},{0x9E9C, 0xFB95}, - {0x9E9D, 0xF7EA},{0x9E9E, 0xFB96},{0x9E9F, 0xF7EB},{0x9EA0, 0xFB97},{0x9EA1, 0xFB98},{0x9EA2, 0xFB99},{0x9EA3, 0xFB9A},{0x9EA4, 0xFB9B}, - {0x9EA5, 0xFB9C},{0x9EA6, 0xC2F3},{0x9EA7, 0xFB9D},{0x9EA8, 0xFB9E},{0x9EA9, 0xFB9F},{0x9EAA, 0xFBA0},{0x9EAB, 0xFC40},{0x9EAC, 0xFC41}, - {0x9EAD, 0xFC42},{0x9EAE, 0xFC43},{0x9EAF, 0xFC44},{0x9EB0, 0xFC45},{0x9EB1, 0xFC46},{0x9EB2, 0xFC47},{0x9EB3, 0xFC48},{0x9EB4, 0xF4F0}, - {0x9EB5, 0xFC49},{0x9EB6, 0xFC4A},{0x9EB7, 0xFC4B},{0x9EB8, 0xF4EF},{0x9EB9, 0xFC4C},{0x9EBA, 0xFC4D},{0x9EBB, 0xC2E9},{0x9EBC, 0xFC4E}, - {0x9EBD, 0xF7E1},{0x9EBE, 0xF7E2},{0x9EBF, 0xFC4F},{0x9EC0, 0xFC50},{0x9EC1, 0xFC51},{0x9EC2, 0xFC52},{0x9EC3, 0xFC53},{0x9EC4, 0xBBC6}, - {0x9EC5, 0xFC54},{0x9EC6, 0xFC55},{0x9EC7, 0xFC56},{0x9EC8, 0xFC57},{0x9EC9, 0xD9E4},{0x9ECA, 0xFC58},{0x9ECB, 0xFC59},{0x9ECC, 0xFC5A}, - {0x9ECD, 0xCAF2},{0x9ECE, 0xC0E8},{0x9ECF, 0xF0A4},{0x9ED0, 0xFC5B},{0x9ED1, 0xBADA},{0x9ED2, 0xFC5C},{0x9ED3, 0xFC5D},{0x9ED4, 0xC7AD}, - {0x9ED5, 0xFC5E},{0x9ED6, 0xFC5F},{0x9ED7, 0xFC60},{0x9ED8, 0xC4AC},{0x9ED9, 0xFC61},{0x9EDA, 0xFC62},{0x9EDB, 0xF7EC},{0x9EDC, 0xF7ED}, - {0x9EDD, 0xF7EE},{0x9EDE, 0xFC63},{0x9EDF, 0xF7F0},{0x9EE0, 0xF7EF},{0x9EE1, 0xFC64},{0x9EE2, 0xF7F1},{0x9EE3, 0xFC65},{0x9EE4, 0xFC66}, - {0x9EE5, 0xF7F4},{0x9EE6, 0xFC67},{0x9EE7, 0xF7F3},{0x9EE8, 0xFC68},{0x9EE9, 0xF7F2},{0x9EEA, 0xF7F5},{0x9EEB, 0xFC69},{0x9EEC, 0xFC6A}, - {0x9EED, 0xFC6B},{0x9EEE, 0xFC6C},{0x9EEF, 0xF7F6},{0x9EF0, 0xFC6D},{0x9EF1, 0xFC6E},{0x9EF2, 0xFC6F},{0x9EF3, 0xFC70},{0x9EF4, 0xFC71}, - {0x9EF5, 0xFC72},{0x9EF6, 0xFC73},{0x9EF7, 0xFC74},{0x9EF8, 0xFC75},{0x9EF9, 0xEDE9},{0x9EFA, 0xFC76},{0x9EFB, 0xEDEA},{0x9EFC, 0xEDEB}, - {0x9EFD, 0xFC77},{0x9EFE, 0xF6BC},{0x9EFF, 0xFC78},{0x9F00, 0xFC79},{0x9F01, 0xFC7A},{0x9F02, 0xFC7B},{0x9F03, 0xFC7C},{0x9F04, 0xFC7D}, - {0x9F05, 0xFC7E},{0x9F06, 0xFC80},{0x9F07, 0xFC81},{0x9F08, 0xFC82},{0x9F09, 0xFC83},{0x9F0A, 0xFC84},{0x9F0B, 0xF6BD},{0x9F0C, 0xFC85}, - {0x9F0D, 0xF6BE},{0x9F0E, 0xB6A6},{0x9F0F, 0xFC86},{0x9F10, 0xD8BE},{0x9F11, 0xFC87},{0x9F12, 0xFC88},{0x9F13, 0xB9C4},{0x9F14, 0xFC89}, - {0x9F15, 0xFC8A},{0x9F16, 0xFC8B},{0x9F17, 0xD8BB},{0x9F18, 0xFC8C},{0x9F19, 0xDCB1},{0x9F1A, 0xFC8D},{0x9F1B, 0xFC8E},{0x9F1C, 0xFC8F}, - {0x9F1D, 0xFC90},{0x9F1E, 0xFC91},{0x9F1F, 0xFC92},{0x9F20, 0xCAF3},{0x9F21, 0xFC93},{0x9F22, 0xF7F7},{0x9F23, 0xFC94},{0x9F24, 0xFC95}, - {0x9F25, 0xFC96},{0x9F26, 0xFC97},{0x9F27, 0xFC98},{0x9F28, 0xFC99},{0x9F29, 0xFC9A},{0x9F2A, 0xFC9B},{0x9F2B, 0xFC9C},{0x9F2C, 0xF7F8}, - {0x9F2D, 0xFC9D},{0x9F2E, 0xFC9E},{0x9F2F, 0xF7F9},{0x9F30, 0xFC9F},{0x9F31, 0xFCA0},{0x9F32, 0xFD40},{0x9F33, 0xFD41},{0x9F34, 0xFD42}, - {0x9F35, 0xFD43},{0x9F36, 0xFD44},{0x9F37, 0xF7FB},{0x9F38, 0xFD45},{0x9F39, 0xF7FA},{0x9F3A, 0xFD46},{0x9F3B, 0xB1C7},{0x9F3C, 0xFD47}, - {0x9F3D, 0xF7FC},{0x9F3E, 0xF7FD},{0x9F3F, 0xFD48},{0x9F40, 0xFD49},{0x9F41, 0xFD4A},{0x9F42, 0xFD4B},{0x9F43, 0xFD4C},{0x9F44, 0xF7FE}, - {0x9F45, 0xFD4D},{0x9F46, 0xFD4E},{0x9F47, 0xFD4F},{0x9F48, 0xFD50},{0x9F49, 0xFD51},{0x9F4A, 0xFD52},{0x9F4B, 0xFD53},{0x9F4C, 0xFD54}, - {0x9F4D, 0xFD55},{0x9F4E, 0xFD56},{0x9F4F, 0xFD57},{0x9F50, 0xC6EB},{0x9F51, 0xECB4},{0x9F52, 0xFD58},{0x9F53, 0xFD59},{0x9F54, 0xFD5A}, - {0x9F55, 0xFD5B},{0x9F56, 0xFD5C},{0x9F57, 0xFD5D},{0x9F58, 0xFD5E},{0x9F59, 0xFD5F},{0x9F5A, 0xFD60},{0x9F5B, 0xFD61},{0x9F5C, 0xFD62}, - {0x9F5D, 0xFD63},{0x9F5E, 0xFD64},{0x9F5F, 0xFD65},{0x9F60, 0xFD66},{0x9F61, 0xFD67},{0x9F62, 0xFD68},{0x9F63, 0xFD69},{0x9F64, 0xFD6A}, - {0x9F65, 0xFD6B},{0x9F66, 0xFD6C},{0x9F67, 0xFD6D},{0x9F68, 0xFD6E},{0x9F69, 0xFD6F},{0x9F6A, 0xFD70},{0x9F6B, 0xFD71},{0x9F6C, 0xFD72}, - {0x9F6D, 0xFD73},{0x9F6E, 0xFD74},{0x9F6F, 0xFD75},{0x9F70, 0xFD76},{0x9F71, 0xFD77},{0x9F72, 0xFD78},{0x9F73, 0xFD79},{0x9F74, 0xFD7A}, - {0x9F75, 0xFD7B},{0x9F76, 0xFD7C},{0x9F77, 0xFD7D},{0x9F78, 0xFD7E},{0x9F79, 0xFD80},{0x9F7A, 0xFD81},{0x9F7B, 0xFD82},{0x9F7C, 0xFD83}, - {0x9F7D, 0xFD84},{0x9F7E, 0xFD85},{0x9F7F, 0xB3DD},{0x9F80, 0xF6B3},{0x9F81, 0xFD86},{0x9F82, 0xFD87},{0x9F83, 0xF6B4},{0x9F84, 0xC1E4}, - {0x9F85, 0xF6B5},{0x9F86, 0xF6B6},{0x9F87, 0xF6B7},{0x9F88, 0xF6B8},{0x9F89, 0xF6B9},{0x9F8A, 0xF6BA},{0x9F8B, 0xC8A3},{0x9F8C, 0xF6BB}, - {0x9F8D, 0xFD88},{0x9F8E, 0xFD89},{0x9F8F, 0xFD8A},{0x9F90, 0xFD8B},{0x9F91, 0xFD8C},{0x9F92, 0xFD8D},{0x9F93, 0xFD8E},{0x9F94, 0xFD8F}, - {0x9F95, 0xFD90},{0x9F96, 0xFD91},{0x9F97, 0xFD92},{0x9F98, 0xFD93},{0x9F99, 0xC1FA},{0x9F9A, 0xB9A8},{0x9F9B, 0xEDE8},{0x9F9C, 0xFD94}, - {0x9F9D, 0xFD95},{0x9F9E, 0xFD96},{0x9F9F, 0xB9EA},{0x9FA0, 0xD9DF},{0x9FA1, 0xFD97},{0x9FA2, 0xFD98},{0x9FA3, 0xFD99},{0x9FA4, 0xFD9A}, - {0x9FA5, 0xFD9B},{0xE000, 0xAAA1},{0xE001, 0xAAA2},{0xE002, 0xAAA3},{0xE003, 0xAAA4},{0xE004, 0xAAA5},{0xE005, 0xAAA6},{0xE006, 0xAAA7}, - {0xE007, 0xAAA8},{0xE008, 0xAAA9},{0xE009, 0xAAAA},{0xE00A, 0xAAAB},{0xE00B, 0xAAAC},{0xE00C, 0xAAAD},{0xE00D, 0xAAAE},{0xE00E, 0xAAAF}, - {0xE00F, 0xAAB0},{0xE010, 0xAAB1},{0xE011, 0xAAB2},{0xE012, 0xAAB3},{0xE013, 0xAAB4},{0xE014, 0xAAB5},{0xE015, 0xAAB6},{0xE016, 0xAAB7}, - {0xE017, 0xAAB8},{0xE018, 0xAAB9},{0xE019, 0xAABA},{0xE01A, 0xAABB},{0xE01B, 0xAABC},{0xE01C, 0xAABD},{0xE01D, 0xAABE},{0xE01E, 0xAABF}, - {0xE01F, 0xAAC0},{0xE020, 0xAAC1},{0xE021, 0xAAC2},{0xE022, 0xAAC3},{0xE023, 0xAAC4},{0xE024, 0xAAC5},{0xE025, 0xAAC6},{0xE026, 0xAAC7}, - {0xE027, 0xAAC8},{0xE028, 0xAAC9},{0xE029, 0xAACA},{0xE02A, 0xAACB},{0xE02B, 0xAACC},{0xE02C, 0xAACD},{0xE02D, 0xAACE},{0xE02E, 0xAACF}, - {0xE02F, 0xAAD0},{0xE030, 0xAAD1},{0xE031, 0xAAD2},{0xE032, 0xAAD3},{0xE033, 0xAAD4},{0xE034, 0xAAD5},{0xE035, 0xAAD6},{0xE036, 0xAAD7}, - {0xE037, 0xAAD8},{0xE038, 0xAAD9},{0xE039, 0xAADA},{0xE03A, 0xAADB},{0xE03B, 0xAADC},{0xE03C, 0xAADD},{0xE03D, 0xAADE},{0xE03E, 0xAADF}, - {0xE03F, 0xAAE0},{0xE040, 0xAAE1},{0xE041, 0xAAE2},{0xE042, 0xAAE3},{0xE043, 0xAAE4},{0xE044, 0xAAE5},{0xE045, 0xAAE6},{0xE046, 0xAAE7}, - {0xE047, 0xAAE8},{0xE048, 0xAAE9},{0xE049, 0xAAEA},{0xE04A, 0xAAEB},{0xE04B, 0xAAEC},{0xE04C, 0xAAED},{0xE04D, 0xAAEE},{0xE04E, 0xAAEF}, - {0xE04F, 0xAAF0},{0xE050, 0xAAF1},{0xE051, 0xAAF2},{0xE052, 0xAAF3},{0xE053, 0xAAF4},{0xE054, 0xAAF5},{0xE055, 0xAAF6},{0xE056, 0xAAF7}, - {0xE057, 0xAAF8},{0xE058, 0xAAF9},{0xE059, 0xAAFA},{0xE05A, 0xAAFB},{0xE05B, 0xAAFC},{0xE05C, 0xAAFD},{0xE05D, 0xAAFE},{0xE05E, 0xABA1}, - {0xE05F, 0xABA2},{0xE060, 0xABA3},{0xE061, 0xABA4},{0xE062, 0xABA5},{0xE063, 0xABA6},{0xE064, 0xABA7},{0xE065, 0xABA8},{0xE066, 0xABA9}, - {0xE067, 0xABAA},{0xE068, 0xABAB},{0xE069, 0xABAC},{0xE06A, 0xABAD},{0xE06B, 0xABAE},{0xE06C, 0xABAF},{0xE06D, 0xABB0},{0xE06E, 0xABB1}, - {0xE06F, 0xABB2},{0xE070, 0xABB3},{0xE071, 0xABB4},{0xE072, 0xABB5},{0xE073, 0xABB6},{0xE074, 0xABB7},{0xE075, 0xABB8},{0xE076, 0xABB9}, - {0xE077, 0xABBA},{0xE078, 0xABBB},{0xE079, 0xABBC},{0xE07A, 0xABBD},{0xE07B, 0xABBE},{0xE07C, 0xABBF},{0xE07D, 0xABC0},{0xE07E, 0xABC1}, - {0xE07F, 0xABC2},{0xE080, 0xABC3},{0xE081, 0xABC4},{0xE082, 0xABC5},{0xE083, 0xABC6},{0xE084, 0xABC7},{0xE085, 0xABC8},{0xE086, 0xABC9}, - {0xE087, 0xABCA},{0xE088, 0xABCB},{0xE089, 0xABCC},{0xE08A, 0xABCD},{0xE08B, 0xABCE},{0xE08C, 0xABCF},{0xE08D, 0xABD0},{0xE08E, 0xABD1}, - {0xE08F, 0xABD2},{0xE090, 0xABD3},{0xE091, 0xABD4},{0xE092, 0xABD5},{0xE093, 0xABD6},{0xE094, 0xABD7},{0xE095, 0xABD8},{0xE096, 0xABD9}, - {0xE097, 0xABDA},{0xE098, 0xABDB},{0xE099, 0xABDC},{0xE09A, 0xABDD},{0xE09B, 0xABDE},{0xE09C, 0xABDF},{0xE09D, 0xABE0},{0xE09E, 0xABE1}, - {0xE09F, 0xABE2},{0xE0A0, 0xABE3},{0xE0A1, 0xABE4},{0xE0A2, 0xABE5},{0xE0A3, 0xABE6},{0xE0A4, 0xABE7},{0xE0A5, 0xABE8},{0xE0A6, 0xABE9}, - {0xE0A7, 0xABEA},{0xE0A8, 0xABEB},{0xE0A9, 0xABEC},{0xE0AA, 0xABED},{0xE0AB, 0xABEE},{0xE0AC, 0xABEF},{0xE0AD, 0xABF0},{0xE0AE, 0xABF1}, - {0xE0AF, 0xABF2},{0xE0B0, 0xABF3},{0xE0B1, 0xABF4},{0xE0B2, 0xABF5},{0xE0B3, 0xABF6},{0xE0B4, 0xABF7},{0xE0B5, 0xABF8},{0xE0B6, 0xABF9}, - {0xE0B7, 0xABFA},{0xE0B8, 0xABFB},{0xE0B9, 0xABFC},{0xE0BA, 0xABFD},{0xE0BB, 0xABFE},{0xE0BC, 0xACA1},{0xE0BD, 0xACA2},{0xE0BE, 0xACA3}, - {0xE0BF, 0xACA4},{0xE0C0, 0xACA5},{0xE0C1, 0xACA6},{0xE0C2, 0xACA7},{0xE0C3, 0xACA8},{0xE0C4, 0xACA9},{0xE0C5, 0xACAA},{0xE0C6, 0xACAB}, - {0xE0C7, 0xACAC},{0xE0C8, 0xACAD},{0xE0C9, 0xACAE},{0xE0CA, 0xACAF},{0xE0CB, 0xACB0},{0xE0CC, 0xACB1},{0xE0CD, 0xACB2},{0xE0CE, 0xACB3}, - {0xE0CF, 0xACB4},{0xE0D0, 0xACB5},{0xE0D1, 0xACB6},{0xE0D2, 0xACB7},{0xE0D3, 0xACB8},{0xE0D4, 0xACB9},{0xE0D5, 0xACBA},{0xE0D6, 0xACBB}, - {0xE0D7, 0xACBC},{0xE0D8, 0xACBD},{0xE0D9, 0xACBE},{0xE0DA, 0xACBF},{0xE0DB, 0xACC0},{0xE0DC, 0xACC1},{0xE0DD, 0xACC2},{0xE0DE, 0xACC3}, - {0xE0DF, 0xACC4},{0xE0E0, 0xACC5},{0xE0E1, 0xACC6},{0xE0E2, 0xACC7},{0xE0E3, 0xACC8},{0xE0E4, 0xACC9},{0xE0E5, 0xACCA},{0xE0E6, 0xACCB}, - {0xE0E7, 0xACCC},{0xE0E8, 0xACCD},{0xE0E9, 0xACCE},{0xE0EA, 0xACCF},{0xE0EB, 0xACD0},{0xE0EC, 0xACD1},{0xE0ED, 0xACD2},{0xE0EE, 0xACD3}, - {0xE0EF, 0xACD4},{0xE0F0, 0xACD5},{0xE0F1, 0xACD6},{0xE0F2, 0xACD7},{0xE0F3, 0xACD8},{0xE0F4, 0xACD9},{0xE0F5, 0xACDA},{0xE0F6, 0xACDB}, - {0xE0F7, 0xACDC},{0xE0F8, 0xACDD},{0xE0F9, 0xACDE},{0xE0FA, 0xACDF},{0xE0FB, 0xACE0},{0xE0FC, 0xACE1},{0xE0FD, 0xACE2},{0xE0FE, 0xACE3}, - {0xE0FF, 0xACE4},{0xE100, 0xACE5},{0xE101, 0xACE6},{0xE102, 0xACE7},{0xE103, 0xACE8},{0xE104, 0xACE9},{0xE105, 0xACEA},{0xE106, 0xACEB}, - {0xE107, 0xACEC},{0xE108, 0xACED},{0xE109, 0xACEE},{0xE10A, 0xACEF},{0xE10B, 0xACF0},{0xE10C, 0xACF1},{0xE10D, 0xACF2},{0xE10E, 0xACF3}, - {0xE10F, 0xACF4},{0xE110, 0xACF5},{0xE111, 0xACF6},{0xE112, 0xACF7},{0xE113, 0xACF8},{0xE114, 0xACF9},{0xE115, 0xACFA},{0xE116, 0xACFB}, - {0xE117, 0xACFC},{0xE118, 0xACFD},{0xE119, 0xACFE},{0xE11A, 0xADA1},{0xE11B, 0xADA2},{0xE11C, 0xADA3},{0xE11D, 0xADA4},{0xE11E, 0xADA5}, - {0xE11F, 0xADA6},{0xE120, 0xADA7},{0xE121, 0xADA8},{0xE122, 0xADA9},{0xE123, 0xADAA},{0xE124, 0xADAB},{0xE125, 0xADAC},{0xE126, 0xADAD}, - {0xE127, 0xADAE},{0xE128, 0xADAF},{0xE129, 0xADB0},{0xE12A, 0xADB1},{0xE12B, 0xADB2},{0xE12C, 0xADB3},{0xE12D, 0xADB4},{0xE12E, 0xADB5}, - {0xE12F, 0xADB6},{0xE130, 0xADB7},{0xE131, 0xADB8},{0xE132, 0xADB9},{0xE133, 0xADBA},{0xE134, 0xADBB},{0xE135, 0xADBC},{0xE136, 0xADBD}, - {0xE137, 0xADBE},{0xE138, 0xADBF},{0xE139, 0xADC0},{0xE13A, 0xADC1},{0xE13B, 0xADC2},{0xE13C, 0xADC3},{0xE13D, 0xADC4},{0xE13E, 0xADC5}, - {0xE13F, 0xADC6},{0xE140, 0xADC7},{0xE141, 0xADC8},{0xE142, 0xADC9},{0xE143, 0xADCA},{0xE144, 0xADCB},{0xE145, 0xADCC},{0xE146, 0xADCD}, - {0xE147, 0xADCE},{0xE148, 0xADCF},{0xE149, 0xADD0},{0xE14A, 0xADD1},{0xE14B, 0xADD2},{0xE14C, 0xADD3},{0xE14D, 0xADD4},{0xE14E, 0xADD5}, - {0xE14F, 0xADD6},{0xE150, 0xADD7},{0xE151, 0xADD8},{0xE152, 0xADD9},{0xE153, 0xADDA},{0xE154, 0xADDB},{0xE155, 0xADDC},{0xE156, 0xADDD}, - {0xE157, 0xADDE},{0xE158, 0xADDF},{0xE159, 0xADE0},{0xE15A, 0xADE1},{0xE15B, 0xADE2},{0xE15C, 0xADE3},{0xE15D, 0xADE4},{0xE15E, 0xADE5}, - {0xE15F, 0xADE6},{0xE160, 0xADE7},{0xE161, 0xADE8},{0xE162, 0xADE9},{0xE163, 0xADEA},{0xE164, 0xADEB},{0xE165, 0xADEC},{0xE166, 0xADED}, - {0xE167, 0xADEE},{0xE168, 0xADEF},{0xE169, 0xADF0},{0xE16A, 0xADF1},{0xE16B, 0xADF2},{0xE16C, 0xADF3},{0xE16D, 0xADF4},{0xE16E, 0xADF5}, - {0xE16F, 0xADF6},{0xE170, 0xADF7},{0xE171, 0xADF8},{0xE172, 0xADF9},{0xE173, 0xADFA},{0xE174, 0xADFB},{0xE175, 0xADFC},{0xE176, 0xADFD}, - {0xE177, 0xADFE},{0xE178, 0xAEA1},{0xE179, 0xAEA2},{0xE17A, 0xAEA3},{0xE17B, 0xAEA4},{0xE17C, 0xAEA5},{0xE17D, 0xAEA6},{0xE17E, 0xAEA7}, - {0xE17F, 0xAEA8},{0xE180, 0xAEA9},{0xE181, 0xAEAA},{0xE182, 0xAEAB},{0xE183, 0xAEAC},{0xE184, 0xAEAD},{0xE185, 0xAEAE},{0xE186, 0xAEAF}, - {0xE187, 0xAEB0},{0xE188, 0xAEB1},{0xE189, 0xAEB2},{0xE18A, 0xAEB3},{0xE18B, 0xAEB4},{0xE18C, 0xAEB5},{0xE18D, 0xAEB6},{0xE18E, 0xAEB7}, - {0xE18F, 0xAEB8},{0xE190, 0xAEB9},{0xE191, 0xAEBA},{0xE192, 0xAEBB},{0xE193, 0xAEBC},{0xE194, 0xAEBD},{0xE195, 0xAEBE},{0xE196, 0xAEBF}, - {0xE197, 0xAEC0},{0xE198, 0xAEC1},{0xE199, 0xAEC2},{0xE19A, 0xAEC3},{0xE19B, 0xAEC4},{0xE19C, 0xAEC5},{0xE19D, 0xAEC6},{0xE19E, 0xAEC7}, - {0xE19F, 0xAEC8},{0xE1A0, 0xAEC9},{0xE1A1, 0xAECA},{0xE1A2, 0xAECB},{0xE1A3, 0xAECC},{0xE1A4, 0xAECD},{0xE1A5, 0xAECE},{0xE1A6, 0xAECF}, - {0xE1A7, 0xAED0},{0xE1A8, 0xAED1},{0xE1A9, 0xAED2},{0xE1AA, 0xAED3},{0xE1AB, 0xAED4},{0xE1AC, 0xAED5},{0xE1AD, 0xAED6},{0xE1AE, 0xAED7}, - {0xE1AF, 0xAED8},{0xE1B0, 0xAED9},{0xE1B1, 0xAEDA},{0xE1B2, 0xAEDB},{0xE1B3, 0xAEDC},{0xE1B4, 0xAEDD},{0xE1B5, 0xAEDE},{0xE1B6, 0xAEDF}, - {0xE1B7, 0xAEE0},{0xE1B8, 0xAEE1},{0xE1B9, 0xAEE2},{0xE1BA, 0xAEE3},{0xE1BB, 0xAEE4},{0xE1BC, 0xAEE5},{0xE1BD, 0xAEE6},{0xE1BE, 0xAEE7}, - {0xE1BF, 0xAEE8},{0xE1C0, 0xAEE9},{0xE1C1, 0xAEEA},{0xE1C2, 0xAEEB},{0xE1C3, 0xAEEC},{0xE1C4, 0xAEED},{0xE1C5, 0xAEEE},{0xE1C6, 0xAEEF}, - {0xE1C7, 0xAEF0},{0xE1C8, 0xAEF1},{0xE1C9, 0xAEF2},{0xE1CA, 0xAEF3},{0xE1CB, 0xAEF4},{0xE1CC, 0xAEF5},{0xE1CD, 0xAEF6},{0xE1CE, 0xAEF7}, - {0xE1CF, 0xAEF8},{0xE1D0, 0xAEF9},{0xE1D1, 0xAEFA},{0xE1D2, 0xAEFB},{0xE1D3, 0xAEFC},{0xE1D4, 0xAEFD},{0xE1D5, 0xAEFE},{0xE1D6, 0xAFA1}, - {0xE1D7, 0xAFA2},{0xE1D8, 0xAFA3},{0xE1D9, 0xAFA4},{0xE1DA, 0xAFA5},{0xE1DB, 0xAFA6},{0xE1DC, 0xAFA7},{0xE1DD, 0xAFA8},{0xE1DE, 0xAFA9}, - {0xE1DF, 0xAFAA},{0xE1E0, 0xAFAB},{0xE1E1, 0xAFAC},{0xE1E2, 0xAFAD},{0xE1E3, 0xAFAE},{0xE1E4, 0xAFAF},{0xE1E5, 0xAFB0},{0xE1E6, 0xAFB1}, - {0xE1E7, 0xAFB2},{0xE1E8, 0xAFB3},{0xE1E9, 0xAFB4},{0xE1EA, 0xAFB5},{0xE1EB, 0xAFB6},{0xE1EC, 0xAFB7},{0xE1ED, 0xAFB8},{0xE1EE, 0xAFB9}, - {0xE1EF, 0xAFBA},{0xE1F0, 0xAFBB},{0xE1F1, 0xAFBC},{0xE1F2, 0xAFBD},{0xE1F3, 0xAFBE},{0xE1F4, 0xAFBF},{0xE1F5, 0xAFC0},{0xE1F6, 0xAFC1}, - {0xE1F7, 0xAFC2},{0xE1F8, 0xAFC3},{0xE1F9, 0xAFC4},{0xE1FA, 0xAFC5},{0xE1FB, 0xAFC6},{0xE1FC, 0xAFC7},{0xE1FD, 0xAFC8},{0xE1FE, 0xAFC9}, - {0xE1FF, 0xAFCA},{0xE200, 0xAFCB},{0xE201, 0xAFCC},{0xE202, 0xAFCD},{0xE203, 0xAFCE},{0xE204, 0xAFCF},{0xE205, 0xAFD0},{0xE206, 0xAFD1}, - {0xE207, 0xAFD2},{0xE208, 0xAFD3},{0xE209, 0xAFD4},{0xE20A, 0xAFD5},{0xE20B, 0xAFD6},{0xE20C, 0xAFD7},{0xE20D, 0xAFD8},{0xE20E, 0xAFD9}, - {0xE20F, 0xAFDA},{0xE210, 0xAFDB},{0xE211, 0xAFDC},{0xE212, 0xAFDD},{0xE213, 0xAFDE},{0xE214, 0xAFDF},{0xE215, 0xAFE0},{0xE216, 0xAFE1}, - {0xE217, 0xAFE2},{0xE218, 0xAFE3},{0xE219, 0xAFE4},{0xE21A, 0xAFE5},{0xE21B, 0xAFE6},{0xE21C, 0xAFE7},{0xE21D, 0xAFE8},{0xE21E, 0xAFE9}, - {0xE21F, 0xAFEA},{0xE220, 0xAFEB},{0xE221, 0xAFEC},{0xE222, 0xAFED},{0xE223, 0xAFEE},{0xE224, 0xAFEF},{0xE225, 0xAFF0},{0xE226, 0xAFF1}, - {0xE227, 0xAFF2},{0xE228, 0xAFF3},{0xE229, 0xAFF4},{0xE22A, 0xAFF5},{0xE22B, 0xAFF6},{0xE22C, 0xAFF7},{0xE22D, 0xAFF8},{0xE22E, 0xAFF9}, - {0xE22F, 0xAFFA},{0xE230, 0xAFFB},{0xE231, 0xAFFC},{0xE232, 0xAFFD},{0xE233, 0xAFFE},{0xE234, 0xF8A1},{0xE235, 0xF8A2},{0xE236, 0xF8A3}, - {0xE237, 0xF8A4},{0xE238, 0xF8A5},{0xE239, 0xF8A6},{0xE23A, 0xF8A7},{0xE23B, 0xF8A8},{0xE23C, 0xF8A9},{0xE23D, 0xF8AA},{0xE23E, 0xF8AB}, - {0xE23F, 0xF8AC},{0xE240, 0xF8AD},{0xE241, 0xF8AE},{0xE242, 0xF8AF},{0xE243, 0xF8B0},{0xE244, 0xF8B1},{0xE245, 0xF8B2},{0xE246, 0xF8B3}, - {0xE247, 0xF8B4},{0xE248, 0xF8B5},{0xE249, 0xF8B6},{0xE24A, 0xF8B7},{0xE24B, 0xF8B8},{0xE24C, 0xF8B9},{0xE24D, 0xF8BA},{0xE24E, 0xF8BB}, - {0xE24F, 0xF8BC},{0xE250, 0xF8BD},{0xE251, 0xF8BE},{0xE252, 0xF8BF},{0xE253, 0xF8C0},{0xE254, 0xF8C1},{0xE255, 0xF8C2},{0xE256, 0xF8C3}, - {0xE257, 0xF8C4},{0xE258, 0xF8C5},{0xE259, 0xF8C6},{0xE25A, 0xF8C7},{0xE25B, 0xF8C8},{0xE25C, 0xF8C9},{0xE25D, 0xF8CA},{0xE25E, 0xF8CB}, - {0xE25F, 0xF8CC},{0xE260, 0xF8CD},{0xE261, 0xF8CE},{0xE262, 0xF8CF},{0xE263, 0xF8D0},{0xE264, 0xF8D1},{0xE265, 0xF8D2},{0xE266, 0xF8D3}, - {0xE267, 0xF8D4},{0xE268, 0xF8D5},{0xE269, 0xF8D6},{0xE26A, 0xF8D7},{0xE26B, 0xF8D8},{0xE26C, 0xF8D9},{0xE26D, 0xF8DA},{0xE26E, 0xF8DB}, - {0xE26F, 0xF8DC},{0xE270, 0xF8DD},{0xE271, 0xF8DE},{0xE272, 0xF8DF},{0xE273, 0xF8E0},{0xE274, 0xF8E1},{0xE275, 0xF8E2},{0xE276, 0xF8E3}, - {0xE277, 0xF8E4},{0xE278, 0xF8E5},{0xE279, 0xF8E6},{0xE27A, 0xF8E7},{0xE27B, 0xF8E8},{0xE27C, 0xF8E9},{0xE27D, 0xF8EA},{0xE27E, 0xF8EB}, - {0xE27F, 0xF8EC},{0xE280, 0xF8ED},{0xE281, 0xF8EE},{0xE282, 0xF8EF},{0xE283, 0xF8F0},{0xE284, 0xF8F1},{0xE285, 0xF8F2},{0xE286, 0xF8F3}, - {0xE287, 0xF8F4},{0xE288, 0xF8F5},{0xE289, 0xF8F6},{0xE28A, 0xF8F7},{0xE28B, 0xF8F8},{0xE28C, 0xF8F9},{0xE28D, 0xF8FA},{0xE28E, 0xF8FB}, - {0xE28F, 0xF8FC},{0xE290, 0xF8FD},{0xE291, 0xF8FE},{0xE292, 0xF9A1},{0xE293, 0xF9A2},{0xE294, 0xF9A3},{0xE295, 0xF9A4},{0xE296, 0xF9A5}, - {0xE297, 0xF9A6},{0xE298, 0xF9A7},{0xE299, 0xF9A8},{0xE29A, 0xF9A9},{0xE29B, 0xF9AA},{0xE29C, 0xF9AB},{0xE29D, 0xF9AC},{0xE29E, 0xF9AD}, - {0xE29F, 0xF9AE},{0xE2A0, 0xF9AF},{0xE2A1, 0xF9B0},{0xE2A2, 0xF9B1},{0xE2A3, 0xF9B2},{0xE2A4, 0xF9B3},{0xE2A5, 0xF9B4},{0xE2A6, 0xF9B5}, - {0xE2A7, 0xF9B6},{0xE2A8, 0xF9B7},{0xE2A9, 0xF9B8},{0xE2AA, 0xF9B9},{0xE2AB, 0xF9BA},{0xE2AC, 0xF9BB},{0xE2AD, 0xF9BC},{0xE2AE, 0xF9BD}, - {0xE2AF, 0xF9BE},{0xE2B0, 0xF9BF},{0xE2B1, 0xF9C0},{0xE2B2, 0xF9C1},{0xE2B3, 0xF9C2},{0xE2B4, 0xF9C3},{0xE2B5, 0xF9C4},{0xE2B6, 0xF9C5}, - {0xE2B7, 0xF9C6},{0xE2B8, 0xF9C7},{0xE2B9, 0xF9C8},{0xE2BA, 0xF9C9},{0xE2BB, 0xF9CA},{0xE2BC, 0xF9CB},{0xE2BD, 0xF9CC},{0xE2BE, 0xF9CD}, - {0xE2BF, 0xF9CE},{0xE2C0, 0xF9CF},{0xE2C1, 0xF9D0},{0xE2C2, 0xF9D1},{0xE2C3, 0xF9D2},{0xE2C4, 0xF9D3},{0xE2C5, 0xF9D4},{0xE2C6, 0xF9D5}, - {0xE2C7, 0xF9D6},{0xE2C8, 0xF9D7},{0xE2C9, 0xF9D8},{0xE2CA, 0xF9D9},{0xE2CB, 0xF9DA},{0xE2CC, 0xF9DB},{0xE2CD, 0xF9DC},{0xE2CE, 0xF9DD}, - {0xE2CF, 0xF9DE},{0xE2D0, 0xF9DF},{0xE2D1, 0xF9E0},{0xE2D2, 0xF9E1},{0xE2D3, 0xF9E2},{0xE2D4, 0xF9E3},{0xE2D5, 0xF9E4},{0xE2D6, 0xF9E5}, - {0xE2D7, 0xF9E6},{0xE2D8, 0xF9E7},{0xE2D9, 0xF9E8},{0xE2DA, 0xF9E9},{0xE2DB, 0xF9EA},{0xE2DC, 0xF9EB},{0xE2DD, 0xF9EC},{0xE2DE, 0xF9ED}, - {0xE2DF, 0xF9EE},{0xE2E0, 0xF9EF},{0xE2E1, 0xF9F0},{0xE2E2, 0xF9F1},{0xE2E3, 0xF9F2},{0xE2E4, 0xF9F3},{0xE2E5, 0xF9F4},{0xE2E6, 0xF9F5}, - {0xE2E7, 0xF9F6},{0xE2E8, 0xF9F7},{0xE2E9, 0xF9F8},{0xE2EA, 0xF9F9},{0xE2EB, 0xF9FA},{0xE2EC, 0xF9FB},{0xE2ED, 0xF9FC},{0xE2EE, 0xF9FD}, - {0xE2EF, 0xF9FE},{0xE2F0, 0xFAA1},{0xE2F1, 0xFAA2},{0xE2F2, 0xFAA3},{0xE2F3, 0xFAA4},{0xE2F4, 0xFAA5},{0xE2F5, 0xFAA6},{0xE2F6, 0xFAA7}, - {0xE2F7, 0xFAA8},{0xE2F8, 0xFAA9},{0xE2F9, 0xFAAA},{0xE2FA, 0xFAAB},{0xE2FB, 0xFAAC},{0xE2FC, 0xFAAD},{0xE2FD, 0xFAAE},{0xE2FE, 0xFAAF}, - {0xE2FF, 0xFAB0},{0xE300, 0xFAB1},{0xE301, 0xFAB2},{0xE302, 0xFAB3},{0xE303, 0xFAB4},{0xE304, 0xFAB5},{0xE305, 0xFAB6},{0xE306, 0xFAB7}, - {0xE307, 0xFAB8},{0xE308, 0xFAB9},{0xE309, 0xFABA},{0xE30A, 0xFABB},{0xE30B, 0xFABC},{0xE30C, 0xFABD},{0xE30D, 0xFABE},{0xE30E, 0xFABF}, - {0xE30F, 0xFAC0},{0xE310, 0xFAC1},{0xE311, 0xFAC2},{0xE312, 0xFAC3},{0xE313, 0xFAC4},{0xE314, 0xFAC5},{0xE315, 0xFAC6},{0xE316, 0xFAC7}, - {0xE317, 0xFAC8},{0xE318, 0xFAC9},{0xE319, 0xFACA},{0xE31A, 0xFACB},{0xE31B, 0xFACC},{0xE31C, 0xFACD},{0xE31D, 0xFACE},{0xE31E, 0xFACF}, - {0xE31F, 0xFAD0},{0xE320, 0xFAD1},{0xE321, 0xFAD2},{0xE322, 0xFAD3},{0xE323, 0xFAD4},{0xE324, 0xFAD5},{0xE325, 0xFAD6},{0xE326, 0xFAD7}, - {0xE327, 0xFAD8},{0xE328, 0xFAD9},{0xE329, 0xFADA},{0xE32A, 0xFADB},{0xE32B, 0xFADC},{0xE32C, 0xFADD},{0xE32D, 0xFADE},{0xE32E, 0xFADF}, - {0xE32F, 0xFAE0},{0xE330, 0xFAE1},{0xE331, 0xFAE2},{0xE332, 0xFAE3},{0xE333, 0xFAE4},{0xE334, 0xFAE5},{0xE335, 0xFAE6},{0xE336, 0xFAE7}, - {0xE337, 0xFAE8},{0xE338, 0xFAE9},{0xE339, 0xFAEA},{0xE33A, 0xFAEB},{0xE33B, 0xFAEC},{0xE33C, 0xFAED},{0xE33D, 0xFAEE},{0xE33E, 0xFAEF}, - {0xE33F, 0xFAF0},{0xE340, 0xFAF1},{0xE341, 0xFAF2},{0xE342, 0xFAF3},{0xE343, 0xFAF4},{0xE344, 0xFAF5},{0xE345, 0xFAF6},{0xE346, 0xFAF7}, - {0xE347, 0xFAF8},{0xE348, 0xFAF9},{0xE349, 0xFAFA},{0xE34A, 0xFAFB},{0xE34B, 0xFAFC},{0xE34C, 0xFAFD},{0xE34D, 0xFAFE},{0xE34E, 0xFBA1}, - {0xE34F, 0xFBA2},{0xE350, 0xFBA3},{0xE351, 0xFBA4},{0xE352, 0xFBA5},{0xE353, 0xFBA6},{0xE354, 0xFBA7},{0xE355, 0xFBA8},{0xE356, 0xFBA9}, - {0xE357, 0xFBAA},{0xE358, 0xFBAB},{0xE359, 0xFBAC},{0xE35A, 0xFBAD},{0xE35B, 0xFBAE},{0xE35C, 0xFBAF},{0xE35D, 0xFBB0},{0xE35E, 0xFBB1}, - {0xE35F, 0xFBB2},{0xE360, 0xFBB3},{0xE361, 0xFBB4},{0xE362, 0xFBB5},{0xE363, 0xFBB6},{0xE364, 0xFBB7},{0xE365, 0xFBB8},{0xE366, 0xFBB9}, - {0xE367, 0xFBBA},{0xE368, 0xFBBB},{0xE369, 0xFBBC},{0xE36A, 0xFBBD},{0xE36B, 0xFBBE},{0xE36C, 0xFBBF},{0xE36D, 0xFBC0},{0xE36E, 0xFBC1}, - {0xE36F, 0xFBC2},{0xE370, 0xFBC3},{0xE371, 0xFBC4},{0xE372, 0xFBC5},{0xE373, 0xFBC6},{0xE374, 0xFBC7},{0xE375, 0xFBC8},{0xE376, 0xFBC9}, - {0xE377, 0xFBCA},{0xE378, 0xFBCB},{0xE379, 0xFBCC},{0xE37A, 0xFBCD},{0xE37B, 0xFBCE},{0xE37C, 0xFBCF},{0xE37D, 0xFBD0},{0xE37E, 0xFBD1}, - {0xE37F, 0xFBD2},{0xE380, 0xFBD3},{0xE381, 0xFBD4},{0xE382, 0xFBD5},{0xE383, 0xFBD6},{0xE384, 0xFBD7},{0xE385, 0xFBD8},{0xE386, 0xFBD9}, - {0xE387, 0xFBDA},{0xE388, 0xFBDB},{0xE389, 0xFBDC},{0xE38A, 0xFBDD},{0xE38B, 0xFBDE},{0xE38C, 0xFBDF},{0xE38D, 0xFBE0},{0xE38E, 0xFBE1}, - {0xE38F, 0xFBE2},{0xE390, 0xFBE3},{0xE391, 0xFBE4},{0xE392, 0xFBE5},{0xE393, 0xFBE6},{0xE394, 0xFBE7},{0xE395, 0xFBE8},{0xE396, 0xFBE9}, - {0xE397, 0xFBEA},{0xE398, 0xFBEB},{0xE399, 0xFBEC},{0xE39A, 0xFBED},{0xE39B, 0xFBEE},{0xE39C, 0xFBEF},{0xE39D, 0xFBF0},{0xE39E, 0xFBF1}, - {0xE39F, 0xFBF2},{0xE3A0, 0xFBF3},{0xE3A1, 0xFBF4},{0xE3A2, 0xFBF5},{0xE3A3, 0xFBF6},{0xE3A4, 0xFBF7},{0xE3A5, 0xFBF8},{0xE3A6, 0xFBF9}, - {0xE3A7, 0xFBFA},{0xE3A8, 0xFBFB},{0xE3A9, 0xFBFC},{0xE3AA, 0xFBFD},{0xE3AB, 0xFBFE},{0xE3AC, 0xFCA1},{0xE3AD, 0xFCA2},{0xE3AE, 0xFCA3}, - {0xE3AF, 0xFCA4},{0xE3B0, 0xFCA5},{0xE3B1, 0xFCA6},{0xE3B2, 0xFCA7},{0xE3B3, 0xFCA8},{0xE3B4, 0xFCA9},{0xE3B5, 0xFCAA},{0xE3B6, 0xFCAB}, - {0xE3B7, 0xFCAC},{0xE3B8, 0xFCAD},{0xE3B9, 0xFCAE},{0xE3BA, 0xFCAF},{0xE3BB, 0xFCB0},{0xE3BC, 0xFCB1},{0xE3BD, 0xFCB2},{0xE3BE, 0xFCB3}, - {0xE3BF, 0xFCB4},{0xE3C0, 0xFCB5},{0xE3C1, 0xFCB6},{0xE3C2, 0xFCB7},{0xE3C3, 0xFCB8},{0xE3C4, 0xFCB9},{0xE3C5, 0xFCBA},{0xE3C6, 0xFCBB}, - {0xE3C7, 0xFCBC},{0xE3C8, 0xFCBD},{0xE3C9, 0xFCBE},{0xE3CA, 0xFCBF},{0xE3CB, 0xFCC0},{0xE3CC, 0xFCC1},{0xE3CD, 0xFCC2},{0xE3CE, 0xFCC3}, - {0xE3CF, 0xFCC4},{0xE3D0, 0xFCC5},{0xE3D1, 0xFCC6},{0xE3D2, 0xFCC7},{0xE3D3, 0xFCC8},{0xE3D4, 0xFCC9},{0xE3D5, 0xFCCA},{0xE3D6, 0xFCCB}, - {0xE3D7, 0xFCCC},{0xE3D8, 0xFCCD},{0xE3D9, 0xFCCE},{0xE3DA, 0xFCCF},{0xE3DB, 0xFCD0},{0xE3DC, 0xFCD1},{0xE3DD, 0xFCD2},{0xE3DE, 0xFCD3}, - {0xE3DF, 0xFCD4},{0xE3E0, 0xFCD5},{0xE3E1, 0xFCD6},{0xE3E2, 0xFCD7},{0xE3E3, 0xFCD8},{0xE3E4, 0xFCD9},{0xE3E5, 0xFCDA},{0xE3E6, 0xFCDB}, - {0xE3E7, 0xFCDC},{0xE3E8, 0xFCDD},{0xE3E9, 0xFCDE},{0xE3EA, 0xFCDF},{0xE3EB, 0xFCE0},{0xE3EC, 0xFCE1},{0xE3ED, 0xFCE2},{0xE3EE, 0xFCE3}, - {0xE3EF, 0xFCE4},{0xE3F0, 0xFCE5},{0xE3F1, 0xFCE6},{0xE3F2, 0xFCE7},{0xE3F3, 0xFCE8},{0xE3F4, 0xFCE9},{0xE3F5, 0xFCEA},{0xE3F6, 0xFCEB}, - {0xE3F7, 0xFCEC},{0xE3F8, 0xFCED},{0xE3F9, 0xFCEE},{0xE3FA, 0xFCEF},{0xE3FB, 0xFCF0},{0xE3FC, 0xFCF1},{0xE3FD, 0xFCF2},{0xE3FE, 0xFCF3}, - {0xE3FF, 0xFCF4},{0xE400, 0xFCF5},{0xE401, 0xFCF6},{0xE402, 0xFCF7},{0xE403, 0xFCF8},{0xE404, 0xFCF9},{0xE405, 0xFCFA},{0xE406, 0xFCFB}, - {0xE407, 0xFCFC},{0xE408, 0xFCFD},{0xE409, 0xFCFE},{0xE40A, 0xFDA1},{0xE40B, 0xFDA2},{0xE40C, 0xFDA3},{0xE40D, 0xFDA4},{0xE40E, 0xFDA5}, - {0xE40F, 0xFDA6},{0xE410, 0xFDA7},{0xE411, 0xFDA8},{0xE412, 0xFDA9},{0xE413, 0xFDAA},{0xE414, 0xFDAB},{0xE415, 0xFDAC},{0xE416, 0xFDAD}, - {0xE417, 0xFDAE},{0xE418, 0xFDAF},{0xE419, 0xFDB0},{0xE41A, 0xFDB1},{0xE41B, 0xFDB2},{0xE41C, 0xFDB3},{0xE41D, 0xFDB4},{0xE41E, 0xFDB5}, - {0xE41F, 0xFDB6},{0xE420, 0xFDB7},{0xE421, 0xFDB8},{0xE422, 0xFDB9},{0xE423, 0xFDBA},{0xE424, 0xFDBB},{0xE425, 0xFDBC},{0xE426, 0xFDBD}, - {0xE427, 0xFDBE},{0xE428, 0xFDBF},{0xE429, 0xFDC0},{0xE42A, 0xFDC1},{0xE42B, 0xFDC2},{0xE42C, 0xFDC3},{0xE42D, 0xFDC4},{0xE42E, 0xFDC5}, - {0xE42F, 0xFDC6},{0xE430, 0xFDC7},{0xE431, 0xFDC8},{0xE432, 0xFDC9},{0xE433, 0xFDCA},{0xE434, 0xFDCB},{0xE435, 0xFDCC},{0xE436, 0xFDCD}, - {0xE437, 0xFDCE},{0xE438, 0xFDCF},{0xE439, 0xFDD0},{0xE43A, 0xFDD1},{0xE43B, 0xFDD2},{0xE43C, 0xFDD3},{0xE43D, 0xFDD4},{0xE43E, 0xFDD5}, - {0xE43F, 0xFDD6},{0xE440, 0xFDD7},{0xE441, 0xFDD8},{0xE442, 0xFDD9},{0xE443, 0xFDDA},{0xE444, 0xFDDB},{0xE445, 0xFDDC},{0xE446, 0xFDDD}, - {0xE447, 0xFDDE},{0xE448, 0xFDDF},{0xE449, 0xFDE0},{0xE44A, 0xFDE1},{0xE44B, 0xFDE2},{0xE44C, 0xFDE3},{0xE44D, 0xFDE4},{0xE44E, 0xFDE5}, - {0xE44F, 0xFDE6},{0xE450, 0xFDE7},{0xE451, 0xFDE8},{0xE452, 0xFDE9},{0xE453, 0xFDEA},{0xE454, 0xFDEB},{0xE455, 0xFDEC},{0xE456, 0xFDED}, - {0xE457, 0xFDEE},{0xE458, 0xFDEF},{0xE459, 0xFDF0},{0xE45A, 0xFDF1},{0xE45B, 0xFDF2},{0xE45C, 0xFDF3},{0xE45D, 0xFDF4},{0xE45E, 0xFDF5}, - {0xE45F, 0xFDF6},{0xE460, 0xFDF7},{0xE461, 0xFDF8},{0xE462, 0xFDF9},{0xE463, 0xFDFA},{0xE464, 0xFDFB},{0xE465, 0xFDFC},{0xE466, 0xFDFD}, - {0xE467, 0xFDFE},{0xE468, 0xFEA1},{0xE469, 0xFEA2},{0xE46A, 0xFEA3},{0xE46B, 0xFEA4},{0xE46C, 0xFEA5},{0xE46D, 0xFEA6},{0xE46E, 0xFEA7}, - {0xE46F, 0xFEA8},{0xE470, 0xFEA9},{0xE471, 0xFEAA},{0xE472, 0xFEAB},{0xE473, 0xFEAC},{0xE474, 0xFEAD},{0xE475, 0xFEAE},{0xE476, 0xFEAF}, - {0xE477, 0xFEB0},{0xE478, 0xFEB1},{0xE479, 0xFEB2},{0xE47A, 0xFEB3},{0xE47B, 0xFEB4},{0xE47C, 0xFEB5},{0xE47D, 0xFEB6},{0xE47E, 0xFEB7}, - {0xE47F, 0xFEB8},{0xE480, 0xFEB9},{0xE481, 0xFEBA},{0xE482, 0xFEBB},{0xE483, 0xFEBC},{0xE484, 0xFEBD},{0xE485, 0xFEBE},{0xE486, 0xFEBF}, - {0xE487, 0xFEC0},{0xE488, 0xFEC1},{0xE489, 0xFEC2},{0xE48A, 0xFEC3},{0xE48B, 0xFEC4},{0xE48C, 0xFEC5},{0xE48D, 0xFEC6},{0xE48E, 0xFEC7}, - {0xE48F, 0xFEC8},{0xE490, 0xFEC9},{0xE491, 0xFECA},{0xE492, 0xFECB},{0xE493, 0xFECC},{0xE494, 0xFECD},{0xE495, 0xFECE},{0xE496, 0xFECF}, - {0xE497, 0xFED0},{0xE498, 0xFED1},{0xE499, 0xFED2},{0xE49A, 0xFED3},{0xE49B, 0xFED4},{0xE49C, 0xFED5},{0xE49D, 0xFED6},{0xE49E, 0xFED7}, - {0xE49F, 0xFED8},{0xE4A0, 0xFED9},{0xE4A1, 0xFEDA},{0xE4A2, 0xFEDB},{0xE4A3, 0xFEDC},{0xE4A4, 0xFEDD},{0xE4A5, 0xFEDE},{0xE4A6, 0xFEDF}, - {0xE4A7, 0xFEE0},{0xE4A8, 0xFEE1},{0xE4A9, 0xFEE2},{0xE4AA, 0xFEE3},{0xE4AB, 0xFEE4},{0xE4AC, 0xFEE5},{0xE4AD, 0xFEE6},{0xE4AE, 0xFEE7}, - {0xE4AF, 0xFEE8},{0xE4B0, 0xFEE9},{0xE4B1, 0xFEEA},{0xE4B2, 0xFEEB},{0xE4B3, 0xFEEC},{0xE4B4, 0xFEED},{0xE4B5, 0xFEEE},{0xE4B6, 0xFEEF}, - {0xE4B7, 0xFEF0},{0xE4B8, 0xFEF1},{0xE4B9, 0xFEF2},{0xE4BA, 0xFEF3},{0xE4BB, 0xFEF4},{0xE4BC, 0xFEF5},{0xE4BD, 0xFEF6},{0xE4BE, 0xFEF7}, - {0xE4BF, 0xFEF8},{0xE4C0, 0xFEF9},{0xE4C1, 0xFEFA},{0xE4C2, 0xFEFB},{0xE4C3, 0xFEFC},{0xE4C4, 0xFEFD},{0xE4C5, 0xFEFE},{0xE4C6, 0xA140}, - {0xE4C7, 0xA141},{0xE4C8, 0xA142},{0xE4C9, 0xA143},{0xE4CA, 0xA144},{0xE4CB, 0xA145},{0xE4CC, 0xA146},{0xE4CD, 0xA147},{0xE4CE, 0xA148}, - {0xE4CF, 0xA149},{0xE4D0, 0xA14A},{0xE4D1, 0xA14B},{0xE4D2, 0xA14C},{0xE4D3, 0xA14D},{0xE4D4, 0xA14E},{0xE4D5, 0xA14F},{0xE4D6, 0xA150}, - {0xE4D7, 0xA151},{0xE4D8, 0xA152},{0xE4D9, 0xA153},{0xE4DA, 0xA154},{0xE4DB, 0xA155},{0xE4DC, 0xA156},{0xE4DD, 0xA157},{0xE4DE, 0xA158}, - {0xE4DF, 0xA159},{0xE4E0, 0xA15A},{0xE4E1, 0xA15B},{0xE4E2, 0xA15C},{0xE4E3, 0xA15D},{0xE4E4, 0xA15E},{0xE4E5, 0xA15F},{0xE4E6, 0xA160}, - {0xE4E7, 0xA161},{0xE4E8, 0xA162},{0xE4E9, 0xA163},{0xE4EA, 0xA164},{0xE4EB, 0xA165},{0xE4EC, 0xA166},{0xE4ED, 0xA167},{0xE4EE, 0xA168}, - {0xE4EF, 0xA169},{0xE4F0, 0xA16A},{0xE4F1, 0xA16B},{0xE4F2, 0xA16C},{0xE4F3, 0xA16D},{0xE4F4, 0xA16E},{0xE4F5, 0xA16F},{0xE4F6, 0xA170}, - {0xE4F7, 0xA171},{0xE4F8, 0xA172},{0xE4F9, 0xA173},{0xE4FA, 0xA174},{0xE4FB, 0xA175},{0xE4FC, 0xA176},{0xE4FD, 0xA177},{0xE4FE, 0xA178}, - {0xE4FF, 0xA179},{0xE500, 0xA17A},{0xE501, 0xA17B},{0xE502, 0xA17C},{0xE503, 0xA17D},{0xE504, 0xA17E},{0xE505, 0xA180},{0xE506, 0xA181}, - {0xE507, 0xA182},{0xE508, 0xA183},{0xE509, 0xA184},{0xE50A, 0xA185},{0xE50B, 0xA186},{0xE50C, 0xA187},{0xE50D, 0xA188},{0xE50E, 0xA189}, - {0xE50F, 0xA18A},{0xE510, 0xA18B},{0xE511, 0xA18C},{0xE512, 0xA18D},{0xE513, 0xA18E},{0xE514, 0xA18F},{0xE515, 0xA190},{0xE516, 0xA191}, - {0xE517, 0xA192},{0xE518, 0xA193},{0xE519, 0xA194},{0xE51A, 0xA195},{0xE51B, 0xA196},{0xE51C, 0xA197},{0xE51D, 0xA198},{0xE51E, 0xA199}, - {0xE51F, 0xA19A},{0xE520, 0xA19B},{0xE521, 0xA19C},{0xE522, 0xA19D},{0xE523, 0xA19E},{0xE524, 0xA19F},{0xE525, 0xA1A0},{0xE526, 0xA240}, - {0xE527, 0xA241},{0xE528, 0xA242},{0xE529, 0xA243},{0xE52A, 0xA244},{0xE52B, 0xA245},{0xE52C, 0xA246},{0xE52D, 0xA247},{0xE52E, 0xA248}, - {0xE52F, 0xA249},{0xE530, 0xA24A},{0xE531, 0xA24B},{0xE532, 0xA24C},{0xE533, 0xA24D},{0xE534, 0xA24E},{0xE535, 0xA24F},{0xE536, 0xA250}, - {0xE537, 0xA251},{0xE538, 0xA252},{0xE539, 0xA253},{0xE53A, 0xA254},{0xE53B, 0xA255},{0xE53C, 0xA256},{0xE53D, 0xA257},{0xE53E, 0xA258}, - {0xE53F, 0xA259},{0xE540, 0xA25A},{0xE541, 0xA25B},{0xE542, 0xA25C},{0xE543, 0xA25D},{0xE544, 0xA25E},{0xE545, 0xA25F},{0xE546, 0xA260}, - {0xE547, 0xA261},{0xE548, 0xA262},{0xE549, 0xA263},{0xE54A, 0xA264},{0xE54B, 0xA265},{0xE54C, 0xA266},{0xE54D, 0xA267},{0xE54E, 0xA268}, - {0xE54F, 0xA269},{0xE550, 0xA26A},{0xE551, 0xA26B},{0xE552, 0xA26C},{0xE553, 0xA26D},{0xE554, 0xA26E},{0xE555, 0xA26F},{0xE556, 0xA270}, - {0xE557, 0xA271},{0xE558, 0xA272},{0xE559, 0xA273},{0xE55A, 0xA274},{0xE55B, 0xA275},{0xE55C, 0xA276},{0xE55D, 0xA277},{0xE55E, 0xA278}, - {0xE55F, 0xA279},{0xE560, 0xA27A},{0xE561, 0xA27B},{0xE562, 0xA27C},{0xE563, 0xA27D},{0xE564, 0xA27E},{0xE565, 0xA280},{0xE566, 0xA281}, - {0xE567, 0xA282},{0xE568, 0xA283},{0xE569, 0xA284},{0xE56A, 0xA285},{0xE56B, 0xA286},{0xE56C, 0xA287},{0xE56D, 0xA288},{0xE56E, 0xA289}, - {0xE56F, 0xA28A},{0xE570, 0xA28B},{0xE571, 0xA28C},{0xE572, 0xA28D},{0xE573, 0xA28E},{0xE574, 0xA28F},{0xE575, 0xA290},{0xE576, 0xA291}, - {0xE577, 0xA292},{0xE578, 0xA293},{0xE579, 0xA294},{0xE57A, 0xA295},{0xE57B, 0xA296},{0xE57C, 0xA297},{0xE57D, 0xA298},{0xE57E, 0xA299}, - {0xE57F, 0xA29A},{0xE580, 0xA29B},{0xE581, 0xA29C},{0xE582, 0xA29D},{0xE583, 0xA29E},{0xE584, 0xA29F},{0xE585, 0xA2A0},{0xE586, 0xA2AB}, - {0xE587, 0xA2AC},{0xE588, 0xA2AD},{0xE589, 0xA2AE},{0xE58A, 0xA2AF},{0xE58B, 0xA2B0},{0xE58C, 0xA2E3},{0xE58D, 0xA2E4},{0xE58E, 0xA2EF}, - {0xE58F, 0xA2F0},{0xE590, 0xA2FD},{0xE591, 0xA2FE},{0xE592, 0xA340},{0xE593, 0xA341},{0xE594, 0xA342},{0xE595, 0xA343},{0xE596, 0xA344}, - {0xE597, 0xA345},{0xE598, 0xA346},{0xE599, 0xA347},{0xE59A, 0xA348},{0xE59B, 0xA349},{0xE59C, 0xA34A},{0xE59D, 0xA34B},{0xE59E, 0xA34C}, - {0xE59F, 0xA34D},{0xE5A0, 0xA34E},{0xE5A1, 0xA34F},{0xE5A2, 0xA350},{0xE5A3, 0xA351},{0xE5A4, 0xA352},{0xE5A5, 0xA353},{0xE5A6, 0xA354}, - {0xE5A7, 0xA355},{0xE5A8, 0xA356},{0xE5A9, 0xA357},{0xE5AA, 0xA358},{0xE5AB, 0xA359},{0xE5AC, 0xA35A},{0xE5AD, 0xA35B},{0xE5AE, 0xA35C}, - {0xE5AF, 0xA35D},{0xE5B0, 0xA35E},{0xE5B1, 0xA35F},{0xE5B2, 0xA360},{0xE5B3, 0xA361},{0xE5B4, 0xA362},{0xE5B5, 0xA363},{0xE5B6, 0xA364}, - {0xE5B7, 0xA365},{0xE5B8, 0xA366},{0xE5B9, 0xA367},{0xE5BA, 0xA368},{0xE5BB, 0xA369},{0xE5BC, 0xA36A},{0xE5BD, 0xA36B},{0xE5BE, 0xA36C}, - {0xE5BF, 0xA36D},{0xE5C0, 0xA36E},{0xE5C1, 0xA36F},{0xE5C2, 0xA370},{0xE5C3, 0xA371},{0xE5C4, 0xA372},{0xE5C5, 0xA373},{0xE5C6, 0xA374}, - {0xE5C7, 0xA375},{0xE5C8, 0xA376},{0xE5C9, 0xA377},{0xE5CA, 0xA378},{0xE5CB, 0xA379},{0xE5CC, 0xA37A},{0xE5CD, 0xA37B},{0xE5CE, 0xA37C}, - {0xE5CF, 0xA37D},{0xE5D0, 0xA37E},{0xE5D1, 0xA380},{0xE5D2, 0xA381},{0xE5D3, 0xA382},{0xE5D4, 0xA383},{0xE5D5, 0xA384},{0xE5D6, 0xA385}, - {0xE5D7, 0xA386},{0xE5D8, 0xA387},{0xE5D9, 0xA388},{0xE5DA, 0xA389},{0xE5DB, 0xA38A},{0xE5DC, 0xA38B},{0xE5DD, 0xA38C},{0xE5DE, 0xA38D}, - {0xE5DF, 0xA38E},{0xE5E0, 0xA38F},{0xE5E1, 0xA390},{0xE5E2, 0xA391},{0xE5E3, 0xA392},{0xE5E4, 0xA393},{0xE5E5, 0xA394},{0xE5E6, 0xA395}, - {0xE5E7, 0xA396},{0xE5E8, 0xA397},{0xE5E9, 0xA398},{0xE5EA, 0xA399},{0xE5EB, 0xA39A},{0xE5EC, 0xA39B},{0xE5ED, 0xA39C},{0xE5EE, 0xA39D}, - {0xE5EF, 0xA39E},{0xE5F0, 0xA39F},{0xE5F1, 0xA3A0},{0xE5F2, 0xA440},{0xE5F3, 0xA441},{0xE5F4, 0xA442},{0xE5F5, 0xA443},{0xE5F6, 0xA444}, - {0xE5F7, 0xA445},{0xE5F8, 0xA446},{0xE5F9, 0xA447},{0xE5FA, 0xA448},{0xE5FB, 0xA449},{0xE5FC, 0xA44A},{0xE5FD, 0xA44B},{0xE5FE, 0xA44C}, - {0xE5FF, 0xA44D},{0xE600, 0xA44E},{0xE601, 0xA44F},{0xE602, 0xA450},{0xE603, 0xA451},{0xE604, 0xA452},{0xE605, 0xA453},{0xE606, 0xA454}, - {0xE607, 0xA455},{0xE608, 0xA456},{0xE609, 0xA457},{0xE60A, 0xA458},{0xE60B, 0xA459},{0xE60C, 0xA45A},{0xE60D, 0xA45B},{0xE60E, 0xA45C}, - {0xE60F, 0xA45D},{0xE610, 0xA45E},{0xE611, 0xA45F},{0xE612, 0xA460},{0xE613, 0xA461},{0xE614, 0xA462},{0xE615, 0xA463},{0xE616, 0xA464}, - {0xE617, 0xA465},{0xE618, 0xA466},{0xE619, 0xA467},{0xE61A, 0xA468},{0xE61B, 0xA469},{0xE61C, 0xA46A},{0xE61D, 0xA46B},{0xE61E, 0xA46C}, - {0xE61F, 0xA46D},{0xE620, 0xA46E},{0xE621, 0xA46F},{0xE622, 0xA470},{0xE623, 0xA471},{0xE624, 0xA472},{0xE625, 0xA473},{0xE626, 0xA474}, - {0xE627, 0xA475},{0xE628, 0xA476},{0xE629, 0xA477},{0xE62A, 0xA478},{0xE62B, 0xA479},{0xE62C, 0xA47A},{0xE62D, 0xA47B},{0xE62E, 0xA47C}, - {0xE62F, 0xA47D},{0xE630, 0xA47E},{0xE631, 0xA480},{0xE632, 0xA481},{0xE633, 0xA482},{0xE634, 0xA483},{0xE635, 0xA484},{0xE636, 0xA485}, - {0xE637, 0xA486},{0xE638, 0xA487},{0xE639, 0xA488},{0xE63A, 0xA489},{0xE63B, 0xA48A},{0xE63C, 0xA48B},{0xE63D, 0xA48C},{0xE63E, 0xA48D}, - {0xE63F, 0xA48E},{0xE640, 0xA48F},{0xE641, 0xA490},{0xE642, 0xA491},{0xE643, 0xA492},{0xE644, 0xA493},{0xE645, 0xA494},{0xE646, 0xA495}, - {0xE647, 0xA496},{0xE648, 0xA497},{0xE649, 0xA498},{0xE64A, 0xA499},{0xE64B, 0xA49A},{0xE64C, 0xA49B},{0xE64D, 0xA49C},{0xE64E, 0xA49D}, - {0xE64F, 0xA49E},{0xE650, 0xA49F},{0xE651, 0xA4A0},{0xE652, 0xA4F4},{0xE653, 0xA4F5},{0xE654, 0xA4F6},{0xE655, 0xA4F7},{0xE656, 0xA4F8}, - {0xE657, 0xA4F9},{0xE658, 0xA4FA},{0xE659, 0xA4FB},{0xE65A, 0xA4FC},{0xE65B, 0xA4FD},{0xE65C, 0xA4FE},{0xE65D, 0xA540},{0xE65E, 0xA541}, - {0xE65F, 0xA542},{0xE660, 0xA543},{0xE661, 0xA544},{0xE662, 0xA545},{0xE663, 0xA546},{0xE664, 0xA547},{0xE665, 0xA548},{0xE666, 0xA549}, - {0xE667, 0xA54A},{0xE668, 0xA54B},{0xE669, 0xA54C},{0xE66A, 0xA54D},{0xE66B, 0xA54E},{0xE66C, 0xA54F},{0xE66D, 0xA550},{0xE66E, 0xA551}, - {0xE66F, 0xA552},{0xE670, 0xA553},{0xE671, 0xA554},{0xE672, 0xA555},{0xE673, 0xA556},{0xE674, 0xA557},{0xE675, 0xA558},{0xE676, 0xA559}, - {0xE677, 0xA55A},{0xE678, 0xA55B},{0xE679, 0xA55C},{0xE67A, 0xA55D},{0xE67B, 0xA55E},{0xE67C, 0xA55F},{0xE67D, 0xA560},{0xE67E, 0xA561}, - {0xE67F, 0xA562},{0xE680, 0xA563},{0xE681, 0xA564},{0xE682, 0xA565},{0xE683, 0xA566},{0xE684, 0xA567},{0xE685, 0xA568},{0xE686, 0xA569}, - {0xE687, 0xA56A},{0xE688, 0xA56B},{0xE689, 0xA56C},{0xE68A, 0xA56D},{0xE68B, 0xA56E},{0xE68C, 0xA56F},{0xE68D, 0xA570},{0xE68E, 0xA571}, - {0xE68F, 0xA572},{0xE690, 0xA573},{0xE691, 0xA574},{0xE692, 0xA575},{0xE693, 0xA576},{0xE694, 0xA577},{0xE695, 0xA578},{0xE696, 0xA579}, - {0xE697, 0xA57A},{0xE698, 0xA57B},{0xE699, 0xA57C},{0xE69A, 0xA57D},{0xE69B, 0xA57E},{0xE69C, 0xA580},{0xE69D, 0xA581},{0xE69E, 0xA582}, - {0xE69F, 0xA583},{0xE6A0, 0xA584},{0xE6A1, 0xA585},{0xE6A2, 0xA586},{0xE6A3, 0xA587},{0xE6A4, 0xA588},{0xE6A5, 0xA589},{0xE6A6, 0xA58A}, - {0xE6A7, 0xA58B},{0xE6A8, 0xA58C},{0xE6A9, 0xA58D},{0xE6AA, 0xA58E},{0xE6AB, 0xA58F},{0xE6AC, 0xA590},{0xE6AD, 0xA591},{0xE6AE, 0xA592}, - {0xE6AF, 0xA593},{0xE6B0, 0xA594},{0xE6B1, 0xA595},{0xE6B2, 0xA596},{0xE6B3, 0xA597},{0xE6B4, 0xA598},{0xE6B5, 0xA599},{0xE6B6, 0xA59A}, - {0xE6B7, 0xA59B},{0xE6B8, 0xA59C},{0xE6B9, 0xA59D},{0xE6BA, 0xA59E},{0xE6BB, 0xA59F},{0xE6BC, 0xA5A0},{0xE6BD, 0xA5F7},{0xE6BE, 0xA5F8}, - {0xE6BF, 0xA5F9},{0xE6C0, 0xA5FA},{0xE6C1, 0xA5FB},{0xE6C2, 0xA5FC},{0xE6C3, 0xA5FD},{0xE6C4, 0xA5FE},{0xE6C5, 0xA640},{0xE6C6, 0xA641}, - {0xE6C7, 0xA642},{0xE6C8, 0xA643},{0xE6C9, 0xA644},{0xE6CA, 0xA645},{0xE6CB, 0xA646},{0xE6CC, 0xA647},{0xE6CD, 0xA648},{0xE6CE, 0xA649}, - {0xE6CF, 0xA64A},{0xE6D0, 0xA64B},{0xE6D1, 0xA64C},{0xE6D2, 0xA64D},{0xE6D3, 0xA64E},{0xE6D4, 0xA64F},{0xE6D5, 0xA650},{0xE6D6, 0xA651}, - {0xE6D7, 0xA652},{0xE6D8, 0xA653},{0xE6D9, 0xA654},{0xE6DA, 0xA655},{0xE6DB, 0xA656},{0xE6DC, 0xA657},{0xE6DD, 0xA658},{0xE6DE, 0xA659}, - {0xE6DF, 0xA65A},{0xE6E0, 0xA65B},{0xE6E1, 0xA65C},{0xE6E2, 0xA65D},{0xE6E3, 0xA65E},{0xE6E4, 0xA65F},{0xE6E5, 0xA660},{0xE6E6, 0xA661}, - {0xE6E7, 0xA662},{0xE6E8, 0xA663},{0xE6E9, 0xA664},{0xE6EA, 0xA665},{0xE6EB, 0xA666},{0xE6EC, 0xA667},{0xE6ED, 0xA668},{0xE6EE, 0xA669}, - {0xE6EF, 0xA66A},{0xE6F0, 0xA66B},{0xE6F1, 0xA66C},{0xE6F2, 0xA66D},{0xE6F3, 0xA66E},{0xE6F4, 0xA66F},{0xE6F5, 0xA670},{0xE6F6, 0xA671}, - {0xE6F7, 0xA672},{0xE6F8, 0xA673},{0xE6F9, 0xA674},{0xE6FA, 0xA675},{0xE6FB, 0xA676},{0xE6FC, 0xA677},{0xE6FD, 0xA678},{0xE6FE, 0xA679}, - {0xE6FF, 0xA67A},{0xE700, 0xA67B},{0xE701, 0xA67C},{0xE702, 0xA67D},{0xE703, 0xA67E},{0xE704, 0xA680},{0xE705, 0xA681},{0xE706, 0xA682}, - {0xE707, 0xA683},{0xE708, 0xA684},{0xE709, 0xA685},{0xE70A, 0xA686},{0xE70B, 0xA687},{0xE70C, 0xA688},{0xE70D, 0xA689},{0xE70E, 0xA68A}, - {0xE70F, 0xA68B},{0xE710, 0xA68C},{0xE711, 0xA68D},{0xE712, 0xA68E},{0xE713, 0xA68F},{0xE714, 0xA690},{0xE715, 0xA691},{0xE716, 0xA692}, - {0xE717, 0xA693},{0xE718, 0xA694},{0xE719, 0xA695},{0xE71A, 0xA696},{0xE71B, 0xA697},{0xE71C, 0xA698},{0xE71D, 0xA699},{0xE71E, 0xA69A}, - {0xE71F, 0xA69B},{0xE720, 0xA69C},{0xE721, 0xA69D},{0xE722, 0xA69E},{0xE723, 0xA69F},{0xE724, 0xA6A0},{0xE725, 0xA6B9},{0xE726, 0xA6BA}, - {0xE727, 0xA6BB},{0xE728, 0xA6BC},{0xE729, 0xA6BD},{0xE72A, 0xA6BE},{0xE72B, 0xA6BF},{0xE72C, 0xA6C0},{0xE72D, 0xA6D9},{0xE72E, 0xA6DA}, - {0xE72F, 0xA6DB},{0xE730, 0xA6DC},{0xE731, 0xA6DD},{0xE732, 0xA6DE},{0xE733, 0xA6DF},{0xE734, 0xA6EC},{0xE735, 0xA6ED},{0xE736, 0xA6F3}, - {0xE737, 0xA6F6},{0xE738, 0xA6F7},{0xE739, 0xA6F8},{0xE73A, 0xA6F9},{0xE73B, 0xA6FA},{0xE73C, 0xA6FB},{0xE73D, 0xA6FC},{0xE73E, 0xA6FD}, - {0xE73F, 0xA6FE},{0xE740, 0xA740},{0xE741, 0xA741},{0xE742, 0xA742},{0xE743, 0xA743},{0xE744, 0xA744},{0xE745, 0xA745},{0xE746, 0xA746}, - {0xE747, 0xA747},{0xE748, 0xA748},{0xE749, 0xA749},{0xE74A, 0xA74A},{0xE74B, 0xA74B},{0xE74C, 0xA74C},{0xE74D, 0xA74D},{0xE74E, 0xA74E}, - {0xE74F, 0xA74F},{0xE750, 0xA750},{0xE751, 0xA751},{0xE752, 0xA752},{0xE753, 0xA753},{0xE754, 0xA754},{0xE755, 0xA755},{0xE756, 0xA756}, - {0xE757, 0xA757},{0xE758, 0xA758},{0xE759, 0xA759},{0xE75A, 0xA75A},{0xE75B, 0xA75B},{0xE75C, 0xA75C},{0xE75D, 0xA75D},{0xE75E, 0xA75E}, - {0xE75F, 0xA75F},{0xE760, 0xA760},{0xE761, 0xA761},{0xE762, 0xA762},{0xE763, 0xA763},{0xE764, 0xA764},{0xE765, 0xA765},{0xE766, 0xA766}, - {0xE767, 0xA767},{0xE768, 0xA768},{0xE769, 0xA769},{0xE76A, 0xA76A},{0xE76B, 0xA76B},{0xE76C, 0xA76C},{0xE76D, 0xA76D},{0xE76E, 0xA76E}, - {0xE76F, 0xA76F},{0xE770, 0xA770},{0xE771, 0xA771},{0xE772, 0xA772},{0xE773, 0xA773},{0xE774, 0xA774},{0xE775, 0xA775},{0xE776, 0xA776}, - {0xE777, 0xA777},{0xE778, 0xA778},{0xE779, 0xA779},{0xE77A, 0xA77A},{0xE77B, 0xA77B},{0xE77C, 0xA77C},{0xE77D, 0xA77D},{0xE77E, 0xA77E}, - {0xE77F, 0xA780},{0xE780, 0xA781},{0xE781, 0xA782},{0xE782, 0xA783},{0xE783, 0xA784},{0xE784, 0xA785},{0xE785, 0xA786},{0xE786, 0xA787}, - {0xE787, 0xA788},{0xE788, 0xA789},{0xE789, 0xA78A},{0xE78A, 0xA78B},{0xE78B, 0xA78C},{0xE78C, 0xA78D},{0xE78D, 0xA78E},{0xE78E, 0xA78F}, - {0xE78F, 0xA790},{0xE790, 0xA791},{0xE791, 0xA792},{0xE792, 0xA793},{0xE793, 0xA794},{0xE794, 0xA795},{0xE795, 0xA796},{0xE796, 0xA797}, - {0xE797, 0xA798},{0xE798, 0xA799},{0xE799, 0xA79A},{0xE79A, 0xA79B},{0xE79B, 0xA79C},{0xE79C, 0xA79D},{0xE79D, 0xA79E},{0xE79E, 0xA79F}, - {0xE79F, 0xA7A0},{0xE7A0, 0xA7C2},{0xE7A1, 0xA7C3},{0xE7A2, 0xA7C4},{0xE7A3, 0xA7C5},{0xE7A4, 0xA7C6},{0xE7A5, 0xA7C7},{0xE7A6, 0xA7C8}, - {0xE7A7, 0xA7C9},{0xE7A8, 0xA7CA},{0xE7A9, 0xA7CB},{0xE7AA, 0xA7CC},{0xE7AB, 0xA7CD},{0xE7AC, 0xA7CE},{0xE7AD, 0xA7CF},{0xE7AE, 0xA7D0}, - {0xE7AF, 0xA7F2},{0xE7B0, 0xA7F3},{0xE7B1, 0xA7F4},{0xE7B2, 0xA7F5},{0xE7B3, 0xA7F6},{0xE7B4, 0xA7F7},{0xE7B5, 0xA7F8},{0xE7B6, 0xA7F9}, - {0xE7B7, 0xA7FA},{0xE7B8, 0xA7FB},{0xE7B9, 0xA7FC},{0xE7BA, 0xA7FD},{0xE7BB, 0xA7FE},{0xE7BC, 0xA896},{0xE7BD, 0xA897},{0xE7BE, 0xA898}, - {0xE7BF, 0xA899},{0xE7C0, 0xA89A},{0xE7C1, 0xA89B},{0xE7C2, 0xA89C},{0xE7C3, 0xA89D},{0xE7C4, 0xA89E},{0xE7C5, 0xA89F},{0xE7C6, 0xA8A0}, - {0xE7C7, 0xA8BC},{0xE7C8, 0xA8BF},{0xE7C9, 0xA8C1},{0xE7CA, 0xA8C2},{0xE7CB, 0xA8C3},{0xE7CC, 0xA8C4},{0xE7CD, 0xA8EA},{0xE7CE, 0xA8EB}, - {0xE7CF, 0xA8EC},{0xE7D0, 0xA8ED},{0xE7D1, 0xA8EE},{0xE7D2, 0xA8EF},{0xE7D3, 0xA8F0},{0xE7D4, 0xA8F1},{0xE7D5, 0xA8F2},{0xE7D6, 0xA8F3}, - {0xE7D7, 0xA8F4},{0xE7D8, 0xA8F5},{0xE7D9, 0xA8F6},{0xE7DA, 0xA8F7},{0xE7DB, 0xA8F8},{0xE7DC, 0xA8F9},{0xE7DD, 0xA8FA},{0xE7DE, 0xA8FB}, - {0xE7DF, 0xA8FC},{0xE7E0, 0xA8FD},{0xE7E1, 0xA8FE},{0xE7E2, 0xA958},{0xE7E3, 0xA95B},{0xE7E4, 0xA95D},{0xE7E5, 0xA95E},{0xE7E6, 0xA95F}, - {0xE7E7, 0xA989},{0xE7E8, 0xA98A},{0xE7E9, 0xA98B},{0xE7EA, 0xA98C},{0xE7EB, 0xA98D},{0xE7EC, 0xA98E},{0xE7ED, 0xA98F},{0xE7EE, 0xA990}, - {0xE7EF, 0xA991},{0xE7F0, 0xA992},{0xE7F1, 0xA993},{0xE7F2, 0xA994},{0xE7F3, 0xA995},{0xE7F4, 0xA997},{0xE7F5, 0xA998},{0xE7F6, 0xA999}, - {0xE7F7, 0xA99A},{0xE7F8, 0xA99B},{0xE7F9, 0xA99C},{0xE7FA, 0xA99D},{0xE7FB, 0xA99E},{0xE7FC, 0xA99F},{0xE7FD, 0xA9A0},{0xE7FE, 0xA9A1}, - {0xE7FF, 0xA9A2},{0xE800, 0xA9A3},{0xE801, 0xA9F0},{0xE802, 0xA9F1},{0xE803, 0xA9F2},{0xE804, 0xA9F3},{0xE805, 0xA9F4},{0xE806, 0xA9F5}, - {0xE807, 0xA9F6},{0xE808, 0xA9F7},{0xE809, 0xA9F8},{0xE80A, 0xA9F9},{0xE80B, 0xA9FA},{0xE80C, 0xA9FB},{0xE80D, 0xA9FC},{0xE80E, 0xA9FD}, - {0xE80F, 0xA9FE},{0xE810, 0xD7FA},{0xE811, 0xD7FB},{0xE812, 0xD7FC},{0xE813, 0xD7FD},{0xE814, 0xD7FE},{0xE815, 0xFE50},{0xE816, 0xFE51}, - {0xE817, 0xFE52},{0xE818, 0xFE53},{0xE819, 0xFE54},{0xE81A, 0xFE55},{0xE81B, 0xFE56},{0xE81C, 0xFE57},{0xE81D, 0xFE58},{0xE81E, 0xFE59}, - {0xE81F, 0xFE5A},{0xE820, 0xFE5B},{0xE821, 0xFE5C},{0xE822, 0xFE5D},{0xE823, 0xFE5E},{0xE824, 0xFE5F},{0xE825, 0xFE60},{0xE826, 0xFE61}, - {0xE827, 0xFE62},{0xE828, 0xFE63},{0xE829, 0xFE64},{0xE82A, 0xFE65},{0xE82B, 0xFE66},{0xE82C, 0xFE67},{0xE82D, 0xFE68},{0xE82E, 0xFE69}, - {0xE82F, 0xFE6A},{0xE830, 0xFE6B},{0xE831, 0xFE6C},{0xE832, 0xFE6D},{0xE833, 0xFE6E},{0xE834, 0xFE6F},{0xE835, 0xFE70},{0xE836, 0xFE71}, - {0xE837, 0xFE72},{0xE838, 0xFE73},{0xE839, 0xFE74},{0xE83A, 0xFE75},{0xE83B, 0xFE76},{0xE83C, 0xFE77},{0xE83D, 0xFE78},{0xE83E, 0xFE79}, - {0xE83F, 0xFE7A},{0xE840, 0xFE7B},{0xE841, 0xFE7C},{0xE842, 0xFE7D},{0xE843, 0xFE7E},{0xE844, 0xFE80},{0xE845, 0xFE81},{0xE846, 0xFE82}, - {0xE847, 0xFE83},{0xE848, 0xFE84},{0xE849, 0xFE85},{0xE84A, 0xFE86},{0xE84B, 0xFE87},{0xE84C, 0xFE88},{0xE84D, 0xFE89},{0xE84E, 0xFE8A}, - {0xE84F, 0xFE8B},{0xE850, 0xFE8C},{0xE851, 0xFE8D},{0xE852, 0xFE8E},{0xE853, 0xFE8F},{0xE854, 0xFE90},{0xE855, 0xFE91},{0xE856, 0xFE92}, - {0xE857, 0xFE93},{0xE858, 0xFE94},{0xE859, 0xFE95},{0xE85A, 0xFE96},{0xE85B, 0xFE97},{0xE85C, 0xFE98},{0xE85D, 0xFE99},{0xE85E, 0xFE9A}, - {0xE85F, 0xFE9B},{0xE860, 0xFE9C},{0xE861, 0xFE9D},{0xE862, 0xFE9E},{0xE863, 0xFE9F},{0xE864, 0xFEA0},{0xF92C, 0xFD9C},{0xF979, 0xFD9D}, - {0xF995, 0xFD9E},{0xF9E7, 0xFD9F},{0xF9F1, 0xFDA0},{0xFA0C, 0xFE40},{0xFA0D, 0xFE41},{0xFA0E, 0xFE42},{0xFA0F, 0xFE43},{0xFA11, 0xFE44}, - {0xFA13, 0xFE45},{0xFA14, 0xFE46},{0xFA18, 0xFE47},{0xFA1F, 0xFE48},{0xFA20, 0xFE49},{0xFA21, 0xFE4A},{0xFA23, 0xFE4B},{0xFA24, 0xFE4C}, - {0xFA27, 0xFE4D},{0xFA28, 0xFE4E},{0xFA29, 0xFE4F},{0xFE30, 0xA955},{0xFE31, 0xA6F2},{0xFE33, 0xA6F4},{0xFE34, 0xA6F5},{0xFE35, 0xA6E0}, - {0xFE36, 0xA6E1},{0xFE37, 0xA6F0},{0xFE38, 0xA6F1},{0xFE39, 0xA6E2},{0xFE3A, 0xA6E3},{0xFE3B, 0xA6EE},{0xFE3C, 0xA6EF},{0xFE3D, 0xA6E6}, - {0xFE3E, 0xA6E7},{0xFE3F, 0xA6E4},{0xFE40, 0xA6E5},{0xFE41, 0xA6E8},{0xFE42, 0xA6E9},{0xFE43, 0xA6EA},{0xFE44, 0xA6EB},{0xFE49, 0xA968}, - {0xFE4A, 0xA969},{0xFE4B, 0xA96A},{0xFE4C, 0xA96B},{0xFE4D, 0xA96C},{0xFE4E, 0xA96D},{0xFE4F, 0xA96E},{0xFE50, 0xA96F},{0xFE51, 0xA970}, - {0xFE52, 0xA971},{0xFE54, 0xA972},{0xFE55, 0xA973},{0xFE56, 0xA974},{0xFE57, 0xA975},{0xFE59, 0xA976},{0xFE5A, 0xA977},{0xFE5B, 0xA978}, - {0xFE5C, 0xA979},{0xFE5D, 0xA97A},{0xFE5E, 0xA97B},{0xFE5F, 0xA97C},{0xFE60, 0xA97D},{0xFE61, 0xA97E},{0xFE62, 0xA980},{0xFE63, 0xA981}, - {0xFE64, 0xA982},{0xFE65, 0xA983},{0xFE66, 0xA984},{0xFE68, 0xA985},{0xFE69, 0xA986},{0xFE6A, 0xA987},{0xFE6B, 0xA988},{0xFF01, 0xA3A1}, - {0xFF02, 0xA3A2},{0xFF03, 0xA3A3},{0xFF04, 0xA1E7},{0xFF05, 0xA3A5},{0xFF06, 0xA3A6},{0xFF07, 0xA3A7},{0xFF08, 0xA3A8},{0xFF09, 0xA3A9}, - {0xFF0A, 0xA3AA},{0xFF0B, 0xA3AB},{0xFF0C, 0xA3AC},{0xFF0D, 0xA3AD},{0xFF0E, 0xA3AE},{0xFF0F, 0xA3AF},{0xFF10, 0xA3B0},{0xFF11, 0xA3B1}, - {0xFF12, 0xA3B2},{0xFF13, 0xA3B3},{0xFF14, 0xA3B4},{0xFF15, 0xA3B5},{0xFF16, 0xA3B6},{0xFF17, 0xA3B7},{0xFF18, 0xA3B8},{0xFF19, 0xA3B9}, - {0xFF1A, 0xA3BA},{0xFF1B, 0xA3BB},{0xFF1C, 0xA3BC},{0xFF1D, 0xA3BD},{0xFF1E, 0xA3BE},{0xFF1F, 0xA3BF},{0xFF20, 0xA3C0},{0xFF21, 0xA3C1}, - {0xFF22, 0xA3C2},{0xFF23, 0xA3C3},{0xFF24, 0xA3C4},{0xFF25, 0xA3C5},{0xFF26, 0xA3C6},{0xFF27, 0xA3C7},{0xFF28, 0xA3C8},{0xFF29, 0xA3C9}, - {0xFF2A, 0xA3CA},{0xFF2B, 0xA3CB},{0xFF2C, 0xA3CC},{0xFF2D, 0xA3CD},{0xFF2E, 0xA3CE},{0xFF2F, 0xA3CF},{0xFF30, 0xA3D0},{0xFF31, 0xA3D1}, - {0xFF32, 0xA3D2},{0xFF33, 0xA3D3},{0xFF34, 0xA3D4},{0xFF35, 0xA3D5},{0xFF36, 0xA3D6},{0xFF37, 0xA3D7},{0xFF38, 0xA3D8},{0xFF39, 0xA3D9}, - {0xFF3A, 0xA3DA},{0xFF3B, 0xA3DB},{0xFF3C, 0xA3DC},{0xFF3D, 0xA3DD},{0xFF3E, 0xA3DE},{0xFF3F, 0xA3DF},{0xFF40, 0xA3E0},{0xFF41, 0xA3E1}, - {0xFF42, 0xA3E2},{0xFF43, 0xA3E3},{0xFF44, 0xA3E4},{0xFF45, 0xA3E5},{0xFF46, 0xA3E6},{0xFF47, 0xA3E7},{0xFF48, 0xA3E8},{0xFF49, 0xA3E9}, - {0xFF4A, 0xA3EA},{0xFF4B, 0xA3EB},{0xFF4C, 0xA3EC},{0xFF4D, 0xA3ED},{0xFF4E, 0xA3EE},{0xFF4F, 0xA3EF},{0xFF50, 0xA3F0},{0xFF51, 0xA3F1}, - {0xFF52, 0xA3F2},{0xFF53, 0xA3F3},{0xFF54, 0xA3F4},{0xFF55, 0xA3F5},{0xFF56, 0xA3F6},{0xFF57, 0xA3F7},{0xFF58, 0xA3F8},{0xFF59, 0xA3F9}, - {0xFF5A, 0xA3FA},{0xFF5B, 0xA3FB},{0xFF5C, 0xA3FC},{0xFF5D, 0xA3FD},{0xFF5E, 0xA1AB},{0xFFE0, 0xA1E9},{0xFFE1, 0xA1EA},{0xFFE2, 0xA956}, - {0xFFE3, 0xA3FE},{0xFFE4, 0xA957},{0xFFE5, 0xA3A4} -}; diff --git a/vcl/source/fontsubset/u2shiftjis.inc b/vcl/source/fontsubset/u2shiftjis.inc deleted file mode 100644 index ebc6f1676784..000000000000 --- a/vcl/source/fontsubset/u2shiftjis.inc +++ /dev/null @@ -1,967 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// TODO: use generic RTL_TEXTENCODING_SHIFTJIS to get rid of this file - -sal_uInt16pair xlat_1_2[7484] = { - {0x0020, 0x0020},{0x0021, 0x0021},{0x0022, 0x0022},{0x0023, 0x0023},{0x0024, 0x0024},{0x0025, 0x0025},{0x0026, 0x0026},{0x0027, 0x0027}, - {0x0028, 0x0028},{0x0029, 0x0029},{0x002A, 0x002A},{0x002B, 0x002B},{0x002C, 0x002C},{0x002D, 0x002D},{0x002E, 0x002E},{0x002F, 0x002F}, - {0x0030, 0x0030},{0x0031, 0x0031},{0x0032, 0x0032},{0x0033, 0x0033},{0x0034, 0x0034},{0x0035, 0x0035},{0x0036, 0x0036},{0x0037, 0x0037}, - {0x0038, 0x0038},{0x0039, 0x0039},{0x003A, 0x003A},{0x003B, 0x003B},{0x003C, 0x003C},{0x003D, 0x003D},{0x003E, 0x003E},{0x003F, 0x003F}, - {0x0040, 0x0040},{0x0041, 0x0041},{0x0042, 0x0042},{0x0043, 0x0043},{0x0044, 0x0044},{0x0045, 0x0045},{0x0046, 0x0046},{0x0047, 0x0047}, - {0x0048, 0x0048},{0x0049, 0x0049},{0x004A, 0x004A},{0x004B, 0x004B},{0x004C, 0x004C},{0x004D, 0x004D},{0x004E, 0x004E},{0x004F, 0x004F}, - {0x0050, 0x0050},{0x0051, 0x0051},{0x0052, 0x0052},{0x0053, 0x0053},{0x0054, 0x0054},{0x0055, 0x0055},{0x0056, 0x0056},{0x0057, 0x0057}, - {0x0058, 0x0058},{0x0059, 0x0059},{0x005A, 0x005A},{0x005B, 0x005B},{0x005C, 0x005C},{0x005D, 0x005D},{0x005E, 0x005E},{0x005F, 0x005F}, - {0x0060, 0x0060},{0x0061, 0x0061},{0x0062, 0x0062},{0x0063, 0x0063},{0x0064, 0x0064},{0x0065, 0x0065},{0x0066, 0x0066},{0x0067, 0x0067}, - {0x0068, 0x0068},{0x0069, 0x0069},{0x006A, 0x006A},{0x006B, 0x006B},{0x006C, 0x006C},{0x006D, 0x006D},{0x006E, 0x006E},{0x006F, 0x006F}, - {0x0070, 0x0070},{0x0071, 0x0071},{0x0072, 0x0072},{0x0073, 0x0073},{0x0074, 0x0074},{0x0075, 0x0075},{0x0076, 0x0076},{0x0077, 0x0077}, - {0x0078, 0x0078},{0x0079, 0x0079},{0x007A, 0x007A},{0x007B, 0x007B},{0x007C, 0x007C},{0x007D, 0x007D},{0x007E, 0x007E},{0x00A7, 0x8198}, - {0x00A8, 0x814E},{0x00B0, 0x818B},{0x00B1, 0x817D},{0x00B4, 0x814C},{0x00B6, 0x81F7},{0x00D7, 0x817E},{0x00F7, 0x8180},{0x0391, 0x839F}, - {0x0392, 0x83A0},{0x0393, 0x83A1},{0x0394, 0x83A2},{0x0395, 0x83A3},{0x0396, 0x83A4},{0x0397, 0x83A5},{0x0398, 0x83A6},{0x0399, 0x83A7}, - {0x039A, 0x83A8},{0x039B, 0x83A9},{0x039C, 0x83AA},{0x039D, 0x83AB},{0x039E, 0x83AC},{0x039F, 0x83AD},{0x03A0, 0x83AE},{0x03A1, 0x83AF}, - {0x03A3, 0x83B0},{0x03A4, 0x83B1},{0x03A5, 0x83B2},{0x03A6, 0x83B3},{0x03A7, 0x83B4},{0x03A8, 0x83B5},{0x03A9, 0x83B6},{0x03B1, 0x83BF}, - {0x03B2, 0x83C0},{0x03B3, 0x83C1},{0x03B4, 0x83C2},{0x03B5, 0x83C3},{0x03B6, 0x83C4},{0x03B7, 0x83C5},{0x03B8, 0x83C6},{0x03B9, 0x83C7}, - {0x03BA, 0x83C8},{0x03BB, 0x83C9},{0x03BC, 0x83CA},{0x03BD, 0x83CB},{0x03BE, 0x83CC},{0x03BF, 0x83CD},{0x03C0, 0x83CE},{0x03C1, 0x83CF}, - {0x03C3, 0x83D0},{0x03C4, 0x83D1},{0x03C5, 0x83D2},{0x03C6, 0x83D3},{0x03C7, 0x83D4},{0x03C8, 0x83D5},{0x03C9, 0x83D6},{0x0401, 0x8446}, - {0x0410, 0x8440},{0x0411, 0x8441},{0x0412, 0x8442},{0x0413, 0x8443},{0x0414, 0x8444},{0x0415, 0x8445},{0x0416, 0x8447},{0x0417, 0x8448}, - {0x0418, 0x8449},{0x0419, 0x844A},{0x041A, 0x844B},{0x041B, 0x844C},{0x041C, 0x844D},{0x041D, 0x844E},{0x041E, 0x844F},{0x041F, 0x8450}, - {0x0420, 0x8451},{0x0421, 0x8452},{0x0422, 0x8453},{0x0423, 0x8454},{0x0424, 0x8455},{0x0425, 0x8456},{0x0426, 0x8457},{0x0427, 0x8458}, - {0x0428, 0x8459},{0x0429, 0x845A},{0x042A, 0x845B},{0x042B, 0x845C},{0x042C, 0x845D},{0x042D, 0x845E},{0x042E, 0x845F},{0x042F, 0x8460}, - {0x0430, 0x8470},{0x0431, 0x8471},{0x0432, 0x8472},{0x0433, 0x8473},{0x0434, 0x8474},{0x0435, 0x8475},{0x0436, 0x8477},{0x0437, 0x8478}, - {0x0438, 0x8479},{0x0439, 0x847A},{0x043A, 0x847B},{0x043B, 0x847C},{0x043C, 0x847D},{0x043D, 0x847E},{0x043E, 0x8480},{0x043F, 0x8481}, - {0x0440, 0x8482},{0x0441, 0x8483},{0x0442, 0x8484},{0x0443, 0x8485},{0x0444, 0x8486},{0x0445, 0x8487},{0x0446, 0x8488},{0x0447, 0x8489}, - {0x0448, 0x848A},{0x0449, 0x848B},{0x044A, 0x848C},{0x044B, 0x848D},{0x044C, 0x848E},{0x044D, 0x848F},{0x044E, 0x8490},{0x044F, 0x8491}, - {0x0451, 0x8476},{0x2010, 0x815D},{0x2015, 0x815C},{0x2018, 0x8165},{0x2019, 0x8166},{0x201C, 0x8167},{0x201D, 0x8168},{0x2020, 0x81F5}, - {0x2021, 0x81F6},{0x2025, 0x8164},{0x2026, 0x8163},{0x2030, 0x81F1},{0x2032, 0x818C},{0x2033, 0x818D},{0x203B, 0x81A6},{0x2103, 0x818E}, - {0x2116, 0x8782},{0x2121, 0x8784},{0x212B, 0x81F0},{0x2160, 0x8754},{0x2161, 0x8755},{0x2162, 0x8756},{0x2163, 0x8757},{0x2164, 0x8758}, - {0x2165, 0x8759},{0x2166, 0x875A},{0x2167, 0x875B},{0x2168, 0x875C},{0x2169, 0x875D},{0x2170, 0xEEEF},{0x2171, 0xEEF0},{0x2172, 0xEEF1}, - {0x2173, 0xEEF2},{0x2174, 0xEEF3},{0x2175, 0xEEF4},{0x2176, 0xEEF5},{0x2177, 0xEEF6},{0x2178, 0xEEF7},{0x2179, 0xEEF8},{0x2190, 0x81A9}, - {0x2191, 0x81AA},{0x2192, 0x81A8},{0x2193, 0x81AB},{0x21D2, 0x81CB},{0x21D4, 0x81CC},{0x2200, 0x81CD},{0x2202, 0x81DD},{0x2203, 0x81CE}, - {0x2207, 0x81DE},{0x2208, 0x81B8},{0x220B, 0x81B9},{0x2211, 0x8794},{0x221A, 0x81E3},{0x221D, 0x81E5},{0x221E, 0x8187},{0x221F, 0x8798}, - {0x2220, 0x81DA},{0x2225, 0x8161},{0x2227, 0x81C8},{0x2228, 0x81C9},{0x2229, 0x81BF},{0x222A, 0x81BE},{0x222B, 0x81E7},{0x222C, 0x81E8}, - {0x222E, 0x8793},{0x2234, 0x8188},{0x2235, 0x81E6},{0x223D, 0x81E4},{0x2252, 0x81E0},{0x2260, 0x8182},{0x2261, 0x81DF},{0x2266, 0x8185}, - {0x2267, 0x8186},{0x226A, 0x81E1},{0x226B, 0x81E2},{0x2282, 0x81BC},{0x2283, 0x81BD},{0x2286, 0x81BA},{0x2287, 0x81BB},{0x22A5, 0x81DB}, - {0x22BF, 0x8799},{0x2312, 0x81DC},{0x2460, 0x8740},{0x2461, 0x8741},{0x2462, 0x8742},{0x2463, 0x8743},{0x2464, 0x8744},{0x2465, 0x8745}, - {0x2466, 0x8746},{0x2467, 0x8747},{0x2468, 0x8748},{0x2469, 0x8749},{0x246A, 0x874A},{0x246B, 0x874B},{0x246C, 0x874C},{0x246D, 0x874D}, - {0x246E, 0x874E},{0x246F, 0x874F},{0x2470, 0x8750},{0x2471, 0x8751},{0x2472, 0x8752},{0x2473, 0x8753},{0x2500, 0x849F},{0x2501, 0x84AA}, - {0x2502, 0x84A0},{0x2503, 0x84AB},{0x250C, 0x84A1},{0x250F, 0x84AC},{0x2510, 0x84A2},{0x2513, 0x84AD},{0x2514, 0x84A4},{0x2517, 0x84AF}, - {0x2518, 0x84A3},{0x251B, 0x84AE},{0x251C, 0x84A5},{0x251D, 0x84BA},{0x2520, 0x84B5},{0x2523, 0x84B0},{0x2524, 0x84A7},{0x2525, 0x84BC}, - {0x2528, 0x84B7},{0x252B, 0x84B2},{0x252C, 0x84A6},{0x252F, 0x84B6},{0x2530, 0x84BB},{0x2533, 0x84B1},{0x2534, 0x84A8},{0x2537, 0x84B8}, - {0x2538, 0x84BD},{0x253B, 0x84B3},{0x253C, 0x84A9},{0x253F, 0x84B9},{0x2542, 0x84BE},{0x254B, 0x84B4},{0x25A0, 0x81A1},{0x25A1, 0x81A0}, - {0x25B2, 0x81A3},{0x25B3, 0x81A2},{0x25BC, 0x81A5},{0x25BD, 0x81A4},{0x25C6, 0x819F},{0x25C7, 0x819E},{0x25CB, 0x819B},{0x25CE, 0x819D}, - {0x25CF, 0x819C},{0x25EF, 0x81FC},{0x2605, 0x819A},{0x2606, 0x8199},{0x2640, 0x818A},{0x2642, 0x8189},{0x266A, 0x81F4},{0x266D, 0x81F3}, - {0x266F, 0x81F2},{0x3000, 0x8140},{0x3001, 0x8141},{0x3002, 0x8142},{0x3003, 0x8156},{0x3005, 0x8158},{0x3006, 0x8159},{0x3007, 0x815A}, - {0x3008, 0x8171},{0x3009, 0x8172},{0x300A, 0x8173},{0x300B, 0x8174},{0x300C, 0x8175},{0x300D, 0x8176},{0x300E, 0x8177},{0x300F, 0x8178}, - {0x3010, 0x8179},{0x3011, 0x817A},{0x3012, 0x81A7},{0x3013, 0x81AC},{0x3014, 0x816B},{0x3015, 0x816C},{0x301D, 0x8780},{0x301F, 0x8781}, - {0x3041, 0x829F},{0x3042, 0x82A0},{0x3043, 0x82A1},{0x3044, 0x82A2},{0x3045, 0x82A3},{0x3046, 0x82A4},{0x3047, 0x82A5},{0x3048, 0x82A6}, - {0x3049, 0x82A7},{0x304A, 0x82A8},{0x304B, 0x82A9},{0x304C, 0x82AA},{0x304D, 0x82AB},{0x304E, 0x82AC},{0x304F, 0x82AD},{0x3050, 0x82AE}, - {0x3051, 0x82AF},{0x3052, 0x82B0},{0x3053, 0x82B1},{0x3054, 0x82B2},{0x3055, 0x82B3},{0x3056, 0x82B4},{0x3057, 0x82B5},{0x3058, 0x82B6}, - {0x3059, 0x82B7},{0x305A, 0x82B8},{0x305B, 0x82B9},{0x305C, 0x82BA},{0x305D, 0x82BB},{0x305E, 0x82BC},{0x305F, 0x82BD},{0x3060, 0x82BE}, - {0x3061, 0x82BF},{0x3062, 0x82C0},{0x3063, 0x82C1},{0x3064, 0x82C2},{0x3065, 0x82C3},{0x3066, 0x82C4},{0x3067, 0x82C5},{0x3068, 0x82C6}, - {0x3069, 0x82C7},{0x306A, 0x82C8},{0x306B, 0x82C9},{0x306C, 0x82CA},{0x306D, 0x82CB},{0x306E, 0x82CC},{0x306F, 0x82CD},{0x3070, 0x82CE}, - {0x3071, 0x82CF},{0x3072, 0x82D0},{0x3073, 0x82D1},{0x3074, 0x82D2},{0x3075, 0x82D3},{0x3076, 0x82D4},{0x3077, 0x82D5},{0x3078, 0x82D6}, - {0x3079, 0x82D7},{0x307A, 0x82D8},{0x307B, 0x82D9},{0x307C, 0x82DA},{0x307D, 0x82DB},{0x307E, 0x82DC},{0x307F, 0x82DD},{0x3080, 0x82DE}, - {0x3081, 0x82DF},{0x3082, 0x82E0},{0x3083, 0x82E1},{0x3084, 0x82E2},{0x3085, 0x82E3},{0x3086, 0x82E4},{0x3087, 0x82E5},{0x3088, 0x82E6}, - {0x3089, 0x82E7},{0x308A, 0x82E8},{0x308B, 0x82E9},{0x308C, 0x82EA},{0x308D, 0x82EB},{0x308E, 0x82EC},{0x308F, 0x82ED},{0x3090, 0x82EE}, - {0x3091, 0x82EF},{0x3092, 0x82F0},{0x3093, 0x82F1},{0x309B, 0x814A},{0x309C, 0x814B},{0x309D, 0x8154},{0x309E, 0x8155},{0x30A1, 0x8340}, - {0x30A2, 0x8341},{0x30A3, 0x8342},{0x30A4, 0x8343},{0x30A5, 0x8344},{0x30A6, 0x8345},{0x30A7, 0x8346},{0x30A8, 0x8347},{0x30A9, 0x8348}, - {0x30AA, 0x8349},{0x30AB, 0x834A},{0x30AC, 0x834B},{0x30AD, 0x834C},{0x30AE, 0x834D},{0x30AF, 0x834E},{0x30B0, 0x834F},{0x30B1, 0x8350}, - {0x30B2, 0x8351},{0x30B3, 0x8352},{0x30B4, 0x8353},{0x30B5, 0x8354},{0x30B6, 0x8355},{0x30B7, 0x8356},{0x30B8, 0x8357},{0x30B9, 0x8358}, - {0x30BA, 0x8359},{0x30BB, 0x835A},{0x30BC, 0x835B},{0x30BD, 0x835C},{0x30BE, 0x835D},{0x30BF, 0x835E},{0x30C0, 0x835F},{0x30C1, 0x8360}, - {0x30C2, 0x8361},{0x30C3, 0x8362},{0x30C4, 0x8363},{0x30C5, 0x8364},{0x30C6, 0x8365},{0x30C7, 0x8366},{0x30C8, 0x8367},{0x30C9, 0x8368}, - {0x30CA, 0x8369},{0x30CB, 0x836A},{0x30CC, 0x836B},{0x30CD, 0x836C},{0x30CE, 0x836D},{0x30CF, 0x836E},{0x30D0, 0x836F},{0x30D1, 0x8370}, - {0x30D2, 0x8371},{0x30D3, 0x8372},{0x30D4, 0x8373},{0x30D5, 0x8374},{0x30D6, 0x8375},{0x30D7, 0x8376},{0x30D8, 0x8377},{0x30D9, 0x8378}, - {0x30DA, 0x8379},{0x30DB, 0x837A},{0x30DC, 0x837B},{0x30DD, 0x837C},{0x30DE, 0x837D},{0x30DF, 0x837E},{0x30E0, 0x8380},{0x30E1, 0x8381}, - {0x30E2, 0x8382},{0x30E3, 0x8383},{0x30E4, 0x8384},{0x30E5, 0x8385},{0x30E6, 0x8386},{0x30E7, 0x8387},{0x30E8, 0x8388},{0x30E9, 0x8389}, - {0x30EA, 0x838A},{0x30EB, 0x838B},{0x30EC, 0x838C},{0x30ED, 0x838D},{0x30EE, 0x838E},{0x30EF, 0x838F},{0x30F0, 0x8390},{0x30F1, 0x8391}, - {0x30F2, 0x8392},{0x30F3, 0x8393},{0x30F4, 0x8394},{0x30F5, 0x8395},{0x30F6, 0x8396},{0x30FB, 0x8145},{0x30FC, 0x815B},{0x30FD, 0x8152}, - {0x30FE, 0x8153},{0x3231, 0x878A},{0x3232, 0x878B},{0x3239, 0x878C},{0x32A4, 0x8785},{0x32A5, 0x8786},{0x32A6, 0x8787},{0x32A7, 0x8788}, - {0x32A8, 0x8789},{0x3303, 0x8765},{0x330D, 0x8769},{0x3314, 0x8760},{0x3318, 0x8763},{0x3322, 0x8761},{0x3323, 0x876B},{0x3326, 0x876A}, - {0x3327, 0x8764},{0x332B, 0x876C},{0x3336, 0x8766},{0x333B, 0x876E},{0x3349, 0x875F},{0x334A, 0x876D},{0x334D, 0x8762},{0x3351, 0x8767}, - {0x3357, 0x8768},{0x337B, 0x877E},{0x337C, 0x878F},{0x337D, 0x878E},{0x337E, 0x878D},{0x338E, 0x8772},{0x338F, 0x8773},{0x339C, 0x876F}, - {0x339D, 0x8770},{0x339E, 0x8771},{0x33A1, 0x8775},{0x33C4, 0x8774},{0x33CD, 0x8783},{0x4E00, 0x88EA},{0x4E01, 0x929A},{0x4E03, 0x8EB5}, - {0x4E07, 0x969C},{0x4E08, 0x8FE4},{0x4E09, 0x8E4F},{0x4E0A, 0x8FE3},{0x4E0B, 0x89BA},{0x4E0D, 0x9573},{0x4E0E, 0x975E},{0x4E10, 0x98A0}, - {0x4E11, 0x894E},{0x4E14, 0x8A8E},{0x4E15, 0x98A1},{0x4E16, 0x90A2},{0x4E17, 0x99C0},{0x4E18, 0x8B75},{0x4E19, 0x95B8},{0x4E1E, 0x8FE5}, - {0x4E21, 0x97BC},{0x4E26, 0x95C0},{0x4E28, 0xED4C},{0x4E2A, 0x98A2},{0x4E2D, 0x9286},{0x4E31, 0x98A3},{0x4E32, 0x8BF8},{0x4E36, 0x98A4}, - {0x4E38, 0x8ADB},{0x4E39, 0x924F},{0x4E3B, 0x8EE5},{0x4E3C, 0x98A5},{0x4E3F, 0x98A6},{0x4E42, 0x98A7},{0x4E43, 0x9454},{0x4E45, 0x8B76}, - {0x4E4B, 0x9456},{0x4E4D, 0x93E1},{0x4E4E, 0x8CC1},{0x4E4F, 0x9652},{0x4E55, 0xE568},{0x4E56, 0x98A8},{0x4E57, 0x8FE6},{0x4E58, 0x98A9}, - {0x4E59, 0x89B3},{0x4E5D, 0x8BE3},{0x4E5E, 0x8CEE},{0x4E5F, 0x96E7},{0x4E62, 0x9BA4},{0x4E71, 0x9790},{0x4E73, 0x93FB},{0x4E7E, 0x8AA3}, - {0x4E80, 0x8B54},{0x4E82, 0x98AA},{0x4E85, 0x98AB},{0x4E86, 0x97B9},{0x4E88, 0x975C},{0x4E89, 0x9188},{0x4E8A, 0x98AD},{0x4E8B, 0x8E96}, - {0x4E8C, 0x93F1},{0x4E8E, 0x98B0},{0x4E91, 0x895D},{0x4E92, 0x8CDD},{0x4E94, 0x8CDC},{0x4E95, 0x88E4},{0x4E98, 0x986A},{0x4E99, 0x9869}, - {0x4E9B, 0x8DB1},{0x4E9C, 0x889F},{0x4E9E, 0x98B1},{0x4E9F, 0x98B2},{0x4EA0, 0x98B3},{0x4EA1, 0x9653},{0x4EA2, 0x98B4},{0x4EA4, 0x8CF0}, - {0x4EA5, 0x88E5},{0x4EA6, 0x9692},{0x4EA8, 0x8B9C},{0x4EAB, 0x8B9D},{0x4EAC, 0x8B9E},{0x4EAD, 0x92E0},{0x4EAE, 0x97BA},{0x4EB0, 0x98B5}, - {0x4EB3, 0x98B6},{0x4EB6, 0x98B7},{0x4EBA, 0x906C},{0x4EC0, 0x8F59},{0x4EC1, 0x906D},{0x4EC2, 0x98BC},{0x4EC4, 0x98BA},{0x4EC6, 0x98BB}, - {0x4EC7, 0x8B77},{0x4ECA, 0x8DA1},{0x4ECB, 0x89EE},{0x4ECD, 0x98B9},{0x4ECE, 0x98B8},{0x4ECF, 0x95A7},{0x4ED4, 0x8E65},{0x4ED5, 0x8E64}, - {0x4ED6, 0x91BC},{0x4ED7, 0x98BD},{0x4ED8, 0x9574},{0x4ED9, 0x90E5},{0x4EDD, 0x8157},{0x4EDE, 0x98BE},{0x4EDF, 0x98C0},{0x4EE1, 0xED4D}, - {0x4EE3, 0x91E3},{0x4EE4, 0x97DF},{0x4EE5, 0x88C8},{0x4EED, 0x98BF},{0x4EEE, 0x89BC},{0x4EF0, 0x8BC2},{0x4EF2, 0x9287},{0x4EF6, 0x8C8F}, - {0x4EF7, 0x98C1},{0x4EFB, 0x9443},{0x4EFC, 0xED4E},{0x4F00, 0xED4F},{0x4F01, 0x8AE9},{0x4F03, 0xED50},{0x4F09, 0x98C2},{0x4F0A, 0x88C9}, - {0x4F0D, 0x8CDE},{0x4F0E, 0x8AEA},{0x4F0F, 0x959A},{0x4F10, 0x94B0},{0x4F11, 0x8B78},{0x4F1A, 0x89EF},{0x4F1C, 0x98E5},{0x4F1D, 0x9360}, - {0x4F2F, 0x948C},{0x4F30, 0x98C4},{0x4F34, 0x94BA},{0x4F36, 0x97E0},{0x4F38, 0x904C},{0x4F39, 0xED51},{0x4F3A, 0x8E66},{0x4F3C, 0x8E97}, - {0x4F3D, 0x89BE},{0x4F43, 0x92CF},{0x4F46, 0x9241},{0x4F47, 0x98C8},{0x4F4D, 0x88CA},{0x4F4E, 0x92E1},{0x4F4F, 0x8F5A},{0x4F50, 0x8DB2}, - {0x4F51, 0x9743},{0x4F53, 0x91CC},{0x4F55, 0x89BD},{0x4F56, 0xED52},{0x4F57, 0x98C7},{0x4F59, 0x975D},{0x4F5A, 0x98C3},{0x4F5B, 0x98C5}, - {0x4F5C, 0x8DEC},{0x4F5D, 0x98C6},{0x4F5E, 0x9B43},{0x4F69, 0x98CE},{0x4F6F, 0x98D1},{0x4F70, 0x98CF},{0x4F73, 0x89C0},{0x4F75, 0x95B9}, - {0x4F76, 0x98C9},{0x4F7B, 0x98CD},{0x4F7C, 0x8CF1},{0x4F7F, 0x8E67},{0x4F83, 0x8AA4},{0x4F86, 0x98D2},{0x4F88, 0x98CA},{0x4F8A, 0xED54}, - {0x4F8B, 0x97E1},{0x4F8D, 0x8E98},{0x4F8F, 0x98CB},{0x4F91, 0x98D0},{0x4F92, 0xED53},{0x4F94, 0xED56},{0x4F96, 0x98D3},{0x4F98, 0x98CC}, - {0x4F9A, 0xED55},{0x4F9B, 0x8B9F},{0x4F9D, 0x88CB},{0x4FA0, 0x8BA0},{0x4FA1, 0x89BF},{0x4FAB, 0x9B44},{0x4FAD, 0x9699},{0x4FAE, 0x958E}, - {0x4FAF, 0x8CF2},{0x4FB5, 0x904E},{0x4FB6, 0x97B5},{0x4FBF, 0x95D6},{0x4FC2, 0x8C57},{0x4FC3, 0x91A3},{0x4FC4, 0x89E2},{0x4FC9, 0xED45}, - {0x4FCA, 0x8F72},{0x4FCD, 0xED57},{0x4FCE, 0x98D7},{0x4FD0, 0x98DC},{0x4FD1, 0x98DA},{0x4FD4, 0x98D5},{0x4FD7, 0x91AD},{0x4FD8, 0x98D8}, - {0x4FDA, 0x98DB},{0x4FDB, 0x98D9},{0x4FDD, 0x95DB},{0x4FDF, 0x98D6},{0x4FE1, 0x904D},{0x4FE3, 0x9693},{0x4FE4, 0x98DD},{0x4FE5, 0x98DE}, - {0x4FEE, 0x8F43},{0x4FEF, 0x98EB},{0x4FF3, 0x946F},{0x4FF5, 0x9555},{0x4FF6, 0x98E6},{0x4FF8, 0x95EE},{0x4FFA, 0x89B4},{0x4FFE, 0x98EA}, - {0x4FFF, 0xED5A},{0x5005, 0x98E4},{0x5006, 0x98ED},{0x5009, 0x9171},{0x500B, 0x8CC2},{0x500D, 0x947B},{0x500F, 0xE0C5},{0x5011, 0x98EC}, - {0x5012, 0x937C},{0x5014, 0x98E1},{0x5016, 0x8CF4},{0x5019, 0x8CF3},{0x501A, 0x98DF},{0x501E, 0xED5B},{0x501F, 0x8ED8},{0x5021, 0x98E7}, - {0x5022, 0xED59},{0x5023, 0x95ED},{0x5024, 0x926C},{0x5025, 0x98E3},{0x5026, 0x8C91},{0x5028, 0x98E0},{0x5029, 0x98E8},{0x502A, 0x98E2}, - {0x502B, 0x97CF},{0x502C, 0x98E9},{0x502D, 0x9860},{0x5036, 0x8BE4},{0x5039, 0x8C90},{0x5040, 0xED58},{0x5042, 0xED5E},{0x5043, 0x98EE}, - {0x5046, 0xED5C},{0x5047, 0x98EF},{0x5048, 0x98F3},{0x5049, 0x88CC},{0x504F, 0x95CE},{0x5050, 0x98F2},{0x5055, 0x98F1},{0x5056, 0x98F5}, - {0x505A, 0x98F4},{0x505C, 0x92E2},{0x5065, 0x8C92},{0x506C, 0x98F6},{0x5070, 0xED5D},{0x5072, 0x8EC3},{0x5074, 0x91A4},{0x5075, 0x92E3}, - {0x5076, 0x8BF4},{0x5078, 0x98F7},{0x507D, 0x8B55},{0x5080, 0x98F8},{0x5085, 0x98FA},{0x508D, 0x9654},{0x5091, 0x8C86},{0x5094, 0xED5F}, - {0x5098, 0x8E50},{0x5099, 0x94F5},{0x509A, 0x98F9},{0x50AC, 0x8DC3},{0x50AD, 0x9762},{0x50B2, 0x98FC},{0x50B3, 0x9942},{0x50B4, 0x98FB}, - {0x50B5, 0x8DC2},{0x50B7, 0x8F9D},{0x50BE, 0x8C58},{0x50C2, 0x9943},{0x50C5, 0x8BCD},{0x50C9, 0x9940},{0x50CA, 0x9941},{0x50CD, 0x93AD}, - {0x50CF, 0x919C},{0x50D1, 0x8BA1},{0x50D5, 0x966C},{0x50D6, 0x9944},{0x50D8, 0xED61},{0x50DA, 0x97BB},{0x50DE, 0x9945},{0x50E3, 0x9948}, - {0x50E5, 0x9946},{0x50E7, 0x916D},{0x50ED, 0x9947},{0x50EE, 0x9949},{0x50F4, 0xED60},{0x50F5, 0x994B},{0x50F9, 0x994A},{0x50FB, 0x95C6}, - {0x5100, 0x8B56},{0x5101, 0x994D},{0x5102, 0x994E},{0x5104, 0x89AD},{0x5109, 0x994C},{0x5112, 0x8EF2},{0x5114, 0x9951},{0x5115, 0x9950}, - {0x5116, 0x994F},{0x5118, 0x98D4},{0x511A, 0x9952},{0x511F, 0x8F9E},{0x5121, 0x9953},{0x512A, 0x9744},{0x5132, 0x96D7},{0x5137, 0x9955}, - {0x513A, 0x9954},{0x513B, 0x9957},{0x513C, 0x9956},{0x513F, 0x9958},{0x5140, 0x9959},{0x5141, 0x88F2},{0x5143, 0x8CB3},{0x5144, 0x8C5A}, - {0x5145, 0x8F5B},{0x5146, 0x929B},{0x5147, 0x8BA2},{0x5148, 0x90E6},{0x5149, 0x8CF5},{0x514A, 0xED62},{0x514B, 0x8D8E},{0x514C, 0x995B}, - {0x514D, 0x96C6},{0x514E, 0x9365},{0x5150, 0x8E99},{0x5152, 0x995A},{0x5154, 0x995C},{0x515A, 0x937D},{0x515C, 0x8A95},{0x5162, 0x995D}, - {0x5164, 0xED63},{0x5165, 0x93FC},{0x5168, 0x9153},{0x5169, 0x995F},{0x516A, 0x9960},{0x516B, 0x94AA},{0x516C, 0x8CF6},{0x516D, 0x985A}, - {0x516E, 0x9961},{0x5171, 0x8BA4},{0x5175, 0x95BA},{0x5176, 0x91B4},{0x5177, 0x8BEF},{0x5178, 0x9354},{0x517C, 0x8C93},{0x5180, 0x9962}, - {0x5182, 0x9963},{0x5185, 0x93E0},{0x5186, 0x897E},{0x5189, 0x9966},{0x518A, 0x8DFB},{0x518C, 0x9965},{0x518D, 0x8DC4},{0x518F, 0x9967}, - {0x5190, 0xE3EC},{0x5191, 0x9968},{0x5192, 0x9660},{0x5193, 0x9969},{0x5195, 0x996A},{0x5196, 0x996B},{0x5197, 0x8FE7},{0x5199, 0x8ECA}, - {0x519D, 0xED64},{0x51A0, 0x8AA5},{0x51A2, 0x996E},{0x51A4, 0x996C},{0x51A5, 0x96BB},{0x51A6, 0x996D},{0x51A8, 0x9579},{0x51A9, 0x996F}, - {0x51AA, 0x9970},{0x51AB, 0x9971},{0x51AC, 0x937E},{0x51B0, 0x9975},{0x51B1, 0x9973},{0x51B2, 0x9974},{0x51B3, 0x9972},{0x51B4, 0x8DE1}, - {0x51B5, 0x9976},{0x51B6, 0x96E8},{0x51B7, 0x97E2},{0x51BD, 0x9977},{0x51BE, 0xED65},{0x51C4, 0x90A6},{0x51C5, 0x9978},{0x51C6, 0x8F79}, - {0x51C9, 0x9979},{0x51CB, 0x929C},{0x51CC, 0x97BD},{0x51CD, 0x9380},{0x51D6, 0x99C3},{0x51DB, 0x997A},{0x51DC, 0xEAA3},{0x51DD, 0x8BC3}, - {0x51E0, 0x997B},{0x51E1, 0x967D},{0x51E6, 0x8F88},{0x51E7, 0x91FA},{0x51E9, 0x997D},{0x51EA, 0x93E2},{0x51EC, 0xED66},{0x51ED, 0x997E}, - {0x51F0, 0x9980},{0x51F1, 0x8A4D},{0x51F5, 0x9981},{0x51F6, 0x8BA5},{0x51F8, 0x93CA},{0x51F9, 0x899A},{0x51FA, 0x8F6F},{0x51FD, 0x949F}, - {0x51FE, 0x9982},{0x5200, 0x9381},{0x5203, 0x906E},{0x5204, 0x9983},{0x5206, 0x95AA},{0x5207, 0x90D8},{0x5208, 0x8AA0},{0x520A, 0x8AA7}, - {0x520B, 0x9984},{0x520E, 0x9986},{0x5211, 0x8C59},{0x5214, 0x9985},{0x5215, 0xED67},{0x5217, 0x97F1},{0x521D, 0x8F89},{0x5224, 0x94BB}, - {0x5225, 0x95CA},{0x5227, 0x9987},{0x5229, 0x9798},{0x522A, 0x9988},{0x522E, 0x9989},{0x5230, 0x939E},{0x5233, 0x998A},{0x5236, 0x90A7}, - {0x5237, 0x8DFC},{0x5238, 0x8C94},{0x5239, 0x998B},{0x523A, 0x8E68},{0x523B, 0x8D8F},{0x5243, 0x92E4},{0x5244, 0x998D},{0x5247, 0x91A5}, - {0x524A, 0x8DED},{0x524B, 0x998E},{0x524C, 0x998F},{0x524D, 0x914F},{0x524F, 0x998C},{0x5254, 0x9991},{0x5256, 0x9655},{0x525B, 0x8D84}, - {0x525E, 0x9990},{0x5263, 0x8C95},{0x5264, 0x8DDC},{0x5265, 0x948D},{0x5269, 0x9994},{0x526A, 0x9992},{0x526F, 0x959B},{0x5270, 0x8FE8}, - {0x5271, 0x999B},{0x5272, 0x8A84},{0x5273, 0x9995},{0x5274, 0x9993},{0x5275, 0x916E},{0x527D, 0x9997},{0x527F, 0x9996},{0x5283, 0x8A63}, - {0x5287, 0x8C80},{0x5288, 0x999C},{0x5289, 0x97AB},{0x528D, 0x9998},{0x5291, 0x999D},{0x5292, 0x999A},{0x5294, 0x9999},{0x529B, 0x97CD}, - {0x529C, 0xED68},{0x529F, 0x8CF7},{0x52A0, 0x89C1},{0x52A3, 0x97F2},{0x52A6, 0xED69},{0x52A9, 0x8F95},{0x52AA, 0x9377},{0x52AB, 0x8D85}, - {0x52AC, 0x99A0},{0x52AD, 0x99A1},{0x52AF, 0xEE5B},{0x52B1, 0x97E3},{0x52B4, 0x984A},{0x52B5, 0x99A3},{0x52B9, 0x8CF8},{0x52BC, 0x99A2}, - {0x52BE, 0x8A4E},{0x52C0, 0xED6A},{0x52C1, 0x99A4},{0x52C3, 0x9675},{0x52C5, 0x92BA},{0x52C7, 0x9745},{0x52C9, 0x95D7},{0x52CD, 0x99A5}, - {0x52D2, 0xE8D3},{0x52D5, 0x93AE},{0x52D7, 0x99A6},{0x52D8, 0x8AA8},{0x52D9, 0x96B1},{0x52DB, 0xED6B},{0x52DD, 0x8F9F},{0x52DE, 0x99A7}, - {0x52DF, 0x95E5},{0x52E0, 0x99AB},{0x52E2, 0x90A8},{0x52E3, 0x99A8},{0x52E4, 0x8BCE},{0x52E6, 0x99A9},{0x52E7, 0x8AA9},{0x52F2, 0x8C4D}, - {0x52F3, 0x99AC},{0x52F5, 0x99AD},{0x52F8, 0x99AE},{0x52F9, 0x99AF},{0x52FA, 0x8ED9},{0x52FE, 0x8CF9},{0x52FF, 0x96DC},{0x5300, 0xED6C}, - {0x5301, 0x96E6},{0x5302, 0x93F5},{0x5305, 0x95EF},{0x5306, 0x99B0},{0x5307, 0xED6D},{0x5308, 0x99B1},{0x530D, 0x99B3},{0x530F, 0x99B5}, - {0x5310, 0x99B4},{0x5315, 0x99B6},{0x5316, 0x89BB},{0x5317, 0x966B},{0x5319, 0x8DFA},{0x531A, 0x99B7},{0x531D, 0x9178},{0x5320, 0x8FA0}, - {0x5321, 0x8BA7},{0x5323, 0x99B8},{0x5324, 0xED6E},{0x532A, 0x94D9},{0x532F, 0x99B9},{0x5331, 0x99BA},{0x5333, 0x99BB},{0x5338, 0x99BC}, - {0x5339, 0x9543},{0x533A, 0x8BE6},{0x533B, 0x88E3},{0x533F, 0x93BD},{0x5340, 0x99BD},{0x5341, 0x8F5C},{0x5343, 0x90E7},{0x5345, 0x99BF}, - {0x5346, 0x99BE},{0x5347, 0x8FA1},{0x5348, 0x8CDF},{0x5349, 0x99C1},{0x534A, 0x94BC},{0x534D, 0x99C2},{0x5351, 0x94DA},{0x5352, 0x91B2}, - {0x5353, 0x91EC},{0x5354, 0x8BA6},{0x5357, 0x93EC},{0x5358, 0x9250},{0x535A, 0x948E},{0x535C, 0x966D},{0x535E, 0x99C4},{0x5360, 0x90E8}, - {0x5366, 0x8C54},{0x5369, 0x99C5},{0x536E, 0x99C6},{0x536F, 0x894B},{0x5370, 0x88F3},{0x5371, 0x8AEB},{0x5372, 0xED6F},{0x5373, 0x91A6}, - {0x5374, 0x8B70},{0x5375, 0x9791},{0x5377, 0x99C9},{0x5378, 0x89B5},{0x537B, 0x99C8},{0x537F, 0x8BA8},{0x5382, 0x99CA},{0x5384, 0x96EF}, - {0x5393, 0xED70},{0x5396, 0x99CB},{0x5398, 0x97D0},{0x539A, 0x8CFA},{0x539F, 0x8CB4},{0x53A0, 0x99CC},{0x53A5, 0x99CE},{0x53A6, 0x99CD}, - {0x53A8, 0x907E},{0x53A9, 0x8958},{0x53AD, 0x897D},{0x53AE, 0x99CF},{0x53B0, 0x99D0},{0x53B2, 0xED71},{0x53B3, 0x8CB5},{0x53B6, 0x99D1}, - {0x53BB, 0x8B8E},{0x53C2, 0x8E51},{0x53C3, 0x99D2},{0x53C8, 0x9694},{0x53C9, 0x8DB3},{0x53CA, 0x8B79},{0x53CB, 0x9746},{0x53CC, 0x916F}, - {0x53CD, 0x94BD},{0x53CE, 0x8EFB},{0x53D4, 0x8F66},{0x53D6, 0x8EE6},{0x53D7, 0x8EF3},{0x53D9, 0x8F96},{0x53DB, 0x94BE},{0x53DD, 0xED72}, - {0x53DF, 0x99D5},{0x53E1, 0x8962},{0x53E2, 0x9170},{0x53E3, 0x8CFB},{0x53E4, 0x8CC3},{0x53E5, 0x8BE5},{0x53E8, 0x99D9},{0x53E9, 0x9240}, - {0x53EA, 0x91FC},{0x53EB, 0x8BA9},{0x53EC, 0x8FA2},{0x53ED, 0x99DA},{0x53EE, 0x99D8},{0x53EF, 0x89C2},{0x53F0, 0x91E4},{0x53F1, 0x8EB6}, - {0x53F2, 0x8E6A},{0x53F3, 0x8945},{0x53F6, 0x8A90},{0x53F7, 0x8D86},{0x53F8, 0x8E69},{0x53FA, 0x99DB},{0x5401, 0x99DC},{0x5403, 0x8B68}, - {0x5404, 0x8A65},{0x5408, 0x8D87},{0x5409, 0x8B67},{0x540A, 0x92DD},{0x540B, 0x8944},{0x540C, 0x93AF},{0x540D, 0x96BC},{0x540E, 0x8D40}, - {0x540F, 0x9799},{0x5410, 0x9366},{0x5411, 0x8CFC},{0x541B, 0x8C4E},{0x541D, 0x99E5},{0x541F, 0x8BE1},{0x5420, 0x9669},{0x5426, 0x94DB}, - {0x5429, 0x99E4},{0x542B, 0x8ADC},{0x542C, 0x99DF},{0x542D, 0x99E0},{0x542E, 0x99E2},{0x5436, 0x99E3},{0x5438, 0x8B7A},{0x5439, 0x9081}, - {0x543B, 0x95AB},{0x543C, 0x99E1},{0x543D, 0x99DD},{0x543E, 0x8CE1},{0x5440, 0x99DE},{0x5442, 0x9843},{0x5446, 0x95F0},{0x5448, 0x92E6}, - {0x5449, 0x8CE0},{0x544A, 0x8D90},{0x544E, 0x99E6},{0x5451, 0x93DB},{0x545F, 0x99EA},{0x5468, 0x8EFC},{0x546A, 0x8EF4},{0x5470, 0x99ED}, - {0x5471, 0x99EB},{0x5473, 0x96A1},{0x5475, 0x99E8},{0x5476, 0x99F1},{0x5477, 0x99EC},{0x547B, 0x99EF},{0x547C, 0x8CC4},{0x547D, 0x96BD}, - {0x5480, 0x99F0},{0x5484, 0x99F2},{0x5486, 0x99F4},{0x548A, 0xED75},{0x548B, 0x8DEE},{0x548C, 0x9861},{0x548E, 0x99E9},{0x548F, 0x99E7}, - {0x5490, 0x99F3},{0x5492, 0x99EE},{0x549C, 0xED74},{0x54A2, 0x99F6},{0x54A4, 0x9A42},{0x54A5, 0x99F8},{0x54A8, 0x99FC},{0x54A9, 0xED76}, - {0x54AB, 0x9A40},{0x54AC, 0x99F9},{0x54AF, 0x9A5D},{0x54B2, 0x8DE7},{0x54B3, 0x8A50},{0x54B8, 0x99F7},{0x54BC, 0x9A44},{0x54BD, 0x88F4}, - {0x54BE, 0x9A43},{0x54C0, 0x88A3},{0x54C1, 0x9569},{0x54C2, 0x9A41},{0x54C4, 0x99FA},{0x54C7, 0x99F5},{0x54C8, 0x99FB},{0x54C9, 0x8DC6}, - {0x54D8, 0x9A45},{0x54E1, 0x88F5},{0x54E2, 0x9A4E},{0x54E5, 0x9A46},{0x54E6, 0x9A47},{0x54E8, 0x8FA3},{0x54E9, 0x9689},{0x54ED, 0x9A4C}, - {0x54EE, 0x9A4B},{0x54F2, 0x934E},{0x54FA, 0x9A4D},{0x54FD, 0x9A4A},{0x54FF, 0xED77},{0x5504, 0x8953},{0x5506, 0x8DB4},{0x5507, 0x904F}, - {0x550F, 0x9A48},{0x5510, 0x9382},{0x5514, 0x9A49},{0x5516, 0x88A0},{0x552E, 0x9A53},{0x552F, 0x9742},{0x5531, 0x8FA5},{0x5533, 0x9A59}, - {0x5538, 0x9A58},{0x5539, 0x9A4F},{0x553E, 0x91C1},{0x5540, 0x9A50},{0x5544, 0x91ED},{0x5545, 0x9A55},{0x5546, 0x8FA4},{0x554C, 0x9A52}, - {0x554F, 0x96E2},{0x5553, 0x8C5B},{0x5556, 0x9A56},{0x5557, 0x9A57},{0x555C, 0x9A54},{0x555D, 0x9A5A},{0x5563, 0x9A51},{0x557B, 0x9A60}, - {0x557C, 0x9A65},{0x557E, 0x9A61},{0x5580, 0x9A5C},{0x5583, 0x9A66},{0x5584, 0x9150},{0x5586, 0xED78},{0x5587, 0x9A68},{0x5589, 0x8D41}, - {0x558A, 0x9A5E},{0x558B, 0x929D},{0x5598, 0x9A62},{0x5599, 0x9A5B},{0x559A, 0x8AAB},{0x559C, 0x8AEC},{0x559D, 0x8A85},{0x559E, 0x9A63}, - {0x559F, 0x9A5F},{0x55A7, 0x8C96},{0x55A8, 0x9A69},{0x55A9, 0x9A67},{0x55AA, 0x9172},{0x55AB, 0x8B69},{0x55AC, 0x8BAA},{0x55AE, 0x9A64}, - {0x55B0, 0x8BF2},{0x55B6, 0x8963},{0x55C4, 0x9A6D},{0x55C5, 0x9A6B},{0x55C7, 0x9AA5},{0x55D4, 0x9A70},{0x55DA, 0x9A6A},{0x55DC, 0x9A6E}, - {0x55DF, 0x9A6C},{0x55E3, 0x8E6B},{0x55E4, 0x9A6F},{0x55F7, 0x9A72},{0x55F9, 0x9A77},{0x55FD, 0x9A75},{0x55FE, 0x9A74},{0x5606, 0x9251}, - {0x5609, 0x89C3},{0x5614, 0x9A71},{0x5616, 0x9A73},{0x5617, 0x8FA6},{0x5618, 0x8952},{0x561B, 0x9A76},{0x5629, 0x89DC},{0x562F, 0x9A82}, - {0x5631, 0x8FFA},{0x5632, 0x9A7D},{0x5634, 0x9A7B},{0x5636, 0x9A7C},{0x5638, 0x9A7E},{0x5642, 0x895C},{0x564C, 0x9158},{0x564E, 0x9A78}, - {0x5650, 0x9A79},{0x565B, 0x8A9A},{0x5664, 0x9A81},{0x5668, 0x8AED},{0x566A, 0x9A84},{0x566B, 0x9A80},{0x566C, 0x9A83},{0x5674, 0x95AC}, - {0x5678, 0x93D3},{0x567A, 0x94B6},{0x5680, 0x9A86},{0x5686, 0x9A85},{0x5687, 0x8A64},{0x568A, 0x9A87},{0x568F, 0x9A8A},{0x5694, 0x9A89}, - {0x56A0, 0x9A88},{0x56A2, 0x9458},{0x56A5, 0x9A8B},{0x56AE, 0x9A8C},{0x56B4, 0x9A8E},{0x56B6, 0x9A8D},{0x56BC, 0x9A90},{0x56C0, 0x9A93}, - {0x56C1, 0x9A91},{0x56C2, 0x9A8F},{0x56C3, 0x9A92},{0x56C8, 0x9A94},{0x56CE, 0x9A95},{0x56D1, 0x9A96},{0x56D3, 0x9A97},{0x56D7, 0x9A98}, - {0x56D8, 0x9964},{0x56DA, 0x8EFA},{0x56DB, 0x8E6C},{0x56DE, 0x89F1},{0x56E0, 0x88F6},{0x56E3, 0x9263},{0x56EE, 0x9A99},{0x56F0, 0x8DA2}, - {0x56F2, 0x88CD},{0x56F3, 0x907D},{0x56F9, 0x9A9A},{0x56FA, 0x8CC5},{0x56FD, 0x8D91},{0x56FF, 0x9A9C},{0x5700, 0x9A9B},{0x5703, 0x95DE}, - {0x5704, 0x9A9D},{0x5708, 0x9A9F},{0x5709, 0x9A9E},{0x570B, 0x9AA0},{0x570D, 0x9AA1},{0x570F, 0x8C97},{0x5712, 0x8980},{0x5713, 0x9AA2}, - {0x5716, 0x9AA4},{0x5718, 0x9AA3},{0x571C, 0x9AA6},{0x571F, 0x9379},{0x5726, 0x9AA7},{0x5727, 0x88B3},{0x5728, 0x8DDD},{0x572D, 0x8C5C}, - {0x5730, 0x926E},{0x5737, 0x9AA8},{0x5738, 0x9AA9},{0x573B, 0x9AAB},{0x5740, 0x9AAC},{0x5742, 0x8DE2},{0x5747, 0x8BCF},{0x574A, 0x9656}, - {0x574E, 0x9AAA},{0x574F, 0x9AAD},{0x5750, 0x8DBF},{0x5751, 0x8D42},{0x5759, 0xED79},{0x5761, 0x9AB1},{0x5764, 0x8DA3},{0x5765, 0xED7A}, - {0x5766, 0x9252},{0x5769, 0x9AAE},{0x576A, 0x92D8},{0x577F, 0x9AB2},{0x5782, 0x9082},{0x5788, 0x9AB0},{0x5789, 0x9AB3},{0x578B, 0x8C5E}, - {0x5793, 0x9AB4},{0x57A0, 0x9AB5},{0x57A2, 0x8D43},{0x57A3, 0x8A5F},{0x57A4, 0x9AB7},{0x57AA, 0x9AB8},{0x57AC, 0xED7B},{0x57B0, 0x9AB9}, - {0x57B3, 0x9AB6},{0x57C0, 0x9AAF},{0x57C3, 0x9ABA},{0x57C6, 0x9ABB},{0x57C7, 0xED7D},{0x57C8, 0xED7C},{0x57CB, 0x9684},{0x57CE, 0x8FE9}, - {0x57D2, 0x9ABD},{0x57D3, 0x9ABE},{0x57D4, 0x9ABC},{0x57D6, 0x9AC0},{0x57DC, 0x9457},{0x57DF, 0x88E6},{0x57E0, 0x9575},{0x57E3, 0x9AC1}, - {0x57F4, 0x8FFB},{0x57F7, 0x8EB7},{0x57F9, 0x947C},{0x57FA, 0x8AEE},{0x57FC, 0x8DE9},{0x5800, 0x9678},{0x5802, 0x93B0},{0x5805, 0x8C98}, - {0x5806, 0x91CD},{0x580A, 0x9ABF},{0x580B, 0x9AC2},{0x5815, 0x91C2},{0x5819, 0x9AC3},{0x581D, 0x9AC4},{0x5821, 0x9AC6},{0x5824, 0x92E7}, - {0x582A, 0x8AAC},{0x582F, 0xEA9F},{0x5830, 0x8981},{0x5831, 0x95F1},{0x5834, 0x8FEA},{0x5835, 0x9367},{0x583A, 0x8DE4},{0x583D, 0x9ACC}, - {0x5840, 0x95BB},{0x5841, 0x97DB},{0x584A, 0x89F2},{0x584B, 0x9AC8},{0x5851, 0x9159},{0x5852, 0x9ACB},{0x5854, 0x9383},{0x5857, 0x9368}, - {0x5858, 0x9384},{0x5859, 0x94B7},{0x585A, 0x92CB},{0x585E, 0x8DC7},{0x5862, 0x9AC7},{0x5869, 0x8996},{0x586B, 0x9355},{0x5870, 0x9AC9}, - {0x5872, 0x9AC5},{0x5875, 0x906F},{0x5879, 0x9ACD},{0x587E, 0x8F6D},{0x5883, 0x8BAB},{0x5885, 0x9ACE},{0x5893, 0x95E6},{0x5897, 0x919D}, - {0x589C, 0x92C4},{0x589E, 0xED81},{0x589F, 0x9AD0},{0x58A8, 0x966E},{0x58AB, 0x9AD1},{0x58AE, 0x9AD6},{0x58B2, 0xED82},{0x58B3, 0x95AD}, - {0x58B8, 0x9AD5},{0x58B9, 0x9ACF},{0x58BA, 0x9AD2},{0x58BB, 0x9AD4},{0x58BE, 0x8DA4},{0x58C1, 0x95C7},{0x58C5, 0x9AD7},{0x58C7, 0x9264}, - {0x58CA, 0x89F3},{0x58CC, 0x8FEB},{0x58D1, 0x9AD9},{0x58D3, 0x9AD8},{0x58D5, 0x8D88},{0x58D7, 0x9ADA},{0x58D8, 0x9ADC},{0x58D9, 0x9ADB}, - {0x58DC, 0x9ADE},{0x58DE, 0x9AD3},{0x58DF, 0x9AE0},{0x58E4, 0x9ADF},{0x58E5, 0x9ADD},{0x58EB, 0x8E6D},{0x58EC, 0x9070},{0x58EE, 0x9173}, - {0x58EF, 0x9AE1},{0x58F0, 0x90BA},{0x58F1, 0x88EB},{0x58F2, 0x9484},{0x58F7, 0x92D9},{0x58F9, 0x9AE3},{0x58FA, 0x9AE2},{0x58FB, 0x9AE4}, - {0x58FC, 0x9AE5},{0x58FD, 0x9AE6},{0x5902, 0x9AE7},{0x5909, 0x95CF},{0x590A, 0x9AE8},{0x590B, 0xED83},{0x590F, 0x89C4},{0x5910, 0x9AE9}, - {0x5915, 0x975B},{0x5916, 0x8A4F},{0x5918, 0x99C7},{0x5919, 0x8F67},{0x591A, 0x91BD},{0x591B, 0x9AEA},{0x591C, 0x96E9},{0x5922, 0x96B2}, - {0x5925, 0x9AEC},{0x5927, 0x91E5},{0x5929, 0x9356},{0x592A, 0x91BE},{0x592B, 0x9576},{0x592C, 0x9AED},{0x592D, 0x9AEE},{0x592E, 0x899B}, - {0x5931, 0x8EB8},{0x5932, 0x9AEF},{0x5937, 0x88CE},{0x5938, 0x9AF0},{0x593E, 0x9AF1},{0x5944, 0x8982},{0x5947, 0x8AEF},{0x5948, 0x93DE}, - {0x5949, 0x95F2},{0x594E, 0x9AF5},{0x594F, 0x9174},{0x5950, 0x9AF4},{0x5951, 0x8C5F},{0x5953, 0xED84},{0x5954, 0x967A},{0x5955, 0x9AF3}, - {0x5957, 0x9385},{0x5958, 0x9AF7},{0x595A, 0x9AF6},{0x595B, 0xED85},{0x595D, 0xED86},{0x5960, 0x9AF9},{0x5962, 0x9AF8},{0x5963, 0xED87}, - {0x5965, 0x899C},{0x5967, 0x9AFA},{0x5968, 0x8FA7},{0x5969, 0x9AFC},{0x596A, 0x9244},{0x596C, 0x9AFB},{0x596E, 0x95B1},{0x5973, 0x8F97}, - {0x5974, 0x937A},{0x5978, 0x9B40},{0x597D, 0x8D44},{0x5981, 0x9B41},{0x5982, 0x9440},{0x5983, 0x94DC},{0x5984, 0x96CF},{0x598A, 0x9444}, - {0x598D, 0x9B4A},{0x5993, 0x8B57},{0x5996, 0x9764},{0x5999, 0x96AD},{0x599B, 0x9BAA},{0x599D, 0x9B42},{0x59A3, 0x9B45},{0x59A4, 0xED88}, - {0x59A5, 0x91C3},{0x59A8, 0x9657},{0x59AC, 0x9369},{0x59B2, 0x9B46},{0x59B9, 0x9685},{0x59BA, 0xED89},{0x59BB, 0x8DC8},{0x59BE, 0x8FA8}, - {0x59C6, 0x9B47},{0x59C9, 0x8E6F},{0x59CB, 0x8E6E},{0x59D0, 0x88B7},{0x59D1, 0x8CC6},{0x59D3, 0x90A9},{0x59D4, 0x88CF},{0x59D9, 0x9B4B}, - {0x59DA, 0x9B4C},{0x59DC, 0x9B49},{0x59E5, 0x8957},{0x59E6, 0x8AAD},{0x59E8, 0x9B48},{0x59EA, 0x96C3},{0x59EB, 0x9550},{0x59F6, 0x88A6}, - {0x59FB, 0x88F7},{0x59FF, 0x8E70},{0x5A01, 0x88D0},{0x5A03, 0x88A1},{0x5A09, 0x9B51},{0x5A11, 0x9B4F},{0x5A18, 0x96BA},{0x5A1A, 0x9B52}, - {0x5A1C, 0x9B50},{0x5A1F, 0x9B4E},{0x5A20, 0x9050},{0x5A25, 0x9B4D},{0x5A29, 0x95D8},{0x5A2F, 0x8CE2},{0x5A35, 0x9B56},{0x5A36, 0x9B57}, - {0x5A3C, 0x8FA9},{0x5A40, 0x9B53},{0x5A41, 0x984B},{0x5A46, 0x946B},{0x5A49, 0x9B55},{0x5A5A, 0x8DA5},{0x5A62, 0x9B58},{0x5A66, 0x9577}, - {0x5A6A, 0x9B59},{0x5A6C, 0x9B54},{0x5A7F, 0x96B9},{0x5A92, 0x947D},{0x5A9A, 0x9B5A},{0x5A9B, 0x9551},{0x5ABC, 0x9B5B},{0x5ABD, 0x9B5F}, - {0x5ABE, 0x9B5C},{0x5AC1, 0x89C5},{0x5AC2, 0x9B5E},{0x5AC9, 0x8EB9},{0x5ACB, 0x9B5D},{0x5ACC, 0x8C99},{0x5AD0, 0x9B6B},{0x5AD6, 0x9B64}, - {0x5AD7, 0x9B61},{0x5AE1, 0x9284},{0x5AE3, 0x9B60},{0x5AE6, 0x9B62},{0x5AE9, 0x9B63},{0x5AFA, 0x9B65},{0x5AFB, 0x9B66},{0x5B09, 0x8AF0}, - {0x5B0B, 0x9B68},{0x5B0C, 0x9B67},{0x5B16, 0x9B69},{0x5B22, 0x8FEC},{0x5B2A, 0x9B6C},{0x5B2C, 0x92DA},{0x5B30, 0x8964},{0x5B32, 0x9B6A}, - {0x5B36, 0x9B6D},{0x5B3E, 0x9B6E},{0x5B40, 0x9B71},{0x5B43, 0x9B6F},{0x5B45, 0x9B70},{0x5B50, 0x8E71},{0x5B51, 0x9B72},{0x5B54, 0x8D45}, - {0x5B55, 0x9B73},{0x5B56, 0xED8A},{0x5B57, 0x8E9A},{0x5B58, 0x91B6},{0x5B5A, 0x9B74},{0x5B5B, 0x9B75},{0x5B5C, 0x8E79},{0x5B5D, 0x8D46}, - {0x5B5F, 0x96D0},{0x5B63, 0x8B47},{0x5B64, 0x8CC7},{0x5B65, 0x9B76},{0x5B66, 0x8A77},{0x5B69, 0x9B77},{0x5B6B, 0x91B7},{0x5B70, 0x9B78}, - {0x5B71, 0x9BA1},{0x5B73, 0x9B79},{0x5B75, 0x9B7A},{0x5B78, 0x9B7B},{0x5B7A, 0x9B7D},{0x5B80, 0x9B7E},{0x5B83, 0x9B80},{0x5B85, 0x91EE}, - {0x5B87, 0x8946},{0x5B88, 0x8EE7},{0x5B89, 0x88C0},{0x5B8B, 0x9176},{0x5B8C, 0x8AAE},{0x5B8D, 0x8EB3},{0x5B8F, 0x8D47},{0x5B95, 0x9386}, - {0x5B97, 0x8F40},{0x5B98, 0x8AAF},{0x5B99, 0x9288},{0x5B9A, 0x92E8},{0x5B9B, 0x88B6},{0x5B9C, 0x8B58},{0x5B9D, 0x95F3},{0x5B9F, 0x8EC0}, - {0x5BA2, 0x8B71},{0x5BA3, 0x90E9},{0x5BA4, 0x8EBA},{0x5BA5, 0x9747},{0x5BA6, 0x9B81},{0x5BAE, 0x8B7B},{0x5BB0, 0x8DC9},{0x5BB3, 0x8A51}, - {0x5BB4, 0x8983},{0x5BB5, 0x8FAA},{0x5BB6, 0x89C6},{0x5BB8, 0x9B82},{0x5BB9, 0x9765},{0x5BBF, 0x8F68},{0x5BC0, 0xED8B},{0x5BC2, 0x8EE2}, - {0x5BC3, 0x9B83},{0x5BC4, 0x8AF1},{0x5BC5, 0x93D0},{0x5BC6, 0x96A7},{0x5BC7, 0x9B84},{0x5BC9, 0x9B85},{0x5BCC, 0x9578},{0x5BD0, 0x9B87}, - {0x5BD2, 0x8AA6},{0x5BD3, 0x8BF5},{0x5BD4, 0x9B86},{0x5BD8, 0xED8D},{0x5BDB, 0x8AB0},{0x5BDD, 0x9051},{0x5BDE, 0x9B8B},{0x5BDF, 0x8E40}, - {0x5BE1, 0x89C7},{0x5BE2, 0x9B8A},{0x5BE4, 0x9B88},{0x5BE5, 0x9B8C},{0x5BE6, 0x9B89},{0x5BE7, 0x944A},{0x5BE8, 0x9ECB},{0x5BE9, 0x9052}, - {0x5BEB, 0x9B8D},{0x5BEC, 0xED8E},{0x5BEE, 0x97BE},{0x5BF0, 0x9B8E},{0x5BF3, 0x9B90},{0x5BF5, 0x929E},{0x5BF6, 0x9B8F},{0x5BF8, 0x90A1}, - {0x5BFA, 0x8E9B},{0x5BFE, 0x91CE},{0x5BFF, 0x8EF5},{0x5C01, 0x9595},{0x5C02, 0x90EA},{0x5C04, 0x8ECB},{0x5C05, 0x9B91},{0x5C06, 0x8FAB}, - {0x5C07, 0x9B92},{0x5C08, 0x9B93},{0x5C09, 0x88D1},{0x5C0A, 0x91B8},{0x5C0B, 0x9071},{0x5C0D, 0x9B94},{0x5C0E, 0x93B1},{0x5C0F, 0x8FAC}, - {0x5C11, 0x8FAD},{0x5C13, 0x9B95},{0x5C16, 0x90EB},{0x5C1A, 0x8FAE},{0x5C1E, 0xED8F},{0x5C20, 0x9B96},{0x5C22, 0x9B97},{0x5C24, 0x96DE}, - {0x5C28, 0x9B98},{0x5C2D, 0x8BC4},{0x5C31, 0x8F41},{0x5C38, 0x9B99},{0x5C39, 0x9B9A},{0x5C3A, 0x8EDA},{0x5C3B, 0x904B},{0x5C3C, 0x93F2}, - {0x5C3D, 0x9073},{0x5C3E, 0x94F6},{0x5C3F, 0x9441},{0x5C40, 0x8BC7},{0x5C41, 0x9B9B},{0x5C45, 0x8B8F},{0x5C46, 0x9B9C},{0x5C48, 0x8BFC}, - {0x5C4A, 0x93CD},{0x5C4B, 0x89AE},{0x5C4D, 0x8E72},{0x5C4E, 0x9B9D},{0x5C4F, 0x9BA0},{0x5C50, 0x9B9F},{0x5C51, 0x8BFB},{0x5C53, 0x9B9E}, - {0x5C55, 0x9357},{0x5C5E, 0x91AE},{0x5C60, 0x936A},{0x5C61, 0x8EC6},{0x5C64, 0x9177},{0x5C65, 0x979A},{0x5C6C, 0x9BA2},{0x5C6E, 0x9BA3}, - {0x5C6F, 0x93D4},{0x5C71, 0x8E52},{0x5C76, 0x9BA5},{0x5C79, 0x9BA6},{0x5C8C, 0x9BA7},{0x5C90, 0x8AF2},{0x5C91, 0x9BA8},{0x5C94, 0x9BA9}, - {0x5CA1, 0x89AA},{0x5CA6, 0xED90},{0x5CA8, 0x915A},{0x5CA9, 0x8AE2},{0x5CAB, 0x9BAB},{0x5CAC, 0x96A6},{0x5CB1, 0x91D0},{0x5CB3, 0x8A78}, - {0x5CB6, 0x9BAD},{0x5CB7, 0x9BAF},{0x5CB8, 0x8ADD},{0x5CBA, 0xED91},{0x5CBB, 0x9BAC},{0x5CBC, 0x9BAE},{0x5CBE, 0x9BB1},{0x5CC5, 0x9BB0}, - {0x5CC7, 0x9BB2},{0x5CD9, 0x9BB3},{0x5CE0, 0x93BB},{0x5CE1, 0x8BAC},{0x5CE8, 0x89E3},{0x5CE9, 0x9BB4},{0x5CEA, 0x9BB9},{0x5CED, 0x9BB7}, - {0x5CEF, 0x95F5},{0x5CF0, 0x95F4},{0x5CF5, 0xED92},{0x5CF6, 0x9387},{0x5CFA, 0x9BB6},{0x5CFB, 0x8F73},{0x5CFD, 0x9BB5},{0x5D07, 0x9092}, - {0x5D0B, 0x9BBA},{0x5D0E, 0x8DE8},{0x5D11, 0x9BC0},{0x5D14, 0x9BC1},{0x5D15, 0x9BBB},{0x5D16, 0x8A52},{0x5D17, 0x9BBC},{0x5D18, 0x9BC5}, - {0x5D19, 0x9BC4},{0x5D1A, 0x9BC3},{0x5D1B, 0x9BBF},{0x5D1F, 0x9BBE},{0x5D22, 0x9BC2},{0x5D27, 0xED93},{0x5D29, 0x95F6},{0x5D42, 0xED96}, - {0x5D4B, 0x9BC9},{0x5D4C, 0x9BC6},{0x5D4E, 0x9BC8},{0x5D50, 0x9792},{0x5D52, 0x9BC7},{0x5D53, 0xED94},{0x5D5C, 0x9BBD},{0x5D69, 0x9093}, - {0x5D6C, 0x9BCA},{0x5D6D, 0xED97},{0x5D6F, 0x8DB5},{0x5D73, 0x9BCB},{0x5D76, 0x9BCC},{0x5D82, 0x9BCF},{0x5D84, 0x9BCE},{0x5D87, 0x9BCD}, - {0x5D8B, 0x9388},{0x5D8C, 0x9BB8},{0x5D90, 0x9BD5},{0x5D9D, 0x9BD1},{0x5DA2, 0x9BD0},{0x5DAC, 0x9BD2},{0x5DAE, 0x9BD3},{0x5DB7, 0x9BD6}, - {0x5DB8, 0xED98},{0x5DB9, 0xED99},{0x5DBA, 0x97E4},{0x5DBC, 0x9BD7},{0x5DBD, 0x9BD4},{0x5DC9, 0x9BD8},{0x5DCC, 0x8ADE},{0x5DCD, 0x9BD9}, - {0x5DD0, 0xED9A},{0x5DD2, 0x9BDB},{0x5DD3, 0x9BDA},{0x5DD6, 0x9BDC},{0x5DDB, 0x9BDD},{0x5DDD, 0x90EC},{0x5DDE, 0x8F42},{0x5DE1, 0x8F84}, - {0x5DE3, 0x9183},{0x5DE5, 0x8D48},{0x5DE6, 0x8DB6},{0x5DE7, 0x8D49},{0x5DE8, 0x8B90},{0x5DEB, 0x9BDE},{0x5DEE, 0x8DB7},{0x5DF1, 0x8CC8}, - {0x5DF2, 0x9BDF},{0x5DF3, 0x96A4},{0x5DF4, 0x9462},{0x5DF5, 0x9BE0},{0x5DF7, 0x8D4A},{0x5DFB, 0x8AAA},{0x5DFD, 0x9246},{0x5DFE, 0x8BD0}, - {0x5E02, 0x8E73},{0x5E03, 0x957A},{0x5E06, 0x94BF},{0x5E0B, 0x9BE1},{0x5E0C, 0x8AF3},{0x5E11, 0x9BE4},{0x5E16, 0x929F},{0x5E19, 0x9BE3}, - {0x5E1A, 0x9BE2},{0x5E1B, 0x9BE5},{0x5E1D, 0x92E9},{0x5E25, 0x9083},{0x5E2B, 0x8E74},{0x5E2D, 0x90C8},{0x5E2F, 0x91D1},{0x5E30, 0x8B41}, - {0x5E33, 0x92A0},{0x5E36, 0x9BE6},{0x5E37, 0x9BE7},{0x5E38, 0x8FED},{0x5E3D, 0x9658},{0x5E40, 0x9BEA},{0x5E43, 0x9BE9},{0x5E44, 0x9BE8}, - {0x5E45, 0x959D},{0x5E47, 0x9BF1},{0x5E4C, 0x9679},{0x5E4E, 0x9BEB},{0x5E54, 0x9BED},{0x5E55, 0x968B},{0x5E57, 0x9BEC},{0x5E5F, 0x9BEE}, - {0x5E61, 0x94A6},{0x5E62, 0x9BEF},{0x5E63, 0x95BC},{0x5E64, 0x9BF0},{0x5E72, 0x8AB1},{0x5E73, 0x95BD},{0x5E74, 0x944E},{0x5E75, 0x9BF2}, - {0x5E76, 0x9BF3},{0x5E78, 0x8D4B},{0x5E79, 0x8AB2},{0x5E7A, 0x9BF4},{0x5E7B, 0x8CB6},{0x5E7C, 0x9763},{0x5E7D, 0x9748},{0x5E7E, 0x8AF4}, - {0x5E7F, 0x9BF6},{0x5E81, 0x92A1},{0x5E83, 0x8D4C},{0x5E84, 0x8FAF},{0x5E87, 0x94DD},{0x5E8A, 0x8FB0},{0x5E8F, 0x8F98},{0x5E95, 0x92EA}, - {0x5E96, 0x95F7},{0x5E97, 0x9358},{0x5E9A, 0x8D4D},{0x5E9C, 0x957B},{0x5EA0, 0x9BF7},{0x5EA6, 0x9378},{0x5EA7, 0x8DC0},{0x5EAB, 0x8CC9}, - {0x5EAD, 0x92EB},{0x5EB5, 0x88C1},{0x5EB6, 0x8F8E},{0x5EB7, 0x8D4E},{0x5EB8, 0x9766},{0x5EC1, 0x9BF8},{0x5EC2, 0x9BF9},{0x5EC3, 0x9470}, - {0x5EC8, 0x9BFA},{0x5EC9, 0x97F5},{0x5ECA, 0x984C},{0x5ECF, 0x9BFC},{0x5ED0, 0x9BFB},{0x5ED3, 0x8A66},{0x5ED6, 0x9C40},{0x5EDA, 0x9C43}, - {0x5EDB, 0x9C44},{0x5EDD, 0x9C42},{0x5EDF, 0x955F},{0x5EE0, 0x8FB1},{0x5EE1, 0x9C46},{0x5EE2, 0x9C45},{0x5EE3, 0x9C41},{0x5EE8, 0x9C47}, - {0x5EE9, 0x9C48},{0x5EEC, 0x9C49},{0x5EF0, 0x9C4C},{0x5EF1, 0x9C4A},{0x5EF3, 0x9C4B},{0x5EF4, 0x9C4D},{0x5EF6, 0x8984},{0x5EF7, 0x92EC}, - {0x5EF8, 0x9C4E},{0x5EFA, 0x8C9A},{0x5EFB, 0x89F4},{0x5EFC, 0x9455},{0x5EFE, 0x9C4F},{0x5EFF, 0x93F9},{0x5F01, 0x95D9},{0x5F03, 0x9C50}, - {0x5F04, 0x984D},{0x5F09, 0x9C51},{0x5F0A, 0x95BE},{0x5F0B, 0x9C54},{0x5F0C, 0x989F},{0x5F0D, 0x98AF},{0x5F0F, 0x8EAE},{0x5F10, 0x93F3}, - {0x5F11, 0x9C55},{0x5F13, 0x8B7C},{0x5F14, 0x92A2},{0x5F15, 0x88F8},{0x5F16, 0x9C56},{0x5F17, 0x95A4},{0x5F18, 0x8D4F},{0x5F1B, 0x926F}, - {0x5F1F, 0x92ED},{0x5F21, 0xED9B},{0x5F25, 0x96ED},{0x5F26, 0x8CB7},{0x5F27, 0x8CCA},{0x5F29, 0x9C57},{0x5F2D, 0x9C58},{0x5F2F, 0x9C5E}, - {0x5F31, 0x8EE3},{0x5F34, 0xED9C},{0x5F35, 0x92A3},{0x5F37, 0x8BAD},{0x5F38, 0x9C59},{0x5F3C, 0x954A},{0x5F3E, 0x9265},{0x5F41, 0x9C5A}, - {0x5F45, 0xED4B},{0x5F48, 0x9C5B},{0x5F4A, 0x8BAE},{0x5F4C, 0x9C5C},{0x5F4E, 0x9C5D},{0x5F51, 0x9C5F},{0x5F53, 0x9396},{0x5F56, 0x9C60}, - {0x5F57, 0x9C61},{0x5F59, 0x9C62},{0x5F5C, 0x9C53},{0x5F5D, 0x9C52},{0x5F61, 0x9C63},{0x5F62, 0x8C60},{0x5F66, 0x9546},{0x5F67, 0xED9D}, - {0x5F69, 0x8DCA},{0x5F6A, 0x9556},{0x5F6B, 0x92A4},{0x5F6C, 0x956A},{0x5F6D, 0x9C64},{0x5F70, 0x8FB2},{0x5F71, 0x8965},{0x5F73, 0x9C65}, - {0x5F77, 0x9C66},{0x5F79, 0x96F0},{0x5F7C, 0x94DE},{0x5F7F, 0x9C69},{0x5F80, 0x899D},{0x5F81, 0x90AA},{0x5F82, 0x9C68},{0x5F83, 0x9C67}, - {0x5F84, 0x8C61},{0x5F85, 0x91D2},{0x5F87, 0x9C6D},{0x5F88, 0x9C6B},{0x5F8A, 0x9C6A},{0x5F8B, 0x97A5},{0x5F8C, 0x8CE3},{0x5F90, 0x8F99}, - {0x5F91, 0x9C6C},{0x5F92, 0x936B},{0x5F93, 0x8F5D},{0x5F97, 0x93BE},{0x5F98, 0x9C70},{0x5F99, 0x9C6F},{0x5F9E, 0x9C6E},{0x5FA0, 0x9C71}, - {0x5FA1, 0x8CE4},{0x5FA8, 0x9C72},{0x5FA9, 0x959C},{0x5FAA, 0x8F7A},{0x5FAD, 0x9C73},{0x5FAE, 0x94F7},{0x5FB3, 0x93BF},{0x5FB4, 0x92A5}, - {0x5FB7, 0xED9E},{0x5FB9, 0x934F},{0x5FBC, 0x9C74},{0x5FBD, 0x8B4A},{0x5FC3, 0x9053},{0x5FC5, 0x954B},{0x5FCC, 0x8AF5},{0x5FCD, 0x9445}, - {0x5FD6, 0x9C75},{0x5FD7, 0x8E75},{0x5FD8, 0x9659},{0x5FD9, 0x965A},{0x5FDC, 0x899E},{0x5FDD, 0x9C7A},{0x5FDE, 0xED9F},{0x5FE0, 0x9289}, - {0x5FE4, 0x9C77},{0x5FEB, 0x89F5},{0x5FF0, 0x9CAB},{0x5FF1, 0x9C79},{0x5FF5, 0x944F},{0x5FF8, 0x9C78},{0x5FFB, 0x9C76},{0x5FFD, 0x8D9A}, - {0x5FFF, 0x9C7C},{0x600E, 0x9C83},{0x600F, 0x9C89},{0x6010, 0x9C81},{0x6012, 0x937B},{0x6015, 0x9C86},{0x6016, 0x957C},{0x6019, 0x9C80}, - {0x601B, 0x9C85},{0x601C, 0x97E5},{0x601D, 0x8E76},{0x6020, 0x91D3},{0x6021, 0x9C7D},{0x6025, 0x8B7D},{0x6026, 0x9C88},{0x6027, 0x90AB}, - {0x6028, 0x8985},{0x6029, 0x9C82},{0x602A, 0x89F6},{0x602B, 0x9C87},{0x602F, 0x8BAF},{0x6031, 0x9C84},{0x603A, 0x9C8A},{0x6041, 0x9C8C}, - {0x6042, 0x9C96},{0x6043, 0x9C94},{0x6046, 0x9C91},{0x604A, 0x9C90},{0x604B, 0x97F6},{0x604D, 0x9C92},{0x6050, 0x8BB0},{0x6052, 0x8D50}, - {0x6055, 0x8F9A},{0x6059, 0x9C99},{0x605A, 0x9C8B},{0x605D, 0xEDA0},{0x605F, 0x9C8F},{0x6060, 0x9C7E},{0x6062, 0x89F8},{0x6063, 0x9C93}, - {0x6064, 0x9C95},{0x6065, 0x9270},{0x6068, 0x8DA6},{0x6069, 0x89B6},{0x606A, 0x9C8D},{0x606B, 0x9C98},{0x606C, 0x9C97},{0x606D, 0x8BB1}, - {0x606F, 0x91A7},{0x6070, 0x8A86},{0x6075, 0x8C62},{0x6077, 0x9C8E},{0x6081, 0x9C9A},{0x6083, 0x9C9D},{0x6084, 0x9C9F},{0x6085, 0xEDA1}, - {0x6089, 0x8EBB},{0x608A, 0xEDA2},{0x608B, 0x9CA5},{0x608C, 0x92EE},{0x608D, 0x9C9B},{0x6092, 0x9CA3},{0x6094, 0x89F7},{0x6096, 0x9CA1}, - {0x6097, 0x9CA2},{0x609A, 0x9C9E},{0x609B, 0x9CA0},{0x609F, 0x8CE5},{0x60A0, 0x9749},{0x60A3, 0x8AB3},{0x60A6, 0x8978},{0x60A7, 0x9CA4}, - {0x60A9, 0x9459},{0x60AA, 0x88AB},{0x60B2, 0x94DF},{0x60B3, 0x9C7B},{0x60B4, 0x9CAA},{0x60B5, 0x9CAE},{0x60B6, 0x96E3},{0x60B8, 0x9CA7}, - {0x60BC, 0x9389},{0x60BD, 0x9CAC},{0x60C5, 0x8FEE},{0x60C6, 0x9CAD},{0x60C7, 0x93D5},{0x60D1, 0x9866},{0x60D3, 0x9CA9},{0x60D5, 0xEDA4}, - {0x60D8, 0x9CAF},{0x60DA, 0x8D9B},{0x60DC, 0x90C9},{0x60DE, 0xEDA3},{0x60DF, 0x88D2},{0x60E0, 0x9CA8},{0x60E1, 0x9CA6},{0x60E3, 0x9179}, - {0x60E7, 0x9C9C},{0x60E8, 0x8E53},{0x60F0, 0x91C4},{0x60F1, 0x9CBB},{0x60F2, 0xEDA6},{0x60F3, 0x917A},{0x60F4, 0x9CB6},{0x60F6, 0x9CB3}, - {0x60F7, 0x9CB4},{0x60F9, 0x8EE4},{0x60FA, 0x9CB7},{0x60FB, 0x9CBA},{0x6100, 0x9CB5},{0x6101, 0x8F44},{0x6103, 0x9CB8},{0x6106, 0x9CB2}, - {0x6108, 0x96FA},{0x6109, 0x96F9},{0x610D, 0x9CBC},{0x610E, 0x9CBD},{0x610F, 0x88D3},{0x6111, 0xEDA7},{0x6115, 0x9CB1},{0x611A, 0x8BF0}, - {0x611B, 0x88A4},{0x611F, 0x8AB4},{0x6120, 0xEDA5},{0x6121, 0x9CB9},{0x6127, 0x9CC1},{0x6128, 0x9CC0},{0x612C, 0x9CC5},{0x6130, 0xEDA9}, - {0x6134, 0x9CC6},{0x6137, 0xEDA8},{0x613C, 0x9CC4},{0x613D, 0x9CC7},{0x613E, 0x9CBF},{0x613F, 0x9CC3},{0x6142, 0x9CC8},{0x6144, 0x9CC9}, - {0x6147, 0x9CBE},{0x6148, 0x8E9C},{0x614A, 0x9CC2},{0x614B, 0x91D4},{0x614C, 0x8D51},{0x614D, 0x9CB0},{0x614E, 0x9054},{0x6153, 0x9CD6}, - {0x6155, 0x95E7},{0x6158, 0x9CCC},{0x6159, 0x9CCD},{0x615A, 0x9CCE},{0x615D, 0x9CD5},{0x615F, 0x9CD4},{0x6162, 0x969D},{0x6163, 0x8AB5}, - {0x6165, 0x9CD2},{0x6167, 0x8C64},{0x6168, 0x8A53},{0x616B, 0x9CCF},{0x616E, 0x97B6},{0x616F, 0x9CD1},{0x6170, 0x88D4},{0x6171, 0x9CD3}, - {0x6173, 0x9CCA},{0x6174, 0x9CD0},{0x6175, 0x9CD7},{0x6176, 0x8C63},{0x6177, 0x9CCB},{0x617E, 0x977C},{0x6182, 0x974A},{0x6187, 0x9CDA}, - {0x618A, 0x9CDE},{0x618E, 0x919E},{0x6190, 0x97F7},{0x6191, 0x9CDF},{0x6194, 0x9CDC},{0x6196, 0x9CD9},{0x6198, 0xEDAA},{0x6199, 0x9CD8}, - {0x619A, 0x9CDD},{0x61A4, 0x95AE},{0x61A7, 0x93B2},{0x61A9, 0x8C65},{0x61AB, 0x9CE0},{0x61AC, 0x9CDB},{0x61AE, 0x9CE1},{0x61B2, 0x8C9B}, - {0x61B6, 0x89AF},{0x61BA, 0x9CE9},{0x61BE, 0x8AB6},{0x61C3, 0x9CE7},{0x61C6, 0x9CE8},{0x61C7, 0x8DA7},{0x61C8, 0x9CE6},{0x61C9, 0x9CE4}, - {0x61CA, 0x9CE3},{0x61CB, 0x9CEA},{0x61CC, 0x9CE2},{0x61CD, 0x9CEC},{0x61D0, 0x89F9},{0x61E3, 0x9CEE},{0x61E6, 0x9CED},{0x61F2, 0x92A6}, - {0x61F4, 0x9CF1},{0x61F6, 0x9CEF},{0x61F7, 0x9CE5},{0x61F8, 0x8C9C},{0x61FA, 0x9CF0},{0x61FC, 0x9CF4},{0x61FD, 0x9CF3},{0x61FE, 0x9CF5}, - {0x61FF, 0x9CF2},{0x6200, 0x9CF6},{0x6208, 0x9CF7},{0x6209, 0x9CF8},{0x620A, 0x95E8},{0x620C, 0x9CFA},{0x620D, 0x9CF9},{0x620E, 0x8F5E}, - {0x6210, 0x90AC},{0x6211, 0x89E4},{0x6212, 0x89FA},{0x6213, 0xEDAB},{0x6214, 0x9CFB},{0x6216, 0x88BD},{0x621A, 0x90CA},{0x621B, 0x9CFC}, - {0x621D, 0xE6C1},{0x621E, 0x9D40},{0x621F, 0x8C81},{0x6221, 0x9D41},{0x6226, 0x90ED},{0x622A, 0x9D42},{0x622E, 0x9D43},{0x622F, 0x8B59}, - {0x6230, 0x9D44},{0x6232, 0x9D45},{0x6233, 0x9D46},{0x6234, 0x91D5},{0x6238, 0x8CCB},{0x623B, 0x96DF},{0x623F, 0x965B},{0x6240, 0x8F8A}, - {0x6241, 0x9D47},{0x6247, 0x90EE},{0x6248, 0xE7BB},{0x6249, 0x94E0},{0x624B, 0x8EE8},{0x624D, 0x8DCB},{0x624E, 0x9D48},{0x6253, 0x91C5}, - {0x6255, 0x95A5},{0x6258, 0x91EF},{0x625B, 0x9D4B},{0x625E, 0x9D49},{0x6260, 0x9D4C},{0x6263, 0x9D4A},{0x6268, 0x9D4D},{0x626E, 0x95AF}, - {0x6271, 0x88B5},{0x6276, 0x957D},{0x6279, 0x94E1},{0x627C, 0x9D4E},{0x627E, 0x9D51},{0x627F, 0x8FB3},{0x6280, 0x8B5A},{0x6282, 0x9D4F}, - {0x6283, 0x9D56},{0x6284, 0x8FB4},{0x6289, 0x9D50},{0x628A, 0x9463},{0x6291, 0x977D},{0x6292, 0x9D52},{0x6293, 0x9D53},{0x6294, 0x9D57}, - {0x6295, 0x938A},{0x6296, 0x9D54},{0x6297, 0x8D52},{0x6298, 0x90DC},{0x629B, 0x9D65},{0x629C, 0x94B2},{0x629E, 0x91F0},{0x62A6, 0xEDAC}, - {0x62AB, 0x94E2},{0x62AC, 0x9DAB},{0x62B1, 0x95F8},{0x62B5, 0x92EF},{0x62B9, 0x9695},{0x62BB, 0x9D5A},{0x62BC, 0x899F},{0x62BD, 0x928A}, - {0x62C2, 0x9D63},{0x62C5, 0x9253},{0x62C6, 0x9D5D},{0x62C7, 0x9D64},{0x62C8, 0x9D5F},{0x62C9, 0x9D66},{0x62CA, 0x9D62},{0x62CC, 0x9D61}, - {0x62CD, 0x948F},{0x62CF, 0x9D5B},{0x62D0, 0x89FB},{0x62D1, 0x9D59},{0x62D2, 0x8B91},{0x62D3, 0x91F1},{0x62D4, 0x9D55},{0x62D7, 0x9D58}, - {0x62D8, 0x8D53},{0x62D9, 0x90D9},{0x62DB, 0x8FB5},{0x62DC, 0x9D60},{0x62DD, 0x9471},{0x62E0, 0x8B92},{0x62E1, 0x8A67},{0x62EC, 0x8A87}, - {0x62ED, 0x9040},{0x62EE, 0x9D68},{0x62EF, 0x9D6D},{0x62F1, 0x9D69},{0x62F3, 0x8C9D},{0x62F5, 0x9D6E},{0x62F6, 0x8E41},{0x62F7, 0x8D89}, - {0x62FE, 0x8F45},{0x62FF, 0x9D5C},{0x6301, 0x8E9D},{0x6302, 0x9D6B},{0x6307, 0x8E77},{0x6308, 0x9D6C},{0x6309, 0x88C2},{0x630C, 0x9D67}, - {0x6311, 0x92A7},{0x6319, 0x8B93},{0x631F, 0x8BB2},{0x6327, 0x9D6A},{0x6328, 0x88A5},{0x632B, 0x8DC1},{0x632F, 0x9055},{0x633A, 0x92F0}, - {0x633D, 0x94D2},{0x633E, 0x9D70},{0x633F, 0x917D},{0x6349, 0x91A8},{0x634C, 0x8E4A},{0x634D, 0x9D71},{0x634F, 0x9D73},{0x6350, 0x9D6F}, - {0x6355, 0x95DF},{0x6357, 0x92BB},{0x635C, 0x917B},{0x6367, 0x95F9},{0x6368, 0x8ECC},{0x6369, 0x9D80},{0x636B, 0x9D7E},{0x636E, 0x9098}, - {0x6372, 0x8C9E},{0x6376, 0x9D78},{0x6377, 0x8FB7},{0x637A, 0x93E6},{0x637B, 0x9450},{0x6380, 0x9D76},{0x6383, 0x917C},{0x6388, 0x8EF6}, - {0x6389, 0x9D7B},{0x638C, 0x8FB6},{0x638E, 0x9D75},{0x638F, 0x9D7A},{0x6392, 0x9472},{0x6396, 0x9D74},{0x6398, 0x8C40},{0x639B, 0x8A7C}, - {0x639F, 0x9D7C},{0x63A0, 0x97A9},{0x63A1, 0x8DCC},{0x63A2, 0x9254},{0x63A3, 0x9D79},{0x63A5, 0x90DA},{0x63A7, 0x8D54},{0x63A8, 0x9084}, - {0x63A9, 0x8986},{0x63AA, 0x915B},{0x63AB, 0x9D77},{0x63AC, 0x8B64},{0x63B2, 0x8C66},{0x63B4, 0x92CD},{0x63B5, 0x9D7D},{0x63BB, 0x917E}, - {0x63BE, 0x9D81},{0x63C0, 0x9D83},{0x63C3, 0x91B5},{0x63C4, 0x9D89},{0x63C6, 0x9D84},{0x63C9, 0x9D86},{0x63CF, 0x9560},{0x63D0, 0x92F1}, - {0x63D2, 0x9D87},{0x63D6, 0x974B},{0x63DA, 0x9767},{0x63DB, 0x8AB7},{0x63E1, 0x88AC},{0x63E3, 0x9D85},{0x63E9, 0x9D82},{0x63EE, 0x8AF6}, - {0x63F4, 0x8987},{0x63F5, 0xEDAD},{0x63F6, 0x9D88},{0x63FA, 0x9768},{0x6406, 0x9D8C},{0x640D, 0x91B9},{0x640F, 0x9D93},{0x6413, 0x9D8D}, - {0x6416, 0x9D8A},{0x6417, 0x9D91},{0x641C, 0x9D72},{0x6426, 0x9D8E},{0x6428, 0x9D92},{0x642C, 0x94C0},{0x642D, 0x938B},{0x6434, 0x9D8B}, - {0x6436, 0x9D8F},{0x643A, 0x8C67},{0x643E, 0x8DEF},{0x6442, 0x90DB},{0x644E, 0x9D97},{0x6458, 0x9345},{0x6460, 0xEDAE},{0x6467, 0x9D94}, - {0x6469, 0x9680},{0x646F, 0x9D95},{0x6476, 0x9D96},{0x6478, 0x96CC},{0x647A, 0x90A0},{0x6483, 0x8C82},{0x6488, 0x9D9D},{0x6492, 0x8E54}, - {0x6493, 0x9D9A},{0x6495, 0x9D99},{0x649A, 0x9451},{0x649D, 0xEDAF},{0x649E, 0x93B3},{0x64A4, 0x9350},{0x64A5, 0x9D9B},{0x64A9, 0x9D9C}, - {0x64AB, 0x958F},{0x64AD, 0x9464},{0x64AE, 0x8E42},{0x64B0, 0x90EF},{0x64B2, 0x966F},{0x64B9, 0x8A68},{0x64BB, 0x9DA3},{0x64BC, 0x9D9E}, - {0x64C1, 0x9769},{0x64C2, 0x9DA5},{0x64C5, 0x9DA1},{0x64C7, 0x9DA2},{0x64CD, 0x9180},{0x64CE, 0xEDB0},{0x64D2, 0x9DA0},{0x64D4, 0x9D5E}, - {0x64D8, 0x9DA4},{0x64DA, 0x9D9F},{0x64E0, 0x9DA9},{0x64E1, 0x9DAA},{0x64E2, 0x9346},{0x64E3, 0x9DAC},{0x64E6, 0x8E43},{0x64E7, 0x9DA7}, - {0x64EC, 0x8B5B},{0x64EF, 0x9DAD},{0x64F1, 0x9DA6},{0x64F2, 0x9DB1},{0x64F4, 0x9DB0},{0x64F6, 0x9DAF},{0x64FA, 0x9DB2},{0x64FD, 0x9DB4}, - {0x64FE, 0x8FEF},{0x6500, 0x9DB3},{0x6505, 0x9DB7},{0x6518, 0x9DB5},{0x651C, 0x9DB6},{0x651D, 0x9D90},{0x6523, 0x9DB9},{0x6524, 0x9DB8}, - {0x652A, 0x9D98},{0x652B, 0x9DBA},{0x652C, 0x9DAE},{0x652F, 0x8E78},{0x6534, 0x9DBB},{0x6535, 0x9DBC},{0x6536, 0x9DBE},{0x6537, 0x9DBD}, - {0x6538, 0x9DBF},{0x6539, 0x89FC},{0x653B, 0x8D55},{0x653E, 0x95FA},{0x653F, 0x90AD},{0x6545, 0x8CCC},{0x6548, 0x9DC1},{0x654D, 0x9DC4}, - {0x654E, 0xEDB1},{0x654F, 0x9571},{0x6551, 0x8B7E},{0x6555, 0x9DC3},{0x6556, 0x9DC2},{0x6557, 0x9473},{0x6558, 0x9DC5},{0x6559, 0x8BB3}, - {0x655D, 0x9DC7},{0x655E, 0x9DC6},{0x6562, 0x8AB8},{0x6563, 0x8E55},{0x6566, 0x93D6},{0x656C, 0x8C68},{0x6570, 0x9094},{0x6572, 0x9DC8}, - {0x6574, 0x90AE},{0x6575, 0x9347},{0x6577, 0x957E},{0x6578, 0x9DC9},{0x6582, 0x9DCA},{0x6583, 0x9DCB},{0x6587, 0x95B6},{0x6588, 0x9B7C}, - {0x6589, 0x90C4},{0x658C, 0x956B},{0x658E, 0x8DD6},{0x6590, 0x94E3},{0x6591, 0x94C1},{0x6597, 0x936C},{0x6599, 0x97BF},{0x659B, 0x9DCD}, - {0x659C, 0x8ECE},{0x659F, 0x9DCE},{0x65A1, 0x88B4},{0x65A4, 0x8BD2},{0x65A5, 0x90CB},{0x65A7, 0x9580},{0x65AB, 0x9DCF},{0x65AC, 0x8E61}, - {0x65AD, 0x9266},{0x65AF, 0x8E7A},{0x65B0, 0x9056},{0x65B7, 0x9DD0},{0x65B9, 0x95FB},{0x65BC, 0x8997},{0x65BD, 0x8E7B},{0x65C1, 0x9DD3}, - {0x65C3, 0x9DD1},{0x65C4, 0x9DD4},{0x65C5, 0x97B7},{0x65C6, 0x9DD2},{0x65CB, 0x90F9},{0x65CC, 0x9DD5},{0x65CF, 0x91B0},{0x65D2, 0x9DD6}, - {0x65D7, 0x8AF8},{0x65D9, 0x9DD8},{0x65DB, 0x9DD7},{0x65E0, 0x9DD9},{0x65E1, 0x9DDA},{0x65E2, 0x8AF9},{0x65E5, 0x93FA},{0x65E6, 0x9255}, - {0x65E7, 0x8B8C},{0x65E8, 0x8E7C},{0x65E9, 0x9181},{0x65EC, 0x8F7B},{0x65ED, 0x88AE},{0x65F1, 0x9DDB},{0x65FA, 0x89A0},{0x65FB, 0x9DDF}, - {0x6600, 0xEDB2},{0x6602, 0x8D56},{0x6603, 0x9DDE},{0x6606, 0x8DA9},{0x6607, 0x8FB8},{0x6609, 0xEDB5},{0x660A, 0x9DDD},{0x660C, 0x8FB9}, - {0x660E, 0x96BE},{0x660F, 0x8DA8},{0x6613, 0x88D5},{0x6614, 0x90CC},{0x6615, 0xEDB3},{0x661C, 0x9DE4},{0x661E, 0xEDB7},{0x661F, 0x90AF}, - {0x6620, 0x8966},{0x6624, 0xEDB8},{0x6625, 0x8F74},{0x6627, 0x9686},{0x6628, 0x8DF0},{0x662D, 0x8FBA},{0x662E, 0xEDB6},{0x662F, 0x90A5}, - {0x6631, 0xED47},{0x6634, 0x9DE3},{0x6635, 0x9DE1},{0x6636, 0x9DE2},{0x663B, 0xEDB4},{0x663C, 0x928B},{0x663F, 0x9E45},{0x6641, 0x9DE8}, - {0x6642, 0x8E9E},{0x6643, 0x8D57},{0x6644, 0x9DE6},{0x6649, 0x9DE7},{0x664B, 0x9057},{0x664F, 0x9DE5},{0x6652, 0x8E4E},{0x6657, 0xEDBA}, - {0x6659, 0xEDBB},{0x665D, 0x9DEA},{0x665E, 0x9DE9},{0x665F, 0x9DEE},{0x6662, 0x9DEF},{0x6664, 0x9DEB},{0x6665, 0xEDB9},{0x6666, 0x8A41}, - {0x6667, 0x9DEC},{0x6668, 0x9DED},{0x6669, 0x94D3},{0x666E, 0x9581},{0x666F, 0x8C69},{0x6670, 0x9DF0},{0x6673, 0xEDBD},{0x6674, 0x90B0}, - {0x6676, 0x8FBB},{0x667A, 0x9271},{0x6681, 0x8BC5},{0x6683, 0x9DF1},{0x6684, 0x9DF5},{0x6687, 0x89C9},{0x6688, 0x9DF2},{0x6689, 0x9DF4}, - {0x668E, 0x9DF3},{0x6691, 0x8F8B},{0x6696, 0x9267},{0x6697, 0x88C3},{0x6698, 0x9DF6},{0x6699, 0xEDBE},{0x669D, 0x9DF7},{0x66A0, 0xEDBF}, - {0x66A2, 0x92A8},{0x66A6, 0x97EF},{0x66AB, 0x8E62},{0x66AE, 0x95E9},{0x66B2, 0xEDC0},{0x66B4, 0x965C},{0x66B8, 0x9E41},{0x66B9, 0x9DF9}, - {0x66BC, 0x9DFC},{0x66BE, 0x9DFB},{0x66BF, 0xEDC1},{0x66C1, 0x9DF8},{0x66C4, 0x9E40},{0x66C7, 0x93DC},{0x66C9, 0x9DFA},{0x66D6, 0x9E42}, - {0x66D9, 0x8F8C},{0x66DA, 0x9E43},{0x66DC, 0x976A},{0x66DD, 0x9498},{0x66E0, 0x9E44},{0x66E6, 0x9E46},{0x66E9, 0x9E47},{0x66F0, 0x9E48}, - {0x66F2, 0x8BC8},{0x66F3, 0x8967},{0x66F4, 0x8D58},{0x66F5, 0x9E49},{0x66F7, 0x9E4A},{0x66F8, 0x8F91},{0x66F9, 0x9182},{0x66FA, 0xEDC2}, - {0x66FB, 0xED4A},{0x66FC, 0x99D6},{0x66FD, 0x915D},{0x66FE, 0x915C},{0x66FF, 0x91D6},{0x6700, 0x8DC5},{0x6703, 0x98F0},{0x6708, 0x8C8E}, - {0x6709, 0x974C},{0x670B, 0x95FC},{0x670D, 0x959E},{0x670E, 0xEDC3},{0x670F, 0x9E4B},{0x6714, 0x8DF1},{0x6715, 0x92BD},{0x6716, 0x9E4C}, - {0x6717, 0x984E},{0x671B, 0x965D},{0x671D, 0x92A9},{0x671E, 0x9E4D},{0x671F, 0x8AFA},{0x6726, 0x9E4E},{0x6727, 0x9E4F},{0x6728, 0x96D8}, - {0x672A, 0x96A2},{0x672B, 0x9696},{0x672C, 0x967B},{0x672D, 0x8E44},{0x672E, 0x9E51},{0x6731, 0x8EE9},{0x6734, 0x9670},{0x6736, 0x9E53}, - {0x6737, 0x9E56},{0x6738, 0x9E55},{0x673A, 0x8AF7},{0x673D, 0x8B80},{0x673F, 0x9E52},{0x6741, 0x9E54},{0x6746, 0x9E57},{0x6749, 0x9099}, - {0x674E, 0x979B},{0x674F, 0x88C7},{0x6750, 0x8DDE},{0x6751, 0x91BA},{0x6753, 0x8EDB},{0x6756, 0x8FF1},{0x6759, 0x9E5A},{0x675C, 0x936D}, - {0x675E, 0x9E58},{0x675F, 0x91A9},{0x6760, 0x9E59},{0x6761, 0x8FF0},{0x6762, 0x96DB},{0x6763, 0x9E5B},{0x6764, 0x9E5C},{0x6765, 0x9788}, - {0x6766, 0xEDC5},{0x676A, 0x9E61},{0x676D, 0x8D59},{0x676F, 0x9474},{0x6770, 0x9E5E},{0x6771, 0x938C},{0x6772, 0x9DDC},{0x6773, 0x9DE0}, - {0x6775, 0x8B6E},{0x6777, 0x9466},{0x677C, 0x9E60},{0x677E, 0x8FBC},{0x677F, 0x94C2},{0x6785, 0x9E66},{0x6787, 0x94F8},{0x6789, 0x9E5D}, - {0x678B, 0x9E63},{0x678C, 0x9E62},{0x6790, 0x90CD},{0x6795, 0x968D},{0x6797, 0x97D1},{0x679A, 0x9687},{0x679C, 0x89CA},{0x679D, 0x8E7D}, - {0x67A0, 0x9867},{0x67A1, 0x9E65},{0x67A2, 0x9095},{0x67A6, 0x9E64},{0x67A9, 0x9E5F},{0x67AF, 0x8CCD},{0x67B3, 0x9E6B},{0x67B4, 0x9E69}, - {0x67B6, 0x89CB},{0x67B7, 0x9E67},{0x67B8, 0x9E6D},{0x67B9, 0x9E73},{0x67BB, 0xEDC6},{0x67C0, 0xEDC8},{0x67C1, 0x91C6},{0x67C4, 0x95BF}, - {0x67C6, 0x9E75},{0x67CA, 0x9541},{0x67CE, 0x9E74},{0x67CF, 0x9490},{0x67D0, 0x965E},{0x67D1, 0x8AB9},{0x67D3, 0x90F5},{0x67D4, 0x8F5F}, - {0x67D8, 0x92D1},{0x67DA, 0x974D},{0x67DD, 0x9E70},{0x67DE, 0x9E6F},{0x67E2, 0x9E71},{0x67E4, 0x9E6E},{0x67E7, 0x9E76},{0x67E9, 0x9E6C}, - {0x67EC, 0x9E6A},{0x67EE, 0x9E72},{0x67EF, 0x9E68},{0x67F1, 0x928C},{0x67F3, 0x96F6},{0x67F4, 0x8EC4},{0x67F5, 0x8DF2},{0x67FB, 0x8DB8}, - {0x67FE, 0x968F},{0x67FF, 0x8A60},{0x6801, 0xEDC9},{0x6802, 0x92CC},{0x6803, 0x93C8},{0x6804, 0x8968},{0x6813, 0x90F0},{0x6816, 0x90B2}, - {0x6817, 0x8C49},{0x681E, 0x9E78},{0x6821, 0x8D5A},{0x6822, 0x8A9C},{0x6829, 0x9E7A},{0x682A, 0x8A94},{0x682B, 0x9E81},{0x6832, 0x9E7D}, - {0x6834, 0x90F1},{0x6838, 0x8A6A},{0x6839, 0x8DAA},{0x683C, 0x8A69},{0x683D, 0x8DCD},{0x6840, 0x9E7B},{0x6841, 0x8C85},{0x6842, 0x8C6A}, - {0x6843, 0x938D},{0x6844, 0xEDCA},{0x6846, 0x9E79},{0x6848, 0x88C4},{0x684D, 0x9E7C},{0x684E, 0x9E7E},{0x6850, 0x8BCB},{0x6851, 0x8C4B}, - {0x6852, 0xEDC7},{0x6853, 0x8ABA},{0x6854, 0x8B6A},{0x6859, 0x9E82},{0x685C, 0x8DF7},{0x685D, 0x9691},{0x685F, 0x8E56},{0x6863, 0x9E83}, - {0x6867, 0x954F},{0x6874, 0x9E8F},{0x6876, 0x89B1},{0x6877, 0x9E84},{0x687E, 0x9E95},{0x687F, 0x9E85},{0x6881, 0x97C0},{0x6883, 0x9E8C}, - {0x6885, 0x947E},{0x688D, 0x9E94},{0x688F, 0x9E87},{0x6893, 0x88B2},{0x6894, 0x9E89},{0x6897, 0x8D5B},{0x689B, 0x9E8B},{0x689D, 0x9E8A}, - {0x689F, 0x9E86},{0x68A0, 0x9E91},{0x68A2, 0x8FBD},{0x68A6, 0x9AEB},{0x68A7, 0x8CE6},{0x68A8, 0x979C},{0x68AD, 0x9E88},{0x68AF, 0x92F2}, - {0x68B0, 0x8A42},{0x68B1, 0x8DAB},{0x68B3, 0x9E80},{0x68B5, 0x9E90},{0x68B6, 0x8A81},{0x68B9, 0x9E8E},{0x68BA, 0x9E92},{0x68BC, 0x938E}, - {0x68C4, 0x8AFC},{0x68C6, 0x9EB0},{0x68C8, 0xED48},{0x68C9, 0x96C7},{0x68CA, 0x9E97},{0x68CB, 0x8AFB},{0x68CD, 0x9E9E},{0x68CF, 0xEDCB}, - {0x68D2, 0x965F},{0x68D4, 0x9E9F},{0x68D5, 0x9EA1},{0x68D7, 0x9EA5},{0x68D8, 0x9E99},{0x68DA, 0x9249},{0x68DF, 0x938F},{0x68E0, 0x9EA9}, - {0x68E1, 0x9E9C},{0x68E3, 0x9EA6},{0x68E7, 0x9EA0},{0x68EE, 0x9058},{0x68EF, 0x9EAA},{0x68F2, 0x90B1},{0x68F9, 0x9EA8},{0x68FA, 0x8ABB}, - {0x6900, 0x986F},{0x6901, 0x9E96},{0x6904, 0x9EA4},{0x6905, 0x88D6},{0x6908, 0x9E98},{0x690B, 0x96B8},{0x690C, 0x9E9D},{0x690D, 0x9041}, - {0x690E, 0x92C5},{0x690F, 0x9E93},{0x6912, 0x9EA3},{0x6919, 0x909A},{0x691A, 0x9EAD},{0x691B, 0x8A91},{0x691C, 0x8C9F},{0x6921, 0x9EAF}, - {0x6922, 0x9E9A},{0x6923, 0x9EAE},{0x6925, 0x9EA7},{0x6926, 0x9E9B},{0x6928, 0x9EAB},{0x692A, 0x9EAC},{0x6930, 0x9EBD},{0x6934, 0x93CC}, - {0x6936, 0x9EA2},{0x6939, 0x9EB9},{0x693D, 0x9EBB},{0x693F, 0x92D6},{0x694A, 0x976B},{0x6953, 0x9596},{0x6954, 0x9EB6},{0x6955, 0x91C8}, - {0x6959, 0x9EBC},{0x695A, 0x915E},{0x695C, 0x9EB3},{0x695D, 0x9EC0},{0x695E, 0x9EBF},{0x6960, 0x93ED},{0x6961, 0x9EBE},{0x6962, 0x93E8}, - {0x6968, 0xEDCD},{0x696A, 0x9EC2},{0x696B, 0x9EB5},{0x696D, 0x8BC6},{0x696E, 0x9EB8},{0x696F, 0x8F7C},{0x6973, 0x9480},{0x6974, 0x9EBA}, - {0x6975, 0x8BC9},{0x6977, 0x9EB2},{0x6978, 0x9EB4},{0x6979, 0x9EB1},{0x697C, 0x984F},{0x697D, 0x8A79},{0x697E, 0x9EB7},{0x6981, 0x9EC1}, - {0x6982, 0x8A54},{0x698A, 0x8DE5},{0x698E, 0x897C},{0x6991, 0x9ED2},{0x6994, 0x9850},{0x6995, 0x9ED5},{0x6998, 0xEDCF},{0x699B, 0x9059}, - {0x699C, 0x9ED4},{0x69A0, 0x9ED3},{0x69A7, 0x9ED0},{0x69AE, 0x9EC4},{0x69B1, 0x9EE1},{0x69B2, 0x9EC3},{0x69B4, 0x9ED6},{0x69BB, 0x9ECE}, - {0x69BE, 0x9EC9},{0x69BF, 0x9EC6},{0x69C1, 0x9EC7},{0x69C3, 0x9ECF},{0x69C7, 0xEAA0},{0x69CA, 0x9ECC},{0x69CB, 0x8D5C},{0x69CC, 0x92C6}, - {0x69CD, 0x9184},{0x69CE, 0x9ECA},{0x69D0, 0x9EC5},{0x69D3, 0x9EC8},{0x69D8, 0x976C},{0x69D9, 0x968A},{0x69DD, 0x9ECD},{0x69DE, 0x9ED7}, - {0x69E2, 0xEDD0},{0x69E7, 0x9EDF},{0x69E8, 0x9ED8},{0x69EB, 0x9EE5},{0x69ED, 0x9EE3},{0x69F2, 0x9EDE},{0x69F9, 0x9EDD},{0x69FB, 0x92CE}, - {0x69FD, 0x9185},{0x69FF, 0x9EDB},{0x6A02, 0x9ED9},{0x6A05, 0x9EE0},{0x6A0A, 0x9EE6},{0x6A0B, 0x94F3},{0x6A0C, 0x9EEC},{0x6A12, 0x9EE7}, - {0x6A13, 0x9EEA},{0x6A14, 0x9EE4},{0x6A17, 0x9294},{0x6A19, 0x9557},{0x6A1B, 0x9EDA},{0x6A1E, 0x9EE2},{0x6A1F, 0x8FBE},{0x6A21, 0x96CD}, - {0x6A22, 0x9EF6},{0x6A23, 0x9EE9},{0x6A29, 0x8CA0},{0x6A2A, 0x89A1},{0x6A2B, 0x8A7E},{0x6A2E, 0x9ED1},{0x6A30, 0xEDD1},{0x6A35, 0x8FBF}, - {0x6A36, 0x9EEE},{0x6A38, 0x9EF5},{0x6A39, 0x8EF7},{0x6A3A, 0x8A92},{0x6A3D, 0x924D},{0x6A44, 0x9EEB},{0x6A46, 0xEDD3},{0x6A47, 0x9EF0}, - {0x6A48, 0x9EF4},{0x6A4B, 0x8BB4},{0x6A58, 0x8B6B},{0x6A59, 0x9EF2},{0x6A5F, 0x8B40},{0x6A61, 0x93C9},{0x6A62, 0x9EF1},{0x6A66, 0x9EF3}, - {0x6A6B, 0xEDD2},{0x6A72, 0x9EED},{0x6A73, 0xEDD4},{0x6A78, 0x9EEF},{0x6A7E, 0xEDD5},{0x6A7F, 0x8A80},{0x6A80, 0x9268},{0x6A84, 0x9EFA}, - {0x6A8D, 0x9EF8},{0x6A8E, 0x8CE7},{0x6A90, 0x9EF7},{0x6A97, 0x9F40},{0x6A9C, 0x9E77},{0x6AA0, 0x9EF9},{0x6AA2, 0x9EFB},{0x6AA3, 0x9EFC}, - {0x6AAA, 0x9F4B},{0x6AAC, 0x9F47},{0x6AAE, 0x9E8D},{0x6AB3, 0x9F46},{0x6AB8, 0x9F45},{0x6ABB, 0x9F42},{0x6AC1, 0x9EE8},{0x6AC2, 0x9F44}, - {0x6AC3, 0x9F43},{0x6AD1, 0x9F49},{0x6AD3, 0x9845},{0x6ADA, 0x9F4C},{0x6ADB, 0x8BF9},{0x6ADE, 0x9F48},{0x6ADF, 0x9F4A},{0x6AE2, 0xEDD6}, - {0x6AE4, 0xEDD7},{0x6AE8, 0x94A5},{0x6AEA, 0x9F4D},{0x6AFA, 0x9F51},{0x6AFB, 0x9F4E},{0x6B04, 0x9793},{0x6B05, 0x9F4F},{0x6B0A, 0x9EDC}, - {0x6B12, 0x9F52},{0x6B16, 0x9F53},{0x6B1D, 0x8954},{0x6B1F, 0x9F55},{0x6B20, 0x8C87},{0x6B21, 0x8E9F},{0x6B23, 0x8BD3},{0x6B27, 0x89A2}, - {0x6B32, 0x977E},{0x6B37, 0x9F57},{0x6B38, 0x9F56},{0x6B39, 0x9F59},{0x6B3A, 0x8B5C},{0x6B3D, 0x8BD4},{0x6B3E, 0x8ABC},{0x6B43, 0x9F5C}, - {0x6B47, 0x9F5B},{0x6B49, 0x9F5D},{0x6B4C, 0x89CC},{0x6B4E, 0x9256},{0x6B50, 0x9F5E},{0x6B53, 0x8ABD},{0x6B54, 0x9F60},{0x6B59, 0x9F5F}, - {0x6B5B, 0x9F61},{0x6B5F, 0x9F62},{0x6B61, 0x9F63},{0x6B62, 0x8E7E},{0x6B63, 0x90B3},{0x6B64, 0x8D9F},{0x6B66, 0x9590},{0x6B69, 0x95E0}, - {0x6B6A, 0x9863},{0x6B6F, 0x8E95},{0x6B73, 0x8DCE},{0x6B74, 0x97F0},{0x6B78, 0x9F64},{0x6B79, 0x9F65},{0x6B7B, 0x8E80},{0x6B7F, 0x9F66}, - {0x6B80, 0x9F67},{0x6B83, 0x9F69},{0x6B84, 0x9F68},{0x6B86, 0x9677},{0x6B89, 0x8F7D},{0x6B8A, 0x8EEA},{0x6B8B, 0x8E63},{0x6B8D, 0x9F6A}, - {0x6B95, 0x9F6C},{0x6B96, 0x9042},{0x6B98, 0x9F6B},{0x6B9E, 0x9F6D},{0x6BA4, 0x9F6E},{0x6BAA, 0x9F6F},{0x6BAB, 0x9F70},{0x6BAF, 0x9F71}, - {0x6BB1, 0x9F73},{0x6BB2, 0x9F72},{0x6BB3, 0x9F74},{0x6BB4, 0x89A3},{0x6BB5, 0x9269},{0x6BB7, 0x9F75},{0x6BBA, 0x8E45},{0x6BBB, 0x8A6B}, - {0x6BBC, 0x9F76},{0x6BBF, 0x9361},{0x6BC0, 0x9ACA},{0x6BC5, 0x8B42},{0x6BC6, 0x9F77},{0x6BCB, 0x9F78},{0x6BCD, 0x95EA},{0x6BCE, 0x9688}, - {0x6BD2, 0x93C5},{0x6BD3, 0x9F79},{0x6BD4, 0x94E4},{0x6BD6, 0xEDD8},{0x6BD8, 0x94F9},{0x6BDB, 0x96D1},{0x6BDF, 0x9F7A},{0x6BEB, 0x9F7C}, - {0x6BEC, 0x9F7B},{0x6BEF, 0x9F7E},{0x6BF3, 0x9F7D},{0x6C08, 0x9F81},{0x6C0F, 0x8E81},{0x6C11, 0x96AF},{0x6C13, 0x9F82},{0x6C14, 0x9F83}, - {0x6C17, 0x8B43},{0x6C1B, 0x9F84},{0x6C23, 0x9F86},{0x6C24, 0x9F85},{0x6C34, 0x9085},{0x6C37, 0x9558},{0x6C38, 0x8969},{0x6C3E, 0x94C3}, - {0x6C3F, 0xEDD9},{0x6C40, 0x92F3},{0x6C41, 0x8F60},{0x6C42, 0x8B81},{0x6C4E, 0x94C4},{0x6C50, 0x8EAC},{0x6C55, 0x9F88},{0x6C57, 0x8ABE}, - {0x6C5A, 0x8998},{0x6C5C, 0xEDDA},{0x6C5D, 0x93F0},{0x6C5E, 0x9F87},{0x6C5F, 0x8D5D},{0x6C60, 0x9272},{0x6C62, 0x9F89},{0x6C68, 0x9F91}, - {0x6C6A, 0x9F8A},{0x6C6F, 0xEDDC},{0x6C70, 0x91BF},{0x6C72, 0x8B82},{0x6C73, 0x9F92},{0x6C7A, 0x8C88},{0x6C7D, 0x8B44},{0x6C7E, 0x9F90}, - {0x6C81, 0x9F8E},{0x6C82, 0x9F8B},{0x6C83, 0x9780},{0x6C86, 0xEDDB},{0x6C88, 0x92BE},{0x6C8C, 0x93D7},{0x6C8D, 0x9F8C},{0x6C90, 0x9F94}, - {0x6C92, 0x9F93},{0x6C93, 0x8C42},{0x6C96, 0x89AB},{0x6C99, 0x8DB9},{0x6C9A, 0x9F8D},{0x6C9B, 0x9F8F},{0x6CA1, 0x9676},{0x6CA2, 0x91F2}, - {0x6CAB, 0x9697},{0x6CAE, 0x9F9C},{0x6CB1, 0x9F9D},{0x6CB3, 0x89CD},{0x6CB8, 0x95A6},{0x6CB9, 0x96FB},{0x6CBA, 0x9F9F},{0x6CBB, 0x8EA1}, - {0x6CBC, 0x8FC0},{0x6CBD, 0x9F98},{0x6CBE, 0x9F9E},{0x6CBF, 0x8988},{0x6CC1, 0x8BB5},{0x6CC4, 0x9F95},{0x6CC5, 0x9F9A},{0x6CC9, 0x90F2}, - {0x6CCA, 0x9491},{0x6CCC, 0x94E5},{0x6CD3, 0x9F97},{0x6CD5, 0x9640},{0x6CD7, 0x9F99},{0x6CD9, 0x9FA2},{0x6CDA, 0xEDDD},{0x6CDB, 0x9FA0}, - {0x6CDD, 0x9F9B},{0x6CE1, 0x9641},{0x6CE2, 0x9467},{0x6CE3, 0x8B83},{0x6CE5, 0x9344},{0x6CE8, 0x928D},{0x6CEA, 0x9FA3},{0x6CEF, 0x9FA1}, - {0x6CF0, 0x91D7},{0x6CF1, 0x9F96},{0x6CF3, 0x896A},{0x6D04, 0xEDDE},{0x6D0B, 0x976D},{0x6D0C, 0x9FAE},{0x6D12, 0x9FAD},{0x6D17, 0x90F4}, - {0x6D19, 0x9FAA},{0x6D1B, 0x978C},{0x6D1E, 0x93B4},{0x6D1F, 0x9FA4},{0x6D25, 0x92C3},{0x6D29, 0x896B},{0x6D2A, 0x8D5E},{0x6D2B, 0x9FA7}, - {0x6D32, 0x8F46},{0x6D33, 0x9FAC},{0x6D35, 0x9FAB},{0x6D36, 0x9FA6},{0x6D38, 0x9FA9},{0x6D3B, 0x8A88},{0x6D3D, 0x9FA8},{0x6D3E, 0x9468}, - {0x6D41, 0x97AC},{0x6D44, 0x8FF2},{0x6D45, 0x90F3},{0x6D59, 0x9FB4},{0x6D5A, 0x9FB2},{0x6D5C, 0x956C},{0x6D63, 0x9FAF},{0x6D64, 0x9FB1}, - {0x6D66, 0x8959},{0x6D69, 0x8D5F},{0x6D6A, 0x9851},{0x6D6C, 0x8A5C},{0x6D6E, 0x9582},{0x6D6F, 0xEDE0},{0x6D74, 0x9781},{0x6D77, 0x8A43}, - {0x6D78, 0x905A},{0x6D79, 0x9FB3},{0x6D85, 0x9FB8},{0x6D87, 0xEDDF},{0x6D88, 0x8FC1},{0x6D8C, 0x974F},{0x6D8E, 0x9FB5},{0x6D93, 0x9FB0}, - {0x6D95, 0x9FB6},{0x6D96, 0xEDE1},{0x6D99, 0x97DC},{0x6D9B, 0x9393},{0x6D9C, 0x93C0},{0x6DAC, 0xEDE2},{0x6DAF, 0x8A55},{0x6DB2, 0x8974}, - {0x6DB5, 0x9FBC},{0x6DB8, 0x9FBF},{0x6DBC, 0x97C1},{0x6DC0, 0x9784},{0x6DC5, 0x9FC6},{0x6DC6, 0x9FC0},{0x6DC7, 0x9FBD},{0x6DCB, 0x97D2}, - {0x6DCC, 0x9FC3},{0x6DCF, 0xEDE3},{0x6DD1, 0x8F69},{0x6DD2, 0x9FC5},{0x6DD5, 0x9FCA},{0x6DD8, 0x9391},{0x6DD9, 0x9FC8},{0x6DDE, 0x9FC2}, - {0x6DE1, 0x9257},{0x6DE4, 0x9FC9},{0x6DE6, 0x9FBE},{0x6DE8, 0x9FC4},{0x6DEA, 0x9FCB},{0x6DEB, 0x88FA},{0x6DEC, 0x9FC1},{0x6DEE, 0x9FCC}, - {0x6DF1, 0x905B},{0x6DF2, 0xEDE5},{0x6DF3, 0x8F7E},{0x6DF5, 0x95A3},{0x6DF7, 0x8DAC},{0x6DF8, 0xEDE4},{0x6DF9, 0x9FB9},{0x6DFA, 0x9FC7}, - {0x6DFB, 0x9359},{0x6DFC, 0xEDE6},{0x6E05, 0x90B4},{0x6E07, 0x8A89},{0x6E08, 0x8DCF},{0x6E09, 0x8FC2},{0x6E0A, 0x9FBB},{0x6E0B, 0x8F61}, - {0x6E13, 0x8C6B},{0x6E15, 0x9FBA},{0x6E19, 0x9FD0},{0x6E1A, 0x8F8D},{0x6E1B, 0x8CB8},{0x6E1D, 0x9FDF},{0x6E1F, 0x9FD9},{0x6E20, 0x8B94}, - {0x6E21, 0x936E},{0x6E23, 0x9FD4},{0x6E24, 0x9FDD},{0x6E25, 0x88AD},{0x6E26, 0x8951},{0x6E27, 0xEDE9},{0x6E29, 0x89B7},{0x6E2B, 0x9FD6}, - {0x6E2C, 0x91AA},{0x6E2D, 0x9FCD},{0x6E2E, 0x9FCF},{0x6E2F, 0x8D60},{0x6E38, 0x9FE0},{0x6E39, 0xEDE7},{0x6E3A, 0x9FDB},{0x6E3C, 0xEDEA}, - {0x6E3E, 0x9FD3},{0x6E43, 0x9FDA},{0x6E4A, 0x96A9},{0x6E4D, 0x9FD8},{0x6E4E, 0x9FDC},{0x6E56, 0x8CCE},{0x6E58, 0x8FC3},{0x6E5B, 0x9258}, - {0x6E5C, 0xEDE8},{0x6E5F, 0x9FD2},{0x6E67, 0x974E},{0x6E6B, 0x9FD5},{0x6E6E, 0x9FCE},{0x6E6F, 0x9392},{0x6E72, 0x9FD1},{0x6E76, 0x9FD7}, - {0x6E7E, 0x9870},{0x6E7F, 0x8EBC},{0x6E80, 0x969E},{0x6E82, 0x9FE1},{0x6E8C, 0x94AC},{0x6E8F, 0x9FED},{0x6E90, 0x8CB9},{0x6E96, 0x8F80}, - {0x6E98, 0x9FE3},{0x6E9C, 0x97AD},{0x6E9D, 0x8D61},{0x6E9F, 0x9FF0},{0x6EA2, 0x88EC},{0x6EA5, 0x9FEE},{0x6EAA, 0x9FE2},{0x6EAF, 0x9FE8}, - {0x6EB2, 0x9FEA},{0x6EB6, 0x976E},{0x6EB7, 0x9FE5},{0x6EBA, 0x934D},{0x6EBD, 0x9FE7},{0x6EBF, 0xEDEB},{0x6EC2, 0x9FEF},{0x6EC4, 0x9FE9}, - {0x6EC5, 0x96C5},{0x6EC9, 0x9FE4},{0x6ECB, 0x8EA0},{0x6ECC, 0x9FFC},{0x6ED1, 0x8A8A},{0x6ED3, 0x9FE6},{0x6ED4, 0x9FEB},{0x6ED5, 0x9FEC}, - {0x6EDD, 0x91EA},{0x6EDE, 0x91D8},{0x6EEC, 0x9FF4},{0x6EEF, 0x9FFA},{0x6EF2, 0x9FF8},{0x6EF4, 0x9348},{0x6EF7, 0xE042},{0x6EF8, 0x9FF5}, - {0x6EFE, 0x9FF6},{0x6EFF, 0x9FDE},{0x6F01, 0x8B99},{0x6F02, 0x9559},{0x6F06, 0x8EBD},{0x6F09, 0x8D97},{0x6F0F, 0x9852},{0x6F11, 0x9FF2}, - {0x6F13, 0xE041},{0x6F14, 0x8989},{0x6F15, 0x9186},{0x6F20, 0x9499},{0x6F22, 0x8ABF},{0x6F23, 0x97F8},{0x6F2B, 0x969F},{0x6F2C, 0x92D0}, - {0x6F31, 0x9FF9},{0x6F32, 0x9FFB},{0x6F38, 0x9151},{0x6F3E, 0xE040},{0x6F3F, 0x9FF7},{0x6F41, 0x9FF1},{0x6F45, 0x8AC1},{0x6F54, 0x8C89}, - {0x6F58, 0xE04E},{0x6F5B, 0xE049},{0x6F5C, 0x90F6},{0x6F5F, 0x8A83},{0x6F64, 0x8F81},{0x6F66, 0xE052},{0x6F6D, 0xE04B},{0x6F6E, 0x92AA}, - {0x6F6F, 0xE048},{0x6F70, 0x92D7},{0x6F74, 0xE06B},{0x6F78, 0xE045},{0x6F7A, 0xE044},{0x6F7C, 0xE04D},{0x6F80, 0xE047},{0x6F81, 0xE046}, - {0x6F82, 0xE04C},{0x6F84, 0x909F},{0x6F86, 0xE043},{0x6F88, 0xEDEC},{0x6F8E, 0xE04F},{0x6F91, 0xE050},{0x6F97, 0x8AC0},{0x6FA1, 0xE055}, - {0x6FA3, 0xE054},{0x6FA4, 0xE056},{0x6FAA, 0xE059},{0x6FB1, 0x9362},{0x6FB3, 0xE053},{0x6FB5, 0xEDED},{0x6FB9, 0xE057},{0x6FC0, 0x8C83}, - {0x6FC1, 0x91F7},{0x6FC2, 0xE051},{0x6FC3, 0x945A},{0x6FC6, 0xE058},{0x6FD4, 0xE05D},{0x6FD5, 0xE05B},{0x6FD8, 0xE05E},{0x6FDB, 0xE061}, - {0x6FDF, 0xE05A},{0x6FE0, 0x8D8A},{0x6FE1, 0x9447},{0x6FE4, 0x9FB7},{0x6FEB, 0x9794},{0x6FEC, 0xE05C},{0x6FEE, 0xE060},{0x6FEF, 0x91F3}, - {0x6FF1, 0xE05F},{0x6FF3, 0xE04A},{0x6FF5, 0xEDEE},{0x6FF6, 0xE889},{0x6FFA, 0xE064},{0x6FFE, 0xE068},{0x7001, 0xE066},{0x7005, 0xEDEF}, - {0x7007, 0xEDF0},{0x7009, 0xE062},{0x700B, 0xE063},{0x700F, 0xE067},{0x7011, 0xE065},{0x7015, 0x956D},{0x7018, 0xE06D},{0x701A, 0xE06A}, - {0x701B, 0xE069},{0x701D, 0xE06C},{0x701E, 0x93D2},{0x701F, 0xE06E},{0x7026, 0x9295},{0x7027, 0x91EB},{0x7028, 0xEDF1},{0x702C, 0x90A3}, - {0x7030, 0xE06F},{0x7032, 0xE071},{0x703E, 0xE070},{0x704C, 0x9FF3},{0x7051, 0xE072},{0x7058, 0x93E5},{0x7063, 0xE073},{0x706B, 0x89CE}, - {0x706F, 0x9394},{0x7070, 0x8A44},{0x7078, 0x8B84},{0x707C, 0x8EDC},{0x707D, 0x8DD0},{0x7085, 0xEDF2},{0x7089, 0x9846},{0x708A, 0x9086}, - {0x708E, 0x898A},{0x7092, 0xE075},{0x7099, 0xE074},{0x70AB, 0xEDF3},{0x70AC, 0xE078},{0x70AD, 0x9259},{0x70AE, 0xE07B},{0x70AF, 0xE076}, - {0x70B3, 0xE07A},{0x70B8, 0xE079},{0x70B9, 0x935F},{0x70BA, 0x88D7},{0x70BB, 0xED46},{0x70C8, 0x97F3},{0x70CB, 0xE07D},{0x70CF, 0x8947}, - {0x70D9, 0xE080},{0x70DD, 0xE07E},{0x70DF, 0xE07C},{0x70F1, 0xE077},{0x70F9, 0x9642},{0x70FD, 0xE082},{0x7104, 0xEDF5},{0x7109, 0xE081}, - {0x710F, 0xEDF4},{0x7114, 0x898B},{0x7119, 0xE084},{0x711A, 0x95B0},{0x711C, 0xE083},{0x7121, 0x96B3},{0x7126, 0x8FC5},{0x7136, 0x9152}, - {0x713C, 0x8FC4},{0x7146, 0xEDF7},{0x7147, 0xEDF8},{0x7149, 0x97F9},{0x714C, 0xE08A},{0x714E, 0x90F7},{0x7155, 0xE086},{0x7156, 0xE08B}, - {0x7159, 0x898C},{0x715C, 0xEDF6},{0x7162, 0xE089},{0x7164, 0x9481},{0x7165, 0xE085},{0x7166, 0xE088},{0x7167, 0x8FC6},{0x7169, 0x94CF}, - {0x716C, 0xE08C},{0x716E, 0x8ECF},{0x717D, 0x90F8},{0x7184, 0xE08F},{0x7188, 0xE087},{0x718A, 0x8C46},{0x718F, 0xE08D},{0x7194, 0x976F}, - {0x7195, 0xE090},{0x7199, 0xEAA4},{0x719F, 0x8F6E},{0x71A8, 0xE091},{0x71AC, 0xE092},{0x71B1, 0x944D},{0x71B9, 0xE094},{0x71BE, 0xE095}, - {0x71C1, 0xEDFA},{0x71C3, 0x9452},{0x71C8, 0x9395},{0x71C9, 0xE097},{0x71CE, 0xE099},{0x71D0, 0x97D3},{0x71D2, 0xE096},{0x71D4, 0xE098}, - {0x71D5, 0x898D},{0x71D7, 0xE093},{0x71DF, 0x9A7A},{0x71E0, 0xE09A},{0x71E5, 0x9187},{0x71E6, 0x8E57},{0x71E7, 0xE09C},{0x71EC, 0xE09B}, - {0x71ED, 0x9043},{0x71EE, 0x99D7},{0x71F5, 0xE09D},{0x71F9, 0xE09F},{0x71FB, 0xE08E},{0x71FC, 0xE09E},{0x71FE, 0xEDFB},{0x71FF, 0xE0A0}, - {0x7206, 0x949A},{0x720D, 0xE0A1},{0x7210, 0xE0A2},{0x721B, 0xE0A3},{0x7228, 0xE0A4},{0x722A, 0x92DC},{0x722C, 0xE0A6},{0x722D, 0xE0A5}, - {0x7230, 0xE0A7},{0x7232, 0xE0A8},{0x7235, 0x8EDD},{0x7236, 0x9583},{0x723A, 0x96EA},{0x723B, 0xE0A9},{0x723C, 0xE0AA},{0x723D, 0x9175}, - {0x723E, 0x8EA2},{0x723F, 0xE0AB},{0x7240, 0xE0AC},{0x7246, 0xE0AD},{0x7247, 0x95D0},{0x7248, 0x94C5},{0x724B, 0xE0AE},{0x724C, 0x9476}, - {0x7252, 0x92AB},{0x7258, 0xE0AF},{0x7259, 0x89E5},{0x725B, 0x8B8D},{0x725D, 0x96C4},{0x725F, 0x96B4},{0x7261, 0x89B2},{0x7262, 0x9853}, - {0x7267, 0x9671},{0x7269, 0x95A8},{0x7272, 0x90B5},{0x7274, 0xE0B0},{0x7279, 0x93C1},{0x727D, 0x8CA1},{0x727E, 0xE0B1},{0x7280, 0x8DD2}, - {0x7281, 0xE0B3},{0x7282, 0xE0B2},{0x7287, 0xE0B4},{0x7292, 0xE0B5},{0x7296, 0xE0B6},{0x72A0, 0x8B5D},{0x72A2, 0xE0B7},{0x72A7, 0xE0B8}, - {0x72AC, 0x8CA2},{0x72AF, 0x94C6},{0x72B1, 0xEDFC},{0x72B2, 0xE0BA},{0x72B6, 0x8FF3},{0x72B9, 0xE0B9},{0x72BE, 0xEE40},{0x72C2, 0x8BB6}, - {0x72C3, 0xE0BB},{0x72C4, 0xE0BD},{0x72C6, 0xE0BC},{0x72CE, 0xE0BE},{0x72D0, 0x8CCF},{0x72D2, 0xE0BF},{0x72D7, 0x8BE7},{0x72D9, 0x915F}, - {0x72DB, 0x8D9D},{0x72E0, 0xE0C1},{0x72E1, 0xE0C2},{0x72E2, 0xE0C0},{0x72E9, 0x8EEB},{0x72EC, 0x93C6},{0x72ED, 0x8BB7},{0x72F7, 0xE0C4}, - {0x72F8, 0x924B},{0x72F9, 0xE0C3},{0x72FC, 0x9854},{0x72FD, 0x9482},{0x730A, 0xE0C7},{0x7316, 0xE0C9},{0x7317, 0xE0C6},{0x731B, 0x96D2}, - {0x731C, 0xE0C8},{0x731D, 0xE0CA},{0x731F, 0x97C2},{0x7324, 0xEE41},{0x7325, 0xE0CE},{0x7329, 0xE0CD},{0x732A, 0x9296},{0x732B, 0x944C}, - {0x732E, 0x8CA3},{0x732F, 0xE0CC},{0x7334, 0xE0CB},{0x7336, 0x9750},{0x7337, 0x9751},{0x733E, 0xE0CF},{0x733F, 0x898E},{0x7344, 0x8D96}, - {0x7345, 0x8E82},{0x734E, 0xE0D0},{0x734F, 0xE0D1},{0x7357, 0xE0D3},{0x7363, 0x8F62},{0x7368, 0xE0D5},{0x736A, 0xE0D4},{0x7370, 0xE0D6}, - {0x7372, 0x8A6C},{0x7375, 0xE0D8},{0x7377, 0xEE43},{0x7378, 0xE0D7},{0x737A, 0xE0DA},{0x737B, 0xE0D9},{0x7384, 0x8CBA},{0x7387, 0x97A6}, - {0x7389, 0x8BCA},{0x738B, 0x89A4},{0x7396, 0x8BE8},{0x73A9, 0x8ADF},{0x73B2, 0x97E6},{0x73B3, 0xE0DC},{0x73BB, 0xE0DE},{0x73BD, 0xEE44}, - {0x73C0, 0xE0DF},{0x73C2, 0x89CF},{0x73C8, 0xE0DB},{0x73C9, 0xEE45},{0x73CA, 0x8E58},{0x73CD, 0x92BF},{0x73CE, 0xE0DD},{0x73D2, 0xEE48}, - {0x73D6, 0xEE46},{0x73DE, 0xE0E2},{0x73E0, 0x8EEC},{0x73E3, 0xEE47},{0x73E5, 0xE0E0},{0x73EA, 0x8C5D},{0x73ED, 0x94C7},{0x73EE, 0xE0E1}, - {0x73F1, 0xE0FC},{0x73F5, 0xEE4A},{0x73F8, 0xE0E7},{0x73FE, 0x8CBB},{0x7403, 0x8B85},{0x7405, 0xE0E4},{0x7406, 0x979D},{0x7407, 0xEE49}, - {0x7409, 0x97AE},{0x7422, 0x91F4},{0x7425, 0xE0E6},{0x7426, 0xEE4B},{0x7429, 0xEE4D},{0x742A, 0xEE4C},{0x742E, 0xEE4E},{0x7432, 0xE0E8}, - {0x7433, 0x97D4},{0x7434, 0x8BD5},{0x7435, 0x94FA},{0x7436, 0x9469},{0x743A, 0xE0E9},{0x743F, 0xE0EB},{0x7441, 0xE0EE},{0x7455, 0xE0EA}, - {0x7459, 0xE0ED},{0x745A, 0x8CE8},{0x745B, 0x896C},{0x745C, 0xE0EF},{0x745E, 0x9090},{0x745F, 0xE0EC},{0x7460, 0x97DA},{0x7462, 0xEE4F}, - {0x7463, 0xE0F2},{0x7464, 0xEAA2},{0x7469, 0xE0F0},{0x746A, 0xE0F3},{0x746F, 0xE0E5},{0x7470, 0xE0F1},{0x7473, 0x8DBA},{0x7476, 0xE0F4}, - {0x747E, 0xE0F5},{0x7483, 0x979E},{0x7489, 0xEE50},{0x748B, 0xE0F6},{0x749E, 0xE0F7},{0x749F, 0xEE51},{0x74A2, 0xE0E3},{0x74A7, 0xE0F8}, - {0x74B0, 0x8AC2},{0x74BD, 0x8EA3},{0x74CA, 0xE0F9},{0x74CF, 0xE0FA},{0x74D4, 0xE0FB},{0x74DC, 0x895A},{0x74E0, 0xE140},{0x74E2, 0x955A}, - {0x74E3, 0xE141},{0x74E6, 0x8AA2},{0x74E7, 0xE142},{0x74E9, 0xE143},{0x74EE, 0xE144},{0x74F0, 0xE146},{0x74F1, 0xE147},{0x74F2, 0xE145}, - {0x74F6, 0x9572},{0x74F7, 0xE149},{0x74F8, 0xE148},{0x7501, 0xEE52},{0x7503, 0xE14B},{0x7504, 0xE14A},{0x7505, 0xE14C},{0x750C, 0xE14D}, - {0x750D, 0xE14F},{0x750E, 0xE14E},{0x7511, 0x8D99},{0x7513, 0xE151},{0x7515, 0xE150},{0x7518, 0x8AC3},{0x751A, 0x9072},{0x751C, 0x935B}, - {0x751E, 0xE152},{0x751F, 0x90B6},{0x7523, 0x8E59},{0x7525, 0x8999},{0x7526, 0xE153},{0x7528, 0x9770},{0x752B, 0x95E1},{0x752C, 0xE154}, - {0x752F, 0xED8C},{0x7530, 0x9363},{0x7531, 0x9752},{0x7532, 0x8D62},{0x7533, 0x905C},{0x7537, 0x926A},{0x7538, 0x99B2},{0x753A, 0x92AC}, - {0x753B, 0x89E6},{0x753C, 0xE155},{0x7544, 0xE156},{0x7546, 0xE15B},{0x7549, 0xE159},{0x754A, 0xE158},{0x754B, 0x9DC0},{0x754C, 0x8A45}, - {0x754D, 0xE157},{0x754F, 0x88D8},{0x7551, 0x94A8},{0x7554, 0x94C8},{0x7559, 0x97AF},{0x755A, 0xE15C},{0x755B, 0xE15A},{0x755C, 0x927B}, - {0x755D, 0x90A4},{0x7560, 0x94A9},{0x7562, 0x954C},{0x7564, 0xE15E},{0x7565, 0x97AA},{0x7566, 0x8C6C},{0x7567, 0xE15F},{0x7569, 0xE15D}, - {0x756A, 0x94D4},{0x756B, 0xE160},{0x756D, 0xE161},{0x756F, 0xEE53},{0x7570, 0x88D9},{0x7573, 0x8FF4},{0x7574, 0xE166},{0x7576, 0xE163}, - {0x7577, 0x93EB},{0x7578, 0xE162},{0x757F, 0x8B45},{0x7582, 0xE169},{0x7586, 0xE164},{0x7587, 0xE165},{0x7589, 0xE168},{0x758A, 0xE167}, - {0x758B, 0x9544},{0x758E, 0x9161},{0x758F, 0x9160},{0x7591, 0x8B5E},{0x7594, 0xE16A},{0x759A, 0xE16B},{0x759D, 0xE16C},{0x75A3, 0xE16E}, - {0x75A5, 0xE16D},{0x75AB, 0x8975},{0x75B1, 0xE176},{0x75B2, 0x94E6},{0x75B3, 0xE170},{0x75B5, 0xE172},{0x75B8, 0xE174},{0x75B9, 0x905D}, - {0x75BC, 0xE175},{0x75BD, 0xE173},{0x75BE, 0x8EBE},{0x75C2, 0xE16F},{0x75C3, 0xE171},{0x75C5, 0x9561},{0x75C7, 0x8FC7},{0x75CA, 0xE178}, - {0x75CD, 0xE177},{0x75D2, 0xE179},{0x75D4, 0x8EA4},{0x75D5, 0x8DAD},{0x75D8, 0x9397},{0x75D9, 0xE17A},{0x75DB, 0x92C9},{0x75DE, 0xE17C}, - {0x75E2, 0x979F},{0x75E3, 0xE17B},{0x75E9, 0x9189},{0x75F0, 0xE182},{0x75F2, 0xE184},{0x75F3, 0xE185},{0x75F4, 0x9273},{0x75FA, 0xE183}, - {0x75FC, 0xE180},{0x75FE, 0xE17D},{0x75FF, 0xE17E},{0x7601, 0xE181},{0x7609, 0xE188},{0x760B, 0xE186},{0x760D, 0xE187},{0x761F, 0xE189}, - {0x7620, 0xE18B},{0x7621, 0xE18C},{0x7622, 0xE18D},{0x7624, 0xE18E},{0x7627, 0xE18A},{0x7630, 0xE190},{0x7634, 0xE18F},{0x763B, 0xE191}, - {0x7642, 0x97C3},{0x7646, 0xE194},{0x7647, 0xE192},{0x7648, 0xE193},{0x764C, 0x8AE0},{0x7652, 0x96FC},{0x7656, 0x95C8},{0x7658, 0xE196}, - {0x765C, 0xE195},{0x7661, 0xE197},{0x7662, 0xE198},{0x7667, 0xE19C},{0x7668, 0xE199},{0x7669, 0xE19A},{0x766A, 0xE19B},{0x766C, 0xE19D}, - {0x7670, 0xE19E},{0x7672, 0xE19F},{0x7676, 0xE1A0},{0x7678, 0xE1A1},{0x767A, 0x94AD},{0x767B, 0x936F},{0x767C, 0xE1A2},{0x767D, 0x9492}, - {0x767E, 0x9553},{0x7680, 0xE1A3},{0x7682, 0xEE54},{0x7683, 0xE1A4},{0x7684, 0x9349},{0x7686, 0x8A46},{0x7687, 0x8D63},{0x7688, 0xE1A5}, - {0x768B, 0xE1A6},{0x768E, 0xE1A7},{0x7690, 0x8E48},{0x7693, 0xE1A9},{0x7696, 0xE1A8},{0x7699, 0xE1AA},{0x769A, 0xE1AB},{0x769B, 0xEE57}, - {0x769C, 0xEE55},{0x769E, 0xEE56},{0x76A6, 0xEE58},{0x76AE, 0x94E7},{0x76B0, 0xE1AC},{0x76B4, 0xE1AD},{0x76B7, 0xEA89},{0x76B8, 0xE1AE}, - {0x76B9, 0xE1AF},{0x76BA, 0xE1B0},{0x76BF, 0x8E4D},{0x76C2, 0xE1B1},{0x76C3, 0x9475},{0x76C6, 0x967E},{0x76C8, 0x896D},{0x76CA, 0x8976}, - {0x76CD, 0xE1B2},{0x76D2, 0xE1B4},{0x76D6, 0xE1B3},{0x76D7, 0x9390},{0x76DB, 0x90B7},{0x76DC, 0x9F58},{0x76DE, 0xE1B5},{0x76DF, 0x96BF}, - {0x76E1, 0xE1B6},{0x76E3, 0x8AC4},{0x76E4, 0x94D5},{0x76E5, 0xE1B7},{0x76E7, 0xE1B8},{0x76EA, 0xE1B9},{0x76EE, 0x96DA},{0x76F2, 0x96D3}, - {0x76F4, 0x92BC},{0x76F8, 0x918A},{0x76FB, 0xE1BB},{0x76FE, 0x8F82},{0x7701, 0x8FC8},{0x7704, 0xE1BE},{0x7707, 0xE1BD},{0x7708, 0xE1BC}, - {0x7709, 0x94FB},{0x770B, 0x8AC5},{0x770C, 0x8CA7},{0x771B, 0xE1C4},{0x771E, 0xE1C1},{0x771F, 0x905E},{0x7720, 0x96B0},{0x7724, 0xE1C0}, - {0x7725, 0xE1C2},{0x7726, 0xE1C3},{0x7729, 0xE1BF},{0x7737, 0xE1C5},{0x7738, 0xE1C6},{0x773A, 0x92AD},{0x773C, 0x8AE1},{0x7740, 0x9285}, - {0x7746, 0xEE5A},{0x7747, 0xE1C7},{0x775A, 0xE1C8},{0x775B, 0xE1CB},{0x7761, 0x9087},{0x7763, 0x93C2},{0x7765, 0xE1CC},{0x7766, 0x9672}, - {0x7768, 0xE1C9},{0x776B, 0xE1CA},{0x7779, 0xE1CF},{0x777E, 0xE1CE},{0x777F, 0xE1CD},{0x778B, 0xE1D1},{0x778E, 0xE1D0},{0x7791, 0xE1D2}, - {0x779E, 0xE1D4},{0x77A0, 0xE1D3},{0x77A5, 0x95CB},{0x77AC, 0x8F75},{0x77AD, 0x97C4},{0x77B0, 0xE1D5},{0x77B3, 0x93B5},{0x77B6, 0xE1D6}, - {0x77B9, 0xE1D7},{0x77BB, 0xE1DB},{0x77BC, 0xE1D9},{0x77BD, 0xE1DA},{0x77BF, 0xE1D8},{0x77C7, 0xE1DC},{0x77CD, 0xE1DD},{0x77D7, 0xE1DE}, - {0x77DA, 0xE1DF},{0x77DB, 0x96B5},{0x77DC, 0xE1E0},{0x77E2, 0x96EE},{0x77E3, 0xE1E1},{0x77E5, 0x926D},{0x77E7, 0x948A},{0x77E9, 0x8BE9}, - {0x77ED, 0x925A},{0x77EE, 0xE1E2},{0x77EF, 0x8BB8},{0x77F3, 0x90CE},{0x77FC, 0xE1E3},{0x7802, 0x8DBB},{0x780C, 0xE1E4},{0x7812, 0xE1E5}, - {0x7814, 0x8CA4},{0x7815, 0x8DD3},{0x7820, 0xE1E7},{0x7821, 0xEE5C},{0x7825, 0x9375},{0x7826, 0x8DD4},{0x7827, 0x8B6D},{0x7832, 0x9643}, - {0x7834, 0x946A},{0x783A, 0x9376},{0x783F, 0x8D7B},{0x7845, 0xE1E9},{0x784E, 0xEE5D},{0x785D, 0x8FC9},{0x7864, 0xEE5E},{0x786B, 0x97B0}, - {0x786C, 0x8D64},{0x786F, 0x8CA5},{0x7872, 0x94A1},{0x7874, 0xE1EB},{0x787A, 0xEE5F},{0x787C, 0xE1ED},{0x7881, 0x8CE9},{0x7886, 0xE1EC}, - {0x7887, 0x92F4},{0x788C, 0xE1EF},{0x788D, 0x8A56},{0x788E, 0xE1EA},{0x7891, 0x94E8},{0x7893, 0x894F},{0x7895, 0x8DEA},{0x7897, 0x9871}, - {0x789A, 0xE1EE},{0x78A3, 0xE1F0},{0x78A7, 0x95C9},{0x78A9, 0x90D7},{0x78AA, 0xE1F2},{0x78AF, 0xE1F3},{0x78B5, 0xE1F1},{0x78BA, 0x8A6D}, - {0x78BC, 0xE1F9},{0x78BE, 0xE1F8},{0x78C1, 0x8EA5},{0x78C5, 0xE1FA},{0x78C6, 0xE1F5},{0x78CA, 0xE1FB},{0x78CB, 0xE1F6},{0x78D0, 0x94D6}, - {0x78D1, 0xE1F4},{0x78D4, 0xE1F7},{0x78DA, 0xE241},{0x78E7, 0xE240},{0x78E8, 0x9681},{0x78EC, 0xE1FC},{0x78EF, 0x88E9},{0x78F4, 0xE243}, - {0x78FD, 0xE242},{0x7901, 0x8FCA},{0x7907, 0xE244},{0x790E, 0x9162},{0x7911, 0xE246},{0x7912, 0xE245},{0x7919, 0xE247},{0x7926, 0xE1E6}, - {0x792A, 0xE1E8},{0x792B, 0xE249},{0x792C, 0xE248},{0x7930, 0xEE60},{0x793A, 0x8EA6},{0x793C, 0x97E7},{0x793E, 0x8ED0},{0x7940, 0xE24A}, - {0x7941, 0x8C56},{0x7947, 0x8B5F},{0x7948, 0x8B46},{0x7949, 0x8E83},{0x7950, 0x9753},{0x7953, 0xE250},{0x7955, 0xE24F},{0x7956, 0x9163}, - {0x7957, 0xE24C},{0x795A, 0xE24E},{0x795D, 0x8F6A},{0x795E, 0x905F},{0x795F, 0xE24D},{0x7960, 0xE24B},{0x7962, 0x9449},{0x7965, 0x8FCB}, - {0x7968, 0x955B},{0x796D, 0x8DD5},{0x7977, 0x9398},{0x797A, 0xE251},{0x797F, 0xE252},{0x7980, 0xE268},{0x7981, 0x8BD6},{0x7984, 0x985C}, - {0x7985, 0x9154},{0x798A, 0xE253},{0x798D, 0x89D0},{0x798E, 0x92F5},{0x798F, 0x959F},{0x7994, 0xEE64},{0x799B, 0xEE66},{0x799D, 0xE254}, - {0x79A6, 0x8B9A},{0x79A7, 0xE255},{0x79AA, 0xE257},{0x79AE, 0xE258},{0x79B0, 0x9448},{0x79B3, 0xE259},{0x79B9, 0xE25A},{0x79BA, 0xE25B}, - {0x79BD, 0x8BD7},{0x79BE, 0x89D1},{0x79BF, 0x93C3},{0x79C0, 0x8F47},{0x79C1, 0x8E84},{0x79C9, 0xE25C},{0x79CB, 0x8F48},{0x79D1, 0x89C8}, - {0x79D2, 0x9562},{0x79D5, 0xE25D},{0x79D8, 0x94E9},{0x79DF, 0x9164},{0x79E1, 0xE260},{0x79E3, 0xE261},{0x79E4, 0x9489},{0x79E6, 0x9060}, - {0x79E7, 0xE25E},{0x79E9, 0x9281},{0x79EC, 0xE25F},{0x79F0, 0x8FCC},{0x79FB, 0x88DA},{0x7A00, 0x8B48},{0x7A08, 0xE262},{0x7A0B, 0x92F6}, - {0x7A0D, 0xE263},{0x7A0E, 0x90C5},{0x7A14, 0x96AB},{0x7A17, 0x9542},{0x7A18, 0xE264},{0x7A19, 0xE265},{0x7A1A, 0x9274},{0x7A1C, 0x97C5}, - {0x7A1F, 0xE267},{0x7A20, 0xE266},{0x7A2E, 0x8EED},{0x7A31, 0xE269},{0x7A32, 0x88EE},{0x7A37, 0xE26C},{0x7A3B, 0xE26A},{0x7A3C, 0x89D2}, - {0x7A3D, 0x8C6D},{0x7A3E, 0xE26B},{0x7A3F, 0x8D65},{0x7A40, 0x8D92},{0x7A42, 0x95E4},{0x7A43, 0xE26D},{0x7A46, 0x9673},{0x7A49, 0xE26F}, - {0x7A4D, 0x90CF},{0x7A4E, 0x896E},{0x7A4F, 0x89B8},{0x7A50, 0x88AA},{0x7A57, 0xE26E},{0x7A61, 0xE270},{0x7A62, 0xE271},{0x7A63, 0x8FF5}, - {0x7A69, 0xE272},{0x7A6B, 0x8A6E},{0x7A70, 0xE274},{0x7A74, 0x8C8A},{0x7A76, 0x8B86},{0x7A79, 0xE275},{0x7A7A, 0x8BF3},{0x7A7D, 0xE276}, - {0x7A7F, 0x90FA},{0x7A81, 0x93CB},{0x7A83, 0x90DE},{0x7A84, 0x8DF3},{0x7A88, 0xE277},{0x7A92, 0x9282},{0x7A93, 0x918B},{0x7A95, 0xE279}, - {0x7A96, 0xE27B},{0x7A97, 0xE278},{0x7A98, 0xE27A},{0x7A9F, 0x8C41},{0x7AA9, 0xE27C},{0x7AAA, 0x8C45},{0x7AAE, 0x8B87},{0x7AAF, 0x9771}, - {0x7AB0, 0xE27E},{0x7AB6, 0xE280},{0x7ABA, 0x894D},{0x7ABF, 0xE283},{0x7AC3, 0x8A96},{0x7AC4, 0xE282},{0x7AC5, 0xE281},{0x7AC7, 0xE285}, - {0x7AC8, 0xE27D},{0x7ACA, 0xE286},{0x7ACB, 0x97A7},{0x7ACD, 0xE287},{0x7ACF, 0xE288},{0x7AD1, 0xEE67},{0x7AD2, 0x9AF2},{0x7AD3, 0xE28A}, - {0x7AD5, 0xE289},{0x7AD9, 0xE28B},{0x7ADA, 0xE28C},{0x7ADC, 0x97B3},{0x7ADD, 0xE28D},{0x7ADF, 0xE8ED},{0x7AE0, 0x8FCD},{0x7AE1, 0xE28E}, - {0x7AE2, 0xE28F},{0x7AE3, 0x8F76},{0x7AE5, 0x93B6},{0x7AE6, 0xE290},{0x7AE7, 0xEE68},{0x7AEA, 0x9247},{0x7AEB, 0xEE6A},{0x7AED, 0xE291}, - {0x7AEF, 0x925B},{0x7AF0, 0xE292},{0x7AF6, 0x8BA3},{0x7AF8, 0x995E},{0x7AF9, 0x927C},{0x7AFA, 0x8EB1},{0x7AFF, 0x8AC6},{0x7B02, 0xE293}, - {0x7B04, 0xE2A0},{0x7B06, 0xE296},{0x7B08, 0x8B88},{0x7B0A, 0xE295},{0x7B0B, 0xE2A2},{0x7B0F, 0xE294},{0x7B11, 0x8FCE},{0x7B18, 0xE298}, - {0x7B19, 0xE299},{0x7B1B, 0x934A},{0x7B1E, 0xE29A},{0x7B20, 0x8A7D},{0x7B25, 0x9079},{0x7B26, 0x9584},{0x7B28, 0xE29C},{0x7B2C, 0x91E6}, - {0x7B33, 0xE297},{0x7B35, 0xE29B},{0x7B36, 0xE29D},{0x7B39, 0x8DF9},{0x7B45, 0xE2A4},{0x7B46, 0x954D},{0x7B48, 0x94A4},{0x7B49, 0x9399}, - {0x7B4B, 0x8BD8},{0x7B4C, 0xE2A3},{0x7B4D, 0xE2A1},{0x7B4F, 0x94B3},{0x7B50, 0xE29E},{0x7B51, 0x927D},{0x7B52, 0x939B},{0x7B54, 0x939A}, - {0x7B56, 0x8DF4},{0x7B5D, 0xE2B6},{0x7B65, 0xE2A6},{0x7B67, 0xE2A8},{0x7B6C, 0xE2AB},{0x7B6E, 0xE2AC},{0x7B70, 0xE2A9},{0x7B71, 0xE2AA}, - {0x7B74, 0xE2A7},{0x7B75, 0xE2A5},{0x7B7A, 0xE29F},{0x7B86, 0x95CD},{0x7B87, 0x89D3},{0x7B8B, 0xE2B3},{0x7B8D, 0xE2B0},{0x7B8F, 0xE2B5}, - {0x7B92, 0xE2B4},{0x7B94, 0x9493},{0x7B95, 0x96A5},{0x7B97, 0x8E5A},{0x7B98, 0xE2AE},{0x7B99, 0xE2B7},{0x7B9A, 0xE2B2},{0x7B9C, 0xE2B1}, - {0x7B9D, 0xE2AD},{0x7B9E, 0xEE6B},{0x7B9F, 0xE2AF},{0x7BA1, 0x8AC7},{0x7BAA, 0x925C},{0x7BAD, 0x90FB},{0x7BB1, 0x94A0},{0x7BB4, 0xE2BC}, - {0x7BB8, 0x94A2},{0x7BC0, 0x90DF},{0x7BC1, 0xE2B9},{0x7BC4, 0x94CD},{0x7BC6, 0xE2BD},{0x7BC7, 0x95D1},{0x7BC9, 0x927A},{0x7BCB, 0xE2B8}, - {0x7BCC, 0xE2BA},{0x7BCF, 0xE2BB},{0x7BDD, 0xE2BE},{0x7BE0, 0x8EC2},{0x7BE4, 0x93C4},{0x7BE5, 0xE2C3},{0x7BE6, 0xE2C2},{0x7BE9, 0xE2BF}, - {0x7BED, 0x9855},{0x7BF3, 0xE2C8},{0x7BF6, 0xE2CC},{0x7BF7, 0xE2C9},{0x7C00, 0xE2C5},{0x7C07, 0xE2C6},{0x7C0D, 0xE2CB},{0x7C11, 0xE2C0}, - {0x7C12, 0x99D3},{0x7C13, 0xE2C7},{0x7C14, 0xE2C1},{0x7C17, 0xE2CA},{0x7C1F, 0xE2D0},{0x7C21, 0x8AC8},{0x7C23, 0xE2CD},{0x7C27, 0xE2CE}, - {0x7C2A, 0xE2CF},{0x7C2B, 0xE2D2},{0x7C37, 0xE2D1},{0x7C38, 0x94F4},{0x7C3D, 0xE2D3},{0x7C3E, 0x97FA},{0x7C3F, 0x95EB},{0x7C40, 0xE2D8}, - {0x7C43, 0xE2D5},{0x7C4C, 0xE2D4},{0x7C4D, 0x90D0},{0x7C4F, 0xE2D7},{0x7C50, 0xE2D9},{0x7C54, 0xE2D6},{0x7C56, 0xE2DD},{0x7C58, 0xE2DA}, - {0x7C5F, 0xE2DB},{0x7C60, 0xE2C4},{0x7C64, 0xE2DC},{0x7C65, 0xE2DE},{0x7C6C, 0xE2DF},{0x7C73, 0x95C4},{0x7C75, 0xE2E0},{0x7C7E, 0x96E0}, - {0x7C81, 0x8BCC},{0x7C82, 0x8C48},{0x7C83, 0xE2E1},{0x7C89, 0x95B2},{0x7C8B, 0x9088},{0x7C8D, 0x96AE},{0x7C90, 0xE2E2},{0x7C92, 0x97B1}, - {0x7C95, 0x9494},{0x7C97, 0x9165},{0x7C98, 0x9453},{0x7C9B, 0x8F6C},{0x7C9F, 0x88BE},{0x7CA1, 0xE2E7},{0x7CA2, 0xE2E5},{0x7CA4, 0xE2E3}, - {0x7CA5, 0x8A9F},{0x7CA7, 0x8FCF},{0x7CA8, 0xE2E8},{0x7CAB, 0xE2E6},{0x7CAD, 0xE2E4},{0x7CAE, 0xE2EC},{0x7CB1, 0xE2EB},{0x7CB2, 0xE2EA}, - {0x7CB3, 0xE2E9},{0x7CB9, 0xE2ED},{0x7CBD, 0xE2EE},{0x7CBE, 0x90B8},{0x7CC0, 0xE2EF},{0x7CC2, 0xE2F1},{0x7CC5, 0xE2F0},{0x7CCA, 0x8CD0}, - {0x7CCE, 0x9157},{0x7CD2, 0xE2F3},{0x7CD6, 0x939C},{0x7CD8, 0xE2F2},{0x7CDC, 0xE2F4},{0x7CDE, 0x95B3},{0x7CDF, 0x918C},{0x7CE0, 0x8D66}, - {0x7CE2, 0xE2F5},{0x7CE7, 0x97C6},{0x7CEF, 0xE2F7},{0x7CF2, 0xE2F8},{0x7CF4, 0xE2F9},{0x7CF6, 0xE2FA},{0x7CF8, 0x8E85},{0x7CFA, 0xE2FB}, - {0x7CFB, 0x8C6E},{0x7CFE, 0x8B8A},{0x7D00, 0x8B49},{0x7D02, 0xE340},{0x7D04, 0x96F1},{0x7D05, 0x8D67},{0x7D06, 0xE2FC},{0x7D0A, 0xE343}, - {0x7D0B, 0x96E4},{0x7D0D, 0x945B},{0x7D10, 0x9552},{0x7D14, 0x8F83},{0x7D15, 0xE342},{0x7D17, 0x8ED1},{0x7D18, 0x8D68},{0x7D19, 0x8E86}, - {0x7D1A, 0x8B89},{0x7D1B, 0x95B4},{0x7D1C, 0xE341},{0x7D20, 0x9166},{0x7D21, 0x9661},{0x7D22, 0x8DF5},{0x7D2B, 0x8E87},{0x7D2C, 0x92DB}, - {0x7D2E, 0xE346},{0x7D2F, 0x97DD},{0x7D30, 0x8DD7},{0x7D32, 0xE347},{0x7D33, 0x9061},{0x7D35, 0xE349},{0x7D39, 0x8FD0},{0x7D3A, 0x8DAE}, - {0x7D3F, 0xE348},{0x7D42, 0x8F49},{0x7D43, 0x8CBC},{0x7D44, 0x9167},{0x7D45, 0xE344},{0x7D46, 0xE34A},{0x7D48, 0xEE6D},{0x7D4B, 0xE345}, - {0x7D4C, 0x8C6F},{0x7D4E, 0xE34D},{0x7D4F, 0xE351},{0x7D50, 0x8C8B},{0x7D56, 0xE34C},{0x7D5B, 0xE355},{0x7D5C, 0xEE6E},{0x7D5E, 0x8D69}, - {0x7D61, 0x978D},{0x7D62, 0x88BA},{0x7D63, 0xE352},{0x7D66, 0x8B8B},{0x7D68, 0xE34F},{0x7D6E, 0xE350},{0x7D71, 0x939D},{0x7D72, 0xE34E}, - {0x7D73, 0xE34B},{0x7D75, 0x8A47},{0x7D76, 0x90E2},{0x7D79, 0x8CA6},{0x7D7D, 0xE357},{0x7D89, 0xE354},{0x7D8F, 0xE356},{0x7D93, 0xE353}, - {0x7D99, 0x8C70},{0x7D9A, 0x91B1},{0x7D9B, 0xE358},{0x7D9C, 0x918E},{0x7D9F, 0xE365},{0x7DA0, 0xEE70},{0x7DA2, 0xE361},{0x7DA3, 0xE35B}, - {0x7DAB, 0xE35F},{0x7DAC, 0x8EF8},{0x7DAD, 0x88DB},{0x7DAE, 0xE35A},{0x7DAF, 0xE362},{0x7DB0, 0xE366},{0x7DB1, 0x8D6A},{0x7DB2, 0x96D4}, - {0x7DB4, 0x92D4},{0x7DB5, 0xE35C},{0x7DB7, 0xEE6F},{0x7DB8, 0xE364},{0x7DBA, 0xE359},{0x7DBB, 0x925D},{0x7DBD, 0xE35E},{0x7DBE, 0x88BB}, - {0x7DBF, 0x96C8},{0x7DC7, 0xE35D},{0x7DCA, 0x8BD9},{0x7DCB, 0x94EA},{0x7DCF, 0x918D},{0x7DD1, 0x97CE},{0x7DD2, 0x8F8F},{0x7DD5, 0xE38E}, - {0x7DD6, 0xEE71},{0x7DD8, 0xE367},{0x7DDA, 0x90FC},{0x7DDC, 0xE363},{0x7DDD, 0xE368},{0x7DDE, 0xE36A},{0x7DE0, 0x92F7},{0x7DE1, 0xE36D}, - {0x7DE4, 0xE369},{0x7DE8, 0x95D2},{0x7DE9, 0x8AC9},{0x7DEC, 0x96C9},{0x7DEF, 0x88DC},{0x7DF2, 0xE36C},{0x7DF4, 0x97FB},{0x7DFB, 0xE36B}, - {0x7E01, 0x898F},{0x7E04, 0x93EA},{0x7E05, 0xE36E},{0x7E09, 0xE375},{0x7E0A, 0xE36F},{0x7E0B, 0xE376},{0x7E12, 0xE372},{0x7E1B, 0x949B}, - {0x7E1E, 0x8EC8},{0x7E1F, 0xE374},{0x7E21, 0xE371},{0x7E22, 0xE377},{0x7E23, 0xE370},{0x7E26, 0x8F63},{0x7E2B, 0x9644},{0x7E2E, 0x8F6B}, - {0x7E31, 0xE373},{0x7E32, 0xE380},{0x7E35, 0xE37B},{0x7E37, 0xE37E},{0x7E39, 0xE37C},{0x7E3A, 0xE381},{0x7E3B, 0xE37A},{0x7E3D, 0xE360}, - {0x7E3E, 0x90D1},{0x7E41, 0x94C9},{0x7E43, 0xE37D},{0x7E46, 0xE378},{0x7E4A, 0x9140},{0x7E4B, 0x8C71},{0x7E4D, 0x8F4A},{0x7E52, 0xEE72}, - {0x7E54, 0x9044},{0x7E55, 0x9155},{0x7E56, 0xE384},{0x7E59, 0xE386},{0x7E5A, 0xE387},{0x7E5D, 0xE383},{0x7E5E, 0xE385},{0x7E66, 0xE379}, - {0x7E67, 0xE382},{0x7E69, 0xE38A},{0x7E6A, 0xE389},{0x7E6D, 0x969A},{0x7E70, 0x8C4A},{0x7E79, 0xE388},{0x7E7B, 0xE38C},{0x7E7C, 0xE38B}, - {0x7E7D, 0xE38F},{0x7E7F, 0xE391},{0x7E82, 0x8E5B},{0x7E83, 0xE38D},{0x7E88, 0xE392},{0x7E89, 0xE393},{0x7E8A, 0xED40},{0x7E8C, 0xE394}, - {0x7E8E, 0xE39A},{0x7E8F, 0x935A},{0x7E90, 0xE396},{0x7E92, 0xE395},{0x7E93, 0xE397},{0x7E94, 0xE398},{0x7E96, 0xE399},{0x7E9B, 0xE39B}, - {0x7E9C, 0xE39C},{0x7F36, 0x8ACA},{0x7F38, 0xE39D},{0x7F3A, 0xE39E},{0x7F45, 0xE39F},{0x7F47, 0xEE73},{0x7F4C, 0xE3A0},{0x7F4D, 0xE3A1}, - {0x7F4E, 0xE3A2},{0x7F50, 0xE3A3},{0x7F51, 0xE3A4},{0x7F54, 0xE3A6},{0x7F55, 0xE3A5},{0x7F58, 0xE3A7},{0x7F5F, 0xE3A8},{0x7F60, 0xE3A9}, - {0x7F67, 0xE3AC},{0x7F68, 0xE3AA},{0x7F69, 0xE3AB},{0x7F6A, 0x8DDF},{0x7F6B, 0x8C72},{0x7F6E, 0x9275},{0x7F70, 0x94B1},{0x7F72, 0x8F90}, - {0x7F75, 0x946C},{0x7F77, 0x94EB},{0x7F78, 0xE3AD},{0x7F79, 0x9CEB},{0x7F82, 0xE3AE},{0x7F83, 0xE3B0},{0x7F85, 0x9785},{0x7F86, 0xE3AF}, - {0x7F87, 0xE3B2},{0x7F88, 0xE3B1},{0x7F8A, 0x9772},{0x7F8C, 0xE3B3},{0x7F8E, 0x94FC},{0x7F94, 0xE3B4},{0x7F9A, 0xE3B7},{0x7F9D, 0xE3B6}, - {0x7F9E, 0xE3B5},{0x7FA1, 0xEE74},{0x7FA3, 0xE3B8},{0x7FA4, 0x8C51},{0x7FA8, 0x9141},{0x7FA9, 0x8B60},{0x7FAE, 0xE3BC},{0x7FAF, 0xE3B9}, - {0x7FB2, 0xE3BA},{0x7FB6, 0xE3BD},{0x7FB8, 0xE3BE},{0x7FB9, 0xE3BB},{0x7FBD, 0x8948},{0x7FC1, 0x89A5},{0x7FC5, 0xE3C0},{0x7FC6, 0xE3C1}, - {0x7FCA, 0xE3C2},{0x7FCC, 0x9782},{0x7FD2, 0x8F4B},{0x7FD4, 0xE3C4},{0x7FD5, 0xE3C3},{0x7FE0, 0x9089},{0x7FE1, 0xE3C5},{0x7FE6, 0xE3C6}, - {0x7FE9, 0xE3C7},{0x7FEB, 0x8AE3},{0x7FF0, 0x8ACB},{0x7FF3, 0xE3C8},{0x7FF9, 0xE3C9},{0x7FFB, 0x967C},{0x7FFC, 0x9783},{0x8000, 0x9773}, - {0x8001, 0x9856},{0x8003, 0x8D6C},{0x8004, 0xE3CC},{0x8005, 0x8ED2},{0x8006, 0xE3CB},{0x800B, 0xE3CD},{0x800C, 0x8EA7},{0x8010, 0x91CF}, - {0x8012, 0xE3CE},{0x8015, 0x8D6B},{0x8017, 0x96D5},{0x8018, 0xE3CF},{0x8019, 0xE3D0},{0x801C, 0xE3D1},{0x8021, 0xE3D2},{0x8028, 0xE3D3}, - {0x8033, 0x8EA8},{0x8036, 0x96EB},{0x803B, 0xE3D5},{0x803D, 0x925E},{0x803F, 0xE3D4},{0x8046, 0xE3D7},{0x804A, 0xE3D6},{0x8052, 0xE3D8}, - {0x8056, 0x90B9},{0x8058, 0xE3D9},{0x805A, 0xE3DA},{0x805E, 0x95B7},{0x805F, 0xE3DB},{0x8061, 0x918F},{0x8062, 0xE3DC},{0x8068, 0xE3DD}, - {0x806F, 0x97FC},{0x8070, 0xE3E0},{0x8072, 0xE3DF},{0x8073, 0xE3DE},{0x8074, 0x92AE},{0x8076, 0xE3E1},{0x8077, 0x9045},{0x8079, 0xE3E2}, - {0x807D, 0xE3E3},{0x807E, 0x9857},{0x807F, 0xE3E4},{0x8084, 0xE3E5},{0x8085, 0xE3E7},{0x8086, 0xE3E6},{0x8087, 0x94A3},{0x8089, 0x93F7}, - {0x808B, 0x985D},{0x808C, 0x94A7},{0x8093, 0xE3E9},{0x8096, 0x8FD1},{0x8098, 0x9549},{0x809A, 0xE3EA},{0x809B, 0xE3E8},{0x809D, 0x8ACC}, - {0x80A1, 0x8CD2},{0x80A2, 0x8E88},{0x80A5, 0x94EC},{0x80A9, 0x8CA8},{0x80AA, 0x9662},{0x80AC, 0xE3ED},{0x80AD, 0xE3EB},{0x80AF, 0x8D6D}, - {0x80B1, 0x8D6E},{0x80B2, 0x88E7},{0x80B4, 0x8DE6},{0x80BA, 0x9478},{0x80C3, 0x88DD},{0x80C4, 0xE3F2},{0x80C6, 0x925F},{0x80CC, 0x9477}, - {0x80CE, 0x91D9},{0x80D6, 0xE3F4},{0x80D9, 0xE3F0},{0x80DA, 0xE3F3},{0x80DB, 0xE3EE},{0x80DD, 0xE3F1},{0x80DE, 0x9645},{0x80E1, 0x8CD3}, - {0x80E4, 0x88FB},{0x80E5, 0xE3EF},{0x80EF, 0xE3F6},{0x80F1, 0xE3F7},{0x80F4, 0x93B7},{0x80F8, 0x8BB9},{0x80FC, 0xE445},{0x80FD, 0x945C}, - {0x8102, 0x8E89},{0x8105, 0x8BBA},{0x8106, 0x90C6},{0x8107, 0x9865},{0x8108, 0x96AC},{0x8109, 0xE3F5},{0x810A, 0x90D2},{0x811A, 0x8B72}, - {0x811B, 0xE3F8},{0x8123, 0xE3FA},{0x8129, 0xE3F9},{0x812F, 0xE3FB},{0x8131, 0x9245},{0x8133, 0x945D},{0x8139, 0x92AF},{0x813E, 0xE442}, - {0x8146, 0xE441},{0x814B, 0xE3FC},{0x814E, 0x9074},{0x8150, 0x9585},{0x8151, 0xE444},{0x8153, 0xE443},{0x8154, 0x8D6F},{0x8155, 0x9872}, - {0x815F, 0xE454},{0x8165, 0xE448},{0x8166, 0xE449},{0x816B, 0x8EEE},{0x816E, 0xE447},{0x8170, 0x8D98},{0x8171, 0xE446},{0x8174, 0xE44A}, - {0x8178, 0x92B0},{0x8179, 0x95A0},{0x817A, 0x9142},{0x817F, 0x91DA},{0x8180, 0xE44E},{0x8182, 0xE44F},{0x8183, 0xE44B},{0x8188, 0xE44C}, - {0x818A, 0xE44D},{0x818F, 0x8D70},{0x8193, 0xE455},{0x8195, 0xE451},{0x819A, 0x9586},{0x819C, 0x968C},{0x819D, 0x9547},{0x81A0, 0xE450}, - {0x81A3, 0xE453},{0x81A4, 0xE452},{0x81A8, 0x9663},{0x81A9, 0xE456},{0x81B0, 0xE457},{0x81B3, 0x9156},{0x81B5, 0xE458},{0x81B8, 0xE45A}, - {0x81BA, 0xE45E},{0x81BD, 0xE45B},{0x81BE, 0xE459},{0x81BF, 0x945E},{0x81C0, 0xE45C},{0x81C2, 0xE45D},{0x81C6, 0x89B0},{0x81C8, 0xE464}, - {0x81C9, 0xE45F},{0x81CD, 0xE460},{0x81D1, 0xE461},{0x81D3, 0x919F},{0x81D8, 0xE463},{0x81D9, 0xE462},{0x81DA, 0xE465},{0x81DF, 0xE466}, - {0x81E0, 0xE467},{0x81E3, 0x9062},{0x81E5, 0x89E7},{0x81E7, 0xE468},{0x81E8, 0x97D5},{0x81EA, 0x8EA9},{0x81ED, 0x8F4C},{0x81F3, 0x8E8A}, - {0x81F4, 0x9276},{0x81FA, 0xE469},{0x81FB, 0xE46A},{0x81FC, 0x8950},{0x81FE, 0xE46B},{0x8201, 0xE46C},{0x8202, 0xE46D},{0x8205, 0xE46E}, - {0x8207, 0xE46F},{0x8208, 0x8BBB},{0x8209, 0x9DA8},{0x820A, 0xE470},{0x820C, 0x90E3},{0x820D, 0xE471},{0x820E, 0x8EC9},{0x8210, 0xE472}, - {0x8212, 0x98AE},{0x8216, 0xE473},{0x8217, 0x95DC},{0x8218, 0x8ADA},{0x821B, 0x9143},{0x821C, 0x8F77},{0x821E, 0x9591},{0x821F, 0x8F4D}, - {0x8229, 0xE474},{0x822A, 0x8D71},{0x822B, 0xE475},{0x822C, 0x94CA},{0x822E, 0xE484},{0x8233, 0xE477},{0x8235, 0x91C7},{0x8236, 0x9495}, - {0x8237, 0x8CBD},{0x8238, 0xE476},{0x8239, 0x9144},{0x8240, 0xE478},{0x8247, 0x92F8},{0x8258, 0xE47A},{0x8259, 0xE479},{0x825A, 0xE47C}, - {0x825D, 0xE47B},{0x825F, 0xE47D},{0x8262, 0xE480},{0x8264, 0xE47E},{0x8266, 0x8ACD},{0x8268, 0xE481},{0x826A, 0xE482},{0x826B, 0xE483}, - {0x826E, 0x8DAF},{0x826F, 0x97C7},{0x8271, 0xE485},{0x8272, 0x9046},{0x8276, 0x8990},{0x8277, 0xE486},{0x8278, 0xE487},{0x827E, 0xE488}, - {0x828B, 0x88F0},{0x828D, 0xE489},{0x8292, 0xE48A},{0x8299, 0x9587},{0x829D, 0x8EC5},{0x829F, 0xE48C},{0x82A5, 0x8A48},{0x82A6, 0x88B0}, - {0x82AB, 0xE48B},{0x82AC, 0xE48E},{0x82AD, 0x946D},{0x82AF, 0x9063},{0x82B1, 0x89D4},{0x82B3, 0x9646},{0x82B8, 0x8C7C},{0x82B9, 0x8BDA}, - {0x82BB, 0xE48D},{0x82BD, 0x89E8},{0x82C5, 0x8AA1},{0x82D1, 0x8991},{0x82D2, 0xE492},{0x82D3, 0x97E8},{0x82D4, 0x91DB},{0x82D7, 0x9563}, - {0x82D9, 0xE49E},{0x82DB, 0x89D5},{0x82DC, 0xE49C},{0x82DE, 0xE49A},{0x82DF, 0xE491},{0x82E1, 0xE48F},{0x82E3, 0xE490},{0x82E5, 0x8EE1}, - {0x82E6, 0x8BEA},{0x82E7, 0x9297},{0x82EB, 0x93CF},{0x82F1, 0x8970},{0x82F3, 0xE494},{0x82F4, 0xE493},{0x82F9, 0xE499},{0x82FA, 0xE495}, - {0x82FB, 0xE498},{0x8301, 0xEE76},{0x8302, 0x96CE},{0x8303, 0xE497},{0x8304, 0x89D6},{0x8305, 0x8A9D},{0x8306, 0xE49B},{0x8309, 0xE49D}, - {0x830E, 0x8C73},{0x8316, 0xE4A1},{0x8317, 0xE4AA},{0x8318, 0xE4AB},{0x831C, 0x88A9},{0x8323, 0xE4B2},{0x8328, 0x88EF},{0x832B, 0xE4A9}, - {0x832F, 0xE4A8},{0x8331, 0xE4A3},{0x8332, 0xE4A2},{0x8334, 0xE4A0},{0x8335, 0xE49F},{0x8336, 0x9283},{0x8338, 0x91F9},{0x8339, 0xE4A5}, - {0x8340, 0xE4A4},{0x8345, 0xE4A7},{0x8349, 0x9190},{0x834A, 0x8C74},{0x834F, 0x8960},{0x8350, 0xE4A6},{0x8352, 0x8D72},{0x8358, 0x9191}, - {0x8362, 0xEE77},{0x8373, 0xE4B8},{0x8375, 0xE4B9},{0x8377, 0x89D7},{0x837B, 0x89AC},{0x837C, 0xE4B6},{0x837F, 0xEE78},{0x8385, 0xE4AC}, - {0x8387, 0xE4B4},{0x8389, 0xE4BB},{0x838A, 0xE4B5},{0x838E, 0xE4B3},{0x8393, 0xE496},{0x8396, 0xE4B1},{0x839A, 0xE4AD},{0x839E, 0x8ACE}, - {0x839F, 0xE4AF},{0x83A0, 0xE4BA},{0x83A2, 0xE4B0},{0x83A8, 0xE4BC},{0x83AA, 0xE4AE},{0x83AB, 0x949C},{0x83B1, 0x9789},{0x83B5, 0xE4B7}, - {0x83BD, 0xE4CD},{0x83C1, 0xE4C5},{0x83C5, 0x909B},{0x83C7, 0xEE79},{0x83CA, 0x8B65},{0x83CC, 0x8BDB},{0x83CE, 0xE4C0},{0x83D3, 0x89D9}, - {0x83D6, 0x8FD2},{0x83D8, 0xE4C3},{0x83DC, 0x8DD8},{0x83DF, 0x9370},{0x83E0, 0xE4C8},{0x83E9, 0x95EC},{0x83EB, 0xE4BF},{0x83EF, 0x89D8}, - {0x83F0, 0x8CD4},{0x83F1, 0x9548},{0x83F2, 0xE4C9},{0x83F4, 0xE4BD},{0x83F6, 0xEE7A},{0x83F7, 0xE4C6},{0x83FB, 0xE4D0},{0x83FD, 0xE4C1}, - {0x8403, 0xE4C2},{0x8404, 0x93B8},{0x8407, 0xE4C7},{0x840B, 0xE4C4},{0x840C, 0x9647},{0x840D, 0xE4CA},{0x840E, 0x88DE},{0x8413, 0xE4BE}, - {0x8420, 0xE4CC},{0x8422, 0xE4CB},{0x8429, 0x948B},{0x842A, 0xE4D2},{0x842C, 0xE4DD},{0x8431, 0x8A9E},{0x8435, 0xE4E0},{0x8438, 0xE4CE}, - {0x843C, 0xE4D3},{0x843D, 0x978E},{0x8446, 0xE4DC},{0x8448, 0xEE7B},{0x8449, 0x9774},{0x844E, 0x97A8},{0x8457, 0x9298},{0x845B, 0x8A8B}, - {0x8461, 0x9592},{0x8462, 0xE4E2},{0x8463, 0x939F},{0x8466, 0x88AF},{0x8469, 0xE4DB},{0x846B, 0xE4D7},{0x846C, 0x9192},{0x846D, 0xE4D1}, - {0x846E, 0xE4D9},{0x846F, 0xE4DE},{0x8471, 0x944B},{0x8475, 0x88A8},{0x8477, 0xE4D6},{0x8479, 0xE4DF},{0x847A, 0x9598},{0x8482, 0xE4DA}, - {0x8484, 0xE4D5},{0x848B, 0x8FD3},{0x8490, 0x8F4E},{0x8494, 0x8EAA},{0x8499, 0x96D6},{0x849C, 0x9566},{0x849F, 0xE4E5},{0x84A1, 0xE4EE}, - {0x84AD, 0xE4D8},{0x84B2, 0x8A97},{0x84B4, 0xEE7C},{0x84B8, 0x8FF6},{0x84B9, 0xE4E3},{0x84BB, 0xE4E8},{0x84BC, 0x9193},{0x84BF, 0xE4E4}, - {0x84C1, 0xE4EB},{0x84C4, 0x927E},{0x84C6, 0xE4EC},{0x84C9, 0x9775},{0x84CA, 0xE4E1},{0x84CB, 0x8A57},{0x84CD, 0xE4E7},{0x84D0, 0xE4EA}, - {0x84D1, 0x96AA},{0x84D6, 0xE4ED},{0x84D9, 0xE4E6},{0x84DA, 0xE4E9},{0x84DC, 0xED44},{0x84EC, 0x9648},{0x84EE, 0x9840},{0x84F4, 0xE4F1}, - {0x84FC, 0xE4F8},{0x84FF, 0xE4F0},{0x8500, 0x8EC1},{0x8506, 0xE4CF},{0x8511, 0x95CC},{0x8513, 0x96A0},{0x8514, 0xE4F7},{0x8515, 0xE4F6}, - {0x8517, 0xE4F2},{0x8518, 0xE4F3},{0x851A, 0x8955},{0x851F, 0xE4F5},{0x8521, 0xE4EF},{0x8526, 0x92D3},{0x852C, 0xE4F4},{0x852D, 0x88FC}, - {0x8535, 0x91A0},{0x853D, 0x95C1},{0x8540, 0xE4F9},{0x8541, 0xE540},{0x8543, 0x94D7},{0x8548, 0xE4FC},{0x8549, 0x8FD4},{0x854A, 0x8EC7}, - {0x854B, 0xE542},{0x854E, 0x8BBC},{0x8553, 0xEE7D},{0x8555, 0xE543},{0x8557, 0x9599},{0x8558, 0xE4FB},{0x8559, 0xEE7E},{0x855A, 0xE4D4}, - {0x8563, 0xE4FA},{0x8568, 0x986E},{0x8569, 0x93A0},{0x856A, 0x9593},{0x856B, 0xEE80},{0x856D, 0xE54A},{0x8577, 0xE550},{0x857E, 0xE551}, - {0x8580, 0xE544},{0x8584, 0x9496},{0x8587, 0xE54E},{0x8588, 0xE546},{0x858A, 0xE548},{0x8590, 0xE552},{0x8591, 0xE547},{0x8594, 0xE54B}, - {0x8597, 0x8992},{0x8599, 0x93E3},{0x859B, 0xE54C},{0x859C, 0xE54F},{0x85A4, 0xE545},{0x85A6, 0x9145},{0x85A8, 0xE549},{0x85A9, 0x8E46}, - {0x85AA, 0x9064},{0x85AB, 0x8C4F},{0x85AC, 0x96F2},{0x85AE, 0x96F7},{0x85AF, 0x8F92},{0x85B0, 0xEE82},{0x85B9, 0xE556},{0x85BA, 0xE554}, - {0x85C1, 0x986D},{0x85C9, 0xE553},{0x85CD, 0x9795},{0x85CF, 0xE555},{0x85D0, 0xE557},{0x85D5, 0xE558},{0x85DC, 0xE55B},{0x85DD, 0xE559}, - {0x85E4, 0x93A1},{0x85E5, 0xE55A},{0x85E9, 0x94CB},{0x85EA, 0xE54D},{0x85F7, 0x8F93},{0x85F9, 0xE55C},{0x85FA, 0xE561},{0x85FB, 0x9194}, - {0x85FE, 0xE560},{0x8602, 0xE541},{0x8606, 0xE562},{0x8607, 0x9168},{0x860A, 0xE55D},{0x860B, 0xE55F},{0x8613, 0xE55E},{0x8616, 0x9F50}, - {0x8617, 0x9F41},{0x861A, 0xE564},{0x8622, 0xE563},{0x862D, 0x9796},{0x862F, 0xE1BA},{0x8630, 0xE565},{0x863F, 0xE566},{0x864D, 0xE567}, - {0x864E, 0x8CD5},{0x8650, 0x8B73},{0x8654, 0xE569},{0x8655, 0x997C},{0x865A, 0x8B95},{0x865C, 0x97B8},{0x865E, 0x8BF1},{0x865F, 0xE56A}, - {0x8667, 0xE56B},{0x866B, 0x928E},{0x8671, 0xE56C},{0x8679, 0x93F8},{0x867B, 0x88B8},{0x868A, 0x89E1},{0x868B, 0xE571},{0x868C, 0xE572}, - {0x8693, 0xE56D},{0x8695, 0x8E5C},{0x86A3, 0xE56E},{0x86A4, 0x9461},{0x86A9, 0xE56F},{0x86AA, 0xE570},{0x86AB, 0xE57A},{0x86AF, 0xE574}, - {0x86B0, 0xE577},{0x86B6, 0xE573},{0x86C4, 0xE575},{0x86C6, 0xE576},{0x86C7, 0x8ED6},{0x86C9, 0xE578},{0x86CB, 0x9260},{0x86CD, 0x8C75}, - {0x86CE, 0x8A61},{0x86D4, 0xE57B},{0x86D9, 0x8A5E},{0x86DB, 0xE581},{0x86DE, 0xE57C},{0x86DF, 0xE580},{0x86E4, 0x94B8},{0x86E9, 0xE57D}, - {0x86EC, 0xE57E},{0x86ED, 0x9567},{0x86EE, 0x94D8},{0x86EF, 0xE582},{0x86F8, 0x91FB},{0x86F9, 0xE58C},{0x86FB, 0xE588},{0x86FE, 0x89E9}, - {0x8700, 0xE586},{0x8702, 0x9649},{0x8703, 0xE587},{0x8706, 0xE584},{0x8708, 0xE585},{0x8709, 0xE58A},{0x870A, 0xE58D},{0x870D, 0xE58B}, - {0x8711, 0xE589},{0x8712, 0xE583},{0x8718, 0x9277},{0x871A, 0xE594},{0x871C, 0x96A8},{0x8725, 0xE592},{0x8729, 0xE593},{0x8734, 0xE58E}, - {0x8737, 0xE590},{0x873B, 0xE591},{0x873F, 0xE58F},{0x8749, 0x90E4},{0x874B, 0x9858},{0x874C, 0xE598},{0x874E, 0xE599},{0x8753, 0xE59F}, - {0x8755, 0x9049},{0x8757, 0xE59B},{0x8759, 0xE59E},{0x875F, 0xE596},{0x8760, 0xE595},{0x8763, 0xE5A0},{0x8766, 0x89DA},{0x8768, 0xE59C}, - {0x876A, 0xE5A1},{0x876E, 0xE59D},{0x8774, 0xE59A},{0x8776, 0x92B1},{0x8778, 0xE597},{0x877F, 0x9488},{0x8782, 0xE5A5},{0x878D, 0x975A}, - {0x879F, 0xE5A4},{0x87A2, 0xE5A3},{0x87AB, 0xE5AC},{0x87AF, 0xE5A6},{0x87B3, 0xE5AE},{0x87BA, 0x9786},{0x87BB, 0xE5B1},{0x87BD, 0xE5A8}, - {0x87C0, 0xE5A9},{0x87C4, 0xE5AD},{0x87C6, 0xE5B0},{0x87C7, 0xE5AF},{0x87CB, 0xE5A7},{0x87D0, 0xE5AA},{0x87D2, 0xE5BB},{0x87E0, 0xE5B4}, - {0x87EF, 0xE5B2},{0x87F2, 0xE5B3},{0x87F6, 0xE5B8},{0x87F7, 0xE5B9},{0x87F9, 0x8A49},{0x87FB, 0x8B61},{0x87FE, 0xE5B7},{0x8805, 0xE5A2}, - {0x8807, 0xEE85},{0x880D, 0xE5B6},{0x880E, 0xE5BA},{0x880F, 0xE5B5},{0x8811, 0xE5BC},{0x8815, 0xE5BE},{0x8816, 0xE5BD},{0x8821, 0xE5C0}, - {0x8822, 0xE5BF},{0x8823, 0xE579},{0x8827, 0xE5C4},{0x8831, 0xE5C1},{0x8836, 0xE5C2},{0x8839, 0xE5C3},{0x883B, 0xE5C5},{0x8840, 0x8C8C}, - {0x8842, 0xE5C7},{0x8844, 0xE5C6},{0x8846, 0x8F4F},{0x884C, 0x8D73},{0x884D, 0x9FA5},{0x8852, 0xE5C8},{0x8853, 0x8F70},{0x8857, 0x8A58}, - {0x8859, 0xE5C9},{0x885B, 0x8971},{0x885D, 0x8FD5},{0x885E, 0xE5CA},{0x8861, 0x8D74},{0x8862, 0xE5CB},{0x8863, 0x88DF},{0x8868, 0x955C}, - {0x886B, 0xE5CC},{0x8870, 0x908A},{0x8872, 0xE5D3},{0x8875, 0xE5D0},{0x8877, 0x928F},{0x887D, 0xE5D1},{0x887E, 0xE5CE},{0x887F, 0x8BDC}, - {0x8881, 0xE5CD},{0x8882, 0xE5D4},{0x8888, 0x8C55},{0x888B, 0x91DC},{0x888D, 0xE5DA},{0x8892, 0xE5D6},{0x8896, 0x91B3},{0x8897, 0xE5D5}, - {0x8899, 0xE5D8},{0x889E, 0xE5CF},{0x88A2, 0xE5D9},{0x88A4, 0xE5DB},{0x88AB, 0x94ED},{0x88AE, 0xE5D7},{0x88B0, 0xE5DC},{0x88B1, 0xE5DE}, - {0x88B4, 0x8CD1},{0x88B5, 0xE5D2},{0x88B7, 0x88BF},{0x88BF, 0xE5DD},{0x88C1, 0x8DD9},{0x88C2, 0x97F4},{0x88C3, 0xE5DF},{0x88C4, 0xE5E0}, - {0x88C5, 0x9195},{0x88CF, 0x97A0},{0x88D4, 0xE5E1},{0x88D5, 0x9754},{0x88D8, 0xE5E2},{0x88D9, 0xE5E3},{0x88DC, 0x95E2},{0x88DD, 0xE5E4}, - {0x88DF, 0x8DBE},{0x88E1, 0x97A1},{0x88E8, 0xE5E9},{0x88F2, 0xE5EA},{0x88F3, 0x8FD6},{0x88F4, 0xE5E8},{0x88F5, 0xEE86},{0x88F8, 0x9787}, - {0x88F9, 0xE5E5},{0x88FC, 0xE5E7},{0x88FD, 0x90BB},{0x88FE, 0x909E},{0x8902, 0xE5E6},{0x8904, 0xE5EB},{0x8907, 0x95A1},{0x890A, 0xE5ED}, - {0x890C, 0xE5EC},{0x8910, 0x8A8C},{0x8912, 0x964A},{0x8913, 0xE5EE},{0x891C, 0xED41},{0x891D, 0xE5FA},{0x891E, 0xE5F0},{0x8925, 0xE5F1}, - {0x892A, 0xE5F2},{0x892B, 0xE5F3},{0x8936, 0xE5F7},{0x8938, 0xE5F8},{0x893B, 0xE5F6},{0x8941, 0xE5F4},{0x8943, 0xE5EF},{0x8944, 0xE5F5}, - {0x894C, 0xE5F9},{0x894D, 0xE8B5},{0x8956, 0x89A6},{0x895E, 0xE5FC},{0x895F, 0x8BDD},{0x8960, 0xE5FB},{0x8964, 0xE641},{0x8966, 0xE640}, - {0x896A, 0xE643},{0x896D, 0xE642},{0x896F, 0xE644},{0x8972, 0x8F50},{0x8974, 0xE645},{0x8977, 0xE646},{0x897E, 0xE647},{0x897F, 0x90BC}, - {0x8981, 0x9776},{0x8983, 0xE648},{0x8986, 0x95A2},{0x8987, 0x9465},{0x8988, 0xE649},{0x898A, 0xE64A},{0x898B, 0x8CA9},{0x898F, 0x8B4B}, - {0x8993, 0xE64B},{0x8996, 0x8E8B},{0x8997, 0x9460},{0x8998, 0xE64C},{0x899A, 0x8A6F},{0x89A1, 0xE64D},{0x89A6, 0xE64F},{0x89A7, 0x9797}, - {0x89A9, 0xE64E},{0x89AA, 0x9065},{0x89AC, 0xE650},{0x89AF, 0xE651},{0x89B2, 0xE652},{0x89B3, 0x8ACF},{0x89BA, 0xE653},{0x89BD, 0xE654}, - {0x89BF, 0xE655},{0x89C0, 0xE656},{0x89D2, 0x8A70},{0x89DA, 0xE657},{0x89DC, 0xE658},{0x89DD, 0xE659},{0x89E3, 0x89F0},{0x89E6, 0x9047}, - {0x89E7, 0xE65A},{0x89F4, 0xE65B},{0x89F8, 0xE65C},{0x8A00, 0x8CBE},{0x8A02, 0x92F9},{0x8A03, 0xE65D},{0x8A08, 0x8C76},{0x8A0A, 0x9075}, - {0x8A0C, 0xE660},{0x8A0E, 0x93A2},{0x8A10, 0xE65F},{0x8A12, 0xEE87},{0x8A13, 0x8C50},{0x8A16, 0xE65E},{0x8A17, 0x91F5},{0x8A18, 0x8B4C}, - {0x8A1B, 0xE661},{0x8A1D, 0xE662},{0x8A1F, 0x8FD7},{0x8A23, 0x8C8D},{0x8A25, 0xE663},{0x8A2A, 0x964B},{0x8A2D, 0x90DD},{0x8A31, 0x8B96}, - {0x8A33, 0x96F3},{0x8A34, 0x9169},{0x8A36, 0xE664},{0x8A37, 0xEE88},{0x8A3A, 0x9066},{0x8A3B, 0x9290},{0x8A3C, 0x8FD8},{0x8A41, 0xE665}, - {0x8A46, 0xE668},{0x8A48, 0xE669},{0x8A50, 0x8DBC},{0x8A51, 0x91C0},{0x8A52, 0xE667},{0x8A54, 0x8FD9},{0x8A55, 0x955D},{0x8A5B, 0xE666}, - {0x8A5E, 0x8E8C},{0x8A60, 0x8972},{0x8A62, 0xE66D},{0x8A63, 0x8C77},{0x8A66, 0x8E8E},{0x8A69, 0x8E8D},{0x8A6B, 0x986C},{0x8A6C, 0xE66C}, - {0x8A6D, 0xE66B},{0x8A6E, 0x9146},{0x8A70, 0x8B6C},{0x8A71, 0x9862},{0x8A72, 0x8A59},{0x8A73, 0x8FDA},{0x8A79, 0xEE89},{0x8A7C, 0xE66A}, - {0x8A82, 0xE66F},{0x8A84, 0xE670},{0x8A85, 0xE66E},{0x8A87, 0x8CD6},{0x8A89, 0x975F},{0x8A8C, 0x8E8F},{0x8A8D, 0x9446},{0x8A91, 0xE673}, - {0x8A93, 0x90BE},{0x8A95, 0x9261},{0x8A98, 0x9755},{0x8A9A, 0xE676},{0x8A9E, 0x8CEA},{0x8AA0, 0x90BD},{0x8AA1, 0xE672},{0x8AA3, 0xE677}, - {0x8AA4, 0x8CEB},{0x8AA5, 0xE674},{0x8AA6, 0xE675},{0x8AA7, 0xEE8A},{0x8AA8, 0xE671},{0x8AAC, 0x90E0},{0x8AAD, 0x93C7},{0x8AB0, 0x924E}, - {0x8AB2, 0x89DB},{0x8AB9, 0x94EE},{0x8ABC, 0x8B62},{0x8ABE, 0xEE8B},{0x8ABF, 0x92B2},{0x8AC2, 0xE67A},{0x8AC4, 0xE678},{0x8AC7, 0x926B}, - {0x8ACB, 0x90BF},{0x8ACC, 0x8AD0},{0x8ACD, 0xE679},{0x8ACF, 0x907A},{0x8AD2, 0x97C8},{0x8AD6, 0x985F},{0x8ADA, 0xE67B},{0x8ADB, 0xE687}, - {0x8ADC, 0x92B3},{0x8ADE, 0xE686},{0x8ADF, 0xEE8C},{0x8AE0, 0xE683},{0x8AE1, 0xE68B},{0x8AE2, 0xE684},{0x8AE4, 0xE680},{0x8AE6, 0x92FA}, - {0x8AE7, 0xE67E},{0x8AEB, 0xE67C},{0x8AED, 0x9740},{0x8AEE, 0x8E90},{0x8AF1, 0xE681},{0x8AF3, 0xE67D},{0x8AF6, 0xEE8E},{0x8AF7, 0xE685}, - {0x8AF8, 0x8F94},{0x8AFA, 0x8CBF},{0x8AFE, 0x91F8},{0x8B00, 0x9664},{0x8B01, 0x8979},{0x8B02, 0x88E0},{0x8B04, 0x93A3},{0x8B07, 0xE689}, - {0x8B0C, 0xE688},{0x8B0E, 0x93E4},{0x8B10, 0xE68D},{0x8B14, 0xE682},{0x8B16, 0xE68C},{0x8B17, 0xE68E},{0x8B19, 0x8CAA},{0x8B1A, 0xE68A}, - {0x8B1B, 0x8D75},{0x8B1D, 0x8ED3},{0x8B20, 0xE68F},{0x8B21, 0x9777},{0x8B26, 0xE692},{0x8B28, 0xE695},{0x8B2B, 0xE693},{0x8B2C, 0x9554}, - {0x8B33, 0xE690},{0x8B39, 0x8BDE},{0x8B3E, 0xE694},{0x8B41, 0xE696},{0x8B49, 0xE69A},{0x8B4C, 0xE697},{0x8B4E, 0xE699},{0x8B4F, 0xE698}, - {0x8B53, 0xEE8F},{0x8B56, 0xE69B},{0x8B58, 0x8EAF},{0x8B5A, 0xE69D},{0x8B5B, 0xE69C},{0x8B5C, 0x9588},{0x8B5F, 0xE69F},{0x8B66, 0x8C78}, - {0x8B6B, 0xE69E},{0x8B6C, 0xE6A0},{0x8B6F, 0xE6A1},{0x8B70, 0x8B63},{0x8B71, 0xE3BF},{0x8B72, 0x8FF7},{0x8B74, 0xE6A2},{0x8B77, 0x8CEC}, - {0x8B7D, 0xE6A3},{0x8B7F, 0xEE90},{0x8B80, 0xE6A4},{0x8B83, 0x8E5D},{0x8B8A, 0x9DCC},{0x8B8C, 0xE6A5},{0x8B8E, 0xE6A6},{0x8B90, 0x8F51}, - {0x8B92, 0xE6A7},{0x8B93, 0xE6A8},{0x8B96, 0xE6A9},{0x8B99, 0xE6AA},{0x8B9A, 0xE6AB},{0x8C37, 0x924A},{0x8C3A, 0xE6AC},{0x8C3F, 0xE6AE}, - {0x8C41, 0xE6AD},{0x8C46, 0x93A4},{0x8C48, 0xE6AF},{0x8C4A, 0x964C},{0x8C4C, 0xE6B0},{0x8C4E, 0xE6B1},{0x8C50, 0xE6B2},{0x8C55, 0xE6B3}, - {0x8C5A, 0x93D8},{0x8C61, 0x8FDB},{0x8C62, 0xE6B4},{0x8C6A, 0x8D8B},{0x8C6B, 0x98AC},{0x8C6C, 0xE6B5},{0x8C78, 0xE6B6},{0x8C79, 0x955E}, - {0x8C7A, 0xE6B7},{0x8C7C, 0xE6BF},{0x8C82, 0xE6B8},{0x8C85, 0xE6BA},{0x8C89, 0xE6B9},{0x8C8A, 0xE6BB},{0x8C8C, 0x9665},{0x8C8D, 0xE6BC}, - {0x8C8E, 0xE6BD},{0x8C94, 0xE6BE},{0x8C98, 0xE6C0},{0x8C9D, 0x8A4C},{0x8C9E, 0x92E5},{0x8CA0, 0x9589},{0x8CA1, 0x8DE0},{0x8CA2, 0x8D76}, - {0x8CA7, 0x956E},{0x8CA8, 0x89DD},{0x8CA9, 0x94CC},{0x8CAA, 0xE6C3},{0x8CAB, 0x8AD1},{0x8CAC, 0x90D3},{0x8CAD, 0xE6C2},{0x8CAE, 0xE6C7}, - {0x8CAF, 0x9299},{0x8CB0, 0x96E1},{0x8CB2, 0xE6C5},{0x8CB3, 0xE6C6},{0x8CB4, 0x8B4D},{0x8CB6, 0xE6C8},{0x8CB7, 0x9483},{0x8CB8, 0x91DD}, - {0x8CBB, 0x94EF},{0x8CBC, 0x935C},{0x8CBD, 0xE6C4},{0x8CBF, 0x9666},{0x8CC0, 0x89EA},{0x8CC1, 0xE6CA},{0x8CC2, 0x9847},{0x8CC3, 0x92C0}, - {0x8CC4, 0x9864},{0x8CC7, 0x8E91},{0x8CC8, 0xE6C9},{0x8CCA, 0x91AF},{0x8CCD, 0xE6DA},{0x8CCE, 0x9147},{0x8CD1, 0x93F6},{0x8CD3, 0x956F}, - {0x8CDA, 0xE6CD},{0x8CDB, 0x8E5E},{0x8CDC, 0x8E92},{0x8CDE, 0x8FDC},{0x8CE0, 0x9485},{0x8CE2, 0x8CAB},{0x8CE3, 0xE6CC},{0x8CE4, 0xE6CB}, - {0x8CE6, 0x958A},{0x8CEA, 0x8EBF},{0x8CED, 0x9371},{0x8CF0, 0xEE91},{0x8CF4, 0xEE92},{0x8CFA, 0xE6CF},{0x8CFB, 0xE6D0},{0x8CFC, 0x8D77}, - {0x8CFD, 0xE6CE},{0x8D04, 0xE6D1},{0x8D05, 0xE6D2},{0x8D07, 0xE6D4},{0x8D08, 0x91A1},{0x8D0A, 0xE6D3},{0x8D0B, 0x8AE4},{0x8D0D, 0xE6D6}, - {0x8D0F, 0xE6D5},{0x8D10, 0xE6D7},{0x8D12, 0xEE93},{0x8D13, 0xE6D9},{0x8D14, 0xE6DB},{0x8D16, 0xE6DC},{0x8D64, 0x90D4},{0x8D66, 0x8ECD}, - {0x8D67, 0xE6DD},{0x8D6B, 0x8A71},{0x8D6D, 0xE6DE},{0x8D70, 0x9196},{0x8D71, 0xE6DF},{0x8D73, 0xE6E0},{0x8D74, 0x958B},{0x8D76, 0xEE94}, - {0x8D77, 0x8B4E},{0x8D81, 0xE6E1},{0x8D85, 0x92B4},{0x8D8A, 0x897A},{0x8D99, 0xE6E2},{0x8DA3, 0x8EEF},{0x8DA8, 0x9096},{0x8DB3, 0x91AB}, - {0x8DBA, 0xE6E5},{0x8DBE, 0xE6E4},{0x8DC2, 0xE6E3},{0x8DCB, 0xE6EB},{0x8DCC, 0xE6E9},{0x8DCF, 0xE6E6},{0x8DD6, 0xE6E8},{0x8DDA, 0xE6E7}, - {0x8DDB, 0xE6EA},{0x8DDD, 0x8B97},{0x8DDF, 0xE6EE},{0x8DE1, 0x90D5},{0x8DE3, 0xE6EF},{0x8DE8, 0x8CD7},{0x8DEA, 0xE6EC},{0x8DEB, 0xE6ED}, - {0x8DEF, 0x9848},{0x8DF3, 0x92B5},{0x8DF5, 0x9148},{0x8DFC, 0xE6F0},{0x8DFF, 0xE6F3},{0x8E08, 0xE6F1},{0x8E09, 0xE6F2},{0x8E0A, 0x9778}, - {0x8E0F, 0x93A5},{0x8E10, 0xE6F6},{0x8E1D, 0xE6F4},{0x8E1E, 0xE6F5},{0x8E1F, 0xE6F7},{0x8E2A, 0xE748},{0x8E30, 0xE6FA},{0x8E34, 0xE6FB}, - {0x8E35, 0xE6F9},{0x8E42, 0xE6F8},{0x8E44, 0x92FB},{0x8E47, 0xE740},{0x8E48, 0xE744},{0x8E49, 0xE741},{0x8E4A, 0xE6FC},{0x8E4C, 0xE742}, - {0x8E50, 0xE743},{0x8E55, 0xE74A},{0x8E59, 0xE745},{0x8E5F, 0x90D6},{0x8E60, 0xE747},{0x8E63, 0xE749},{0x8E64, 0xE746},{0x8E72, 0xE74C}, - {0x8E74, 0x8F52},{0x8E76, 0xE74B},{0x8E7C, 0xE74D},{0x8E81, 0xE74E},{0x8E84, 0xE751},{0x8E85, 0xE750},{0x8E87, 0xE74F},{0x8E8A, 0xE753}, - {0x8E8B, 0xE752},{0x8E8D, 0x96F4},{0x8E91, 0xE755},{0x8E93, 0xE754},{0x8E94, 0xE756},{0x8E99, 0xE757},{0x8EA1, 0xE759},{0x8EAA, 0xE758}, - {0x8EAB, 0x9067},{0x8EAC, 0xE75A},{0x8EAF, 0x8BEB},{0x8EB0, 0xE75B},{0x8EB1, 0xE75D},{0x8EBE, 0xE75E},{0x8EC5, 0xE75F},{0x8EC6, 0xE75C}, - {0x8EC8, 0xE760},{0x8ECA, 0x8ED4},{0x8ECB, 0xE761},{0x8ECC, 0x8B4F},{0x8ECD, 0x8C52},{0x8ECF, 0xEE96},{0x8ED2, 0x8CAC},{0x8EDB, 0xE762}, - {0x8EDF, 0x93EE},{0x8EE2, 0x935D},{0x8EE3, 0xE763},{0x8EEB, 0xE766},{0x8EF8, 0x8EB2},{0x8EFB, 0xE765},{0x8EFC, 0xE764},{0x8EFD, 0x8C79}, - {0x8EFE, 0xE767},{0x8F03, 0x8A72},{0x8F05, 0xE769},{0x8F09, 0x8DDA},{0x8F0A, 0xE768},{0x8F0C, 0xE771},{0x8F12, 0xE76B},{0x8F13, 0xE76D}, - {0x8F14, 0x95E3},{0x8F15, 0xE76A},{0x8F19, 0xE76C},{0x8F1B, 0xE770},{0x8F1C, 0xE76E},{0x8F1D, 0x8B50},{0x8F1F, 0xE76F},{0x8F26, 0xE772}, - {0x8F29, 0x9479},{0x8F2A, 0x97D6},{0x8F2F, 0x8F53},{0x8F33, 0xE773},{0x8F38, 0x9741},{0x8F39, 0xE775},{0x8F3B, 0xE774},{0x8F3E, 0xE778}, - {0x8F3F, 0x9760},{0x8F42, 0xE777},{0x8F44, 0x8A8D},{0x8F45, 0xE776},{0x8F46, 0xE77B},{0x8F49, 0xE77A},{0x8F4C, 0xE779},{0x8F4D, 0x9351}, - {0x8F4E, 0xE77C},{0x8F57, 0xE77D},{0x8F5C, 0xE77E},{0x8F5F, 0x8D8C},{0x8F61, 0x8C44},{0x8F62, 0xE780},{0x8F63, 0xE781},{0x8F64, 0xE782}, - {0x8F9B, 0x9068},{0x8F9C, 0xE783},{0x8F9E, 0x8EAB},{0x8F9F, 0xE784},{0x8FA3, 0xE785},{0x8FA7, 0x999F},{0x8FA8, 0x999E},{0x8FAD, 0xE786}, - {0x8FAE, 0xE390},{0x8FAF, 0xE787},{0x8FB0, 0x9243},{0x8FB1, 0x904A},{0x8FB2, 0x945F},{0x8FB7, 0xE788},{0x8FBA, 0x95D3},{0x8FBB, 0x92D2}, - {0x8FBC, 0x8D9E},{0x8FBF, 0x9248},{0x8FC2, 0x8949},{0x8FC4, 0x9698},{0x8FC5, 0x9076},{0x8FCE, 0x8C7D},{0x8FD1, 0x8BDF},{0x8FD4, 0x95D4}, - {0x8FDA, 0xE789},{0x8FE2, 0xE78B},{0x8FE5, 0xE78A},{0x8FE6, 0x89DE},{0x8FE9, 0x93F4},{0x8FEA, 0xE78C},{0x8FEB, 0x9497},{0x8FED, 0x9352}, - {0x8FEF, 0xE78D},{0x8FF0, 0x8F71},{0x8FF4, 0xE78F},{0x8FF7, 0x96C0},{0x8FF8, 0xE79E},{0x8FF9, 0xE791},{0x8FFA, 0xE792},{0x8FFD, 0x92C7}, - {0x9000, 0x91DE},{0x9001, 0x9197},{0x9003, 0x93A6},{0x9005, 0xE790},{0x9006, 0x8B74},{0x900B, 0xE799},{0x900D, 0xE796},{0x900E, 0xE7A3}, - {0x900F, 0x93A7},{0x9010, 0x9280},{0x9011, 0xE793},{0x9013, 0x92FC},{0x9014, 0x9372},{0x9015, 0xE794},{0x9016, 0xE798},{0x9017, 0x9080}, - {0x9019, 0x9487},{0x901A, 0x92CA},{0x901D, 0x90C0},{0x901E, 0xE797},{0x901F, 0x91AC},{0x9020, 0x91A2},{0x9021, 0xE795},{0x9022, 0x88A7}, - {0x9023, 0x9841},{0x9027, 0xE79A},{0x902E, 0x91DF},{0x9031, 0x8F54},{0x9032, 0x9069},{0x9035, 0xE79C},{0x9036, 0xE79B},{0x9038, 0x88ED}, - {0x9039, 0xE79D},{0x903C, 0x954E},{0x903E, 0xE7A5},{0x9041, 0x93D9},{0x9042, 0x908B},{0x9045, 0x9278},{0x9047, 0x8BF6},{0x9049, 0xE7A4}, - {0x904A, 0x9756},{0x904B, 0x895E},{0x904D, 0x95D5},{0x904E, 0x89DF},{0x904F, 0xE79F},{0x9050, 0xE7A0},{0x9051, 0xE7A1},{0x9052, 0xE7A2}, - {0x9053, 0x93B9},{0x9054, 0x9242},{0x9055, 0x88E1},{0x9056, 0xE7A6},{0x9058, 0xE7A7},{0x9059, 0xEAA1},{0x905C, 0x91BB},{0x905E, 0xE7A8}, - {0x9060, 0x8993},{0x9061, 0x916B},{0x9063, 0x8CAD},{0x9065, 0x9779},{0x9067, 0xEE99},{0x9068, 0xE7A9},{0x9069, 0x934B},{0x906D, 0x9198}, - {0x906E, 0x8ED5},{0x906F, 0xE7AA},{0x9072, 0xE7AD},{0x9075, 0x8F85},{0x9076, 0xE7AB},{0x9077, 0x914A},{0x9078, 0x9149},{0x907A, 0x88E2}, - {0x907C, 0x97C9},{0x907D, 0xE7AF},{0x907F, 0x94F0},{0x9080, 0xE7B1},{0x9081, 0xE7B0},{0x9082, 0xE7AE},{0x9083, 0xE284},{0x9084, 0x8AD2}, - {0x9087, 0xE78E},{0x9089, 0xE7B3},{0x908A, 0xE7B2},{0x908F, 0xE7B4},{0x9091, 0x9757},{0x90A3, 0x93DF},{0x90A6, 0x964D},{0x90A8, 0xE7B5}, - {0x90AA, 0x8ED7},{0x90AF, 0xE7B6},{0x90B1, 0xE7B7},{0x90B5, 0xE7B8},{0x90B8, 0x9340},{0x90C1, 0x88E8},{0x90CA, 0x8D78},{0x90CE, 0x9859}, - {0x90DB, 0xE7BC},{0x90DE, 0xEE9A},{0x90E1, 0x8C53},{0x90E2, 0xE7B9},{0x90E4, 0xE7BA},{0x90E8, 0x9594},{0x90ED, 0x8A73},{0x90F5, 0x9758}, - {0x90F7, 0x8BBD},{0x90FD, 0x9373},{0x9102, 0xE7BD},{0x9112, 0xE7BE},{0x9115, 0xEE9C},{0x9119, 0xE7BF},{0x9127, 0xEE9D},{0x912D, 0x9341}, - {0x9130, 0xE7C1},{0x9132, 0xE7C0},{0x9149, 0x93D1},{0x914A, 0xE7C2},{0x914B, 0x8F55},{0x914C, 0x8EDE},{0x914D, 0x947A},{0x914E, 0x9291}, - {0x9152, 0x8EF0},{0x9154, 0x908C},{0x9156, 0xE7C3},{0x9158, 0xE7C4},{0x9162, 0x907C},{0x9163, 0xE7C5},{0x9165, 0xE7C6},{0x9169, 0xE7C7}, - {0x916A, 0x978F},{0x916C, 0x8F56},{0x9172, 0xE7C9},{0x9173, 0xE7C8},{0x9175, 0x8D79},{0x9177, 0x8D93},{0x9178, 0x8E5F},{0x9182, 0xE7CC}, - {0x9187, 0x8F86},{0x9189, 0xE7CB},{0x918B, 0xE7CA},{0x918D, 0x91E7},{0x9190, 0x8CED},{0x9192, 0x90C1},{0x9197, 0x94AE},{0x919C, 0x8F58}, - {0x91A2, 0xE7CD},{0x91A4, 0x8FDD},{0x91AA, 0xE7D0},{0x91AB, 0xE7CE},{0x91AF, 0xE7CF},{0x91B4, 0xE7D2},{0x91B5, 0xE7D1},{0x91B8, 0x8FF8}, - {0x91BA, 0xE7D3},{0x91C0, 0xE7D4},{0x91C1, 0xE7D5},{0x91C6, 0x94CE},{0x91C7, 0x8DD1},{0x91C8, 0x8EDF},{0x91C9, 0xE7D6},{0x91CB, 0xE7D7}, - {0x91CC, 0x97A2},{0x91CD, 0x8F64},{0x91CE, 0x96EC},{0x91CF, 0x97CA},{0x91D0, 0xE7D8},{0x91D1, 0x8BE0},{0x91D6, 0xE7D9},{0x91D7, 0xEE9F}, - {0x91D8, 0x9342},{0x91DA, 0xEE9E},{0x91DB, 0xE7DC},{0x91DC, 0x8A98},{0x91DD, 0x906A},{0x91DE, 0xEEA0},{0x91DF, 0xE7DA},{0x91E1, 0xE7DB}, - {0x91E3, 0x92DE},{0x91E4, 0xEEA3},{0x91E5, 0xEEA4},{0x91E6, 0x9674},{0x91E7, 0x8BFA},{0x91ED, 0xEEA1},{0x91EE, 0xEEA2},{0x91F5, 0xE7DE}, - {0x91F6, 0xE7DF},{0x91FC, 0xE7DD},{0x91FF, 0xE7E1},{0x9206, 0xEEA5},{0x920A, 0xEEA7},{0x920D, 0x93DD},{0x920E, 0x8A62},{0x9210, 0xEEA6}, - {0x9211, 0xE7E5},{0x9214, 0xE7E2},{0x9215, 0xE7E4},{0x921E, 0xE7E0},{0x9229, 0xE86E},{0x922C, 0xE7E3},{0x9234, 0x97E9},{0x9237, 0x8CD8}, - {0x9239, 0xEEAE},{0x923A, 0xEEA8},{0x923C, 0xEEAA},{0x923F, 0xE7ED},{0x9240, 0xEEA9},{0x9244, 0x9353},{0x9245, 0xE7E8},{0x9248, 0xE7EB}, - {0x9249, 0xE7E9},{0x924B, 0xE7EE},{0x924E, 0xEEAB},{0x9250, 0xE7EF},{0x9251, 0xEEAD},{0x9257, 0xE7E7},{0x9259, 0xEEAC},{0x925A, 0xE7F4}, - {0x925B, 0x8994},{0x925E, 0xE7E6},{0x9262, 0x94AB},{0x9264, 0xE7EA},{0x9266, 0x8FDE},{0x9267, 0xEEAF},{0x9271, 0x8D7A},{0x9277, 0xEEB1}, - {0x9278, 0xEEB2},{0x927E, 0x9667},{0x9280, 0x8BE2},{0x9283, 0x8F65},{0x9285, 0x93BA},{0x9288, 0xED43},{0x9291, 0x914C},{0x9293, 0xE7F2}, - {0x9295, 0xE7EC},{0x9296, 0xE7F1},{0x9298, 0x96C1},{0x929A, 0x92B6},{0x929B, 0xE7F3},{0x929C, 0xE7F0},{0x92A7, 0xEEB0},{0x92AD, 0x914B}, - {0x92B7, 0xE7F7},{0x92B9, 0xE7F6},{0x92CF, 0xE7F5},{0x92D0, 0xEEB6},{0x92D2, 0x964E},{0x92D3, 0xEEBA},{0x92D5, 0xEEB8},{0x92D7, 0xEEB4}, - {0x92D9, 0xEEB5},{0x92E0, 0xEEB9},{0x92E4, 0x8F9B},{0x92E7, 0xEEB3},{0x92E9, 0xE7F8},{0x92EA, 0x95DD},{0x92ED, 0x8973},{0x92F2, 0x9565}, - {0x92F3, 0x9292},{0x92F8, 0x8B98},{0x92F9, 0xED49},{0x92FA, 0xE7FA},{0x92FB, 0xEEBD},{0x92FC, 0x8D7C},{0x92FF, 0xEEC0},{0x9302, 0xEEC2}, - {0x9306, 0x8E4B},{0x930F, 0xE7F9},{0x9310, 0x908D},{0x9318, 0x908E},{0x9319, 0xE840},{0x931A, 0xE842},{0x931D, 0xEEC1},{0x931E, 0xEEBF}, - {0x9320, 0x8FF9},{0x9321, 0xEEBC},{0x9322, 0xE841},{0x9323, 0xE843},{0x9325, 0xEEBB},{0x9326, 0x8BD1},{0x9328, 0x9564},{0x932B, 0x8EE0}, - {0x932C, 0x9842},{0x932E, 0xE7FC},{0x932F, 0x8DF6},{0x9332, 0x985E},{0x9335, 0xE845},{0x933A, 0xE844},{0x933B, 0xE846},{0x9344, 0xE7FB}, - {0x9348, 0xED42},{0x934B, 0x93E7},{0x934D, 0x9374},{0x9354, 0x92D5},{0x9356, 0xE84B},{0x9357, 0xEEC4},{0x935B, 0x9262},{0x935C, 0xE847}, - {0x9360, 0xE848},{0x936C, 0x8C4C},{0x936E, 0xE84A},{0x9370, 0xEEC3},{0x9375, 0x8CAE},{0x937C, 0xE849},{0x937E, 0x8FDF},{0x938C, 0x8A99}, - {0x9394, 0xE84F},{0x9396, 0x8DBD},{0x9397, 0x9199},{0x939A, 0x92C8},{0x93A4, 0xEEC5},{0x93A7, 0x8A5A},{0x93AC, 0xE84D},{0x93AD, 0xE84E}, - {0x93AE, 0x92C1},{0x93B0, 0xE84C},{0x93B9, 0xE850},{0x93C3, 0xE856},{0x93C6, 0xEEC6},{0x93C8, 0xE859},{0x93D0, 0xE858},{0x93D1, 0x934C}, - {0x93D6, 0xE851},{0x93D7, 0xE852},{0x93D8, 0xE855},{0x93DD, 0xE857},{0x93DE, 0xEEC7},{0x93E1, 0x8BBE},{0x93E4, 0xE85A},{0x93E5, 0xE854}, - {0x93E8, 0xE853},{0x93F8, 0xEEC8},{0x9403, 0xE85E},{0x9407, 0xE85F},{0x9410, 0xE860},{0x9413, 0xE85D},{0x9414, 0xE85C},{0x9418, 0x8FE0}, - {0x9419, 0x93A8},{0x941A, 0xE85B},{0x9421, 0xE864},{0x942B, 0xE862},{0x9431, 0xEEC9},{0x9435, 0xE863},{0x9436, 0xE861},{0x9438, 0x91F6}, - {0x943A, 0xE865},{0x9441, 0xE866},{0x9444, 0xE868},{0x9445, 0xEECA},{0x9448, 0xEECB},{0x9451, 0x8AD3},{0x9452, 0xE867},{0x9453, 0x96F8}, - {0x945A, 0xE873},{0x945B, 0xE869},{0x945E, 0xE86C},{0x9460, 0xE86A},{0x9462, 0xE86B},{0x946A, 0xE86D},{0x9470, 0xE86F},{0x9475, 0xE870}, - {0x9477, 0xE871},{0x947C, 0xE874},{0x947D, 0xE872},{0x947E, 0xE875},{0x947F, 0xE877},{0x9481, 0xE876},{0x9577, 0x92B7},{0x9580, 0x96E5}, - {0x9582, 0xE878},{0x9583, 0x914D},{0x9587, 0xE879},{0x9589, 0x95C2},{0x958A, 0xE87A},{0x958B, 0x8A4A},{0x958F, 0x895B},{0x9591, 0x8AD5}, - {0x9592, 0xEECC},{0x9593, 0x8AD4},{0x9594, 0xE87B},{0x9596, 0xE87C},{0x9598, 0xE87D},{0x9599, 0xE87E},{0x95A0, 0xE880},{0x95A2, 0x8AD6}, - {0x95A3, 0x8A74},{0x95A4, 0x8D7D},{0x95A5, 0x94B4},{0x95A7, 0xE882},{0x95A8, 0xE881},{0x95AD, 0xE883},{0x95B2, 0x897B},{0x95B9, 0xE886}, - {0x95BB, 0xE885},{0x95BC, 0xE884},{0x95BE, 0xE887},{0x95C3, 0xE88A},{0x95C7, 0x88C5},{0x95CA, 0xE888},{0x95CC, 0xE88C},{0x95CD, 0xE88B}, - {0x95D4, 0xE88E},{0x95D5, 0xE88D},{0x95D6, 0xE88F},{0x95D8, 0x93AC},{0x95DC, 0xE890},{0x95E1, 0xE891},{0x95E2, 0xE893},{0x95E5, 0xE892}, - {0x961C, 0x958C},{0x9621, 0xE894},{0x9628, 0xE895},{0x962A, 0x8DE3},{0x962E, 0xE896},{0x962F, 0xE897},{0x9632, 0x9668},{0x963B, 0x916A}, - {0x963F, 0x88A2},{0x9640, 0x91C9},{0x9642, 0xE898},{0x9644, 0x958D},{0x964B, 0xE89B},{0x964C, 0xE899},{0x964D, 0x8D7E},{0x964F, 0xE89A}, - {0x9650, 0x8CC0},{0x965B, 0x95C3},{0x965C, 0xE89D},{0x965D, 0xE89F},{0x965E, 0xE89E},{0x965F, 0xE8A0},{0x9662, 0x8940},{0x9663, 0x9077}, - {0x9664, 0x8F9C},{0x9665, 0x8AD7},{0x9666, 0xE8A1},{0x966A, 0x9486},{0x966C, 0xE8A3},{0x9670, 0x8941},{0x9672, 0xE8A2},{0x9673, 0x92C2}, - {0x9675, 0x97CB},{0x9676, 0x93A9},{0x9677, 0xE89C},{0x9678, 0x97A4},{0x967A, 0x8CAF},{0x967D, 0x977A},{0x9685, 0x8BF7},{0x9686, 0x97B2}, - {0x9688, 0x8C47},{0x968A, 0x91E0},{0x968B, 0xE440},{0x968D, 0xE8A4},{0x968E, 0x8A4B},{0x968F, 0x908F},{0x9694, 0x8A75},{0x9695, 0xE8A6}, - {0x9697, 0xE8A7},{0x9698, 0xE8A5},{0x9699, 0x8C84},{0x969B, 0x8DDB},{0x969C, 0x8FE1},{0x969D, 0xEECF},{0x96A0, 0x8942},{0x96A3, 0x97D7}, - {0x96A7, 0xE8A9},{0x96A8, 0xE7AC},{0x96AA, 0xE8A8},{0x96AF, 0xEED0},{0x96B0, 0xE8AC},{0x96B1, 0xE8AA},{0x96B2, 0xE8AB},{0x96B4, 0xE8AD}, - {0x96B6, 0xE8AE},{0x96B7, 0x97EA},{0x96B8, 0xE8AF},{0x96B9, 0xE8B0},{0x96BB, 0x90C7},{0x96BC, 0x94B9},{0x96C0, 0x909D},{0x96C1, 0x8AE5}, - {0x96C4, 0x9759},{0x96C5, 0x89EB},{0x96C6, 0x8F57},{0x96C7, 0x8CD9},{0x96C9, 0xE8B3},{0x96CB, 0xE8B2},{0x96CC, 0x8E93},{0x96CD, 0xE8B4}, - {0x96CE, 0xE8B1},{0x96D1, 0x8E47},{0x96D5, 0xE8B8},{0x96D6, 0xE5AB},{0x96D9, 0x99D4},{0x96DB, 0x9097},{0x96DC, 0xE8B6},{0x96E2, 0x97A3}, - {0x96E3, 0x93EF},{0x96E8, 0x894A},{0x96EA, 0x90E1},{0x96EB, 0x8EB4},{0x96F0, 0x95B5},{0x96F2, 0x895F},{0x96F6, 0x97EB},{0x96F7, 0x978B}, - {0x96F9, 0xE8B9},{0x96FB, 0x9364},{0x9700, 0x8EF9},{0x9704, 0xE8BA},{0x9706, 0xE8BB},{0x9707, 0x906B},{0x9708, 0xE8BC},{0x970A, 0x97EC}, - {0x970D, 0xE8B7},{0x970E, 0xE8BE},{0x970F, 0xE8C0},{0x9711, 0xE8BF},{0x9713, 0xE8BD},{0x9716, 0xE8C1},{0x9719, 0xE8C2},{0x971C, 0x919A}, - {0x971E, 0x89E0},{0x9724, 0xE8C3},{0x9727, 0x96B6},{0x972A, 0xE8C4},{0x9730, 0xE8C5},{0x9732, 0x9849},{0x9733, 0xEED1},{0x9738, 0x9E50}, - {0x9739, 0xE8C6},{0x973B, 0xEED2},{0x973D, 0xE8C7},{0x973E, 0xE8C8},{0x9742, 0xE8CC},{0x9743, 0xEED3},{0x9744, 0xE8C9},{0x9746, 0xE8CA}, - {0x9748, 0xE8CB},{0x9749, 0xE8CD},{0x974D, 0xEED4},{0x974F, 0xEED5},{0x9751, 0xEED6},{0x9752, 0x90C2},{0x9755, 0xEED7},{0x9756, 0x96F5}, - {0x9759, 0x90C3},{0x975C, 0xE8CE},{0x975E, 0x94F1},{0x9760, 0xE8CF},{0x9761, 0xEA72},{0x9762, 0x96CA},{0x9764, 0xE8D0},{0x9766, 0xE8D1}, - {0x9768, 0xE8D2},{0x9769, 0x8A76},{0x976B, 0xE8D4},{0x976D, 0x9078},{0x9771, 0xE8D5},{0x9774, 0x8C43},{0x9779, 0xE8D6},{0x977A, 0xE8DA}, - {0x977C, 0xE8D8},{0x9781, 0xE8D9},{0x9784, 0x8A93},{0x9785, 0xE8D7},{0x9786, 0xE8DB},{0x978B, 0xE8DC},{0x978D, 0x88C6},{0x978F, 0xE8DD}, - {0x9790, 0xE8DE},{0x9798, 0x8FE2},{0x979C, 0xE8DF},{0x97A0, 0x8B66},{0x97A3, 0xE8E2},{0x97A6, 0xE8E1},{0x97A8, 0xE8E0},{0x97AB, 0xE691}, - {0x97AD, 0x95DA},{0x97B3, 0xE8E3},{0x97B4, 0xE8E4},{0x97C3, 0xE8E5},{0x97C6, 0xE8E6},{0x97C8, 0xE8E7},{0x97CB, 0xE8E8},{0x97D3, 0x8AD8}, - {0x97DC, 0xE8E9},{0x97ED, 0xE8EA},{0x97EE, 0x9442},{0x97F2, 0xE8EC},{0x97F3, 0x89B9},{0x97F5, 0xE8EF},{0x97F6, 0xE8EE},{0x97FB, 0x8943}, - {0x97FF, 0x8BBF},{0x9801, 0x95C5},{0x9802, 0x92B8},{0x9803, 0x8DA0},{0x9805, 0x8D80},{0x9806, 0x8F87},{0x9808, 0x907B},{0x980C, 0xE8F1}, - {0x980F, 0xE8F0},{0x9810, 0x9761},{0x9811, 0x8AE6},{0x9812, 0x94D0},{0x9813, 0x93DA},{0x9817, 0x909C},{0x9818, 0x97CC},{0x981A, 0x8C7A}, - {0x9821, 0xE8F4},{0x9824, 0xE8F3},{0x982C, 0x966A},{0x982D, 0x93AA},{0x9834, 0x896F},{0x9837, 0xE8F5},{0x9838, 0xE8F2},{0x983B, 0x9570}, - {0x983C, 0x978A},{0x983D, 0xE8F6},{0x9846, 0xE8F7},{0x984B, 0xE8F9},{0x984C, 0x91E8},{0x984D, 0x8A7A},{0x984E, 0x8A7B},{0x984F, 0xE8F8}, - {0x9854, 0x8AE7},{0x9855, 0x8CB0},{0x9857, 0xEED8},{0x9858, 0x8AE8},{0x985B, 0x935E},{0x985E, 0x97DE},{0x9865, 0xEED9},{0x9867, 0x8CDA}, - {0x986B, 0xE8FA},{0x986F, 0xE8FB},{0x9870, 0xE8FC},{0x9871, 0xE940},{0x9873, 0xE942},{0x9874, 0xE941},{0x98A8, 0x9597},{0x98AA, 0xE943}, - {0x98AF, 0xE944},{0x98B1, 0xE945},{0x98B6, 0xE946},{0x98C3, 0xE948},{0x98C4, 0xE947},{0x98C6, 0xE949},{0x98DB, 0x94F2},{0x98DC, 0xE3CA}, - {0x98DF, 0x9048},{0x98E2, 0x8B51},{0x98E9, 0xE94A},{0x98EB, 0xE94B},{0x98ED, 0x99AA},{0x98EE, 0x9F5A},{0x98EF, 0x94D1},{0x98F2, 0x88F9}, - {0x98F4, 0x88B9},{0x98FC, 0x8E94},{0x98FD, 0x964F},{0x98FE, 0x8FFC},{0x9903, 0xE94C},{0x9905, 0x96DD},{0x9909, 0xE94D},{0x990A, 0x977B}, - {0x990C, 0x8961},{0x9910, 0x8E60},{0x9912, 0xE94E},{0x9913, 0x89EC},{0x9914, 0xE94F},{0x9918, 0xE950},{0x991D, 0xE952},{0x991E, 0xE953}, - {0x9920, 0xE955},{0x9921, 0xE951},{0x9924, 0xE954},{0x9927, 0xEEDC},{0x9928, 0x8AD9},{0x992C, 0xE956},{0x992E, 0xE957},{0x993D, 0xE958}, - {0x993E, 0xE959},{0x9942, 0xE95A},{0x9945, 0xE95C},{0x9949, 0xE95B},{0x994B, 0xE95E},{0x994C, 0xE961},{0x9950, 0xE95D},{0x9951, 0xE95F}, - {0x9952, 0xE960},{0x9955, 0xE962},{0x9957, 0x8BC0},{0x9996, 0x8EF1},{0x9997, 0xE963},{0x9998, 0xE964},{0x9999, 0x8D81},{0x999E, 0xEEDE}, - {0x99A5, 0xE965},{0x99A8, 0x8A5D},{0x99AC, 0x946E},{0x99AD, 0xE966},{0x99AE, 0xE967},{0x99B3, 0x9279},{0x99B4, 0x93E9},{0x99BC, 0xE968}, - {0x99C1, 0x949D},{0x99C4, 0x91CA},{0x99C5, 0x8977},{0x99C6, 0x8BEC},{0x99C8, 0x8BED},{0x99D0, 0x9293},{0x99D1, 0xE96D},{0x99D2, 0x8BEE}, - {0x99D5, 0x89ED},{0x99D8, 0xE96C},{0x99DB, 0xE96A},{0x99DD, 0xE96B},{0x99DF, 0xE969},{0x99E2, 0xE977},{0x99ED, 0xE96E},{0x99EE, 0xE96F}, - {0x99F1, 0xE970},{0x99F2, 0xE971},{0x99F8, 0xE973},{0x99FB, 0xE972},{0x99FF, 0x8F78},{0x9A01, 0xE974},{0x9A05, 0xE976},{0x9A0E, 0x8B52}, - {0x9A0F, 0xE975},{0x9A12, 0x919B},{0x9A13, 0x8CB1},{0x9A19, 0xE978},{0x9A28, 0x91CB},{0x9A2B, 0xE979},{0x9A30, 0x93AB},{0x9A37, 0xE97A}, - {0x9A3E, 0xE980},{0x9A40, 0xE97D},{0x9A42, 0xE97C},{0x9A43, 0xE97E},{0x9A45, 0xE97B},{0x9A4D, 0xE982},{0x9A4E, 0xEEDF},{0x9A55, 0xE981}, - {0x9A57, 0xE984},{0x9A5A, 0x8BC1},{0x9A5B, 0xE983},{0x9A5F, 0xE985},{0x9A62, 0xE986},{0x9A64, 0xE988},{0x9A65, 0xE987},{0x9A69, 0xE989}, - {0x9A6A, 0xE98B},{0x9A6B, 0xE98A},{0x9AA8, 0x8D9C},{0x9AAD, 0xE98C},{0x9AB0, 0xE98D},{0x9AB8, 0x8A5B},{0x9ABC, 0xE98E},{0x9AC0, 0xE98F}, - {0x9AC4, 0x9091},{0x9ACF, 0xE990},{0x9AD1, 0xE991},{0x9AD3, 0xE992},{0x9AD4, 0xE993},{0x9AD8, 0x8D82},{0x9AD9, 0xEEE0},{0x9ADC, 0xEEE1}, - {0x9ADE, 0xE994},{0x9ADF, 0xE995},{0x9AE2, 0xE996},{0x9AE3, 0xE997},{0x9AE6, 0xE998},{0x9AEA, 0x94AF},{0x9AEB, 0xE99A},{0x9AED, 0x9545}, - {0x9AEE, 0xE99B},{0x9AEF, 0xE999},{0x9AF1, 0xE99D},{0x9AF4, 0xE99C},{0x9AF7, 0xE99E},{0x9AFB, 0xE99F},{0x9B06, 0xE9A0},{0x9B18, 0xE9A1}, - {0x9B1A, 0xE9A2},{0x9B1F, 0xE9A3},{0x9B22, 0xE9A4},{0x9B23, 0xE9A5},{0x9B25, 0xE9A6},{0x9B27, 0xE9A7},{0x9B28, 0xE9A8},{0x9B29, 0xE9A9}, - {0x9B2A, 0xE9AA},{0x9B2E, 0xE9AB},{0x9B2F, 0xE9AC},{0x9B31, 0x9F54},{0x9B32, 0xE9AD},{0x9B3B, 0xE2F6},{0x9B3C, 0x8B53},{0x9B41, 0x8A40}, - {0x9B42, 0x8DB0},{0x9B43, 0xE9AF},{0x9B44, 0xE9AE},{0x9B45, 0x96A3},{0x9B4D, 0xE9B1},{0x9B4E, 0xE9B2},{0x9B4F, 0xE9B0},{0x9B51, 0xE9B3}, - {0x9B54, 0x9682},{0x9B58, 0xE9B4},{0x9B5A, 0x8B9B},{0x9B6F, 0x9844},{0x9B72, 0xEEE3},{0x9B74, 0xE9B5},{0x9B75, 0xEEE2},{0x9B83, 0xE9B7}, - {0x9B8E, 0x88BC},{0x9B8F, 0xEEE4},{0x9B91, 0xE9B8},{0x9B92, 0x95A9},{0x9B93, 0xE9B6},{0x9B96, 0xE9B9},{0x9B97, 0xE9BA},{0x9B9F, 0xE9BB}, - {0x9BA0, 0xE9BC},{0x9BA8, 0xE9BD},{0x9BAA, 0x968E},{0x9BAB, 0x8E4C},{0x9BAD, 0x8DF8},{0x9BAE, 0x914E},{0x9BB1, 0xEEE5},{0x9BB4, 0xE9BE}, - {0x9BB9, 0xE9C1},{0x9BBB, 0xEEE6},{0x9BC0, 0xE9BF},{0x9BC6, 0xE9C2},{0x9BC9, 0x8CEF},{0x9BCA, 0xE9C0},{0x9BCF, 0xE9C3},{0x9BD1, 0xE9C4}, - {0x9BD2, 0xE9C5},{0x9BD4, 0xE9C9},{0x9BD6, 0x8E49},{0x9BDB, 0x91E2},{0x9BE1, 0xE9CA},{0x9BE2, 0xE9C7},{0x9BE3, 0xE9C6},{0x9BE4, 0xE9C8}, - {0x9BE8, 0x8C7E},{0x9BF0, 0xE9CE},{0x9BF1, 0xE9CD},{0x9BF2, 0xE9CC},{0x9BF5, 0x88B1},{0x9C00, 0xEEE7},{0x9C04, 0xE9D8},{0x9C06, 0xE9D4}, - {0x9C08, 0xE9D5},{0x9C09, 0xE9D1},{0x9C0A, 0xE9D7},{0x9C0C, 0xE9D3},{0x9C0D, 0x8A82},{0x9C10, 0x986B},{0x9C12, 0xE9D6},{0x9C13, 0xE9D2}, - {0x9C14, 0xE9D0},{0x9C15, 0xE9CF},{0x9C1B, 0xE9DA},{0x9C21, 0xE9DD},{0x9C24, 0xE9DC},{0x9C25, 0xE9DB},{0x9C2D, 0x9568},{0x9C2E, 0xE9D9}, - {0x9C2F, 0x88F1},{0x9C30, 0xE9DE},{0x9C32, 0xE9E0},{0x9C39, 0x8A8F},{0x9C3A, 0xE9CB},{0x9C3B, 0x8956},{0x9C3E, 0xE9E2},{0x9C46, 0xE9E1}, - {0x9C47, 0xE9DF},{0x9C48, 0x924C},{0x9C52, 0x9690},{0x9C57, 0x97D8},{0x9C5A, 0xE9E3},{0x9C60, 0xE9E4},{0x9C67, 0xE9E5},{0x9C76, 0xE9E6}, - {0x9C78, 0xE9E7},{0x9CE5, 0x92B9},{0x9CE7, 0xE9E8},{0x9CE9, 0x94B5},{0x9CEB, 0xE9ED},{0x9CEC, 0xE9E9},{0x9CF0, 0xE9EA},{0x9CF3, 0x9650}, - {0x9CF4, 0x96C2},{0x9CF6, 0x93CE},{0x9D03, 0xE9EE},{0x9D06, 0xE9EF},{0x9D07, 0x93BC},{0x9D08, 0xE9EC},{0x9D09, 0xE9EB},{0x9D0E, 0x89A8}, - {0x9D12, 0xE9F7},{0x9D15, 0xE9F6},{0x9D1B, 0x8995},{0x9D1F, 0xE9F4},{0x9D23, 0xE9F3},{0x9D26, 0xE9F1},{0x9D28, 0x8A9B},{0x9D2A, 0xE9F0}, - {0x9D2B, 0x8EB0},{0x9D2C, 0x89A7},{0x9D3B, 0x8D83},{0x9D3E, 0xE9FA},{0x9D3F, 0xE9F9},{0x9D41, 0xE9F8},{0x9D44, 0xE9F5},{0x9D46, 0xE9FB}, - {0x9D48, 0xE9FC},{0x9D50, 0xEA44},{0x9D51, 0xEA43},{0x9D59, 0xEA45},{0x9D5C, 0x894C},{0x9D5D, 0xEA40},{0x9D5E, 0xEA41},{0x9D60, 0x8D94}, - {0x9D61, 0x96B7},{0x9D64, 0xEA42},{0x9D6B, 0xEEE9},{0x9D6C, 0x9651},{0x9D6F, 0xEA4A},{0x9D70, 0xEEE8},{0x9D72, 0xEA46},{0x9D7A, 0xEA4B}, - {0x9D87, 0xEA48},{0x9D89, 0xEA47},{0x9D8F, 0x8C7B},{0x9D9A, 0xEA4C},{0x9DA4, 0xEA4D},{0x9DA9, 0xEA4E},{0x9DAB, 0xEA49},{0x9DAF, 0xE9F2}, - {0x9DB2, 0xEA4F},{0x9DB4, 0x92DF},{0x9DB8, 0xEA53},{0x9DBA, 0xEA54},{0x9DBB, 0xEA52},{0x9DC1, 0xEA51},{0x9DC2, 0xEA57},{0x9DC4, 0xEA50}, - {0x9DC6, 0xEA55},{0x9DCF, 0xEA56},{0x9DD3, 0xEA59},{0x9DD9, 0xEA58},{0x9DE6, 0xEA5B},{0x9DED, 0xEA5C},{0x9DEF, 0xEA5D},{0x9DF2, 0x9868}, - {0x9DF8, 0xEA5A},{0x9DF9, 0x91E9},{0x9DFA, 0x8DEB},{0x9DFD, 0xEA5E},{0x9E19, 0xEEEB},{0x9E1A, 0xEA5F},{0x9E1B, 0xEA60},{0x9E1E, 0xEA61}, - {0x9E75, 0xEA62},{0x9E78, 0x8CB2},{0x9E79, 0xEA63},{0x9E7D, 0xEA64},{0x9E7F, 0x8EAD},{0x9E81, 0xEA65},{0x9E88, 0xEA66},{0x9E8B, 0xEA67}, - {0x9E8C, 0xEA68},{0x9E91, 0xEA6B},{0x9E92, 0xEA69},{0x9E93, 0x985B},{0x9E95, 0xEA6A},{0x9E97, 0x97ED},{0x9E9D, 0xEA6C},{0x9E9F, 0x97D9}, - {0x9EA5, 0xEA6D},{0x9EA6, 0x949E},{0x9EA9, 0xEA6E},{0x9EAA, 0xEA70},{0x9EAD, 0xEA71},{0x9EB8, 0xEA6F},{0x9EB9, 0x8D8D},{0x9EBA, 0x96CB}, - {0x9EBB, 0x9683},{0x9EBC, 0x9BF5},{0x9EBE, 0x9F80},{0x9EBF, 0x969B},{0x9EC4, 0x89A9},{0x9ECC, 0xEA73},{0x9ECD, 0x8B6F},{0x9ECE, 0xEA74}, - {0x9ECF, 0xEA75},{0x9ED0, 0xEA76},{0x9ED1, 0xEEEC},{0x9ED2, 0x8D95},{0x9ED4, 0xEA77},{0x9ED8, 0xE0D2},{0x9ED9, 0x96D9},{0x9EDB, 0x91E1}, - {0x9EDC, 0xEA78},{0x9EDD, 0xEA7A},{0x9EDE, 0xEA79},{0x9EE0, 0xEA7B},{0x9EE5, 0xEA7C},{0x9EE8, 0xEA7D},{0x9EEF, 0xEA7E},{0x9EF4, 0xEA80}, - {0x9EF6, 0xEA81},{0x9EF7, 0xEA82},{0x9EF9, 0xEA83},{0x9EFB, 0xEA84},{0x9EFC, 0xEA85},{0x9EFD, 0xEA86},{0x9F07, 0xEA87},{0x9F08, 0xEA88}, - {0x9F0E, 0x9343},{0x9F13, 0x8CDB},{0x9F15, 0xEA8A},{0x9F20, 0x916C},{0x9F21, 0xEA8B},{0x9F2C, 0xEA8C},{0x9F3B, 0x9540},{0x9F3E, 0xEA8D}, - {0x9F4A, 0xEA8E},{0x9F4B, 0xE256},{0x9F4E, 0xE6D8},{0x9F4F, 0xE8EB},{0x9F52, 0xEA8F},{0x9F54, 0xEA90},{0x9F5F, 0xEA92},{0x9F60, 0xEA93}, - {0x9F61, 0xEA94},{0x9F62, 0x97EE},{0x9F63, 0xEA91},{0x9F66, 0xEA95},{0x9F67, 0xEA96},{0x9F6A, 0xEA98},{0x9F6C, 0xEA97},{0x9F72, 0xEA9A}, - {0x9F76, 0xEA9B},{0x9F77, 0xEA99},{0x9F8D, 0x97B4},{0x9F95, 0xEA9C},{0x9F9C, 0xEA9D},{0x9F9D, 0xE273},{0x9FA0, 0xEA9E},{0xF929, 0xEDC4}, - {0xF9DC, 0xEECD},{0xFA0E, 0xED73},{0xFA0F, 0xED7E},{0xFA10, 0xED80},{0xFA11, 0xED95},{0xFA12, 0xEDBC},{0xFA13, 0xEDCC},{0xFA14, 0xEDCE}, - {0xFA15, 0xEDF9},{0xFA16, 0xEE42},{0xFA17, 0xEE59},{0xFA18, 0xEE61},{0xFA19, 0xEE62},{0xFA1A, 0xEE63},{0xFA1B, 0xEE65},{0xFA1C, 0xEE69}, - {0xFA1D, 0xEE6C},{0xFA1E, 0xEE75},{0xFA1F, 0xEE81},{0xFA20, 0xEE83},{0xFA21, 0xEE84},{0xFA22, 0xEE8D},{0xFA23, 0xEE95},{0xFA24, 0xEE97}, - {0xFA25, 0xEE98},{0xFA26, 0xEE9B},{0xFA27, 0xEEB7},{0xFA28, 0xEEBE},{0xFA29, 0xEECE},{0xFA2A, 0xEEDA},{0xFA2B, 0xEEDB},{0xFA2C, 0xEEDD}, - {0xFA2D, 0xEEEA},{0xFF01, 0x8149},{0xFF02, 0xEEFC},{0xFF03, 0x8194},{0xFF04, 0x8190},{0xFF05, 0x8193},{0xFF06, 0x8195},{0xFF07, 0xEEFB}, - {0xFF08, 0x8169},{0xFF09, 0x816A},{0xFF0A, 0x8196},{0xFF0B, 0x817B},{0xFF0C, 0x8143},{0xFF0D, 0x817C},{0xFF0E, 0x8144},{0xFF0F, 0x815E}, - {0xFF10, 0x824F},{0xFF11, 0x8250},{0xFF12, 0x8251},{0xFF13, 0x8252},{0xFF14, 0x8253},{0xFF15, 0x8254},{0xFF16, 0x8255},{0xFF17, 0x8256}, - {0xFF18, 0x8257},{0xFF19, 0x8258},{0xFF1A, 0x8146},{0xFF1B, 0x8147},{0xFF1C, 0x8183},{0xFF1D, 0x8181},{0xFF1E, 0x8184},{0xFF1F, 0x8148}, - {0xFF20, 0x8197},{0xFF21, 0x8260},{0xFF22, 0x8261},{0xFF23, 0x8262},{0xFF24, 0x8263},{0xFF25, 0x8264},{0xFF26, 0x8265},{0xFF27, 0x8266}, - {0xFF28, 0x8267},{0xFF29, 0x8268},{0xFF2A, 0x8269},{0xFF2B, 0x826A},{0xFF2C, 0x826B},{0xFF2D, 0x826C},{0xFF2E, 0x826D},{0xFF2F, 0x826E}, - {0xFF30, 0x826F},{0xFF31, 0x8270},{0xFF32, 0x8271},{0xFF33, 0x8272},{0xFF34, 0x8273},{0xFF35, 0x8274},{0xFF36, 0x8275},{0xFF37, 0x8276}, - {0xFF38, 0x8277},{0xFF39, 0x8278},{0xFF3A, 0x8279},{0xFF3B, 0x816D},{0xFF3C, 0x815F},{0xFF3D, 0x816E},{0xFF3E, 0x814F},{0xFF3F, 0x8151}, - {0xFF40, 0x814D},{0xFF41, 0x8281},{0xFF42, 0x8282},{0xFF43, 0x8283},{0xFF44, 0x8284},{0xFF45, 0x8285},{0xFF46, 0x8286},{0xFF47, 0x8287}, - {0xFF48, 0x8288},{0xFF49, 0x8289},{0xFF4A, 0x828A},{0xFF4B, 0x828B},{0xFF4C, 0x828C},{0xFF4D, 0x828D},{0xFF4E, 0x828E},{0xFF4F, 0x828F}, - {0xFF50, 0x8290},{0xFF51, 0x8291},{0xFF52, 0x8292},{0xFF53, 0x8293},{0xFF54, 0x8294},{0xFF55, 0x8295},{0xFF56, 0x8296},{0xFF57, 0x8297}, - {0xFF58, 0x8298},{0xFF59, 0x8299},{0xFF5A, 0x829A},{0xFF5B, 0x816F},{0xFF5C, 0x8162},{0xFF5D, 0x8170},{0xFF5E, 0x8160},{0xFF61, 0x00A1}, - {0xFF62, 0x00A2},{0xFF63, 0x00A3},{0xFF64, 0x00A4},{0xFF65, 0x00A5},{0xFF66, 0x00A6},{0xFF67, 0x00A7},{0xFF68, 0x00A8},{0xFF69, 0x00A9}, - {0xFF6A, 0x00AA},{0xFF6B, 0x00AB},{0xFF6C, 0x00AC},{0xFF6D, 0x00AD},{0xFF6E, 0x00AE},{0xFF6F, 0x00AF},{0xFF70, 0x00B0},{0xFF71, 0x00B1}, - {0xFF72, 0x00B2},{0xFF73, 0x00B3},{0xFF74, 0x00B4},{0xFF75, 0x00B5},{0xFF76, 0x00B6},{0xFF77, 0x00B7},{0xFF78, 0x00B8},{0xFF79, 0x00B9}, - {0xFF7A, 0x00BA},{0xFF7B, 0x00BB},{0xFF7C, 0x00BC},{0xFF7D, 0x00BD},{0xFF7E, 0x00BE},{0xFF7F, 0x00BF},{0xFF80, 0x00C0},{0xFF81, 0x00C1}, - {0xFF82, 0x00C2},{0xFF83, 0x00C3},{0xFF84, 0x00C4},{0xFF85, 0x00C5},{0xFF86, 0x00C6},{0xFF87, 0x00C7},{0xFF88, 0x00C8},{0xFF89, 0x00C9}, - {0xFF8A, 0x00CA},{0xFF8B, 0x00CB},{0xFF8C, 0x00CC},{0xFF8D, 0x00CD},{0xFF8E, 0x00CE},{0xFF8F, 0x00CF},{0xFF90, 0x00D0},{0xFF91, 0x00D1}, - {0xFF92, 0x00D2},{0xFF93, 0x00D3},{0xFF94, 0x00D4},{0xFF95, 0x00D5},{0xFF96, 0x00D6},{0xFF97, 0x00D7},{0xFF98, 0x00D8},{0xFF99, 0x00D9}, - {0xFF9A, 0x00DA},{0xFF9B, 0x00DB},{0xFF9C, 0x00DC},{0xFF9D, 0x00DD},{0xFF9E, 0x00DE},{0xFF9F, 0x00DF},{0xFFE0, 0x8191},{0xFFE1, 0x8192}, - {0xFFE2, 0x81CA},{0xFFE3, 0x8150},{0xFFE4, 0xEEFA},{0xFFE5, 0x818F} -}; diff --git a/vcl/source/fontsubset/u2wansung.inc b/vcl/source/fontsubset/u2wansung.inc deleted file mode 100644 index b321c9e58bfa..000000000000 --- a/vcl/source/fontsubset/u2wansung.inc +++ /dev/null @@ -1,1071 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// TODO: use generic RTL_TEXTENCODING_WANSUNG to get rid of this file - -sal_uInt16pair xlat_1_5[8319] = { - {0x0020, 0x0020},{0x0021, 0x0021},{0x0022, 0x0022},{0x0023, 0x0023},{0x0024, 0x0024},{0x0025, 0x0025},{0x0026, 0x0026},{0x0027, 0x0027}, - {0x0028, 0x0028},{0x0029, 0x0029},{0x002A, 0x002A},{0x002B, 0x002B},{0x002C, 0x002C},{0x002D, 0x002D},{0x002E, 0x002E},{0x002F, 0x002F}, - {0x0030, 0x0030},{0x0031, 0x0031},{0x0032, 0x0032},{0x0033, 0x0033},{0x0034, 0x0034},{0x0035, 0x0035},{0x0036, 0x0036},{0x0037, 0x0037}, - {0x0038, 0x0038},{0x0039, 0x0039},{0x003A, 0x003A},{0x003B, 0x003B},{0x003C, 0x003C},{0x003D, 0x003D},{0x003E, 0x003E},{0x003F, 0x003F}, - {0x0040, 0x0040},{0x0041, 0x0041},{0x0042, 0x0042},{0x0043, 0x0043},{0x0044, 0x0044},{0x0045, 0x0045},{0x0046, 0x0046},{0x0047, 0x0047}, - {0x0048, 0x0048},{0x0049, 0x0049},{0x004A, 0x004A},{0x004B, 0x004B},{0x004C, 0x004C},{0x004D, 0x004D},{0x004E, 0x004E},{0x004F, 0x004F}, - {0x0050, 0x0050},{0x0051, 0x0051},{0x0052, 0x0052},{0x0053, 0x0053},{0x0054, 0x0054},{0x0055, 0x0055},{0x0056, 0x0056},{0x0057, 0x0057}, - {0x0058, 0x0058},{0x0059, 0x0059},{0x005A, 0x005A},{0x005B, 0x005B},{0x005C, 0x005C},{0x005D, 0x005D},{0x005E, 0x005E},{0x005F, 0x005F}, - {0x0060, 0x0060},{0x0061, 0x0061},{0x0062, 0x0062},{0x0063, 0x0063},{0x0064, 0x0064},{0x0065, 0x0065},{0x0066, 0x0066},{0x0067, 0x0067}, - {0x0068, 0x0068},{0x0069, 0x0069},{0x006A, 0x006A},{0x006B, 0x006B},{0x006C, 0x006C},{0x006D, 0x006D},{0x006E, 0x006E},{0x006F, 0x006F}, - {0x0070, 0x0070},{0x0071, 0x0071},{0x0072, 0x0072},{0x0073, 0x0073},{0x0074, 0x0074},{0x0075, 0x0075},{0x0076, 0x0076},{0x0077, 0x0077}, - {0x0078, 0x0078},{0x0079, 0x0079},{0x007A, 0x007A},{0x007B, 0x007B},{0x007C, 0x007C},{0x007D, 0x007D},{0x007E, 0x007E},{0x00A1, 0xA2AE}, - {0x00A4, 0xA2B4},{0x00A7, 0xA1D7},{0x00A8, 0xA1A7},{0x00AA, 0xA8A3},{0x00AD, 0xA1A9},{0x00B0, 0xA1C6},{0x00B1, 0xA1BE},{0x00B2, 0xA9F7}, - {0x00B3, 0xA9F8},{0x00B4, 0xA2A5},{0x00B6, 0xA2D2},{0x00B7, 0xA1A4},{0x00B8, 0xA2AC},{0x00B9, 0xA9F6},{0x00BA, 0xA8AC},{0x00BC, 0xA8F9}, - {0x00BD, 0xA8F6},{0x00BE, 0xA8FA},{0x00BF, 0xA2AF},{0x00C6, 0xA8A1},{0x00D0, 0xA8A2},{0x00D7, 0xA1BF},{0x00D8, 0xA8AA},{0x00DE, 0xA8AD}, - {0x00DF, 0xA9AC},{0x00E6, 0xA9A1},{0x00F0, 0xA9A3},{0x00F7, 0xA1C0},{0x00F8, 0xA9AA},{0x00FE, 0xA9AD},{0x0111, 0xA9A2},{0x0126, 0xA8A4}, - {0x0127, 0xA9A4},{0x0131, 0xA9A5},{0x0132, 0xA8A6},{0x0133, 0xA9A6},{0x0138, 0xA9A7},{0x013F, 0xA8A8},{0x0140, 0xA9A8},{0x0141, 0xA8A9}, - {0x0142, 0xA9A9},{0x0149, 0xA9B0},{0x014A, 0xA8AF},{0x014B, 0xA9AF},{0x0152, 0xA8AB},{0x0153, 0xA9AB},{0x0166, 0xA8AE},{0x0167, 0xA9AE}, - {0x02C7, 0xA2A7},{0x02D0, 0xA2B0},{0x02D8, 0xA2A8},{0x02D9, 0xA2AB},{0x02DA, 0xA2AA},{0x02DB, 0xA2AD},{0x02DD, 0xA2A9},{0x0391, 0xA5C1}, - {0x0392, 0xA5C2},{0x0393, 0xA5C3},{0x0394, 0xA5C4},{0x0395, 0xA5C5},{0x0396, 0xA5C6},{0x0397, 0xA5C7},{0x0398, 0xA5C8},{0x0399, 0xA5C9}, - {0x039A, 0xA5CA},{0x039B, 0xA5CB},{0x039C, 0xA5CC},{0x039D, 0xA5CD},{0x039E, 0xA5CE},{0x039F, 0xA5CF},{0x03A0, 0xA5D0},{0x03A1, 0xA5D1}, - {0x03A3, 0xA5D2},{0x03A4, 0xA5D3},{0x03A5, 0xA5D4},{0x03A6, 0xA5D5},{0x03A7, 0xA5D6},{0x03A8, 0xA5D7},{0x03A9, 0xA5D8},{0x03B1, 0xA5E1}, - {0x03B2, 0xA5E2},{0x03B3, 0xA5E3},{0x03B4, 0xA5E4},{0x03B5, 0xA5E5},{0x03B6, 0xA5E6},{0x03B7, 0xA5E7},{0x03B8, 0xA5E8},{0x03B9, 0xA5E9}, - {0x03BA, 0xA5EA},{0x03BB, 0xA5EB},{0x03BC, 0xA5EC},{0x03BD, 0xA5ED},{0x03BE, 0xA5EE},{0x03BF, 0xA5EF},{0x03C0, 0xA5F0},{0x03C1, 0xA5F1}, - {0x03C3, 0xA5F2},{0x03C4, 0xA5F3},{0x03C5, 0xA5F4},{0x03C6, 0xA5F5},{0x03C7, 0xA5F6},{0x03C8, 0xA5F7},{0x03C9, 0xA5F8},{0x0401, 0xACA7}, - {0x0410, 0xACA1},{0x0411, 0xACA2},{0x0412, 0xACA3},{0x0413, 0xACA4},{0x0414, 0xACA5},{0x0415, 0xACA6},{0x0416, 0xACA8},{0x0417, 0xACA9}, - {0x0418, 0xACAA},{0x0419, 0xACAB},{0x041A, 0xACAC},{0x041B, 0xACAD},{0x041C, 0xACAE},{0x041D, 0xACAF},{0x041E, 0xACB0},{0x041F, 0xACB1}, - {0x0420, 0xACB2},{0x0421, 0xACB3},{0x0422, 0xACB4},{0x0423, 0xACB5},{0x0424, 0xACB6},{0x0425, 0xACB7},{0x0426, 0xACB8},{0x0427, 0xACB9}, - {0x0428, 0xACBA},{0x0429, 0xACBB},{0x042A, 0xACBC},{0x042B, 0xACBD},{0x042C, 0xACBE},{0x042D, 0xACBF},{0x042E, 0xACC0},{0x042F, 0xACC1}, - {0x0430, 0xACD1},{0x0431, 0xACD2},{0x0432, 0xACD3},{0x0433, 0xACD4},{0x0434, 0xACD5},{0x0435, 0xACD6},{0x0436, 0xACD8},{0x0437, 0xACD9}, - {0x0438, 0xACDA},{0x0439, 0xACDB},{0x043A, 0xACDC},{0x043B, 0xACDD},{0x043C, 0xACDE},{0x043D, 0xACDF},{0x043E, 0xACE0},{0x043F, 0xACE1}, - {0x0440, 0xACE2},{0x0441, 0xACE3},{0x0442, 0xACE4},{0x0443, 0xACE5},{0x0444, 0xACE6},{0x0445, 0xACE7},{0x0446, 0xACE8},{0x0447, 0xACE9}, - {0x0448, 0xACEA},{0x0449, 0xACEB},{0x044A, 0xACEC},{0x044B, 0xACED},{0x044C, 0xACEE},{0x044D, 0xACEF},{0x044E, 0xACF0},{0x044F, 0xACF1}, - {0x0451, 0xACD7},{0x2015, 0xA1AA},{0x2018, 0xA1AE},{0x2019, 0xA1AF},{0x201C, 0xA1B0},{0x201D, 0xA1B1},{0x2020, 0xA2D3},{0x2021, 0xA2D4}, - {0x2025, 0xA1A5},{0x2026, 0xA1A6},{0x2030, 0xA2B6},{0x2032, 0xA1C7},{0x2033, 0xA1C8},{0x203B, 0xA1D8},{0x2074, 0xA9F9},{0x207F, 0xA9FA}, - {0x2081, 0xA9FB},{0x2082, 0xA9FC},{0x2083, 0xA9FD},{0x2084, 0xA9FE},{0x2103, 0xA1C9},{0x2109, 0xA2B5},{0x2113, 0xA7A4},{0x2116, 0xA2E0}, - {0x2121, 0xA2E5},{0x2122, 0xA2E2},{0x2126, 0xA7D9},{0x212B, 0xA1CA},{0x2153, 0xA8F7},{0x2154, 0xA8F8},{0x215B, 0xA8FB},{0x215C, 0xA8FC}, - {0x215D, 0xA8FD},{0x215E, 0xA8FE},{0x2160, 0xA5B0},{0x2161, 0xA5B1},{0x2162, 0xA5B2},{0x2163, 0xA5B3},{0x2164, 0xA5B4},{0x2165, 0xA5B5}, - {0x2166, 0xA5B6},{0x2167, 0xA5B7},{0x2168, 0xA5B8},{0x2169, 0xA5B9},{0x2170, 0xA5A1},{0x2171, 0xA5A2},{0x2172, 0xA5A3},{0x2173, 0xA5A4}, - {0x2174, 0xA5A5},{0x2175, 0xA5A6},{0x2176, 0xA5A7},{0x2177, 0xA5A8},{0x2178, 0xA5A9},{0x2179, 0xA5AA},{0x2190, 0xA1E7},{0x2191, 0xA1E8}, - {0x2192, 0xA1E6},{0x2193, 0xA1E9},{0x2194, 0xA1EA},{0x2195, 0xA2D5},{0x2196, 0xA2D8},{0x2197, 0xA2D6},{0x2198, 0xA2D9},{0x2199, 0xA2D7}, - {0x21D2, 0xA2A1},{0x21D4, 0xA2A2},{0x2200, 0xA2A3},{0x2202, 0xA1D3},{0x2203, 0xA2A4},{0x2207, 0xA1D4},{0x2208, 0xA1F4},{0x220B, 0xA1F5}, - {0x220F, 0xA2B3},{0x2211, 0xA2B2},{0x221A, 0xA1EE},{0x221D, 0xA1F0},{0x221E, 0xA1C4},{0x2220, 0xA1D0},{0x2225, 0xA1AB},{0x2227, 0xA1FC}, - {0x2228, 0xA1FD},{0x2229, 0xA1FB},{0x222A, 0xA1FA},{0x222B, 0xA1F2},{0x222C, 0xA1F3},{0x222E, 0xA2B1},{0x2234, 0xA1C5},{0x2235, 0xA1F1}, - {0x223C, 0xA1AD},{0x223D, 0xA1EF},{0x2252, 0xA1D6},{0x2260, 0xA1C1},{0x2261, 0xA1D5},{0x2264, 0xA1C2},{0x2265, 0xA1C3},{0x226A, 0xA1EC}, - {0x226B, 0xA1ED},{0x2282, 0xA1F8},{0x2283, 0xA1F9},{0x2286, 0xA1F6},{0x2287, 0xA1F7},{0x2299, 0xA2C1},{0x22A5, 0xA1D1},{0x2312, 0xA1D2}, - {0x2460, 0xA8E7},{0x2461, 0xA8E8},{0x2462, 0xA8E9},{0x2463, 0xA8EA},{0x2464, 0xA8EB},{0x2465, 0xA8EC},{0x2466, 0xA8ED},{0x2467, 0xA8EE}, - {0x2468, 0xA8EF},{0x2469, 0xA8F0},{0x246A, 0xA8F1},{0x246B, 0xA8F2},{0x246C, 0xA8F3},{0x246D, 0xA8F4},{0x246E, 0xA8F5},{0x2474, 0xA9E7}, - {0x2475, 0xA9E8},{0x2476, 0xA9E9},{0x2477, 0xA9EA},{0x2478, 0xA9EB},{0x2479, 0xA9EC},{0x247A, 0xA9ED},{0x247B, 0xA9EE},{0x247C, 0xA9EF}, - {0x247D, 0xA9F0},{0x247E, 0xA9F1},{0x247F, 0xA9F2},{0x2480, 0xA9F3},{0x2481, 0xA9F4},{0x2482, 0xA9F5},{0x249C, 0xA9CD},{0x249D, 0xA9CE}, - {0x249E, 0xA9CF},{0x249F, 0xA9D0},{0x24A0, 0xA9D1},{0x24A1, 0xA9D2},{0x24A2, 0xA9D3},{0x24A3, 0xA9D4},{0x24A4, 0xA9D5},{0x24A5, 0xA9D6}, - {0x24A6, 0xA9D7},{0x24A7, 0xA9D8},{0x24A8, 0xA9D9},{0x24A9, 0xA9DA},{0x24AA, 0xA9DB},{0x24AB, 0xA9DC},{0x24AC, 0xA9DD},{0x24AD, 0xA9DE}, - {0x24AE, 0xA9DF},{0x24AF, 0xA9E0},{0x24B0, 0xA9E1},{0x24B1, 0xA9E2},{0x24B2, 0xA9E3},{0x24B3, 0xA9E4},{0x24B4, 0xA9E5},{0x24B5, 0xA9E6}, - {0x24D0, 0xA8CD},{0x24D1, 0xA8CE},{0x24D2, 0xA8CF},{0x24D3, 0xA8D0},{0x24D4, 0xA8D1},{0x24D5, 0xA8D2},{0x24D6, 0xA8D3},{0x24D7, 0xA8D4}, - {0x24D8, 0xA8D5},{0x24D9, 0xA8D6},{0x24DA, 0xA8D7},{0x24DB, 0xA8D8},{0x24DC, 0xA8D9},{0x24DD, 0xA8DA},{0x24DE, 0xA8DB},{0x24DF, 0xA8DC}, - {0x24E0, 0xA8DD},{0x24E1, 0xA8DE},{0x24E2, 0xA8DF},{0x24E3, 0xA8E0},{0x24E4, 0xA8E1},{0x24E5, 0xA8E2},{0x24E6, 0xA8E3},{0x24E7, 0xA8E4}, - {0x24E8, 0xA8E5},{0x24E9, 0xA8E6},{0x2500, 0xA6A1},{0x2501, 0xA6AC},{0x2502, 0xA6A2},{0x2503, 0xA6AD},{0x250C, 0xA6A3},{0x250D, 0xA6C8}, - {0x250E, 0xA6C7},{0x250F, 0xA6AE},{0x2510, 0xA6A4},{0x2511, 0xA6C2},{0x2512, 0xA6C1},{0x2513, 0xA6AF},{0x2514, 0xA6A6},{0x2515, 0xA6C6}, - {0x2516, 0xA6C5},{0x2517, 0xA6B1},{0x2518, 0xA6A5},{0x2519, 0xA6C4},{0x251A, 0xA6C3},{0x251B, 0xA6B0},{0x251C, 0xA6A7},{0x251D, 0xA6BC}, - {0x251E, 0xA6C9},{0x251F, 0xA6CA},{0x2520, 0xA6B7},{0x2521, 0xA6CB},{0x2522, 0xA6CC},{0x2523, 0xA6B2},{0x2524, 0xA6A9},{0x2525, 0xA6BE}, - {0x2526, 0xA6CD},{0x2527, 0xA6CE},{0x2528, 0xA6B9},{0x2529, 0xA6CF},{0x252A, 0xA6D0},{0x252B, 0xA6B4},{0x252C, 0xA6A8},{0x252D, 0xA6D1}, - {0x252E, 0xA6D2},{0x252F, 0xA6B8},{0x2530, 0xA6BD},{0x2531, 0xA6D3},{0x2532, 0xA6D4},{0x2533, 0xA6B3},{0x2534, 0xA6AA},{0x2535, 0xA6D5}, - {0x2536, 0xA6D6},{0x2537, 0xA6BA},{0x2538, 0xA6BF},{0x2539, 0xA6D7},{0x253A, 0xA6D8},{0x253B, 0xA6B5},{0x253C, 0xA6AB},{0x253D, 0xA6D9}, - {0x253E, 0xA6DA},{0x253F, 0xA6BB},{0x2540, 0xA6DB},{0x2541, 0xA6DC},{0x2542, 0xA6C0},{0x2543, 0xA6DD},{0x2544, 0xA6DE},{0x2545, 0xA6DF}, - {0x2546, 0xA6E0},{0x2547, 0xA6E1},{0x2548, 0xA6E2},{0x2549, 0xA6E3},{0x254A, 0xA6E4},{0x254B, 0xA6B6},{0x2592, 0xA2C6},{0x25A0, 0xA1E1}, - {0x25A1, 0xA1E0},{0x25A3, 0xA2C3},{0x25A4, 0xA2C7},{0x25A5, 0xA2C8},{0x25A6, 0xA2CB},{0x25A7, 0xA2CA},{0x25A8, 0xA2C9},{0x25A9, 0xA2CC}, - {0x25B2, 0xA1E3},{0x25B3, 0xA1E2},{0x25B6, 0xA2BA},{0x25B7, 0xA2B9},{0x25BC, 0xA1E5},{0x25BD, 0xA1E4},{0x25C0, 0xA2B8},{0x25C1, 0xA2B7}, - {0x25C6, 0xA1DF},{0x25C7, 0xA1DE},{0x25C8, 0xA2C2},{0x25CB, 0xA1DB},{0x25CE, 0xA1DD},{0x25CF, 0xA1DC},{0x25D0, 0xA2C4},{0x25D1, 0xA2C5}, - {0x2605, 0xA1DA},{0x2606, 0xA1D9},{0x260E, 0xA2CF},{0x260F, 0xA2CE},{0x261C, 0xA2D0},{0x261E, 0xA2D1},{0x2640, 0xA1CF},{0x2642, 0xA1CE}, - {0x2660, 0xA2BC},{0x2661, 0xA2BD},{0x2663, 0xA2C0},{0x2664, 0xA2BB},{0x2665, 0xA2BE},{0x2667, 0xA2BF},{0x2668, 0xA2CD},{0x2669, 0xA2DB}, - {0x266A, 0xA2DC},{0x266C, 0xA2DD},{0x266D, 0xA2DA},{0x3000, 0xA1A1},{0x3001, 0xA1A2},{0x3002, 0xA1A3},{0x3003, 0xA1A8},{0x3008, 0xA1B4}, - {0x3009, 0xA1B5},{0x300A, 0xA1B6},{0x300B, 0xA1B7},{0x300C, 0xA1B8},{0x300D, 0xA1B9},{0x300E, 0xA1BA},{0x300F, 0xA1BB},{0x3010, 0xA1BC}, - {0x3011, 0xA1BD},{0x3013, 0xA1EB},{0x3014, 0xA1B2},{0x3015, 0xA1B3},{0x3041, 0xAAA1},{0x3042, 0xAAA2},{0x3043, 0xAAA3},{0x3044, 0xAAA4}, - {0x3045, 0xAAA5},{0x3046, 0xAAA6},{0x3047, 0xAAA7},{0x3048, 0xAAA8},{0x3049, 0xAAA9},{0x304A, 0xAAAA},{0x304B, 0xAAAB},{0x304C, 0xAAAC}, - {0x304D, 0xAAAD},{0x304E, 0xAAAE},{0x304F, 0xAAAF},{0x3050, 0xAAB0},{0x3051, 0xAAB1},{0x3052, 0xAAB2},{0x3053, 0xAAB3},{0x3054, 0xAAB4}, - {0x3055, 0xAAB5},{0x3056, 0xAAB6},{0x3057, 0xAAB7},{0x3058, 0xAAB8},{0x3059, 0xAAB9},{0x305A, 0xAABA},{0x305B, 0xAABB},{0x305C, 0xAABC}, - {0x305D, 0xAABD},{0x305E, 0xAABE},{0x305F, 0xAABF},{0x3060, 0xAAC0},{0x3061, 0xAAC1},{0x3062, 0xAAC2},{0x3063, 0xAAC3},{0x3064, 0xAAC4}, - {0x3065, 0xAAC5},{0x3066, 0xAAC6},{0x3067, 0xAAC7},{0x3068, 0xAAC8},{0x3069, 0xAAC9},{0x306A, 0xAACA},{0x306B, 0xAACB},{0x306C, 0xAACC}, - {0x306D, 0xAACD},{0x306E, 0xAACE},{0x306F, 0xAACF},{0x3070, 0xAAD0},{0x3071, 0xAAD1},{0x3072, 0xAAD2},{0x3073, 0xAAD3},{0x3074, 0xAAD4}, - {0x3075, 0xAAD5},{0x3076, 0xAAD6},{0x3077, 0xAAD7},{0x3078, 0xAAD8},{0x3079, 0xAAD9},{0x307A, 0xAADA},{0x307B, 0xAADB},{0x307C, 0xAADC}, - {0x307D, 0xAADD},{0x307E, 0xAADE},{0x307F, 0xAADF},{0x3080, 0xAAE0},{0x3081, 0xAAE1},{0x3082, 0xAAE2},{0x3083, 0xAAE3},{0x3084, 0xAAE4}, - {0x3085, 0xAAE5},{0x3086, 0xAAE6},{0x3087, 0xAAE7},{0x3088, 0xAAE8},{0x3089, 0xAAE9},{0x308A, 0xAAEA},{0x308B, 0xAAEB},{0x308C, 0xAAEC}, - {0x308D, 0xAAED},{0x308E, 0xAAEE},{0x308F, 0xAAEF},{0x3090, 0xAAF0},{0x3091, 0xAAF1},{0x3092, 0xAAF2},{0x3093, 0xAAF3},{0x30A1, 0xABA1}, - {0x30A2, 0xABA2},{0x30A3, 0xABA3},{0x30A4, 0xABA4},{0x30A5, 0xABA5},{0x30A6, 0xABA6},{0x30A7, 0xABA7},{0x30A8, 0xABA8},{0x30A9, 0xABA9}, - {0x30AA, 0xABAA},{0x30AB, 0xABAB},{0x30AC, 0xABAC},{0x30AD, 0xABAD},{0x30AE, 0xABAE},{0x30AF, 0xABAF},{0x30B0, 0xABB0},{0x30B1, 0xABB1}, - {0x30B2, 0xABB2},{0x30B3, 0xABB3},{0x30B4, 0xABB4},{0x30B5, 0xABB5},{0x30B6, 0xABB6},{0x30B7, 0xABB7},{0x30B8, 0xABB8},{0x30B9, 0xABB9}, - {0x30BA, 0xABBA},{0x30BB, 0xABBB},{0x30BC, 0xABBC},{0x30BD, 0xABBD},{0x30BE, 0xABBE},{0x30BF, 0xABBF},{0x30C0, 0xABC0},{0x30C1, 0xABC1}, - {0x30C2, 0xABC2},{0x30C3, 0xABC3},{0x30C4, 0xABC4},{0x30C5, 0xABC5},{0x30C6, 0xABC6},{0x30C7, 0xABC7},{0x30C8, 0xABC8},{0x30C9, 0xABC9}, - {0x30CA, 0xABCA},{0x30CB, 0xABCB},{0x30CC, 0xABCC},{0x30CD, 0xABCD},{0x30CE, 0xABCE},{0x30CF, 0xABCF},{0x30D0, 0xABD0},{0x30D1, 0xABD1}, - {0x30D2, 0xABD2},{0x30D3, 0xABD3},{0x30D4, 0xABD4},{0x30D5, 0xABD5},{0x30D6, 0xABD6},{0x30D7, 0xABD7},{0x30D8, 0xABD8},{0x30D9, 0xABD9}, - {0x30DA, 0xABDA},{0x30DB, 0xABDB},{0x30DC, 0xABDC},{0x30DD, 0xABDD},{0x30DE, 0xABDE},{0x30DF, 0xABDF},{0x30E0, 0xABE0},{0x30E1, 0xABE1}, - {0x30E2, 0xABE2},{0x30E3, 0xABE3},{0x30E4, 0xABE4},{0x30E5, 0xABE5},{0x30E6, 0xABE6},{0x30E7, 0xABE7},{0x30E8, 0xABE8},{0x30E9, 0xABE9}, - {0x30EA, 0xABEA},{0x30EB, 0xABEB},{0x30EC, 0xABEC},{0x30ED, 0xABED},{0x30EE, 0xABEE},{0x30EF, 0xABEF},{0x30F0, 0xABF0},{0x30F1, 0xABF1}, - {0x30F2, 0xABF2},{0x30F3, 0xABF3},{0x30F4, 0xABF4},{0x30F5, 0xABF5},{0x30F6, 0xABF6},{0x3131, 0xA4A1},{0x3132, 0xA4A2},{0x3133, 0xA4A3}, - {0x3134, 0xA4A4},{0x3135, 0xA4A5},{0x3136, 0xA4A6},{0x3137, 0xA4A7},{0x3138, 0xA4A8},{0x3139, 0xA4A9},{0x313A, 0xA4AA},{0x313B, 0xA4AB}, - {0x313C, 0xA4AC},{0x313D, 0xA4AD},{0x313E, 0xA4AE},{0x313F, 0xA4AF},{0x3140, 0xA4B0},{0x3141, 0xA4B1},{0x3142, 0xA4B2},{0x3143, 0xA4B3}, - {0x3144, 0xA4B4},{0x3145, 0xA4B5},{0x3146, 0xA4B6},{0x3147, 0xA4B7},{0x3148, 0xA4B8},{0x3149, 0xA4B9},{0x314A, 0xA4BA},{0x314B, 0xA4BB}, - {0x314C, 0xA4BC},{0x314D, 0xA4BD},{0x314E, 0xA4BE},{0x314F, 0xA4BF},{0x3150, 0xA4C0},{0x3151, 0xA4C1},{0x3152, 0xA4C2},{0x3153, 0xA4C3}, - {0x3154, 0xA4C4},{0x3155, 0xA4C5},{0x3156, 0xA4C6},{0x3157, 0xA4C7},{0x3158, 0xA4C8},{0x3159, 0xA4C9},{0x315A, 0xA4CA},{0x315B, 0xA4CB}, - {0x315C, 0xA4CC},{0x315D, 0xA4CD},{0x315E, 0xA4CE},{0x315F, 0xA4CF},{0x3160, 0xA4D0},{0x3161, 0xA4D1},{0x3162, 0xA4D2},{0x3163, 0xA4D3}, - {0x3164, 0xA4D4},{0x3165, 0xA4D5},{0x3166, 0xA4D6},{0x3167, 0xA4D7},{0x3168, 0xA4D8},{0x3169, 0xA4D9},{0x316A, 0xA4DA},{0x316B, 0xA4DB}, - {0x316C, 0xA4DC},{0x316D, 0xA4DD},{0x316E, 0xA4DE},{0x316F, 0xA4DF},{0x3170, 0xA4E0},{0x3171, 0xA4E1},{0x3172, 0xA4E2},{0x3173, 0xA4E3}, - {0x3174, 0xA4E4},{0x3175, 0xA4E5},{0x3176, 0xA4E6},{0x3177, 0xA4E7},{0x3178, 0xA4E8},{0x3179, 0xA4E9},{0x317A, 0xA4EA},{0x317B, 0xA4EB}, - {0x317C, 0xA4EC},{0x317D, 0xA4ED},{0x317E, 0xA4EE},{0x317F, 0xA4EF},{0x3180, 0xA4F0},{0x3181, 0xA4F1},{0x3182, 0xA4F2},{0x3183, 0xA4F3}, - {0x3184, 0xA4F4},{0x3185, 0xA4F5},{0x3186, 0xA4F6},{0x3187, 0xA4F7},{0x3188, 0xA4F8},{0x3189, 0xA4F9},{0x318A, 0xA4FA},{0x318B, 0xA4FB}, - {0x318C, 0xA4FC},{0x318D, 0xA4FD},{0x318E, 0xA4FE},{0x3200, 0xA9B1},{0x3201, 0xA9B2},{0x3202, 0xA9B3},{0x3203, 0xA9B4},{0x3204, 0xA9B5}, - {0x3205, 0xA9B6},{0x3206, 0xA9B7},{0x3207, 0xA9B8},{0x3208, 0xA9B9},{0x3209, 0xA9BA},{0x320A, 0xA9BB},{0x320B, 0xA9BC},{0x320C, 0xA9BD}, - {0x320D, 0xA9BE},{0x320E, 0xA9BF},{0x320F, 0xA9C0},{0x3210, 0xA9C1},{0x3211, 0xA9C2},{0x3212, 0xA9C3},{0x3213, 0xA9C4},{0x3214, 0xA9C5}, - {0x3215, 0xA9C6},{0x3216, 0xA9C7},{0x3217, 0xA9C8},{0x3218, 0xA9C9},{0x3219, 0xA9CA},{0x321A, 0xA9CB},{0x321B, 0xA9CC},{0x321C, 0xA2DF}, - {0x3260, 0xA8B1},{0x3261, 0xA8B2},{0x3262, 0xA8B3},{0x3263, 0xA8B4},{0x3264, 0xA8B5},{0x3265, 0xA8B6},{0x3266, 0xA8B7},{0x3267, 0xA8B8}, - {0x3268, 0xA8B9},{0x3269, 0xA8BA},{0x326A, 0xA8BB},{0x326B, 0xA8BC},{0x326C, 0xA8BD},{0x326D, 0xA8BE},{0x326E, 0xA8BF},{0x326F, 0xA8C0}, - {0x3270, 0xA8C1},{0x3271, 0xA8C2},{0x3272, 0xA8C3},{0x3273, 0xA8C4},{0x3274, 0xA8C5},{0x3275, 0xA8C6},{0x3276, 0xA8C7},{0x3277, 0xA8C8}, - {0x3278, 0xA8C9},{0x3279, 0xA8CA},{0x327A, 0xA8CB},{0x327B, 0xA8CC},{0x327F, 0xA2DE},{0x3380, 0xA7C9},{0x3381, 0xA7CA},{0x3382, 0xA7CB}, - {0x3383, 0xA7CC},{0x3384, 0xA7CD},{0x3388, 0xA7BA},{0x3389, 0xA7BB},{0x338A, 0xA7DC},{0x338B, 0xA7DD},{0x338C, 0xA7DE},{0x338D, 0xA7B6}, - {0x338E, 0xA7B7},{0x338F, 0xA7B8},{0x3390, 0xA7D4},{0x3391, 0xA7D5},{0x3392, 0xA7D6},{0x3393, 0xA7D7},{0x3394, 0xA7D8},{0x3395, 0xA7A1}, - {0x3396, 0xA7A2},{0x3397, 0xA7A3},{0x3398, 0xA7A5},{0x3399, 0xA7AB},{0x339A, 0xA7AC},{0x339B, 0xA7AD},{0x339C, 0xA7AE},{0x339D, 0xA7AF}, - {0x339E, 0xA7B0},{0x339F, 0xA7B1},{0x33A0, 0xA7B2},{0x33A1, 0xA7B3},{0x33A2, 0xA7B4},{0x33A3, 0xA7A7},{0x33A4, 0xA7A8},{0x33A5, 0xA7A9}, - {0x33A6, 0xA7AA},{0x33A7, 0xA7BD},{0x33A8, 0xA7BE},{0x33A9, 0xA7E5},{0x33AA, 0xA7E6},{0x33AB, 0xA7E7},{0x33AC, 0xA7E8},{0x33AD, 0xA7E1}, - {0x33AE, 0xA7E2},{0x33AF, 0xA7E3},{0x33B0, 0xA7BF},{0x33B1, 0xA7C0},{0x33B2, 0xA7C1},{0x33B3, 0xA7C2},{0x33B4, 0xA7C3},{0x33B5, 0xA7C4}, - {0x33B6, 0xA7C5},{0x33B7, 0xA7C6},{0x33B8, 0xA7C7},{0x33B9, 0xA7C8},{0x33BA, 0xA7CE},{0x33BB, 0xA7CF},{0x33BC, 0xA7D0},{0x33BD, 0xA7D1}, - {0x33BE, 0xA7D2},{0x33BF, 0xA7D3},{0x33C0, 0xA7DA},{0x33C1, 0xA7DB},{0x33C2, 0xA2E3},{0x33C3, 0xA7EC},{0x33C4, 0xA7A6},{0x33C5, 0xA7E0}, - {0x33C6, 0xA7EF},{0x33C7, 0xA2E1},{0x33C8, 0xA7BC},{0x33C9, 0xA7ED},{0x33CA, 0xA7B5},{0x33CF, 0xA7B9},{0x33D0, 0xA7EA},{0x33D3, 0xA7EB}, - {0x33D6, 0xA7DF},{0x33D8, 0xA2E4},{0x33DB, 0xA7E4},{0x33DC, 0xA7EE},{0x33DD, 0xA7E9},{0x4E00, 0xECE9},{0x4E01, 0xEFCB},{0x4E03, 0xF6D2}, - {0x4E07, 0xD8B2},{0x4E08, 0xEDDB},{0x4E09, 0xDFB2},{0x4E0A, 0xDFBE},{0x4E0B, 0xF9BB},{0x4E0D, 0xDCF4},{0x4E11, 0xF5E4},{0x4E14, 0xF3A6}, - {0x4E15, 0xDDE0},{0x4E16, 0xE1A6},{0x4E18, 0xCEF8},{0x4E19, 0xDCB0},{0x4E1E, 0xE3AA},{0x4E2D, 0xF1E9},{0x4E32, 0xCDFA},{0x4E38, 0xFCAF}, - {0x4E39, 0xD3A1},{0x4E3B, 0xF1AB},{0x4E42, 0xE7D1},{0x4E43, 0xD2AC},{0x4E45, 0xCEF9},{0x4E4B, 0xF1FD},{0x4E4D, 0xDEBF},{0x4E4E, 0xFBBA}, - {0x4E4F, 0xF9B9},{0x4E56, 0xCED2},{0x4E58, 0xE3AB},{0x4E59, 0xEBE0},{0x4E5D, 0xCEFA},{0x4E5E, 0xCBF7},{0x4E5F, 0xE5A5},{0x4E6B, 0xCAE1}, - {0x4E6D, 0xD4CC},{0x4E73, 0xEAE1},{0x4E76, 0xDCE3},{0x4E77, 0xDFAD},{0x4E7E, 0xCBEB},{0x4E82, 0xD5AF},{0x4E86, 0xD6F5},{0x4E88, 0xE5F8}, - {0x4E8B, 0xDEC0},{0x4E8C, 0xECA3},{0x4E8E, 0xE9CD},{0x4E90, 0xEAA7},{0x4E91, 0xE9F6},{0x4E92, 0xFBBB},{0x4E94, 0xE7E9},{0x4E95, 0xEFCC}, - {0x4E98, 0xD0E6},{0x4E9B, 0xDEC1},{0x4E9E, 0xE4AC},{0x4EA1, 0xD8CC},{0x4EA2, 0xF9F1},{0x4EA4, 0xCEDF},{0x4EA5, 0xFAA4},{0x4EA6, 0xE6B2}, - {0x4EA8, 0xFAFB},{0x4EAB, 0xFABD},{0x4EAC, 0xCCC8},{0x4EAD, 0xEFCD},{0x4EAE, 0xD5D5},{0x4EB6, 0xD3A2},{0x4EBA, 0xECD1},{0x4EC0, 0xE4A7}, - {0x4EC1, 0xECD2},{0x4EC4, 0xF6B1},{0x4EC7, 0xCEFB},{0x4ECA, 0xD0D1},{0x4ECB, 0xCBBF},{0x4ECD, 0xEDA4},{0x4ED4, 0xEDA8},{0x4ED5, 0xDEC2}, - {0x4ED6, 0xF6E2},{0x4ED7, 0xEDDC},{0x4ED8, 0xDCF5},{0x4ED9, 0xE0B9},{0x4EDD, 0xD4CE},{0x4EDF, 0xF4B5},{0x4EE3, 0xD3DB},{0x4EE4, 0xD6B5}, - {0x4EE5, 0xECA4},{0x4EF0, 0xE4E6},{0x4EF2, 0xF1EA},{0x4EF6, 0xCBEC},{0x4EF7, 0xCBC0},{0x4EFB, 0xECF2},{0x4F01, 0xD0EA},{0x4F09, 0xF9F2}, - {0x4F0A, 0xECA5},{0x4F0B, 0xD0DF},{0x4F0D, 0xE7EA},{0x4F0E, 0xD0EB},{0x4F0F, 0xDCD1},{0x4F10, 0xDBE9},{0x4F11, 0xFDCC},{0x4F2F, 0xDBD7}, - {0x4F34, 0xDAE1},{0x4F36, 0xD6B6},{0x4F38, 0xE3DF},{0x4F3A, 0xDEC3},{0x4F3C, 0xDEC4},{0x4F3D, 0xCAA1},{0x4F43, 0xEEEC},{0x4F46, 0xD3A3}, - {0x4F47, 0xEEB7},{0x4F48, 0xF8CF},{0x4F4D, 0xEAC8},{0x4F4E, 0xEEB8},{0x4F4F, 0xF1AC},{0x4F50, 0xF1A5},{0x4F51, 0xE9CE},{0x4F55, 0xF9BC}, - {0x4F59, 0xE5F9},{0x4F5A, 0xECEA},{0x4F5B, 0xDDD6},{0x4F5C, 0xEDC2},{0x4F69, 0xF8A5},{0x4F6F, 0xE5BA},{0x4F70, 0xDBD8},{0x4F73, 0xCAA2}, - {0x4F76, 0xD1CD},{0x4F7A, 0xEEED},{0x4F7E, 0xECEB},{0x4F7F, 0xDEC5},{0x4F81, 0xE3E0},{0x4F83, 0xCAC9},{0x4F84, 0xF2E9},{0x4F86, 0xD5CE}, - {0x4F88, 0xF6B6},{0x4F8A, 0xCEC2},{0x4F8B, 0xD6C7},{0x4F8D, 0xE3B4},{0x4F8F, 0xF1AD},{0x4F91, 0xEAE2},{0x4F96, 0xD7C2},{0x4F98, 0xF3A7}, - {0x4F9B, 0xCDEA},{0x4F9D, 0xEBEE},{0x4FAE, 0xD9B2},{0x4FAF, 0xFDA5},{0x4FB5, 0xF6D5},{0x4FB6, 0xD5E2},{0x4FBF, 0xF8B5},{0x4FC2, 0xCCF5}, - {0x4FC3, 0xF5B5},{0x4FC4, 0xE4AD},{0x4FC9, 0xE7EB},{0x4FCA, 0xF1D5},{0x4FCE, 0xF0BB},{0x4FD1, 0xE9B5},{0x4FD3, 0xCCC9},{0x4FD4, 0xFAD5}, - {0x4FD7, 0xE1D4},{0x4FDA, 0xD7D6},{0x4FDD, 0xDCC1},{0x4FDF, 0xDEC6},{0x4FE0, 0xFAEF},{0x4FE1, 0xE3E1},{0x4FEE, 0xE1F3},{0x4FEF, 0xDCF6}, - {0x4FF1, 0xCEFC},{0x4FF3, 0xDBC4},{0x4FF5, 0xF8F1},{0x4FF8, 0xDCE4},{0x4FFA, 0xE5EF},{0x5002, 0xDCB1},{0x5006, 0xD5D6},{0x5009, 0xF3DA}, - {0x500B, 0xCBC1},{0x500D, 0xDBC3},{0x5011, 0xD9FA},{0x5012, 0xD3EE},{0x5016, 0xFAB8},{0x5019, 0xFDA6},{0x501A, 0xEBEF},{0x501C, 0xF4A6}, - {0x501E, 0xCCCA},{0x501F, 0xF3A8},{0x5021, 0xF3DB},{0x5023, 0xDBA7},{0x5024, 0xF6B7},{0x5026, 0xCFE6},{0x5027, 0xF0F2},{0x5028, 0xCBDA}, - {0x502A, 0xE7D2},{0x502B, 0xD7C3},{0x502C, 0xF6F0},{0x502D, 0xE8DE},{0x503B, 0xE5A6},{0x5043, 0xE5E7},{0x5047, 0xCAA3},{0x5048, 0xCCA7}, - {0x5049, 0xEAC9},{0x504F, 0xF8B6},{0x5055, 0xFAA5},{0x505A, 0xF1AE},{0x505C, 0xEFCE},{0x5065, 0xCBED},{0x5074, 0xF6B0},{0x5075, 0xEFCF}, - {0x5076, 0xE9CF},{0x5078, 0xF7DE},{0x5080, 0xCED3},{0x5085, 0xDCF7},{0x508D, 0xDBA8},{0x5091, 0xCBF8},{0x5098, 0xDFA1},{0x5099, 0xDDE1}, - {0x50AC, 0xF5CA},{0x50AD, 0xE9B6},{0x50B2, 0xE7EC},{0x50B3, 0xEEEE},{0x50B5, 0xF3F0},{0x50B7, 0xDFBF},{0x50BE, 0xCCCB},{0x50C5, 0xD0C1}, - {0x50C9, 0xF4D2},{0x50CA, 0xE0BA},{0x50CF, 0xDFC0},{0x50D1, 0xCEE0},{0x50D5, 0xDCD2},{0x50D6, 0xFDEA},{0x50DA, 0xD6F6},{0x50DE, 0xEACA}, - {0x50E5, 0xE8E9},{0x50E7, 0xE3AC},{0x50ED, 0xF3D0},{0x50F9, 0xCAA4},{0x50FB, 0xDBF8},{0x50FF, 0xDEC7},{0x5100, 0xEBF0},{0x5101, 0xF1D6}, - {0x5104, 0xE5E2},{0x5106, 0xCCCC},{0x5109, 0xCBFB},{0x5112, 0xEAE3},{0x511F, 0xDFC1},{0x5121, 0xD6ED},{0x512A, 0xE9D0},{0x5132, 0xEEB9}, - {0x5137, 0xD5E3},{0x513A, 0xD1D3},{0x513C, 0xE5F0},{0x5140, 0xE8B4},{0x5141, 0xEBC3},{0x5143, 0xEAAA},{0x5144, 0xFAFC},{0x5145, 0xF5F6}, - {0x5146, 0xF0BC},{0x5147, 0xFDD4},{0x5148, 0xE0BB},{0x5149, 0xCEC3},{0x514B, 0xD0BA},{0x514C, 0xF7BA},{0x514D, 0xD8F3},{0x514E, 0xF7CD}, - {0x5152, 0xE4AE},{0x515C, 0xD4DF},{0x5162, 0xD0E7},{0x5165, 0xECFD},{0x5167, 0xD2AE},{0x5168, 0xEEEF},{0x5169, 0xD5D7},{0x516A, 0xEAE4}, - {0x516B, 0xF8A2},{0x516C, 0xCDEB},{0x516D, 0xD7BF},{0x516E, 0xFBB1},{0x5171, 0xCDEC},{0x5175, 0xDCB2},{0x5176, 0xD0EC},{0x5177, 0xCEFD}, - {0x5178, 0xEEF0},{0x517C, 0xCCC2},{0x5180, 0xD0ED},{0x5186, 0xE5F7},{0x518A, 0xF3FC},{0x518D, 0xEEA2},{0x5192, 0xD9B3},{0x5195, 0xD8F4}, - {0x5197, 0xE9B7},{0x51A0, 0xCEAE},{0x51A5, 0xD9A2},{0x51AA, 0xD8F1},{0x51AC, 0xD4CF},{0x51B6, 0xE5A7},{0x51B7, 0xD5D2},{0x51BD, 0xD6A9}, - {0x51C4, 0xF4A2},{0x51C6, 0xF1D7},{0x51C9, 0xD5D8},{0x51CB, 0xF0BD},{0x51CC, 0xD7D0},{0x51CD, 0xD4D0},{0x51DC, 0xD7CF},{0x51DD, 0xEBEA}, - {0x51DE, 0xFDEB},{0x51E1, 0xDBED},{0x51F0, 0xFCC5},{0x51F1, 0xCBC2},{0x51F6, 0xFDD5},{0x51F8, 0xF4C8},{0x51F9, 0xE8EA},{0x51FA, 0xF5F3}, - {0x51FD, 0xF9DE},{0x5200, 0xD3EF},{0x5203, 0xECD3},{0x5206, 0xDDC2},{0x5207, 0xEFB7},{0x5208, 0xE7D4},{0x520A, 0xCACA},{0x520E, 0xD9FB}, - {0x5211, 0xFAFD},{0x5217, 0xD6AA},{0x521D, 0xF4F8},{0x5224, 0xF7F7},{0x5225, 0xDCAC},{0x5229, 0xD7D7},{0x522A, 0xDFA2},{0x522E, 0xCEBE}, - {0x5230, 0xD3F0},{0x5236, 0xF0A4},{0x5237, 0xE1EC},{0x5238, 0xCFE7},{0x5239, 0xF3CB},{0x523A, 0xEDA9},{0x523B, 0xCABE},{0x5243, 0xF4EF}, - {0x5247, 0xF6CE},{0x524A, 0xDEFB},{0x524B, 0xD0BB},{0x524C, 0xD5B7},{0x524D, 0xEEF1},{0x5254, 0xF4A8},{0x5256, 0xDCF8},{0x525B, 0xCBA7}, - {0x525D, 0xDACE},{0x5261, 0xE0E6},{0x5269, 0xEDA5},{0x526A, 0xEEF2},{0x526F, 0xDCF9},{0x5272, 0xF9DC},{0x5275, 0xF3DC},{0x527D, 0xF8F2}, - {0x527F, 0xF4F9},{0x5283, 0xFCF1},{0x5287, 0xD0BC},{0x5288, 0xDBF9},{0x5289, 0xD7B1},{0x528D, 0xCBFC},{0x5291, 0xF0A5},{0x5292, 0xCBFD}, - {0x529B, 0xD5F4},{0x529F, 0xCDED},{0x52A0, 0xCAA5},{0x52A3, 0xD6AB},{0x52A4, 0xD0C2},{0x52A9, 0xF0BE},{0x52AA, 0xD2BD},{0x52AB, 0xCCA4}, - {0x52BE, 0xFAB6},{0x52C1, 0xCCCD},{0x52C3, 0xDAFA},{0x52C5, 0xF6CF},{0x52C7, 0xE9B8},{0x52C9, 0xD8F5},{0x52CD, 0xCCCE},{0x52D2, 0xD7CD}, - {0x52D5, 0xD4D1},{0x52D6, 0xE9ED},{0x52D8, 0xCAEB},{0x52D9, 0xD9E2},{0x52DB, 0xFDB2},{0x52DD, 0xE3AD},{0x52DE, 0xD6CC},{0x52DF, 0xD9B4}, - {0x52E2, 0xE1A7},{0x52E3, 0xEED3},{0x52E4, 0xD0C3},{0x52F3, 0xFDB3},{0x52F5, 0xD5E4},{0x52F8, 0xCFE8},{0x52FA, 0xEDC3},{0x52FB, 0xD0B2}, - {0x52FE, 0xCEFE},{0x52FF, 0xDAA8},{0x5305, 0xF8D0},{0x5308, 0xFDD6},{0x530D, 0xF8D1},{0x530F, 0xF8D2},{0x5310, 0xDCD3},{0x5315, 0xDDE2}, - {0x5316, 0xFBF9},{0x5317, 0xDDC1},{0x5319, 0xE3B5},{0x5320, 0xEDDD},{0x5321, 0xCEC4},{0x5323, 0xCBA1},{0x532A, 0xDDE3},{0x532F, 0xFCDD}, - {0x5339, 0xF9AF},{0x533F, 0xD2FB},{0x5340, 0xCFA1},{0x5341, 0xE4A8},{0x5343, 0xF4B6},{0x5344, 0xECFE},{0x5347, 0xE3AE},{0x5348, 0xE7ED}, - {0x5349, 0xFDC1},{0x534A, 0xDAE2},{0x534D, 0xD8B3},{0x5351, 0xDDE4},{0x5352, 0xF0EF},{0x5353, 0xF6F1},{0x5354, 0xFAF0},{0x5357, 0xD1F5}, - {0x535A, 0xDACF},{0x535C, 0xDCD4},{0x535E, 0xDCA6},{0x5360, 0xEFBF},{0x5366, 0xCECF},{0x5368, 0xE0D9},{0x536F, 0xD9D6},{0x5370, 0xECD4}, - {0x5371, 0xEACB},{0x5374, 0xCABF},{0x5375, 0xD5B0},{0x5377, 0xCFE9},{0x537D, 0xF1ED},{0x537F, 0xCCCF},{0x5384, 0xE4F8},{0x5393, 0xE4ED}, - {0x5398, 0xD7D8},{0x539A, 0xFDA7},{0x539F, 0xEAAB},{0x53A0, 0xF6B2},{0x53A5, 0xCFF0},{0x53A6, 0xF9BD},{0x53AD, 0xE6F4},{0x53BB, 0xCBDB}, - {0x53C3, 0xF3D1},{0x53C8, 0xE9D1},{0x53C9, 0xF3A9},{0x53CA, 0xD0E0},{0x53CB, 0xE9D2},{0x53CD, 0xDAE3},{0x53D4, 0xE2D2},{0x53D6, 0xF6A2}, - {0x53D7, 0xE1F4},{0x53DB, 0xDAE4},{0x53E1, 0xE7D5},{0x53E2, 0xF5BF},{0x53E3, 0xCFA2},{0x53E4, 0xCDAF},{0x53E5, 0xCFA3},{0x53E9, 0xCDB0}, - {0x53EA, 0xF1FE},{0x53EB, 0xD0A3},{0x53EC, 0xE1AF},{0x53ED, 0xF8A3},{0x53EF, 0xCAA6},{0x53F0, 0xF7BB},{0x53F1, 0xF2EA},{0x53F2, 0xDEC8}, - {0x53F3, 0xE9D3},{0x53F8, 0xDEC9},{0x5403, 0xFDDE},{0x5404, 0xCAC0},{0x5408, 0xF9EA},{0x5409, 0xD1CE},{0x540A, 0xEED4},{0x540C, 0xD4D2}, - {0x540D, 0xD9A3},{0x540E, 0xFDA8},{0x540F, 0xD7D9},{0x5410, 0xF7CE},{0x5411, 0xFABE},{0x541B, 0xCFD6},{0x541D, 0xD7F0},{0x541F, 0xEBE1}, - {0x5420, 0xF8C5},{0x5426, 0xDCFA},{0x5429, 0xDDC3},{0x542B, 0xF9DF},{0x5433, 0xE7EF},{0x5438, 0xFDE5},{0x5439, 0xF6A3},{0x543B, 0xD9FC}, - {0x543C, 0xFDA9},{0x543E, 0xE7EE},{0x5442, 0xD5E5},{0x5448, 0xEFD0},{0x544A, 0xCDB1},{0x5451, 0xF7A2},{0x5468, 0xF1B2},{0x546A, 0xF1B1}, - {0x5471, 0xCDB2},{0x5473, 0xDAAB},{0x5475, 0xCAA7},{0x547B, 0xE3E2},{0x547C, 0xFBBC},{0x547D, 0xD9A4},{0x5480, 0xEEBA},{0x5486, 0xF8D3}, - {0x548C, 0xFBFA},{0x548E, 0xCFA4},{0x5490, 0xDCFB},{0x54A4, 0xF6E3},{0x54A8, 0xEDAA},{0x54AB, 0xF2A1},{0x54AC, 0xCEE1},{0x54B3, 0xFAA6}, - {0x54B8, 0xF9E0},{0x54BD, 0xECD6},{0x54C0, 0xE4EE},{0x54C1, 0xF9A1},{0x54C4, 0xFBEF},{0x54C8, 0xF9EB},{0x54C9, 0xEEA3},{0x54E1, 0xEAAC}, - {0x54E5, 0xCAA8},{0x54E8, 0xF4FA},{0x54ED, 0xCDD6},{0x54EE, 0xFCF6},{0x54F2, 0xF4C9},{0x54FA, 0xF8D4},{0x5504, 0xF8A6},{0x5506, 0xDECA}, - {0x5507, 0xF2C6},{0x550E, 0xD7DA},{0x5510, 0xD3D0},{0x551C, 0xD8C5},{0x552F, 0xEAE6},{0x5531, 0xF3DD},{0x5535, 0xE4DA},{0x553E, 0xF6E4}, - {0x5544, 0xF6F2},{0x5546, 0xDFC2},{0x554F, 0xD9FD},{0x5553, 0xCCF6},{0x5556, 0xD3BA},{0x555E, 0xE4AF},{0x5563, 0xF9E1},{0x557C, 0xF0A6}, - {0x5580, 0xCBD3},{0x5584, 0xE0BC},{0x5586, 0xF4CA},{0x5587, 0xD4FA},{0x5589, 0xFDAA},{0x558A, 0xF9E2},{0x5598, 0xF4B7},{0x5599, 0xFDC2}, - {0x559A, 0xFCB0},{0x559C, 0xFDEC},{0x559D, 0xCAE2},{0x55A7, 0xFDBD},{0x55A9, 0xEAE7},{0x55AA, 0xDFC3},{0x55AB, 0xD1D2},{0x55AC, 0xCEE2}, - {0x55AE, 0xD3A4},{0x55C5, 0xFDAB},{0x55C7, 0xDFE0},{0x55D4, 0xF2C7},{0x55DA, 0xE7F0},{0x55DC, 0xD0EE},{0x55DF, 0xF3AA},{0x55E3, 0xDECB}, - {0x55E4, 0xF6B8},{0x55FD, 0xE1F5},{0x55FE, 0xF1B3},{0x5606, 0xF7A3},{0x5609, 0xCAA9},{0x5614, 0xCFA5},{0x5617, 0xDFC4},{0x562F, 0xE1B0}, - {0x5632, 0xF0BF},{0x5634, 0xF6A4},{0x5636, 0xE3B6},{0x5653, 0xFAC6},{0x5668, 0xD0EF},{0x566B, 0xFDED},{0x5674, 0xDDC4},{0x5686, 0xFCF7}, - {0x56A5, 0xE6BF},{0x56AC, 0xDEAD},{0x56AE, 0xFABF},{0x56B4, 0xE5F1},{0x56BC, 0xEDC4},{0x56CA, 0xD2A5},{0x56CD, 0xFDEE},{0x56D1, 0xF5B6}, - {0x56DA, 0xE1F6},{0x56DB, 0xDECC},{0x56DE, 0xFCDE},{0x56E0, 0xECD7},{0x56F0, 0xCDDD},{0x56F9, 0xD6B7},{0x56FA, 0xCDB3},{0x5703, 0xF8D5}, - {0x5704, 0xE5D8},{0x5708, 0xCFEA},{0x570B, 0xCFD0},{0x570D, 0xEACC},{0x5712, 0xEAAE},{0x5713, 0xEAAD},{0x5716, 0xD3F1},{0x5718, 0xD3A5}, - {0x571F, 0xF7CF},{0x5728, 0xEEA4},{0x572D, 0xD0A4},{0x5730, 0xF2A2},{0x573B, 0xD0F0},{0x5740, 0xF2A3},{0x5742, 0xF7F8},{0x5747, 0xD0B3}, - {0x574A, 0xDBA9},{0x574D, 0xD3BB},{0x574E, 0xCAEC},{0x5750, 0xF1A6},{0x5751, 0xCBD5},{0x5761, 0xF7E7},{0x5764, 0xCDDE},{0x5766, 0xF7A4}, - {0x576A, 0xF8C0},{0x576E, 0xD3DD},{0x5770, 0xCCD0},{0x5775, 0xCFA6},{0x577C, 0xF6F3},{0x5782, 0xE1F7},{0x5788, 0xD3DC},{0x578B, 0xFAFE}, - {0x5793, 0xFAA7},{0x57A0, 0xEBD9},{0x57A2, 0xCFA7},{0x57A3, 0xEAAF},{0x57C3, 0xE4EF},{0x57C7, 0xE9B9},{0x57C8, 0xF1D8},{0x57CB, 0xD8D8}, - {0x57CE, 0xE0F2},{0x57DF, 0xE6B4},{0x57E0, 0xDCFC},{0x57F0, 0xF3F1},{0x57F4, 0xE3D0},{0x57F7, 0xF2FB},{0x57F9, 0xDBC6},{0x57FA, 0xD0F1}, - {0x57FC, 0xD0F2},{0x5800, 0xCFDC},{0x5802, 0xD3D1},{0x5805, 0xCCB1},{0x5806, 0xF7D8},{0x5808, 0xCBA8},{0x5809, 0xEBBC},{0x580A, 0xE4BE}, - {0x581E, 0xF4DC},{0x5821, 0xDCC2},{0x5824, 0xF0A7},{0x5827, 0xE6C0},{0x582A, 0xCAED},{0x582F, 0xE8EB},{0x5830, 0xE5E8},{0x5831, 0xDCC3}, - {0x5834, 0xEDDE},{0x5835, 0xD3F2},{0x583A, 0xCCF7},{0x584A, 0xCED4},{0x584B, 0xE7AB},{0x584F, 0xCBC3},{0x5851, 0xE1B1},{0x5854, 0xF7B2}, - {0x5857, 0xD3F3},{0x5858, 0xD3D2},{0x585A, 0xF5C0},{0x585E, 0xDFDD},{0x5861, 0xEEF3},{0x5862, 0xE7F1},{0x5864, 0xFDB4},{0x5875, 0xF2C8}, - {0x5879, 0xF3D2},{0x587C, 0xEEF4},{0x587E, 0xE2D3},{0x5883, 0xCCD1},{0x5885, 0xDFEA},{0x5889, 0xE9BA},{0x5893, 0xD9D7},{0x589C, 0xF5CD}, - {0x589E, 0xF1F2},{0x589F, 0xFAC7},{0x58A8, 0xD9F8},{0x58A9, 0xD4C2},{0x58AE, 0xF6E5},{0x58B3, 0xDDC5},{0x58BA, 0xE7F2},{0x58BB, 0xEDDF}, - {0x58BE, 0xCACB},{0x58C1, 0xDBFA},{0x58C5, 0xE8B5},{0x58C7, 0xD3A6},{0x58CE, 0xFDB5},{0x58D1, 0xF9C9},{0x58D3, 0xE4E2},{0x58D5, 0xFBBD}, - {0x58D8, 0xD7A4},{0x58D9, 0xCEC5},{0x58DE, 0xCED5},{0x58DF, 0xD6E6},{0x58E4, 0xE5BD},{0x58EB, 0xDECD},{0x58EC, 0xECF3},{0x58EF, 0xEDE0}, - {0x58F9, 0xECEC},{0x58FA, 0xFBBE},{0x58FB, 0xDFEB},{0x58FD, 0xE1F8},{0x590F, 0xF9BE},{0x5914, 0xD0F3},{0x5915, 0xE0AA},{0x5916, 0xE8E2}, - {0x5919, 0xE2D4},{0x591A, 0xD2FD},{0x591C, 0xE5A8},{0x5922, 0xD9D3},{0x5927, 0xD3DE},{0x5929, 0xF4B8},{0x592A, 0xF7BC},{0x592B, 0xDCFD}, - {0x592D, 0xE8EC},{0x592E, 0xE4E7},{0x5931, 0xE3F7},{0x5937, 0xECA8},{0x593E, 0xFAF1},{0x5944, 0xE5F2},{0x5947, 0xD0F4},{0x5948, 0xD2AF}, - {0x5949, 0xDCE5},{0x594E, 0xD0A5},{0x594F, 0xF1B4},{0x5950, 0xFCB1},{0x5951, 0xCCF8},{0x5954, 0xDDC6},{0x5955, 0xFAD1},{0x5957, 0xF7DF}, - {0x595A, 0xFAA8},{0x5960, 0xEEF5},{0x5962, 0xDECE},{0x5967, 0xE7F3},{0x596A, 0xF7AC},{0x596B, 0xEBC4},{0x596C, 0xEDE1},{0x596D, 0xE0AB}, - {0x596E, 0xDDC7},{0x5973, 0xD2B3},{0x5974, 0xD2BF},{0x5978, 0xCACC},{0x597D, 0xFBBF},{0x5982, 0xE5FD},{0x5983, 0xDDE5},{0x5984, 0xD8CD}, - {0x598A, 0xECF4},{0x5993, 0xD0F5},{0x5996, 0xE8ED},{0x5997, 0xD0D2},{0x5999, 0xD9D8},{0x59A5, 0xF6E6},{0x59A8, 0xDBAA},{0x59AC, 0xF7E0}, - {0x59B9, 0xD8D9},{0x59BB, 0xF4A3},{0x59BE, 0xF4DD},{0x59C3, 0xEFD1},{0x59C6, 0xD9B5},{0x59C9, 0xEDAB},{0x59CB, 0xE3B7},{0x59D0, 0xEEBB}, - {0x59D1, 0xCDB4},{0x59D3, 0xE0F3},{0x59D4, 0xEACD},{0x59D9, 0xECF5},{0x59DA, 0xE8EE},{0x59DC, 0xCBA9},{0x59DD, 0xF1AF},{0x59E6, 0xCACD}, - {0x59E8, 0xECA9},{0x59EA, 0xF2EB},{0x59EC, 0xFDEF},{0x59EE, 0xF9F3},{0x59F8, 0xE6C1},{0x59FB, 0xECD8},{0x59FF, 0xEDAC},{0x5A01, 0xEACE}, - {0x5A03, 0xE8DF},{0x5A11, 0xDECF},{0x5A18, 0xD2A6},{0x5A1B, 0xE7F4},{0x5A1C, 0xD1D6},{0x5A1F, 0xE6C2},{0x5A20, 0xE3E3},{0x5A25, 0xE4B0}, - {0x5A29, 0xD8B4},{0x5A36, 0xF6A5},{0x5A3C, 0xF3DE},{0x5A41, 0xD7A5},{0x5A46, 0xF7E8},{0x5A49, 0xE8C6},{0x5A5A, 0xFBE6},{0x5A62, 0xDDE6}, - {0x5A66, 0xDCFE},{0x5A92, 0xD8DA},{0x5A9A, 0xDAAC},{0x5A9B, 0xEAB0},{0x5AA4, 0xE3B8},{0x5AC1, 0xCAAA},{0x5AC2, 0xE1F9},{0x5AC4, 0xEAB1}, - {0x5AC9, 0xF2EC},{0x5ACC, 0xFAEE},{0x5AE1, 0xEED5},{0x5AE6, 0xF9F4},{0x5AE9, 0xD2EC},{0x5B05, 0xFBFB},{0x5B09, 0xFDF0},{0x5B0B, 0xE0BD}, - {0x5B0C, 0xCEE3},{0x5B16, 0xF8C6},{0x5B2A, 0xDEAE},{0x5B40, 0xDFC5},{0x5B43, 0xE5BE},{0x5B50, 0xEDAD},{0x5B51, 0xFAEA},{0x5B54, 0xCDEE}, - {0x5B55, 0xEDA6},{0x5B57, 0xEDAE},{0x5B58, 0xF0ED},{0x5B5A, 0xDDA1},{0x5B5C, 0xEDAF},{0x5B5D, 0xFCF8},{0x5B5F, 0xD8EB},{0x5B63, 0xCCF9}, - {0x5B64, 0xCDB5},{0x5B69, 0xFAA9},{0x5B6B, 0xE1DD},{0x5B70, 0xE2D5},{0x5B71, 0xEDCF},{0x5B75, 0xDDA2},{0x5B78, 0xF9CA},{0x5B7A, 0xEAE8}, - {0x5B7C, 0xE5ED},{0x5B85, 0xD3EB},{0x5B87, 0xE9D4},{0x5B88, 0xE1FA},{0x5B89, 0xE4CC},{0x5B8B, 0xE1E4},{0x5B8C, 0xE8C7},{0x5B8F, 0xCEDB}, - {0x5B93, 0xDCD5},{0x5B95, 0xF7B5},{0x5B96, 0xFCF3},{0x5B97, 0xF0F3},{0x5B98, 0xCEAF},{0x5B99, 0xF1B5},{0x5B9A, 0xEFD2},{0x5B9B, 0xE8C8}, - {0x5B9C, 0xEBF1},{0x5BA2, 0xCBD4},{0x5BA3, 0xE0BE},{0x5BA4, 0xE3F8},{0x5BA5, 0xEAE9},{0x5BA6, 0xFCB2},{0x5BAC, 0xE0F4},{0x5BAE, 0xCFE0}, - {0x5BB0, 0xEEA5},{0x5BB3, 0xFAAA},{0x5BB4, 0xE6C3},{0x5BB5, 0xE1B2},{0x5BB6, 0xCAAB},{0x5BB8, 0xE3E4},{0x5BB9, 0xE9BB},{0x5BBF, 0xE2D6}, - {0x5BC0, 0xF3F2},{0x5BC2, 0xEED6},{0x5BC3, 0xEAB2},{0x5BC4, 0xD0F6},{0x5BC5, 0xECD9},{0x5BC6, 0xDACB},{0x5BC7, 0xCFA8},{0x5BCC, 0xDDA3}, - {0x5BD0, 0xD8DB},{0x5BD2, 0xF9CE},{0x5BD3, 0xE9D5},{0x5BD4, 0xE3D1},{0x5BD7, 0xD2BC},{0x5BDE, 0xD8AC},{0x5BDF, 0xF3CC},{0x5BE1, 0xCDFB}, - {0x5BE2, 0xF6D6},{0x5BE4, 0xE7F5},{0x5BE5, 0xE8EF},{0x5BE6, 0xE3F9},{0x5BE7, 0xD2BB},{0x5BE8, 0xF3F3},{0x5BE9, 0xE3FB},{0x5BEB, 0xDED0}, - {0x5BEC, 0xCEB0},{0x5BEE, 0xD6F7},{0x5BEF, 0xF1D9},{0x5BF5, 0xF5C1},{0x5BF6, 0xDCC4},{0x5BF8, 0xF5BB},{0x5BFA, 0xDED1},{0x5C01, 0xDCE6}, - {0x5C04, 0xDED2},{0x5C07, 0xEDE2},{0x5C08, 0xEEF6},{0x5C09, 0xEACF},{0x5C0A, 0xF0EE},{0x5C0B, 0xE3FC},{0x5C0D, 0xD3DF},{0x5C0E, 0xD3F4}, - {0x5C0F, 0xE1B3},{0x5C11, 0xE1B4},{0x5C16, 0xF4D3},{0x5C19, 0xDFC6},{0x5C24, 0xE9D6},{0x5C28, 0xDBAB},{0x5C31, 0xF6A6},{0x5C38, 0xE3B9}, - {0x5C39, 0xEBC5},{0x5C3A, 0xF4A9},{0x5C3B, 0xCDB6},{0x5C3C, 0xD2F9},{0x5C3E, 0xDAAD},{0x5C3F, 0xD2E3},{0x5C40, 0xCFD1},{0x5C45, 0xCBDC}, - {0x5C46, 0xCCFA},{0x5C48, 0xCFDD},{0x5C4B, 0xE8A9},{0x5C4D, 0xE3BB},{0x5C4E, 0xE3BA},{0x5C51, 0xE0DA},{0x5C55, 0xEEF7},{0x5C5B, 0xDCB3}, - {0x5C60, 0xD3F5},{0x5C62, 0xD7A6},{0x5C64, 0xF6B5},{0x5C65, 0xD7DB},{0x5C6C, 0xE1D5},{0x5C6F, 0xD4EA},{0x5C71, 0xDFA3},{0x5C79, 0xFDDF}, - {0x5C90, 0xD0F7},{0x5C91, 0xEDD4},{0x5CA1, 0xCBAA},{0x5CA9, 0xE4DB},{0x5CAB, 0xE1FB},{0x5CAC, 0xCBA2},{0x5CB1, 0xD3E0},{0x5CB3, 0xE4BF}, - {0x5CB5, 0xFBC0},{0x5CB7, 0xDABE},{0x5CB8, 0xE4CD},{0x5CBA, 0xD6B9},{0x5CBE, 0xEFC0},{0x5CC0, 0xE1FC},{0x5CD9, 0xF6B9},{0x5CE0, 0xDFC7}, - {0x5CE8, 0xE4B1},{0x5CEF, 0xDCE7},{0x5CF0, 0xDCE8},{0x5CF4, 0xFAD6},{0x5CF6, 0xD3F6},{0x5CFB, 0xF1DA},{0x5CFD, 0xFAF2},{0x5D07, 0xE2FD}, - {0x5D0D, 0xD5CF},{0x5D0E, 0xD0F8},{0x5D11, 0xCDDF},{0x5D14, 0xF5CB},{0x5D16, 0xE4F0},{0x5D17, 0xCBAB},{0x5D19, 0xD7C4},{0x5D27, 0xE2FE}, - {0x5D29, 0xDDDA},{0x5D4B, 0xDAAE},{0x5D4C, 0xCAEE},{0x5D50, 0xD5B9},{0x5D69, 0xE3A1},{0x5D6C, 0xE8E3},{0x5D6F, 0xF3AB},{0x5D87, 0xCFA9}, - {0x5D8B, 0xD3F7},{0x5D9D, 0xD4F1},{0x5DA0, 0xCEE4},{0x5DA2, 0xE8F2},{0x5DAA, 0xE5F5},{0x5DB8, 0xE7AE},{0x5DBA, 0xD6BA},{0x5DBC, 0xDFEC}, - {0x5DBD, 0xE4C0},{0x5DCD, 0xE8E4},{0x5DD2, 0xD8B5},{0x5DD6, 0xE4DC},{0x5DDD, 0xF4B9},{0x5DDE, 0xF1B6},{0x5DE1, 0xE2DE},{0x5DE2, 0xE1B5}, - {0x5DE5, 0xCDEF},{0x5DE6, 0xF1A7},{0x5DE7, 0xCEE5},{0x5DE8, 0xCBDD},{0x5DEB, 0xD9E3},{0x5DEE, 0xF3AC},{0x5DF1, 0xD0F9},{0x5DF2, 0xECAB}, - {0x5DF3, 0xDED3},{0x5DF4, 0xF7E9},{0x5DF7, 0xF9F5},{0x5DFD, 0xE1DE},{0x5DFE, 0xCBEE},{0x5E02, 0xE3BC},{0x5E03, 0xF8D6},{0x5E06, 0xDBEE}, - {0x5E0C, 0xFDF1},{0x5E11, 0xF7B6},{0x5E16, 0xF4DE},{0x5E19, 0xF2ED},{0x5E1B, 0xDBD9},{0x5E1D, 0xF0A8},{0x5E25, 0xE1FD},{0x5E2B, 0xDED4}, - {0x5E2D, 0xE0AC},{0x5E33, 0xEDE3},{0x5E36, 0xD3E1},{0x5E38, 0xDFC8},{0x5E3D, 0xD9B6},{0x5E3F, 0xFDAC},{0x5E40, 0xEFD3},{0x5E44, 0xE4C1}, - {0x5E45, 0xF8EB},{0x5E47, 0xDBAC},{0x5E4C, 0xFCC6},{0x5E55, 0xD8AD},{0x5E5F, 0xF6BA},{0x5E61, 0xDBDF},{0x5E62, 0xD3D3},{0x5E63, 0xF8C7}, - {0x5E72, 0xCACE},{0x5E73, 0xF8C1},{0x5E74, 0xD2B4},{0x5E77, 0xDCB4},{0x5E78, 0xFAB9},{0x5E79, 0xCACF},{0x5E7B, 0xFCB3},{0x5E7C, 0xEAEA}, - {0x5E7D, 0xEAEB},{0x5E7E, 0xD0FA},{0x5E84, 0xEDE4},{0x5E87, 0xDDE7},{0x5E8A, 0xDFC9},{0x5E8F, 0xDFED},{0x5E95, 0xEEBC},{0x5E97, 0xEFC1}, - {0x5E9A, 0xCCD2},{0x5E9C, 0xDDA4},{0x5EA0, 0xDFCA},{0x5EA6, 0xD3F8},{0x5EA7, 0xF1A8},{0x5EAB, 0xCDB7},{0x5EAD, 0xEFD4},{0x5EB5, 0xE4DD}, - {0x5EB6, 0xDFEE},{0x5EB7, 0xCBAC},{0x5EB8, 0xE9BC},{0x5EBE, 0xEAEC},{0x5EC2, 0xDFCB},{0x5EC8, 0xF9BF},{0x5EC9, 0xD6AF},{0x5ECA, 0xD5C6}, - {0x5ED0, 0xCFAA},{0x5ED3, 0xCEA9},{0x5ED6, 0xD6F8},{0x5EDA, 0xF1B7},{0x5EDB, 0xEEF8},{0x5EDF, 0xD9D9},{0x5EE0, 0xF3DF},{0x5EE2, 0xF8C8}, - {0x5EE3, 0xCEC6},{0x5EEC, 0xD5E6},{0x5EF3, 0xF4E6},{0x5EF6, 0xE6C5},{0x5EF7, 0xEFD5},{0x5EFA, 0xCBEF},{0x5EFB, 0xFCDF},{0x5F01, 0xDCA7}, - {0x5F04, 0xD6E7},{0x5F0A, 0xF8C9},{0x5F0F, 0xE3D2},{0x5F11, 0xE3BD},{0x5F13, 0xCFE1},{0x5F14, 0xF0C0},{0x5F15, 0xECDA},{0x5F17, 0xDDD7}, - {0x5F18, 0xFBF0},{0x5F1B, 0xECAC},{0x5F1F, 0xF0A9},{0x5F26, 0xFAD7},{0x5F27, 0xFBC1},{0x5F29, 0xD2C0},{0x5F31, 0xE5B0},{0x5F35, 0xEDE5}, - {0x5F3A, 0xCBAD},{0x5F3C, 0xF9B0},{0x5F48, 0xF7A5},{0x5F4A, 0xCBAE},{0x5F4C, 0xDAAF},{0x5F4E, 0xD8B6},{0x5F56, 0xD3A7},{0x5F57, 0xFBB2}, - {0x5F59, 0xFDC4},{0x5F5B, 0xECAD},{0x5F62, 0xFBA1},{0x5F66, 0xE5E9},{0x5F67, 0xE9EE},{0x5F69, 0xF3F4},{0x5F6A, 0xF8F3},{0x5F6B, 0xF0C1}, - {0x5F6C, 0xDEAF},{0x5F6D, 0xF8B0},{0x5F70, 0xF3E0},{0x5F71, 0xE7AF},{0x5F77, 0xDBAD},{0x5F79, 0xE6B5},{0x5F7C, 0xF9A8},{0x5F7F, 0xDDD8}, - {0x5F80, 0xE8D9},{0x5F81, 0xEFD6},{0x5F85, 0xD3E2},{0x5F87, 0xE2DF},{0x5F8A, 0xFCE0},{0x5F8B, 0xD7C8},{0x5F8C, 0xFDAD},{0x5F90, 0xDFEF}, - {0x5F91, 0xCCD3},{0x5F92, 0xD3F9},{0x5F97, 0xD4F0},{0x5F98, 0xDBC7},{0x5F99, 0xDED5},{0x5F9E, 0xF0F4},{0x5FA0, 0xD5D0},{0x5FA1, 0xE5D9}, - {0x5FA8, 0xFCC7},{0x5FA9, 0xDCD6},{0x5FAA, 0xE2E0},{0x5FAE, 0xDAB0},{0x5FB5, 0xF3A3},{0x5FB7, 0xD3EC},{0x5FB9, 0xF4CB},{0x5FBD, 0xFDC5}, - {0x5FC3, 0xE3FD},{0x5FC5, 0xF9B1},{0x5FCC, 0xD0FB},{0x5FCD, 0xECDB},{0x5FD6, 0xF5BC},{0x5FD7, 0xF2A4},{0x5FD8, 0xD8CE},{0x5FD9, 0xD8CF}, - {0x5FE0, 0xF5F7},{0x5FEB, 0xF6E1},{0x5FF5, 0xD2B7},{0x5FFD, 0xFBEC},{0x5FFF, 0xDDC8},{0x600F, 0xE4E8},{0x6012, 0xD2C1},{0x6016, 0xF8D7}, - {0x601C, 0xD6BB},{0x601D, 0xDED6},{0x6020, 0xF7BD},{0x6021, 0xECAE},{0x6025, 0xD0E1},{0x6027, 0xE0F5},{0x6028, 0xEAB3},{0x602A, 0xCED6}, - {0x602F, 0xCCA5},{0x6041, 0xECF6},{0x6042, 0xE2E1},{0x6043, 0xE3BE},{0x604D, 0xFCC8},{0x6050, 0xCDF0},{0x6052, 0xF9F6},{0x6055, 0xDFF0}, - {0x6059, 0xE5BF},{0x605D, 0xCEBF},{0x6062, 0xFCE1},{0x6063, 0xEDB0},{0x6064, 0xFDD1},{0x6065, 0xF6BB},{0x6068, 0xF9CF},{0x6069, 0xEBDA}, - {0x606A, 0xCAC1},{0x606C, 0xD2B8},{0x606D, 0xCDF1},{0x606F, 0xE3D3},{0x6070, 0xFDE6},{0x6085, 0xE6ED},{0x6089, 0xE3FA},{0x608C, 0xF0AA}, - {0x608D, 0xF9D0},{0x6094, 0xFCE2},{0x6096, 0xF8A7},{0x609A, 0xE1E5},{0x609B, 0xEEF9},{0x609F, 0xE7F6},{0x60A0, 0xEAED},{0x60A3, 0xFCB4}, - {0x60A4, 0xF5C2},{0x60A7, 0xD7DC},{0x60B0, 0xF0F5},{0x60B2, 0xDDE8},{0x60B3, 0xD3ED},{0x60B4, 0xF5FC},{0x60B6, 0xDABF},{0x60B8, 0xCCFB}, - {0x60BC, 0xD3FA},{0x60BD, 0xF4A4},{0x60C5, 0xEFD7},{0x60C7, 0xD4C3},{0x60D1, 0xFBE3},{0x60DA, 0xFBED},{0x60DC, 0xE0AD},{0x60DF, 0xEAEE}, - {0x60E0, 0xFBB3},{0x60E1, 0xE4C2},{0x60F0, 0xF6E7},{0x60F1, 0xD2DD},{0x60F3, 0xDFCC},{0x60F6, 0xFCC9},{0x60F9, 0xE5A9},{0x60FA, 0xE0F6}, - {0x60FB, 0xF6B3},{0x6101, 0xE1FE},{0x6106, 0xCBF0},{0x6108, 0xEAEF},{0x6109, 0xEAF0},{0x610D, 0xDAC0},{0x610E, 0xF8B4},{0x610F, 0xEBF2}, - {0x6115, 0xE4C3},{0x611A, 0xE9D7},{0x611B, 0xE4F1},{0x611F, 0xCAEF},{0x6127, 0xCED7},{0x6130, 0xFCCA},{0x6134, 0xF3E1},{0x6137, 0xCBC4}, - {0x613C, 0xE3E5},{0x613E, 0xCBC5},{0x613F, 0xEAB4},{0x6142, 0xE9BD},{0x6144, 0xD7C9},{0x6147, 0xEBDB},{0x6148, 0xEDB1},{0x614A, 0xCCC3}, - {0x614B, 0xF7BE},{0x614C, 0xFCCB},{0x6153, 0xF8F4},{0x6155, 0xD9B7},{0x6158, 0xF3D3},{0x6159, 0xF3D4},{0x615D, 0xF7E4},{0x615F, 0xF7D1}, - {0x6162, 0xD8B7},{0x6163, 0xCEB1},{0x6164, 0xCAC2},{0x6167, 0xFBB4},{0x6168, 0xCBC6},{0x616B, 0xF0F6},{0x616E, 0xD5E7},{0x6170, 0xEAD0}, - {0x6176, 0xCCD4},{0x6177, 0xCBAF},{0x617D, 0xF4AA},{0x617E, 0xE9AF},{0x6181, 0xF5C3},{0x6182, 0xE9D8},{0x618A, 0xDDE9},{0x618E, 0xF1F3}, - {0x6190, 0xD5FB},{0x6191, 0xDEBB},{0x6194, 0xF4FB},{0x6198, 0xFDF3},{0x6199, 0xFDF2},{0x619A, 0xF7A6},{0x61A4, 0xDDC9},{0x61A7, 0xD4D3}, - {0x61A9, 0xCCA8},{0x61AB, 0xDAC1},{0x61AC, 0xCCD5},{0x61AE, 0xD9E4},{0x61B2, 0xFACA},{0x61B6, 0xE5E3},{0x61BA, 0xD3BC},{0x61BE, 0xCAF0}, - {0x61C3, 0xD0C4},{0x61C7, 0xCAD0},{0x61C8, 0xFAAB},{0x61C9, 0xEBEB},{0x61CA, 0xE7F8},{0x61CB, 0xD9E5},{0x61E6, 0xD1D7},{0x61F2, 0xF3A4}, - {0x61F6, 0xD4FB},{0x61F7, 0xFCE3},{0x61F8, 0xFAD8},{0x61FA, 0xF3D5},{0x61FC, 0xCFAB},{0x61FF, 0xEBF3},{0x6200, 0xD5FC},{0x6207, 0xD3D4}, - {0x6208, 0xCDFC},{0x620A, 0xD9E6},{0x620C, 0xE2F9},{0x620D, 0xE2A1},{0x620E, 0xEBD4},{0x6210, 0xE0F7},{0x6211, 0xE4B2},{0x6212, 0xCCFC}, - {0x6216, 0xFBE4},{0x621A, 0xF4AB},{0x621F, 0xD0BD},{0x6221, 0xCAF1},{0x622A, 0xEFB8},{0x622E, 0xD7C0},{0x6230, 0xEEFA},{0x6231, 0xFDF4}, - {0x6234, 0xD3E3},{0x6236, 0xFBC2},{0x623E, 0xD5E8},{0x623F, 0xDBAE},{0x6240, 0xE1B6},{0x6241, 0xF8B7},{0x6247, 0xE0BF},{0x6248, 0xFBC3}, - {0x6249, 0xDDEA},{0x624B, 0xE2A2},{0x624D, 0xEEA6},{0x6253, 0xF6E8},{0x6258, 0xF6F5},{0x626E, 0xDDCA},{0x6271, 0xD0E2},{0x6276, 0xDDA6}, - {0x6279, 0xDDEB},{0x627C, 0xE4F9},{0x627F, 0xE3AF},{0x6280, 0xD0FC},{0x6284, 0xF4FC},{0x6289, 0xCCBC},{0x628A, 0xF7EA},{0x6291, 0xE5E4}, - {0x6292, 0xDFF1},{0x6295, 0xF7E1},{0x6297, 0xF9F7},{0x6298, 0xEFB9},{0x629B, 0xF8D8},{0x62AB, 0xF9A9},{0x62B1, 0xF8D9},{0x62B5, 0xEEBD}, - {0x62B9, 0xD8C6},{0x62BC, 0xE4E3},{0x62BD, 0xF5CE},{0x62C2, 0xDDD9},{0x62C7, 0xD9E7},{0x62C8, 0xD2B9},{0x62C9, 0xD5C3},{0x62CC, 0xDAE5}, - {0x62CD, 0xDAD0},{0x62CF, 0xD1D9},{0x62D0, 0xCED8},{0x62D2, 0xCBDE},{0x62D3, 0xF4AC},{0x62D4, 0xDAFB},{0x62D6, 0xF6E9},{0x62D7, 0xE8F3}, - {0x62D8, 0xCFAC},{0x62D9, 0xF0F0},{0x62DB, 0xF4FD},{0x62DC, 0xDBC8},{0x62EC, 0xCEC0},{0x62ED, 0xE3D4},{0x62EE, 0xD1CF},{0x62EF, 0xF1F5}, - {0x62F1, 0xCDF2},{0x62F3, 0xCFEB},{0x62F7, 0xCDB8},{0x62FE, 0xE3A6},{0x62FF, 0xD1DA},{0x6301, 0xF2A5},{0x6307, 0xF2A6},{0x6309, 0xE4CE}, - {0x6311, 0xD3FB},{0x632B, 0xF1A9},{0x632F, 0xF2C9},{0x633A, 0xEFD8},{0x633B, 0xE6C9},{0x633D, 0xD8B8},{0x633E, 0xFAF3},{0x6349, 0xF3B5}, - {0x634C, 0xF8A4},{0x634F, 0xD1F3},{0x6350, 0xE6C8},{0x6355, 0xF8DA},{0x6367, 0xDCE9},{0x6368, 0xDED7},{0x636E, 0xCBDF},{0x6372, 0xCFEC}, - {0x6377, 0xF4DF},{0x637A, 0xD1F4},{0x637B, 0xD2BA},{0x637F, 0xDFF2},{0x6383, 0xE1B7},{0x6388, 0xE2A3},{0x6389, 0xD3FC},{0x638C, 0xEDE6}, - {0x6392, 0xDBC9},{0x6396, 0xE4FA},{0x6398, 0xCFDE},{0x639B, 0xCED0},{0x63A0, 0xD5D3},{0x63A1, 0xF3F5},{0x63A2, 0xF7AE},{0x63A5, 0xEFC8}, - {0x63A7, 0xCDF3},{0x63A8, 0xF5CF},{0x63A9, 0xE5F3},{0x63AA, 0xF0C2},{0x63C0, 0xCAD1},{0x63C4, 0xEAF1},{0x63C6, 0xD0A6},{0x63CF, 0xD9DA}, - {0x63D0, 0xF0AB},{0x63D6, 0xEBE7},{0x63DA, 0xE5C0},{0x63DB, 0xFCB5},{0x63E1, 0xE4C4},{0x63ED, 0xCCA9},{0x63EE, 0xFDC6},{0x63F4, 0xEAB5}, - {0x63F6, 0xE5AA},{0x63F7, 0xDFBA},{0x640D, 0xE1DF},{0x640F, 0xDAD1},{0x6414, 0xE1B8},{0x6416, 0xE8F4},{0x6417, 0xD3FD},{0x641C, 0xE2A4}, - {0x6422, 0xF2CA},{0x642C, 0xDAE6},{0x642D, 0xF7B3},{0x643A, 0xFDCD},{0x643E, 0xF3B6},{0x6458, 0xEED7},{0x6460, 0xF5C4},{0x6469, 0xD8A4}, - {0x646F, 0xF2A7},{0x6478, 0xD9B8},{0x6479, 0xD9B9},{0x647A, 0xEFC9},{0x6488, 0xD6CE},{0x6491, 0xF7CB},{0x6492, 0xDFAE},{0x6493, 0xE8F5}, - {0x649A, 0xD2B5},{0x649E, 0xD3D5},{0x64A4, 0xF4CC},{0x64A5, 0xDAFC},{0x64AB, 0xD9E8},{0x64AD, 0xF7EB},{0x64AE, 0xF5C9},{0x64B0, 0xF3BC}, - {0x64B2, 0xDAD2},{0x64BB, 0xD3B5},{0x64C1, 0xE8B6},{0x64C4, 0xD6CF},{0x64C5, 0xF4BA},{0x64C7, 0xF7C9},{0x64CA, 0xCCAA},{0x64CD, 0xF0C3}, - {0x64CE, 0xCCD6},{0x64D2, 0xD0D3},{0x64D4, 0xD3BD},{0x64D8, 0xDBFB},{0x64DA, 0xCBE0},{0x64E1, 0xD3E4},{0x64E2, 0xF6F7},{0x64E5, 0xD5BA}, - {0x64E6, 0xF3CD},{0x64E7, 0xCBE1},{0x64EC, 0xEBF4},{0x64F2, 0xF4AD},{0x64F4, 0xFCAA},{0x64FA, 0xF7EC},{0x64FE, 0xE8F6},{0x6500, 0xDAE7}, - {0x6504, 0xF7CC},{0x6518, 0xE5C1},{0x651D, 0xE0EE},{0x6523, 0xD5FD},{0x652A, 0xCEE6},{0x652B, 0xFCAB},{0x652C, 0xD5BB},{0x652F, 0xF2A8}, - {0x6536, 0xE2A5},{0x6537, 0xCDB9},{0x6538, 0xEAF2},{0x6539, 0xCBC7},{0x653B, 0xCDF4},{0x653E, 0xDBAF},{0x653F, 0xEFD9},{0x6545, 0xCDBA}, - {0x6548, 0xFCF9},{0x654D, 0xDFF3},{0x654E, 0xCEE7},{0x654F, 0xDAC2},{0x6551, 0xCFAD},{0x6556, 0xE7F9},{0x6557, 0xF8A8},{0x655E, 0xF3E2}, - {0x6562, 0xCAF2},{0x6563, 0xDFA4},{0x6566, 0xD4C4},{0x656C, 0xCCD7},{0x656D, 0xE5C2},{0x6572, 0xCDBB},{0x6574, 0xEFDA},{0x6575, 0xEED8}, - {0x6577, 0xDDA7},{0x6578, 0xE2A6},{0x657E, 0xE0C0},{0x6582, 0xD6B0},{0x6583, 0xF8CA},{0x6585, 0xFCFA},{0x6587, 0xD9FE},{0x658C, 0xDEB0}, - {0x6590, 0xDDEC},{0x6591, 0xDAE8},{0x6597, 0xD4E0},{0x6599, 0xD6F9},{0x659B, 0xCDD7},{0x659C, 0xDED8},{0x659F, 0xF2F8},{0x65A1, 0xE4D6}, - {0x65A4, 0xD0C5},{0x65A5, 0xF4AE},{0x65A7, 0xDDA8},{0x65AB, 0xEDC5},{0x65AC, 0xF3D6},{0x65AF, 0xDED9},{0x65B0, 0xE3E6},{0x65B7, 0xD3A8}, - {0x65B9, 0xDBB0},{0x65BC, 0xE5DA},{0x65BD, 0xE3BF},{0x65C1, 0xDBB1},{0x65C5, 0xD5E9},{0x65CB, 0xE0C1},{0x65CC, 0xEFDB},{0x65CF, 0xF0E9}, - {0x65D2, 0xD7B2},{0x65D7, 0xD0FD},{0x65E0, 0xD9E9},{0x65E3, 0xD0FE},{0x65E5, 0xECED},{0x65E6, 0xD3A9},{0x65E8, 0xF2A9},{0x65E9, 0xF0C4}, - {0x65EC, 0xE2E2},{0x65ED, 0xE9EF},{0x65F1, 0xF9D1},{0x65F4, 0xE9D9},{0x65FA, 0xE8DA},{0x65FB, 0xDAC3},{0x65FC, 0xDAC4},{0x65FD, 0xD4C5}, - {0x65FF, 0xE7FA},{0x6606, 0xCDE0},{0x6607, 0xE3B0},{0x6609, 0xDBB2},{0x660A, 0xFBC4},{0x660C, 0xF3E3},{0x660E, 0xD9A5},{0x660F, 0xFBE7}, - {0x6610, 0xDDCB},{0x6611, 0xD0D4},{0x6613, 0xE6B6},{0x6614, 0xE0AE},{0x6615, 0xFDDA},{0x661E, 0xDCB5},{0x661F, 0xE0F8},{0x6620, 0xE7B1}, - {0x6625, 0xF5F0},{0x6627, 0xD8DC},{0x6628, 0xEDC6},{0x662D, 0xE1B9},{0x662F, 0xE3C0},{0x6630, 0xF9C0},{0x6631, 0xE9F0},{0x6634, 0xD9DB}, - {0x6636, 0xF3E4},{0x663A, 0xDCB6},{0x663B, 0xE4E9},{0x6641, 0xF0C5},{0x6642, 0xE3C1},{0x6643, 0xFCCC},{0x6644, 0xFCCD},{0x6649, 0xF2CB}, - {0x664B, 0xF2CC},{0x664F, 0xE4CF},{0x6659, 0xF1DB},{0x665B, 0xFAD9},{0x665D, 0xF1B8},{0x665E, 0xFDF5},{0x665F, 0xE0F9},{0x6664, 0xE7FB}, - {0x6665, 0xFCB7},{0x6666, 0xFCE4},{0x6667, 0xFBC5},{0x6668, 0xE3E7},{0x6669, 0xD8B9},{0x666B, 0xF6F8},{0x666E, 0xDCC5},{0x666F, 0xCCD8}, - {0x6673, 0xE0AF},{0x6674, 0xF4E7},{0x6676, 0xEFDC},{0x6677, 0xCFFC},{0x6678, 0xEFDD},{0x667A, 0xF2AA},{0x6684, 0xFDBE},{0x6687, 0xCAAC}, - {0x6688, 0xFDBB},{0x6689, 0xFDC7},{0x668E, 0xE7B2},{0x6690, 0xEAD1},{0x6691, 0xDFF4},{0x6696, 0xD1EC},{0x6697, 0xE4DE},{0x6698, 0xE5C3}, - {0x669D, 0xD9A6},{0x66A0, 0xCDBC},{0x66A2, 0xF3E5},{0x66AB, 0xEDD5},{0x66AE, 0xD9BA},{0x66B2, 0xEDE7},{0x66B3, 0xFBB5},{0x66B4, 0xF8EC}, - {0x66B9, 0xE0E7},{0x66BB, 0xCCD9},{0x66BE, 0xD4C6},{0x66C4, 0xE7A5},{0x66C6, 0xD5F5},{0x66C7, 0xD3BE},{0x66C9, 0xFCFB},{0x66D6, 0xE4F2}, - {0x66D9, 0xDFF5},{0x66DC, 0xE8F8},{0x66DD, 0xF8ED},{0x66E0, 0xCEC7},{0x66E6, 0xFDF6},{0x66F0, 0xE8D8},{0x66F2, 0xCDD8},{0x66F3, 0xE7D6}, - {0x66F4, 0xCCDA},{0x66F7, 0xCAE3},{0x66F8, 0xDFF6},{0x66F9, 0xF0C7},{0x66FA, 0xF0C6},{0x66FC, 0xD8BA},{0x66FE, 0xF1F4},{0x66FF, 0xF4F0}, - {0x6700, 0xF5CC},{0x6703, 0xFCE5},{0x6708, 0xEAC5},{0x6709, 0xEAF3},{0x670B, 0xDDDB},{0x670D, 0xDCD7},{0x6714, 0xDEFD},{0x6715, 0xF2F9}, - {0x6717, 0xD5C7},{0x671B, 0xD8D0},{0x671D, 0xF0C8},{0x671E, 0xD1A1},{0x671F, 0xD1A2},{0x6726, 0xD9D4},{0x6727, 0xD6E8},{0x6728, 0xD9CA}, - {0x672A, 0xDAB1},{0x672B, 0xD8C7},{0x672C, 0xDCE2},{0x672D, 0xF3CE},{0x672E, 0xF5F4},{0x6731, 0xF1B9},{0x6734, 0xDAD3},{0x6736, 0xF6EA}, - {0x673A, 0xCFF5},{0x673D, 0xFDAE},{0x6746, 0xCAD2},{0x6749, 0xDFB4},{0x674E, 0xD7DD},{0x674F, 0xFABA},{0x6750, 0xEEA7},{0x6751, 0xF5BD}, - {0x6753, 0xF8F5},{0x6756, 0xEDE8},{0x675C, 0xD4E1},{0x675E, 0xD1A3},{0x675F, 0xE1D6},{0x676D, 0xF9F8},{0x676F, 0xDBCA},{0x6770, 0xCBF9}, - {0x6771, 0xD4D4},{0x6773, 0xD9DC},{0x6775, 0xEEBE},{0x6777, 0xF7ED},{0x677B, 0xD2EE},{0x677E, 0xE1E6},{0x677F, 0xF7F9},{0x6787, 0xDDED}, - {0x6789, 0xE8DB},{0x678B, 0xDBB3},{0x678F, 0xD1F7},{0x6790, 0xE0B0},{0x6793, 0xD4E2},{0x6795, 0xF6D7},{0x6797, 0xD7F9},{0x679A, 0xD8DD}, - {0x679C, 0xCDFD},{0x679D, 0xF2AB},{0x67AF, 0xCDBD},{0x67B0, 0xF8C2},{0x67B3, 0xF2AC},{0x67B6, 0xCAAD},{0x67B7, 0xCAAE},{0x67B8, 0xCFAE}, - {0x67BE, 0xE3C2},{0x67C4, 0xDCB7},{0x67CF, 0xDBDA},{0x67D0, 0xD9BB},{0x67D1, 0xCAF3},{0x67D2, 0xF6D3},{0x67D3, 0xE6F8},{0x67D4, 0xEAF5}, - {0x67DA, 0xEAF6},{0x67DD, 0xF6F9},{0x67E9, 0xCFAF},{0x67EC, 0xCAD3},{0x67EF, 0xCAAF},{0x67F0, 0xD2B0},{0x67F1, 0xF1BA},{0x67F3, 0xD7B3}, - {0x67F4, 0xE3C3},{0x67F5, 0xF3FD},{0x67F6, 0xDEDA},{0x67FB, 0xDEDB},{0x67FE, 0xEFDE},{0x6812, 0xE2E3},{0x6813, 0xEEFB},{0x6816, 0xDFF7}, - {0x6817, 0xD7CA},{0x6821, 0xCEE8},{0x6822, 0xDBDB},{0x682A, 0xF1BB},{0x682F, 0xE9F1},{0x6838, 0xFAB7},{0x6839, 0xD0C6},{0x683C, 0xCCAB}, - {0x683D, 0xEEA8},{0x6840, 0xCBFA},{0x6841, 0xF9F9},{0x6842, 0xCCFD},{0x6843, 0xD3FE},{0x6848, 0xE4D0},{0x684E, 0xF2EE},{0x6850, 0xD4D5}, - {0x6851, 0xDFCD},{0x6853, 0xFCB8},{0x6854, 0xD1D0},{0x686D, 0xF2CD},{0x6876, 0xF7D2},{0x687F, 0xCAD4},{0x6881, 0xD5D9},{0x6885, 0xD8DE}, - {0x688F, 0xCDD9},{0x6893, 0xEEA9},{0x6894, 0xF6BC},{0x6897, 0xCCDB},{0x689D, 0xF0C9},{0x689F, 0xFCFC},{0x68A1, 0xE8C9},{0x68A2, 0xF4FE}, - {0x68A7, 0xE7FC},{0x68A8, 0xD7DE},{0x68AD, 0xDEDC},{0x68AF, 0xF0AC},{0x68B0, 0xCCFE},{0x68B1, 0xCDE1},{0x68B3, 0xE1BA},{0x68B5, 0xDBEF}, - {0x68B6, 0xDAB2},{0x68C4, 0xD1A5},{0x68C5, 0xDCB8},{0x68C9, 0xD8F6},{0x68CB, 0xD1A4},{0x68CD, 0xCDE2},{0x68D2, 0xDCEA},{0x68D5, 0xF0F7}, - {0x68D7, 0xF0CA},{0x68D8, 0xD0BE},{0x68DA, 0xDDDC},{0x68DF, 0xD4D6},{0x68E0, 0xD3D6},{0x68E7, 0xEDD0},{0x68E8, 0xCDA1},{0x68EE, 0xDFB5}, - {0x68F2, 0xDFF8},{0x68F9, 0xD4A1},{0x68FA, 0xCEB2},{0x6900, 0xE8CA},{0x6905, 0xEBF5},{0x690D, 0xE3D5},{0x690E, 0xF5D0},{0x6912, 0xF5A1}, - {0x6927, 0xD9A7},{0x6930, 0xE5AB},{0x693D, 0xE6CB},{0x693F, 0xF5F1},{0x694A, 0xE5C5},{0x6953, 0xF9A3},{0x6954, 0xE0DB},{0x6955, 0xF6EB}, - {0x6957, 0xCBF1},{0x6959, 0xD9EA},{0x695A, 0xF5A2},{0x695E, 0xD7D1},{0x6960, 0xD1F8},{0x6961, 0xEAF8},{0x6962, 0xEAF9},{0x6963, 0xDAB3}, - {0x6968, 0xEFDF},{0x696B, 0xF1EF},{0x696D, 0xE5F6},{0x696E, 0xEEBF},{0x696F, 0xE2E4},{0x6975, 0xD0BF},{0x6977, 0xFAAC},{0x6978, 0xF5D1}, - {0x6979, 0xE7B3},{0x6995, 0xE9BE},{0x699B, 0xF2CE},{0x699C, 0xDBB4},{0x69A5, 0xFCCE},{0x69A7, 0xDDEE},{0x69AE, 0xE7B4},{0x69B4, 0xD7B4}, - {0x69BB, 0xF7B4},{0x69C1, 0xCDBE},{0x69C3, 0xDAE9},{0x69CB, 0xCFB0},{0x69CC, 0xF7D9},{0x69CD, 0xF3E6},{0x69D0, 0xCED9},{0x69E8, 0xCEAA}, - {0x69EA, 0xCBC8},{0x69FB, 0xD0A7},{0x69FD, 0xF0CB},{0x69FF, 0xD0C7},{0x6A02, 0xE4C5},{0x6A0A, 0xDBE0},{0x6A11, 0xD5DA},{0x6A13, 0xD7A7}, - {0x6A17, 0xEEC0},{0x6A19, 0xF8F6},{0x6A1E, 0xF5D2},{0x6A1F, 0xEDE9},{0x6A21, 0xD9BC},{0x6A23, 0xE5C6},{0x6A35, 0xF5A3},{0x6A38, 0xDAD4}, - {0x6A39, 0xE2A7},{0x6A3A, 0xFBFC},{0x6A3D, 0xF1DC},{0x6A44, 0xCAF4},{0x6A48, 0xE8FA},{0x6A4B, 0xCEE9},{0x6A52, 0xE9F8},{0x6A53, 0xE2E5}, - {0x6A58, 0xD0B9},{0x6A59, 0xD4F2},{0x6A5F, 0xD1A6},{0x6A61, 0xDFCE},{0x6A6B, 0xFCF4},{0x6A80, 0xD3AA},{0x6A84, 0xCCAC},{0x6A89, 0xEFE0}, - {0x6A8D, 0xE5E5},{0x6A8E, 0xD0D5},{0x6A97, 0xDBFC},{0x6A9C, 0xFCE6},{0x6AA2, 0xCBFE},{0x6AA3, 0xEDEA},{0x6AB3, 0xDEB1},{0x6ABB, 0xF9E3}, - {0x6AC2, 0xD4A2},{0x6AC3, 0xCFF6},{0x6AD3, 0xD6D0},{0x6ADA, 0xD5EA},{0x6ADB, 0xF1EE},{0x6AF6, 0xFACB},{0x6AFB, 0xE5A1},{0x6B04, 0xD5B1}, - {0x6B0A, 0xCFED},{0x6B0C, 0xEDEB},{0x6B12, 0xD5B2},{0x6B16, 0xD5BC},{0x6B20, 0xFDE2},{0x6B21, 0xF3AD},{0x6B23, 0xFDDB},{0x6B32, 0xE9B0}, - {0x6B3A, 0xD1A7},{0x6B3D, 0xFDE3},{0x6B3E, 0xCEB3},{0x6B46, 0xFDE4},{0x6B47, 0xFACE},{0x6B4C, 0xCAB0},{0x6B4E, 0xF7A7},{0x6B50, 0xCFB1}, - {0x6B5F, 0xE6A2},{0x6B61, 0xFCB6},{0x6B62, 0xF2AD},{0x6B63, 0xEFE1},{0x6B64, 0xF3AE},{0x6B65, 0xDCC6},{0x6B66, 0xD9EB},{0x6B6A, 0xE8E0}, - {0x6B72, 0xE1A8},{0x6B77, 0xD5F6},{0x6B78, 0xCFFD},{0x6B7B, 0xDEDD},{0x6B7F, 0xD9D1},{0x6B83, 0xE4EA},{0x6B84, 0xF2CF},{0x6B86, 0xF7BF}, - {0x6B89, 0xE2E6},{0x6B8A, 0xE2A8},{0x6B96, 0xE3D6},{0x6B98, 0xEDD1},{0x6B9E, 0xE9F9},{0x6BAE, 0xD6B1},{0x6BAF, 0xDEB2},{0x6BB2, 0xE0E8}, - {0x6BB5, 0xD3AB},{0x6BB7, 0xEBDC},{0x6BBA, 0xDFAF},{0x6BBC, 0xCAC3},{0x6BBF, 0xEEFC},{0x6BC1, 0xFDC3},{0x6BC5, 0xEBF6},{0x6BC6, 0xCFB2}, - {0x6BCB, 0xD9EC},{0x6BCD, 0xD9BD},{0x6BCF, 0xD8DF},{0x6BD2, 0xD4B8},{0x6BD3, 0xEBBE},{0x6BD4, 0xDDEF},{0x6BD6, 0xDDF0},{0x6BD7, 0xDDF1}, - {0x6BD8, 0xDDF2},{0x6BDB, 0xD9BE},{0x6BEB, 0xFBC6},{0x6BEC, 0xCFB3},{0x6C08, 0xEEFD},{0x6C0F, 0xE4AB},{0x6C11, 0xDAC5},{0x6C13, 0xD8EC}, - {0x6C23, 0xD1A8},{0x6C34, 0xE2A9},{0x6C37, 0xDEBC},{0x6C38, 0xE7B5},{0x6C3E, 0xDBF0},{0x6C40, 0xEFE2},{0x6C41, 0xF1F0},{0x6C42, 0xCFB4}, - {0x6C4E, 0xDBF1},{0x6C50, 0xE0B1},{0x6C55, 0xDFA5},{0x6C57, 0xF9D2},{0x6C5A, 0xE7FD},{0x6C5D, 0xE6A3},{0x6C5E, 0xFBF1},{0x6C5F, 0xCBB0}, - {0x6C60, 0xF2AE},{0x6C68, 0xCDE7},{0x6C6A, 0xE8DC},{0x6C6D, 0xE7D7},{0x6C70, 0xF7C0},{0x6C72, 0xD0E3},{0x6C76, 0xDAA1},{0x6C7A, 0xCCBD}, - {0x6C7D, 0xD1A9},{0x6C7E, 0xDDCC},{0x6C81, 0xE3FE},{0x6C82, 0xD1AA},{0x6C83, 0xE8AA},{0x6C85, 0xEAB6},{0x6C86, 0xF9FA},{0x6C87, 0xE6CC}, - {0x6C88, 0xF6D8},{0x6C8C, 0xD4C7},{0x6C90, 0xD9CB},{0x6C92, 0xD9D2},{0x6C93, 0xD3CB},{0x6C94, 0xD8F7},{0x6C95, 0xDAA9},{0x6C96, 0xF5F8}, - {0x6C99, 0xDEDE},{0x6C9A, 0xF2AF},{0x6C9B, 0xF8A9},{0x6CAB, 0xD8C8},{0x6CAE, 0xEEC1},{0x6CB3, 0xF9C1},{0x6CB8, 0xDDF3},{0x6CB9, 0xEAFA}, - {0x6CBB, 0xF6BD},{0x6CBC, 0xE1BB},{0x6CBD, 0xCDBF},{0x6CBE, 0xF4D4},{0x6CBF, 0xE6CD},{0x6CC1, 0xFCCF},{0x6CC2, 0xFBA2},{0x6CC4, 0xE0DC}, - {0x6CC9, 0xF4BB},{0x6CCA, 0xDAD5},{0x6CCC, 0xF9B2},{0x6CD3, 0xFBF2},{0x6CD5, 0xDBF6},{0x6CD7, 0xDEDF},{0x6CDB, 0xDBF2},{0x6CE1, 0xF8DC}, - {0x6CE2, 0xF7EE},{0x6CE3, 0xEBE8},{0x6CE5, 0xD2FA},{0x6CE8, 0xF1BC},{0x6CEB, 0xFADA},{0x6CEE, 0xDAEA},{0x6CEF, 0xDAC6},{0x6CF0, 0xF7C1}, - {0x6CF3, 0xE7B6},{0x6D0B, 0xE5C7},{0x6D0C, 0xD6AC},{0x6D11, 0xDCC7},{0x6D17, 0xE1A9},{0x6D19, 0xE2AA},{0x6D1B, 0xD5A6},{0x6D1E, 0xD4D7}, - {0x6D25, 0xF2D0},{0x6D27, 0xEAFB},{0x6D29, 0xE0DD},{0x6D2A, 0xFBF3},{0x6D32, 0xF1BD},{0x6D35, 0xE2E7},{0x6D36, 0xFDD7},{0x6D38, 0xCEC8}, - {0x6D39, 0xEAB7},{0x6D3B, 0xFCC0},{0x6D3D, 0xFDE7},{0x6D3E, 0xF7EF},{0x6D41, 0xD7B5},{0x6D59, 0xEFBA},{0x6D5A, 0xF1DD},{0x6D5C, 0xDEB3}, - {0x6D63, 0xE8CB},{0x6D66, 0xF8DD},{0x6D69, 0xFBC7},{0x6D6A, 0xD5C8},{0x6D6C, 0xD7DF},{0x6D6E, 0xDDA9},{0x6D74, 0xE9B1},{0x6D77, 0xFAAD}, - {0x6D78, 0xF6D9},{0x6D79, 0xFAF4},{0x6D7F, 0xF8AA},{0x6D85, 0xE6EE},{0x6D87, 0xCCDC},{0x6D88, 0xE1BC},{0x6D89, 0xE0EF},{0x6D8C, 0xE9BF}, - {0x6D8D, 0xFCFD},{0x6D8E, 0xE6CE},{0x6D91, 0xE1D7},{0x6D93, 0xE6CF},{0x6D95, 0xF4F1},{0x6DAF, 0xE4F3},{0x6DB2, 0xE4FB},{0x6DB5, 0xF9E4}, - {0x6DC0, 0xEFE3},{0x6DC3, 0xCFEE},{0x6DC4, 0xF6BE},{0x6DC5, 0xE0B2},{0x6DC6, 0xFCFE},{0x6DC7, 0xD1AB},{0x6DCB, 0xD7FA},{0x6DCF, 0xFBC8}, - {0x6DD1, 0xE2D7},{0x6DD8, 0xD4A3},{0x6DD9, 0xF0F8},{0x6DDA, 0xD7A8},{0x6DDE, 0xE1E7},{0x6DE1, 0xD3BF},{0x6DE8, 0xEFE4},{0x6DEA, 0xD7C5}, - {0x6DEB, 0xEBE2},{0x6DEE, 0xFCE7},{0x6DF1, 0xE4A2},{0x6DF3, 0xE2E8},{0x6DF5, 0xE6D0},{0x6DF7, 0xFBE8},{0x6DF8, 0xF4E8},{0x6DF9, 0xE5F4}, - {0x6DFA, 0xF4BC},{0x6DFB, 0xF4D5},{0x6E17, 0xDFB6},{0x6E19, 0xFCB9},{0x6E1A, 0xEEC2},{0x6E1B, 0xCAF5},{0x6E1F, 0xEFE5},{0x6E20, 0xCBE2}, - {0x6E21, 0xD4A4},{0x6E23, 0xDEE0},{0x6E24, 0xDAFD},{0x6E25, 0xE4C6},{0x6E26, 0xE8BE},{0x6E2B, 0xE0DE},{0x6E2C, 0xF6B4},{0x6E2D, 0xEAD2}, - {0x6E2F, 0xF9FB},{0x6E32, 0xE0C2},{0x6E34, 0xCAE4},{0x6E36, 0xE7B7},{0x6E38, 0xEAFD},{0x6E3A, 0xD9DD},{0x6E3C, 0xDAB4},{0x6E3D, 0xEEAA}, - {0x6E3E, 0xFBE9},{0x6E43, 0xDBCB},{0x6E44, 0xDAB5},{0x6E4A, 0xF1BE},{0x6E4D, 0xD3AC},{0x6E56, 0xFBC9},{0x6E58, 0xDFCF},{0x6E5B, 0xD3C0}, - {0x6E5C, 0xE3D7},{0x6E5E, 0xEFE6},{0x6E5F, 0xFCD0},{0x6E67, 0xE9C0},{0x6E6B, 0xF5D3},{0x6E6E, 0xECDC},{0x6E6F, 0xF7B7},{0x6E72, 0xEAB8}, - {0x6E73, 0xD1F9},{0x6E7A, 0xDCC8},{0x6E90, 0xEAB9},{0x6E96, 0xF1DE},{0x6E9C, 0xD7B6},{0x6E9D, 0xCFB5},{0x6E9F, 0xD9A8},{0x6EA2, 0xECEE}, - {0x6EA5, 0xDDAA},{0x6EAA, 0xCDA2},{0x6EAB, 0xE8AE},{0x6EAF, 0xE1BD},{0x6EB1, 0xF2D1},{0x6EB6, 0xE9C1},{0x6EBA, 0xD2FC},{0x6EC2, 0xDBB5}, - {0x6EC4, 0xF3E7},{0x6EC5, 0xD8FE},{0x6EC9, 0xFCD1},{0x6ECB, 0xEDB2},{0x6ECC, 0xF4AF},{0x6ECE, 0xFBA3},{0x6ED1, 0xFCC1},{0x6ED3, 0xEEAB}, - {0x6ED4, 0xD4A5},{0x6EEF, 0xF4F2},{0x6EF4, 0xEED9},{0x6EF8, 0xFBCA},{0x6EFE, 0xCDE3},{0x6EFF, 0xD8BB},{0x6F01, 0xE5DB},{0x6F02, 0xF8F7}, - {0x6F06, 0xF6D4},{0x6F0F, 0xD7A9},{0x6F11, 0xCBC9},{0x6F14, 0xE6D1},{0x6F15, 0xF0CC},{0x6F20, 0xD8AE},{0x6F22, 0xF9D3},{0x6F23, 0xD5FE}, - {0x6F2B, 0xD8BC},{0x6F2C, 0xF2B0},{0x6F31, 0xE2AB},{0x6F32, 0xF3E8},{0x6F38, 0xEFC2},{0x6F3F, 0xEDEC},{0x6F41, 0xE7B8},{0x6F51, 0xDAFE}, - {0x6F54, 0xCCBE},{0x6F57, 0xF2FC},{0x6F58, 0xDAEB},{0x6F5A, 0xE2D8},{0x6F5B, 0xEDD6},{0x6F5E, 0xD6D1},{0x6F5F, 0xE0B3},{0x6F62, 0xFCD2}, - {0x6F64, 0xEBC8},{0x6F6D, 0xD3C1},{0x6F6E, 0xF0CD},{0x6F70, 0xCFF7},{0x6F7A, 0xEDD2},{0x6F7C, 0xD4D8},{0x6F7D, 0xDCC9},{0x6F7E, 0xD7F1}, - {0x6F81, 0xDFBB},{0x6F84, 0xF3A5},{0x6F88, 0xF4CD},{0x6F8D, 0xF1BF},{0x6F8E, 0xF8B1},{0x6F90, 0xE9FA},{0x6F94, 0xFBCB},{0x6F97, 0xCAD5}, - {0x6FA3, 0xF9D4},{0x6FA4, 0xF7CA},{0x6FA7, 0xD6C8},{0x6FAE, 0xFCE8},{0x6FAF, 0xF3BD},{0x6FB1, 0xEEFE},{0x6FB3, 0xE7FE},{0x6FB9, 0xD3C2}, - {0x6FBE, 0xD3B6},{0x6FC0, 0xCCAD},{0x6FC1, 0xF6FA},{0x6FC2, 0xD6B2},{0x6FC3, 0xD2D8},{0x6FCA, 0xE7D8},{0x6FD5, 0xE3A5},{0x6FDA, 0xE7B9}, - {0x6FDF, 0xF0AD},{0x6FE0, 0xFBCC},{0x6FE1, 0xEBA1},{0x6FE4, 0xD4A6},{0x6FE9, 0xFBCD},{0x6FEB, 0xD5BD},{0x6FEC, 0xF1DF},{0x6FEF, 0xF6FB}, - {0x6FF1, 0xDEB4},{0x6FFE, 0xD5EB},{0x7001, 0xE5C8},{0x7005, 0xFBA4},{0x7006, 0xD4B9},{0x7009, 0xDEE1},{0x700B, 0xE4A3},{0x700F, 0xD7B7}, - {0x7011, 0xF8EE},{0x7015, 0xDEB5},{0x7018, 0xD6D2},{0x701A, 0xF9D5},{0x701B, 0xE7BA},{0x701C, 0xEBD5},{0x701D, 0xD5F7},{0x701E, 0xEFE7}, - {0x701F, 0xE1BE},{0x7023, 0xFAAE},{0x7027, 0xD6E9},{0x7028, 0xD6EE},{0x702F, 0xE7BB},{0x7037, 0xECCB},{0x703E, 0xD5B3},{0x704C, 0xCEB4}, - {0x7050, 0xFBA5},{0x7051, 0xE1EE},{0x7058, 0xF7A8},{0x705D, 0xFBCE},{0x7063, 0xD8BD},{0x706B, 0xFBFD},{0x7070, 0xFCE9},{0x7078, 0xCFB6}, - {0x707C, 0xEDC7},{0x707D, 0xEEAC},{0x7085, 0xCCDD},{0x708A, 0xF6A7},{0x708E, 0xE6FA},{0x7092, 0xF5A4},{0x7098, 0xFDDC},{0x7099, 0xEDB3}, - {0x709A, 0xCEC9},{0x70A1, 0xEFE8},{0x70A4, 0xE1BF},{0x70AB, 0xFADB},{0x70AC, 0xCBE3},{0x70AD, 0xF7A9},{0x70AF, 0xFBA6},{0x70B3, 0xDCB9}, - {0x70B7, 0xF1C0},{0x70B8, 0xEDC8},{0x70B9, 0xEFC3},{0x70C8, 0xD6AD},{0x70CB, 0xFDCE},{0x70CF, 0xE8A1},{0x70D8, 0xFBF4},{0x70D9, 0xD5A7}, - {0x70DD, 0xF1F6},{0x70DF, 0xE6D3},{0x70F1, 0xCCDE},{0x70F9, 0xF8B2},{0x70FD, 0xDCEB},{0x7104, 0xFDB6},{0x7109, 0xE5EA},{0x710C, 0xF1E0}, - {0x7119, 0xDBCC},{0x711A, 0xDDCD},{0x711E, 0xD4C8},{0x7121, 0xD9ED},{0x7126, 0xF5A5},{0x7130, 0xE6FB},{0x7136, 0xE6D4},{0x7147, 0xFDC8}, - {0x7149, 0xD6A1},{0x714A, 0xFDBF},{0x714C, 0xFCD3},{0x714E, 0xEFA1},{0x7150, 0xE7BC},{0x7156, 0xD1EE},{0x7159, 0xE6D5},{0x715C, 0xE9F2}, - {0x715E, 0xDFB0},{0x7164, 0xD8E0},{0x7165, 0xFCBA},{0x7166, 0xFDAF},{0x7167, 0xF0CE},{0x7169, 0xDBE1},{0x716C, 0xE5C9},{0x716E, 0xEDB4}, - {0x717D, 0xE0C3},{0x7184, 0xE3D8},{0x7189, 0xE9FB},{0x718A, 0xEAA8},{0x718F, 0xFDB7},{0x7192, 0xFBA7},{0x7194, 0xE9C2},{0x7199, 0xFDF7}, - {0x719F, 0xE2D9},{0x71A2, 0xDCEC},{0x71AC, 0xE8A2},{0x71B1, 0xE6F0},{0x71B9, 0xFDF8},{0x71BA, 0xFDF9},{0x71BE, 0xF6BF},{0x71C1, 0xE7A7}, - {0x71C3, 0xE6D7},{0x71C8, 0xD4F3},{0x71C9, 0xD4C9},{0x71CE, 0xD6FA},{0x71D0, 0xD7F2},{0x71D2, 0xE1C0},{0x71D4, 0xDBE2},{0x71D5, 0xE6D8}, - {0x71DF, 0xE7BD},{0x71E5, 0xF0CF},{0x71E6, 0xF3BE},{0x71E7, 0xE2AC},{0x71ED, 0xF5B7},{0x71EE, 0xE0F0},{0x71FB, 0xFDB8},{0x71FC, 0xE3E8}, - {0x71FE, 0xD4A7},{0x71FF, 0xE8FC},{0x7200, 0xFAD2},{0x7206, 0xF8EF},{0x7210, 0xD6D3},{0x721B, 0xD5B4},{0x722A, 0xF0D0},{0x722C, 0xF7F0}, - {0x722D, 0xEEB3},{0x7230, 0xEABA},{0x7232, 0xEAD3},{0x7235, 0xEDC9},{0x7236, 0xDDAB},{0x723A, 0xE5AC},{0x723B, 0xFDA1},{0x723D, 0xDFD0}, - {0x723E, 0xECB3},{0x7240, 0xDFD1},{0x7246, 0xEDED},{0x7247, 0xF8B8},{0x7248, 0xF7FA},{0x724C, 0xF8AB},{0x7252, 0xF4E0},{0x7258, 0xD4BA}, - {0x7259, 0xE4B3},{0x725B, 0xE9DA},{0x725D, 0xDEB6},{0x725F, 0xD9BF},{0x7261, 0xD9C0},{0x7262, 0xD6EF},{0x7267, 0xD9CC},{0x7269, 0xDAAA}, - {0x7272, 0xDFE5},{0x7279, 0xF7E5},{0x727D, 0xCCB2},{0x7280, 0xDFF9},{0x7281, 0xD7E0},{0x72A2, 0xD4BB},{0x72A7, 0xFDFA},{0x72AC, 0xCCB3}, - {0x72AF, 0xDBF3},{0x72C0, 0xDFD2},{0x72C2, 0xCECA},{0x72C4, 0xEEDA},{0x72CE, 0xE4E4},{0x72D0, 0xFBCF},{0x72D7, 0xCFB7},{0x72D9, 0xEEC3}, - {0x72E1, 0xCEEA},{0x72E9, 0xE2AD},{0x72F8, 0xD7E1},{0x72F9, 0xFAF5},{0x72FC, 0xD5C9},{0x72FD, 0xF8AC},{0x730A, 0xE7D9},{0x7316, 0xF3E9}, - {0x731B, 0xD8ED},{0x731C, 0xE3C4},{0x731D, 0xF0F1},{0x7325, 0xE8E5},{0x7329, 0xE0FA},{0x732A, 0xEEC4},{0x732B, 0xD9DE},{0x7336, 0xEBA2}, - {0x7337, 0xEBA3},{0x733E, 0xFCC2},{0x733F, 0xEABB},{0x7344, 0xE8AB},{0x7345, 0xDEE2},{0x7350, 0xEDEF},{0x7352, 0xE8A3},{0x7357, 0xCFF1}, - {0x7368, 0xD4BC},{0x736A, 0xFCEA},{0x7370, 0xE7BE},{0x7372, 0xFCF2},{0x7375, 0xD6B4},{0x7378, 0xE2AE},{0x737A, 0xD3B7},{0x737B, 0xFACC}, - {0x7384, 0xFADC},{0x7386, 0xEDB5},{0x7387, 0xE1E3},{0x7389, 0xE8AC},{0x738B, 0xE8DD},{0x738E, 0xEFE9},{0x7394, 0xF4BD},{0x7396, 0xCFB8}, - {0x7397, 0xE9DB},{0x7398, 0xD1AC},{0x739F, 0xDAC7},{0x73A7, 0xEBC9},{0x73A9, 0xE8CC},{0x73AD, 0xDEB7},{0x73B2, 0xD6BC},{0x73B3, 0xD3E5}, - {0x73B9, 0xFADD},{0x73C0, 0xDAD6},{0x73C2, 0xCAB1},{0x73C9, 0xDAC8},{0x73CA, 0xDFA6},{0x73CC, 0xF9B3},{0x73CD, 0xF2D2},{0x73CF, 0xCAC4}, - {0x73D6, 0xCECB},{0x73D9, 0xCDF5},{0x73DD, 0xFDB0},{0x73DE, 0xD5A8},{0x73E0, 0xF1C1},{0x73E3, 0xE2E9},{0x73E4, 0xDCCA},{0x73E5, 0xECB4}, - {0x73E6, 0xFAC0},{0x73E9, 0xFBA8},{0x73EA, 0xD0A8},{0x73ED, 0xDAEC},{0x73F7, 0xD9EE},{0x73F9, 0xE0FB},{0x73FD, 0xEFEA},{0x73FE, 0xFADE}, - {0x7401, 0xE0C4},{0x7403, 0xCFB9},{0x7405, 0xD5CA},{0x7406, 0xD7E2},{0x7407, 0xE2AF},{0x7409, 0xD7B8},{0x7413, 0xE8CD},{0x741B, 0xF6DA}, - {0x7420, 0xEFA2},{0x7421, 0xE2DA},{0x7422, 0xF6FC},{0x7425, 0xFBD0},{0x7426, 0xD1AD},{0x7428, 0xCDE4},{0x742A, 0xD1AE},{0x742B, 0xDCED}, - {0x742C, 0xE8CE},{0x742E, 0xF0F9},{0x742F, 0xCEB5},{0x7430, 0xE6FC},{0x7433, 0xD7FB},{0x7434, 0xD0D6},{0x7435, 0xDDF5},{0x7436, 0xF7F1}, - {0x7438, 0xF6FD},{0x743A, 0xDBF7},{0x743F, 0xFBEA},{0x7440, 0xE9DC},{0x7441, 0xD9C1},{0x7443, 0xF5F2},{0x7444, 0xE0C5},{0x744B, 0xEAD4}, - {0x7455, 0xF9C2},{0x7457, 0xEABC},{0x7459, 0xD2C5},{0x745A, 0xFBD1},{0x745B, 0xE7C0},{0x745C, 0xEBA5},{0x745E, 0xDFFA},{0x745F, 0xE3A2}, - {0x7460, 0xD7B9},{0x7462, 0xE9C3},{0x7464, 0xE8FD},{0x7465, 0xE8AF},{0x7468, 0xF2D3},{0x7469, 0xFBA9},{0x746A, 0xD8A5},{0x746F, 0xD5CB}, - {0x747E, 0xD0C8},{0x7482, 0xD1AF},{0x7483, 0xD7E3},{0x7487, 0xE0C6},{0x7489, 0xD6A2},{0x748B, 0xEDF0},{0x7498, 0xD7F3},{0x749C, 0xFCD4}, - {0x749E, 0xDAD7},{0x749F, 0xCCDF},{0x74A1, 0xF2D4},{0x74A3, 0xD1B0},{0x74A5, 0xCCE0},{0x74A7, 0xDBFD},{0x74A8, 0xF3BF},{0x74AA, 0xF0D1}, - {0x74B0, 0xFCBB},{0x74B2, 0xE2B0},{0x74B5, 0xE6A5},{0x74B9, 0xE2DB},{0x74BD, 0xDFDE},{0x74BF, 0xE0C7},{0x74C6, 0xF2EF},{0x74CA, 0xCCE1}, - {0x74CF, 0xD6EA},{0x74D4, 0xE7C2},{0x74D8, 0xCEB6},{0x74DA, 0xF3C0},{0x74DC, 0xCDFE},{0x74E0, 0xFBD2},{0x74E2, 0xF8F8},{0x74E3, 0xF7FB}, - {0x74E6, 0xE8BF},{0x74EE, 0xE8B7},{0x74F7, 0xEDB6},{0x7501, 0xDCBA},{0x7504, 0xCCB4},{0x7511, 0xF1F7},{0x7515, 0xE8B8},{0x7518, 0xCAF6}, - {0x751A, 0xE4A4},{0x751B, 0xF4D6},{0x751F, 0xDFE6},{0x7523, 0xDFA7},{0x7525, 0xDFE7},{0x7526, 0xE1C1},{0x7528, 0xE9C4},{0x752B, 0xDCCB}, - {0x752C, 0xE9C5},{0x7530, 0xEFA3},{0x7531, 0xEBA6},{0x7532, 0xCBA3},{0x7533, 0xE3E9},{0x7537, 0xD1FB},{0x7538, 0xEFA4},{0x753A, 0xEFEB}, - {0x7547, 0xD0B4},{0x754C, 0xCDA3},{0x754F, 0xE8E6},{0x7551, 0xEFA5},{0x7553, 0xD3CC},{0x7554, 0xDAED},{0x7559, 0xD7BA},{0x755B, 0xF2D5}, - {0x755C, 0xF5E5},{0x755D, 0xD9EF},{0x7562, 0xF9B4},{0x7565, 0xD5D4},{0x7566, 0xFDCF},{0x756A, 0xDBE3},{0x756F, 0xF1E1},{0x7570, 0xECB6}, - {0x7575, 0xFBFE},{0x7576, 0xD3D7},{0x7578, 0xD1B1},{0x757A, 0xCBB1},{0x757F, 0xD1B2},{0x7586, 0xCBB2},{0x7587, 0xF1C2},{0x758A, 0xF4E1}, - {0x758B, 0xF9B5},{0x758E, 0xE1C3},{0x758F, 0xE1C2},{0x7591, 0xEBF7},{0x759D, 0xDFA8},{0x75A5, 0xCBCA},{0x75AB, 0xE6B9},{0x75B1, 0xF8DE}, - {0x75B2, 0xF9AA},{0x75B3, 0xCAF7},{0x75B5, 0xEDB7},{0x75B8, 0xD3B8},{0x75B9, 0xF2D6},{0x75BC, 0xD4D9},{0x75BD, 0xEEC5},{0x75BE, 0xF2F0}, - {0x75C2, 0xCAB2},{0x75C5, 0xDCBB},{0x75C7, 0xF1F8},{0x75CD, 0xECB7},{0x75D2, 0xE5CA},{0x75D4, 0xF6C0},{0x75D5, 0xFDDD},{0x75D8, 0xD4E3}, - {0x75D9, 0xCCE2},{0x75DB, 0xF7D4},{0x75E2, 0xD7E5},{0x75F0, 0xD3C3},{0x75F2, 0xD8A6},{0x75F4, 0xF6C1},{0x75FA, 0xDDF6},{0x75FC, 0xCDC0}, - {0x7600, 0xE5DC},{0x760D, 0xE5CB},{0x7619, 0xE1C4},{0x761F, 0xE8B0},{0x7620, 0xF4B0},{0x7621, 0xF3EA},{0x7622, 0xDAEE},{0x7624, 0xD7BB}, - {0x7626, 0xE2B1},{0x763B, 0xD7AA},{0x7642, 0xD6FB},{0x764C, 0xE4DF},{0x764E, 0xCAD6},{0x7652, 0xEBA8},{0x7656, 0xDBFE},{0x7661, 0xF6C2}, - {0x7664, 0xEFBB},{0x7669, 0xD4FD},{0x766C, 0xE0C8},{0x7670, 0xE8B9},{0x7672, 0xEFA6},{0x7678, 0xCDA4},{0x767B, 0xD4F4},{0x767C, 0xDBA1}, - {0x767D, 0xDBDC},{0x767E, 0xDBDD},{0x7684, 0xEEDC},{0x7686, 0xCBCB},{0x7687, 0xFCD5},{0x768E, 0xCEEB},{0x7690, 0xCDC1},{0x7693, 0xFBD3}, - {0x76AE, 0xF9AB},{0x76BA, 0xF5D4},{0x76BF, 0xD9A9},{0x76C2, 0xE9DD},{0x76C3, 0xDBCD},{0x76C6, 0xDDCE},{0x76C8, 0xE7C3},{0x76CA, 0xECCC}, - {0x76D2, 0xF9EC},{0x76D6, 0xCBCC},{0x76DB, 0xE0FC},{0x76DC, 0xD4A8},{0x76DE, 0xEDD3},{0x76DF, 0xD8EF},{0x76E1, 0xF2D7},{0x76E3, 0xCAF8}, - {0x76E4, 0xDAEF},{0x76E7, 0xD6D4},{0x76EE, 0xD9CD},{0x76F2, 0xD8EE},{0x76F4, 0xF2C1},{0x76F8, 0xDFD3},{0x76FC, 0xDAF0},{0x76FE, 0xE2EA}, - {0x7701, 0xE0FD},{0x7704, 0xD8F8},{0x7708, 0xF7AF},{0x7709, 0xDAB6},{0x770B, 0xCAD7},{0x771E, 0xF2D8},{0x7720, 0xD8F9},{0x7729, 0xFADF}, - {0x7737, 0xCFEF},{0x7738, 0xD9C2},{0x773A, 0xF0D2},{0x773C, 0xE4D1},{0x7740, 0xF3B7},{0x774D, 0xFAE0},{0x775B, 0xEFEC},{0x7761, 0xE2B2}, - {0x7763, 0xD4BD},{0x7766, 0xD9CE},{0x776B, 0xF4E2},{0x7779, 0xD4A9},{0x777E, 0xCDC2},{0x777F, 0xE7DA},{0x778B, 0xF2D9},{0x7791, 0xD9AA}, - {0x779E, 0xD8BE},{0x77A5, 0xDCAD},{0x77AC, 0xE2EB},{0x77AD, 0xD6FC},{0x77B0, 0xCAF9},{0x77B3, 0xD4DA},{0x77BB, 0xF4D7},{0x77BC, 0xCCA1}, - {0x77BF, 0xCFBA},{0x77D7, 0xF5B8},{0x77DB, 0xD9C3},{0x77DC, 0xD0E8},{0x77E2, 0xE3C5},{0x77E3, 0xEBF8},{0x77E5, 0xF2B1},{0x77E9, 0xCFBB}, - {0x77ED, 0xD3AD},{0x77EE, 0xE8E1},{0x77EF, 0xCEEC},{0x77F3, 0xE0B4},{0x7802, 0xDEE3},{0x7812, 0xDDF7},{0x7825, 0xF2B2},{0x7826, 0xF3F6}, - {0x7827, 0xF6DB},{0x782C, 0xD7FE},{0x7832, 0xF8DF},{0x7834, 0xF7F2},{0x7845, 0xD0A9},{0x784F, 0xE6DA},{0x785D, 0xF5A6},{0x786B, 0xD7BC}, - {0x786C, 0xCCE3},{0x786F, 0xE6DB},{0x787C, 0xDDDD},{0x7881, 0xD1B3},{0x7887, 0xEFED},{0x788C, 0xD6DE},{0x788D, 0xE4F4},{0x788E, 0xE1EF}, - {0x7891, 0xDDF8},{0x7897, 0xE8CF},{0x78A3, 0xCAE5},{0x78A7, 0xDCA1},{0x78A9, 0xE0B5},{0x78BA, 0xFCAC},{0x78BB, 0xFCAD},{0x78BC, 0xD8A7}, - {0x78C1, 0xEDB8},{0x78C5, 0xDBB6},{0x78CA, 0xD6F0},{0x78CB, 0xF3AF},{0x78CE, 0xCDA5},{0x78D0, 0xDAF1},{0x78E8, 0xD8A8},{0x78EC, 0xCCE4}, - {0x78EF, 0xD1B4},{0x78F5, 0xCAD8},{0x78FB, 0xDAF2},{0x7901, 0xF5A7},{0x790E, 0xF5A8},{0x7916, 0xE6A6},{0x792A, 0xD5EC},{0x792B, 0xD5F8}, - {0x792C, 0xDAF3},{0x793A, 0xE3C6},{0x793E, 0xDEE4},{0x7940, 0xDEE5},{0x7941, 0xD1B5},{0x7947, 0xD1B6},{0x7948, 0xD1B7},{0x7949, 0xF2B3}, - {0x7950, 0xE9DE},{0x7956, 0xF0D3},{0x7957, 0xF2B4},{0x795A, 0xF0D4},{0x795B, 0xCBE4},{0x795C, 0xFBD4},{0x795D, 0xF5E6},{0x795E, 0xE3EA}, - {0x7960, 0xDEE6},{0x7965, 0xDFD4},{0x7968, 0xF8F9},{0x796D, 0xF0AE},{0x797A, 0xD1B8},{0x797F, 0xD6DF},{0x7981, 0xD0D7},{0x798D, 0xFCA1}, - {0x798E, 0xEFEE},{0x798F, 0xDCD8},{0x7991, 0xE9DF},{0x79A6, 0xE5DD},{0x79A7, 0xFDFB},{0x79AA, 0xE0C9},{0x79AE, 0xD6C9},{0x79B1, 0xD4AA}, - {0x79B3, 0xE5CC},{0x79B9, 0xE9E0},{0x79BD, 0xD0D8},{0x79BE, 0xFCA2},{0x79BF, 0xD4BE},{0x79C0, 0xE2B3},{0x79C1, 0xDEE7},{0x79C9, 0xDCBC}, - {0x79CA, 0xD2B6},{0x79CB, 0xF5D5},{0x79D1, 0xCEA1},{0x79D2, 0xF5A9},{0x79D5, 0xDDF9},{0x79D8, 0xDDFA},{0x79DF, 0xF0D5},{0x79E4, 0xF6DF}, - {0x79E6, 0xF2DA},{0x79E7, 0xE4EB},{0x79E9, 0xF2F1},{0x79FB, 0xECB9},{0x7A00, 0xFDFC},{0x7A05, 0xE1AA},{0x7A08, 0xCAD9},{0x7A0B, 0xEFEF}, - {0x7A0D, 0xF5AA},{0x7A14, 0xECF9},{0x7A17, 0xF8AD},{0x7A19, 0xF2C2},{0x7A1A, 0xF6C3},{0x7A1C, 0xD7D2},{0x7A1F, 0xF9A2},{0x7A20, 0xF0D6}, - {0x7A2E, 0xF0FA},{0x7A31, 0xF6E0},{0x7A36, 0xE9F3},{0x7A37, 0xF2C3},{0x7A3B, 0xD4AB},{0x7A3C, 0xCAB3},{0x7A3D, 0xCDA6},{0x7A3F, 0xCDC3}, - {0x7A40, 0xCDDA},{0x7A46, 0xD9CF},{0x7A49, 0xF6C4},{0x7A4D, 0xEEDD},{0x7A4E, 0xE7C4},{0x7A57, 0xE2B4},{0x7A61, 0xDFE2},{0x7A62, 0xE7DB}, - {0x7A69, 0xE8B1},{0x7A6B, 0xFCAE},{0x7A70, 0xE5CD},{0x7A74, 0xFAEB},{0x7A76, 0xCFBC},{0x7A79, 0xCFE2},{0x7A7A, 0xCDF6},{0x7A7D, 0xEFF0}, - {0x7A7F, 0xF4BE},{0x7A81, 0xD4CD},{0x7A84, 0xF3B8},{0x7A88, 0xE9A1},{0x7A92, 0xF2F2},{0x7A93, 0xF3EB},{0x7A95, 0xF0D7},{0x7A98, 0xCFD7}, - {0x7A9F, 0xCFDF},{0x7AA9, 0xE8C0},{0x7AAA, 0xE8C1},{0x7AAE, 0xCFE3},{0x7AAF, 0xE9A2},{0x7ABA, 0xD0AA},{0x7AC4, 0xF3C1},{0x7AC5, 0xD0AB}, - {0x7AC7, 0xD4E4},{0x7ACA, 0xEFBC},{0x7ACB, 0xD8A1},{0x7AD7, 0xD9DF},{0x7AD9, 0xF3D7},{0x7ADD, 0xDCBD},{0x7ADF, 0xCCE5},{0x7AE0, 0xEDF1}, - {0x7AE3, 0xF1E2},{0x7AE5, 0xD4DB},{0x7AEA, 0xE2B5},{0x7AED, 0xCAE6},{0x7AEF, 0xD3AE},{0x7AF6, 0xCCE6},{0x7AF9, 0xF1D3},{0x7AFA, 0xF5E7}, - {0x7AFF, 0xCADA},{0x7B0F, 0xFBEE},{0x7B11, 0xE1C5},{0x7B19, 0xDFE9},{0x7B1B, 0xEEDE},{0x7B1E, 0xF7C2},{0x7B20, 0xD8A2},{0x7B26, 0xDDAC}, - {0x7B2C, 0xF0AF},{0x7B2D, 0xD6BD},{0x7B39, 0xE1AB},{0x7B46, 0xF9B6},{0x7B49, 0xD4F5},{0x7B4B, 0xD0C9},{0x7B4C, 0xEFA7},{0x7B4D, 0xE2EC}, - {0x7B4F, 0xDBEA},{0x7B50, 0xCECC},{0x7B51, 0xF5E8},{0x7B52, 0xF7D5},{0x7B54, 0xD3CD},{0x7B56, 0xF3FE},{0x7B60, 0xD0B5},{0x7B6C, 0xE0FE}, - {0x7B6E, 0xDFFB},{0x7B75, 0xE6DD},{0x7B7D, 0xE8A4},{0x7B87, 0xCBCD},{0x7B8B, 0xEFA8},{0x7B8F, 0xEEB4},{0x7B94, 0xDAD8},{0x7B95, 0xD1B9}, - {0x7B97, 0xDFA9},{0x7B9A, 0xF3B0},{0x7B9D, 0xCCC4},{0x7BA1, 0xCEB7},{0x7BAD, 0xEFA9},{0x7BB1, 0xDFD5},{0x7BB4, 0xEDD7},{0x7BB8, 0xEEC6}, - {0x7BC0, 0xEFBD},{0x7BC1, 0xFCD6},{0x7BC4, 0xDBF4},{0x7BC6, 0xEFAA},{0x7BC7, 0xF8B9},{0x7BC9, 0xF5E9},{0x7BD2, 0xE3D9},{0x7BE0, 0xE1C6}, - {0x7BE4, 0xD4BF},{0x7BE9, 0xDEE8},{0x7C07, 0xF0EA},{0x7C12, 0xF3C2},{0x7C1E, 0xD3AF},{0x7C21, 0xCADB},{0x7C27, 0xFCD7},{0x7C2A, 0xEDD8}, - {0x7C2B, 0xE1C7},{0x7C3D, 0xF4D8},{0x7C3E, 0xD6B3},{0x7C3F, 0xDDAD},{0x7C43, 0xD5BE},{0x7C4C, 0xF1C3},{0x7C4D, 0xEEDF},{0x7C60, 0xD6EB}, - {0x7C64, 0xF4D9},{0x7C6C, 0xD7E6},{0x7C73, 0xDAB7},{0x7C83, 0xDDFB},{0x7C89, 0xDDCF},{0x7C92, 0xD8A3},{0x7C95, 0xDAD9},{0x7C97, 0xF0D8}, - {0x7C98, 0xEFC4},{0x7C9F, 0xE1D8},{0x7CA5, 0xF1D4},{0x7CA7, 0xEDF2},{0x7CAE, 0xD5DB},{0x7CB1, 0xD5DC},{0x7CB2, 0xF3C4},{0x7CB3, 0xCBD7}, - {0x7CB9, 0xE2B6},{0x7CBE, 0xEFF1},{0x7CCA, 0xFBD5},{0x7CD6, 0xD3D8},{0x7CDE, 0xDDD0},{0x7CDF, 0xF0D9},{0x7CE0, 0xCBB3},{0x7CE7, 0xD5DD}, - {0x7CFB, 0xCDA7},{0x7CFE, 0xD0AC},{0x7D00, 0xD1BA},{0x7D02, 0xF1C4},{0x7D04, 0xE5B3},{0x7D05, 0xFBF5},{0x7D06, 0xE9E1},{0x7D07, 0xFDE0}, - {0x7D08, 0xFCBC},{0x7D0A, 0xDAA2},{0x7D0B, 0xDAA3},{0x7D0D, 0xD2A1},{0x7D10, 0xD2EF},{0x7D14, 0xE2ED},{0x7D17, 0xDEE9},{0x7D18, 0xCEDC}, - {0x7D19, 0xF2B5},{0x7D1A, 0xD0E4},{0x7D1B, 0xDDD1},{0x7D20, 0xE1C8},{0x7D21, 0xDBB7},{0x7D22, 0xDFE3},{0x7D2B, 0xEDB9},{0x7D2C, 0xF1C5}, - {0x7D2E, 0xF3CF},{0x7D2F, 0xD7AB},{0x7D30, 0xE1AC},{0x7D33, 0xE3EB},{0x7D35, 0xEEC7},{0x7D39, 0xE1C9},{0x7D3A, 0xCAFA},{0x7D42, 0xF0FB}, - {0x7D43, 0xFAE1},{0x7D44, 0xF0DA},{0x7D45, 0xCCE7},{0x7D46, 0xDAF4},{0x7D50, 0xCCBF},{0x7D5E, 0xCEED},{0x7D61, 0xD5A9},{0x7D62, 0xFAE2}, - {0x7D66, 0xD0E5},{0x7D68, 0xEBD6},{0x7D6A, 0xECDF},{0x7D6E, 0xDFFC},{0x7D71, 0xF7D6},{0x7D72, 0xDEEA},{0x7D73, 0xCBB4},{0x7D76, 0xEFBE}, - {0x7D79, 0xCCB5},{0x7D7F, 0xCFBD},{0x7D8E, 0xEFF2},{0x7D8F, 0xE2B7},{0x7D93, 0xCCE8},{0x7D9C, 0xF0FC},{0x7DA0, 0xD6E0},{0x7DA2, 0xF1C6}, - {0x7DAC, 0xE2B8},{0x7DAD, 0xEBAB},{0x7DB1, 0xCBB5},{0x7DB2, 0xD8D1},{0x7DB4, 0xF4CE},{0x7DB5, 0xF3F7},{0x7DB8, 0xD7C6},{0x7DBA, 0xD1BB}, - {0x7DBB, 0xF7AA},{0x7DBD, 0xEDCA},{0x7DBE, 0xD7D3},{0x7DBF, 0xD8FA},{0x7DC7, 0xF6C5},{0x7DCA, 0xD1CC},{0x7DCB, 0xDDFC},{0x7DD6, 0xDFFD}, - {0x7DD8, 0xF9E5},{0x7DDA, 0xE0CA},{0x7DDD, 0xF2FD},{0x7DDE, 0xD3B0},{0x7DE0, 0xF4F3},{0x7DE1, 0xDAC9},{0x7DE3, 0xE6DE},{0x7DE8, 0xF8BA}, - {0x7DE9, 0xE8D0},{0x7DEC, 0xD8FB},{0x7DEF, 0xEAD5},{0x7DF4, 0xD6A3},{0x7DFB, 0xF6C6},{0x7E09, 0xF2DB},{0x7E0A, 0xE4FC},{0x7E15, 0xE8B2}, - {0x7E1B, 0xDADA},{0x7E1D, 0xF2DC},{0x7E1E, 0xFBD6},{0x7E1F, 0xE9B2},{0x7E21, 0xEEAD},{0x7E23, 0xFAE3},{0x7E2B, 0xDCEE},{0x7E2E, 0xF5EA}, - {0x7E2F, 0xE6E0},{0x7E31, 0xF0FD},{0x7E37, 0xD7AC},{0x7E3D, 0xF5C5},{0x7E3E, 0xEEE0},{0x7E41, 0xDBE5},{0x7E43, 0xDDDE},{0x7E46, 0xD9F0}, - {0x7E47, 0xE9A3},{0x7E52, 0xF1F9},{0x7E54, 0xF2C4},{0x7E55, 0xE0CB},{0x7E5E, 0xE9A4},{0x7E61, 0xE2B9},{0x7E69, 0xE3B1},{0x7E6A, 0xFCEB}, - {0x7E6B, 0xCDA8},{0x7E6D, 0xCCB6},{0x7E70, 0xF0DB},{0x7E79, 0xE6BA},{0x7E7C, 0xCDA9},{0x7E82, 0xF3C3},{0x7E8C, 0xE1D9},{0x7E8F, 0xEFAB}, - {0x7E93, 0xE7C5},{0x7E96, 0xE0E9},{0x7E98, 0xF3C5},{0x7E9B, 0xD4C0},{0x7E9C, 0xD5BF},{0x7F36, 0xDDAE},{0x7F38, 0xF9FC},{0x7F3A, 0xCCC0}, - {0x7F4C, 0xE5A2},{0x7F50, 0xCEB8},{0x7F54, 0xD8D2},{0x7F55, 0xF9D6},{0x7F6A, 0xF1AA},{0x7F6B, 0xCED1},{0x7F6E, 0xF6C7},{0x7F70, 0xDBEB}, - {0x7F72, 0xDFFE},{0x7F75, 0xD8E1},{0x7F77, 0xF7F3},{0x7F79, 0xD7E7},{0x7F85, 0xD4FE},{0x7F88, 0xD1BC},{0x7F8A, 0xE5CF},{0x7F8C, 0xCBB6}, - {0x7F8E, 0xDAB8},{0x7F94, 0xCDC4},{0x7F9A, 0xD6BE},{0x7F9E, 0xE2BA},{0x7FA4, 0xCFD8},{0x7FA8, 0xE0CC},{0x7FA9, 0xEBF9},{0x7FB2, 0xFDFD}, - {0x7FB8, 0xD7E8},{0x7FB9, 0xCBD8},{0x7FBD, 0xE9E2},{0x7FC1, 0xE8BA},{0x7FC5, 0xE3C7},{0x7FCA, 0xECCD},{0x7FCC, 0xECCE},{0x7FCE, 0xD6BF}, - {0x7FD2, 0xE3A7},{0x7FD4, 0xDFD6},{0x7FD5, 0xFDE8},{0x7FDF, 0xEEE1},{0x7FE0, 0xF6A8},{0x7FE1, 0xDDFD},{0x7FE9, 0xF8BB},{0x7FEB, 0xE8D1}, - {0x7FF0, 0xF9D7},{0x7FF9, 0xCEEE},{0x7FFC, 0xECCF},{0x8000, 0xE9A5},{0x8001, 0xD6D5},{0x8003, 0xCDC5},{0x8005, 0xEDBA},{0x8006, 0xD1BD}, - {0x8009, 0xCFBE},{0x800C, 0xECBB},{0x8010, 0xD2B1},{0x8015, 0xCCE9},{0x8017, 0xD9C4},{0x8018, 0xE9FC},{0x802D, 0xD1BE},{0x8033, 0xECBC}, - {0x8036, 0xE5AD},{0x803D, 0xF7B0},{0x803F, 0xCCEA},{0x8043, 0xD3C4},{0x8046, 0xD6C0},{0x804A, 0xD6FD},{0x8056, 0xE1A1},{0x8058, 0xDEBD}, - {0x805A, 0xF6A9},{0x805E, 0xDAA4},{0x806F, 0xD6A4},{0x8070, 0xF5C6},{0x8072, 0xE1A2},{0x8073, 0xE9C6},{0x8077, 0xF2C5},{0x807D, 0xF4E9}, - {0x807E, 0xD6EC},{0x807F, 0xEBD3},{0x8084, 0xECBD},{0x8085, 0xE2DC},{0x8086, 0xDEEB},{0x8087, 0xF0DC},{0x8089, 0xEBBF},{0x808B, 0xD7CE}, - {0x808C, 0xD1BF},{0x8096, 0xF5AB},{0x809B, 0xF9FD},{0x809D, 0xCADC},{0x80A1, 0xCDC6},{0x80A2, 0xF2B6},{0x80A5, 0xDDFE},{0x80A9, 0xCCB7}, - {0x80AA, 0xDBB8},{0x80AF, 0xD0E9},{0x80B1, 0xCEDD},{0x80B2, 0xEBC0},{0x80B4, 0xFDA2},{0x80BA, 0xF8CB},{0x80C3, 0xEAD6},{0x80C4, 0xF1B0}, - {0x80CC, 0xDBCE},{0x80CE, 0xF7C3},{0x80DA, 0xDBCF},{0x80DB, 0xCBA4},{0x80DE, 0xF8E0},{0x80E1, 0xFBD7},{0x80E4, 0xEBCA},{0x80E5, 0xE0A1}, - {0x80F1, 0xCECD},{0x80F4, 0xD4DC},{0x80F8, 0xFDD8},{0x80FD, 0xD2F6},{0x8102, 0xF2B7},{0x8105, 0xFAF6},{0x8106, 0xF6AA},{0x8107, 0xFAF7}, - {0x8108, 0xD8E6},{0x810A, 0xF4B1},{0x8118, 0xE8D2},{0x811A, 0xCAC5},{0x811B, 0xCCEB},{0x8123, 0xE2EE},{0x8129, 0xE2BB},{0x812B, 0xF7AD}, - {0x812F, 0xF8E1},{0x8139, 0xF3EC},{0x813E, 0xDEA1},{0x814B, 0xE4FD},{0x814E, 0xE3EC},{0x8150, 0xDDAF},{0x8151, 0xDDB0},{0x8154, 0xCBB7}, - {0x8155, 0xE8D3},{0x8165, 0xE1A3},{0x8166, 0xD2E0},{0x816B, 0xF0FE},{0x8170, 0xE9A6},{0x8171, 0xCBF2},{0x8178, 0xEDF3},{0x8179, 0xDCD9}, - {0x817A, 0xE0CD},{0x817F, 0xF7DA},{0x8180, 0xDBB9},{0x8188, 0xCCAE},{0x818A, 0xDADB},{0x818F, 0xCDC7},{0x819A, 0xDDB1},{0x819C, 0xD8AF}, - {0x819D, 0xE3A3},{0x81A0, 0xCEEF},{0x81A3, 0xF2F3},{0x81A8, 0xF8B3},{0x81B3, 0xE0CE},{0x81B5, 0xF5FD},{0x81BA, 0xEBEC},{0x81BD, 0xD3C5}, - {0x81BE, 0xFCEC},{0x81BF, 0xD2DB},{0x81C0, 0xD4EB},{0x81C2, 0xDEA2},{0x81C6, 0xE5E6},{0x81CD, 0xF0B0},{0x81D8, 0xD5C4},{0x81DF, 0xEDF4}, - {0x81E3, 0xE3ED},{0x81E5, 0xE8C2},{0x81E7, 0xEDF5},{0x81E8, 0xD7FC},{0x81EA, 0xEDBB},{0x81ED, 0xF6AB},{0x81F3, 0xF2B8},{0x81F4, 0xF6C8}, - {0x81FA, 0xD3E6},{0x81FB, 0xF2DD},{0x81FC, 0xCFBF},{0x81FE, 0xEBAC},{0x8205, 0xCFC0},{0x8207, 0xE6A8},{0x8208, 0xFDE9},{0x820A, 0xCFC1}, - {0x820C, 0xE0DF},{0x820D, 0xDEEC},{0x8212, 0xE0A2},{0x821B, 0xF4BF},{0x821C, 0xE2EF},{0x821E, 0xD9F1},{0x821F, 0xF1C7},{0x8221, 0xCBB8}, - {0x822A, 0xF9FE},{0x822B, 0xDBBA},{0x822C, 0xDAF5},{0x8235, 0xF6EC},{0x8236, 0xDADC},{0x8237, 0xFAE4},{0x8239, 0xE0CF},{0x8240, 0xDDB2}, - {0x8245, 0xE6A9},{0x8247, 0xEFF3},{0x8259, 0xF3ED},{0x8264, 0xEBFA},{0x8266, 0xF9E6},{0x826E, 0xCADD},{0x826F, 0xD5DE},{0x8271, 0xCADE}, - {0x8272, 0xDFE4},{0x8276, 0xE6FD},{0x8278, 0xF5AC},{0x827E, 0xE4F5},{0x828B, 0xE9E3},{0x828D, 0xEDCB},{0x828E, 0xCFE4},{0x8292, 0xD8D3}, - {0x8299, 0xDDB3},{0x829A, 0xD4EC},{0x829D, 0xF2B9},{0x829F, 0xDFB7},{0x82A5, 0xCBCE},{0x82A6, 0xFBD8},{0x82A9, 0xD0D9},{0x82AC, 0xDDD2}, - {0x82AD, 0xF7F4},{0x82AE, 0xE7DC},{0x82AF, 0xE4A5},{0x82B1, 0xFCA3},{0x82B3, 0xDBBB},{0x82B7, 0xF2BA},{0x82B8, 0xE9FD},{0x82B9, 0xD0CA}, - {0x82BB, 0xF5D6},{0x82BC, 0xD9C5},{0x82BD, 0xE4B4},{0x82BF, 0xEDA7},{0x82D1, 0xEABD},{0x82D2, 0xE6FE},{0x82D4, 0xF7C4},{0x82D5, 0xF5AD}, - {0x82D7, 0xD9E0},{0x82DB, 0xCAB4},{0x82DE, 0xF8E2},{0x82DF, 0xCFC2},{0x82E1, 0xECBE},{0x82E5, 0xE5B4},{0x82E6, 0xCDC8},{0x82E7, 0xEEC8}, - {0x82F1, 0xE7C8},{0x82FD, 0xCDC9},{0x82FE, 0xF9B7},{0x8301, 0xF1E8},{0x8302, 0xD9F2},{0x8303, 0xDBF5},{0x8304, 0xCAB5},{0x8305, 0xD9C6}, - {0x8309, 0xD8C9},{0x8317, 0xD9AB},{0x8328, 0xEDBC},{0x832B, 0xD8D4},{0x832F, 0xDCDA},{0x8331, 0xE2BC},{0x8334, 0xFCED},{0x8335, 0xECE0}, - {0x8336, 0xD2FE},{0x8338, 0xE9C7},{0x8339, 0xE6AA},{0x8340, 0xE2F0},{0x8347, 0xFABB},{0x8349, 0xF5AE},{0x834A, 0xFBAA},{0x834F, 0xECFB}, - {0x8351, 0xECBF},{0x8352, 0xFCD8},{0x8373, 0xD4E5},{0x8377, 0xF9C3},{0x837B, 0xEEE2},{0x8389, 0xD7E9},{0x838A, 0xEDF6},{0x838E, 0xDEED}, - {0x8396, 0xCCEC},{0x8398, 0xE3EE},{0x839E, 0xE8D4},{0x83A2, 0xFAF8},{0x83A9, 0xDDB4},{0x83AA, 0xE4B5},{0x83AB, 0xD8B0},{0x83BD, 0xD8D5}, - {0x83C1, 0xF4EA},{0x83C5, 0xCEB9},{0x83C9, 0xD6E1},{0x83CA, 0xCFD2},{0x83CC, 0xD0B6},{0x83D3, 0xCEA2},{0x83D6, 0xF3EE},{0x83DC, 0xF3F8}, - {0x83E9, 0xDCCC},{0x83EB, 0xD0CB},{0x83EF, 0xFCA4},{0x83F0, 0xCDCA},{0x83F1, 0xD7D4},{0x83F2, 0xDEA3},{0x83F4, 0xE4E0},{0x83F9, 0xEEC9}, - {0x83FD, 0xE2DD},{0x8403, 0xF5FE},{0x8404, 0xD4AC},{0x840A, 0xD5D1},{0x840C, 0xD8F0},{0x840D, 0xF8C3},{0x840E, 0xEAD7},{0x8429, 0xF5D7}, - {0x842C, 0xD8BF},{0x8431, 0xFDC0},{0x8438, 0xEBAD},{0x843D, 0xD5AA},{0x8449, 0xE7A8},{0x8457, 0xEECA},{0x845B, 0xCAE7},{0x8461, 0xF8E3}, - {0x8463, 0xD4DD},{0x8466, 0xEAD8},{0x846B, 0xFBD9},{0x846C, 0xEDF7},{0x846F, 0xE5B5},{0x8475, 0xD0AD},{0x847A, 0xF1F1},{0x8490, 0xE2BD}, - {0x8494, 0xE3C8},{0x8499, 0xD9D5},{0x849C, 0xDFAA},{0x84A1, 0xDBBC},{0x84B2, 0xF8E4},{0x84B8, 0xF1FA},{0x84BB, 0xE5B6},{0x84BC, 0xF3EF}, - {0x84BF, 0xFBDA},{0x84C0, 0xE1E0},{0x84C2, 0xD9AC},{0x84C4, 0xF5EB},{0x84C6, 0xE0B6},{0x84C9, 0xE9C8},{0x84CB, 0xCBCF},{0x84CD, 0xE3C9}, - {0x84D1, 0xDEEE},{0x84DA, 0xE2BE},{0x84EC, 0xDCEF},{0x84EE, 0xD6A5},{0x84F4, 0xE2F1},{0x84FC, 0xD6FE},{0x8511, 0xD9A1},{0x8513, 0xD8C0}, - {0x8514, 0xDCDB},{0x8517, 0xEDBD},{0x8518, 0xDFB8},{0x851A, 0xEAA5},{0x851E, 0xD7AD},{0x8521, 0xF3F9},{0x8523, 0xEDF8},{0x8525, 0xF5C7}, - {0x852C, 0xE1CA},{0x852D, 0xEBE3},{0x852F, 0xF2DE},{0x853D, 0xF8CC},{0x853F, 0xEAD9},{0x8541, 0xD3C6},{0x8543, 0xDBE6},{0x8549, 0xF5AF}, - {0x854E, 0xCEF0},{0x8553, 0xE9FE},{0x8559, 0xFBB6},{0x8563, 0xE2F2},{0x8568, 0xCFF2},{0x8569, 0xF7B9},{0x856A, 0xD9F3},{0x856D, 0xE1CB}, - {0x8584, 0xDADD},{0x8587, 0xDAB9},{0x858F, 0xEBFB},{0x8591, 0xCBB9},{0x8594, 0xEDF9},{0x859B, 0xE0E0},{0x85A6, 0xF4C0},{0x85A8, 0xFDBC}, - {0x85A9, 0xDFB1},{0x85AA, 0xE3EF},{0x85AF, 0xE0A3},{0x85B0, 0xFDB9},{0x85BA, 0xF0B1},{0x85C1, 0xCDCB},{0x85C9, 0xEDBE},{0x85CD, 0xD5C0}, - {0x85CE, 0xE3F0},{0x85CF, 0xEDFA},{0x85D5, 0xE9E4},{0x85DC, 0xD5ED},{0x85DD, 0xE7DD},{0x85E4, 0xD4F6},{0x85E5, 0xE5B7},{0x85E9, 0xDBE7}, - {0x85EA, 0xE2BF},{0x85F7, 0xEECB},{0x85FA, 0xD7F4},{0x85FB, 0xF0DD},{0x85FF, 0xCEAB},{0x8602, 0xE7DE},{0x8606, 0xD6D6},{0x8607, 0xE1CC}, - {0x860A, 0xE8B3},{0x8616, 0xE5EE},{0x8617, 0xDCA2},{0x861A, 0xE0D0},{0x862D, 0xD5B5},{0x863F, 0xD5A1},{0x864E, 0xFBDB},{0x8650, 0xF9CB}, - {0x8654, 0xCBF3},{0x8655, 0xF4A5},{0x865B, 0xFAC8},{0x865C, 0xD6D7},{0x865E, 0xE9E5},{0x865F, 0xFBDC},{0x8667, 0xFDD0},{0x8679, 0xFBF6}, - {0x868A, 0xDAA5},{0x868C, 0xDBBD},{0x8693, 0xECE2},{0x86A3, 0xCDF7},{0x86A4, 0xF0DE},{0x86A9, 0xF6C9},{0x86C7, 0xDEEF},{0x86CB, 0xD3B1}, - {0x86D4, 0xFCEE},{0x86D9, 0xE8C3},{0x86DB, 0xF1C8},{0x86DF, 0xCEF1},{0x86E4, 0xF9ED},{0x86ED, 0xF2F4},{0x86FE, 0xE4B6},{0x8700, 0xF5B9}, - {0x8702, 0xDCF0},{0x8703, 0xE3F1},{0x8708, 0xE8A5},{0x8718, 0xF2BB},{0x871A, 0xDEA4},{0x871C, 0xDACC},{0x874E, 0xCAE9},{0x8755, 0xE3DA}, - {0x8757, 0xFCD9},{0x875F, 0xEADA},{0x8766, 0xF9C4},{0x8768, 0xE3A4},{0x8774, 0xFBDD},{0x8776, 0xEFCA},{0x8778, 0xE8C4},{0x8782, 0xD5CC}, - {0x878D, 0xEBD7},{0x879F, 0xD9AD},{0x87A2, 0xFBAB},{0x87B3, 0xD3D9},{0x87BA, 0xD5A2},{0x87C4, 0xF6DE},{0x87E0, 0xDAF6},{0x87EC, 0xE0D1}, - {0x87EF, 0xE9A8},{0x87F2, 0xF5F9},{0x87F9, 0xFAAF},{0x87FB, 0xEBFC},{0x87FE, 0xE0EA},{0x8805, 0xE3B2},{0x881F, 0xD5C5},{0x8822, 0xF1E3}, - {0x8823, 0xD5EE},{0x8831, 0xCDCC},{0x8836, 0xEDD9},{0x883B, 0xD8C1},{0x8840, 0xFAEC},{0x8846, 0xF1EB},{0x884C, 0xFABC},{0x884D, 0xE6E2}, - {0x8852, 0xFAE5},{0x8853, 0xE2FA},{0x8857, 0xCAB6},{0x8859, 0xE4B7},{0x885B, 0xEADB},{0x885D, 0xF5FA},{0x8861, 0xFBAC},{0x8862, 0xCFC3}, - {0x8863, 0xEBFD},{0x8868, 0xF8FA},{0x886B, 0xDFB9},{0x8870, 0xE1F1},{0x8872, 0xD2A4},{0x8877, 0xF5FB},{0x887E, 0xD0DA},{0x887F, 0xD0DB}, - {0x8881, 0xEABE},{0x8882, 0xD9B1},{0x8888, 0xCAB7},{0x888B, 0xD3E7},{0x888D, 0xF8E5},{0x8892, 0xD3B2},{0x8896, 0xE2C0},{0x8897, 0xF2DF}, - {0x889E, 0xCDE5},{0x88AB, 0xF9AC},{0x88B4, 0xCDCD},{0x88C1, 0xEEAE},{0x88C2, 0xD6AE},{0x88CF, 0xD7EA},{0x88D4, 0xE7E0},{0x88D5, 0xEBAE}, - {0x88D9, 0xCFD9},{0x88DC, 0xDCCD},{0x88DD, 0xEDFB},{0x88DF, 0xDEF0},{0x88E1, 0xD7EB},{0x88E8, 0xDEA5},{0x88F3, 0xDFD7},{0x88F4, 0xDBD0}, - {0x88F5, 0xDBD1},{0x88F8, 0xD5A3},{0x88FD, 0xF0B2},{0x8907, 0xDCDC},{0x8910, 0xCAE8},{0x8912, 0xF8E6},{0x8913, 0xDCCE},{0x8918, 0xEADC}, - {0x8919, 0xDBD2},{0x8925, 0xE9B3},{0x892A, 0xF7DB},{0x8936, 0xE3A8},{0x8938, 0xD7AE},{0x893B, 0xE0E1},{0x8941, 0xCBBA},{0x8944, 0xE5D1}, - {0x895F, 0xD0DC},{0x8964, 0xD5C1},{0x896A, 0xD8CA},{0x8972, 0xE3A9},{0x897F, 0xE0A4},{0x8981, 0xE9A9},{0x8983, 0xD3C7},{0x8986, 0xDCDD}, - {0x8987, 0xF8AE},{0x898B, 0xCCB8},{0x898F, 0xD0AE},{0x8993, 0xD8F2},{0x8996, 0xE3CA},{0x89A1, 0xCCAF},{0x89A9, 0xD4AD},{0x89AA, 0xF6D1}, - {0x89B2, 0xD0CC},{0x89BA, 0xCAC6},{0x89BD, 0xD5C2},{0x89C0, 0xCEBA},{0x89D2, 0xCAC7},{0x89E3, 0xFAB0},{0x89F4, 0xDFD8},{0x89F8, 0xF5BA}, - {0x8A00, 0xE5EB},{0x8A02, 0xEFF4},{0x8A03, 0xDDB5},{0x8A08, 0xCDAA},{0x8A0A, 0xE3F2},{0x8A0C, 0xFBF7},{0x8A0E, 0xF7D0},{0x8A13, 0xFDBA}, - {0x8A16, 0xFDE1},{0x8A17, 0xF6FE},{0x8A18, 0xD1C0},{0x8A1B, 0xE8C5},{0x8A1D, 0xE4B8},{0x8A1F, 0xE1E8},{0x8A23, 0xCCC1},{0x8A25, 0xD2ED}, - {0x8A2A, 0xDBBE},{0x8A2D, 0xE0E2},{0x8A31, 0xFAC9},{0x8A34, 0xE1CD},{0x8A36, 0xCAB8},{0x8A3A, 0xF2E0},{0x8A3B, 0xF1C9},{0x8A50, 0xDEF1}, - {0x8A54, 0xF0DF},{0x8A55, 0xF8C4},{0x8A5B, 0xEECC},{0x8A5E, 0xDEF2},{0x8A60, 0xE7C9},{0x8A62, 0xE2F3},{0x8A63, 0xE7E1},{0x8A66, 0xE3CB}, - {0x8A69, 0xE3CC},{0x8A6D, 0xCFF8},{0x8A6E, 0xEFAC},{0x8A70, 0xFDFE},{0x8A71, 0xFCA5},{0x8A72, 0xFAB1},{0x8A73, 0xDFD9},{0x8A75, 0xE0D2}, - {0x8A79, 0xF4DA},{0x8A85, 0xF1CA},{0x8A87, 0xCEA3},{0x8A8C, 0xF2BC},{0x8A8D, 0xECE3},{0x8A93, 0xE0A5},{0x8A95, 0xF7AB},{0x8A98, 0xEBAF}, - {0x8A9E, 0xE5DE},{0x8AA0, 0xE1A4},{0x8AA1, 0xCDAB},{0x8AA3, 0xD9F4},{0x8AA4, 0xE8A6},{0x8AA5, 0xCDCE},{0x8AA6, 0xE1E9},{0x8AA8, 0xFCEF}, - {0x8AAA, 0xE0E3},{0x8AB0, 0xE2C1},{0x8AB2, 0xCEA4},{0x8AB9, 0xDEA6},{0x8ABC, 0xEBFE},{0x8ABE, 0xEBDD},{0x8ABF, 0xF0E0},{0x8AC2, 0xF4DB}, - {0x8AC4, 0xE2F4},{0x8AC7, 0xD3C8},{0x8ACB, 0xF4EB},{0x8ACD, 0xEEB5},{0x8ACF, 0xF5D8},{0x8AD2, 0xD5DF},{0x8AD6, 0xD6E5},{0x8ADB, 0xEBB0}, - {0x8ADC, 0xF4E3},{0x8AE1, 0xE3CD},{0x8AE6, 0xF4F4},{0x8AE7, 0xFAB2},{0x8AEA, 0xEFF5},{0x8AEB, 0xCADF},{0x8AED, 0xEBB1},{0x8AEE, 0xEDBF}, - {0x8AF1, 0xFDC9},{0x8AF6, 0xE4A6},{0x8AF7, 0xF9A4},{0x8AF8, 0xF0B3},{0x8AFA, 0xE5EC},{0x8AFE, 0xD1E7},{0x8B00, 0xD9C7},{0x8B01, 0xE4D7}, - {0x8B02, 0xEADD},{0x8B04, 0xD4F7},{0x8B0E, 0xDABA},{0x8B10, 0xDACD},{0x8B14, 0xF9CC},{0x8B16, 0xE1DA},{0x8B17, 0xDBBF},{0x8B19, 0xCCC5}, - {0x8B1A, 0xECD0},{0x8B1B, 0xCBBB},{0x8B1D, 0xDEF3},{0x8B20, 0xE9AA},{0x8B28, 0xD9C8},{0x8B2B, 0xEEE3},{0x8B2C, 0xD7BD},{0x8B33, 0xCFC4}, - {0x8B39, 0xD0CD},{0x8B41, 0xFCA6},{0x8B49, 0xF1FB},{0x8B4E, 0xFDD2},{0x8B4F, 0xD1C1},{0x8B58, 0xE3DB},{0x8B5A, 0xD3C9},{0x8B5C, 0xDCCF}, - {0x8B66, 0xCCED},{0x8B6C, 0xDEA7},{0x8B6F, 0xE6BB},{0x8B70, 0xECA1},{0x8B74, 0xCCB9},{0x8B77, 0xFBDE},{0x8B7D, 0xE7E2},{0x8B80, 0xD4C1}, - {0x8B8A, 0xDCA8},{0x8B90, 0xE2C2},{0x8B92, 0xF3D8},{0x8B93, 0xE5D3},{0x8B96, 0xF3D9},{0x8B9A, 0xF3C6},{0x8C37, 0xCDDB},{0x8C3F, 0xCDAC}, - {0x8C41, 0xFCC3},{0x8C46, 0xD4E7},{0x8C48, 0xD1C2},{0x8C4A, 0xF9A5},{0x8C4C, 0xE8D5},{0x8C55, 0xE3CE},{0x8C5A, 0xD4CA},{0x8C61, 0xDFDA}, - {0x8C6A, 0xFBDF},{0x8C6B, 0xE7E3},{0x8C79, 0xF8FB},{0x8C7A, 0xE3CF},{0x8C82, 0xF5B0},{0x8C8A, 0xD8E7},{0x8C8C, 0xD9C9},{0x8C9D, 0xF8AF}, - {0x8C9E, 0xEFF6},{0x8CA0, 0xDDB6},{0x8CA1, 0xEEAF},{0x8CA2, 0xCDF8},{0x8CA7, 0xDEB8},{0x8CA8, 0xFCA7},{0x8CA9, 0xF7FC},{0x8CAA, 0xF7B1}, - {0x8CAB, 0xCEBB},{0x8CAC, 0xF4A1},{0x8CAF, 0xEECD},{0x8CB0, 0xE1AE},{0x8CB3, 0xECC3},{0x8CB4, 0xCFFE},{0x8CB6, 0xF8BF},{0x8CB7, 0xD8E2}, - {0x8CB8, 0xD3E8},{0x8CBB, 0xDEA8},{0x8CBC, 0xF4E4},{0x8CBD, 0xECC2},{0x8CBF, 0xD9F5},{0x8CC0, 0xF9C5},{0x8CC1, 0xDDD3},{0x8CC2, 0xD6F1}, - {0x8CC3, 0xECFC},{0x8CC4, 0xFCF0},{0x8CC7, 0xEDC0},{0x8CC8, 0xCAB9},{0x8CCA, 0xEEE4},{0x8CD1, 0xF2E1},{0x8CD3, 0xDEB9},{0x8CDA, 0xD6F2}, - {0x8CDC, 0xDEF4},{0x8CDE, 0xDFDB},{0x8CE0, 0xDBD3},{0x8CE2, 0xFAE7},{0x8CE3, 0xD8E3},{0x8CE4, 0xF4C1},{0x8CE6, 0xDDB7},{0x8CEA, 0xF2F5}, - {0x8CED, 0xD4AE},{0x8CF4, 0xD6F3},{0x8CFB, 0xDDB8},{0x8CFC, 0xCFC5},{0x8CFD, 0xDFDF},{0x8D04, 0xF2BE},{0x8D05, 0xF6A1},{0x8D07, 0xEBCB}, - {0x8D08, 0xF1FC},{0x8D0A, 0xF3C7},{0x8D0D, 0xE0EB},{0x8D13, 0xEDFC},{0x8D16, 0xE1DB},{0x8D64, 0xEEE5},{0x8D66, 0xDEF5},{0x8D6B, 0xFAD3}, - {0x8D70, 0xF1CB},{0x8D73, 0xD0AF},{0x8D74, 0xDDB9},{0x8D77, 0xD1C3},{0x8D85, 0xF5B1},{0x8D8A, 0xEAC6},{0x8D99, 0xF0E1},{0x8DA3, 0xF6AC}, - {0x8DA8, 0xF5D9},{0x8DB3, 0xF0EB},{0x8DBA, 0xDDBA},{0x8DBE, 0xF2BF},{0x8DC6, 0xF7C5},{0x8DCB, 0xDBA2},{0x8DCC, 0xF2F6},{0x8DCF, 0xCABA}, - {0x8DDB, 0xF7F5},{0x8DDD, 0xCBE5},{0x8DE1, 0xEEE6},{0x8DE3, 0xE0D3},{0x8DE8, 0xCEA5},{0x8DEF, 0xD6D8},{0x8DF3, 0xD4AF},{0x8E0A, 0xE9C9}, - {0x8E0F, 0xD3CE},{0x8E10, 0xF4C2},{0x8E1E, 0xCBE6},{0x8E2A, 0xF1A1},{0x8E30, 0xEBB2},{0x8E35, 0xF1A2},{0x8E42, 0xEBB3},{0x8E44, 0xF0B4}, - {0x8E47, 0xCBF4},{0x8E48, 0xD4B0},{0x8E49, 0xF3B2},{0x8E4A, 0xFBB7},{0x8E59, 0xF5EC},{0x8E5F, 0xEEE7},{0x8E60, 0xF4B2},{0x8E74, 0xF5ED}, - {0x8E76, 0xCFF3},{0x8E81, 0xF0E2},{0x8E87, 0xEECE},{0x8E8A, 0xF1CC},{0x8E8D, 0xE5B8},{0x8EAA, 0xD7F5},{0x8EAB, 0xE3F3},{0x8EAC, 0xCFE5}, - {0x8EC0, 0xCFC6},{0x8ECA, 0xF3B3},{0x8ECB, 0xE4D8},{0x8ECC, 0xCFF9},{0x8ECD, 0xCFDA},{0x8ED2, 0xFACD},{0x8EDF, 0xE6E3},{0x8EEB, 0xF2E2}, - {0x8EF8, 0xF5EE},{0x8EFB, 0xCABB},{0x8EFE, 0xE3DC},{0x8F03, 0xCEF2},{0x8F05, 0xD6D9},{0x8F09, 0xEEB0},{0x8F12, 0xF4E5},{0x8F13, 0xD8C2}, - {0x8F14, 0xDCD0},{0x8F15, 0xCCEE},{0x8F1B, 0xD5E0},{0x8F1C, 0xF6CA},{0x8F1D, 0xFDCA},{0x8F1E, 0xD8D6},{0x8F1F, 0xF4CF},{0x8F26, 0xD6A6}, - {0x8F27, 0xDCBE},{0x8F29, 0xDBD4},{0x8F2A, 0xD7C7},{0x8F2F, 0xF2FE},{0x8F33, 0xF1CD},{0x8F38, 0xE2C3},{0x8F39, 0xDCDE},{0x8F3B, 0xDCDF}, - {0x8F3E, 0xEFAD},{0x8F3F, 0xE6AB},{0x8F44, 0xF9DD},{0x8F45, 0xEABF},{0x8F49, 0xEFAE},{0x8F4D, 0xF4D0},{0x8F4E, 0xCEF3},{0x8F5D, 0xE6AC}, - {0x8F5F, 0xCEDE},{0x8F62, 0xD5F9},{0x8F9B, 0xE3F4},{0x8F9C, 0xCDD0},{0x8FA3, 0xD5B8},{0x8FA6, 0xF7FD},{0x8FA8, 0xDCA9},{0x8FAD, 0xDEF6}, - {0x8FAF, 0xDCAA},{0x8FB0, 0xF2E3},{0x8FB1, 0xE9B4},{0x8FB2, 0xD2DC},{0x8FC2, 0xE9E6},{0x8FC5, 0xE3F6},{0x8FCE, 0xE7CA},{0x8FD1, 0xD0CE}, - {0x8FD4, 0xDAF7},{0x8FE6, 0xCABC},{0x8FEA, 0xEEE8},{0x8FEB, 0xDADE},{0x8FED, 0xF2F7},{0x8FF0, 0xE2FB},{0x8FF2, 0xCCA6},{0x8FF7, 0xDABB}, - {0x8FF9, 0xEEE9},{0x8FFD, 0xF5DA},{0x9000, 0xF7DC},{0x9001, 0xE1EA},{0x9002, 0xCEC1},{0x9003, 0xD4B1},{0x9005, 0xFDB1},{0x9006, 0xE6BD}, - {0x9008, 0xFBAD},{0x900B, 0xF8E7},{0x900D, 0xE1CE},{0x900F, 0xF7E2},{0x9010, 0xF5EF},{0x9011, 0xCFC7},{0x9014, 0xD4B2},{0x9015, 0xCCEF}, - {0x9017, 0xD4E8},{0x9019, 0xEECF},{0x901A, 0xF7D7},{0x901D, 0xE0A6},{0x901E, 0xD6C1},{0x901F, 0xE1DC},{0x9020, 0xF0E3},{0x9021, 0xF1E4}, - {0x9022, 0xDCF1},{0x9023, 0xD6A7},{0x902E, 0xF4F5},{0x9031, 0xF1CE},{0x9032, 0xF2E4},{0x9035, 0xD0B0},{0x9038, 0xECEF},{0x903C, 0xF9BA}, - {0x903E, 0xEBB5},{0x9041, 0xD4ED},{0x9042, 0xE2C4},{0x9047, 0xE9E7},{0x904A, 0xEBB4},{0x904B, 0xEAA1},{0x904D, 0xF8BC},{0x904E, 0xCEA6}, - {0x9050, 0xF9C6},{0x9051, 0xFCDA},{0x9053, 0xD4B3},{0x9054, 0xD3B9},{0x9055, 0xEADE},{0x9059, 0xE9AB},{0x905C, 0xE1E1},{0x905D, 0xD3CF}, - {0x905E, 0xF4F6},{0x9060, 0xEAC0},{0x9061, 0xE1CF},{0x9063, 0xCCBA},{0x9069, 0xEEEA},{0x906D, 0xF0E4},{0x906E, 0xF3B4},{0x906F, 0xD4EE}, - {0x9072, 0xF2C0},{0x9075, 0xF1E5},{0x9077, 0xF4C3},{0x9078, 0xE0D4},{0x907A, 0xEBB6},{0x907C, 0xD7A1},{0x907D, 0xCBE8},{0x907F, 0xF9AD}, - {0x9080, 0xE9AD},{0x9081, 0xD8E4},{0x9082, 0xFAB3},{0x9083, 0xE2C5},{0x9084, 0xFCBD},{0x9087, 0xECC4},{0x9088, 0xD8B1},{0x908A, 0xDCAB}, - {0x908F, 0xD5A4},{0x9091, 0xEBE9},{0x9095, 0xE8BB},{0x9099, 0xD8D7},{0x90A2, 0xFBAE},{0x90A3, 0xD1E1},{0x90A6, 0xDBC0},{0x90A8, 0xF5BE}, - {0x90AA, 0xDEF7},{0x90AF, 0xCAFB},{0x90B0, 0xF7C6},{0x90B1, 0xCFC8},{0x90B5, 0xE1D0},{0x90B8, 0xEED0},{0x90C1, 0xE9F4},{0x90CA, 0xCEF4}, - {0x90DE, 0xD5CD},{0x90E1, 0xCFDB},{0x90E8, 0xDDBB},{0x90ED, 0xCEAC},{0x90F5, 0xE9E8},{0x90FD, 0xD4B4},{0x9102, 0xE4C7},{0x9112, 0xF5DB}, - {0x9115, 0xFAC1},{0x9119, 0xDEA9},{0x9127, 0xD4F8},{0x912D, 0xEFF7},{0x9132, 0xD3B3},{0x9149, 0xEBB7},{0x914A, 0xEFF8},{0x914B, 0xF5DC}, - {0x914C, 0xEDCC},{0x914D, 0xDBD5},{0x914E, 0xF1CF},{0x9152, 0xF1D0},{0x9162, 0xF5B2},{0x9169, 0xD9AE},{0x916A, 0xD5AC},{0x916C, 0xE2C6}, - {0x9175, 0xFDA3},{0x9177, 0xFBE5},{0x9178, 0xDFAB},{0x9187, 0xE2F5},{0x9189, 0xF6AD},{0x918B, 0xF5B3},{0x918D, 0xF0B5},{0x9192, 0xE1A5}, - {0x919C, 0xF5DD},{0x91AB, 0xECA2},{0x91AC, 0xEDFD},{0x91AE, 0xF5B4},{0x91AF, 0xFBB8},{0x91B1, 0xDBA3},{0x91B4, 0xD6CA},{0x91B5, 0xCBD9}, - {0x91C0, 0xE5D4},{0x91C7, 0xF3FA},{0x91C9, 0xEBB8},{0x91CB, 0xE0B7},{0x91CC, 0xD7EC},{0x91CD, 0xF1EC},{0x91CE, 0xE5AF},{0x91CF, 0xD5E1}, - {0x91D0, 0xD7ED},{0x91D1, 0xD1D1},{0x91D7, 0xE1F2},{0x91D8, 0xEFF9},{0x91DC, 0xDDBC},{0x91DD, 0xF6DC},{0x91E3, 0xF0E5},{0x91E7, 0xF4C4}, - {0x91EA, 0xE9E9},{0x91F5, 0xF3FB},{0x920D, 0xD4EF},{0x9210, 0xCCA2},{0x9211, 0xF7FE},{0x9212, 0xDFBC},{0x9217, 0xEBCD},{0x921E, 0xD0B7}, - {0x9234, 0xD6C2},{0x923A, 0xE8AD},{0x923F, 0xEFAF},{0x9240, 0xCBA5},{0x9245, 0xCBE9},{0x9249, 0xFAE8},{0x9257, 0xCCC6},{0x925B, 0xE6E7}, - {0x925E, 0xEAC7},{0x9262, 0xDBA4},{0x9264, 0xCFC9},{0x9265, 0xE2FC},{0x9266, 0xEFFA},{0x9280, 0xEBDE},{0x9283, 0xF5C8},{0x9285, 0xD4DE}, - {0x9291, 0xE0D5},{0x9293, 0xEFB0},{0x9296, 0xE2C7},{0x9298, 0xD9AF},{0x929C, 0xF9E7},{0x92B3, 0xE7E5},{0x92B6, 0xCFCA},{0x92B7, 0xE1D1}, - {0x92B9, 0xE2C8},{0x92CC, 0xEFFB},{0x92CF, 0xFAF9},{0x92D2, 0xDCF2},{0x92E4, 0xE0A7},{0x92EA, 0xF8E8},{0x92F8, 0xCBEA},{0x92FC, 0xCBBC}, - {0x9304, 0xD6E2},{0x9310, 0xF5DE},{0x9318, 0xF5DF},{0x931A, 0xEEB6},{0x931E, 0xE2F6},{0x931F, 0xD3CA},{0x9320, 0xEFFC},{0x9321, 0xD1C4}, - {0x9322, 0xEFB1},{0x9324, 0xD1C5},{0x9326, 0xD0DE},{0x9328, 0xD9E1},{0x932B, 0xE0B8},{0x932E, 0xCDD1},{0x932F, 0xF3B9},{0x9348, 0xE7CC}, - {0x934A, 0xD6A8},{0x934B, 0xCEA7},{0x934D, 0xD4B5},{0x9354, 0xE4C8},{0x935B, 0xD3B4},{0x936E, 0xEBB9},{0x9375, 0xCBF5},{0x937C, 0xF6DD}, - {0x937E, 0xF1A3},{0x938C, 0xCCC7},{0x9394, 0xE9CA},{0x9396, 0xE1F0},{0x939A, 0xF5E0},{0x93A3, 0xFBAF},{0x93A7, 0xCBD1},{0x93AC, 0xFBE0}, - {0x93AD, 0xF2E5},{0x93B0, 0xECF0},{0x93C3, 0xF0EC},{0x93D1, 0xEEEB},{0x93DE, 0xE9CB},{0x93E1, 0xCCF0},{0x93E4, 0xD7AF},{0x93F6, 0xF3A1}, - {0x9404, 0xFCF5},{0x9418, 0xF1A4},{0x9425, 0xE0D6},{0x942B, 0xEFB2},{0x9435, 0xF4D1},{0x9438, 0xF7A1},{0x9444, 0xF1D1},{0x9451, 0xCAFC}, - {0x9452, 0xCAFD},{0x945B, 0xCECE},{0x947D, 0xF3C8},{0x947F, 0xF3BA},{0x9577, 0xEDFE},{0x9580, 0xDAA6},{0x9583, 0xE0EC},{0x9589, 0xF8CD}, - {0x958B, 0xCBD2},{0x958F, 0xEBCE},{0x9591, 0xF9D8},{0x9592, 0xF9D9},{0x9593, 0xCAE0},{0x9594, 0xDACA},{0x9598, 0xCBA6},{0x95A3, 0xCAC8}, - {0x95A4, 0xF9EE},{0x95A5, 0xDBEC},{0x95A8, 0xD0B1},{0x95AD, 0xD5EF},{0x95B1, 0xE6F3},{0x95BB, 0xE7A2},{0x95BC, 0xE4D9},{0x95C7, 0xE4E1}, - {0x95CA, 0xFCC4},{0x95D4, 0xF9EF},{0x95D5, 0xCFF4},{0x95D6, 0xF7E6},{0x95DC, 0xCEBC},{0x95E1, 0xF4C5},{0x95E2, 0xDCA3},{0x961C, 0xDDBD}, - {0x9621, 0xF4C6},{0x962A, 0xF8A1},{0x962E, 0xE8D6},{0x9632, 0xDBC1},{0x963B, 0xF0E6},{0x963F, 0xE4B9},{0x9640, 0xF6ED},{0x9642, 0xF9AE}, - {0x9644, 0xDDBE},{0x964B, 0xD7B0},{0x964C, 0xD8E8},{0x964D, 0xCBBD},{0x9650, 0xF9DA},{0x965B, 0xF8CE},{0x965C, 0xF9F0},{0x965D, 0xE0ED}, - {0x965E, 0xE3B3},{0x965F, 0xF4B3},{0x9662, 0xEAC2},{0x9663, 0xF2E6},{0x9664, 0xF0B6},{0x966A, 0xDBD6},{0x9670, 0xEBE4},{0x9673, 0xF2E7}, - {0x9675, 0xD7D5},{0x9676, 0xD4B6},{0x9677, 0xF9E8},{0x9678, 0xD7C1},{0x967D, 0xE5D5},{0x9685, 0xE9EA},{0x9686, 0xD7CC},{0x968A, 0xD3E9}, - {0x968B, 0xE2C9},{0x968D, 0xFCDB},{0x968E, 0xCDAD},{0x9694, 0xCCB0},{0x9695, 0xEAA2},{0x9698, 0xE4F6},{0x9699, 0xD0C0},{0x969B, 0xF0B7}, - {0x969C, 0xEEA1},{0x96A3, 0xD7F6},{0x96A7, 0xE2CA},{0x96A8, 0xE2CB},{0x96AA, 0xFACF},{0x96B1, 0xEBDF},{0x96B7, 0xD6CB},{0x96BB, 0xF4B4}, - {0x96C0, 0xEDCD},{0x96C1, 0xE4D2},{0x96C4, 0xEAA9},{0x96C5, 0xE4BA},{0x96C6, 0xF3A2},{0x96C7, 0xCDD2},{0x96C9, 0xF6CB},{0x96CB, 0xF1E6}, - {0x96CC, 0xEDC1},{0x96CD, 0xE8BC},{0x96CE, 0xEED1},{0x96D5, 0xF0E7},{0x96D6, 0xE2CC},{0x96D9, 0xE4AA},{0x96DB, 0xF5E1},{0x96DC, 0xEDDA}, - {0x96E2, 0xD7EE},{0x96E3, 0xD1F1},{0x96E8, 0xE9EB},{0x96E9, 0xE9EC},{0x96EA, 0xE0E4},{0x96EF, 0xDAA7},{0x96F0, 0xDDD4},{0x96F2, 0xEAA3}, - {0x96F6, 0xD6C3},{0x96F7, 0xD6F4},{0x96F9, 0xDADF},{0x96FB, 0xEFB3},{0x9700, 0xE2CD},{0x9706, 0xEFFD},{0x9707, 0xF2E8},{0x9711, 0xEFC5}, - {0x9713, 0xE7E7},{0x9716, 0xD7FD},{0x9719, 0xE7CE},{0x971C, 0xDFDC},{0x971E, 0xF9C7},{0x9727, 0xD9F6},{0x9730, 0xDFAC},{0x9732, 0xD6DA}, - {0x9739, 0xDCA4},{0x973D, 0xF0B8},{0x9742, 0xD5FA},{0x9744, 0xE4F7},{0x9748, 0xD6C4},{0x9751, 0xF4EC},{0x9756, 0xEFFE},{0x975C, 0xF0A1}, - {0x975E, 0xDEAA},{0x9761, 0xDABC},{0x9762, 0xD8FC},{0x9769, 0xFAD4},{0x976D, 0xECE5},{0x9774, 0xFCA8},{0x9777, 0xECE6},{0x977A, 0xD8CB}, - {0x978B, 0xFBB9},{0x978D, 0xE4D3},{0x978F, 0xCDF9},{0x97A0, 0xCFD3},{0x97A8, 0xCAEA},{0x97AB, 0xCFD4},{0x97AD, 0xF8BD},{0x97C6, 0xF4C7}, - {0x97CB, 0xEADF},{0x97D3, 0xF9DB},{0x97DC, 0xD4B7},{0x97F3, 0xEBE5},{0x97F6, 0xE1D2},{0x97FB, 0xEAA4},{0x97FF, 0xFAC2},{0x9800, 0xFBE1}, - {0x9801, 0xFAED},{0x9802, 0xF0A2},{0x9803, 0xCCF1},{0x9805, 0xFAA3},{0x9806, 0xE2F7},{0x9808, 0xE2CE},{0x980A, 0xE9F5},{0x980C, 0xE1EB}, - {0x9810, 0xE7E8},{0x9811, 0xE8D7},{0x9812, 0xDAF8},{0x9813, 0xD4CB},{0x9817, 0xF7F6},{0x9818, 0xD6C5},{0x982D, 0xD4E9},{0x9830, 0xFAFA}, - {0x9838, 0xCCF2},{0x9839, 0xF7DD},{0x983B, 0xDEBA},{0x9846, 0xCEA8},{0x984C, 0xF0B9},{0x984D, 0xE4FE},{0x984E, 0xE4C9},{0x9854, 0xE4D4}, - {0x9858, 0xEAC3},{0x985A, 0xEFB4},{0x985E, 0xD7BE},{0x9865, 0xFBE2},{0x9867, 0xCDD3},{0x986B, 0xEFB5},{0x986F, 0xFAE9},{0x98A8, 0xF9A6}, - {0x98AF, 0xDFBD},{0x98B1, 0xF7C7},{0x98C4, 0xF8FD},{0x98C7, 0xF8FC},{0x98DB, 0xDEAB},{0x98DC, 0xDBE8},{0x98DF, 0xE3DD},{0x98E1, 0xE1E2}, - {0x98E2, 0xD1C6},{0x98ED, 0xF6D0},{0x98EE, 0xEBE6},{0x98EF, 0xDAF9},{0x98F4, 0xECC7},{0x98FC, 0xDEF8},{0x98FD, 0xF8E9},{0x98FE, 0xE3DE}, - {0x9903, 0xCEF5},{0x9909, 0xFAC3},{0x990A, 0xE5D7},{0x990C, 0xECC8},{0x9910, 0xF3C9},{0x9913, 0xE4BB},{0x9918, 0xE6AE},{0x991E, 0xEFB6}, - {0x9920, 0xDCBF},{0x9928, 0xCEBD},{0x9945, 0xD8C3},{0x9949, 0xD0CF},{0x994B, 0xCFFA},{0x994C, 0xF3CA},{0x994D, 0xE0D7},{0x9951, 0xD1C7}, - {0x9952, 0xE9AE},{0x9954, 0xE8BD},{0x9957, 0xFAC4},{0x9996, 0xE2CF},{0x9999, 0xFAC5},{0x999D, 0xF9B8},{0x99A5, 0xDCE0},{0x99A8, 0xFBB0}, - {0x99AC, 0xD8A9},{0x99AD, 0xE5DF},{0x99AE, 0xF9A7},{0x99B1, 0xF6EE},{0x99B3, 0xF6CC},{0x99B4, 0xE2F8},{0x99B9, 0xECF1},{0x99C1, 0xDAE0}, - {0x99D0, 0xF1D2},{0x99D1, 0xD2CC},{0x99D2, 0xCFCB},{0x99D5, 0xCABD},{0x99D9, 0xDDBF},{0x99DD, 0xF6EF},{0x99DF, 0xDEF9},{0x99ED, 0xFAB4}, - {0x99F1, 0xD5AD},{0x99FF, 0xF1E7},{0x9A01, 0xDEBE},{0x9A08, 0xDCC0},{0x9A0E, 0xD1C8},{0x9A0F, 0xD1C9},{0x9A19, 0xF8BE},{0x9A2B, 0xCBF6}, - {0x9A30, 0xD4F9},{0x9A36, 0xF5E2},{0x9A37, 0xE1D3},{0x9A40, 0xD8E9},{0x9A43, 0xF8FE},{0x9A45, 0xCFCC},{0x9A4D, 0xFDA4},{0x9A55, 0xCEF6}, - {0x9A57, 0xFAD0},{0x9A5A, 0xCCF3},{0x9A5B, 0xE6BE},{0x9A5F, 0xF6AE},{0x9A62, 0xD5F0},{0x9A65, 0xD1CA},{0x9A69, 0xFCBE},{0x9A6A, 0xD5F1}, - {0x9AA8, 0xCDE9},{0x9AB8, 0xFAB5},{0x9AD3, 0xE2D0},{0x9AD4, 0xF4F7},{0x9AD8, 0xCDD4},{0x9AE5, 0xE7A3},{0x9AEE, 0xDBA5},{0x9B1A, 0xE2D1}, - {0x9B27, 0xD7A2},{0x9B2A, 0xF7E3},{0x9B31, 0xEAA6},{0x9B3C, 0xD0A1},{0x9B41, 0xCEDA},{0x9B42, 0xFBEB},{0x9B43, 0xDBA6},{0x9B44, 0xDBDE}, - {0x9B45, 0xD8E5},{0x9B4F, 0xEAE0},{0x9B54, 0xD8AA},{0x9B5A, 0xE5E0},{0x9B6F, 0xD6DB},{0x9B8E, 0xEFC6},{0x9B91, 0xF8EA},{0x9B9F, 0xE4D5}, - {0x9BAB, 0xCEF7},{0x9BAE, 0xE0D8},{0x9BC9, 0xD7EF},{0x9BD6, 0xF4ED},{0x9BE4, 0xCDE6},{0x9BE8, 0xCCF4},{0x9C0D, 0xF5E3},{0x9C10, 0xE4CA}, - {0x9C12, 0xDCE1},{0x9C15, 0xF9C8},{0x9C25, 0xFCBF},{0x9C32, 0xE8A7},{0x9C3B, 0xD8C4},{0x9C47, 0xCBBE},{0x9C49, 0xDCAE},{0x9C57, 0xD7F7}, - {0x9CE5, 0xF0E8},{0x9CE7, 0xDDC0},{0x9CE9, 0xCFCD},{0x9CF3, 0xDCF3},{0x9CF4, 0xD9B0},{0x9CF6, 0xE6E9},{0x9D09, 0xE4BC},{0x9D1B, 0xEAC4}, - {0x9D26, 0xE4EC},{0x9D28, 0xE4E5},{0x9D3B, 0xFBF8},{0x9D51, 0xCCBB},{0x9D5D, 0xE4BD},{0x9D60, 0xCDDC},{0x9D61, 0xD9F7},{0x9D6C, 0xDDDF}, - {0x9D72, 0xEDCE},{0x9DA9, 0xD9D0},{0x9DAF, 0xE5A3},{0x9DB4, 0xF9CD},{0x9DC4, 0xCDAE},{0x9DD7, 0xCFCE},{0x9DF2, 0xF6AF},{0x9DF8, 0xFDD3}, - {0x9DF9, 0xEBED},{0x9DFA, 0xD6DC},{0x9E1A, 0xE5A4},{0x9E1E, 0xD5B6},{0x9E75, 0xD6DD},{0x9E79, 0xF9E9},{0x9E7D, 0xE7A4},{0x9E7F, 0xD6E3}, - {0x9E92, 0xD1CB},{0x9E93, 0xD6E4},{0x9E97, 0xD5F2},{0x9E9D, 0xDEFA},{0x9E9F, 0xD7F8},{0x9EA5, 0xD8EA},{0x9EB4, 0xCFD5},{0x9EB5, 0xD8FD}, - {0x9EBB, 0xD8AB},{0x9EBE, 0xFDCB},{0x9EC3, 0xFCDC},{0x9ECD, 0xE0A8},{0x9ECE, 0xD5F3},{0x9ED1, 0xFDD9},{0x9ED4, 0xCCA3},{0x9ED8, 0xD9F9}, - {0x9EDB, 0xD3EA},{0x9EDC, 0xF5F5},{0x9EDE, 0xEFC7},{0x9EE8, 0xD3DA},{0x9EF4, 0xDABD},{0x9F07, 0xE8A8},{0x9F08, 0xDCAF},{0x9F0E, 0xF0A3}, - {0x9F13, 0xCDD5},{0x9F20, 0xE0A9},{0x9F3B, 0xDEAC},{0x9F4A, 0xF0BA},{0x9F4B, 0xEEB1},{0x9F4E, 0xEEB2},{0x9F52, 0xF6CD},{0x9F5F, 0xEED2}, - {0x9F61, 0xD6C6},{0x9F67, 0xE0E5},{0x9F6A, 0xF3BB},{0x9F6C, 0xE5E1},{0x9F77, 0xE4CB},{0x9F8D, 0xD7A3},{0x9F90, 0xDBC2},{0x9F95, 0xCAFE}, - {0x9F9C, 0xCFCF},{0xAC00, 0xB0A1},{0xAC01, 0xB0A2},{0xAC04, 0xB0A3},{0xAC07, 0xB0A4},{0xAC08, 0xB0A5},{0xAC09, 0xB0A6},{0xAC0A, 0xB0A7}, - {0xAC10, 0xB0A8},{0xAC11, 0xB0A9},{0xAC12, 0xB0AA},{0xAC13, 0xB0AB},{0xAC14, 0xB0AC},{0xAC15, 0xB0AD},{0xAC16, 0xB0AE},{0xAC17, 0xB0AF}, - {0xAC19, 0xB0B0},{0xAC1A, 0xB0B1},{0xAC1B, 0xB0B2},{0xAC1C, 0xB0B3},{0xAC1D, 0xB0B4},{0xAC20, 0xB0B5},{0xAC24, 0xB0B6},{0xAC2C, 0xB0B7}, - {0xAC2D, 0xB0B8},{0xAC2F, 0xB0B9},{0xAC30, 0xB0BA},{0xAC31, 0xB0BB},{0xAC38, 0xB0BC},{0xAC39, 0xB0BD},{0xAC3C, 0xB0BE},{0xAC40, 0xB0BF}, - {0xAC4B, 0xB0C0},{0xAC4D, 0xB0C1},{0xAC54, 0xB0C2},{0xAC58, 0xB0C3},{0xAC5C, 0xB0C4},{0xAC70, 0xB0C5},{0xAC71, 0xB0C6},{0xAC74, 0xB0C7}, - {0xAC77, 0xB0C8},{0xAC78, 0xB0C9},{0xAC7A, 0xB0CA},{0xAC80, 0xB0CB},{0xAC81, 0xB0CC},{0xAC83, 0xB0CD},{0xAC84, 0xB0CE},{0xAC85, 0xB0CF}, - {0xAC86, 0xB0D0},{0xAC89, 0xB0D1},{0xAC8A, 0xB0D2},{0xAC8B, 0xB0D3},{0xAC8C, 0xB0D4},{0xAC90, 0xB0D5},{0xAC94, 0xB0D6},{0xAC9C, 0xB0D7}, - {0xAC9D, 0xB0D8},{0xAC9F, 0xB0D9},{0xACA0, 0xB0DA},{0xACA1, 0xB0DB},{0xACA8, 0xB0DC},{0xACA9, 0xB0DD},{0xACAA, 0xB0DE},{0xACAC, 0xB0DF}, - {0xACAF, 0xB0E0},{0xACB0, 0xB0E1},{0xACB8, 0xB0E2},{0xACB9, 0xB0E3},{0xACBB, 0xB0E4},{0xACBC, 0xB0E5},{0xACBD, 0xB0E6},{0xACC1, 0xB0E7}, - {0xACC4, 0xB0E8},{0xACC8, 0xB0E9},{0xACCC, 0xB0EA},{0xACD5, 0xB0EB},{0xACD7, 0xB0EC},{0xACE0, 0xB0ED},{0xACE1, 0xB0EE},{0xACE4, 0xB0EF}, - {0xACE7, 0xB0F0},{0xACE8, 0xB0F1},{0xACEA, 0xB0F2},{0xACEC, 0xB0F3},{0xACEF, 0xB0F4},{0xACF0, 0xB0F5},{0xACF1, 0xB0F6},{0xACF3, 0xB0F7}, - {0xACF5, 0xB0F8},{0xACF6, 0xB0F9},{0xACFC, 0xB0FA},{0xACFD, 0xB0FB},{0xAD00, 0xB0FC},{0xAD04, 0xB0FD},{0xAD06, 0xB0FE},{0xAD0C, 0xB1A1}, - {0xAD0D, 0xB1A2},{0xAD0F, 0xB1A3},{0xAD11, 0xB1A4},{0xAD18, 0xB1A5},{0xAD1C, 0xB1A6},{0xAD20, 0xB1A7},{0xAD29, 0xB1A8},{0xAD2C, 0xB1A9}, - {0xAD2D, 0xB1AA},{0xAD34, 0xB1AB},{0xAD35, 0xB1AC},{0xAD38, 0xB1AD},{0xAD3C, 0xB1AE},{0xAD44, 0xB1AF},{0xAD45, 0xB1B0},{0xAD47, 0xB1B1}, - {0xAD49, 0xB1B2},{0xAD50, 0xB1B3},{0xAD54, 0xB1B4},{0xAD58, 0xB1B5},{0xAD61, 0xB1B6},{0xAD63, 0xB1B7},{0xAD6C, 0xB1B8},{0xAD6D, 0xB1B9}, - {0xAD70, 0xB1BA},{0xAD73, 0xB1BB},{0xAD74, 0xB1BC},{0xAD75, 0xB1BD},{0xAD76, 0xB1BE},{0xAD7B, 0xB1BF},{0xAD7C, 0xB1C0},{0xAD7D, 0xB1C1}, - {0xAD7F, 0xB1C2},{0xAD81, 0xB1C3},{0xAD82, 0xB1C4},{0xAD88, 0xB1C5},{0xAD89, 0xB1C6},{0xAD8C, 0xB1C7},{0xAD90, 0xB1C8},{0xAD9C, 0xB1C9}, - {0xAD9D, 0xB1CA},{0xADA4, 0xB1CB},{0xADB7, 0xB1CC},{0xADC0, 0xB1CD},{0xADC1, 0xB1CE},{0xADC4, 0xB1CF},{0xADC8, 0xB1D0},{0xADD0, 0xB1D1}, - {0xADD1, 0xB1D2},{0xADD3, 0xB1D3},{0xADDC, 0xB1D4},{0xADE0, 0xB1D5},{0xADE4, 0xB1D6},{0xADF8, 0xB1D7},{0xADF9, 0xB1D8},{0xADFC, 0xB1D9}, - {0xADFF, 0xB1DA},{0xAE00, 0xB1DB},{0xAE01, 0xB1DC},{0xAE08, 0xB1DD},{0xAE09, 0xB1DE},{0xAE0B, 0xB1DF},{0xAE0D, 0xB1E0},{0xAE14, 0xB1E1}, - {0xAE30, 0xB1E2},{0xAE31, 0xB1E3},{0xAE34, 0xB1E4},{0xAE37, 0xB1E5},{0xAE38, 0xB1E6},{0xAE3A, 0xB1E7},{0xAE40, 0xB1E8},{0xAE41, 0xB1E9}, - {0xAE43, 0xB1EA},{0xAE45, 0xB1EB},{0xAE46, 0xB1EC},{0xAE4A, 0xB1ED},{0xAE4C, 0xB1EE},{0xAE4D, 0xB1EF},{0xAE4E, 0xB1F0},{0xAE50, 0xB1F1}, - {0xAE54, 0xB1F2},{0xAE56, 0xB1F3},{0xAE5C, 0xB1F4},{0xAE5D, 0xB1F5},{0xAE5F, 0xB1F6},{0xAE60, 0xB1F7},{0xAE61, 0xB1F8},{0xAE65, 0xB1F9}, - {0xAE68, 0xB1FA},{0xAE69, 0xB1FB},{0xAE6C, 0xB1FC},{0xAE70, 0xB1FD},{0xAE78, 0xB1FE},{0xAE79, 0xB2A1},{0xAE7B, 0xB2A2},{0xAE7C, 0xB2A3}, - {0xAE7D, 0xB2A4},{0xAE84, 0xB2A5},{0xAE85, 0xB2A6},{0xAE8C, 0xB2A7},{0xAEBC, 0xB2A8},{0xAEBD, 0xB2A9},{0xAEBE, 0xB2AA},{0xAEC0, 0xB2AB}, - {0xAEC4, 0xB2AC},{0xAECC, 0xB2AD},{0xAECD, 0xB2AE},{0xAECF, 0xB2AF},{0xAED0, 0xB2B0},{0xAED1, 0xB2B1},{0xAED8, 0xB2B2},{0xAED9, 0xB2B3}, - {0xAEDC, 0xB2B4},{0xAEE8, 0xB2B5},{0xAEEB, 0xB2B6},{0xAEED, 0xB2B7},{0xAEF4, 0xB2B8},{0xAEF8, 0xB2B9},{0xAEFC, 0xB2BA},{0xAF07, 0xB2BB}, - {0xAF08, 0xB2BC},{0xAF0D, 0xB2BD},{0xAF10, 0xB2BE},{0xAF2C, 0xB2BF},{0xAF2D, 0xB2C0},{0xAF30, 0xB2C1},{0xAF32, 0xB2C2},{0xAF34, 0xB2C3}, - {0xAF3C, 0xB2C4},{0xAF3D, 0xB2C5},{0xAF3F, 0xB2C6},{0xAF41, 0xB2C7},{0xAF42, 0xB2C8},{0xAF43, 0xB2C9},{0xAF48, 0xB2CA},{0xAF49, 0xB2CB}, - {0xAF50, 0xB2CC},{0xAF5C, 0xB2CD},{0xAF5D, 0xB2CE},{0xAF64, 0xB2CF},{0xAF65, 0xB2D0},{0xAF79, 0xB2D1},{0xAF80, 0xB2D2},{0xAF84, 0xB2D3}, - {0xAF88, 0xB2D4},{0xAF90, 0xB2D5},{0xAF91, 0xB2D6},{0xAF95, 0xB2D7},{0xAF9C, 0xB2D8},{0xAFB8, 0xB2D9},{0xAFB9, 0xB2DA},{0xAFBC, 0xB2DB}, - {0xAFC0, 0xB2DC},{0xAFC7, 0xB2DD},{0xAFC8, 0xB2DE},{0xAFC9, 0xB2DF},{0xAFCB, 0xB2E0},{0xAFCD, 0xB2E1},{0xAFCE, 0xB2E2},{0xAFD4, 0xB2E3}, - {0xAFDC, 0xB2E4},{0xAFE8, 0xB2E5},{0xAFE9, 0xB2E6},{0xAFF0, 0xB2E7},{0xAFF1, 0xB2E8},{0xAFF4, 0xB2E9},{0xAFF8, 0xB2EA},{0xB000, 0xB2EB}, - {0xB001, 0xB2EC},{0xB004, 0xB2ED},{0xB00C, 0xB2EE},{0xB010, 0xB2EF},{0xB014, 0xB2F0},{0xB01C, 0xB2F1},{0xB01D, 0xB2F2},{0xB028, 0xB2F3}, - {0xB044, 0xB2F4},{0xB045, 0xB2F5},{0xB048, 0xB2F6},{0xB04A, 0xB2F7},{0xB04C, 0xB2F8},{0xB04E, 0xB2F9},{0xB053, 0xB2FA},{0xB054, 0xB2FB}, - {0xB055, 0xB2FC},{0xB057, 0xB2FD},{0xB059, 0xB2FE},{0xB05D, 0xB3A1},{0xB07C, 0xB3A2},{0xB07D, 0xB3A3},{0xB080, 0xB3A4},{0xB084, 0xB3A5}, - {0xB08C, 0xB3A6},{0xB08D, 0xB3A7},{0xB08F, 0xB3A8},{0xB091, 0xB3A9},{0xB098, 0xB3AA},{0xB099, 0xB3AB},{0xB09A, 0xB3AC},{0xB09C, 0xB3AD}, - {0xB09F, 0xB3AE},{0xB0A0, 0xB3AF},{0xB0A1, 0xB3B0},{0xB0A2, 0xB3B1},{0xB0A8, 0xB3B2},{0xB0A9, 0xB3B3},{0xB0AB, 0xB3B4},{0xB0AC, 0xB3B5}, - {0xB0AD, 0xB3B6},{0xB0AE, 0xB3B7},{0xB0AF, 0xB3B8},{0xB0B1, 0xB3B9},{0xB0B3, 0xB3BA},{0xB0B4, 0xB3BB},{0xB0B5, 0xB3BC},{0xB0B8, 0xB3BD}, - {0xB0BC, 0xB3BE},{0xB0C4, 0xB3BF},{0xB0C5, 0xB3C0},{0xB0C7, 0xB3C1},{0xB0C8, 0xB3C2},{0xB0C9, 0xB3C3},{0xB0D0, 0xB3C4},{0xB0D1, 0xB3C5}, - {0xB0D4, 0xB3C6},{0xB0D8, 0xB3C7},{0xB0E0, 0xB3C8},{0xB0E5, 0xB3C9},{0xB108, 0xB3CA},{0xB109, 0xB3CB},{0xB10B, 0xB3CC},{0xB10C, 0xB3CD}, - {0xB110, 0xB3CE},{0xB112, 0xB3CF},{0xB113, 0xB3D0},{0xB118, 0xB3D1},{0xB119, 0xB3D2},{0xB11B, 0xB3D3},{0xB11C, 0xB3D4},{0xB11D, 0xB3D5}, - {0xB123, 0xB3D6},{0xB124, 0xB3D7},{0xB125, 0xB3D8},{0xB128, 0xB3D9},{0xB12C, 0xB3DA},{0xB134, 0xB3DB},{0xB135, 0xB3DC},{0xB137, 0xB3DD}, - {0xB138, 0xB3DE},{0xB139, 0xB3DF},{0xB140, 0xB3E0},{0xB141, 0xB3E1},{0xB144, 0xB3E2},{0xB148, 0xB3E3},{0xB150, 0xB3E4},{0xB151, 0xB3E5}, - {0xB154, 0xB3E6},{0xB155, 0xB3E7},{0xB158, 0xB3E8},{0xB15C, 0xB3E9},{0xB160, 0xB3EA},{0xB178, 0xB3EB},{0xB179, 0xB3EC},{0xB17C, 0xB3ED}, - {0xB180, 0xB3EE},{0xB182, 0xB3EF},{0xB188, 0xB3F0},{0xB189, 0xB3F1},{0xB18B, 0xB3F2},{0xB18D, 0xB3F3},{0xB192, 0xB3F4},{0xB193, 0xB3F5}, - {0xB194, 0xB3F6},{0xB198, 0xB3F7},{0xB19C, 0xB3F8},{0xB1A8, 0xB3F9},{0xB1CC, 0xB3FA},{0xB1D0, 0xB3FB},{0xB1D4, 0xB3FC},{0xB1DC, 0xB3FD}, - {0xB1DD, 0xB3FE},{0xB1DF, 0xB4A1},{0xB1E8, 0xB4A2},{0xB1E9, 0xB4A3},{0xB1EC, 0xB4A4},{0xB1F0, 0xB4A5},{0xB1F9, 0xB4A6},{0xB1FB, 0xB4A7}, - {0xB1FD, 0xB4A8},{0xB204, 0xB4A9},{0xB205, 0xB4AA},{0xB208, 0xB4AB},{0xB20B, 0xB4AC},{0xB20C, 0xB4AD},{0xB214, 0xB4AE},{0xB215, 0xB4AF}, - {0xB217, 0xB4B0},{0xB219, 0xB4B1},{0xB220, 0xB4B2},{0xB234, 0xB4B3},{0xB23C, 0xB4B4},{0xB258, 0xB4B5},{0xB25C, 0xB4B6},{0xB260, 0xB4B7}, - {0xB268, 0xB4B8},{0xB269, 0xB4B9},{0xB274, 0xB4BA},{0xB275, 0xB4BB},{0xB27C, 0xB4BC},{0xB284, 0xB4BD},{0xB285, 0xB4BE},{0xB289, 0xB4BF}, - {0xB290, 0xB4C0},{0xB291, 0xB4C1},{0xB294, 0xB4C2},{0xB298, 0xB4C3},{0xB299, 0xB4C4},{0xB29A, 0xB4C5},{0xB2A0, 0xB4C6},{0xB2A1, 0xB4C7}, - {0xB2A3, 0xB4C8},{0xB2A5, 0xB4C9},{0xB2A6, 0xB4CA},{0xB2AA, 0xB4CB},{0xB2AC, 0xB4CC},{0xB2B0, 0xB4CD},{0xB2B4, 0xB4CE},{0xB2C8, 0xB4CF}, - {0xB2C9, 0xB4D0},{0xB2CC, 0xB4D1},{0xB2D0, 0xB4D2},{0xB2D2, 0xB4D3},{0xB2D8, 0xB4D4},{0xB2D9, 0xB4D5},{0xB2DB, 0xB4D6},{0xB2DD, 0xB4D7}, - {0xB2E2, 0xB4D8},{0xB2E4, 0xB4D9},{0xB2E5, 0xB4DA},{0xB2E6, 0xB4DB},{0xB2E8, 0xB4DC},{0xB2EB, 0xB4DD},{0xB2EC, 0xB4DE},{0xB2ED, 0xB4DF}, - {0xB2EE, 0xB4E0},{0xB2EF, 0xB4E1},{0xB2F3, 0xB4E2},{0xB2F4, 0xB4E3},{0xB2F5, 0xB4E4},{0xB2F7, 0xB4E5},{0xB2F8, 0xB4E6},{0xB2F9, 0xB4E7}, - {0xB2FA, 0xB4E8},{0xB2FB, 0xB4E9},{0xB2FF, 0xB4EA},{0xB300, 0xB4EB},{0xB301, 0xB4EC},{0xB304, 0xB4ED},{0xB308, 0xB4EE},{0xB310, 0xB4EF}, - {0xB311, 0xB4F0},{0xB313, 0xB4F1},{0xB314, 0xB4F2},{0xB315, 0xB4F3},{0xB31C, 0xB4F4},{0xB354, 0xB4F5},{0xB355, 0xB4F6},{0xB356, 0xB4F7}, - {0xB358, 0xB4F8},{0xB35B, 0xB4F9},{0xB35C, 0xB4FA},{0xB35E, 0xB4FB},{0xB35F, 0xB4FC},{0xB364, 0xB4FD},{0xB365, 0xB4FE},{0xB367, 0xB5A1}, - {0xB369, 0xB5A2},{0xB36B, 0xB5A3},{0xB36E, 0xB5A4},{0xB370, 0xB5A5},{0xB371, 0xB5A6},{0xB374, 0xB5A7},{0xB378, 0xB5A8},{0xB380, 0xB5A9}, - {0xB381, 0xB5AA},{0xB383, 0xB5AB},{0xB384, 0xB5AC},{0xB385, 0xB5AD},{0xB38C, 0xB5AE},{0xB390, 0xB5AF},{0xB394, 0xB5B0},{0xB3A0, 0xB5B1}, - {0xB3A1, 0xB5B2},{0xB3A8, 0xB5B3},{0xB3AC, 0xB5B4},{0xB3C4, 0xB5B5},{0xB3C5, 0xB5B6},{0xB3C8, 0xB5B7},{0xB3CB, 0xB5B8},{0xB3CC, 0xB5B9}, - {0xB3CE, 0xB5BA},{0xB3D0, 0xB5BB},{0xB3D4, 0xB5BC},{0xB3D5, 0xB5BD},{0xB3D7, 0xB5BE},{0xB3D9, 0xB5BF},{0xB3DB, 0xB5C0},{0xB3DD, 0xB5C1}, - {0xB3E0, 0xB5C2},{0xB3E4, 0xB5C3},{0xB3E8, 0xB5C4},{0xB3FC, 0xB5C5},{0xB410, 0xB5C6},{0xB418, 0xB5C7},{0xB41C, 0xB5C8},{0xB420, 0xB5C9}, - {0xB428, 0xB5CA},{0xB429, 0xB5CB},{0xB42B, 0xB5CC},{0xB434, 0xB5CD},{0xB450, 0xB5CE},{0xB451, 0xB5CF},{0xB454, 0xB5D0},{0xB458, 0xB5D1}, - {0xB460, 0xB5D2},{0xB461, 0xB5D3},{0xB463, 0xB5D4},{0xB465, 0xB5D5},{0xB46C, 0xB5D6},{0xB480, 0xB5D7},{0xB488, 0xB5D8},{0xB49D, 0xB5D9}, - {0xB4A4, 0xB5DA},{0xB4A8, 0xB5DB},{0xB4AC, 0xB5DC},{0xB4B5, 0xB5DD},{0xB4B7, 0xB5DE},{0xB4B9, 0xB5DF},{0xB4C0, 0xB5E0},{0xB4C4, 0xB5E1}, - {0xB4C8, 0xB5E2},{0xB4D0, 0xB5E3},{0xB4D5, 0xB5E4},{0xB4DC, 0xB5E5},{0xB4DD, 0xB5E6},{0xB4E0, 0xB5E7},{0xB4E3, 0xB5E8},{0xB4E4, 0xB5E9}, - {0xB4E6, 0xB5EA},{0xB4EC, 0xB5EB},{0xB4ED, 0xB5EC},{0xB4EF, 0xB5ED},{0xB4F1, 0xB5EE},{0xB4F8, 0xB5EF},{0xB514, 0xB5F0},{0xB515, 0xB5F1}, - {0xB518, 0xB5F2},{0xB51B, 0xB5F3},{0xB51C, 0xB5F4},{0xB524, 0xB5F5},{0xB525, 0xB5F6},{0xB527, 0xB5F7},{0xB528, 0xB5F8},{0xB529, 0xB5F9}, - {0xB52A, 0xB5FA},{0xB530, 0xB5FB},{0xB531, 0xB5FC},{0xB534, 0xB5FD},{0xB538, 0xB5FE},{0xB540, 0xB6A1},{0xB541, 0xB6A2},{0xB543, 0xB6A3}, - {0xB544, 0xB6A4},{0xB545, 0xB6A5},{0xB54B, 0xB6A6},{0xB54C, 0xB6A7},{0xB54D, 0xB6A8},{0xB550, 0xB6A9},{0xB554, 0xB6AA},{0xB55C, 0xB6AB}, - {0xB55D, 0xB6AC},{0xB55F, 0xB6AD},{0xB560, 0xB6AE},{0xB561, 0xB6AF},{0xB5A0, 0xB6B0},{0xB5A1, 0xB6B1},{0xB5A4, 0xB6B2},{0xB5A8, 0xB6B3}, - {0xB5AA, 0xB6B4},{0xB5AB, 0xB6B5},{0xB5B0, 0xB6B6},{0xB5B1, 0xB6B7},{0xB5B3, 0xB6B8},{0xB5B4, 0xB6B9},{0xB5B5, 0xB6BA},{0xB5BB, 0xB6BB}, - {0xB5BC, 0xB6BC},{0xB5BD, 0xB6BD},{0xB5C0, 0xB6BE},{0xB5C4, 0xB6BF},{0xB5CC, 0xB6C0},{0xB5CD, 0xB6C1},{0xB5CF, 0xB6C2},{0xB5D0, 0xB6C3}, - {0xB5D1, 0xB6C4},{0xB5D8, 0xB6C5},{0xB5EC, 0xB6C6},{0xB610, 0xB6C7},{0xB611, 0xB6C8},{0xB614, 0xB6C9},{0xB618, 0xB6CA},{0xB625, 0xB6CB}, - {0xB62C, 0xB6CC},{0xB634, 0xB6CD},{0xB648, 0xB6CE},{0xB664, 0xB6CF},{0xB668, 0xB6D0},{0xB69C, 0xB6D1},{0xB69D, 0xB6D2},{0xB6A0, 0xB6D3}, - {0xB6A4, 0xB6D4},{0xB6AB, 0xB6D5},{0xB6AC, 0xB6D6},{0xB6B1, 0xB6D7},{0xB6D4, 0xB6D8},{0xB6F0, 0xB6D9},{0xB6F4, 0xB6DA},{0xB6F8, 0xB6DB}, - {0xB700, 0xB6DC},{0xB701, 0xB6DD},{0xB705, 0xB6DE},{0xB728, 0xB6DF},{0xB729, 0xB6E0},{0xB72C, 0xB6E1},{0xB72F, 0xB6E2},{0xB730, 0xB6E3}, - {0xB738, 0xB6E4},{0xB739, 0xB6E5},{0xB73B, 0xB6E6},{0xB744, 0xB6E7},{0xB748, 0xB6E8},{0xB74C, 0xB6E9},{0xB754, 0xB6EA},{0xB755, 0xB6EB}, - {0xB760, 0xB6EC},{0xB764, 0xB6ED},{0xB768, 0xB6EE},{0xB770, 0xB6EF},{0xB771, 0xB6F0},{0xB773, 0xB6F1},{0xB775, 0xB6F2},{0xB77C, 0xB6F3}, - {0xB77D, 0xB6F4},{0xB780, 0xB6F5},{0xB784, 0xB6F6},{0xB78C, 0xB6F7},{0xB78D, 0xB6F8},{0xB78F, 0xB6F9},{0xB790, 0xB6FA},{0xB791, 0xB6FB}, - {0xB792, 0xB6FC},{0xB796, 0xB6FD},{0xB797, 0xB6FE},{0xB798, 0xB7A1},{0xB799, 0xB7A2},{0xB79C, 0xB7A3},{0xB7A0, 0xB7A4},{0xB7A8, 0xB7A5}, - {0xB7A9, 0xB7A6},{0xB7AB, 0xB7A7},{0xB7AC, 0xB7A8},{0xB7AD, 0xB7A9},{0xB7B4, 0xB7AA},{0xB7B5, 0xB7AB},{0xB7B8, 0xB7AC},{0xB7C7, 0xB7AD}, - {0xB7C9, 0xB7AE},{0xB7EC, 0xB7AF},{0xB7ED, 0xB7B0},{0xB7F0, 0xB7B1},{0xB7F4, 0xB7B2},{0xB7FC, 0xB7B3},{0xB7FD, 0xB7B4},{0xB7FF, 0xB7B5}, - {0xB800, 0xB7B6},{0xB801, 0xB7B7},{0xB807, 0xB7B8},{0xB808, 0xB7B9},{0xB809, 0xB7BA},{0xB80C, 0xB7BB},{0xB810, 0xB7BC},{0xB818, 0xB7BD}, - {0xB819, 0xB7BE},{0xB81B, 0xB7BF},{0xB81D, 0xB7C0},{0xB824, 0xB7C1},{0xB825, 0xB7C2},{0xB828, 0xB7C3},{0xB82C, 0xB7C4},{0xB834, 0xB7C5}, - {0xB835, 0xB7C6},{0xB837, 0xB7C7},{0xB838, 0xB7C8},{0xB839, 0xB7C9},{0xB840, 0xB7CA},{0xB844, 0xB7CB},{0xB851, 0xB7CC},{0xB853, 0xB7CD}, - {0xB85C, 0xB7CE},{0xB85D, 0xB7CF},{0xB860, 0xB7D0},{0xB864, 0xB7D1},{0xB86C, 0xB7D2},{0xB86D, 0xB7D3},{0xB86F, 0xB7D4},{0xB871, 0xB7D5}, - {0xB878, 0xB7D6},{0xB87C, 0xB7D7},{0xB88D, 0xB7D8},{0xB8A8, 0xB7D9},{0xB8B0, 0xB7DA},{0xB8B4, 0xB7DB},{0xB8B8, 0xB7DC},{0xB8C0, 0xB7DD}, - {0xB8C1, 0xB7DE},{0xB8C3, 0xB7DF},{0xB8C5, 0xB7E0},{0xB8CC, 0xB7E1},{0xB8D0, 0xB7E2},{0xB8D4, 0xB7E3},{0xB8DD, 0xB7E4},{0xB8DF, 0xB7E5}, - {0xB8E1, 0xB7E6},{0xB8E8, 0xB7E7},{0xB8E9, 0xB7E8},{0xB8EC, 0xB7E9},{0xB8F0, 0xB7EA},{0xB8F8, 0xB7EB},{0xB8F9, 0xB7EC},{0xB8FB, 0xB7ED}, - {0xB8FD, 0xB7EE},{0xB904, 0xB7EF},{0xB918, 0xB7F0},{0xB920, 0xB7F1},{0xB93C, 0xB7F2},{0xB93D, 0xB7F3},{0xB940, 0xB7F4},{0xB944, 0xB7F5}, - {0xB94C, 0xB7F6},{0xB94F, 0xB7F7},{0xB951, 0xB7F8},{0xB958, 0xB7F9},{0xB959, 0xB7FA},{0xB95C, 0xB7FB},{0xB960, 0xB7FC},{0xB968, 0xB7FD}, - {0xB969, 0xB7FE},{0xB96B, 0xB8A1},{0xB96D, 0xB8A2},{0xB974, 0xB8A3},{0xB975, 0xB8A4},{0xB978, 0xB8A5},{0xB97C, 0xB8A6},{0xB984, 0xB8A7}, - {0xB985, 0xB8A8},{0xB987, 0xB8A9},{0xB989, 0xB8AA},{0xB98A, 0xB8AB},{0xB98D, 0xB8AC},{0xB98E, 0xB8AD},{0xB9AC, 0xB8AE},{0xB9AD, 0xB8AF}, - {0xB9B0, 0xB8B0},{0xB9B4, 0xB8B1},{0xB9BC, 0xB8B2},{0xB9BD, 0xB8B3},{0xB9BF, 0xB8B4},{0xB9C1, 0xB8B5},{0xB9C8, 0xB8B6},{0xB9C9, 0xB8B7}, - {0xB9CC, 0xB8B8},{0xB9CE, 0xB8B9},{0xB9CF, 0xB8BA},{0xB9D0, 0xB8BB},{0xB9D1, 0xB8BC},{0xB9D2, 0xB8BD},{0xB9D8, 0xB8BE},{0xB9D9, 0xB8BF}, - {0xB9DB, 0xB8C0},{0xB9DD, 0xB8C1},{0xB9DE, 0xB8C2},{0xB9E1, 0xB8C3},{0xB9E3, 0xB8C4},{0xB9E4, 0xB8C5},{0xB9E5, 0xB8C6},{0xB9E8, 0xB8C7}, - {0xB9EC, 0xB8C8},{0xB9F4, 0xB8C9},{0xB9F5, 0xB8CA},{0xB9F7, 0xB8CB},{0xB9F8, 0xB8CC},{0xB9F9, 0xB8CD},{0xB9FA, 0xB8CE},{0xBA00, 0xB8CF}, - {0xBA01, 0xB8D0},{0xBA08, 0xB8D1},{0xBA15, 0xB8D2},{0xBA38, 0xB8D3},{0xBA39, 0xB8D4},{0xBA3C, 0xB8D5},{0xBA40, 0xB8D6},{0xBA42, 0xB8D7}, - {0xBA48, 0xB8D8},{0xBA49, 0xB8D9},{0xBA4B, 0xB8DA},{0xBA4D, 0xB8DB},{0xBA4E, 0xB8DC},{0xBA53, 0xB8DD},{0xBA54, 0xB8DE},{0xBA55, 0xB8DF}, - {0xBA58, 0xB8E0},{0xBA5C, 0xB8E1},{0xBA64, 0xB8E2},{0xBA65, 0xB8E3},{0xBA67, 0xB8E4},{0xBA68, 0xB8E5},{0xBA69, 0xB8E6},{0xBA70, 0xB8E7}, - {0xBA71, 0xB8E8},{0xBA74, 0xB8E9},{0xBA78, 0xB8EA},{0xBA83, 0xB8EB},{0xBA84, 0xB8EC},{0xBA85, 0xB8ED},{0xBA87, 0xB8EE},{0xBA8C, 0xB8EF}, - {0xBAA8, 0xB8F0},{0xBAA9, 0xB8F1},{0xBAAB, 0xB8F2},{0xBAAC, 0xB8F3},{0xBAB0, 0xB8F4},{0xBAB2, 0xB8F5},{0xBAB8, 0xB8F6},{0xBAB9, 0xB8F7}, - {0xBABB, 0xB8F8},{0xBABD, 0xB8F9},{0xBAC4, 0xB8FA},{0xBAC8, 0xB8FB},{0xBAD8, 0xB8FC},{0xBAD9, 0xB8FD},{0xBAFC, 0xB8FE},{0xBB00, 0xB9A1}, - {0xBB04, 0xB9A2},{0xBB0D, 0xB9A3},{0xBB0F, 0xB9A4},{0xBB11, 0xB9A5},{0xBB18, 0xB9A6},{0xBB1C, 0xB9A7},{0xBB20, 0xB9A8},{0xBB29, 0xB9A9}, - {0xBB2B, 0xB9AA},{0xBB34, 0xB9AB},{0xBB35, 0xB9AC},{0xBB36, 0xB9AD},{0xBB38, 0xB9AE},{0xBB3B, 0xB9AF},{0xBB3C, 0xB9B0},{0xBB3D, 0xB9B1}, - {0xBB3E, 0xB9B2},{0xBB44, 0xB9B3},{0xBB45, 0xB9B4},{0xBB47, 0xB9B5},{0xBB49, 0xB9B6},{0xBB4D, 0xB9B7},{0xBB4F, 0xB9B8},{0xBB50, 0xB9B9}, - {0xBB54, 0xB9BA},{0xBB58, 0xB9BB},{0xBB61, 0xB9BC},{0xBB63, 0xB9BD},{0xBB6C, 0xB9BE},{0xBB88, 0xB9BF},{0xBB8C, 0xB9C0},{0xBB90, 0xB9C1}, - {0xBBA4, 0xB9C2},{0xBBA8, 0xB9C3},{0xBBAC, 0xB9C4},{0xBBB4, 0xB9C5},{0xBBB7, 0xB9C6},{0xBBC0, 0xB9C7},{0xBBC4, 0xB9C8},{0xBBC8, 0xB9C9}, - {0xBBD0, 0xB9CA},{0xBBD3, 0xB9CB},{0xBBF8, 0xB9CC},{0xBBF9, 0xB9CD},{0xBBFC, 0xB9CE},{0xBBFF, 0xB9CF},{0xBC00, 0xB9D0},{0xBC02, 0xB9D1}, - {0xBC08, 0xB9D2},{0xBC09, 0xB9D3},{0xBC0B, 0xB9D4},{0xBC0C, 0xB9D5},{0xBC0D, 0xB9D6},{0xBC0F, 0xB9D7},{0xBC11, 0xB9D8},{0xBC14, 0xB9D9}, - {0xBC15, 0xB9DA},{0xBC16, 0xB9DB},{0xBC17, 0xB9DC},{0xBC18, 0xB9DD},{0xBC1B, 0xB9DE},{0xBC1C, 0xB9DF},{0xBC1D, 0xB9E0},{0xBC1E, 0xB9E1}, - {0xBC1F, 0xB9E2},{0xBC24, 0xB9E3},{0xBC25, 0xB9E4},{0xBC27, 0xB9E5},{0xBC29, 0xB9E6},{0xBC2D, 0xB9E7},{0xBC30, 0xB9E8},{0xBC31, 0xB9E9}, - {0xBC34, 0xB9EA},{0xBC38, 0xB9EB},{0xBC40, 0xB9EC},{0xBC41, 0xB9ED},{0xBC43, 0xB9EE},{0xBC44, 0xB9EF},{0xBC45, 0xB9F0},{0xBC49, 0xB9F1}, - {0xBC4C, 0xB9F2},{0xBC4D, 0xB9F3},{0xBC50, 0xB9F4},{0xBC5D, 0xB9F5},{0xBC84, 0xB9F6},{0xBC85, 0xB9F7},{0xBC88, 0xB9F8},{0xBC8B, 0xB9F9}, - {0xBC8C, 0xB9FA},{0xBC8E, 0xB9FB},{0xBC94, 0xB9FC},{0xBC95, 0xB9FD},{0xBC97, 0xB9FE},{0xBC99, 0xBAA1},{0xBC9A, 0xBAA2},{0xBCA0, 0xBAA3}, - {0xBCA1, 0xBAA4},{0xBCA4, 0xBAA5},{0xBCA7, 0xBAA6},{0xBCA8, 0xBAA7},{0xBCB0, 0xBAA8},{0xBCB1, 0xBAA9},{0xBCB3, 0xBAAA},{0xBCB4, 0xBAAB}, - {0xBCB5, 0xBAAC},{0xBCBC, 0xBAAD},{0xBCBD, 0xBAAE},{0xBCC0, 0xBAAF},{0xBCC4, 0xBAB0},{0xBCCD, 0xBAB1},{0xBCCF, 0xBAB2},{0xBCD0, 0xBAB3}, - {0xBCD1, 0xBAB4},{0xBCD5, 0xBAB5},{0xBCD8, 0xBAB6},{0xBCDC, 0xBAB7},{0xBCF4, 0xBAB8},{0xBCF5, 0xBAB9},{0xBCF6, 0xBABA},{0xBCF8, 0xBABB}, - {0xBCFC, 0xBABC},{0xBD04, 0xBABD},{0xBD05, 0xBABE},{0xBD07, 0xBABF},{0xBD09, 0xBAC0},{0xBD10, 0xBAC1},{0xBD14, 0xBAC2},{0xBD24, 0xBAC3}, - {0xBD2C, 0xBAC4},{0xBD40, 0xBAC5},{0xBD48, 0xBAC6},{0xBD49, 0xBAC7},{0xBD4C, 0xBAC8},{0xBD50, 0xBAC9},{0xBD58, 0xBACA},{0xBD59, 0xBACB}, - {0xBD64, 0xBACC},{0xBD68, 0xBACD},{0xBD80, 0xBACE},{0xBD81, 0xBACF},{0xBD84, 0xBAD0},{0xBD87, 0xBAD1},{0xBD88, 0xBAD2},{0xBD89, 0xBAD3}, - {0xBD8A, 0xBAD4},{0xBD90, 0xBAD5},{0xBD91, 0xBAD6},{0xBD93, 0xBAD7},{0xBD95, 0xBAD8},{0xBD99, 0xBAD9},{0xBD9A, 0xBADA},{0xBD9C, 0xBADB}, - {0xBDA4, 0xBADC},{0xBDB0, 0xBADD},{0xBDB8, 0xBADE},{0xBDD4, 0xBADF},{0xBDD5, 0xBAE0},{0xBDD8, 0xBAE1},{0xBDDC, 0xBAE2},{0xBDE9, 0xBAE3}, - {0xBDF0, 0xBAE4},{0xBDF4, 0xBAE5},{0xBDF8, 0xBAE6},{0xBE00, 0xBAE7},{0xBE03, 0xBAE8},{0xBE05, 0xBAE9},{0xBE0C, 0xBAEA},{0xBE0D, 0xBAEB}, - {0xBE10, 0xBAEC},{0xBE14, 0xBAED},{0xBE1C, 0xBAEE},{0xBE1D, 0xBAEF},{0xBE1F, 0xBAF0},{0xBE44, 0xBAF1},{0xBE45, 0xBAF2},{0xBE48, 0xBAF3}, - {0xBE4C, 0xBAF4},{0xBE4E, 0xBAF5},{0xBE54, 0xBAF6},{0xBE55, 0xBAF7},{0xBE57, 0xBAF8},{0xBE59, 0xBAF9},{0xBE5A, 0xBAFA},{0xBE5B, 0xBAFB}, - {0xBE60, 0xBAFC},{0xBE61, 0xBAFD},{0xBE64, 0xBAFE},{0xBE68, 0xBBA1},{0xBE6A, 0xBBA2},{0xBE70, 0xBBA3},{0xBE71, 0xBBA4},{0xBE73, 0xBBA5}, - {0xBE74, 0xBBA6},{0xBE75, 0xBBA7},{0xBE7B, 0xBBA8},{0xBE7C, 0xBBA9},{0xBE7D, 0xBBAA},{0xBE80, 0xBBAB},{0xBE84, 0xBBAC},{0xBE8C, 0xBBAD}, - {0xBE8D, 0xBBAE},{0xBE8F, 0xBBAF},{0xBE90, 0xBBB0},{0xBE91, 0xBBB1},{0xBE98, 0xBBB2},{0xBE99, 0xBBB3},{0xBEA8, 0xBBB4},{0xBED0, 0xBBB5}, - {0xBED1, 0xBBB6},{0xBED4, 0xBBB7},{0xBED7, 0xBBB8},{0xBED8, 0xBBB9},{0xBEE0, 0xBBBA},{0xBEE3, 0xBBBB},{0xBEE4, 0xBBBC},{0xBEE5, 0xBBBD}, - {0xBEEC, 0xBBBE},{0xBF01, 0xBBBF},{0xBF08, 0xBBC0},{0xBF09, 0xBBC1},{0xBF18, 0xBBC2},{0xBF19, 0xBBC3},{0xBF1B, 0xBBC4},{0xBF1C, 0xBBC5}, - {0xBF1D, 0xBBC6},{0xBF40, 0xBBC7},{0xBF41, 0xBBC8},{0xBF44, 0xBBC9},{0xBF48, 0xBBCA},{0xBF50, 0xBBCB},{0xBF51, 0xBBCC},{0xBF55, 0xBBCD}, - {0xBF94, 0xBBCE},{0xBFB0, 0xBBCF},{0xBFC5, 0xBBD0},{0xBFCC, 0xBBD1},{0xBFCD, 0xBBD2},{0xBFD0, 0xBBD3},{0xBFD4, 0xBBD4},{0xBFDC, 0xBBD5}, - {0xBFDF, 0xBBD6},{0xBFE1, 0xBBD7},{0xC03C, 0xBBD8},{0xC051, 0xBBD9},{0xC058, 0xBBDA},{0xC05C, 0xBBDB},{0xC060, 0xBBDC},{0xC068, 0xBBDD}, - {0xC069, 0xBBDE},{0xC090, 0xBBDF},{0xC091, 0xBBE0},{0xC094, 0xBBE1},{0xC098, 0xBBE2},{0xC0A0, 0xBBE3},{0xC0A1, 0xBBE4},{0xC0A3, 0xBBE5}, - {0xC0A5, 0xBBE6},{0xC0AC, 0xBBE7},{0xC0AD, 0xBBE8},{0xC0AF, 0xBBE9},{0xC0B0, 0xBBEA},{0xC0B3, 0xBBEB},{0xC0B4, 0xBBEC},{0xC0B5, 0xBBED}, - {0xC0B6, 0xBBEE},{0xC0BC, 0xBBEF},{0xC0BD, 0xBBF0},{0xC0BF, 0xBBF1},{0xC0C0, 0xBBF2},{0xC0C1, 0xBBF3},{0xC0C5, 0xBBF4},{0xC0C8, 0xBBF5}, - {0xC0C9, 0xBBF6},{0xC0CC, 0xBBF7},{0xC0D0, 0xBBF8},{0xC0D8, 0xBBF9},{0xC0D9, 0xBBFA},{0xC0DB, 0xBBFB},{0xC0DC, 0xBBFC},{0xC0DD, 0xBBFD}, - {0xC0E4, 0xBBFE},{0xC0E5, 0xBCA1},{0xC0E8, 0xBCA2},{0xC0EC, 0xBCA3},{0xC0F4, 0xBCA4},{0xC0F5, 0xBCA5},{0xC0F7, 0xBCA6},{0xC0F9, 0xBCA7}, - {0xC100, 0xBCA8},{0xC104, 0xBCA9},{0xC108, 0xBCAA},{0xC110, 0xBCAB},{0xC115, 0xBCAC},{0xC11C, 0xBCAD},{0xC11D, 0xBCAE},{0xC11E, 0xBCAF}, - {0xC11F, 0xBCB0},{0xC120, 0xBCB1},{0xC123, 0xBCB2},{0xC124, 0xBCB3},{0xC126, 0xBCB4},{0xC127, 0xBCB5},{0xC12C, 0xBCB6},{0xC12D, 0xBCB7}, - {0xC12F, 0xBCB8},{0xC130, 0xBCB9},{0xC131, 0xBCBA},{0xC136, 0xBCBB},{0xC138, 0xBCBC},{0xC139, 0xBCBD},{0xC13C, 0xBCBE},{0xC140, 0xBCBF}, - {0xC148, 0xBCC0},{0xC149, 0xBCC1},{0xC14B, 0xBCC2},{0xC14C, 0xBCC3},{0xC14D, 0xBCC4},{0xC154, 0xBCC5},{0xC155, 0xBCC6},{0xC158, 0xBCC7}, - {0xC15C, 0xBCC8},{0xC164, 0xBCC9},{0xC165, 0xBCCA},{0xC167, 0xBCCB},{0xC168, 0xBCCC},{0xC169, 0xBCCD},{0xC170, 0xBCCE},{0xC174, 0xBCCF}, - {0xC178, 0xBCD0},{0xC185, 0xBCD1},{0xC18C, 0xBCD2},{0xC18D, 0xBCD3},{0xC18E, 0xBCD4},{0xC190, 0xBCD5},{0xC194, 0xBCD6},{0xC196, 0xBCD7}, - {0xC19C, 0xBCD8},{0xC19D, 0xBCD9},{0xC19F, 0xBCDA},{0xC1A1, 0xBCDB},{0xC1A5, 0xBCDC},{0xC1A8, 0xBCDD},{0xC1A9, 0xBCDE},{0xC1AC, 0xBCDF}, - {0xC1B0, 0xBCE0},{0xC1BD, 0xBCE1},{0xC1C4, 0xBCE2},{0xC1C8, 0xBCE3},{0xC1CC, 0xBCE4},{0xC1D4, 0xBCE5},{0xC1D7, 0xBCE6},{0xC1D8, 0xBCE7}, - {0xC1E0, 0xBCE8},{0xC1E4, 0xBCE9},{0xC1E8, 0xBCEA},{0xC1F0, 0xBCEB},{0xC1F1, 0xBCEC},{0xC1F3, 0xBCED},{0xC1FC, 0xBCEE},{0xC1FD, 0xBCEF}, - {0xC200, 0xBCF0},{0xC204, 0xBCF1},{0xC20C, 0xBCF2},{0xC20D, 0xBCF3},{0xC20F, 0xBCF4},{0xC211, 0xBCF5},{0xC218, 0xBCF6},{0xC219, 0xBCF7}, - {0xC21C, 0xBCF8},{0xC21F, 0xBCF9},{0xC220, 0xBCFA},{0xC228, 0xBCFB},{0xC229, 0xBCFC},{0xC22B, 0xBCFD},{0xC22D, 0xBCFE},{0xC22F, 0xBDA1}, - {0xC231, 0xBDA2},{0xC232, 0xBDA3},{0xC234, 0xBDA4},{0xC248, 0xBDA5},{0xC250, 0xBDA6},{0xC251, 0xBDA7},{0xC254, 0xBDA8},{0xC258, 0xBDA9}, - {0xC260, 0xBDAA},{0xC265, 0xBDAB},{0xC26C, 0xBDAC},{0xC26D, 0xBDAD},{0xC270, 0xBDAE},{0xC274, 0xBDAF},{0xC27C, 0xBDB0},{0xC27D, 0xBDB1}, - {0xC27F, 0xBDB2},{0xC281, 0xBDB3},{0xC288, 0xBDB4},{0xC289, 0xBDB5},{0xC290, 0xBDB6},{0xC298, 0xBDB7},{0xC29B, 0xBDB8},{0xC29D, 0xBDB9}, - {0xC2A4, 0xBDBA},{0xC2A5, 0xBDBB},{0xC2A8, 0xBDBC},{0xC2AC, 0xBDBD},{0xC2AD, 0xBDBE},{0xC2B4, 0xBDBF},{0xC2B5, 0xBDC0},{0xC2B7, 0xBDC1}, - {0xC2B9, 0xBDC2},{0xC2DC, 0xBDC3},{0xC2DD, 0xBDC4},{0xC2E0, 0xBDC5},{0xC2E3, 0xBDC6},{0xC2E4, 0xBDC7},{0xC2EB, 0xBDC8},{0xC2EC, 0xBDC9}, - {0xC2ED, 0xBDCA},{0xC2EF, 0xBDCB},{0xC2F1, 0xBDCC},{0xC2F6, 0xBDCD},{0xC2F8, 0xBDCE},{0xC2F9, 0xBDCF},{0xC2FB, 0xBDD0},{0xC2FC, 0xBDD1}, - {0xC300, 0xBDD2},{0xC308, 0xBDD3},{0xC309, 0xBDD4},{0xC30C, 0xBDD5},{0xC30D, 0xBDD6},{0xC313, 0xBDD7},{0xC314, 0xBDD8},{0xC315, 0xBDD9}, - {0xC318, 0xBDDA},{0xC31C, 0xBDDB},{0xC324, 0xBDDC},{0xC325, 0xBDDD},{0xC328, 0xBDDE},{0xC329, 0xBDDF},{0xC345, 0xBDE0},{0xC368, 0xBDE1}, - {0xC369, 0xBDE2},{0xC36C, 0xBDE3},{0xC370, 0xBDE4},{0xC372, 0xBDE5},{0xC378, 0xBDE6},{0xC379, 0xBDE7},{0xC37C, 0xBDE8},{0xC37D, 0xBDE9}, - {0xC384, 0xBDEA},{0xC388, 0xBDEB},{0xC38C, 0xBDEC},{0xC3C0, 0xBDED},{0xC3D8, 0xBDEE},{0xC3D9, 0xBDEF},{0xC3DC, 0xBDF0},{0xC3DF, 0xBDF1}, - {0xC3E0, 0xBDF2},{0xC3E2, 0xBDF3},{0xC3E8, 0xBDF4},{0xC3E9, 0xBDF5},{0xC3ED, 0xBDF6},{0xC3F4, 0xBDF7},{0xC3F5, 0xBDF8},{0xC3F8, 0xBDF9}, - {0xC408, 0xBDFA},{0xC410, 0xBDFB},{0xC424, 0xBDFC},{0xC42C, 0xBDFD},{0xC430, 0xBDFE},{0xC434, 0xBEA1},{0xC43C, 0xBEA2},{0xC43D, 0xBEA3}, - {0xC448, 0xBEA4},{0xC464, 0xBEA5},{0xC465, 0xBEA6},{0xC468, 0xBEA7},{0xC46C, 0xBEA8},{0xC474, 0xBEA9},{0xC475, 0xBEAA},{0xC479, 0xBEAB}, - {0xC480, 0xBEAC},{0xC494, 0xBEAD},{0xC49C, 0xBEAE},{0xC4B8, 0xBEAF},{0xC4BC, 0xBEB0},{0xC4E9, 0xBEB1},{0xC4F0, 0xBEB2},{0xC4F1, 0xBEB3}, - {0xC4F4, 0xBEB4},{0xC4F8, 0xBEB5},{0xC4FA, 0xBEB6},{0xC4FF, 0xBEB7},{0xC500, 0xBEB8},{0xC501, 0xBEB9},{0xC50C, 0xBEBA},{0xC510, 0xBEBB}, - {0xC514, 0xBEBC},{0xC51C, 0xBEBD},{0xC528, 0xBEBE},{0xC529, 0xBEBF},{0xC52C, 0xBEC0},{0xC530, 0xBEC1},{0xC538, 0xBEC2},{0xC539, 0xBEC3}, - {0xC53B, 0xBEC4},{0xC53D, 0xBEC5},{0xC544, 0xBEC6},{0xC545, 0xBEC7},{0xC548, 0xBEC8},{0xC549, 0xBEC9},{0xC54A, 0xBECA},{0xC54C, 0xBECB}, - {0xC54D, 0xBECC},{0xC54E, 0xBECD},{0xC553, 0xBECE},{0xC554, 0xBECF},{0xC555, 0xBED0},{0xC557, 0xBED1},{0xC558, 0xBED2},{0xC559, 0xBED3}, - {0xC55D, 0xBED4},{0xC55E, 0xBED5},{0xC560, 0xBED6},{0xC561, 0xBED7},{0xC564, 0xBED8},{0xC568, 0xBED9},{0xC570, 0xBEDA},{0xC571, 0xBEDB}, - {0xC573, 0xBEDC},{0xC574, 0xBEDD},{0xC575, 0xBEDE},{0xC57C, 0xBEDF},{0xC57D, 0xBEE0},{0xC580, 0xBEE1},{0xC584, 0xBEE2},{0xC587, 0xBEE3}, - {0xC58C, 0xBEE4},{0xC58D, 0xBEE5},{0xC58F, 0xBEE6},{0xC591, 0xBEE7},{0xC595, 0xBEE8},{0xC597, 0xBEE9},{0xC598, 0xBEEA},{0xC59C, 0xBEEB}, - {0xC5A0, 0xBEEC},{0xC5A9, 0xBEED},{0xC5B4, 0xBEEE},{0xC5B5, 0xBEEF},{0xC5B8, 0xBEF0},{0xC5B9, 0xBEF1},{0xC5BB, 0xBEF2},{0xC5BC, 0xBEF3}, - {0xC5BD, 0xBEF4},{0xC5BE, 0xBEF5},{0xC5C4, 0xBEF6},{0xC5C5, 0xBEF7},{0xC5C6, 0xBEF8},{0xC5C7, 0xBEF9},{0xC5C8, 0xBEFA},{0xC5C9, 0xBEFB}, - {0xC5CA, 0xBEFC},{0xC5CC, 0xBEFD},{0xC5CE, 0xBEFE},{0xC5D0, 0xBFA1},{0xC5D1, 0xBFA2},{0xC5D4, 0xBFA3},{0xC5D8, 0xBFA4},{0xC5E0, 0xBFA5}, - {0xC5E1, 0xBFA6},{0xC5E3, 0xBFA7},{0xC5E5, 0xBFA8},{0xC5EC, 0xBFA9},{0xC5ED, 0xBFAA},{0xC5EE, 0xBFAB},{0xC5F0, 0xBFAC},{0xC5F4, 0xBFAD}, - {0xC5F6, 0xBFAE},{0xC5F7, 0xBFAF},{0xC5FC, 0xBFB0},{0xC5FD, 0xBFB1},{0xC5FE, 0xBFB2},{0xC5FF, 0xBFB3},{0xC600, 0xBFB4},{0xC601, 0xBFB5}, - {0xC605, 0xBFB6},{0xC606, 0xBFB7},{0xC607, 0xBFB8},{0xC608, 0xBFB9},{0xC60C, 0xBFBA},{0xC610, 0xBFBB},{0xC618, 0xBFBC},{0xC619, 0xBFBD}, - {0xC61B, 0xBFBE},{0xC61C, 0xBFBF},{0xC624, 0xBFC0},{0xC625, 0xBFC1},{0xC628, 0xBFC2},{0xC62C, 0xBFC3},{0xC62D, 0xBFC4},{0xC62E, 0xBFC5}, - {0xC630, 0xBFC6},{0xC633, 0xBFC7},{0xC634, 0xBFC8},{0xC635, 0xBFC9},{0xC637, 0xBFCA},{0xC639, 0xBFCB},{0xC63B, 0xBFCC},{0xC640, 0xBFCD}, - {0xC641, 0xBFCE},{0xC644, 0xBFCF},{0xC648, 0xBFD0},{0xC650, 0xBFD1},{0xC651, 0xBFD2},{0xC653, 0xBFD3},{0xC654, 0xBFD4},{0xC655, 0xBFD5}, - {0xC65C, 0xBFD6},{0xC65D, 0xBFD7},{0xC660, 0xBFD8},{0xC66C, 0xBFD9},{0xC66F, 0xBFDA},{0xC671, 0xBFDB},{0xC678, 0xBFDC},{0xC679, 0xBFDD}, - {0xC67C, 0xBFDE},{0xC680, 0xBFDF},{0xC688, 0xBFE0},{0xC689, 0xBFE1},{0xC68B, 0xBFE2},{0xC68D, 0xBFE3},{0xC694, 0xBFE4},{0xC695, 0xBFE5}, - {0xC698, 0xBFE6},{0xC69C, 0xBFE7},{0xC6A4, 0xBFE8},{0xC6A5, 0xBFE9},{0xC6A7, 0xBFEA},{0xC6A9, 0xBFEB},{0xC6B0, 0xBFEC},{0xC6B1, 0xBFED}, - {0xC6B4, 0xBFEE},{0xC6B8, 0xBFEF},{0xC6B9, 0xBFF0},{0xC6BA, 0xBFF1},{0xC6C0, 0xBFF2},{0xC6C1, 0xBFF3},{0xC6C3, 0xBFF4},{0xC6C5, 0xBFF5}, - {0xC6CC, 0xBFF6},{0xC6CD, 0xBFF7},{0xC6D0, 0xBFF8},{0xC6D4, 0xBFF9},{0xC6DC, 0xBFFA},{0xC6DD, 0xBFFB},{0xC6E0, 0xBFFC},{0xC6E1, 0xBFFD}, - {0xC6E8, 0xBFFE},{0xC6E9, 0xC0A1},{0xC6EC, 0xC0A2},{0xC6F0, 0xC0A3},{0xC6F8, 0xC0A4},{0xC6F9, 0xC0A5},{0xC6FD, 0xC0A6},{0xC704, 0xC0A7}, - {0xC705, 0xC0A8},{0xC708, 0xC0A9},{0xC70C, 0xC0AA},{0xC714, 0xC0AB},{0xC715, 0xC0AC},{0xC717, 0xC0AD},{0xC719, 0xC0AE},{0xC720, 0xC0AF}, - {0xC721, 0xC0B0},{0xC724, 0xC0B1},{0xC728, 0xC0B2},{0xC730, 0xC0B3},{0xC731, 0xC0B4},{0xC733, 0xC0B5},{0xC735, 0xC0B6},{0xC737, 0xC0B7}, - {0xC73C, 0xC0B8},{0xC73D, 0xC0B9},{0xC740, 0xC0BA},{0xC744, 0xC0BB},{0xC74A, 0xC0BC},{0xC74C, 0xC0BD},{0xC74D, 0xC0BE},{0xC74F, 0xC0BF}, - {0xC751, 0xC0C0},{0xC752, 0xC0C1},{0xC753, 0xC0C2},{0xC754, 0xC0C3},{0xC755, 0xC0C4},{0xC756, 0xC0C5},{0xC757, 0xC0C6},{0xC758, 0xC0C7}, - {0xC75C, 0xC0C8},{0xC760, 0xC0C9},{0xC768, 0xC0CA},{0xC76B, 0xC0CB},{0xC774, 0xC0CC},{0xC775, 0xC0CD},{0xC778, 0xC0CE},{0xC77C, 0xC0CF}, - {0xC77D, 0xC0D0},{0xC77E, 0xC0D1},{0xC783, 0xC0D2},{0xC784, 0xC0D3},{0xC785, 0xC0D4},{0xC787, 0xC0D5},{0xC788, 0xC0D6},{0xC789, 0xC0D7}, - {0xC78A, 0xC0D8},{0xC78E, 0xC0D9},{0xC790, 0xC0DA},{0xC791, 0xC0DB},{0xC794, 0xC0DC},{0xC796, 0xC0DD},{0xC797, 0xC0DE},{0xC798, 0xC0DF}, - {0xC79A, 0xC0E0},{0xC7A0, 0xC0E1},{0xC7A1, 0xC0E2},{0xC7A3, 0xC0E3},{0xC7A4, 0xC0E4},{0xC7A5, 0xC0E5},{0xC7A6, 0xC0E6},{0xC7AC, 0xC0E7}, - {0xC7AD, 0xC0E8},{0xC7B0, 0xC0E9},{0xC7B4, 0xC0EA},{0xC7BC, 0xC0EB},{0xC7BD, 0xC0EC},{0xC7BF, 0xC0ED},{0xC7C0, 0xC0EE},{0xC7C1, 0xC0EF}, - {0xC7C8, 0xC0F0},{0xC7C9, 0xC0F1},{0xC7CC, 0xC0F2},{0xC7CE, 0xC0F3},{0xC7D0, 0xC0F4},{0xC7D8, 0xC0F5},{0xC7DD, 0xC0F6},{0xC7E4, 0xC0F7}, - {0xC7E8, 0xC0F8},{0xC7EC, 0xC0F9},{0xC800, 0xC0FA},{0xC801, 0xC0FB},{0xC804, 0xC0FC},{0xC808, 0xC0FD},{0xC80A, 0xC0FE},{0xC810, 0xC1A1}, - {0xC811, 0xC1A2},{0xC813, 0xC1A3},{0xC815, 0xC1A4},{0xC816, 0xC1A5},{0xC81C, 0xC1A6},{0xC81D, 0xC1A7},{0xC820, 0xC1A8},{0xC824, 0xC1A9}, - {0xC82C, 0xC1AA},{0xC82D, 0xC1AB},{0xC82F, 0xC1AC},{0xC831, 0xC1AD},{0xC838, 0xC1AE},{0xC83C, 0xC1AF},{0xC840, 0xC1B0},{0xC848, 0xC1B1}, - {0xC849, 0xC1B2},{0xC84C, 0xC1B3},{0xC84D, 0xC1B4},{0xC854, 0xC1B5},{0xC870, 0xC1B6},{0xC871, 0xC1B7},{0xC874, 0xC1B8},{0xC878, 0xC1B9}, - {0xC87A, 0xC1BA},{0xC880, 0xC1BB},{0xC881, 0xC1BC},{0xC883, 0xC1BD},{0xC885, 0xC1BE},{0xC886, 0xC1BF},{0xC887, 0xC1C0},{0xC88B, 0xC1C1}, - {0xC88C, 0xC1C2},{0xC88D, 0xC1C3},{0xC894, 0xC1C4},{0xC89D, 0xC1C5},{0xC89F, 0xC1C6},{0xC8A1, 0xC1C7},{0xC8A8, 0xC1C8},{0xC8BC, 0xC1C9}, - {0xC8BD, 0xC1CA},{0xC8C4, 0xC1CB},{0xC8C8, 0xC1CC},{0xC8CC, 0xC1CD},{0xC8D4, 0xC1CE},{0xC8D5, 0xC1CF},{0xC8D7, 0xC1D0},{0xC8D9, 0xC1D1}, - {0xC8E0, 0xC1D2},{0xC8E1, 0xC1D3},{0xC8E4, 0xC1D4},{0xC8F5, 0xC1D5},{0xC8FC, 0xC1D6},{0xC8FD, 0xC1D7},{0xC900, 0xC1D8},{0xC904, 0xC1D9}, - {0xC905, 0xC1DA},{0xC906, 0xC1DB},{0xC90C, 0xC1DC},{0xC90D, 0xC1DD},{0xC90F, 0xC1DE},{0xC911, 0xC1DF},{0xC918, 0xC1E0},{0xC92C, 0xC1E1}, - {0xC934, 0xC1E2},{0xC950, 0xC1E3},{0xC951, 0xC1E4},{0xC954, 0xC1E5},{0xC958, 0xC1E6},{0xC960, 0xC1E7},{0xC961, 0xC1E8},{0xC963, 0xC1E9}, - {0xC96C, 0xC1EA},{0xC970, 0xC1EB},{0xC974, 0xC1EC},{0xC97C, 0xC1ED},{0xC988, 0xC1EE},{0xC989, 0xC1EF},{0xC98C, 0xC1F0},{0xC990, 0xC1F1}, - {0xC998, 0xC1F2},{0xC999, 0xC1F3},{0xC99B, 0xC1F4},{0xC99D, 0xC1F5},{0xC9C0, 0xC1F6},{0xC9C1, 0xC1F7},{0xC9C4, 0xC1F8},{0xC9C7, 0xC1F9}, - {0xC9C8, 0xC1FA},{0xC9CA, 0xC1FB},{0xC9D0, 0xC1FC},{0xC9D1, 0xC1FD},{0xC9D3, 0xC1FE},{0xC9D5, 0xC2A1},{0xC9D6, 0xC2A2},{0xC9D9, 0xC2A3}, - {0xC9DA, 0xC2A4},{0xC9DC, 0xC2A5},{0xC9DD, 0xC2A6},{0xC9E0, 0xC2A7},{0xC9E2, 0xC2A8},{0xC9E4, 0xC2A9},{0xC9E7, 0xC2AA},{0xC9EC, 0xC2AB}, - {0xC9ED, 0xC2AC},{0xC9EF, 0xC2AD},{0xC9F0, 0xC2AE},{0xC9F1, 0xC2AF},{0xC9F8, 0xC2B0},{0xC9F9, 0xC2B1},{0xC9FC, 0xC2B2},{0xCA00, 0xC2B3}, - {0xCA08, 0xC2B4},{0xCA09, 0xC2B5},{0xCA0B, 0xC2B6},{0xCA0C, 0xC2B7},{0xCA0D, 0xC2B8},{0xCA14, 0xC2B9},{0xCA18, 0xC2BA},{0xCA29, 0xC2BB}, - {0xCA4C, 0xC2BC},{0xCA4D, 0xC2BD},{0xCA50, 0xC2BE},{0xCA54, 0xC2BF},{0xCA5C, 0xC2C0},{0xCA5D, 0xC2C1},{0xCA5F, 0xC2C2},{0xCA60, 0xC2C3}, - {0xCA61, 0xC2C4},{0xCA68, 0xC2C5},{0xCA7D, 0xC2C6},{0xCA84, 0xC2C7},{0xCA98, 0xC2C8},{0xCABC, 0xC2C9},{0xCABD, 0xC2CA},{0xCAC0, 0xC2CB}, - {0xCAC4, 0xC2CC},{0xCACC, 0xC2CD},{0xCACD, 0xC2CE},{0xCACF, 0xC2CF},{0xCAD1, 0xC2D0},{0xCAD3, 0xC2D1},{0xCAD8, 0xC2D2},{0xCAD9, 0xC2D3}, - {0xCAE0, 0xC2D4},{0xCAEC, 0xC2D5},{0xCAF4, 0xC2D6},{0xCB08, 0xC2D7},{0xCB10, 0xC2D8},{0xCB14, 0xC2D9},{0xCB18, 0xC2DA},{0xCB20, 0xC2DB}, - {0xCB21, 0xC2DC},{0xCB41, 0xC2DD},{0xCB48, 0xC2DE},{0xCB49, 0xC2DF},{0xCB4C, 0xC2E0},{0xCB50, 0xC2E1},{0xCB58, 0xC2E2},{0xCB59, 0xC2E3}, - {0xCB5D, 0xC2E4},{0xCB64, 0xC2E5},{0xCB78, 0xC2E6},{0xCB79, 0xC2E7},{0xCB9C, 0xC2E8},{0xCBB8, 0xC2E9},{0xCBD4, 0xC2EA},{0xCBE4, 0xC2EB}, - {0xCBE7, 0xC2EC},{0xCBE9, 0xC2ED},{0xCC0C, 0xC2EE},{0xCC0D, 0xC2EF},{0xCC10, 0xC2F0},{0xCC14, 0xC2F1},{0xCC1C, 0xC2F2},{0xCC1D, 0xC2F3}, - {0xCC21, 0xC2F4},{0xCC22, 0xC2F5},{0xCC27, 0xC2F6},{0xCC28, 0xC2F7},{0xCC29, 0xC2F8},{0xCC2C, 0xC2F9},{0xCC2E, 0xC2FA},{0xCC30, 0xC2FB}, - {0xCC38, 0xC2FC},{0xCC39, 0xC2FD},{0xCC3B, 0xC2FE},{0xCC3C, 0xC3A1},{0xCC3D, 0xC3A2},{0xCC3E, 0xC3A3},{0xCC44, 0xC3A4},{0xCC45, 0xC3A5}, - {0xCC48, 0xC3A6},{0xCC4C, 0xC3A7},{0xCC54, 0xC3A8},{0xCC55, 0xC3A9},{0xCC57, 0xC3AA},{0xCC58, 0xC3AB},{0xCC59, 0xC3AC},{0xCC60, 0xC3AD}, - {0xCC64, 0xC3AE},{0xCC66, 0xC3AF},{0xCC68, 0xC3B0},{0xCC70, 0xC3B1},{0xCC75, 0xC3B2},{0xCC98, 0xC3B3},{0xCC99, 0xC3B4},{0xCC9C, 0xC3B5}, - {0xCCA0, 0xC3B6},{0xCCA8, 0xC3B7},{0xCCA9, 0xC3B8},{0xCCAB, 0xC3B9},{0xCCAC, 0xC3BA},{0xCCAD, 0xC3BB},{0xCCB4, 0xC3BC},{0xCCB5, 0xC3BD}, - {0xCCB8, 0xC3BE},{0xCCBC, 0xC3BF},{0xCCC4, 0xC3C0},{0xCCC5, 0xC3C1},{0xCCC7, 0xC3C2},{0xCCC9, 0xC3C3},{0xCCD0, 0xC3C4},{0xCCD4, 0xC3C5}, - {0xCCE4, 0xC3C6},{0xCCEC, 0xC3C7},{0xCCF0, 0xC3C8},{0xCD01, 0xC3C9},{0xCD08, 0xC3CA},{0xCD09, 0xC3CB},{0xCD0C, 0xC3CC},{0xCD10, 0xC3CD}, - {0xCD18, 0xC3CE},{0xCD19, 0xC3CF},{0xCD1B, 0xC3D0},{0xCD1D, 0xC3D1},{0xCD24, 0xC3D2},{0xCD28, 0xC3D3},{0xCD2C, 0xC3D4},{0xCD39, 0xC3D5}, - {0xCD5C, 0xC3D6},{0xCD60, 0xC3D7},{0xCD64, 0xC3D8},{0xCD6C, 0xC3D9},{0xCD6D, 0xC3DA},{0xCD6F, 0xC3DB},{0xCD71, 0xC3DC},{0xCD78, 0xC3DD}, - {0xCD88, 0xC3DE},{0xCD94, 0xC3DF},{0xCD95, 0xC3E0},{0xCD98, 0xC3E1},{0xCD9C, 0xC3E2},{0xCDA4, 0xC3E3},{0xCDA5, 0xC3E4},{0xCDA7, 0xC3E5}, - {0xCDA9, 0xC3E6},{0xCDB0, 0xC3E7},{0xCDC4, 0xC3E8},{0xCDCC, 0xC3E9},{0xCDD0, 0xC3EA},{0xCDE8, 0xC3EB},{0xCDEC, 0xC3EC},{0xCDF0, 0xC3ED}, - {0xCDF8, 0xC3EE},{0xCDF9, 0xC3EF},{0xCDFB, 0xC3F0},{0xCDFD, 0xC3F1},{0xCE04, 0xC3F2},{0xCE08, 0xC3F3},{0xCE0C, 0xC3F4},{0xCE14, 0xC3F5}, - {0xCE19, 0xC3F6},{0xCE20, 0xC3F7},{0xCE21, 0xC3F8},{0xCE24, 0xC3F9},{0xCE28, 0xC3FA},{0xCE30, 0xC3FB},{0xCE31, 0xC3FC},{0xCE33, 0xC3FD}, - {0xCE35, 0xC3FE},{0xCE58, 0xC4A1},{0xCE59, 0xC4A2},{0xCE5C, 0xC4A3},{0xCE5F, 0xC4A4},{0xCE60, 0xC4A5},{0xCE61, 0xC4A6},{0xCE68, 0xC4A7}, - {0xCE69, 0xC4A8},{0xCE6B, 0xC4A9},{0xCE6D, 0xC4AA},{0xCE74, 0xC4AB},{0xCE75, 0xC4AC},{0xCE78, 0xC4AD},{0xCE7C, 0xC4AE},{0xCE84, 0xC4AF}, - {0xCE85, 0xC4B0},{0xCE87, 0xC4B1},{0xCE89, 0xC4B2},{0xCE90, 0xC4B3},{0xCE91, 0xC4B4},{0xCE94, 0xC4B5},{0xCE98, 0xC4B6},{0xCEA0, 0xC4B7}, - {0xCEA1, 0xC4B8},{0xCEA3, 0xC4B9},{0xCEA4, 0xC4BA},{0xCEA5, 0xC4BB},{0xCEAC, 0xC4BC},{0xCEAD, 0xC4BD},{0xCEC1, 0xC4BE},{0xCEE4, 0xC4BF}, - {0xCEE5, 0xC4C0},{0xCEE8, 0xC4C1},{0xCEEB, 0xC4C2},{0xCEEC, 0xC4C3},{0xCEF4, 0xC4C4},{0xCEF5, 0xC4C5},{0xCEF7, 0xC4C6},{0xCEF8, 0xC4C7}, - {0xCEF9, 0xC4C8},{0xCF00, 0xC4C9},{0xCF01, 0xC4CA},{0xCF04, 0xC4CB},{0xCF08, 0xC4CC},{0xCF10, 0xC4CD},{0xCF11, 0xC4CE},{0xCF13, 0xC4CF}, - {0xCF15, 0xC4D0},{0xCF1C, 0xC4D1},{0xCF20, 0xC4D2},{0xCF24, 0xC4D3},{0xCF2C, 0xC4D4},{0xCF2D, 0xC4D5},{0xCF2F, 0xC4D6},{0xCF30, 0xC4D7}, - {0xCF31, 0xC4D8},{0xCF38, 0xC4D9},{0xCF54, 0xC4DA},{0xCF55, 0xC4DB},{0xCF58, 0xC4DC},{0xCF5C, 0xC4DD},{0xCF64, 0xC4DE},{0xCF65, 0xC4DF}, - {0xCF67, 0xC4E0},{0xCF69, 0xC4E1},{0xCF70, 0xC4E2},{0xCF71, 0xC4E3},{0xCF74, 0xC4E4},{0xCF78, 0xC4E5},{0xCF80, 0xC4E6},{0xCF85, 0xC4E7}, - {0xCF8C, 0xC4E8},{0xCFA1, 0xC4E9},{0xCFA8, 0xC4EA},{0xCFB0, 0xC4EB},{0xCFC4, 0xC4EC},{0xCFE0, 0xC4ED},{0xCFE1, 0xC4EE},{0xCFE4, 0xC4EF}, - {0xCFE8, 0xC4F0},{0xCFF0, 0xC4F1},{0xCFF1, 0xC4F2},{0xCFF3, 0xC4F3},{0xCFF5, 0xC4F4},{0xCFFC, 0xC4F5},{0xD000, 0xC4F6},{0xD004, 0xC4F7}, - {0xD011, 0xC4F8},{0xD018, 0xC4F9},{0xD02D, 0xC4FA},{0xD034, 0xC4FB},{0xD035, 0xC4FC},{0xD038, 0xC4FD},{0xD03C, 0xC4FE},{0xD044, 0xC5A1}, - {0xD045, 0xC5A2},{0xD047, 0xC5A3},{0xD049, 0xC5A4},{0xD050, 0xC5A5},{0xD054, 0xC5A6},{0xD058, 0xC5A7},{0xD060, 0xC5A8},{0xD06C, 0xC5A9}, - {0xD06D, 0xC5AA},{0xD070, 0xC5AB},{0xD074, 0xC5AC},{0xD07C, 0xC5AD},{0xD07D, 0xC5AE},{0xD081, 0xC5AF},{0xD0A4, 0xC5B0},{0xD0A5, 0xC5B1}, - {0xD0A8, 0xC5B2},{0xD0AC, 0xC5B3},{0xD0B4, 0xC5B4},{0xD0B5, 0xC5B5},{0xD0B7, 0xC5B6},{0xD0B9, 0xC5B7},{0xD0C0, 0xC5B8},{0xD0C1, 0xC5B9}, - {0xD0C4, 0xC5BA},{0xD0C8, 0xC5BB},{0xD0C9, 0xC5BC},{0xD0D0, 0xC5BD},{0xD0D1, 0xC5BE},{0xD0D3, 0xC5BF},{0xD0D4, 0xC5C0},{0xD0D5, 0xC5C1}, - {0xD0DC, 0xC5C2},{0xD0DD, 0xC5C3},{0xD0E0, 0xC5C4},{0xD0E4, 0xC5C5},{0xD0EC, 0xC5C6},{0xD0ED, 0xC5C7},{0xD0EF, 0xC5C8},{0xD0F0, 0xC5C9}, - {0xD0F1, 0xC5CA},{0xD0F8, 0xC5CB},{0xD10D, 0xC5CC},{0xD130, 0xC5CD},{0xD131, 0xC5CE},{0xD134, 0xC5CF},{0xD138, 0xC5D0},{0xD13A, 0xC5D1}, - {0xD140, 0xC5D2},{0xD141, 0xC5D3},{0xD143, 0xC5D4},{0xD144, 0xC5D5},{0xD145, 0xC5D6},{0xD14C, 0xC5D7},{0xD14D, 0xC5D8},{0xD150, 0xC5D9}, - {0xD154, 0xC5DA},{0xD15C, 0xC5DB},{0xD15D, 0xC5DC},{0xD15F, 0xC5DD},{0xD161, 0xC5DE},{0xD168, 0xC5DF},{0xD16C, 0xC5E0},{0xD17C, 0xC5E1}, - {0xD184, 0xC5E2},{0xD188, 0xC5E3},{0xD1A0, 0xC5E4},{0xD1A1, 0xC5E5},{0xD1A4, 0xC5E6},{0xD1A8, 0xC5E7},{0xD1B0, 0xC5E8},{0xD1B1, 0xC5E9}, - {0xD1B3, 0xC5EA},{0xD1B5, 0xC5EB},{0xD1BA, 0xC5EC},{0xD1BC, 0xC5ED},{0xD1C0, 0xC5EE},{0xD1D8, 0xC5EF},{0xD1F4, 0xC5F0},{0xD1F8, 0xC5F1}, - {0xD207, 0xC5F2},{0xD209, 0xC5F3},{0xD210, 0xC5F4},{0xD22C, 0xC5F5},{0xD22D, 0xC5F6},{0xD230, 0xC5F7},{0xD234, 0xC5F8},{0xD23C, 0xC5F9}, - {0xD23D, 0xC5FA},{0xD23F, 0xC5FB},{0xD241, 0xC5FC},{0xD248, 0xC5FD},{0xD25C, 0xC5FE},{0xD264, 0xC6A1},{0xD280, 0xC6A2},{0xD281, 0xC6A3}, - {0xD284, 0xC6A4},{0xD288, 0xC6A5},{0xD290, 0xC6A6},{0xD291, 0xC6A7},{0xD295, 0xC6A8},{0xD29C, 0xC6A9},{0xD2A0, 0xC6AA},{0xD2A4, 0xC6AB}, - {0xD2AC, 0xC6AC},{0xD2B1, 0xC6AD},{0xD2B8, 0xC6AE},{0xD2B9, 0xC6AF},{0xD2BC, 0xC6B0},{0xD2BF, 0xC6B1},{0xD2C0, 0xC6B2},{0xD2C2, 0xC6B3}, - {0xD2C8, 0xC6B4},{0xD2C9, 0xC6B5},{0xD2CB, 0xC6B6},{0xD2D4, 0xC6B7},{0xD2D8, 0xC6B8},{0xD2DC, 0xC6B9},{0xD2E4, 0xC6BA},{0xD2E5, 0xC6BB}, - {0xD2F0, 0xC6BC},{0xD2F1, 0xC6BD},{0xD2F4, 0xC6BE},{0xD2F8, 0xC6BF},{0xD300, 0xC6C0},{0xD301, 0xC6C1},{0xD303, 0xC6C2},{0xD305, 0xC6C3}, - {0xD30C, 0xC6C4},{0xD30D, 0xC6C5},{0xD30E, 0xC6C6},{0xD310, 0xC6C7},{0xD314, 0xC6C8},{0xD316, 0xC6C9},{0xD31C, 0xC6CA},{0xD31D, 0xC6CB}, - {0xD31F, 0xC6CC},{0xD320, 0xC6CD},{0xD321, 0xC6CE},{0xD325, 0xC6CF},{0xD328, 0xC6D0},{0xD329, 0xC6D1},{0xD32C, 0xC6D2},{0xD330, 0xC6D3}, - {0xD338, 0xC6D4},{0xD339, 0xC6D5},{0xD33B, 0xC6D6},{0xD33C, 0xC6D7},{0xD33D, 0xC6D8},{0xD344, 0xC6D9},{0xD345, 0xC6DA},{0xD37C, 0xC6DB}, - {0xD37D, 0xC6DC},{0xD380, 0xC6DD},{0xD384, 0xC6DE},{0xD38C, 0xC6DF},{0xD38D, 0xC6E0},{0xD38F, 0xC6E1},{0xD390, 0xC6E2},{0xD391, 0xC6E3}, - {0xD398, 0xC6E4},{0xD399, 0xC6E5},{0xD39C, 0xC6E6},{0xD3A0, 0xC6E7},{0xD3A8, 0xC6E8},{0xD3A9, 0xC6E9},{0xD3AB, 0xC6EA},{0xD3AD, 0xC6EB}, - {0xD3B4, 0xC6EC},{0xD3B8, 0xC6ED},{0xD3BC, 0xC6EE},{0xD3C4, 0xC6EF},{0xD3C5, 0xC6F0},{0xD3C8, 0xC6F1},{0xD3C9, 0xC6F2},{0xD3D0, 0xC6F3}, - {0xD3D8, 0xC6F4},{0xD3E1, 0xC6F5},{0xD3E3, 0xC6F6},{0xD3EC, 0xC6F7},{0xD3ED, 0xC6F8},{0xD3F0, 0xC6F9},{0xD3F4, 0xC6FA},{0xD3FC, 0xC6FB}, - {0xD3FD, 0xC6FC},{0xD3FF, 0xC6FD},{0xD401, 0xC6FE},{0xD408, 0xC7A1},{0xD41D, 0xC7A2},{0xD440, 0xC7A3},{0xD444, 0xC7A4},{0xD45C, 0xC7A5}, - {0xD460, 0xC7A6},{0xD464, 0xC7A7},{0xD46D, 0xC7A8},{0xD46F, 0xC7A9},{0xD478, 0xC7AA},{0xD479, 0xC7AB},{0xD47C, 0xC7AC},{0xD47F, 0xC7AD}, - {0xD480, 0xC7AE},{0xD482, 0xC7AF},{0xD488, 0xC7B0},{0xD489, 0xC7B1},{0xD48B, 0xC7B2},{0xD48D, 0xC7B3},{0xD494, 0xC7B4},{0xD4A9, 0xC7B5}, - {0xD4CC, 0xC7B6},{0xD4D0, 0xC7B7},{0xD4D4, 0xC7B8},{0xD4DC, 0xC7B9},{0xD4DF, 0xC7BA},{0xD4E8, 0xC7BB},{0xD4EC, 0xC7BC},{0xD4F0, 0xC7BD}, - {0xD4F8, 0xC7BE},{0xD4FB, 0xC7BF},{0xD4FD, 0xC7C0},{0xD504, 0xC7C1},{0xD508, 0xC7C2},{0xD50C, 0xC7C3},{0xD514, 0xC7C4},{0xD515, 0xC7C5}, - {0xD517, 0xC7C6},{0xD53C, 0xC7C7},{0xD53D, 0xC7C8},{0xD540, 0xC7C9},{0xD544, 0xC7CA},{0xD54C, 0xC7CB},{0xD54D, 0xC7CC},{0xD54F, 0xC7CD}, - {0xD551, 0xC7CE},{0xD558, 0xC7CF},{0xD559, 0xC7D0},{0xD55C, 0xC7D1},{0xD560, 0xC7D2},{0xD565, 0xC7D3},{0xD568, 0xC7D4},{0xD569, 0xC7D5}, - {0xD56B, 0xC7D6},{0xD56D, 0xC7D7},{0xD574, 0xC7D8},{0xD575, 0xC7D9},{0xD578, 0xC7DA},{0xD57C, 0xC7DB},{0xD584, 0xC7DC},{0xD585, 0xC7DD}, - {0xD587, 0xC7DE},{0xD588, 0xC7DF},{0xD589, 0xC7E0},{0xD590, 0xC7E1},{0xD5A5, 0xC7E2},{0xD5C8, 0xC7E3},{0xD5C9, 0xC7E4},{0xD5CC, 0xC7E5}, - {0xD5D0, 0xC7E6},{0xD5D2, 0xC7E7},{0xD5D8, 0xC7E8},{0xD5D9, 0xC7E9},{0xD5DB, 0xC7EA},{0xD5DD, 0xC7EB},{0xD5E4, 0xC7EC},{0xD5E5, 0xC7ED}, - {0xD5E8, 0xC7EE},{0xD5EC, 0xC7EF},{0xD5F4, 0xC7F0},{0xD5F5, 0xC7F1},{0xD5F7, 0xC7F2},{0xD5F9, 0xC7F3},{0xD600, 0xC7F4},{0xD601, 0xC7F5}, - {0xD604, 0xC7F6},{0xD608, 0xC7F7},{0xD610, 0xC7F8},{0xD611, 0xC7F9},{0xD613, 0xC7FA},{0xD614, 0xC7FB},{0xD615, 0xC7FC},{0xD61C, 0xC7FD}, - {0xD620, 0xC7FE},{0xD624, 0xC8A1},{0xD62D, 0xC8A2},{0xD638, 0xC8A3},{0xD639, 0xC8A4},{0xD63C, 0xC8A5},{0xD640, 0xC8A6},{0xD645, 0xC8A7}, - {0xD648, 0xC8A8},{0xD649, 0xC8A9},{0xD64B, 0xC8AA},{0xD64D, 0xC8AB},{0xD651, 0xC8AC},{0xD654, 0xC8AD},{0xD655, 0xC8AE},{0xD658, 0xC8AF}, - {0xD65C, 0xC8B0},{0xD667, 0xC8B1},{0xD669, 0xC8B2},{0xD670, 0xC8B3},{0xD671, 0xC8B4},{0xD674, 0xC8B5},{0xD683, 0xC8B6},{0xD685, 0xC8B7}, - {0xD68C, 0xC8B8},{0xD68D, 0xC8B9},{0xD690, 0xC8BA},{0xD694, 0xC8BB},{0xD69D, 0xC8BC},{0xD69F, 0xC8BD},{0xD6A1, 0xC8BE},{0xD6A8, 0xC8BF}, - {0xD6AC, 0xC8C0},{0xD6B0, 0xC8C1},{0xD6B9, 0xC8C2},{0xD6BB, 0xC8C3},{0xD6C4, 0xC8C4},{0xD6C5, 0xC8C5},{0xD6C8, 0xC8C6},{0xD6CC, 0xC8C7}, - {0xD6D1, 0xC8C8},{0xD6D4, 0xC8C9},{0xD6D7, 0xC8CA},{0xD6D9, 0xC8CB},{0xD6E0, 0xC8CC},{0xD6E4, 0xC8CD},{0xD6E8, 0xC8CE},{0xD6F0, 0xC8CF}, - {0xD6F5, 0xC8D0},{0xD6FC, 0xC8D1},{0xD6FD, 0xC8D2},{0xD700, 0xC8D3},{0xD704, 0xC8D4},{0xD711, 0xC8D5},{0xD718, 0xC8D6},{0xD719, 0xC8D7}, - {0xD71C, 0xC8D8},{0xD720, 0xC8D9},{0xD728, 0xC8DA},{0xD729, 0xC8DB},{0xD72B, 0xC8DC},{0xD72D, 0xC8DD},{0xD734, 0xC8DE},{0xD735, 0xC8DF}, - {0xD738, 0xC8E0},{0xD73C, 0xC8E1},{0xD744, 0xC8E2},{0xD747, 0xC8E3},{0xD749, 0xC8E4},{0xD750, 0xC8E5},{0xD751, 0xC8E6},{0xD754, 0xC8E7}, - {0xD756, 0xC8E8},{0xD757, 0xC8E9},{0xD758, 0xC8EA},{0xD759, 0xC8EB},{0xD760, 0xC8EC},{0xD761, 0xC8ED},{0xD763, 0xC8EE},{0xD765, 0xC8EF}, - {0xD769, 0xC8F0},{0xD76C, 0xC8F1},{0xD770, 0xC8F2},{0xD774, 0xC8F3},{0xD77C, 0xC8F4},{0xD77D, 0xC8F5},{0xD781, 0xC8F6},{0xD788, 0xC8F7}, - {0xD789, 0xC8F8},{0xD78C, 0xC8F9},{0xD790, 0xC8FA},{0xD798, 0xC8FB},{0xD799, 0xC8FC},{0xD79B, 0xC8FD},{0xD79D, 0xC8FE},{0xF900, 0xCBD0}, - {0xF901, 0xCBD6},{0xF902, 0xCBE7},{0xF903, 0xCDCF},{0xF904, 0xCDE8},{0xF905, 0xCEAD},{0xF906, 0xCFFB},{0xF907, 0xD0A2},{0xF908, 0xD0B8}, - {0xF909, 0xD0D0},{0xF90A, 0xD0DD},{0xF90B, 0xD1D4},{0xF90C, 0xD1D5},{0xF90D, 0xD1D8},{0xF90E, 0xD1DB},{0xF90F, 0xD1DC},{0xF910, 0xD1DD}, - {0xF911, 0xD1DE},{0xF912, 0xD1DF},{0xF913, 0xD1E0},{0xF914, 0xD1E2},{0xF915, 0xD1E3},{0xF916, 0xD1E4},{0xF917, 0xD1E5},{0xF918, 0xD1E6}, - {0xF919, 0xD1E8},{0xF91A, 0xD1E9},{0xF91B, 0xD1EA},{0xF91C, 0xD1EB},{0xF91D, 0xD1ED},{0xF91E, 0xD1EF},{0xF91F, 0xD1F0},{0xF920, 0xD1F2}, - {0xF921, 0xD1F6},{0xF922, 0xD1FA},{0xF923, 0xD1FC},{0xF924, 0xD1FD},{0xF925, 0xD1FE},{0xF926, 0xD2A2},{0xF927, 0xD2A3},{0xF928, 0xD2A7}, - {0xF929, 0xD2A8},{0xF92A, 0xD2A9},{0xF92B, 0xD2AA},{0xF92C, 0xD2AB},{0xF92D, 0xD2AD},{0xF92E, 0xD2B2},{0xF92F, 0xD2BE},{0xF930, 0xD2C2}, - {0xF931, 0xD2C3},{0xF932, 0xD2C4},{0xF933, 0xD2C6},{0xF934, 0xD2C7},{0xF935, 0xD2C8},{0xF936, 0xD2C9},{0xF937, 0xD2CA},{0xF938, 0xD2CB}, - {0xF939, 0xD2CD},{0xF93A, 0xD2CE},{0xF93B, 0xD2CF},{0xF93C, 0xD2D0},{0xF93D, 0xD2D1},{0xF93E, 0xD2D2},{0xF93F, 0xD2D3},{0xF940, 0xD2D4}, - {0xF941, 0xD2D5},{0xF942, 0xD2D6},{0xF943, 0xD2D7},{0xF944, 0xD2D9},{0xF945, 0xD2DA},{0xF946, 0xD2DE},{0xF947, 0xD2DF},{0xF948, 0xD2E1}, - {0xF949, 0xD2E2},{0xF94A, 0xD2E4},{0xF94B, 0xD2E5},{0xF94C, 0xD2E6},{0xF94D, 0xD2E7},{0xF94E, 0xD2E8},{0xF94F, 0xD2E9},{0xF950, 0xD2EA}, - {0xF951, 0xD2EB},{0xF952, 0xD2F0},{0xF953, 0xD2F1},{0xF954, 0xD2F2},{0xF955, 0xD2F3},{0xF956, 0xD2F4},{0xF957, 0xD2F5},{0xF958, 0xD2F7}, - {0xF959, 0xD2F8},{0xF95A, 0xD4E6},{0xF95B, 0xD4FC},{0xF95C, 0xD5A5},{0xF95D, 0xD5AB},{0xF95E, 0xD5AE},{0xF95F, 0xD6B8},{0xF960, 0xD6CD}, - {0xF961, 0xD7CB},{0xF962, 0xD7E4},{0xF963, 0xDBC5},{0xF964, 0xDBE4},{0xF965, 0xDCA5},{0xF966, 0xDDA5},{0xF967, 0xDDD5},{0xF968, 0xDDF4}, - {0xF969, 0xDEFC},{0xF96A, 0xDEFE},{0xF96B, 0xDFB3},{0xF96C, 0xDFE1},{0xF96D, 0xDFE8},{0xF96E, 0xE0F1},{0xF96F, 0xE1AD},{0xF970, 0xE1ED}, - {0xF971, 0xE3F5},{0xF972, 0xE4A1},{0xF973, 0xE4A9},{0xF974, 0xE5AE},{0xF975, 0xE5B1},{0xF976, 0xE5B2},{0xF977, 0xE5B9},{0xF978, 0xE5BB}, - {0xF979, 0xE5BC},{0xF97A, 0xE5C4},{0xF97B, 0xE5CE},{0xF97C, 0xE5D0},{0xF97D, 0xE5D2},{0xF97E, 0xE5D6},{0xF97F, 0xE5FA},{0xF980, 0xE5FB}, - {0xF981, 0xE5FC},{0xF982, 0xE5FE},{0xF983, 0xE6A1},{0xF984, 0xE6A4},{0xF985, 0xE6A7},{0xF986, 0xE6AD},{0xF987, 0xE6AF},{0xF988, 0xE6B0}, - {0xF989, 0xE6B1},{0xF98A, 0xE6B3},{0xF98B, 0xE6B7},{0xF98C, 0xE6B8},{0xF98D, 0xE6BC},{0xF98E, 0xE6C4},{0xF98F, 0xE6C6},{0xF990, 0xE6C7}, - {0xF991, 0xE6CA},{0xF992, 0xE6D2},{0xF993, 0xE6D6},{0xF994, 0xE6D9},{0xF995, 0xE6DC},{0xF996, 0xE6DF},{0xF997, 0xE6E1},{0xF998, 0xE6E4}, - {0xF999, 0xE6E5},{0xF99A, 0xE6E6},{0xF99B, 0xE6E8},{0xF99C, 0xE6EA},{0xF99D, 0xE6EB},{0xF99E, 0xE6EC},{0xF99F, 0xE6EF},{0xF9A0, 0xE6F1}, - {0xF9A1, 0xE6F2},{0xF9A2, 0xE6F5},{0xF9A3, 0xE6F6},{0xF9A4, 0xE6F7},{0xF9A5, 0xE6F9},{0xF9A6, 0xE7A1},{0xF9A7, 0xE7A6},{0xF9A8, 0xE7A9}, - {0xF9A9, 0xE7AA},{0xF9AA, 0xE7AC},{0xF9AB, 0xE7AD},{0xF9AC, 0xE7B0},{0xF9AD, 0xE7BF},{0xF9AE, 0xE7C1},{0xF9AF, 0xE7C6},{0xF9B0, 0xE7C7}, - {0xF9B1, 0xE7CB},{0xF9B2, 0xE7CD},{0xF9B3, 0xE7CF},{0xF9B4, 0xE7D0},{0xF9B5, 0xE7D3},{0xF9B6, 0xE7DF},{0xF9B7, 0xE7E4},{0xF9B8, 0xE7E6}, - {0xF9B9, 0xE7F7},{0xF9BA, 0xE8E7},{0xF9BB, 0xE8E8},{0xF9BC, 0xE8F0},{0xF9BD, 0xE8F1},{0xF9BE, 0xE8F7},{0xF9BF, 0xE8F9},{0xF9C0, 0xE8FB}, - {0xF9C1, 0xE8FE},{0xF9C2, 0xE9A7},{0xF9C3, 0xE9AC},{0xF9C4, 0xE9CC},{0xF9C5, 0xE9F7},{0xF9C6, 0xEAC1},{0xF9C7, 0xEAE5},{0xF9C8, 0xEAF4}, - {0xF9C9, 0xEAF7},{0xF9CA, 0xEAFC},{0xF9CB, 0xEAFE},{0xF9CC, 0xEBA4},{0xF9CD, 0xEBA7},{0xF9CE, 0xEBA9},{0xF9CF, 0xEBAA},{0xF9D0, 0xEBBA}, - {0xF9D1, 0xEBBB},{0xF9D2, 0xEBBD},{0xF9D3, 0xEBC1},{0xF9D4, 0xEBC2},{0xF9D5, 0xEBC6},{0xF9D6, 0xEBC7},{0xF9D7, 0xEBCC},{0xF9D8, 0xEBCF}, - {0xF9D9, 0xEBD0},{0xF9DA, 0xEBD1},{0xF9DB, 0xEBD2},{0xF9DC, 0xEBD8},{0xF9DD, 0xECA6},{0xF9DE, 0xECA7},{0xF9DF, 0xECAA},{0xF9E0, 0xECAF}, - {0xF9E1, 0xECB0},{0xF9E2, 0xECB1},{0xF9E3, 0xECB2},{0xF9E4, 0xECB5},{0xF9E5, 0xECB8},{0xF9E6, 0xECBA},{0xF9E7, 0xECC0},{0xF9E8, 0xECC1}, - {0xF9E9, 0xECC5},{0xF9EA, 0xECC6},{0xF9EB, 0xECC9},{0xF9EC, 0xECCA},{0xF9ED, 0xECD5},{0xF9EE, 0xECDD},{0xF9EF, 0xECDE},{0xF9F0, 0xECE1}, - {0xF9F1, 0xECE4},{0xF9F2, 0xECE7},{0xF9F3, 0xECE8},{0xF9F4, 0xECF7},{0xF9F5, 0xECF8},{0xF9F6, 0xECFA},{0xF9F7, 0xEDA1},{0xF9F8, 0xEDA2}, - {0xF9F9, 0xEDA3},{0xF9FA, 0xEDEE},{0xF9FB, 0xEEDB},{0xF9FC, 0xF2BD},{0xF9FD, 0xF2FA},{0xF9FE, 0xF3B1},{0xF9FF, 0xF4A7},{0xFA00, 0xF4EE}, - {0xFA01, 0xF6F4},{0xFA02, 0xF6F6},{0xFA03, 0xF7B8},{0xFA04, 0xF7C8},{0xFA05, 0xF7D3},{0xFA06, 0xF8DB},{0xFA07, 0xF8F0},{0xFA08, 0xFAA1}, - {0xFA09, 0xFAA2},{0xFA0A, 0xFAE6},{0xFA0B, 0xFCA9},{0xFF01, 0xA3A1},{0xFF02, 0xA3A2},{0xFF03, 0xA3A3},{0xFF04, 0xA3A4},{0xFF05, 0xA3A5}, - {0xFF06, 0xA3A6},{0xFF07, 0xA3A7},{0xFF08, 0xA3A8},{0xFF09, 0xA3A9},{0xFF0A, 0xA3AA},{0xFF0B, 0xA3AB},{0xFF0C, 0xA3AC},{0xFF0D, 0xA3AD}, - {0xFF0E, 0xA3AE},{0xFF0F, 0xA3AF},{0xFF10, 0xA3B0},{0xFF11, 0xA3B1},{0xFF12, 0xA3B2},{0xFF13, 0xA3B3},{0xFF14, 0xA3B4},{0xFF15, 0xA3B5}, - {0xFF16, 0xA3B6},{0xFF17, 0xA3B7},{0xFF18, 0xA3B8},{0xFF19, 0xA3B9},{0xFF1A, 0xA3BA},{0xFF1B, 0xA3BB},{0xFF1C, 0xA3BC},{0xFF1D, 0xA3BD}, - {0xFF1E, 0xA3BE},{0xFF1F, 0xA3BF},{0xFF20, 0xA3C0},{0xFF21, 0xA3C1},{0xFF22, 0xA3C2},{0xFF23, 0xA3C3},{0xFF24, 0xA3C4},{0xFF25, 0xA3C5}, - {0xFF26, 0xA3C6},{0xFF27, 0xA3C7},{0xFF28, 0xA3C8},{0xFF29, 0xA3C9},{0xFF2A, 0xA3CA},{0xFF2B, 0xA3CB},{0xFF2C, 0xA3CC},{0xFF2D, 0xA3CD}, - {0xFF2E, 0xA3CE},{0xFF2F, 0xA3CF},{0xFF30, 0xA3D0},{0xFF31, 0xA3D1},{0xFF32, 0xA3D2},{0xFF33, 0xA3D3},{0xFF34, 0xA3D4},{0xFF35, 0xA3D5}, - {0xFF36, 0xA3D6},{0xFF37, 0xA3D7},{0xFF38, 0xA3D8},{0xFF39, 0xA3D9},{0xFF3A, 0xA3DA},{0xFF3B, 0xA3DB},{0xFF3C, 0xA1AC},{0xFF3D, 0xA3DD}, - {0xFF3E, 0xA3DE},{0xFF3F, 0xA3DF},{0xFF40, 0xA3E0},{0xFF41, 0xA3E1},{0xFF42, 0xA3E2},{0xFF43, 0xA3E3},{0xFF44, 0xA3E4},{0xFF45, 0xA3E5}, - {0xFF46, 0xA3E6},{0xFF47, 0xA3E7},{0xFF48, 0xA3E8},{0xFF49, 0xA3E9},{0xFF4A, 0xA3EA},{0xFF4B, 0xA3EB},{0xFF4C, 0xA3EC},{0xFF4D, 0xA3ED}, - {0xFF4E, 0xA3EE},{0xFF4F, 0xA3EF},{0xFF50, 0xA3F0},{0xFF51, 0xA3F1},{0xFF52, 0xA3F2},{0xFF53, 0xA3F3},{0xFF54, 0xA3F4},{0xFF55, 0xA3F5}, - {0xFF56, 0xA3F6},{0xFF57, 0xA3F7},{0xFF58, 0xA3F8},{0xFF59, 0xA3F9},{0xFF5A, 0xA3FA},{0xFF5B, 0xA3FB},{0xFF5C, 0xA3FC},{0xFF5D, 0xA3FD}, - {0xFF5E, 0xA2A6},{0xFFE0, 0xA1CB},{0xFFE1, 0xA1CC},{0xFFE2, 0xA1FE},{0xFFE3, 0xA3FE},{0xFFE5, 0xA1CD},{0xFFE6, 0xA3DC} -}; diff --git a/vcl/source/fontsubset/xlat.cxx b/vcl/source/fontsubset/xlat.cxx index 27b2f517f4a1..c4699ec5a81a 100644 --- a/vcl/source/fontsubset/xlat.cxx +++ b/vcl/source/fontsubset/xlat.cxx @@ -25,163 +25,196 @@ * ************************************************************************/ -/* - * - * Data translation from Unicode to MS encodings - * If the host system provides this functionality - * this file should be rewritten to use it and - * the large translation arrays should be removed - * - * Author: Alexander Gelfenbain - * - */ +#include "rtl/textcvt.h" +#include + +namespace { // anonymous namespace + +// ==================================================================== + +#define MAX_CVT_SELECT 6 + +class ConverterCache +{ +public: + explicit ConverterCache( void ); + ~ConverterCache( void ); + sal_uInt16 convertOne( int nSelect, sal_Unicode ); + void convertStr( int nSelect, const sal_Unicode* pSrc, sal_uInt16* pDst, int nCount ); +protected: + void ensureConverter( int nSelect ); +private: + rtl_UnicodeToTextConverter maConverterCache[ MAX_CVT_SELECT+1 ]; + rtl_UnicodeToTextContext maContexts[ MAX_CVT_SELECT+1 ]; +}; + +// ==================================================================== + +ConverterCache::ConverterCache( void) +{ + for( int i = 0; i <= MAX_CVT_SELECT; ++i) + { + maConverterCache[i] = NULL; + maContexts[i] = NULL; + } +} + +// -------------------------------------------------------------------- + +ConverterCache::~ConverterCache( void) +{ + for( int i = 0; i <= MAX_CVT_SELECT; ++i) + { + if( !maContexts[i] ) + continue; + rtl_destroyUnicodeToTextContext( maConverterCache[i], maContexts[i] ); + rtl_destroyUnicodeToTextConverter( maConverterCache[i] ); + } +} + +// -------------------------------------------------------------------- + +void ConverterCache::ensureConverter( int nSelect ) +{ + // DBG_ASSERT( (2<=nSelect) && (nSelect<=MAX_CVT_SELECT)), "invalid XLAT.Converter requested" ); + rtl_UnicodeToTextContext aContext = maContexts[ nSelect ]; + if( !aContext ) + { + rtl_TextEncoding eRecodeFrom = RTL_TEXTENCODING_UNICODE; + switch( nSelect ) + { + default: nSelect = 1; // fall through to unicode recoding + case 1: eRecodeFrom = RTL_TEXTENCODING_UNICODE; break; + case 2: eRecodeFrom = RTL_TEXTENCODING_SHIFT_JIS; break; + case 3: eRecodeFrom = RTL_TEXTENCODING_GB_2312; break; + case 4: eRecodeFrom = RTL_TEXTENCODING_BIG5; break; + case 5: eRecodeFrom = RTL_TEXTENCODING_MS_949; break; + case 6: eRecodeFrom = RTL_TEXTENCODING_MS_1361; break; + } + rtl_UnicodeToTextConverter aRecodeConverter = rtl_createUnicodeToTextConverter( eRecodeFrom ); + maConverterCache[ nSelect ] = aRecodeConverter; + + aContext = rtl_createUnicodeToTextContext( aRecodeConverter ); + maContexts[ nSelect ] = aContext; + } + + rtl_resetUnicodeToTextContext( maConverterCache[ nSelect ], aContext ); +} + +// -------------------------------------------------------------------- + +sal_uInt16 ConverterCache::convertOne( int nSelect, sal_Unicode aChar ) +{ + ensureConverter( nSelect ); + + sal_Unicode aUCS2Char = aChar; + sal_Char aTempArray[8]; + sal_Size nTempSize; + sal_uInt32 nCvtInfo; + + // TODO: use direct unicode->mbcs converter should there ever be one + int nCodeLen = rtl_convertUnicodeToText( + maConverterCache[ nSelect ], maContexts[ nSelect ], + &aUCS2Char, 1, aTempArray, sizeof(aTempArray), + RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0 + | RTL_UNICODETOTEXT_FLAGS_INVALID_0, + &nCvtInfo, &nTempSize ); + + sal_uInt16 aCode = aTempArray[0]; + for( int i = 1; i < nCodeLen; ++i ) + aCode = (aCode << 8) + (aTempArray[i] & 0xFF); + return aCode; +} + +// -------------------------------------------------------------------- + +void ConverterCache::convertStr( int nSelect, const sal_Unicode* pSrc, sal_uInt16* pDst, int nCount ) +{ + ensureConverter( nSelect ); + + for( int n = 0; n < nCount; ++n ) + { + sal_Unicode aUCS2Char = pSrc[n]; + + sal_Char aTempArray[8]; + sal_Size nTempSize; + sal_uInt32 nCvtInfo; + + // assume that non-unicode-fonts do not support codepoints >U+FFFF + // TODO: use direct unicode->mbcs converter should there ever be one + int nCodeLen = rtl_convertUnicodeToText( + maConverterCache[ nSelect ], maContexts[ nSelect ], + &aUCS2Char, 1, aTempArray, sizeof(aTempArray), + RTL_UNICODETOTEXT_FLAGS_UNDEFINED_0 + | RTL_UNICODETOTEXT_FLAGS_INVALID_0, + &nCvtInfo, &nTempSize ); + + sal_uInt16 aCode = aTempArray[0]; + for( int i = 1; i < nCodeLen; ++i ) + aCode = (aCode << 8) + (aTempArray[i] & 0xFF); + pDst[n] = aCode; + } +} + +} // anonymous namespace + +// ==================================================================== #include "xlat.hxx" namespace vcl { -// TODO: use generic encoding converters and get rid of the include files below -#include "u2big5.inc" -#include "u2johab.inc" -#include "u2prc.inc" -#include "u2shiftjis.inc" -#include "u2wansung.inc" - -#define MISSING_CODE 0 - -static sal_uInt16 xlat(sal_uInt16pair p[], sal_uInt32 n, sal_uInt16 src) -{ - int l = 0, r = n - 1, i; - sal_uInt16 t, res = MISSING_CODE; - - do { - i = (l + r) >> 1; - t = p[i].s; - if (src >= t) l = i + 1; - if (src <= t) r = i - 1; - } while (l <= r); - - if (l - r == 2) { - res = p[l-1].d; - } - - return res; -} +static ConverterCache aCC; sal_uInt16 TranslateChar12(sal_uInt16 src) { - return xlat(xlat_1_2, sizeof(xlat_1_2) / sizeof(xlat_1_2[0]), src); + return aCC.convertOne( 2, src); } sal_uInt16 TranslateChar13(sal_uInt16 src) { - return xlat(xlat_1_3, sizeof(xlat_1_3) / sizeof(xlat_1_3[0]), src); + return aCC.convertOne( 3, src); } sal_uInt16 TranslateChar14(sal_uInt16 src) { - return xlat(xlat_1_4, sizeof(xlat_1_4) / sizeof(xlat_1_4[0]), src); + return aCC.convertOne( 4, src); } sal_uInt16 TranslateChar15(sal_uInt16 src) { - return xlat(xlat_1_5, sizeof(xlat_1_5) / sizeof(xlat_1_5[0]), src); + return aCC.convertOne( 5, src); } sal_uInt16 TranslateChar16(sal_uInt16 src) { - return xlat(xlat_1_6, sizeof(xlat_1_6) / sizeof(xlat_1_5[0]), src); + return aCC.convertOne( 6, src); } void TranslateString12(sal_uInt16 *src, sal_uInt16 *dst, sal_uInt32 n) { - sal_uInt32 i; - sal_uInt16 lastS, lastD; - - if (n == 0) return; - - lastD = dst[0] = xlat(xlat_1_2, sizeof(xlat_1_2) / sizeof(xlat_1_2[0]), lastS = src[0]); - - for (i=1; i < n; i++) { - if (src[i] == lastS) { - dst[i] = lastD; - } else { - lastD = dst[i] = xlat(xlat_1_2, sizeof(xlat_1_2) / sizeof(xlat_1_2[0]), lastS = src[i]); - } - } + aCC.convertStr( 2, src, dst, n); } void TranslateString13(sal_uInt16 *src, sal_uInt16 *dst, sal_uInt32 n) { - sal_uInt32 i; - sal_uInt16 lastS, lastD; - - if (n == 0) return; - - lastD = dst[0] = xlat(xlat_1_3, sizeof(xlat_1_3) / sizeof(xlat_1_3[0]), lastS = src[0]); - - for (i=1; i < n; i++) { - if (src[i] == lastS) { - dst[i] = lastD; - } else { - lastD = dst[i] = xlat(xlat_1_3, sizeof(xlat_1_3) / sizeof(xlat_1_3[0]), lastS = src[i]); - } - } + aCC.convertStr( 3, src, dst, n); } void TranslateString14(sal_uInt16 *src, sal_uInt16 *dst, sal_uInt32 n) { - sal_uInt32 i; - sal_uInt16 lastS, lastD; - - if (n == 0) return; - - lastD = dst[0] = xlat(xlat_1_4, sizeof(xlat_1_4) / sizeof(xlat_1_4[0]), lastS = src[0]); - - for (i=1; i < n; i++) { - if (src[i] == lastS) { - dst[i] = lastD; - } else { - lastD = dst[i] = xlat(xlat_1_4, sizeof(xlat_1_4) / sizeof(xlat_1_4[0]), lastS = src[i]); - } - } + aCC.convertStr( 4, src, dst, n); } void TranslateString15(sal_uInt16 *src, sal_uInt16 *dst, sal_uInt32 n) { - sal_uInt32 i; - sal_uInt16 lastS, lastD; - - if (n == 0) return; - - lastD = dst[0] = xlat(xlat_1_5, sizeof(xlat_1_5) / sizeof(xlat_1_5[0]), lastS = src[0]); - - for (i=1; i < n; i++) { - if (src[i] == lastS) { - dst[i] = lastD; - } else { - lastD = dst[i] = xlat(xlat_1_5, sizeof(xlat_1_5) / sizeof(xlat_1_5[0]), lastS = src[i]); - } - } + aCC.convertStr( 5, src, dst, n); } void TranslateString16(sal_uInt16 *src, sal_uInt16 *dst, sal_uInt32 n) { - sal_uInt32 i; - sal_uInt16 lastS, lastD; - - if (n == 0) return; - - lastD = dst[0] = xlat(xlat_1_6, sizeof(xlat_1_6) / sizeof(xlat_1_6[0]), lastS = src[0]); - - for (i=1; i < n; i++) { - if (src[i] == lastS) { - dst[i] = lastD; - } else { - lastD = dst[i] = xlat(xlat_1_6, sizeof(xlat_1_6) / sizeof(xlat_1_6[0]), lastS = src[i]); - } - } + aCC.convertStr( 6, src, dst, n); } } // namespace vcl diff --git a/vcl/source/fontsubset/xlat.hxx b/vcl/source/fontsubset/xlat.hxx index c3bd076f6fbd..2e6d1721776b 100644 --- a/vcl/source/fontsubset/xlat.hxx +++ b/vcl/source/fontsubset/xlat.hxx @@ -31,7 +31,7 @@ #ifndef __XLAT_H #define __XLAT_H -#include "sft.hxx" +//####include "sft.hxx" namespace vcl { diff --git a/vcl/source/gdi/base14.cxx b/vcl/source/gdi/base14.cxx index 17e616d196b4..56d1c3ff5eba 100644 --- a/vcl/source/gdi/base14.cxx +++ b/vcl/source/gdi/base14.cxx @@ -601,7 +601,7 @@ const PDFWriterImpl::BuiltinFont PDFWriterImpl::m_aBuiltinFonts[ 14 ] = { "Symbol", // PSName 1010, -293, // ascend, descend FAMILY_DONTKNOW, // family style - RTL_TEXTENCODING_SYMBOL, // charset + RTL_TEXTENCODING_ADOBE_SYMBOL, // charset PITCH_VARIABLE, // pitch WIDTH_NORMAL, // width type WEIGHT_NORMAL, // weight type diff --git a/vcl/source/gdi/bitmapex.cxx b/vcl/source/gdi/bitmapex.cxx index cfcac8851089..4e2ed20a7966 100644 --- a/vcl/source/gdi/bitmapex.cxx +++ b/vcl/source/gdi/bitmapex.cxx @@ -47,6 +47,7 @@ #include #endif #include +#include // ------------ // - BitmapEx - @@ -761,6 +762,78 @@ void BitmapEx::Draw( OutputDevice* pOutDev, // ------------------------------------------------------------------ +sal_uInt8 BitmapEx::GetTransparency(sal_Int32 nX, sal_Int32 nY) const +{ + sal_uInt8 nTransparency(0xff); + + if(!aBitmap.IsEmpty()) + { + if(nX >= 0 && nX < aBitmapSize.Width() && nY >= 0 && nY < aBitmapSize.Height()) + { + switch(eTransparent) + { + case TRANSPARENT_NONE: + { + // not transparent, ergo all covered + nTransparency = 0x00; + break; + } + case TRANSPARENT_COLOR: + { + Bitmap aTestBitmap(aBitmap); + BitmapReadAccess* pRead = aTestBitmap.AcquireReadAccess(); + + if(pRead) + { + const Color aColor = pRead->GetColor(nY, nX); + + // if color is not equal to TransparentColor, we are not transparent + if(aColor != aTransparentColor) + { + nTransparency = 0x00; + } + + aTestBitmap.ReleaseAccess(pRead); + } + break; + } + case TRANSPARENT_BITMAP: + { + if(!aMask.IsEmpty()) + { + Bitmap aTestBitmap(aMask); + BitmapReadAccess* pRead = aTestBitmap.AcquireReadAccess(); + + if(pRead) + { + const BitmapColor aBitmapColor(pRead->GetPixel(nY, nX)); + + if(bAlpha) + { + nTransparency = aBitmapColor.GetIndex(); + } + else + { + if(0x00 != aBitmapColor.GetIndex()) + { + nTransparency = 0x00; + } + } + + aTestBitmap.ReleaseAccess(pRead); + } + } + break; + } + } + } + } + + return nTransparency; +} + +// ------------------------------------------------------------------ + SvStream& operator<<( SvStream& rOStm, const BitmapEx& rBitmapEx ) { rBitmapEx.aBitmap.Write( rOStm ); diff --git a/vcl/source/gdi/configsettings.cxx b/vcl/source/gdi/configsettings.cxx new file mode 100644 index 000000000000..b601caef301a --- /dev/null +++ b/vcl/source/gdi/configsettings.cxx @@ -0,0 +1,205 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#include +#include +#include +#include +#include + +using namespace rtl; +using namespace utl; +using namespace vcl; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::beans; +using namespace com::sun::star::container; + +#define SETTINGS_CONFIGNODE "VCL/Settings" + +/* + * SettingsConfigItem::get + */ + +SettingsConfigItem* SettingsConfigItem::get() +{ + ImplSVData* pSVData = ImplGetSVData(); + if( ! pSVData->mpSettingsConfigItem ) + pSVData->mpSettingsConfigItem = new SettingsConfigItem(); + return pSVData->mpSettingsConfigItem; +} + +/* + * SettignsConfigItem constructor + */ + +SettingsConfigItem::SettingsConfigItem() + : + ConfigItem( OUString( RTL_CONSTASCII_USTRINGPARAM( SETTINGS_CONFIGNODE ) ), + CONFIG_MODE_DELAYED_UPDATE ), + m_aSettings( 0 ) +{ + getValues(); +} + +/* + * SettingsConfigItem destructor + */ + +SettingsConfigItem::~SettingsConfigItem() +{ + if( IsModified() ) + Commit(); +} + +/* + * SettingsConfigItem::Commit + */ + +void SettingsConfigItem::Commit() +{ + if( ! IsValidConfigMgr() ) + return; + + std::hash_map< OUString, SmallOUStrMap, rtl::OUStringHash >::const_iterator group; + + for( group = m_aSettings.begin(); group != m_aSettings.end(); ++group ) + { + String aKeyName( group->first ); + /*sal_Bool bAdded =*/ AddNode( OUString(), aKeyName ); + Sequence< PropertyValue > aValues( group->second.size() ); + PropertyValue* pValues = aValues.getArray(); + int nIndex = 0; + SmallOUStrMap::const_iterator it; + for( it = group->second.begin(); it != group->second.end(); ++it ) + { + String aName( aKeyName ); + aName.Append( '/' ); + aName.Append( String( it->first ) ); + pValues[nIndex].Name = aName; + pValues[nIndex].Handle = 0; + pValues[nIndex].Value <<= it->second; + pValues[nIndex].State = PropertyState_DIRECT_VALUE; + nIndex++; + } + ReplaceSetProperties( aKeyName, aValues ); + } +} + +/* + * SettingsConfigItem::Notify + */ + +void SettingsConfigItem::Notify( const Sequence< OUString >& ) +{ + getValues(); +} + +/* + * SettingsConfigItem::getValues + */ +void SettingsConfigItem::getValues() +{ + if( ! IsValidConfigMgr() ) + return; + + m_aSettings.clear(); + + Sequence< OUString > aNames( GetNodeNames( OUString() ) ); + m_aSettings.resize( aNames.getLength() ); + + for( int j = 0; j < aNames.getLength(); j++ ) + { +#if OSL_DEBUG_LEVEL > 2 + fprintf( stderr, "found settings data for \"%s\"\n", + OUStringToOString( aNames.getConstArray()[j], RTL_TEXTENCODING_ASCII_US ).getStr() + ); +#endif + String aKeyName( aNames.getConstArray()[j] ); + Sequence< OUString > aKeys( GetNodeNames( aKeyName ) ); + Sequence< OUString > aSettingsKeys( aKeys.getLength() ); + const OUString* pFrom = aKeys.getConstArray(); + OUString* pTo = aSettingsKeys.getArray(); + for( int m = 0; m < aKeys.getLength(); m++ ) + { + String aName( aKeyName ); + aName.Append( '/' ); + aName.Append( String( pFrom[m] ) ); + pTo[m] = aName; + } + Sequence< Any > aValues( GetProperties( aSettingsKeys ) ); + const Any* pValue = aValues.getConstArray(); + for( int i = 0; i < aValues.getLength(); i++, pValue++ ) + { + if( pValue->getValueTypeClass() == TypeClass_STRING ) + { + const OUString* pLine = (const OUString*)pValue->getValue(); + if( pLine->getLength() ) + m_aSettings[ aKeyName ][ pFrom[i] ] = *pLine; +#if OSL_DEBUG_LEVEL > 2 + fprintf( stderr, " \"%s\"=\"%.30s\"\n", + OUStringToOString( aKeys.getConstArray()[i], RTL_TEXTENCODING_ASCII_US ).getStr(), + OUStringToOString( *pLine, RTL_TEXTENCODING_ASCII_US ).getStr() + ); +#endif + } + } + } +} + +/* + * SettingsConfigItem::getDefaultFont + */ + +const OUString& SettingsConfigItem::getValue( const OUString& rGroup, const OUString& rKey ) const +{ + ::std::hash_map< OUString, SmallOUStrMap, rtl::OUStringHash >::const_iterator group = m_aSettings.find( rGroup ); + if( group == m_aSettings.end() || group->second.find( rKey ) == group->second.end() ) + { + static OUString aEmpty; + return aEmpty; + } + return group->second.find(rKey)->second; +} + +/* + * SettingsConfigItem::setDefaultFont + */ + +void SettingsConfigItem::setValue( const OUString& rGroup, const OUString& rKey, const OUString& rValue ) +{ + bool bModified = m_aSettings[ rGroup ][ rKey ] != rValue; + if( bModified ) + { + m_aSettings[ rGroup ][ rKey ] = rValue; + SetModified(); + } +} + diff --git a/vcl/source/gdi/cvtsvm.cxx b/vcl/source/gdi/cvtsvm.cxx index c1c02b673658..4ecb89ec5a8e 100644 --- a/vcl/source/gdi/cvtsvm.cxx +++ b/vcl/source/gdi/cvtsvm.cxx @@ -90,12 +90,17 @@ void ImplReadPoly( SvStream& rIStm, Polygon& rPoly ) void ImplWritePoly( SvStream& rOStm, const Polygon& rPoly ) { - INT32 nSize = rPoly.GetSize(); + // #i102224# Here the evtl. curved nature of Polygon was + // ignored (for all those Years). Adapted to at least write + // a polygon representing the curve as good as possible + Polygon aSimplePoly; + rPoly.AdaptiveSubdivide(aSimplePoly); + INT32 nSize = aSimplePoly.GetSize(); rOStm << nSize; for( INT32 i = 0; i < nSize; i++ ) - rOStm << rPoly[ (USHORT) i ]; + rOStm << aSimplePoly[ (USHORT) i ]; } // ------------------------------------------------------------------------ @@ -131,13 +136,18 @@ void ImplWritePolyPolyAction( SvStream& rOStm, const PolyPolygon& rPolyPoly ) for( n = 0; n < nPoly; n++ ) { + // #i102224# Here the evtl. curved nature of Polygon was + // ignored (for all those Years). Adapted to at least write + // a polygon representing the curve as good as possible const Polygon& rPoly = rPolyPoly[ n ]; - const USHORT nSize = rPoly.GetSize(); + Polygon aSimplePoly; + rPoly.AdaptiveSubdivide(aSimplePoly); + const USHORT nSize = aSimplePoly.GetSize(); rOStm << (INT32) nSize; for( USHORT j = 0; j < nSize; j++ ) - rOStm << rPoly[ j ]; + rOStm << aSimplePoly[ j ]; } } @@ -1354,8 +1364,15 @@ ULONG SVMConverter::ImplWriteActions( SvStream& rOStm, GDIMetaFile& rMtf, { MetaPolyLineAction* pAct = (MetaPolyLineAction*) pAction; const Polygon& rPoly = pAct->GetPolygon(); + + // #i102224# Here the evtl. curved nature of Polygon was + // ignored (for all those Years). Adapted to at least write + // a polygon representing the curve as good as possible + Polygon aSimplePoly; + rPoly.AdaptiveSubdivide(aSimplePoly); + const LineInfo& rInfo = pAct->GetLineInfo(); - const USHORT nPoints = rPoly.GetSize(); + const USHORT nPoints = aSimplePoly.GetSize(); const BOOL bFatLine = ( !rInfo.IsDefault() && ( LINE_NONE != rInfo.GetStyle() ) ); if( bFatLine ) @@ -1369,7 +1386,7 @@ ULONG SVMConverter::ImplWriteActions( SvStream& rOStm, GDIMetaFile& rMtf, rOStm << (INT32) nPoints; for( USHORT n = 0; n < nPoints; n++ ) - rOStm << rPoly[ n ]; + rOStm << aSimplePoly[ n ]; nCount++; @@ -1385,14 +1402,21 @@ ULONG SVMConverter::ImplWriteActions( SvStream& rOStm, GDIMetaFile& rMtf, { MetaPolygonAction* pAct = (MetaPolygonAction*) pAction; const Polygon& rPoly = pAct->GetPolygon(); - const USHORT nPoints = rPoly.GetSize(); + + // #i102224# Here the evtl. curved nature of Polygon was + // ignored (for all those Years). Adapted to at least write + // a polygon representing the curve as good as possible + Polygon aSimplePoly; + rPoly.AdaptiveSubdivide(aSimplePoly); + + const USHORT nPoints = aSimplePoly.GetSize(); rOStm << (INT16) GDI_POLYGON_ACTION; rOStm << (INT32) ( 8 + ( nPoints << 3 ) ); rOStm << (INT32) nPoints; for( USHORT n = 0; n < nPoints; n++ ) - rOStm << rPoly[ n ]; + rOStm << aSimplePoly[ n ]; nCount++; } diff --git a/vcl/source/gdi/font.cxx b/vcl/source/gdi/font.cxx index 3bbdba5dad5f..afd6181351b4 100644 --- a/vcl/source/gdi/font.cxx +++ b/vcl/source/gdi/font.cxx @@ -38,8 +38,8 @@ #include "tools/debug.hxx" #include "vcl/font.hxx" #include "vcl/impfont.hxx" -#include "vcl/fontcfg.hxx" -#include "vcl/outdev.h" // just for ImplGetEnglishSearchFontName! TODO: move it +#include "vcl/outfont.hxx" +#include "unotools/fontcfg.hxx" #include @@ -169,7 +169,7 @@ void Impl_Font::AskConfig() mbConfigLookup = true; // prepare the FontSubst configuration lookup - const vcl::FontSubstConfiguration* pFontSubst = vcl::FontSubstConfiguration::get(); + const utl::FontSubstConfiguration* pFontSubst = utl::FontSubstConfiguration::get(); String aShortName; String aFamilyName; @@ -177,12 +177,12 @@ void Impl_Font::AskConfig() FontWeight eWeight = WEIGHT_DONTKNOW; FontWidth eWidthType = WIDTH_DONTKNOW; String aMapName = maFamilyName; - ImplGetEnglishSearchFontName( aMapName ); - vcl::FontSubstConfiguration::getMapName( aMapName, + GetEnglishSearchFontName( aMapName ); + utl::FontSubstConfiguration::getMapName( aMapName, aShortName, aFamilyName, eWeight, eWidthType, nType ); // lookup the font name in the configuration - const vcl::FontNameAttr* pFontAttr = pFontSubst->getSubstInfo( aMapName ); + const utl::FontNameAttr* pFontAttr = pFontSubst->getSubstInfo( aMapName ); // if the direct lookup failed try again with an alias name if ( !pFontAttr && (aShortName != aMapName) ) diff --git a/vcl/source/gdi/gdimtf.cxx b/vcl/source/gdi/gdimtf.cxx index 3a29e6d56095..6483c8292df7 100644 --- a/vcl/source/gdi/gdimtf.cxx +++ b/vcl/source/gdi/gdimtf.cxx @@ -1403,6 +1403,436 @@ void GDIMetaFile::Rotate( long nAngle10 ) // ------------------------------------------------------------------------ +static void ImplActionBounds( Rectangle& o_rOutBounds, + const Rectangle& i_rInBounds, + const std::vector& i_rClipStack ) +{ + Rectangle aBounds( i_rInBounds ); + if( ! i_rInBounds.IsEmpty() && ! i_rClipStack.empty() && ! i_rClipStack.back().IsEmpty() ) + aBounds.Intersection( i_rClipStack.back() ); + if( ! aBounds.IsEmpty() ) + { + if( ! o_rOutBounds.IsEmpty() ) + o_rOutBounds.Union( aBounds ); + else + o_rOutBounds = aBounds; + } +} + +Rectangle GDIMetaFile::GetBoundRect( OutputDevice& i_rReference ) +{ + GDIMetaFile aMtf; + VirtualDevice aMapVDev( i_rReference ); + + aMapVDev.EnableOutput( FALSE ); + aMapVDev.SetMapMode( GetPrefMapMode() ); + + std::vector aClipStack( 1, Rectangle() ); + std::vector aPushFlagStack; + + Rectangle aBound; + + for( MetaAction* pAction = (MetaAction*) First(); pAction; pAction = (MetaAction*) Next() ) + { + const USHORT nActionType = pAction->GetType(); + + switch( nActionType ) + { + case( META_PIXEL_ACTION ): + { + MetaPixelAction* pAct = (MetaPixelAction*) pAction; + ImplActionBounds( aBound, + Rectangle( aMapVDev.LogicToLogic( pAct->GetPoint(), aMapVDev.GetMapMode(), GetPrefMapMode() ), + aMapVDev.PixelToLogic( Size( 1, 1 ), GetPrefMapMode() ) ), + aClipStack ); + } + break; + + case( META_POINT_ACTION ): + { + MetaPointAction* pAct = (MetaPointAction*) pAction; + ImplActionBounds( aBound, + Rectangle( aMapVDev.LogicToLogic( pAct->GetPoint(), aMapVDev.GetMapMode(), GetPrefMapMode() ), + aMapVDev.PixelToLogic( Size( 1, 1 ), GetPrefMapMode() ) ), + aClipStack ); + } + break; + + case( META_LINE_ACTION ): + { + MetaLineAction* pAct = (MetaLineAction*) pAction; + Point aP1( pAct->GetStartPoint() ), aP2( pAct->GetEndPoint() ); + Rectangle aRect( aP1, aP2 ); + aRect.Justify(); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_RECT_ACTION ): + { + MetaRectAction* pAct = (MetaRectAction*) pAction; + ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_ROUNDRECT_ACTION ): + { + MetaRoundRectAction* pAct = (MetaRoundRectAction*) pAction; + ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_ELLIPSE_ACTION ): + { + MetaEllipseAction* pAct = (MetaEllipseAction*) pAction; + ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_ARC_ACTION ): + { + MetaArcAction* pAct = (MetaArcAction*) pAction; + // FIXME: this is imprecise + // e.g. for small arcs the whole rectangle is WAY too large + ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_PIE_ACTION ): + { + MetaPieAction* pAct = (MetaPieAction*) pAction; + // FIXME: this is imprecise + // e.g. for small arcs the whole rectangle is WAY too large + ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_CHORD_ACTION ): + { + MetaChordAction* pAct = (MetaChordAction*) pAction; + // FIXME: this is imprecise + // e.g. for small arcs the whole rectangle is WAY too large + ImplActionBounds( aBound, aMapVDev.LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_POLYLINE_ACTION ): + { + MetaPolyLineAction* pAct = (MetaPolyLineAction*) pAction; + Rectangle aRect( pAct->GetPolygon().GetBoundRect() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_POLYGON_ACTION ): + { + MetaPolygonAction* pAct = (MetaPolygonAction*) pAction; + Rectangle aRect( pAct->GetPolygon().GetBoundRect() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_POLYPOLYGON_ACTION ): + { + MetaPolyPolygonAction* pAct = (MetaPolyPolygonAction*) pAction; + Rectangle aRect( pAct->GetPolyPolygon().GetBoundRect() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_TEXT_ACTION ): + { + MetaTextAction* pAct = (MetaTextAction*) pAction; + Rectangle aRect; + // hdu said base = index + aMapVDev.GetTextBoundRect( aRect, pAct->GetText(), pAct->GetIndex(), pAct->GetIndex(), pAct->GetLen() ); + Point aPt( pAct->GetPoint() ); + aRect.Move( aPt.X(), aPt.Y() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_TEXTARRAY_ACTION ): + { + MetaTextArrayAction* pAct = (MetaTextArrayAction*) pAction; + Rectangle aRect; + // hdu said base = index + aMapVDev.GetTextBoundRect( aRect, pAct->GetText(), pAct->GetIndex(), pAct->GetIndex(), pAct->GetLen(), + 0, pAct->GetDXArray() ); + Point aPt( pAct->GetPoint() ); + aRect.Move( aPt.X(), aPt.Y() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_STRETCHTEXT_ACTION ): + { + MetaStretchTextAction* pAct = (MetaStretchTextAction*) pAction; + Rectangle aRect; + // hdu said base = index + aMapVDev.GetTextBoundRect( aRect, pAct->GetText(), pAct->GetIndex(), pAct->GetIndex(), pAct->GetLen(), + pAct->GetWidth(), NULL ); + Point aPt( pAct->GetPoint() ); + aRect.Move( aPt.X(), aPt.Y() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_TEXTLINE_ACTION ): + { + MetaTextLineAction* pAct = (MetaTextLineAction*) pAction; + // measure a test string to get ascend and descent right + static const sal_Unicode pStr[] = { 0xc4, 0x67, 0 }; + String aStr( pStr ); + + Rectangle aRect; + aMapVDev.GetTextBoundRect( aRect, aStr, 0, 0, aStr.Len(), 0, NULL ); + Point aPt( pAct->GetStartPoint() ); + aRect.Move( aPt.X(), aPt.Y() ); + aRect.Right() = aRect.Left() + pAct->GetWidth(); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_BMPSCALE_ACTION ): + { + MetaBmpScaleAction* pAct = (MetaBmpScaleAction*) pAction; + Rectangle aRect( pAct->GetPoint(), pAct->GetSize() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_BMPSCALEPART_ACTION ): + { + MetaBmpScalePartAction* pAct = (MetaBmpScalePartAction*) pAction; + Rectangle aRect( pAct->GetDestPoint(), pAct->GetDestSize() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_BMPEXSCALE_ACTION ): + { + MetaBmpExScaleAction* pAct = (MetaBmpExScaleAction*) pAction; + Rectangle aRect( pAct->GetPoint(), pAct->GetSize() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_BMPEXSCALEPART_ACTION ): + { + MetaBmpExScalePartAction* pAct = (MetaBmpExScalePartAction*) pAction; + Rectangle aRect( pAct->GetDestPoint(), pAct->GetDestSize() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_GRADIENT_ACTION ): + { + MetaGradientAction* pAct = (MetaGradientAction*) pAction; + Rectangle aRect( pAct->GetRect() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_GRADIENTEX_ACTION ): + { + MetaGradientExAction* pAct = (MetaGradientExAction*) pAction; + Rectangle aRect( pAct->GetPolyPolygon().GetBoundRect() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_COMMENT_ACTION ): + { + // nothing to do + }; + break; + + case( META_HATCH_ACTION ): + { + MetaHatchAction* pAct = (MetaHatchAction*) pAction; + Rectangle aRect( pAct->GetPolyPolygon().GetBoundRect() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_TRANSPARENT_ACTION ): + { + MetaTransparentAction* pAct = (MetaTransparentAction*) pAction; + Rectangle aRect( pAct->GetPolyPolygon().GetBoundRect() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_FLOATTRANSPARENT_ACTION ): + { + MetaFloatTransparentAction* pAct = (MetaFloatTransparentAction*) pAction; + GDIMetaFile aTransMtf( pAct->GetGDIMetaFile() ); + // get the bound rect of the contained metafile + Rectangle aRect( aTransMtf.GetBoundRect( i_rReference ) ); + // scale the rect now on the assumption that the correct top left of the metafile + // (not its bounds !) is (0,0) + Size aPSize( aTransMtf.GetPrefSize() ); + aPSize = aMapVDev.LogicToLogic( aPSize, aTransMtf.GetPrefMapMode(), aMapVDev.GetMapMode() ); + Size aActSize( pAct->GetSize() ); + double fX = double(aActSize.Width())/double(aPSize.Width()); + double fY = double(aActSize.Height())/double(aPSize.Height()); + aRect.Left() = long(double(aRect.Left())*fX); + aRect.Right() = long(double(aRect.Right())*fX); + aRect.Top() = long(double(aRect.Top())*fY); + aRect.Bottom() = long(double(aRect.Bottom())*fY); + + // transform the rect to current VDev state + aRect = aMapVDev.LogicToLogic( aRect, aTransMtf.GetPrefMapMode(), aMapVDev.GetMapMode() ); + + ImplActionBounds( aBound, aRect, aClipStack ); + } + break; + + case( META_EPS_ACTION ): + { + MetaEPSAction* pAct = (MetaEPSAction*) pAction; + Rectangle aRect( pAct->GetPoint(), pAct->GetSize() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_CLIPREGION_ACTION ): + { + MetaClipRegionAction* pAct = (MetaClipRegionAction*) pAction; + if( pAct->IsClipping() ) + aClipStack.back() = aMapVDev.LogicToLogic( pAct->GetRegion().GetBoundRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ); + else + aClipStack.back() = Rectangle(); + } + break; + + case( META_ISECTRECTCLIPREGION_ACTION ): + { + MetaISectRectClipRegionAction* pAct = (MetaISectRectClipRegionAction*) pAction; + Rectangle aRect( aMapVDev.LogicToLogic( pAct->GetRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ) ); + if( aClipStack.back().IsEmpty() ) + aClipStack.back() = aRect; + else + aClipStack.back().Intersection( aRect ); + } + break; + + case( META_ISECTREGIONCLIPREGION_ACTION ): + { + MetaISectRegionClipRegionAction* pAct = (MetaISectRegionClipRegionAction*) pAction; + Rectangle aRect( aMapVDev.LogicToLogic( pAct->GetRegion().GetBoundRect(), aMapVDev.GetMapMode(), GetPrefMapMode() ) ); + if( aClipStack.back().IsEmpty() ) + aClipStack.back() = aRect; + else + aClipStack.back().Intersection( aRect ); + } + break; + + case( META_BMP_ACTION ): + { + MetaBmpAction* pAct = (MetaBmpAction*) pAction; + Rectangle aRect( pAct->GetPoint(), aMapVDev.PixelToLogic( pAct->GetBitmap().GetSizePixel() ) ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_BMPEX_ACTION ): + { + MetaBmpExAction* pAct = (MetaBmpExAction*) pAction; + Rectangle aRect( pAct->GetPoint(), aMapVDev.PixelToLogic( pAct->GetBitmapEx().GetSizePixel() ) ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_MASK_ACTION ): + { + MetaMaskAction* pAct = (MetaMaskAction*) pAction; + Rectangle aRect( pAct->GetPoint(), aMapVDev.PixelToLogic( pAct->GetBitmap().GetSizePixel() ) ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_MASKSCALE_ACTION ): + { + MetaMaskScalePartAction* pAct = (MetaMaskScalePartAction*) pAction; + Rectangle aRect( pAct->GetDestPoint(), pAct->GetDestSize() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_MASKSCALEPART_ACTION ): + { + MetaMaskScalePartAction* pAct = (MetaMaskScalePartAction*) pAction; + Rectangle aRect( pAct->GetDestPoint(), pAct->GetDestSize() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_WALLPAPER_ACTION ): + { + MetaWallpaperAction* pAct = (MetaWallpaperAction*) pAction; + Rectangle aRect( pAct->GetRect() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_TEXTRECT_ACTION ): + { + MetaTextRectAction* pAct = (MetaTextRectAction*) pAction; + Rectangle aRect( pAct->GetRect() ); + ImplActionBounds( aBound, aMapVDev.LogicToLogic( aRect, aMapVDev.GetMapMode(), GetPrefMapMode() ), aClipStack ); + } + break; + + case( META_MOVECLIPREGION_ACTION ): + { + MetaMoveClipRegionAction* pAct = (MetaMoveClipRegionAction*) pAction; + if( ! aClipStack.back().IsEmpty() ) + { + Size aDelta( pAct->GetHorzMove(), pAct->GetVertMove() ); + aDelta = aMapVDev.LogicToLogic( aDelta, aMapVDev.GetMapMode(), GetPrefMapMode() ); + aClipStack.back().Move( aDelta.Width(), aDelta.Width() ); + } + } + break; + + default: + { + pAction->Execute( &aMapVDev ); + + if( nActionType == META_PUSH_ACTION ) + { + MetaPushAction* pAct = (MetaPushAction*) pAction; + aPushFlagStack.push_back( pAct->GetFlags() ); + if( (aPushFlagStack.back() & PUSH_CLIPREGION) != 0 ) + { + Rectangle aRect( aClipStack.back() ); + aClipStack.push_back( aRect ); + } + } + else if( nActionType == META_POP_ACTION ) + { + // sanity check + if( ! aPushFlagStack.empty() ) + { + if( (aPushFlagStack.back() & PUSH_CLIPREGION) != 0 ) + { + if( aClipStack.size() > 1 ) + aClipStack.pop_back(); + } + aPushFlagStack.pop_back(); + } + } + } + break; + } + } + return aBound; +} + +// ------------------------------------------------------------------------ + Color GDIMetaFile::ImplColAdjustFnc( const Color& rColor, const void* pColParam ) { return Color( rColor.GetTransparency(), diff --git a/vcl/source/gdi/graph.cxx b/vcl/source/gdi/graph.cxx index dfa155e29eae..76e94e091ff7 100644 --- a/vcl/source/gdi/graph.cxx +++ b/vcl/source/gdi/graph.cxx @@ -430,44 +430,16 @@ BOOL Graphic::IsAnimated() const // ------------------------------------------------------------------------ -Bitmap Graphic::GetBitmap() const +Bitmap Graphic::GetBitmap(const GraphicConversionParameters& rParameters) const { - return GetBitmap( NULL ); + return mpImpGraphic->ImplGetBitmap(rParameters); } // ------------------------------------------------------------------------ -BitmapEx Graphic::GetBitmapEx() const +BitmapEx Graphic::GetBitmapEx(const GraphicConversionParameters& rParameters) const { - return GetBitmapEx( NULL ); -} - -// ------------------------------------------------------------------------ - -Bitmap Graphic::GetBitmap( const Size* pSizePixel ) const -{ - return mpImpGraphic->ImplGetBitmap( pSizePixel, FALSE ); -} - -// ------------------------------------------------------------------------ - -BitmapEx Graphic::GetBitmapEx( const Size* pSizePixel ) const -{ - return mpImpGraphic->ImplGetBitmapEx( pSizePixel, FALSE ); -} - -// ------------------------------------------------------------------------ - -Bitmap Graphic::GetUnlimitedBitmap( const Size* pSizePixel ) const -{ - return mpImpGraphic->ImplGetBitmap( pSizePixel, TRUE ) ; -} - -// ------------------------------------------------------------------------ - -BitmapEx Graphic::GetUnlimitedBitmapEx( const Size* pSizePixel ) const -{ - return mpImpGraphic->ImplGetBitmapEx( pSizePixel, TRUE ) ; + return mpImpGraphic->ImplGetBitmapEx(rParameters); } // ------------------------------------------------------------------------ @@ -553,7 +525,7 @@ Size Graphic::GetSizePixel( const OutputDevice* pRefDevice ) const Size aRet; if( GRAPHIC_BITMAP == mpImpGraphic->ImplGetType() ) - aRet = mpImpGraphic->ImplGetBitmapEx( NULL, FALSE ).GetSizePixel(); + aRet = mpImpGraphic->ImplGetBitmapEx(GraphicConversionParameters()).GetSizePixel(); else aRet = ( pRefDevice ? pRefDevice : Application::GetDefaultDevice() )->LogicToPixel( GetPrefSize(), GetPrefMapMode() ); @@ -803,7 +775,7 @@ void Graphic::SetLink( const GfxLink& rGfxLink ) // ------------------------------------------------------------------------ -GfxLink Graphic::GetLink() +GfxLink Graphic::GetLink() const { return mpImpGraphic->ImplGetLink(); } diff --git a/vcl/source/gdi/impgraph.cxx b/vcl/source/gdi/impgraph.cxx index a67d6fa7feac..d73f35bef962 100644 --- a/vcl/source/gdi/impgraph.cxx +++ b/vcl/source/gdi/impgraph.cxx @@ -483,7 +483,7 @@ BOOL ImpGraphic::ImplIsAnimated() const // ------------------------------------------------------------------------ -Bitmap ImpGraphic::ImplGetBitmap( const Size* pSizePixel, BOOL bUnlimited ) const +Bitmap ImpGraphic::ImplGetBitmap(const GraphicConversionParameters& rParameters) const { Bitmap aRetBmp; @@ -494,8 +494,8 @@ Bitmap ImpGraphic::ImplGetBitmap( const Size* pSizePixel, BOOL bUnlimited ) cons aRetBmp = rRetBmpEx.GetBitmap( &aReplaceColor ); - if( pSizePixel ) - aRetBmp.Scale( *pSizePixel ); + if(rParameters.getSizePixel().Width() || rParameters.getSizePixel().Height()) + aRetBmp.Scale(rParameters.getSizePixel()); } else if( ( meType != GRAPHIC_DEFAULT ) && ImplIsSupportedGraphic() ) { @@ -508,16 +508,18 @@ Bitmap ImpGraphic::ImplGetBitmap( const Size* pSizePixel, BOOL bUnlimited ) cons Size aDrawSize( aVDev.LogicToPixel( maMetaFile.GetPrefSize(), maMetaFile.GetPrefMapMode() ) ); Size aSizePix( labs( aBRPix.X() - aTLPix.X() ) + 1, labs( aBRPix.Y() - aTLPix.Y() ) + 1 ); - if( pSizePixel && aSizePix.Width() && aSizePix.Height() ) + if(rParameters.getSizePixel().Width() && rParameters.getSizePixel().Height()) { - aDrawSize.Width() = FRound( (double) pSizePixel->Width() * (double) aDrawSize.Width() / (double) aSizePix.Width() ); - aDrawSize.Height() = FRound( (double) pSizePixel->Height() * (double) aDrawSize.Height() / (double) aSizePix.Height() ); + aDrawSize.Width() = FRound((double)rParameters.getSizePixel().Width() * + (double)aDrawSize.Width() / (double)aSizePix.Width()); + aDrawSize.Height() = FRound((double)rParameters.getSizePixel().Height() * + (double)aDrawSize.Height() / (double)aSizePix.Height()); - aSizePix = *pSizePixel; + aSizePix = rParameters.getSizePixel(); } - if( aSizePix.Width() && aSizePix.Height() && !bUnlimited && - ( aSizePix.Width() > GRAPHIC_MTFTOBMP_MAXEXT || aSizePix.Height() > GRAPHIC_MTFTOBMP_MAXEXT ) ) + if( aSizePix.Width() && aSizePix.Height() && !rParameters.getUnlimitedSize() + && (aSizePix.Width() > GRAPHIC_MTFTOBMP_MAXEXT || aSizePix.Height() > GRAPHIC_MTFTOBMP_MAXEXT)) { const Size aOldSizePix( aSizePix ); double fWH = (double) aSizePix.Width() / aSizePix.Height(); @@ -533,6 +535,16 @@ Bitmap ImpGraphic::ImplGetBitmap( const Size* pSizePixel, BOOL bUnlimited ) cons if( aVDev.SetOutputSizePixel( aSizePix ) ) { + if(rParameters.getAntiAliase()) + { + aVDev.SetAntialiasing(aVDev.GetAntialiasing() | ANTIALIASING_ENABLE_B2DDRAW); + } + + if(rParameters.getSnapHorVerLines()) + { + aVDev.SetAntialiasing(aVDev.GetAntialiasing() | ANTIALIASING_PIXELSNAPHAIRLINE); + } + ImplDraw( &aVDev, aNullPt, aDrawSize ); aRetBmp = aVDev.GetBitmap( aNullPt, aVDev.GetOutputSizePixel() ); } @@ -549,7 +561,7 @@ Bitmap ImpGraphic::ImplGetBitmap( const Size* pSizePixel, BOOL bUnlimited ) cons // ------------------------------------------------------------------------ -BitmapEx ImpGraphic::ImplGetBitmapEx( const Size* pSizePixel, BOOL bUnlimited ) const +BitmapEx ImpGraphic::ImplGetBitmapEx(const GraphicConversionParameters& rParameters) const { BitmapEx aRetBmpEx; @@ -557,13 +569,13 @@ BitmapEx ImpGraphic::ImplGetBitmapEx( const Size* pSizePixel, BOOL bUnlimited ) { aRetBmpEx = ( mpAnimation ? mpAnimation->GetBitmapEx() : maEx ); - if( pSizePixel ) - aRetBmpEx.Scale( *pSizePixel ); + if(rParameters.getSizePixel().Width() || rParameters.getSizePixel().Height()) + aRetBmpEx.Scale(rParameters.getSizePixel()); } else if( ( meType != GRAPHIC_DEFAULT ) && ImplIsSupportedGraphic() ) { const ImpGraphic aMonoMask( maMetaFile.GetMonochromeMtf( COL_BLACK ) ); - aRetBmpEx = BitmapEx( ImplGetBitmap( pSizePixel, bUnlimited ), aMonoMask.ImplGetBitmap( pSizePixel, bUnlimited ) ); + aRetBmpEx = BitmapEx(ImplGetBitmap(rParameters), aMonoMask.ImplGetBitmap(rParameters)); } return aRetBmpEx; diff --git a/vcl/source/gdi/impimagetree.cxx b/vcl/source/gdi/impimagetree.cxx index 64cddece1199..8178204a4ffd 100644 --- a/vcl/source/gdi/impimagetree.cxx +++ b/vcl/source/gdi/impimagetree.cxx @@ -46,6 +46,7 @@ #include "com/sun/star/uno/RuntimeException.hpp" #include "com/sun/star/uno/Sequence.hxx" #include "comphelper/processfactory.hxx" +#include "osl/file.hxx" #include "osl/diagnose.h" #include "rtl/bootstrap.hxx" #include "rtl/string.h" @@ -102,8 +103,11 @@ void loadFromStream( rtl::OUString const & path, BitmapEx & bitmap) { std::auto_ptr< SvStream > s(wrapStream(stream)); - if (path.endsWithAsciiL(RTL_CONSTASCII_STRINGPARAM(".png"))) { - bitmap = vcl::PNGReader(*s).Read(); + if (path.endsWithAsciiL(RTL_CONSTASCII_STRINGPARAM(".png"))) + { + vcl::PNGReader aPNGReader( *s ); + aPNGReader.SetIgnoreGammaChunk( sal_True ); + bitmap = aPNGReader.Read(); } else { *s >> bitmap; } @@ -115,12 +119,43 @@ ImplImageTree::ImplImageTree() {} ImplImageTree::~ImplImageTree() {} +bool ImplImageTree::checkStyle(rtl::OUString const & style) +{ + bool exists; + + // using cache because setStyle is an expensive operation + // setStyle calls resetZips => closes any opened zip files with icons, cleans the icon cache, ... + if (checkStyleCacheLookup(style, exists)) { + return exists; + } + + setStyle(style); + + exists = false; + const rtl::OUString sBrandURLSuffix(RTL_CONSTASCII_USTRINGPARAM("_brand.zip")); + for (Zips::iterator i(m_zips.begin()); i != m_zips.end() && !exists;) { + ::rtl::OUString aZipURL = i->first; + sal_Int32 nFromIndex = aZipURL.getLength() - sBrandURLSuffix.getLength(); + // skip brand-specific icon themes; they are incomplete and thus not useful for this check + if (nFromIndex < 0 || !aZipURL.match(sBrandURLSuffix, nFromIndex)) { + osl::File aZip(aZipURL); + if (aZip.open(OpenFlag_Read) == ::osl::FileBase::E_None) { + aZip.close(); + exists = true; + } + } + ++i; + } + m_checkStyleCache[style] = exists; + return exists; +} + bool ImplImageTree::loadImage( rtl::OUString const & name, rtl::OUString const & style, BitmapEx & bitmap, bool localized) { setStyle(style); - if (cacheLookup(name, localized, bitmap)) { + if (iconCacheLookup(name, localized, bitmap)) { return true; } if (!bitmap.IsEmpty()) { @@ -161,7 +196,7 @@ bool ImplImageTree::loadImage( rtl::OUStringToOString(e.Message, RTL_TEXTENCODING_UTF8).getStr()); } if (found) { - m_cache[name.intern()] = std::make_pair(localized, bitmap); + m_iconCache[name.intern()] = std::make_pair(localized, bitmap); } return found; } @@ -170,7 +205,8 @@ void ImplImageTree::shutDown() { m_style = rtl::OUString(); // for safety; empty m_style means "not initialized" m_zips.clear(); - m_cache.clear(); + m_iconCache.clear(); + m_checkStyleCache.clear(); } void ImplImageTree::setStyle(rtl::OUString const & style) { @@ -178,12 +214,23 @@ void ImplImageTree::setStyle(rtl::OUString const & style) { if (style != m_style) { m_style = style; resetZips(); - m_cache.clear(); + m_iconCache.clear(); } } void ImplImageTree::resetZips() { m_zips.clear(); + { + rtl::OUString url( + RTL_CONSTASCII_USTRINGPARAM("$BRAND_BASE_DIR/program/edition/images.zip")); + rtl::Bootstrap::expandMacros(url); + INetURLObject u(url); + OSL_ASSERT(!u.HasError()); + m_zips.push_back( + std::make_pair( + u.GetMainURL(INetURLObject::NO_DECODE), + css::uno::Reference< css::container::XNameAccess >())); + } { rtl::OUString url( RTL_CONSTASCII_USTRINGPARAM("$BRAND_BASE_DIR/share/config")); @@ -227,6 +274,7 @@ void ImplImageTree::resetZips() { u.GetMainURL(INetURLObject::NO_DECODE), css::uno::Reference< css::container::XNameAccess >())); } + if ( m_style.equals(::rtl::OUString::createFromAscii("default")) ) { rtl::OUString url( RTL_CONSTASCII_USTRINGPARAM( @@ -238,11 +286,23 @@ void ImplImageTree::resetZips() { } } -bool ImplImageTree::cacheLookup( +bool ImplImageTree::checkStyleCacheLookup( + rtl::OUString const & style, bool &exists) +{ + CheckStyleCache::iterator i(m_checkStyleCache.find(style)); + if (i != m_checkStyleCache.end()) { + exists = i->second; + return true; + } else { + return false; + } +} + +bool ImplImageTree::iconCacheLookup( rtl::OUString const & name, bool localized, BitmapEx & bitmap) { - Cache::iterator i(m_cache.find(name)); - if (i != m_cache.end() && i->second.first == localized) { + IconCache::iterator i(m_iconCache.find(name)); + if (i != m_iconCache.end() && i->second.first == localized) { bitmap = i->second.second; return true; } else { diff --git a/vcl/source/gdi/makefile.mk b/vcl/source/gdi/makefile.mk old mode 100644 new mode 100755 index 977e5386fe97..421505a3d500 --- a/vcl/source/gdi/makefile.mk +++ b/vcl/source/gdi/makefile.mk @@ -1,7 +1,7 @@ #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# +# # Copyright 2008 by Sun Microsystems, Inc. # # OpenOffice.org - a multi-platform office productivity suite @@ -45,10 +45,39 @@ TARGET=gdi .IF "$(COM)"=="ICC" CDEFS+=-D_STD_NO_NAMESPACE -D_VOS_NO_NAMESPACE -D_UNO_NO_NAMESPACE .ENDIF +.IF "$(ENABLE_GRAPHITE)" == "TRUE" +CDEFS+=-DENABLE_GRAPHITE +.ENDIF # --- Files -------------------------------------------------------- -SLOFILES= $(SLO)$/salmisc.obj \ +EXCEPTIONSFILES= $(SLO)$/salmisc.obj \ + $(SLO)$/outdev.obj \ + $(SLO)$/outdev3.obj \ + $(SLO)$/gfxlink.obj \ + $(SLO)$/print.obj \ + $(SLO)$/print2.obj \ + $(SLO)$/configsettings.obj \ + $(SLO)$/sallayout.obj \ + $(SLO)$/image.obj \ + $(SLO)$/impimage.obj \ + $(SLO)$/impgraph.obj \ + $(SLO)$/metric.obj \ + $(SLO)$/pdfwriter_impl.obj \ + $(SLO)$/pdffontcache.obj\ + $(SLO)$/bmpconv.obj \ + $(SLO)$/pdfextoutdevdata.obj \ + $(SLO)$/jobset.obj \ + $(SLO)$/impimagetree.obj \ + $(SLO)$/pngread.obj \ + $(SLO)$/pngwrite.obj \ + $(SLO)$/virdev.obj \ + $(SLO)$/impprn.obj \ + $(SLO)$/gdimtf.obj \ + $(SLO)$/graphictools.obj \ + $(SLO)$/textlayout.obj + +SLOFILES= $(EXCEPTIONSFILES) \ $(SLO)$/animate.obj \ $(SLO)$/impanmvw.obj \ $(SLO)$/bitmap.obj \ @@ -65,80 +94,30 @@ SLOFILES= $(SLO)$/salmisc.obj \ $(SLO)$/cvtsvm.obj \ $(SLO)$/cvtgrf.obj \ $(SLO)$/font.obj \ - $(SLO)$/gdimtf.obj \ - $(SLO)$/gfxlink.obj \ $(SLO)$/gradient.obj \ $(SLO)$/hatch.obj \ $(SLO)$/graph.obj \ - $(SLO)$/image.obj \ - $(SLO)$/impimage.obj \ $(SLO)$/impbmp.obj \ - $(SLO)$/impgraph.obj \ - $(SLO)$/impimagetree.obj \ $(SLO)$/imagerepository.obj \ - $(SLO)$/impprn.obj \ $(SLO)$/impvect.obj \ $(SLO)$/implncvt.obj \ - $(SLO)$/jobset.obj \ $(SLO)$/lineinfo.obj \ $(SLO)$/mapmod.obj \ $(SLO)$/metaact.obj \ - $(SLO)$/metric.obj \ $(SLO)$/octree.obj \ $(SLO)$/outmap.obj \ - $(SLO)$/outdev.obj \ $(SLO)$/outdev2.obj \ - $(SLO)$/outdev3.obj \ $(SLO)$/outdev4.obj \ $(SLO)$/outdev5.obj \ $(SLO)$/outdev6.obj \ - $(SLO)$/virdev.obj \ - $(SLO)$/fontcvt.obj \ - $(SLO)$/print.obj \ - $(SLO)$/print2.obj \ $(SLO)$/regband.obj \ $(SLO)$/region.obj \ $(SLO)$/wall.obj \ - $(SLO)$/fontcfg.obj \ $(SLO)$/base14.obj \ $(SLO)$/pdfwriter.obj \ - $(SLO)$/pdfwriter_impl.obj \ - $(SLO)$/pdffontcache.obj\ - $(SLO)$/sallayout.obj \ $(SLO)$/salgdilayout.obj \ $(SLO)$/extoutdevdata.obj \ - $(SLO)$/pdfextoutdevdata.obj \ - $(SLO)$/salnativewidgets-none.obj \ - $(SLO)$/bmpconv.obj \ - $(SLO)$/pngread.obj \ - $(SLO)$/pngwrite.obj \ - $(SLO)$/graphictools.obj - -EXCEPTIONSFILES= $(SLO)$/salmisc.obj \ - $(SLO)$/outdev.obj \ - $(SLO)$/outdev3.obj \ - $(SLO)$/gfxlink.obj \ - $(SLO)$/print.obj \ - $(SLO)$/print2.obj \ - $(SLO)$/sallayout.obj \ - $(SLO)$/image.obj \ - $(SLO)$/impimage.obj \ - $(SLO)$/impgraph.obj \ - $(SLO)$/metric.obj \ - $(SLO)$/pdfwriter_impl.obj \ - $(SLO)$/pdffontcache.obj\ - $(SLO)$/fontcfg.obj \ - $(SLO)$/bmpconv.obj \ - $(SLO)$/pdfextoutdevdata.obj \ - $(SLO)$/fontcvt.obj \ - $(SLO)$/jobset.obj \ - $(SLO)$/impimagetree.obj \ - $(SLO)$/pngread.obj \ - $(SLO)$/pngwrite.obj \ - $(SLO)$/virdev.obj \ - $(SLO)$/impprn.obj \ - $(SLO)$/graphictools.obj - + $(SLO)$/salnativewidgets-none.obj # --- Targets ------------------------------------------------------ diff --git a/vcl/source/gdi/metaact.cxx b/vcl/source/gdi/metaact.cxx index 4fe9a41be797..82566b2b4362 100644 --- a/vcl/source/gdi/metaact.cxx +++ b/vcl/source/gdi/metaact.cxx @@ -989,7 +989,7 @@ void MetaPolyLineAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) WRITE_BASE_COMPAT( rOStm, 3, pData ); Polygon aSimplePoly; - maPoly.GetSimple( aSimplePoly ); + maPoly.AdaptiveSubdivide( aSimplePoly ); rOStm << aSimplePoly; // Version 1 rOStm << maLineInfo; // Version 2 @@ -1077,7 +1077,7 @@ void MetaPolygonAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) WRITE_BASE_COMPAT( rOStm, 2, pData ); Polygon aSimplePoly; // Version 1 - maPoly.GetSimple( aSimplePoly ); + maPoly.AdaptiveSubdivide( aSimplePoly ); rOStm << aSimplePoly; sal_uInt8 bHasPolyFlags = maPoly.HasFlags(); // Version 2 @@ -1169,7 +1169,7 @@ void MetaPolyPolygonAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) const Polygon& rPoly = maPolyPoly.GetObject( i ); if ( rPoly.HasFlags() ) nNumberOfComplexPolygons++; - rPoly.GetSimple( aSimplePoly ); + rPoly.AdaptiveSubdivide( aSimplePoly ); rOStm << aSimplePoly; } @@ -2581,7 +2581,13 @@ sal_Bool MetaGradientExAction::Compare( const MetaAction& rMetaAction ) const void MetaGradientExAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); - rOStm << maPolyPoly << maGradient; + + // #i105373# see comment at MetaTransparentAction::Write + PolyPolygon aNoCurvePolyPolygon; + maPolyPoly.AdaptiveSubdivide(aNoCurvePolyPolygon); + + rOStm << aNoCurvePolyPolygon; + rOStm << maGradient; } // ------------------------------------------------------------------------ @@ -2649,7 +2655,13 @@ sal_Bool MetaHatchAction::Compare( const MetaAction& rMetaAction ) const void MetaHatchAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); - rOStm << maPolyPoly << maHatch; + + // #i105373# see comment at MetaTransparentAction::Write + PolyPolygon aNoCurvePolyPolygon; + maPolyPoly.AdaptiveSubdivide(aNoCurvePolyPolygon); + + rOStm << aNoCurvePolyPolygon; + rOStm << maHatch; } // ------------------------------------------------------------------------ @@ -3716,7 +3728,20 @@ sal_Bool MetaTransparentAction::Compare( const MetaAction& rMetaAction ) const void MetaTransparentAction::Write( SvStream& rOStm, ImplMetaWriteData* pData ) { WRITE_BASE_COMPAT( rOStm, 1, pData ); - rOStm << maPolyPoly; + + // #i105373# The PolyPolygon in this action may be a curve; this + // was ignored until now what is an error. To make older office + // versions work with MetaFiles, i opt for applying AdaptiveSubdivide + // to the PolyPoylgon. + // The alternative would be to really write the curve information + // like in MetaPolyPolygonAction::Write (where someone extended it + // correctly, but not here :-( ). + // The golden solution would be to combine both, but i think it's + // not necessary; a good subdivision will be sufficient. + PolyPolygon aNoCurvePolyPolygon; + maPolyPoly.AdaptiveSubdivide(aNoCurvePolyPolygon); + + rOStm << aNoCurvePolyPolygon; rOStm << mnTransPercent; } diff --git a/vcl/source/gdi/metric.cxx b/vcl/source/gdi/metric.cxx index 49e4dc080d8f..c387bd158306 100644 --- a/vcl/source/gdi/metric.cxx +++ b/vcl/source/gdi/metric.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: metric.cxx,v $ - * $Revision: 1.23 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -236,50 +233,80 @@ BOOL FontMetric::operator==( const FontMetric& rMetric ) const // ======================================================================= -ImplFontCharMap::ImplFontCharMap( int nRangePairs, - const sal_uInt32* pRangeCodes, const int* pStartGlyphs ) -: mpRangeCodes( pRangeCodes ), - mpStartGlyphs( pStartGlyphs ), - mnRangeCount( nRangePairs ), - mnCharCount( 0 ), - mnRefCount( 1 ) +CmapResult::CmapResult( bool bSymbolic, + const sal_uInt32* pRangeCodes, int nRangeCount, + const int* pStartGlyphs, const USHORT* pExtraGlyphIds ) +: mpRangeCodes( pRangeCodes) +, mpStartGlyphs( pStartGlyphs) +, mpGlyphIds( pExtraGlyphIds) +, mnRangeCount( nRangeCount) +, mbSymbolic( bSymbolic) +, mbRecoded( false) +{} + +// ======================================================================= + +ImplFontCharMap::ImplFontCharMap( const CmapResult& rCR ) +: mpRangeCodes( rCR.mpRangeCodes ) +, mpStartGlyphs( rCR.mpStartGlyphs ) +, mpGlyphIds( rCR.mpGlyphIds ) +, mnRangeCount( rCR.mnRangeCount ) +, mnCharCount( 0 ) +, mnRefCount( 1 ) { - while( --nRangePairs >= 0 ) + const sal_uInt32* pRangePtr = mpRangeCodes; + for( int i = mnRangeCount; --i >= 0; pRangePtr += 2 ) { - sal_uInt32 cFirst = *(pRangeCodes++); - sal_uInt32 cLast = *(pRangeCodes++); + sal_uInt32 cFirst = pRangePtr[0]; + sal_uInt32 cLast = pRangePtr[1]; mnCharCount += cLast - cFirst; } } static ImplFontCharMap* pDefaultImplFontCharMap = NULL; -static const sal_uInt32 pDefaultRangeCodes[] = {0x0020,0xD800, 0xE000,0xFFF0}; - -// ----------------------------------------------------------------------- - -ImplFontCharMap::~ImplFontCharMap() -{ - if( mpRangeCodes != pDefaultRangeCodes ) - delete[] mpRangeCodes; - delete[] mpStartGlyphs; -} - -// ----------------------------------------------------------------------- - -ImplFontCharMap* ImplFontCharMap::GetDefaultMap() -{ - if( pDefaultImplFontCharMap ) - pDefaultImplFontCharMap->AddReference(); - else - pDefaultImplFontCharMap = new ImplFontCharMap( 2, pDefaultRangeCodes, NULL ); - return pDefaultImplFontCharMap; -} +static const sal_uInt32 aDefaultUnicodeRanges[] = {0x0020,0xD800, 0xE000,0xFFF0}; +static const sal_uInt32 aDefaultSymbolRanges[] = {0x0020,0x0100, 0xF020,0xF100}; // ----------------------------------------------------------------------- bool ImplFontCharMap::IsDefaultMap() const { - return (mpRangeCodes == pDefaultRangeCodes); + const bool bIsDefault = (mpRangeCodes == aDefaultUnicodeRanges) || (mpRangeCodes == aDefaultSymbolRanges); + return bIsDefault; +} + +// ----------------------------------------------------------------------- + +ImplFontCharMap::~ImplFontCharMap() +{ + if( IsDefaultMap() ) + return; + delete[] mpRangeCodes; + delete[] mpStartGlyphs; + delete[] mpGlyphIds; +} + +// ----------------------------------------------------------------------- + +ImplFontCharMap* ImplFontCharMap::GetDefaultMap( bool bSymbols) +{ + if( pDefaultImplFontCharMap ) + pDefaultImplFontCharMap->AddReference(); + else + { + const sal_uInt32* pRangeCodes = aDefaultUnicodeRanges; + int nCodesCount = sizeof(aDefaultUnicodeRanges) / sizeof(*pRangeCodes); + if( bSymbols ) + { + pRangeCodes = aDefaultSymbolRanges; + nCodesCount = sizeof(aDefaultSymbolRanges) / sizeof(*pRangeCodes); + } + + CmapResult aDefaultCR( bSymbols, pRangeCodes, nCodesCount/2 ); + pDefaultImplFontCharMap = new ImplFontCharMap( aDefaultCR ); + } + + return pDefaultImplFontCharMap; } // ----------------------------------------------------------------------- @@ -328,15 +355,24 @@ int ImplFontCharMap::ImplFindRangeIndex( sal_uInt32 cChar ) const bool ImplFontCharMap::HasChar( sal_uInt32 cChar ) const { - int nRange = ImplFindRangeIndex( cChar ); - if( nRange==0 && cChar=0xF000) & (mpRangeCodes[1]<=0xF0FF); + if( !bSymbolic ) + return 0; + // check for symbol aliasing (U+F0xx -> U+00xx) + nRange = ImplFindRangeIndex( cChar | 0xF000 ); + } + // check that we are inside a range + if( (nRange & 1) != 0 ) return 0; - // calculate the glyph index with the range' start code and start glyph - int nGlyphIndex = mpStartGlyphs[ nRange/2 ]; - nGlyphIndex += cChar - mpRangeCodes[ nRange ]; + // get glyph index directly or indirectly + int nGlyphIndex = cChar - mpRangeCodes[ nRange ]; + const int nStartIndex = mpStartGlyphs[ nRange/2 ]; + if( nStartIndex >= 0 ) { + // the glyph index can be calculated + nGlyphIndex += nStartIndex; + } else { + // the glyphid array has the glyph index + nGlyphIndex = mpGlyphIds[ nGlyphIndex - nStartIndex]; + } + return nGlyphIndex; } @@ -478,24 +530,29 @@ static int GetSShort( const unsigned char* p ){ return((static_cast // TODO: move CMAP parsing directly into the ImplFontCharMap class bool ParseCMAP( const unsigned char* pCmap, int nLength, CmapResult& rResult ) { + rResult.mpRangeCodes = NULL; + rResult.mpStartGlyphs= NULL; + rResult.mpGlyphIds = NULL; + rResult.mnRangeCount = 0; + rResult.mbRecoded = false; + rResult.mbSymbolic = false; + + // parse the table header and check for validity if( !pCmap || (nLength < 24) ) return false; - rResult.mpPairCodes = NULL; - rResult.mpStartGlyphs= NULL; - rResult.mnPairCount = 0; - rResult.mbRecoded = false; - rResult.mbSymbolic = false; - if( GetUShort( pCmap ) != 0x0000 ) // simple check for CMAP corruption return false; + int nSubTables = GetUShort( pCmap + 2 ); + if( (nSubTables <= 0) || (nLength < (24 + 8*nSubTables)) ) + return false; + // find the most interesting subtable in the CMAP rtl_TextEncoding eRecodeFrom = RTL_TEXTENCODING_UNICODE; int nOffset = 0; int nFormat = -1; int nBestVal = 0; - int nSubTables = GetUShort( pCmap + 2 ); for( const unsigned char* p = pCmap + 4; --nSubTables >= 0; p += 8 ) { int nPlatform = GetUShort( p ); @@ -548,6 +605,11 @@ bool ParseCMAP( const unsigned char* pCmap, int nLength, CmapResult& rResult ) sal_uInt32* pCodePairs = NULL; int* pStartGlyphs = NULL; + typedef std::vector U16Vector; + U16Vector aGlyphIdArray; + aGlyphIdArray.reserve( 0x1000 ); + aGlyphIdArray.push_back( 0 ); + // format 4, the most common 16bit char mapping table if( (nFormat == 4) && ((nOffset+16) < nLength) ) { @@ -557,20 +619,33 @@ bool ParseCMAP( const unsigned char* pCmap, int nLength, CmapResult& rResult ) pStartGlyphs = new int[ nRangeCount ]; const unsigned char* pLimitBase = pCmap + nOffset + 14; const unsigned char* pBeginBase = pLimitBase + nSegCountX2 + 2; - const unsigned char* pGlyphBase = pBeginBase + nSegCountX2; + const unsigned char* pDeltaBase = pBeginBase + nSegCountX2; + const unsigned char* pOffsetBase = pDeltaBase + nSegCountX2; sal_uInt32* pCP = pCodePairs; for( int i = 0; i < nRangeCount; ++i ) { - sal_uInt32 cMinChar = GetUShort( pBeginBase + 2*i ); - sal_uInt32 cMaxChar = GetUShort( pLimitBase + 2*i ); - int nStartGlyph = cMinChar + GetSShort( pGlyphBase + 2*i ); + const sal_uInt32 cMinChar = GetUShort( pBeginBase + 2*i ); + const sal_uInt32 cMaxChar = GetUShort( pLimitBase + 2*i ); + const int nGlyphDelta = GetSShort( pDeltaBase + 2*i ); + const int nRangeOffset = GetUShort( pOffsetBase + 2*i ); if( cMinChar > cMaxChar ) // no sane font should trigger this break; if( cMaxChar == 0xFFFF ) break; *(pCP++) = cMinChar; *(pCP++) = cMaxChar + 1; - pStartGlyphs[i] = nStartGlyph; + if( !nRangeOffset ) { + // glyphid can be calculated directly + pStartGlyphs[i] = (cMinChar + nGlyphDelta) & 0xFFFF; + } else { + // update the glyphid-array with the glyphs in this range + pStartGlyphs[i] = -(int)aGlyphIdArray.size(); + const unsigned char* pGlyphIdPtr = pOffsetBase + 2*i + nRangeOffset; + for( sal_uInt32 c = cMinChar; c <= cMaxChar; ++c, pGlyphIdPtr+=2 ) { + const int nGlyphIndex = GetUShort( pGlyphIdPtr ) + nGlyphDelta; + aGlyphIdArray.push_back( static_cast(nGlyphIndex) ); + } + } } nRangeCount = (pCP - pCodePairs) / 2; } @@ -604,6 +679,7 @@ bool ParseCMAP( const unsigned char* pCmap, int nLength, CmapResult& rResult ) nRangeCount = (pCP - pCodePairs) / 2; } + // check if any subtable resulted in something usable if( nRangeCount <= 0 ) { delete[] pCodePairs; @@ -617,8 +693,8 @@ bool ParseCMAP( const unsigned char* pCmap, int nLength, CmapResult& rResult ) pCodePairs[1] = 0x0100; pCodePairs[2] = 0xF020; // original symbols pCodePairs[3] = 0xF100; - rResult.mpPairCodes = pCodePairs; - rResult.mnPairCount = 2; + rResult.mpRangeCodes = pCodePairs; + rResult.mnRangeCount = 2; return true; } @@ -701,6 +777,7 @@ bool ParseCMAP( const unsigned char* pCmap, int nLength, CmapResult& rResult ) // glyph mapping for non-unicode fonts not implemented delete[] pStartGlyphs; pStartGlyphs = NULL; + aGlyphIdArray.clear(); // make a pCodePairs array using the vector from above delete[] pCodePairs; @@ -713,9 +790,23 @@ bool ParseCMAP( const unsigned char* pCmap, int nLength, CmapResult& rResult ) *(pCP++) = *itInt; } - rResult.mpPairCodes = pCodePairs; + // prepare the glyphid-array if needed + // TODO: merge ranges if they are close enough? + USHORT* pGlyphIds = NULL; + if( !aGlyphIdArray.empty()) + { + pGlyphIds = new USHORT[ aGlyphIdArray.size() ]; + USHORT* pOut = pGlyphIds; + U16Vector::const_iterator it = aGlyphIdArray.begin(); + while( it != aGlyphIdArray.end() ) + *(pOut++) = *(it++); + } + + // update the result struct + rResult.mpRangeCodes = pCodePairs; rResult.mpStartGlyphs = pStartGlyphs; - rResult.mnPairCount = nRangeCount; + rResult.mnRangeCount = nRangeCount; + rResult.mpGlyphIds = pGlyphIds; return true; } @@ -821,3 +912,4 @@ sal_uInt32 FontCharMap::GetCharFromIndex( int nIndex ) const } // ======================================================================= + diff --git a/vcl/source/gdi/outdev.cxx b/vcl/source/gdi/outdev.cxx index 0e9da9f81136..6298ff51a16a 100644 --- a/vcl/source/gdi/outdev.cxx +++ b/vcl/source/gdi/outdev.cxx @@ -68,6 +68,8 @@ #include #include #include +#include +#include #include #include @@ -1126,11 +1128,16 @@ namespace { inline int iround( float x ) { - sal_Int32 a = *reinterpret_cast(&x); - sal_Int32 exponent = (127 + 31) - ((a >> 23) & 0xFF); - sal_Int32 r = ((sal_Int32(a) << 8) | (1U << 31)) >> exponent; + union + { + float f; + sal_Int32 i; + }; + f = x; + sal_Int32 exponent = (127 + 31) - ((i >> 23) & 0xFF); + sal_Int32 r = ((sal_Int32(i) << 8) | (1U << 31)) >> exponent; r &= ((exponent - 32) >> 31); - sal_Int32 sign = a >> 31; + sal_Int32 sign = i >> 31; return r = (r ^ sign) - sign; } @@ -2285,8 +2292,35 @@ void OutputDevice::DrawLine( const Point& rStartPt, const Point& rEndPt ) if ( mbInitLineColor ) ImplInitLineColor(); - Point aStartPt = ImplLogicToDevicePixel( rStartPt ); - Point aEndPt = ImplLogicToDevicePixel( rEndPt ); + // #i101598# support AA and snap for lines, too + if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) + && mpGraphics->supportsOperation(OutDevSupport_B2DDraw) + && ROP_OVERPAINT == GetRasterOp() + && IsLineColor()) + { + // at least transform with double precision to device coordinates; this will + // avoid pixel snap of single, appended lines + const basegfx::B2DHomMatrix aTransform(ImplGetDeviceTransformation()); + const basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 ); + basegfx::B2DPolygon aB2DPolyLine; + + aB2DPolyLine.append(basegfx::B2DPoint(rStartPt.X(), rStartPt.Y())); + aB2DPolyLine.append(basegfx::B2DPoint(rEndPt.X(), rEndPt.Y())); + aB2DPolyLine.transform( aTransform ); + + if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE) + { + aB2DPolyLine = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyLine); + } + + if(mpGraphics->DrawPolyLine(aB2DPolyLine, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this)) + { + return; + } + } + + const Point aStartPt(ImplLogicToDevicePixel(rStartPt)); + const Point aEndPt(ImplLogicToDevicePixel(rEndPt)); mpGraphics->DrawLine( aStartPt.X(), aStartPt.Y(), aEndPt.X(), aEndPt.Y(), this ); @@ -2444,22 +2478,30 @@ void OutputDevice::DrawPolyLine( const Polygon& rPoly ) if ( mbInitLineColor ) ImplInitLineColor(); + const bool bTryAA((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) + && mpGraphics->supportsOperation(OutDevSupport_B2DDraw) + && ROP_OVERPAINT == GetRasterOp() + && IsLineColor()); + // use b2dpolygon drawing if possible - if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)) + if(bTryAA && ImpTryDrawPolyLineDirect(rPoly.getB2DPolygon(), 0.0, basegfx::B2DLINEJOIN_NONE)) { - ::basegfx::B2DPolygon aB2DPolyLine = rPoly.getB2DPolygon(); + basegfx::B2DPolygon aB2DPolyLine(rPoly.getB2DPolygon()); const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation(); - aB2DPolyLine.transform( aTransform ); const ::basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 ); - if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && (mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)) + // transform the polygon + aB2DPolyLine.transform( aTransform ); + + if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE) { - // #i98289# aB2DPolyLine = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyLine); } - if( mpGraphics->DrawPolyLine( aB2DPolyLine, aB2DLineWidth, basegfx::B2DLINEJOIN_ROUND, this ) ) + if(mpGraphics->DrawPolyLine(aB2DPolyLine, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this)) + { return; + } } Polygon aPoly = ImplLogicToDevicePixel( rPoly ); @@ -2499,9 +2541,23 @@ void OutputDevice::DrawPolyLine( const Polygon& rPoly, const LineInfo& rLineInfo return; } + // #i101491# + // Try direct Fallback to B2D-Version of DrawPolyLine + if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) + && LINE_SOLID == rLineInfo.GetStyle()) + { + DrawPolyLine(rPoly.getB2DPolygon(), (double)rLineInfo.GetWidth(), basegfx::B2DLINEJOIN_ROUND); + return; + } + if ( mpMetaFile ) mpMetaFile->AddAction( new MetaPolyLineAction( rPoly, rLineInfo ) ); + ImpDrawPolyLineWithLineInfo(rPoly, rLineInfo); +} + +void OutputDevice::ImpDrawPolyLineWithLineInfo(const Polygon& rPoly, const LineInfo& rLineInfo) +{ USHORT nPoints = rPoly.GetSize(); if ( !IsDeviceOutputNecessary() || !mbLineColor || ( nPoints < 2 ) || ( LINE_NONE == rLineInfo.GetStyle() ) || ImplIsRecordLayout() ) @@ -2527,6 +2583,10 @@ void OutputDevice::DrawPolyLine( const Polygon& rPoly, const LineInfo& rLineInfo return; const LineInfo aInfo( ImplLogicToDevicePixel( rLineInfo ) ); + const bool bTryAA((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) + && mpGraphics->supportsOperation(OutDevSupport_B2DDraw) + && ROP_OVERPAINT == GetRasterOp() + && IsLineColor()); if( aInfo.GetWidth() > 1L ) { @@ -2540,9 +2600,32 @@ void OutputDevice::DrawPolyLine( const Polygon& rPoly, const LineInfo& rLineInfo ImplInitLineColor(); SetFillColor( aOldLineColor ); ImplInitFillColor(); + bool bDone(false); - for( const Polygon* pPoly = aLineCvt.ImplGetFirst(); pPoly; pPoly = aLineCvt.ImplGetNext() ) - mpGraphics->DrawPolygon( pPoly->GetSize(), (const SalPoint*) pPoly->GetConstPointAry(), this ); + if(bTryAA) + { + // #i101491# try AAed version + // Use old on-the-fly geometry preparation, combine with AA + bool bSuccess(true); + + for(const Polygon* pPoly = aLineCvt.ImplGetFirst(); bSuccess && pPoly; pPoly = aLineCvt.ImplGetNext()) + { + bSuccess = mpGraphics->DrawPolyPolygon(basegfx::B2DPolyPolygon(pPoly->getB2DPolygon()), 0.0, this); + } + + if(bSuccess) + { + bDone = true; + } + } + + if(!bDone) + { + for( const Polygon* pPoly = aLineCvt.ImplGetFirst(); pPoly; pPoly = aLineCvt.ImplGetNext() ) + { + mpGraphics->DrawPolygon( pPoly->GetSize(), (const SalPoint*) pPoly->GetConstPointAry(), this ); + } + } SetLineColor( aOldLineColor ); SetFillColor( aOldFillColor ); @@ -2598,13 +2681,40 @@ void OutputDevice::DrawPolygon( const Polygon& rPoly ) ImplInitFillColor(); // use b2dpolygon drawing if possible - if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)) + if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) + && mpGraphics->supportsOperation(OutDevSupport_B2DDraw) + && ROP_OVERPAINT == GetRasterOp() + && (IsLineColor() || IsFillColor())) { - ::basegfx::B2DPolyPolygon aB2DPolyPolygon( rPoly.getB2DPolygon() ); const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation(); - aB2DPolyPolygon.transform( aTransform ); - if( mpGraphics->DrawPolyPolygon( aB2DPolyPolygon, 0.0, this ) ) + basegfx::B2DPolygon aB2DPolygon(rPoly.getB2DPolygon()); + bool bSuccess(true); + + // transform the polygon and ensure closed + aB2DPolygon.transform(aTransform); + aB2DPolygon.setClosed(true); + + if(IsFillColor()) + { + bSuccess = mpGraphics->DrawPolyPolygon(basegfx::B2DPolyPolygon(aB2DPolygon), 0.0, this); + } + + if(bSuccess && IsLineColor()) + { + const ::basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 ); + + if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE) + { + aB2DPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolygon); + } + + bSuccess = mpGraphics->DrawPolyLine(aB2DPolygon, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this); + } + + if(bSuccess) + { return; + } } Polygon aPoly = ImplLogicToDevicePixel( rPoly ); @@ -2661,13 +2771,43 @@ void OutputDevice::DrawPolyPolygon( const PolyPolygon& rPolyPoly ) ImplInitFillColor(); // use b2dpolygon drawing if possible - if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)) + if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) + && mpGraphics->supportsOperation(OutDevSupport_B2DDraw) + && ROP_OVERPAINT == GetRasterOp() + && (IsLineColor() || IsFillColor())) { - ::basegfx::B2DPolyPolygon aB2DPolyPolygon = rPolyPoly.getB2DPolyPolygon(); const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation(); - aB2DPolyPolygon.transform( aTransform ); - if( mpGraphics->DrawPolyPolygon( aB2DPolyPolygon, 0.0, this ) ) + basegfx::B2DPolyPolygon aB2DPolyPolygon(rPolyPoly.getB2DPolyPolygon()); + bool bSuccess(true); + + // transform the polygon and ensure closed + aB2DPolyPolygon.transform(aTransform); + aB2DPolyPolygon.setClosed(true); + + if(IsFillColor()) + { + bSuccess = mpGraphics->DrawPolyPolygon(aB2DPolyPolygon, 0.0, this); + } + + if(bSuccess && IsLineColor()) + { + const ::basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 ); + + if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE) + { + aB2DPolyPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyPolygon); + } + + for(sal_uInt32 a(0); bSuccess && a < aB2DPolyPolygon.count(); a++) + { + bSuccess = mpGraphics->DrawPolyLine(aB2DPolyPolygon.getB2DPolygon(a), aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this); + } + } + + if(bSuccess) + { return; + } } if ( nPoly == 1 ) @@ -2729,6 +2869,12 @@ void OutputDevice::DrawPolyPolygon( const basegfx::B2DPolyPolygon& rB2DPolyPoly mpMetaFile->AddAction( new MetaPolyPolygonAction( PolyPolygon( rB2DPolyPoly ) ) ); #endif + // call helper + ImpDrawPolyPolygonWithB2DPolyPolygon(rB2DPolyPoly); +} + +void OutputDevice::ImpDrawPolyPolygonWithB2DPolyPolygon(const basegfx::B2DPolyPolygon& rB2DPolyPoly) +{ // AW: Do NOT paint empty PolyPolygons if(!rB2DPolyPoly.count()) return; @@ -2748,13 +2894,43 @@ void OutputDevice::DrawPolyPolygon( const basegfx::B2DPolyPolygon& rB2DPolyPoly if( mbInitFillColor ) ImplInitFillColor(); - if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)) + if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) + && mpGraphics->supportsOperation(OutDevSupport_B2DDraw) + && ROP_OVERPAINT == GetRasterOp() + && (IsLineColor() || IsFillColor())) { - const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation(); - ::basegfx::B2DPolyPolygon aB2DPP = rB2DPolyPoly; - aB2DPP.transform( aTransform ); - if( mpGraphics->DrawPolyPolygon( aB2DPP, 0.0, this ) ) + const basegfx::B2DHomMatrix aTransform(ImplGetDeviceTransformation()); + basegfx::B2DPolyPolygon aB2DPolyPolygon(rB2DPolyPoly); + bool bSuccess(true); + + // transform the polygon and ensure closed + aB2DPolyPolygon.transform(aTransform); + aB2DPolyPolygon.setClosed(true); + + if(IsFillColor()) + { + bSuccess = mpGraphics->DrawPolyPolygon(aB2DPolyPolygon, 0.0, this); + } + + if(bSuccess && IsLineColor()) + { + const ::basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 ); + + if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE) + { + aB2DPolyPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyPolygon); + } + + for(sal_uInt32 a(0);bSuccess && a < aB2DPolyPolygon.count(); a++) + { + bSuccess = mpGraphics->DrawPolyLine(aB2DPolyPolygon.getB2DPolygon(a), aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this); + } + } + + if(bSuccess) + { return; + } } // fallback to old polygon drawing if needed @@ -2765,6 +2941,38 @@ void OutputDevice::DrawPolyPolygon( const basegfx::B2DPolyPolygon& rB2DPolyPoly // ----------------------------------------------------------------------- +bool OutputDevice::ImpTryDrawPolyLineDirect( + const basegfx::B2DPolygon& rB2DPolygon, + double fLineWidth, + basegfx::B2DLineJoin eLineJoin) +{ + const basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation(); + basegfx::B2DVector aB2DLineWidth(1.0, 1.0); + + // transform the line width if used + if( fLineWidth != 0.0 ) + { + aB2DLineWidth = aTransform * ::basegfx::B2DVector( fLineWidth, fLineWidth ); + } + + // transform the polygon + basegfx::B2DPolygon aB2DPolygon(rB2DPolygon); + aB2DPolygon.transform(aTransform); + + if((mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE) + && aB2DPolygon.count() < 1000) + { + // #i98289#, #i101491# + // better to remove doubles on device coordinates. Also assume from a given amount + // of points that the single edges are not long enough to smooth + aB2DPolygon.removeDoublePoints(); + aB2DPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolygon); + } + + // draw the polyline + return mpGraphics->DrawPolyLine(aB2DPolygon, aB2DLineWidth, eLineJoin, this); +} + void OutputDevice::DrawPolyLine( const basegfx::B2DPolygon& rB2DPolygon, double fLineWidth, @@ -2808,37 +3016,62 @@ void OutputDevice::DrawPolyLine( if( mbInitLineColor ) ImplInitLineColor(); - // #i98289# use b2dpolygon drawing if possible - if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)) + const bool bTryAA((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) + && mpGraphics->supportsOperation(OutDevSupport_B2DDraw) + && ROP_OVERPAINT == GetRasterOp() + && IsLineColor()); + + // use b2dpolygon drawing if possible + if(bTryAA && ImpTryDrawPolyLineDirect(rB2DPolygon, fLineWidth, eLineJoin)) { - const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation(); - ::basegfx::B2DVector aB2DLineWidth(1.0, 1.0); - - // transform the line width if used - if( fLineWidth != 0.0 ) - aB2DLineWidth = aTransform * ::basegfx::B2DVector( fLineWidth, fLineWidth ); - - // transform the polygon - ::basegfx::B2DPolygon aB2DPL = rB2DPolygon; - aB2DPL.transform( aTransform ); - - if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && (mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)) - { - // #i98289# - aB2DPL = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPL); - } - - // draw the polyline - if( mpGraphics->DrawPolyLine( aB2DPL, aB2DLineWidth, eLineJoin, this ) ) - return; + return; } - // fallback to old polygon drawing if needed + // #i101491# + // no output yet; fallback to geometry decomposition and use filled polygon paint + // when line is fat and not too complex. ImpDrawPolyPolygonWithB2DPolyPolygon + // will do internal needed AA checks etc. + if(fLineWidth >= 2.5 + && rB2DPolygon.count() + && rB2DPolygon.count() <= 1000) + { + const double fHalfLineWidth((fLineWidth * 0.5) + 0.5); + const basegfx::B2DPolyPolygon aAreaPolyPolygon(basegfx::tools::createAreaGeometry( + rB2DPolygon, fHalfLineWidth, eLineJoin)); + + const Color aOldLineColor(maLineColor); + const Color aOldFillColor(maFillColor); + + SetLineColor(); + ImplInitLineColor(); + SetFillColor(aOldLineColor); + ImplInitFillColor(); + + ImpDrawPolyPolygonWithB2DPolyPolygon(aAreaPolyPolygon); + + SetLineColor(aOldLineColor); + ImplInitLineColor(); + SetFillColor(aOldFillColor); + ImplInitFillColor(); + + if(bTryAA) + { + // when AA it is necessary to also paint the filled polygon's outline + // to avoid optical gaps + for(sal_uInt32 a(0); a < aAreaPolyPolygon.count(); a++) + { + ImpTryDrawPolyLineDirect(aAreaPolyPolygon.getB2DPolygon(a), 0.0, basegfx::B2DLINEJOIN_NONE); + } + } + } + + // fallback to old polygon drawing if needed. This will really + // use ImplLineConverter, but still try to AA lines const Polygon aToolsPolygon( rB2DPolygon ); LineInfo aLineInfo; if( fLineWidth != 0.0 ) aLineInfo.SetWidth( static_cast(fLineWidth+0.5) ); - DrawPolyLine( aToolsPolygon, aLineInfo ); + ImpDrawPolyLineWithLineInfo( aToolsPolygon, aLineInfo ); } // ----------------------------------------------------------------------- diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx index 537964582ceb..51aad0790a26 100644 --- a/vcl/source/gdi/outdev3.cxx +++ b/vcl/source/gdi/outdev3.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: outdev3.cxx,v $ - * $Revision: 1.240.14.5 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -59,14 +56,18 @@ #include #include #include -#include +#include #include #include -#include +#include #include +#include #ifndef _OSL_FILE_H #include #endif +#ifdef ENABLE_GRAPHITE +#include +#endif #include #include @@ -96,6 +97,7 @@ #include #include + // ======================================================================= DBG_NAMEEX( OutputDevice ) @@ -107,6 +109,7 @@ using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::rtl; using namespace ::vcl; +using namespace ::utl; // ======================================================================= @@ -304,451 +307,6 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists ) // ======================================================================= -struct ImplLocalizedFontName -{ - const char* mpEnglishName; - const sal_Unicode* mpLocalizedNames; -}; - -static sal_Unicode const aBatang[] = { 0xBC14, 0xD0D5, 0, 0 }; -static sal_Unicode const aBatangChe[] = { 0xBC14, 0xD0D5, 0xCCB4, 0, 0 }; -static sal_Unicode const aGungsuh[] = { 0xAD81, 0xC11C, 0, 0 }; -static sal_Unicode const aGungsuhChe[] = { 0xAD81, 0xC11C, 0xCCB4, 0, 0 }; -static sal_Unicode const aGulim[] = { 0xAD74, 0xB9BC, 0, 0 }; -static sal_Unicode const aGulimChe[] = { 0xAD74, 0xB9BC, 0xCCB4, 0, 0 }; -static sal_Unicode const aDotum[] = { 0xB3CB, 0xC6C0, 0, 0 }; -static sal_Unicode const aDotumChe[] = { 0xB3CB, 0xC6C0, 0xCCB4, 0, 0 }; -static sal_Unicode const aSimSun[] = { 0x5B8B, 0x4F53, 0, 0 }; -static sal_Unicode const aNSimSun[] = { 0x65B0, 0x5B8B, 0x4F53, 0, 0 }; -static sal_Unicode const aSimHei[] = { 0x9ED1, 0x4F53, 0, 0 }; -static sal_Unicode const aSimKai[] = { 0x6977, 0x4F53, 0, 0 }; -static sal_Unicode const azycjkSun[] = { 0x4E2D, 0x6613, 0x5B8B, 0x4F53, 0, 0 }; -static sal_Unicode const azycjkHei[] = { 0x4E2D, 0x6613, 0x9ED1, 0x4F53, 0, 0 }; -static sal_Unicode const azycjkKai[] = { 0x4E2D, 0x6613, 0x6977, 0x4F53, 0, 0 }; -static sal_Unicode const aFZHei[] = { 0x65B9, 0x6B63, 0x9ED1, 0x4F53, 0, 0 }; -static sal_Unicode const aFZKai[] = { 0x65B9, 0x6B63, 0x6977, 0x4F53, 0, 0 }; -static sal_Unicode const aFZSongYI[] = { 0x65B9, 0x6B63, 0x5B8B, 0x4E00, 0, 0 }; -static sal_Unicode const aFZShuSong[] = { 0x65B9, 0x6B63, 0x4E66, 0x5B8B, 0, 0 }; -static sal_Unicode const aFZFangSong[] = { 0x65B9, 0x6B63, 0x4EFF, 0x5B8B, 0, 0 }; -// Attention: this fonts includes the wrong encoding vector - so we double the names with correct and wrong encoding -// First one is the GB-Encoding (we think the correct one), second is the big5 encoded name -static sal_Unicode const aMHei[] = { 'm', 0x7B80, 0x9ED1, 0, 'm', 0x6F60, 0x7AAA, 0, 0 }; -static sal_Unicode const aMKai[] = { 'm', 0x7B80, 0x6977, 0x566C, 0, 'm', 0x6F60, 0x7FF1, 0x628E, 0, 0 }; -static sal_Unicode const aMSong[] = { 'm', 0x7B80, 0x5B8B, 0, 'm', 0x6F60, 0x51BC, 0, 0 }; -static sal_Unicode const aCFangSong[] = { 'm', 0x7B80, 0x592B, 0x5B8B, 0, 'm', 0x6F60, 0x6E98, 0x51BC, 0, 0 }; -static sal_Unicode const aMingLiU[] = { 0x7D30, 0x660E, 0x9AD4, 0, 0 }; -static sal_Unicode const aPMingLiU[] = { 0x65B0, 0x7D30, 0x660E, 0x9AD4, 0, 0 }; -static sal_Unicode const aHei[] = { 0x6865, 0, 0 }; -static sal_Unicode const aKai[] = { 0x6B61, 0, 0 }; -static sal_Unicode const aMing[] = { 0x6D69, 0x6E67, 0, 0 }; -static sal_Unicode const aMSGothic[] = { 'm','s', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0, 0 }; -static sal_Unicode const aMSPGothic[] = { 'm','s','p', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0, 0 }; -static sal_Unicode const aMSMincho[] = { 'm', 's', 0x660E, 0x671D, 0 }; -static sal_Unicode const aMSPMincho[] = { 'm','s','p', 0x660E, 0x671D, 0 }; -static sal_Unicode const aMeiryo[] = { 0x30e1, 0x30a4, 0x30ea, 0x30aa, 0 }; -static sal_Unicode const aHGMinchoL[] = { 'h','g', 0x660E, 0x671D, 'l', 0, 0 }; -static sal_Unicode const aHGGothicB[] = { 'h','g', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 'b', 0 }; -static sal_Unicode const aHGPMinchoL[] = { 'h','g','p', 0x660E, 0x671D, 'l', 0 }; -static sal_Unicode const aHGPGothicB[] = { 'h','g','p', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 'b', 0 }; -static sal_Unicode const aHGMinchoLSun[] = { 'h','g', 0x660E, 0x671D, 'l', 's', 'u', 'n', 0 }; -static sal_Unicode const aHGPMinchoLSun[] = { 'h','g','p', 0x660E, 0x671D, 'l', 's', 'u', 'n', 0 }; -static sal_Unicode const aHGGothicBSun[] = { 'h', 'g', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 'b', 's', 'u', 'n', 0 }; -static sal_Unicode const aHGPGothicBSun[] = { 'h', 'g', 'p', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 'b', 's', 'u', 'n', 0 }; -static sal_Unicode const aHGHeiseiMin[] = { 'h', 'g', 0x5E73, 0x6210, 0x660E, 0x671D, 0x4F53, 0, 'h', 'g', 0x5E73, 0x6210, 0x660E, 0x671D, 0x4F53, 'w', '3', 'x', '1', '2', 0, 0 }; -static sal_Unicode const aIPAMincho[] = { 'i', 'p', 'a', 0x660E, 0x671D, 0 }; -static sal_Unicode const aIPAPMincho[] = { 'i', 'p', 'a', 'p', 0x660E, 0x671D, 0 }; -static sal_Unicode const aIPAGothic[] = { 'i', 'p', 'a', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0 }; -static sal_Unicode const aIPAPGothic[] = { 'i', 'p', 'a', 'p', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0 }; -static sal_Unicode const aIPAUIGothic[] = { 'i', 'p', 'a', 'u', 'i', 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0 }; -static sal_Unicode const aSazanamiMincho[] = { 0x3055, 0x3056, 0x306A, 0x307F, 0x660E, 0x671D, 0, 0 }; -static sal_Unicode const aSazanamiGothic[] = { 0x3055, 0x3056, 0x306A, 0x307F, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0, 0 }; -static sal_Unicode const aKochiMincho[] = { 0x6771, 0x98A8, 0x660E, 0x671D, 0, 0 }; -static sal_Unicode const aKochiGothic[] = { 0x6771, 0x98A8, 0x30B4, 0x30B7, 0x30C3, 0x30AF, 0, 0 }; -static sal_Unicode const aSunDotum[] = { 0xC36C, 0xB3CB, 0xC6C0, 0, 0 }; -static sal_Unicode const aSunGulim[] = { 0xC36C, 0xAD74, 0xB9BC, 0, 0 }; -static sal_Unicode const aSunBatang[] = { 0xC36C, 0xBC14, 0xD0D5, 0, 0 }; -static sal_Unicode const aBaekmukDotum[] = { 0xBC31, 0xBB35, 0xB3CB, 0xC6C0, 0, 0 }; -static sal_Unicode const aBaekmukGulim[] = { 0xBC31, 0xBB35, 0xAD74, 0xB9BC, 0, 0 }; -static sal_Unicode const aBaekmukBatang[] = { 0xBC31, 0xBB35, 0xBC14, 0xD0D5, 0, 0 }; -static sal_Unicode const aFzMingTi[] = { 0x65B9, 0x6B63, 0x660E, 0x9AD4, 0, 0 }; -static sal_Unicode const aFzHeiTiTW[]= { 0x65B9, 0x6B63, 0x9ED1, 0x9AD4, 0, 0 }; -static sal_Unicode const aFzKaiTiTW[]= { 0x65B9, 0x6B63, 0x6977, 0x9AD4, 0, 0 }; -static sal_Unicode const aFzHeiTiCN[]= { 0x65B9, 0x6B63, 0x9ED1, 0x4F53, 0, 0 }; -static sal_Unicode const aFzKaiTiCN[]= { 0x65B9, 0x6B63, 0x6977, 0x4F53, 0, 0 }; -static sal_Unicode const aFzSongTi[] = { 0x65B9, 0x6B63, 0x5B8B, 0x4F53, 0, 0 }; -static sal_Unicode const aHYMyeongJoExtra[] = { 'h', 'y', 0xACAC, 0xBA85, 0xC870, 0, 0 }; -static sal_Unicode const aHYSinMyeongJoMedium[] = { 'h', 'y', 0xC2E0, 0xBA85, 0xC870, 0, 0 }; -static sal_Unicode const aHYGothicMedium[] = { 'h', 'y', 0xC911, 0xACE0, 0xB515, 0, 0 }; -static sal_Unicode const aHYGraphicMedium[] = { 'h', 'y', 0xADF8, 0xB798, 0xD53D, 'm', 0, 0 }; -static sal_Unicode const aHYGraphic[] = { 'h', 'y', 0xADF8, 0xB798, 0xD53D, 0, 0 }; -static sal_Unicode const aNewGulim[] = { 0xC0C8, 0xAD74, 0xB9BC, 0, 0 }; -static sal_Unicode const aSunGungseo[] = { 0xC36C, 0xAD81, 0xC11C, 0, 0 }; -static sal_Unicode const aHYGungSoBold[] = { 'h','y', 0xAD81, 0xC11C, 'b', 0, 0 }; -static sal_Unicode const aHYGungSo[] = { 'h','y', 0xAD81, 0xC11C, 0, 0 }; -static sal_Unicode const aSunHeadLine[] = { 0xC36C, 0xD5E4, 0xB4DC, 0xB77C, 0xC778, 0, 0 }; -static sal_Unicode const aHYHeadLineMedium[] = { 'h', 'y', 0xD5E4, 0xB4DC, 0xB77C, 0xC778, 'm', 0, 0 }; -static sal_Unicode const aHYHeadLine[] = { 'h', 'y', 0xD5E4, 0xB4DC, 0xB77C, 0xC778, 0, 0 }; -static sal_Unicode const aYetR[] = { 0xD734, 0xBA3C, 0xC61B, 0xCCB4, 0, 0 }; -static sal_Unicode const aHYGothicExtra[] = { 'h', 'y', 0xACAC, 0xACE0, 0xB515, 0, 0 }; -static sal_Unicode const aSunMokPan[] = { 0xC36C, 0xBAA9, 0xD310, 0, 0 }; -static sal_Unicode const aSunYeopseo[] = { 0xC36C, 0xC5FD, 0xC11C, 0, 0 }; -static sal_Unicode const aSunBaekSong[] = { 0xC36C, 0xBC31, 0xC1A1, 0, 0 }; -static sal_Unicode const aHYPostLight[] = { 'h', 'y', 0xC5FD, 0xC11C, 'l', 0, 0 }; -static sal_Unicode const aHYPost[] = { 'h', 'y', 0xC5FD, 0xC11C, 0, 0 }; -static sal_Unicode const aMagicR[] = { 0xD734, 0xBA3C, 0xB9E4, 0xC9C1, 0xCCB4, 0, 0 }; -static sal_Unicode const aSunCrystal[] = { 0xC36C, 0xD06C, 0xB9AC, 0xC2A4, 0xD0C8, 0, 0 }; -static sal_Unicode const aSunSaemmul[] = { 0xC36C, 0xC0D8, 0xBB3C, 0, 0 }; -static sal_Unicode const aHaansoftBatang[] = { 0xD55C, 0xCEF4, 0xBC14, 0xD0D5, 0, 0 }; -static sal_Unicode const aHaansoftDotum[] = { 0xD55C, 0xCEF4, 0xB3CB, 0xC6C0, 0, 0 }; -static sal_Unicode const aHyhaeseo[] = { 0xD55C, 0xC591, 0xD574, 0xC11C, 0, 0 }; -static sal_Unicode const aMDSol[] = { 'm', 'd', 0xC194, 0xCCB4, 0, 0 }; -static sal_Unicode const aMDGaesung[] = { 'm', 'd', 0xAC1C, 0xC131, 0xCCB4, 0, 0 }; -static sal_Unicode const aMDArt[] = { 'm', 'd', 0xC544, 0xD2B8, 0xCCB4, 0, 0 }; -static sal_Unicode const aMDAlong[] = { 'm', 'd', 0xC544, 0xB871, 0xCCB4, 0, 0 }; -static sal_Unicode const aMDEasop[] = { 'm', 'd', 0xC774, 0xC19D, 0xCCB4, 0, 0 }; -static sal_Unicode const aHYShortSamulMedium[] = { 'h', 'y', 0xC595, 0xC740, 0xC0D8, 0xBB3C, 'm', 0 }; -static sal_Unicode const aHYShortSamul[] = { 'h', 'y', 0xC595, 0xC740, 0xC0D8, 0xBB3C, 0 }; -static sal_Unicode const aHGGothicE[] = { 'h','g', 0xFF7A, 0xFF9E, 0xFF7C, 0xFF6F, 0xFF78, 'e', 0 }; -static sal_Unicode const aHGPGothicE[] = { 'h','g','p', 0xFF7A, 0xFF9E, 0xFF7C, 0xFF6F, 0xFF78, 'e', 0 }; -static sal_Unicode const aHGSGothicE[] = { 'h','g','s', 0xFF7A, 0xFF9E, 0xFF7C, 0xFF6F, 0xFF78, 'e', 0 }; -static sal_Unicode const aHGGothicM[] = { 'h','g', 0xFF7A, 0xFF9E, 0xFF7C, 0xFF6F, 0xFF78, 'm', 0 }; -static sal_Unicode const aHGPGothicM[] = { 'h','g','p', 0xFF7A, 0xFF9E, 0xFF7C, 0xFF6F, 0xFF78, 'm', 0 }; -static sal_Unicode const aHGSGothicM[] = { 'h','g','s', 0xFF7A, 0xFF9E, 0xFF7C, 0xFF6F, 0xFF78, 'm', 0 }; -static sal_Unicode const aHGGyoshotai[] = { 'h','g', 0x884C, 0x66F8, 0x4F53, 0 }; -static sal_Unicode const aHGPGyoshotai[] = { 'h','g','p', 0x884C, 0x66F8, 0x4F53, 0 }; -static sal_Unicode const aHGSGyoshotai[] = { 'h','g','s', 0x884C, 0x66F8, 0x4F53, 0 }; -static sal_Unicode const aHGKyokashotai[] = { 'h','g', 0x6559, 0x79D1, 0x66F8, 0x4F53, 0 }; -static sal_Unicode const aHGPKyokashotai[] = { 'h','g','p', 0x6559, 0x79D1, 0x66F8, 0x4F53, 0 }; -static sal_Unicode const aHGSKyokashotai[] = { 'h','g','s', 0x6559, 0x79D1, 0x66F8, 0x4F53, 0 }; -static sal_Unicode const aHGMinchoB[] = { 'h','g', 0x660E, 0x671D, 'b', 0 }; -static sal_Unicode const aHGPMinchoB[] = { 'h','g','p', 0x660E, 0x671D, 'b', 0 }; -static sal_Unicode const aHGSMinchoB[] = { 'h','g','s', 0x660E, 0x671D, 'b', 0 }; -static sal_Unicode const aHGMinchoE[] = { 'h','g', 0x660E, 0x671D, 'e', 0 }; -static sal_Unicode const aHGPMinchoE[] = { 'h','g','p', 0x660E, 0x671D, 'e', 0 }; -static sal_Unicode const aHGSMinchoE[] = { 'h','g','s', 0x660E, 0x671D, 'e', 0 }; -static sal_Unicode const aHGSoeiKakupoptai[] = { 'h','g', 0x5275,0x82F1,0x89D2,0xFF8E, - 0xFF9F,0xFF6F,0xFF8C,0xFF9F,0x4F53,0}; -static sal_Unicode const aHGPSoeiKakupoptai[] = { 'h','g', 'p', 0x5275,0x82F1,0x89D2,0xFF8E, - 0xFF9F,0xFF6F,0xFF8C,0xFF9F,0x4F53,0}; -static sal_Unicode const aHGSSoeiKakupoptai[] = { 'h','g', 's', 0x5275,0x82F1,0x89D2,0xFF8E, - 0xFF9F,0xFF6F,0xFF8C,0xFF9F,0x4F53,0}; -static sal_Unicode const aHGSoeiPresenceEB[] = { 'h','g', 0x5275,0x82F1,0xFF8C,0xFF9F, - 0xFF9A,0xFF7E,0xFF9E,0xFF9D,0xFF7D, 'e','b',0}; -static sal_Unicode const aHGPSoeiPresenceEB[] = { 'h','g','p', 0x5275,0x82F1,0xFF8C,0xFF9F, - 0xFF9A,0xFF7E,0xFF9E,0xFF9D,0xFF7D, 'e','b',0}; -static sal_Unicode const aHGSSoeiPresenceEB[] = { 'h','g','s', 0x5275,0x82F1,0xFF8C,0xFF9F, - 0xFF9A,0xFF7E,0xFF9E,0xFF9D,0xFF7D, 'e','b',0}; -static sal_Unicode const aHGSoeiKakugothicUB[] = { 'h','g', 0x5275,0x82F1,0x89D2,0xFF7A, - 0xFF9E,0xFF7C,0xFF6F,0xFF78,'u','b',0}; -static sal_Unicode const aHGPSoeiKakugothicUB[] = { 'h','g','p', 0x5275,0x82F1,0x89D2,0xFF7A, - 0xFF9E,0xFF7C,0xFF6F,0xFF78,'u','b',0}; -static sal_Unicode const aHGSSoeiKakugothicUB[] = { 'h','g','s', 0x5275,0x82F1,0x89D2,0xFF7A, - 0xFF9E,0xFF7C,0xFF6F,0xFF78,'u','b',0}; -static sal_Unicode const aHGSeikaishotaiPRO[] = { 'h','g', 0x6B63,0x6977,0x66F8,0x4F53, '-','p','r','o',0}; -static sal_Unicode const aHGMaruGothicMPRO[] = { 'h','g', 0x4E38,0xFF7A,0xFF9E,0xFF7C,0xFF6F,0xFF78, '-','p','r','o',0}; -static sal_Unicode const aHiraginoMinchoPro[] = { 0x30D2, 0x30E9, 0x30AE, 0x30CE, 0x660E, 0x671D, 'p','r','o',0}; -static sal_Unicode const aHiraginoMinchoProN[] = { 0x30D2, 0x30E9, 0x30AE, 0x30CE, 0x660E, 0x671D, 'p','r','o','n',0}; -static sal_Unicode const aHiraginoKakuGothicPro[] = { 0x30D2, 0x30E9, 0x30AE, 0x30CE, 0x89D2, 0x30B4, 'p','r','o',0}; -static sal_Unicode const aHiraginoKakuGothicProN[] = { 0x30D2, 0x30E9, 0x30AE, 0x30CE, 0x89D2, 0x30B4, 'p','r','o','n',0}; -static sal_Unicode const aHiraginoMaruGothicPro[] = { 0x30D2, 0x30E9, 0x30AE, 0x30CE, 0x4E38, 0x30B4, 'p','r','o',0}; -static sal_Unicode const aHiraginoMaruGothicProN[] = { 0x30D2, 0x30E9, 0x30AE, 0x30CE, 0x4E38, 0x30B4, 'p','r','o','n',0}; - - -static ImplLocalizedFontName aImplLocalizedNamesList[] = -{ -{ "batang", aBatang }, -{ "batangche", aBatangChe }, -{ "gungshu", aGungsuh }, -{ "gungshuche", aGungsuhChe }, -{ "gulim", aGulim }, -{ "gulimche", aGulimChe }, -{ "dotum", aDotum }, -{ "dotumche", aDotumChe }, -{ "simsun", aSimSun }, -{ "nsimsun", aNSimSun }, -{ "simhei", aSimHei }, -{ "simkai", aSimKai }, -{ "zycjksun", azycjkSun }, -{ "zycjkhei", azycjkHei }, -{ "zycjkkai", azycjkKai }, -{ "fzhei", aFZHei }, -{ "fzkai", aFZKai }, -{ "fzsong", aFZSongYI }, -{ "fzshusong", aFZShuSong }, -{ "fzfangsong", aFZFangSong }, -{ "mhei", aMHei }, -{ "mkai", aMKai }, -{ "msong", aMSong }, -{ "cfangsong", aCFangSong }, -{ "mingliu", aMingLiU }, -{ "pmingliu", aPMingLiU }, -{ "hei", aHei }, -{ "kai", aKai }, -{ "ming", aMing }, -{ "msgothic", aMSGothic }, -{ "mspgothic", aMSPGothic }, -{ "msmincho", aMSMincho }, -{ "mspmincho", aMSPMincho }, -{ "meiryo", aMeiryo }, -{ "hgminchol", aHGMinchoL }, -{ "hggothicb", aHGGothicB }, -{ "hgpminchol", aHGPMinchoL }, -{ "hgpgothicb", aHGPGothicB }, -{ "hgmincholsun", aHGMinchoLSun }, -{ "hggothicbsun", aHGGothicBSun }, -{ "hgpmincholsun", aHGPMinchoLSun }, -{ "hgpgothicbsun", aHGPGothicBSun }, -{ "hgheiseimin", aHGHeiseiMin }, -{ "ipamincho", aIPAMincho }, -{ "ipapmincho", aIPAPMincho }, -{ "ipagothic", aIPAGothic }, -{ "ipapgothic", aIPAPGothic }, -{ "ipauigothic", aIPAUIGothic }, -{ "sazanamimincho", aSazanamiMincho }, -{ "sazanamigothic", aSazanamiGothic }, -{ "kochimincho", aKochiMincho }, -{ "kochigothic", aKochiGothic }, -{ "sundotum", aSunDotum }, -{ "sungulim", aSunGulim }, -{ "sunbatang", aSunBatang }, -{ "baekmukdotum", aBaekmukDotum }, -{ "baekmukgulim", aBaekmukGulim }, -{ "baekmukbatang", aBaekmukBatang }, -{ "fzheiti", aFzHeiTiCN }, -{ "fzheiti", aFzHeiTiTW }, -{ "fzkaiti", aFzKaiTiCN }, -{ "fzkaitib", aFzKaiTiTW }, -{ "fzmingtib", aFzMingTi }, -{ "fzsongti", aFzSongTi }, -{ "hymyeongjoextra", aHYMyeongJoExtra }, -{ "hysinmyeongjomedium", aHYSinMyeongJoMedium }, -{ "hygothicmedium", aHYGothicMedium }, -{ "hygraphicmedium", aHYGraphicMedium }, -{ "hygraphic", aHYGraphic }, -{ "newgulim", aNewGulim }, -{ "sungungseo", aSunGungseo }, -{ "hygungsobold", aHYGungSoBold }, -{ "hygungso", aHYGungSo }, -{ "sunheadline", aSunHeadLine }, -{ "hyheadlinemedium", aHYHeadLineMedium }, -{ "hyheadline", aHYHeadLine }, -{ "yetr", aYetR }, -{ "hygothicextra", aHYGothicExtra }, -{ "sunmokpan", aSunMokPan }, -{ "sunyeopseo", aSunYeopseo }, -{ "sunbaeksong", aSunBaekSong }, -{ "hypostlight", aHYPostLight }, -{ "hypost", aHYPost }, -{ "magicr", aMagicR }, -{ "suncrystal", aSunCrystal }, -{ "sunsaemmul", aSunSaemmul }, -{ "hyshortsamulmedium", aHYShortSamulMedium }, -{ "hyshortsamul", aHYShortSamul }, -{ "haansoftbatang", aHaansoftBatang }, -{ "haansoftdotum", aHaansoftDotum }, -{ "hyhaeseo", aHyhaeseo }, -{ "mdsol", aMDSol }, -{ "mdgaesung", aMDGaesung }, -{ "mdart", aMDArt }, -{ "mdalong", aMDAlong }, -{ "mdeasop", aMDEasop }, -{ "hggothice", aHGGothicE }, -{ "hgpgothice", aHGPGothicE }, -{ "hgpothice", aHGSGothicE }, -{ "hggothicm", aHGGothicM }, -{ "hgpgothicm", aHGPGothicM }, -{ "hgpgothicm", aHGSGothicM }, -{ "hggyoshotai", aHGGyoshotai }, -{ "hgpgyoshotai", aHGPGyoshotai }, -{ "hgsgyoshotai", aHGSGyoshotai }, -{ "hgkyokashotai", aHGKyokashotai }, -{ "hgpkyokashotai", aHGPKyokashotai }, -{ "hgskyokashotai", aHGSKyokashotai }, -{ "hgminchob", aHGMinchoB }, -{ "hgpminchob", aHGPMinchoB }, -{ "hgsminchob", aHGSMinchoB }, -{ "hgminchoe", aHGMinchoE }, -{ "hgpminchoe", aHGPMinchoE }, -{ "hgsminchoe", aHGSMinchoE }, -{ "hgsoeikakupoptai", aHGSoeiKakupoptai }, -{ "hgpsoeikakupopta", aHGPSoeiKakupoptai }, -{ "hgssoeikakupopta", aHGSSoeiKakupoptai }, -{ "hgsoeipresenceeb", aHGSoeiPresenceEB }, -{ "hgpsoeipresenceeb", aHGPSoeiPresenceEB }, -{ "hgssoeipresenceeb", aHGSSoeiPresenceEB }, -{ "hgsoeikakugothicub", aHGSoeiKakugothicUB }, -{ "hgpsoeikakugothicub", aHGPSoeiKakugothicUB }, -{ "hgssoeikakugothicub", aHGSSoeiKakugothicUB }, -{ "hgseikaishotaipro", aHGSeikaishotaiPRO }, -{ "hgmarugothicmpro", aHGMaruGothicMPRO }, -{ "hiraginominchopro", aHiraginoMinchoPro }, -{ "hiraginominchopron", aHiraginoMinchoProN }, -{ "hiraginokakugothicpro", aHiraginoKakuGothicPro }, -{ "hiraginokakugothicpron", aHiraginoKakuGothicProN }, -{ "hiraginomarugothicpro", aHiraginoMaruGothicPro }, -{ "hiraginomarugothicpron", aHiraginoMaruGothicProN }, -{ NULL, NULL }, -}; - -// ----------------------------------------------------------------------- - -void ImplGetEnglishSearchFontName( String& rName ) -{ - bool bNeedTranslation = false; - xub_StrLen nLen = rName.Len(); - - // Remove trailing whitespaces - xub_StrLen i = nLen; - while ( i && (rName.GetChar( i-1 ) < 32) ) - i--; - if ( i != nLen ) - rName.Erase( i ); - - // Remove Script at the end - // Scriptname must be the last part of the fontname and - // looks like "fontname (scriptname)". So there can only be a - // script name at the and of the fontname, when the last char is ')' - if ( (nLen >= 3) && rName.GetChar( nLen-1 ) == ')' ) - { - int nOpen = 1; - xub_StrLen nTempLen = nLen-2; - while ( nTempLen ) - { - if ( rName.GetChar( nTempLen ) == '(' ) - { - nOpen--; - if ( !nOpen ) - { - // Remove Space at the end - if ( nTempLen && (rName.GetChar( nTempLen-1 ) == ' ') ) - nTempLen--; - rName.Erase( nTempLen ); - nLen = nTempLen; - break; - } - } - if ( rName.GetChar( nTempLen ) == ')' ) - nOpen++; - nTempLen--; - } - } - - // remove all whitespaces and converts to lower case ASCII - // TODO: better transliteration to ASCII e.g. all digits - i = 0; - while ( i < nLen ) - { - sal_Unicode c = rName.GetChar( i ); - if ( c > 127 ) - { - // Translate to Lowercase-ASCII - // FullWidth-ASCII to half ASCII - if ( (c >= 0xFF00) && (c <= 0xFF5E) ) - { - c -= 0xFF00-0x0020; - // Upper to Lower - if ( (c >= 'A') && (c <= 'Z') ) - c += 'a' - 'A'; - rName.SetChar( i, c ); - } - else - { - // Only Fontnames with None-Ascii-Characters must be translated - bNeedTranslation = true; - } - } - // not lowercase Ascii - else if ( !((c >= 'a') && (c <= 'z')) ) - { - // To Lowercase-Ascii - if ( (c >= 'A') && (c <= 'Z') ) - { - c += 'a' - 'A'; - rName.SetChar( i, c ); - } - else if( ((c < '0') || (c > '9')) && (c != ';') ) // not 0-9 or semicolon - { - // Remove white spaces and special characters - rName.Erase( i, 1 ); - nLen--; - continue; - } - } - - i++; - } - - // translate normalized localized name to its normalized English ASCII name - if( bNeedTranslation ) - { - typedef std::hash_map FontNameDictionary; - static FontNameDictionary aDictionary( sizeof(aImplLocalizedNamesList) / sizeof(*aImplLocalizedNamesList) ); - // the font name dictionary needs to be intialized once - if( aDictionary.empty() ) - { - // TODO: check if all dictionary entries are already normalized? - const ImplLocalizedFontName* pList = aImplLocalizedNamesList; - for(; pList->mpEnglishName; ++pList ) - aDictionary[ pList->mpLocalizedNames ] = pList->mpEnglishName; - } - - FontNameDictionary::const_iterator it = aDictionary.find( rName ); - if( it != aDictionary.end() ) - rName.AssignAscii( it->second ); - } -} - -// ----------------------------------------------------------------------- - -static String GetNextFontToken( const String& rTokenStr, xub_StrLen& rIndex ) -{ - // check for valid start index - int nStringLen = rTokenStr.Len(); - if( rIndex >= nStringLen ) - { - rIndex = STRING_NOTFOUND; - return String(); - } - - // find the next token delimiter and return the token substring - const sal_Unicode* pStr = rTokenStr.GetBuffer() + rIndex; - const sal_Unicode* pEnd = rTokenStr.GetBuffer() + nStringLen; - for(; pStr < pEnd; ++pStr ) - if( (*pStr == ';') || (*pStr == ',') ) - break; - - xub_StrLen nTokenStart = rIndex; - xub_StrLen nTokenLen; - if( pStr < pEnd ) - { - rIndex = sal::static_int_cast(pStr - rTokenStr.GetBuffer()); - nTokenLen = rIndex - nTokenStart; - ++rIndex; // skip over token separator - } - else - { - // no token delimiter found => handle last token - rIndex = STRING_NOTFOUND; - nTokenLen = STRING_LEN; - - // optimize if the token string consists of just one token - if( !nTokenStart ) - return rTokenStr; - } - - return String( rTokenStr, nTokenStart, nTokenLen ); -} - -// TODO: get rid of this in another incompatible build with SW project. -// SW's WW8 and RTF filters still use this (from fontcvt.hxx) -String GetFontToken( const String& rTokenStr, xub_StrLen nToken, xub_StrLen& rIndex ) -{ - // skip nToken Tokens - for( xub_StrLen i = 0; (i < nToken) && (rIndex != STRING_NOTFOUND); ++i ) - GetNextFontToken( rTokenStr, rIndex ); - - return GetNextFontToken( rTokenStr, rIndex ); -} // ======================================================================= @@ -812,8 +370,8 @@ ImplFontSubstEntry::ImplFontSubstEntry( const String& rFontName, { maSearchName = rFontName; maSearchReplaceName = rSubstFontName; - ImplGetEnglishSearchFontName( maSearchName ); - ImplGetEnglishSearchFontName( maSearchReplaceName ); + GetEnglishSearchFontName( maSearchName ); + GetEnglishSearchFontName( maSearchReplaceName ); } // ----------------------------------------------------------------------- @@ -913,7 +471,7 @@ static void ImplFontSubstitute( String& rFontName, { #ifdef DBG_UTIL String aTempName = rFontName; - ImplGetEnglishSearchFontName( aTempName ); + GetEnglishSearchFontName( aTempName ); DBG_ASSERT( aTempName == rFontName, "ImplFontSubstitute() called without a searchname" ); #endif @@ -938,44 +496,6 @@ static void ImplFontSubstitute( String& rFontName, } } -// ======================================================================= - -static bool ImplIsFontToken( const String& rName, const String& rToken ) -{ - String aTempName; - xub_StrLen nIndex = 0; - do - { - aTempName = GetNextFontToken( rName, nIndex ); - if ( rToken == aTempName ) - return true; - } - while ( nIndex != STRING_NOTFOUND ); - - return false; -} - -// ----------------------------------------------------------------------- - -static void ImplAppendFontToken( String& rName, const String& rNewToken ) -{ - if ( rName.Len() ) - { - rName.Append( ';' ); - rName.Append( rNewToken ); - } - else - rName = rNewToken; -} - -// ----------------------------------------------------------------------- - -static void ImplAddTokenFontName( String& rName, const String& rNewToken ) -{ - if ( !ImplIsFontToken( rName, rNewToken ) ) - ImplAppendFontToken( rName, rNewToken ); -} - // ----------------------------------------------------------------------- Font OutputDevice::GetDefaultFont( USHORT nType, LanguageType eLang, @@ -993,7 +513,7 @@ Font OutputDevice::GetDefaultFont( USHORT nType, LanguageType eLang, MsLangId::convertLanguageToLocale( eLang, aLocale ); } - DefaultFontConfiguration& rDefaults = *DefaultFontConfiguration::get(); + utl::DefaultFontConfiguration& rDefaults = *utl::DefaultFontConfiguration::get(); String aSearch = rDefaults.getUserInterfaceFont( aLocale ); // ensure a fallback String aDefault = rDefaults.getDefaultFont( aLocale, nType ); if( aDefault.Len() ) @@ -1072,11 +592,11 @@ Font OutputDevice::GetDefaultFont( USHORT nType, LanguageType eLang, do { aSearchName = GetNextFontToken( aSearch, nIndex ); - ImplGetEnglishSearchFontName( aSearchName ); + GetEnglishSearchFontName( aSearchName ); ImplDevFontListData* pFontFamily = pOutDev->mpFontList->ImplFindBySearchName( aSearchName ); if( pFontFamily ) { - ImplAddTokenFontName( aName, pFontFamily->GetFamilyName() ); + AddTokenFontName( aName, pFontFamily->GetFamilyName() ); if( nFlags & DEFAULTFONT_FLAGS_ONLYONE ) break; } @@ -1176,61 +696,6 @@ Font OutputDevice::GetDefaultFont( USHORT nType, LanguageType eLang, // ======================================================================= -String GetSubsFontName( const String& rName, ULONG nFlags ) -{ - String aName; - - xub_StrLen nIndex = 0; - String aOrgName = GetNextFontToken( rName, nIndex ); - ImplGetEnglishSearchFontName( aOrgName ); - - // #93662# do not try to replace StarSymbol with MS only font - if( nFlags == (SUBSFONT_MS|SUBSFONT_ONLYONE) - && ( aOrgName.EqualsAscii( "starsymbol" ) - || aOrgName.EqualsAscii( "opensymbol" ) ) ) - return aName; - - const FontNameAttr* pAttr = FontSubstConfiguration::get()->getSubstInfo( aOrgName ); - if ( pAttr ) - { - for( int i = 0; i < 3; i++ ) - { - const ::std::vector< String >* pVector = NULL; - switch( i ) - { - case 0: - if( nFlags & SUBSFONT_MS && pAttr->MSSubstitutions.size() ) - pVector = &pAttr->MSSubstitutions; - break; - case 1: - if( nFlags & SUBSFONT_PS && pAttr->PSSubstitutions.size() ) - pVector = &pAttr->PSSubstitutions; - break; - case 2: - if( nFlags & SUBSFONT_HTML && pAttr->HTMLSubstitutions.size() ) - pVector = &pAttr->HTMLSubstitutions; - break; - } - if( ! pVector ) - continue; - for( ::std::vector< String >::const_iterator it = pVector->begin(); it != pVector->end(); ++it ) - if( ! ImplIsFontToken( rName, *it ) ) - { - ImplAppendFontToken( aName, *it ); - if( nFlags & SUBSFONT_ONLYONE ) - { - i = 4; - break; - } - } - } - } - - return aName; -} - -// ======================================================================= - static unsigned ImplIsCJKFont( const String& rFontName ) { // Test, if Fontname includes CJK characters --> In this case we @@ -1695,7 +1160,7 @@ bool ImplDevFontListData::AddFontFace( ImplFontData* pNewData ) // ----------------------------------------------------------------------- // get font attributes using the normalized font family name -void ImplDevFontListData::InitMatchData( const vcl::FontSubstConfiguration& rFontSubst, +void ImplDevFontListData::InitMatchData( const utl::FontSubstConfiguration& rFontSubst, const String& rSearchName ) { String aShortName; @@ -1834,29 +1299,6 @@ void ImplDevFontList::Clear() mbMatchData = false; } -// ----------------------------------------------------------------------- - -// TODO: use a more generic String hash -int FontNameHash::operator()( const String& rStr ) const -{ - // this simple hash just has to be good enough for font names - int nHash = 0; - const int nLen = rStr.Len(); - const sal_Unicode* p = rStr.GetBuffer(); - switch( nLen ) - { - default: nHash = (p[0]<<16) - (p[1]<<8) + p[2]; - nHash += nLen; - p += nLen - 3; - // fall through - case 3: nHash += (p[2]<<16); // fall through - case 2: nHash += (p[1]<<8); // fall through - case 1: nHash += p[0]; // fall through - case 0: break; - }; - - return nHash; -} // ----------------------------------------------------------------------- @@ -2003,7 +1445,7 @@ ImplDevFontListData* ImplDevFontList::GetGlyphFallbackFont( ImplFontSelectData& // call the hook to query the best matching glyph fallback font if( mpFallbackHook->FindFontSubstitute( rFontSelData, rMissingCodes ) ) // apply outdev3.cxx specific fontname normalization - ImplGetEnglishSearchFontName( rFontSelData.maSearchName ); + GetEnglishSearchFontName( rFontSelData.maSearchName ); else rFontSelData.maSearchName = String(); @@ -2058,7 +1500,7 @@ void ImplDevFontList::Add( ImplFontData* pNewData ) for( xub_StrLen nMapNameIndex = 0; nMapNameIndex != STRING_NOTFOUND; ) { String aSearchName = pNewData->maName; - ImplGetEnglishSearchFontName( aSearchName ); + GetEnglishSearchFontName( aSearchName ); DevFontList::const_iterator it = maDevFontList.find( aSearchName ); ImplDevFontListData* pFoundData = NULL; @@ -2095,7 +1537,7 @@ ImplDevFontListData* ImplDevFontList::ImplFindBySearchName( const String& rSearc { #ifdef DEBUG String aTempName = rSearchName; - ImplGetEnglishSearchFontName( aTempName ); + GetEnglishSearchFontName( aTempName ); DBG_ASSERT( aTempName == rSearchName, "ImplDevFontList::ImplFindBySearchName() called with non-normalized name" ); #endif @@ -2150,7 +1592,7 @@ ImplDevFontListData* ImplDevFontList::FindFontFamily( const String& rFontName ) { // normalize the font fomily name and String aName = rFontName; - ImplGetEnglishSearchFontName( aName ); + GetEnglishSearchFontName( aName ); ImplDevFontListData* pFound = ImplFindBySearchName( aName ); return pFound; } @@ -2167,7 +1609,7 @@ ImplDevFontListData* ImplDevFontList::ImplFindByTokenNames( const String& rToken String aSearchName = GetNextFontToken( rTokenStr, nTokenPos ); if( !aSearchName.Len() ) continue; - ImplGetEnglishSearchFontName( aSearchName ); + GetEnglishSearchFontName( aSearchName ); pFoundData = ImplFindBySearchName( aSearchName ); if( pFoundData ) break; @@ -2178,7 +1620,7 @@ ImplDevFontListData* ImplDevFontList::ImplFindByTokenNames( const String& rToken // ----------------------------------------------------------------------- -ImplDevFontListData* ImplDevFontList::ImplFindBySubstFontAttr( const vcl::FontNameAttr& rFontAttr ) const +ImplDevFontListData* ImplDevFontList::ImplFindBySubstFontAttr( const utl::FontNameAttr& rFontAttr ) const { ImplDevFontListData* pFoundData = NULL; @@ -2187,7 +1629,7 @@ ImplDevFontListData* ImplDevFontList::ImplFindBySubstFontAttr( const vcl::FontNa for(; it != rFontAttr.Substitutions.end(); ++it ) { String aSearchName( *it ); - ImplGetEnglishSearchFontName( aSearchName ); + GetEnglishSearchFontName( aSearchName ); pFoundData = ImplFindBySearchName( aSearchName ); if( pFoundData ) @@ -2750,6 +2192,14 @@ size_t ImplFontCache::IFSD_Hash::operator()( const ImplFontSelectData& rFSD ) co // TODO: does it pay off to improve this hash function? static FontNameHash aFontNameHash; size_t nHash = aFontNameHash( rFSD.maSearchName ); +#ifdef ENABLE_GRAPHITE + // check for features and generate a unique hash if necessary + if (rFSD.maTargetName.Search(grutils::GrFeatureParser::FEAT_PREFIX) + != STRING_NOTFOUND) + { + nHash = aFontNameHash( rFSD.maTargetName ); + } +#endif nHash += 11 * rFSD.mnHeight; nHash += 19 * rFSD.meWeight; nHash += 29 * rFSD.meItalic; @@ -2801,6 +2251,15 @@ bool ImplFontCache::IFSD_Equal::operator()(const ImplFontSelectData& rA, const I return false; } +#ifdef ENABLE_GRAPHITE + // check for features + if ((rA.maTargetName.Search(grutils::GrFeatureParser::FEAT_PREFIX) + != STRING_NOTFOUND || + rB.maTargetName.Search(grutils::GrFeatureParser::FEAT_PREFIX) + != STRING_NOTFOUND) && rA.maTargetName != rB.maTargetName) + return false; +#endif + return true; } @@ -2838,7 +2297,12 @@ ImplFontEntry* ImplFontCache::GetFontEntry( ImplDevFontList* pFontList, // if it is already known get its normalized search name FontNameList::const_iterator it_name = maFontNameList.find( aSearchName ); if( it_name != maFontNameList.end() ) - if( !(*it_name).second.EqualsAscii( "hg", 0, 2) ) + if( !(*it_name).second.EqualsAscii( "hg", 0, 2) +#ifdef ENABLE_GRAPHITE + && (aSearchName.Search(grutils::GrFeatureParser::FEAT_PREFIX) + == STRING_NOTFOUND) +#endif + ) aSearchName = (*it_name).second; } @@ -2911,7 +2375,7 @@ ImplFontEntry* ImplFontCache::GetFontEntry( ImplDevFontList* pFontList, // if we found a different symbol font we need a symbol conversion table if( pFontData->IsSymbolFont() ) if( aFontSelData.maTargetName != aFontSelData.maSearchName ) - pEntry->mpConversion = ImplGetRecodeData( aFontSelData.maTargetName, aFontSelData.maSearchName ); + pEntry->mpConversion = ConvertChar::GetRecodeData( aFontSelData.maTargetName, aFontSelData.maSearchName ); // add the new entry to the cache maFontInstanceList[ aFontSelData ] = pEntry; @@ -2943,7 +2407,23 @@ ImplDevFontListData* ImplDevFontList::ImplFindByFont( ImplFontSelectData& rFSD, { rFSD.maTargetName = GetNextFontToken( rFSD.maName, nTokenPos ); aSearchName = rFSD.maTargetName; - ImplGetEnglishSearchFontName( aSearchName ); + +#ifdef ENABLE_GRAPHITE + // Until features are properly supported, they are appended to the + // font name, so we need to strip them off so the font is found. + xub_StrLen nFeat = aSearchName.Search(grutils::GrFeatureParser::FEAT_PREFIX); + String aOrigName = rFSD.maTargetName; + String aBaseFontName(aSearchName, 0, (nFeat != STRING_NOTFOUND)?nFeat:aSearchName.Len()); + if (nFeat != STRING_NOTFOUND && STRING_NOTFOUND != + aSearchName.Search(grutils::GrFeatureParser::FEAT_ID_VALUE_SEPARATOR, nFeat)) + { + aSearchName = aBaseFontName; + rFSD.maTargetName = aBaseFontName; + } + +#endif + + GetEnglishSearchFontName( aSearchName ); ImplFontSubstitute( aSearchName, nSubstFlags, pDevSpecific ); // #114999# special emboldening for Ricoh fonts // TODO: smarter check for special cases by using PreMatch infrastructure? @@ -2973,6 +2453,10 @@ ImplDevFontListData* ImplDevFontList::ImplFindByFont( ImplFontSelectData& rFSD, } } +#ifdef ENABLE_GRAPHITE + // restore the features to make the font selection data unique + rFSD.maTargetName = aOrigName; +#endif // check if the current font name token or its substitute is valid ImplDevFontListData* pFoundData = ImplFindBySearchName( aSearchName ); if( pFoundData ) @@ -2981,16 +2465,21 @@ ImplDevFontListData* ImplDevFontList::ImplFindByFont( ImplFontSelectData& rFSD, // some systems provide special customization // e.g. they suggest "serif" as UI-font, but this name cannot be used directly // because the system wants to map it to another font first, e.g. "Helvetica" +#ifdef ENABLE_GRAPHITE + // use the target name to search in the prematch hook + rFSD.maTargetName = aBaseFontName; +#endif if( mpPreMatchHook ) - { if( mpPreMatchHook->FindFontSubstitute( rFSD ) ) - { - ImplGetEnglishSearchFontName( aSearchName ); - pFoundData = ImplFindBySearchName( aSearchName ); - if( pFoundData ) - return pFoundData; - } - } + GetEnglishSearchFontName( aSearchName ); +#ifdef ENABLE_GRAPHITE + // the prematch hook uses the target name to search, but we now need + // to restore the features to make the font selection data unique + rFSD.maTargetName = aOrigName; +#endif + pFoundData = ImplFindBySearchName( aSearchName ); + if( pFoundData ) + return pFoundData; // break after last font name token was checked unsuccessfully if( nTokenPos == STRING_NOTFOUND) @@ -3009,13 +2498,13 @@ ImplDevFontListData* ImplDevFontList::ImplFindByFont( ImplFontSelectData& rFSD, { rFSD.maTargetName = GetNextFontToken( rFSD.maName, nTokenPos ); aSearchName = rFSD.maTargetName; - ImplGetEnglishSearchFontName( aSearchName ); + GetEnglishSearchFontName( aSearchName ); } else nTokenPos = STRING_NOTFOUND; if( mpPreMatchHook ) if( mpPreMatchHook->FindFontSubstitute( rFSD ) ) - ImplGetEnglishSearchFontName( aSearchName ); + GetEnglishSearchFontName( aSearchName ); ImplFontSubstitute( aSearchName, nSubstFlags, pDevSpecific ); ImplDevFontListData* pFoundData = ImplFindBySearchName( aSearchName ); if( pFoundData ) @@ -3029,7 +2518,7 @@ ImplDevFontListData* ImplDevFontList::ImplFindByFont( ImplFontSelectData& rFSD, nTokenPos = 0; rFSD.maTargetName = GetNextFontToken( rFSD.maName, nTokenPos ); aSearchName = rFSD.maTargetName; - ImplGetEnglishSearchFontName( aSearchName ); + GetEnglishSearchFontName( aSearchName ); } String aSearchShortName; @@ -3104,7 +2593,7 @@ ImplDevFontListData* ImplDevFontList::ImplFindByFont( ImplFontSelectData& rFSD, continue; aSearchName = rFSD.maTargetName; - ImplGetEnglishSearchFontName( aSearchName ); + GetEnglishSearchFontName( aSearchName ); String aTempShortName; String aTempFamilyName; @@ -4449,71 +3938,78 @@ void OutputDevice::ImplDrawStrikeoutChar( long nBaseX, long nBaseY, FontStrikeout eStrikeout, Color aColor ) { - BOOL bOldMap = IsMapModeEnabled(); - EnableMapMode( FALSE ); + // PDF-export does its own strikeout drawing... why again? + if( mpPDFWriter && mpPDFWriter->isBuiltinFont(mpFontEntry->maFontSelData.mpFontData) ) + return; - Color aOldColor = GetTextColor(); - SetTextColor( aColor ); - ImplInitTextColor(); - - xub_Unicode pChars[5]; + // prepare string for strikeout measurement + static char cStrikeoutChar; if ( eStrikeout == STRIKEOUT_SLASH ) - pChars[0] = '/'; + cStrikeoutChar = '/'; else // ( eStrikeout == STRIKEOUT_X ) - pChars[0] = 'X'; - pChars[3]=pChars[2]=pChars[1]=pChars[0]; + cStrikeoutChar = 'X'; + static const int nTestStrLen = 4; + static const int nMaxStrikeStrLen = 2048; + xub_Unicode aChars[ nMaxStrikeStrLen +1]; // +1 for valgrind... + for( int i = 0; i < nTestStrLen; ++i) + aChars[i] = cStrikeoutChar; + const String aStrikeoutTest( aChars, nTestStrLen ); // calculate approximation of strikeout atom size long nStrikeoutWidth = nWidth; - String aStrikeoutTest( pChars, 4 ); - SalLayout* pLayout = ImplLayout( aStrikeoutTest, 0, 4 ); - if ( pLayout ) + SalLayout* pLayout = ImplLayout( aStrikeoutTest, 0, nTestStrLen ); + if( pLayout ) { - nStrikeoutWidth = (pLayout->GetTextWidth() + 2) / 4; + nStrikeoutWidth = (pLayout->GetTextWidth() +nTestStrLen/2) / (nTestStrLen * pLayout->GetUnitsPerPixel()); pLayout->Release(); - if ( nStrikeoutWidth <= 0 ) // sanity check - nStrikeoutWidth = 1; } + if( nStrikeoutWidth <= 0 ) // sanity check + return; // calculate acceptable strikeout length // allow the strikeout to be one pixel larger than the text it strikes out - long nMaxWidth = nStrikeoutWidth/2; + long nMaxWidth = nStrikeoutWidth / 2; if ( nMaxWidth < 2 ) nMaxWidth = 2; nMaxWidth += nWidth + 1; - // build strikeout string - long nFullStrikeoutWidth = 0; - String aStrikeoutText( pChars, 0 ); - while ( (nFullStrikeoutWidth+=nStrikeoutWidth) < nMaxWidth+1 ) - aStrikeoutText += pChars[0]; - + int nStrikeStrLen = (nMaxWidth + nStrikeoutWidth - 1) / nStrikeoutWidth; // if the text width is smaller than the strikeout text, then do not // strike out at all. This case requires user interaction, e.g. adding // a space to the text - if ( (aStrikeoutText.Len() > 0) - && !(mpPDFWriter && mpPDFWriter->isBuiltinFont(mpFontEntry->maFontSelData.mpFontData) ) ) - { - if ( mpFontEntry->mnOrientation ) - ImplRotatePos( nBaseX, nBaseY, nX, nY, mpFontEntry->mnOrientation ); + if( nStrikeStrLen <= 0 ) + return; + if( nStrikeStrLen > nMaxStrikeStrLen ) + nStrikeStrLen = nMaxStrikeStrLen; - // strikeout text has to be left aligned - ULONG nOrigTLM = mnTextLayoutMode; - mnTextLayoutMode = TEXT_LAYOUT_BIDI_STRONG | TEXT_LAYOUT_COMPLEX_DISABLED; - SalLayout* pSalLayout = ImplLayout( aStrikeoutText, 0, STRING_LEN ); - mnTextLayoutMode = nOrigTLM; + // build the strikeout string + for( int i = nTestStrLen; i < nStrikeStrLen; ++i) + aChars[i] = cStrikeoutChar; + const String aStrikeoutText( aChars, xub_StrLen(nStrikeStrLen) ); - if ( pSalLayout ) - { - pSalLayout->DrawBase() = Point( nX+mnTextOffX, nY+mnTextOffY ); - pSalLayout->DrawText( *mpGraphics ); - pSalLayout->Release(); - } - } + if( mpFontEntry->mnOrientation ) + ImplRotatePos( nBaseX, nBaseY, nX, nY, mpFontEntry->mnOrientation ); + + // strikeout text has to be left aligned + ULONG nOrigTLM = mnTextLayoutMode; + mnTextLayoutMode = TEXT_LAYOUT_BIDI_STRONG | TEXT_LAYOUT_COMPLEX_DISABLED; + pLayout = ImplLayout( aStrikeoutText, 0, STRING_LEN ); + mnTextLayoutMode = nOrigTLM; + + if( !pLayout ) + return; + + // draw the strikeout text + const Color aOldColor = GetTextColor(); + SetTextColor( aColor ); + ImplInitTextColor(); + + pLayout->DrawBase() = Point( nX+mnTextOffX, nY+mnTextOffY ); + pLayout->DrawText( *mpGraphics ); + pLayout->Release(); SetTextColor( aOldColor ); ImplInitTextColor(); - EnableMapMode( bOldMap ); } // ----------------------------------------------------------------------- @@ -4781,7 +4277,7 @@ void OutputDevice::ImplGetEmphasisMark( PolyPolygon& rPolyPoly, BOOL& rPolyLine, double dScale = ((double)nDotSize)/1000.0; aPoly.Scale( dScale, dScale ); Polygon aTemp; - aPoly.GetSimple( aTemp ); + aPoly.AdaptiveSubdivide( aTemp ); Rectangle aBoundRect = aTemp.GetBoundRect(); rWidth = aBoundRect.GetWidth(); nDotSize = aBoundRect.GetHeight(); @@ -5203,7 +4699,7 @@ void OutputDevice::ImplDrawText( SalLayout& rSalLayout ) long OutputDevice::ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, long nWidth, const XubString& rStr, - USHORT nStyle ) const + USHORT nStyle, const ::vcl::ITextLayout& _rLayout ) { DBG_ASSERTWARNING( nWidth >= 0, "ImplGetTextLines: nWidth <= 0!" ); @@ -5241,7 +4737,7 @@ long OutputDevice::ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, while ( ( nBreakPos < nLen ) && ( rStr.GetChar( nBreakPos ) != _CR ) && ( rStr.GetChar( nBreakPos ) != _LF ) ) nBreakPos++; - long nLineWidth = GetTextWidth( rStr, nPos, nBreakPos-nPos ); + long nLineWidth = _rLayout.GetTextWidth( rStr, nPos, nBreakPos-nPos ); if ( ( nLineWidth > nWidth ) && ( nStyle & TEXT_DRAW_WORDBREAK ) ) { if ( !xBI.is() ) @@ -5250,7 +4746,7 @@ long OutputDevice::ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, if ( xBI.is() ) { const com::sun::star::lang::Locale& rDefLocale(Application::GetSettings().GetUILocale()); - xub_StrLen nSoftBreak = GetTextBreak( rStr, nWidth, nPos, nBreakPos - nPos ); + xub_StrLen nSoftBreak = _rLayout.GetTextBreak( rStr, nWidth, nPos, nBreakPos - nPos ); DBG_ASSERT( nSoftBreak < nBreakPos, "Break?!" ); //aHyphOptions.hyphenIndex = nSoftBreak; i18n::LineBreakResults aLBR = xBI->getLineBreak( aText, nSoftBreak, rDefLocale, nPos, aHyphOptions, aUserOptions ); @@ -5354,7 +4850,7 @@ long OutputDevice::ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, } // if ( xHyph.is() ) } // if ( (nStyle & TEXT_DRAW_WORDBREAK_HYPHENATION) == TEXT_DRAW_WORDBREAK_HYPHENATION ) } - nLineWidth = GetTextWidth( rStr, nPos, nBreakPos-nPos ); + nLineWidth = _rLayout.GetTextWidth( rStr, nPos, nBreakPos-nPos ); } else { @@ -5368,14 +4864,14 @@ long OutputDevice::ImplGetTextLines( ImplMultiTextLineInfo& rLineInfo, { if( nSpacePos > nPos ) nSpacePos--; - nW = GetTextWidth( rStr, nPos, nSpacePos-nPos ); + nW = _rLayout.GetTextWidth( rStr, nPos, nSpacePos-nPos ); } } while( nW > nWidth ); if( nSpacePos != STRING_NOTFOUND ) { nBreakPos = nSpacePos; - nLineWidth = GetTextWidth( rStr, nPos, nBreakPos-nPos ); + nLineWidth = _rLayout.GetTextWidth( rStr, nPos, nBreakPos-nPos ); if( nBreakPos < rStr.Len()-1 ) nBreakPos++; } @@ -5441,6 +4937,7 @@ void OutputDevice::SetFont( const Font& rNewFont ) DBG_CHKOBJ( &rNewFont, Font, NULL ); Font aFont( rNewFont ); + aFont.SetLanguage(rNewFont.GetLanguage()); if ( mnDrawMode & (DRAWMODE_BLACKTEXT | DRAWMODE_WHITETEXT | DRAWMODE_GRAYTEXT | DRAWMODE_GHOSTEDTEXT | DRAWMODE_SETTINGSTEXT | DRAWMODE_BLACKFILL | DRAWMODE_WHITEFILL | DRAWMODE_GRAYFILL | DRAWMODE_NOFILL | DRAWMODE_GHOSTEDFILL | DRAWMODE_SETTINGSFILL ) ) @@ -6104,6 +5601,10 @@ void OutputDevice::DrawTextArray( const Point& rStartPt, const String& rStr, if ( !IsDeviceOutputNecessary() ) return; + if( mbInitClipRegion ) + ImplInitClipRegion(); + if( mbOutputClipped ) + return; SalLayout* pSalLayout = ImplLayout( rStr, nIndex, nLen, rStartPt, 0, pDXAry, true ); if( pSalLayout ) @@ -6428,7 +5929,7 @@ SalLayout* OutputDevice::ImplLayout( const String& rOrigStr, // convert from logical units to physical units // recode string if needed if( mpFontEntry->mpConversion ) - ImplRecodeString( mpFontEntry->mpConversion, aStr, 0, aStr.Len() ); + mpFontEntry->mpConversion->RecodeString( aStr, 0, aStr.Len() ); long nPixelWidth = nLogicalWidth; if( nLogicalWidth && mbMap ) @@ -6484,7 +5985,7 @@ SalLayout* OutputDevice::ImplLayout( const String& rOrigStr, nRTLOffset = nPixelWidth; else nRTLOffset = pSalLayout->GetTextWidth() / pSalLayout->GetUnitsPerPixel(); - pSalLayout->DrawOffset().X() = -nRTLOffset; + pSalLayout->DrawOffset().X() = 1 - nRTLOffset; } return pSalLayout; @@ -6716,9 +6217,10 @@ xub_StrLen OutputDevice::GetTextBreak( const String& rStr, long nTextWidth, // ----------------------------------------------------------------------- -void OutputDevice::ImplDrawText( const Rectangle& rRect, +void OutputDevice::ImplDrawText( OutputDevice& rTargetDevice, const Rectangle& rRect, const String& rOrigStr, USHORT nStyle, - MetricVector* pVector, String* pDisplayText ) + MetricVector* pVector, String* pDisplayText, + ::vcl::ITextLayout& _rLayout ) { Color aOldTextColor; Color aOldTextFillColor; @@ -6727,30 +6229,32 @@ void OutputDevice::ImplDrawText( const Rectangle& rRect, { BOOL bHighContrastBlack = FALSE; BOOL bHighContrastWhite = FALSE; - Color aCol; - if( IsBackground() ) - aCol = GetBackground().GetColor(); - else - // best guess is the face color here - // but it may be totally wrong. the background color - // was typically already reset - aCol = GetSettings().GetStyleSettings().GetFaceColor(); + const StyleSettings& rStyleSettings( rTargetDevice.GetSettings().GetStyleSettings() ); + if( rStyleSettings.GetHighContrastMode() ) + { + Color aCol; + if( rTargetDevice.IsBackground() ) + aCol = rTargetDevice.GetBackground().GetColor(); + else + // best guess is the face color here + // but it may be totally wrong. the background color + // was typically already reset + aCol = rStyleSettings.GetFaceColor(); - bHighContrastBlack = aCol.IsDark(); - bHighContrastWhite = aCol.IsBright() && GetSettings().GetStyleSettings().GetHighContrastMode(); + bHighContrastBlack = aCol.IsDark(); + bHighContrastWhite = aCol.IsBright(); + } - aOldTextColor = GetTextColor(); - if ( IsTextFillColor() ) + aOldTextColor = rTargetDevice.GetTextColor(); + if ( rTargetDevice.IsTextFillColor() ) { bRestoreFillColor = TRUE; - aOldTextFillColor = GetTextFillColor(); + aOldTextFillColor = rTargetDevice.GetTextFillColor(); } - else - bRestoreFillColor = FALSE; if( bHighContrastBlack ) - SetTextColor( COL_GREEN ); + rTargetDevice.SetTextColor( COL_GREEN ); else if( bHighContrastWhite ) - SetTextColor( COL_LIGHTGREEN ); + rTargetDevice.SetTextColor( COL_LIGHTGREEN ); else { // draw disabled text always without shadow @@ -6761,7 +6265,7 @@ void OutputDevice::ImplDrawText( const Rectangle& rRect, aRect.Move( 1, 1 ); DrawText( aRect, rOrigStr, nStyle & ~TEXT_DRAW_DISABLE ); */ - SetTextColor( GetSettings().GetStyleSettings().GetShadowColor() ); + rTargetDevice.SetTextColor( rTargetDevice.GetSettings().GetStyleSettings().GetDisableColor() ); } } @@ -6773,14 +6277,16 @@ void OutputDevice::ImplDrawText( const Rectangle& rRect, Point aPos = rRect.TopLeft(); - long nTextHeight = GetTextHeight(); - TextAlign eAlign = GetTextAlign(); + long nTextHeight = rTargetDevice.GetTextHeight(); + TextAlign eAlign = rTargetDevice.GetTextAlign(); xub_StrLen nMnemonicPos = STRING_NOTFOUND; String aStr = rOrigStr; if ( nStyle & TEXT_DRAW_MNEMONIC ) aStr = GetNonMnemonicString( aStr, nMnemonicPos ); + const bool bDrawMnemonics = !(rTargetDevice.GetSettings().GetStyleSettings().GetOptions() & STYLE_OPTION_NOMNEMONICS) && !pVector; + // Mehrzeiligen Text behandeln wir anders if ( nStyle & TEXT_DRAW_MULTILINE ) { @@ -6795,7 +6301,7 @@ void OutputDevice::ImplDrawText( const Rectangle& rRect, if ( nTextHeight ) { - nMaxTextWidth = ImplGetTextLines( aMultiLineInfo, nWidth, aStr, nStyle ); + nMaxTextWidth = ImplGetTextLines( aMultiLineInfo, nWidth, aStr, nStyle, _rLayout ); nLines = (xub_StrLen)(nHeight/nTextHeight); nFormatLines = aMultiLineInfo.Count(); if ( !nLines ) @@ -6817,7 +6323,7 @@ void OutputDevice::ImplDrawText( const Rectangle& rRect, if ( aLastLine.GetChar( i ) == _LF ) aLastLine.SetChar( i, ' ' ); } - aLastLine = GetEllipsisString( aLastLine, nWidth, nStyle ); + aLastLine = ImplGetEllipsisString( rTargetDevice, aLastLine, nWidth, nStyle, _rLayout ); nStyle &= ~(TEXT_DRAW_VCENTER | TEXT_DRAW_BOTTOM); nStyle |= TEXT_DRAW_TOP; } @@ -6835,8 +6341,8 @@ void OutputDevice::ImplDrawText( const Rectangle& rRect, // Clipping setzen if ( nStyle & TEXT_DRAW_CLIP ) { - Push( PUSH_CLIPREGION ); - IntersectClipRegion( rRect ); + rTargetDevice.Push( PUSH_CLIPREGION ); + rTargetDevice.IntersectClipRegion( rRect ); } // Vertikales Alignment @@ -6849,7 +6355,7 @@ void OutputDevice::ImplDrawText( const Rectangle& rRect, if ( eAlign == ALIGN_BOTTOM ) aPos.Y() += nTextHeight; else if ( eAlign == ALIGN_BASELINE ) - aPos.Y() += GetFontMetric().GetAscent(); + aPos.Y() += rTargetDevice.GetFontMetric().GetAscent(); // Alle Zeilen ausgeben, bis auf die letzte for ( i = 0; i < nFormatLines; i++ ) @@ -6861,8 +6367,8 @@ void OutputDevice::ImplDrawText( const Rectangle& rRect, aPos.X() += (nWidth-pLineInfo->GetWidth())/2; xub_StrLen nIndex = pLineInfo->GetIndex(); xub_StrLen nLineLen = pLineInfo->GetLen(); - DrawText( aPos, aStr, nIndex, nLineLen, pVector, pDisplayText ); - if ( !(GetSettings().GetStyleSettings().GetOptions() & STYLE_OPTION_NOMNEMONICS) && !pVector ) + _rLayout.DrawText( aPos, aStr, nIndex, nLineLen, pVector, pDisplayText ); + if ( bDrawMnemonics ) { if ( (nMnemonicPos >= nIndex) && (nMnemonicPos < nIndex+nLineLen) ) { @@ -6871,16 +6377,16 @@ void OutputDevice::ImplDrawText( const Rectangle& rRect, long nMnemonicWidth; sal_Int32* pCaretXArray = (sal_Int32*) alloca( 2 * sizeof(sal_Int32) * nLineLen ); - /*BOOL bRet =*/ GetCaretPositions( aStr, pCaretXArray, - nIndex, nLineLen); + /*BOOL bRet =*/ _rLayout.GetCaretPositions( aStr, pCaretXArray, + nIndex, nLineLen ); long lc_x1 = pCaretXArray[2*(nMnemonicPos - nIndex)]; long lc_x2 = pCaretXArray[2*(nMnemonicPos - nIndex)+1]; - nMnemonicWidth = ::abs((int)(lc_x1 - lc_x2)); + nMnemonicWidth = rTargetDevice.ImplLogicWidthToDevicePixel( ::abs((int)(lc_x1 - lc_x2)) ); - Point aTempPos = LogicToPixel( aPos ); - nMnemonicX = mnOutOffX + aTempPos.X() + ImplLogicWidthToDevicePixel( Min( lc_x1, lc_x2 ) ); - nMnemonicY = mnOutOffY + aTempPos.Y() + ImplLogicWidthToDevicePixel( GetFontMetric().GetAscent() ); - ImplDrawMnemonicLine( nMnemonicX, nMnemonicY, nMnemonicWidth ); + Point aTempPos = rTargetDevice.LogicToPixel( aPos ); + nMnemonicX = rTargetDevice.GetOutOffXPixel() + aTempPos.X() + rTargetDevice.ImplLogicWidthToDevicePixel( Min( lc_x1, lc_x2 ) ); + nMnemonicY = rTargetDevice.GetOutOffYPixel() + aTempPos.Y() + rTargetDevice.ImplLogicWidthToDevicePixel( rTargetDevice.GetFontMetric().GetAscent() ); + rTargetDevice.ImplDrawMnemonicLine( nMnemonicX, nMnemonicY, nMnemonicWidth ); } } aPos.Y() += nTextHeight; @@ -6891,26 +6397,26 @@ void OutputDevice::ImplDrawText( const Rectangle& rRect, // Gibt es noch eine letzte Zeile, dann diese linksbuendig ausgeben, // da die Zeile gekuerzt wurde if ( aLastLine.Len() ) - DrawText( aPos, aLastLine, 0, STRING_LEN, pVector, pDisplayText ); + _rLayout.DrawText( aPos, aLastLine, 0, STRING_LEN, pVector, pDisplayText ); // Clipping zuruecksetzen if ( nStyle & TEXT_DRAW_CLIP ) - Pop(); + rTargetDevice.Pop(); } } else { - long nTextWidth = GetTextWidth( aStr ); + long nTextWidth = _rLayout.GetTextWidth( aStr, 0, STRING_LEN ); // Evt. Text kuerzen if ( nTextWidth > nWidth ) { if ( nStyle & TEXT_DRAW_ELLIPSIS ) { - aStr = GetEllipsisString( aStr, nWidth, nStyle ); + aStr = ImplGetEllipsisString( rTargetDevice, aStr, nWidth, nStyle, _rLayout ); nStyle &= ~(TEXT_DRAW_CENTER | TEXT_DRAW_RIGHT); nStyle |= TEXT_DRAW_LEFT; - nTextWidth = GetTextWidth( aStr ); + nTextWidth = _rLayout.GetTextWidth( aStr, 0, aStr.Len() ); } } else @@ -6919,17 +6425,17 @@ void OutputDevice::ImplDrawText( const Rectangle& rRect, nStyle &= ~TEXT_DRAW_CLIP; } - // Vertikales Alignment + // horizontal text alignment if ( nStyle & TEXT_DRAW_RIGHT ) aPos.X() += nWidth-nTextWidth; else if ( nStyle & TEXT_DRAW_CENTER ) aPos.X() += (nWidth-nTextWidth)/2; - // Font Alignment + // vertical font alignment if ( eAlign == ALIGN_BOTTOM ) aPos.Y() += nTextHeight; else if ( eAlign == ALIGN_BASELINE ) - aPos.Y() += GetFontMetric().GetAscent(); + aPos.Y() += rTargetDevice.GetFontMetric().GetAscent(); if ( nStyle & TEXT_DRAW_BOTTOM ) aPos.Y() += nHeight-nTextHeight; @@ -6942,44 +6448,44 @@ void OutputDevice::ImplDrawText( const Rectangle& rRect, if ( nMnemonicPos != STRING_NOTFOUND ) { sal_Int32* pCaretXArray = (sal_Int32*) alloca( 2 * sizeof(sal_Int32) * aStr.Len() ); - /*BOOL bRet =*/ GetCaretPositions( aStr, pCaretXArray, 0, aStr.Len() ); + /*BOOL bRet =*/ _rLayout.GetCaretPositions( aStr, pCaretXArray, 0, aStr.Len() ); long lc_x1 = pCaretXArray[2*(nMnemonicPos)]; long lc_x2 = pCaretXArray[2*(nMnemonicPos)+1]; - nMnemonicWidth = ::abs((int)(lc_x1 - lc_x2)); + nMnemonicWidth = rTargetDevice.ImplLogicWidthToDevicePixel( ::abs((int)(lc_x1 - lc_x2)) ); - Point aTempPos = LogicToPixel( aPos ); - nMnemonicX = mnOutOffX + aTempPos.X() + ImplLogicWidthToDevicePixel( Min(lc_x1, lc_x2) ); - nMnemonicY = mnOutOffY + aTempPos.Y() + ImplLogicWidthToDevicePixel( GetFontMetric().GetAscent() ); + Point aTempPos = rTargetDevice.LogicToPixel( aPos ); + nMnemonicX = rTargetDevice.GetOutOffXPixel() + aTempPos.X() + rTargetDevice.ImplLogicWidthToDevicePixel( Min(lc_x1, lc_x2) ); + nMnemonicY = rTargetDevice.GetOutOffYPixel() + aTempPos.Y() + rTargetDevice.ImplLogicWidthToDevicePixel( rTargetDevice.GetFontMetric().GetAscent() ); } if ( nStyle & TEXT_DRAW_CLIP ) { - Push( PUSH_CLIPREGION ); - IntersectClipRegion( rRect ); - DrawText( aPos, aStr, 0, STRING_LEN, pVector, pDisplayText ); - if ( !(GetSettings().GetStyleSettings().GetOptions() & STYLE_OPTION_NOMNEMONICS) && !pVector ) + rTargetDevice.Push( PUSH_CLIPREGION ); + rTargetDevice.IntersectClipRegion( rRect ); + _rLayout.DrawText( aPos, aStr, 0, STRING_LEN, pVector, pDisplayText ); + if ( bDrawMnemonics ) { if ( nMnemonicPos != STRING_NOTFOUND ) - ImplDrawMnemonicLine( nMnemonicX, nMnemonicY, nMnemonicWidth ); + rTargetDevice.ImplDrawMnemonicLine( nMnemonicX, nMnemonicY, nMnemonicWidth ); } - Pop(); + rTargetDevice.Pop(); } else { - DrawText( aPos, aStr, 0, STRING_LEN, pVector, pDisplayText ); - if ( !(GetSettings().GetStyleSettings().GetOptions() & STYLE_OPTION_NOMNEMONICS) && !pVector ) + _rLayout.DrawText( aPos, aStr, 0, STRING_LEN, pVector, pDisplayText ); + if ( bDrawMnemonics ) { if ( nMnemonicPos != STRING_NOTFOUND ) - ImplDrawMnemonicLine( nMnemonicX, nMnemonicY, nMnemonicWidth ); + rTargetDevice.ImplDrawMnemonicLine( nMnemonicX, nMnemonicY, nMnemonicWidth ); } } } if ( nStyle & TEXT_DRAW_DISABLE && !pVector ) { - SetTextColor( aOldTextColor ); + rTargetDevice.SetTextColor( aOldTextColor ); if ( bRestoreFillColor ) - SetTextFillColor( aOldTextFillColor ); + rTargetDevice.SetTextFillColor( aOldTextFillColor ); } } @@ -7012,7 +6518,8 @@ void OutputDevice::AddTextRectActions( const Rectangle& rRect, // #i47157# Factored out to ImplDrawTextRect(), to be shared // between us and DrawText() - ImplDrawText( rRect, rOrigStr, nStyle, NULL, NULL ); + DefaultTextLayout aLayout( *this ); + ImplDrawText( *this, rRect, rOrigStr, nStyle, NULL, NULL, aLayout ); // and restore again EnableOutput( bOutputEnabled ); @@ -7021,10 +6528,9 @@ void OutputDevice::AddTextRectActions( const Rectangle& rRect, // ----------------------------------------------------------------------- -void OutputDevice::DrawText( const Rectangle& rRect, - const String& rOrigStr, USHORT nStyle, - MetricVector* pVector, String* pDisplayText ) - +void OutputDevice::DrawText( const Rectangle& rRect, const String& rOrigStr, USHORT nStyle, + MetricVector* pVector, String* pDisplayText, + ::vcl::ITextLayout* _pTextLayout ) { if( mpOutDevData && mpOutDevData->mpRecordLayout ) { @@ -7035,10 +6541,11 @@ void OutputDevice::DrawText( const Rectangle& rRect, DBG_TRACE( "OutputDevice::DrawText( const Rectangle& )" ); DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice ); - if ( mpMetaFile ) + bool bDecomposeTextRectAction = ( _pTextLayout != NULL ) && _pTextLayout->DecomposeTextRectAction(); + if ( mpMetaFile && !bDecomposeTextRectAction ) mpMetaFile->AddAction( new MetaTextRectAction( rRect, rOrigStr, nStyle ) ); - if ( ( !IsDeviceOutputNecessary() && ! pVector ) || !rOrigStr.Len() || rRect.IsEmpty() ) + if ( ( !IsDeviceOutputNecessary() && !pVector && !bDecomposeTextRectAction ) || !rOrigStr.Len() || rRect.IsEmpty() ) return; // we need a graphics @@ -7046,17 +6553,19 @@ void OutputDevice::DrawText( const Rectangle& rRect, return; if( mbInitClipRegion ) ImplInitClipRegion(); - if( mbOutputClipped ) + if( mbOutputClipped && !bDecomposeTextRectAction ) return; // temporarily disable mtf action generation (ImplDrawText _does_ // create META_TEXT_ACTIONs otherwise) GDIMetaFile* pMtf = mpMetaFile; - mpMetaFile = NULL; + if ( !bDecomposeTextRectAction ) + mpMetaFile = NULL; - // #i47157# Factored out to ImplDrawTextRect(), to be used also + // #i47157# Factored out to ImplDrawText(), to be used also // from AddTextRectActions() - ImplDrawText( rRect, rOrigStr, nStyle, pVector, pDisplayText ); + DefaultTextLayout aDefaultLayout( *this ); + ImplDrawText( *this, rRect, rOrigStr, nStyle, pVector, pDisplayText, _pTextLayout ? *_pTextLayout : aDefaultLayout ); // and enable again mpMetaFile = pMtf; @@ -7068,8 +6577,9 @@ void OutputDevice::DrawText( const Rectangle& rRect, // ----------------------------------------------------------------------- Rectangle OutputDevice::GetTextRect( const Rectangle& rRect, - const String& rOrigStr, USHORT nStyle, - TextRectInfo* pInfo ) const + const XubString& rStr, USHORT nStyle, + TextRectInfo* pInfo, + const ::vcl::ITextLayout* _pTextLayout ) const { DBG_TRACE( "OutputDevice::GetTextRect()" ); DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice ); @@ -7080,7 +6590,7 @@ Rectangle OutputDevice::GetTextRect( const Rectangle& rRect, long nMaxWidth; long nTextHeight = GetTextHeight(); - String aStr = rOrigStr; + String aStr = rStr; if ( nStyle & TEXT_DRAW_MNEMONIC ) aStr = GetNonMnemonicString( aStr ); @@ -7092,7 +6602,8 @@ Rectangle OutputDevice::GetTextRect( const Rectangle& rRect, xub_StrLen i; nMaxWidth = 0; - ImplGetTextLines( aMultiLineInfo, nWidth, aStr, nStyle ); + DefaultTextLayout aDefaultLayout( *const_cast< OutputDevice* >( this ) ); + ImplGetTextLines( aMultiLineInfo, nWidth, aStr, nStyle, _pTextLayout ? *_pTextLayout : aDefaultLayout ); nFormatLines = aMultiLineInfo.Count(); if ( !nTextHeight ) nTextHeight = 1; @@ -7140,7 +6651,7 @@ Rectangle OutputDevice::GetTextRect( const Rectangle& rRect, else { nLines = 1; - nMaxWidth = GetTextWidth( aStr ); + nMaxWidth = _pTextLayout ? _pTextLayout->GetTextWidth( aStr, 0, aStr.Len() ) : GetTextWidth( aStr ); if ( pInfo ) { @@ -7199,11 +6710,20 @@ static BOOL ImplIsCharIn( xub_Unicode c, const sal_Char* pStr ) String OutputDevice::GetEllipsisString( const String& rOrigStr, long nMaxWidth, USHORT nStyle ) const { - DBG_TRACE( "OutputDevice::GetEllipsisString()" ); DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice ); + DefaultTextLayout aTextLayout( *const_cast< OutputDevice* >( this ) ); + return ImplGetEllipsisString( *this, rOrigStr, nMaxWidth, nStyle, aTextLayout ); +} + +// ----------------------------------------------------------------------- + +String OutputDevice::ImplGetEllipsisString( const OutputDevice& rTargetDevice, const XubString& rOrigStr, long nMaxWidth, + USHORT nStyle, const ::vcl::ITextLayout& _rLayout ) +{ + DBG_TRACE( "OutputDevice::ImplGetEllipsisString()" ); String aStr = rOrigStr; - xub_StrLen nIndex = GetTextBreak( aStr, nMaxWidth ); + xub_StrLen nIndex = _rLayout.GetTextBreak( aStr, nMaxWidth, 0, aStr.Len() ); if ( nIndex != STRING_LEN ) @@ -7214,7 +6734,7 @@ String OutputDevice::GetEllipsisString( const String& rOrigStr, long nMaxWidth, if ( nIndex > 1 ) { aStr.AppendAscii( "..." ); - while ( aStr.Len() && (GetTextWidth( aStr ) > nMaxWidth) ) + while ( aStr.Len() && (_rLayout.GetTextWidth( aStr, 0, aStr.Len() ) > nMaxWidth) ) { if ( (nIndex > 1) || (nIndex == aStr.Len()) ) nIndex--; @@ -7250,8 +6770,8 @@ String OutputDevice::GetEllipsisString( const String& rOrigStr, long nMaxWidth, XubString aLastStr( aStr, nLastContent, aStr.Len() ); XubString aTempLastStr1( RTL_CONSTASCII_USTRINGPARAM( "..." ) ); aTempLastStr1 += aLastStr; - if ( GetTextWidth( aTempLastStr1 ) > nMaxWidth ) - aStr = GetEllipsisString( aStr, nMaxWidth, nStyle | TEXT_DRAW_ENDELLIPSIS ); + if ( _rLayout.GetTextWidth( aTempLastStr1, 0, aTempLastStr1.Len() ) > nMaxWidth ) + aStr = OutputDevice::ImplGetEllipsisString( rTargetDevice, aStr, nMaxWidth, nStyle | TEXT_DRAW_ENDELLIPSIS, _rLayout ); else { USHORT nFirstContent = 0; @@ -7266,7 +6786,7 @@ String OutputDevice::GetEllipsisString( const String& rOrigStr, long nMaxWidth, nFirstContent++; if ( nFirstContent >= nLastContent ) - aStr = GetEllipsisString( aStr, nMaxWidth, nStyle | TEXT_DRAW_ENDELLIPSIS ); + aStr = OutputDevice::ImplGetEllipsisString( rTargetDevice, aStr, nMaxWidth, nStyle | TEXT_DRAW_ENDELLIPSIS, _rLayout ); else { if ( nFirstContent > 4 ) @@ -7275,8 +6795,8 @@ String OutputDevice::GetEllipsisString( const String& rOrigStr, long nMaxWidth, aFirstStr.AppendAscii( "..." ); XubString aTempStr = aFirstStr; aTempStr += aLastStr; - if ( GetTextWidth( aTempStr ) > nMaxWidth ) - aStr = GetEllipsisString( aStr, nMaxWidth, nStyle | TEXT_DRAW_ENDELLIPSIS ); + if ( _rLayout.GetTextWidth( aTempStr, 0, aTempStr.Len() ) > nMaxWidth ) + aStr = OutputDevice::ImplGetEllipsisString( rTargetDevice, aStr, nMaxWidth, nStyle | TEXT_DRAW_ENDELLIPSIS, _rLayout ); else { do @@ -7300,7 +6820,7 @@ String OutputDevice::GetEllipsisString( const String& rOrigStr, long nMaxWidth, XubString aTempLastStr( aStr, nLastContent, aStr.Len() ); aTempStr = aFirstStr; aTempStr += aTempLastStr; - if ( GetTextWidth( aTempStr ) > nMaxWidth ) + if ( _rLayout.GetTextWidth( aTempStr, 0, aTempStr.Len() ) > nMaxWidth ) break; } } @@ -7395,13 +6915,18 @@ void OutputDevice::DrawCtrlText( const Point& rPos, const XubString& rStr, BOOL bRestoreFillColor; BOOL bHighContrastBlack = FALSE; BOOL bHighContrastWhite = FALSE; - if( IsBackground() ) + const StyleSettings& rStyleSettings( GetSettings().GetStyleSettings() ); + if( rStyleSettings.GetHighContrastMode() ) { - Wallpaper aWall = GetBackground(); - Color aCol = aWall.GetColor(); - bHighContrastBlack = aCol.IsDark(); - bHighContrastWhite = aCol.IsBright() && GetSettings().GetStyleSettings().GetHighContrastMode(); + if( IsBackground() ) + { + Wallpaper aWall = GetBackground(); + Color aCol = aWall.GetColor(); + bHighContrastBlack = aCol.IsDark(); + bHighContrastWhite = aCol.IsBright(); + } } + aOldTextColor = GetTextColor(); if ( IsTextFillColor() ) { @@ -7416,7 +6941,7 @@ void OutputDevice::DrawCtrlText( const Point& rPos, const XubString& rStr, else if( bHighContrastWhite ) SetTextColor( COL_LIGHTGREEN ); else - SetTextColor( GetSettings().GetStyleSettings().GetShadowColor() ); + SetTextColor( GetSettings().GetStyleSettings().GetDisableColor() ); DrawText( rPos, aStr, nIndex, nLen, pVector, pDisplayText ); if ( !(GetSettings().GetStyleSettings().GetOptions() & STYLE_OPTION_NOMNEMONICS) && !pVector ) @@ -7919,8 +7444,8 @@ BOOL OutputDevice::GetGlyphBoundRects( const Point& rOrigin, const String& rStr, // ----------------------------------------------------------------------- BOOL OutputDevice::GetTextBoundRect( Rectangle& rRect, - const String& rStr, xub_StrLen nBase, xub_StrLen nIndex, - xub_StrLen nLen ) const + const String& rStr, xub_StrLen nBase, xub_StrLen nIndex, xub_StrLen nLen, + ULONG nLayoutWidth, const sal_Int32* pDXAry ) const { DBG_TRACE( "OutputDevice::GetTextBoundRect()" ); DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice ); @@ -7929,13 +7454,14 @@ BOOL OutputDevice::GetTextBoundRect( Rectangle& rRect, rRect.SetEmpty(); SalLayout* pSalLayout = NULL; + const Point aPoint; // calculate offset when nBase!=nIndex long nXOffset = 0; if( nBase != nIndex ) { xub_StrLen nStart = Min( nBase, nIndex ); xub_StrLen nOfsLen = Max( nBase, nIndex ) - nStart; - pSalLayout = ImplLayout( rStr, nStart, nOfsLen ); + pSalLayout = ImplLayout( rStr, nStart, nOfsLen, aPoint, nLayoutWidth, pDXAry ); if( pSalLayout ) { nXOffset = pSalLayout->GetTextWidth(); @@ -7947,7 +7473,7 @@ BOOL OutputDevice::GetTextBoundRect( Rectangle& rRect, } } - pSalLayout = ImplLayout( rStr, nIndex, nLen ); + pSalLayout = ImplLayout( rStr, nIndex, nLen, aPoint, nLayoutWidth, pDXAry ); Rectangle aPixelRect; if( pSalLayout ) { @@ -7997,7 +7523,7 @@ BOOL OutputDevice::GetTextBoundRect( Rectangle& rRect, aVDev.SetTextAlign( ALIGN_TOP ); // layout the text on the virtual device - pSalLayout = aVDev.ImplLayout( rStr, nIndex, nLen ); + pSalLayout = aVDev.ImplLayout( rStr, nIndex, nLen, aPoint, nLayoutWidth, pDXAry ); if( !pSalLayout ) return false; @@ -8097,7 +7623,7 @@ BOOL OutputDevice::GetTextBoundRect( Rectangle& rRect, BOOL OutputDevice::GetTextOutlines( ::basegfx::B2DPolyPolygonVector& rVector, const String& rStr, xub_StrLen nBase, xub_StrLen nIndex, xub_StrLen nLen, - BOOL bOptimize, const ULONG nTWidth, const sal_Int32* pDXArray ) const + BOOL bOptimize, ULONG nTWidth, const sal_Int32* pDXArray ) const { // the fonts need to be initialized if( mbNewFont ) @@ -8326,7 +7852,7 @@ BOOL OutputDevice::GetTextOutlines( ::basegfx::B2DPolyPolygonVector& rVector, BOOL OutputDevice::GetTextOutlines( PolyPolyVector& rResultVector, const String& rStr, xub_StrLen nBase, xub_StrLen nIndex, - xub_StrLen nLen, BOOL bOptimize, const ULONG nTWidth, const sal_Int32* pDXArray ) const + xub_StrLen nLen, BOOL bOptimize, ULONG nTWidth, const sal_Int32* pDXArray ) const { rResultVector.clear(); @@ -8349,7 +7875,7 @@ BOOL OutputDevice::GetTextOutlines( PolyPolyVector& rResultVector, BOOL OutputDevice::GetTextOutline( PolyPolygon& rPolyPoly, const String& rStr, xub_StrLen nBase, xub_StrLen nIndex, xub_StrLen nLen, - BOOL bOptimize, const ULONG nTWidth, const sal_Int32* pDXArray ) const + BOOL bOptimize, ULONG nTWidth, const sal_Int32* pDXArray ) const { rPolyPoly.Clear(); diff --git a/vcl/source/gdi/outdev6.cxx b/vcl/source/gdi/outdev6.cxx index cee4f475a577..79986988afd7 100644 --- a/vcl/source/gdi/outdev6.cxx +++ b/vcl/source/gdi/outdev6.cxx @@ -185,14 +185,20 @@ void OutputDevice::DrawTransparent( const basegfx::B2DPolyPolygon& rB2DPolyPoly, if( mbInitFillColor ) ImplInitFillColor(); - if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)) + if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) + && mpGraphics->supportsOperation(OutDevSupport_B2DDraw) + && ROP_OVERPAINT == GetRasterOp() + && IsFillColor()) { // b2dpolygon support not implemented yet on non-UNX platforms const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation(); - ::basegfx::B2DPolyPolygon aB2DPP = rB2DPolyPoly; - aB2DPP.transform( aTransform ); + basegfx::B2DPolyPolygon aB2DPolyPolygon(rB2DPolyPoly); - if( mpGraphics->DrawPolyPolygon( aB2DPP, fTransparency, this ) ) + // transform the polygon and ensure closed + aB2DPolyPolygon.transform(aTransform); + aB2DPolyPolygon.setClosed(true); + + if(mpGraphics->DrawPolyPolygon(aB2DPolyPolygon, fTransparency, this)) { #if 0 // MetaB2DPolyPolygonAction is not implemented yet: @@ -636,51 +642,105 @@ void OutputDevice::DrawTransparent( const GDIMetaFile& rMtf, const Point& rPos, if( pVDev->SetOutputSizePixel( aDstRect.GetSize() ) ) { - Bitmap aPaint, aMask; - AlphaMask aAlpha; - MapMode aMap( GetMapMode() ); - Point aOutPos( PixelToLogic( aDstRect.TopLeft() ) ); - const BOOL bOldMap = mbMap; + if(GetAntialiasing()) + { + // #i102109# + // For MetaFile replay (see task) it may now be neccessary to take + // into account that the content is AntiAlialised and needs to be masked + // like that. Instead of masking, i will use a copy-modify-paste cycle + // here (as i already use in the VclPrimiziveRenderer with successs) + pVDev->SetAntialiasing(GetAntialiasing()); - aMap.SetOrigin( Point( -aOutPos.X(), -aOutPos.Y() ) ); - pVDev->SetMapMode( aMap ); - const BOOL bVDevOldMap = pVDev->IsMapModeEnabled(); + // create MapMode for buffer (offset needed) and set + MapMode aMap(GetMapMode()); + const Point aOutPos(PixelToLogic(aDstRect.TopLeft())); + aMap.SetOrigin(Point(-aOutPos.X(), -aOutPos.Y())); + pVDev->SetMapMode(aMap); - // create paint bitmap - ( (GDIMetaFile&) rMtf ).WindStart(); - ( (GDIMetaFile&) rMtf ).Play( pVDev, rPos, rSize ); - ( (GDIMetaFile&) rMtf ).WindStart(); - pVDev->EnableMapMode( FALSE ); - aPaint = pVDev->GetBitmap( Point(), pVDev->GetOutputSizePixel() ); - pVDev->EnableMapMode( bVDevOldMap ); // #i35331#: MUST NOT use EnableMapMode( TRUE ) here! + // copy MapMode state and disable for target + const bool bOrigMapModeEnabled(IsMapModeEnabled()); + EnableMapMode(false); - // create mask bitmap - pVDev->SetLineColor( COL_BLACK ); - pVDev->SetFillColor( COL_BLACK ); - pVDev->DrawRect( Rectangle( pVDev->PixelToLogic( Point() ), pVDev->GetOutputSize() ) ); - pVDev->SetDrawMode( DRAWMODE_WHITELINE | DRAWMODE_WHITEFILL | DRAWMODE_WHITETEXT | - DRAWMODE_WHITEBITMAP | DRAWMODE_WHITEGRADIENT ); - ( (GDIMetaFile&) rMtf ).WindStart(); - ( (GDIMetaFile&) rMtf ).Play( pVDev, rPos, rSize ); - ( (GDIMetaFile&) rMtf ).WindStart(); - pVDev->EnableMapMode( FALSE ); - aMask = pVDev->GetBitmap( Point(), pVDev->GetOutputSizePixel() ); - pVDev->EnableMapMode( bVDevOldMap ); // #i35331#: MUST NOT use EnableMapMode( TRUE ) here! + // copy MapMode state and disable for buffer + const bool bBufferMapModeEnabled(pVDev->IsMapModeEnabled()); + pVDev->EnableMapMode(false); - // create alpha mask from gradient - pVDev->SetDrawMode( DRAWMODE_GRAYGRADIENT ); - pVDev->DrawGradient( Rectangle( rPos, rSize ), rTransparenceGradient ); - pVDev->SetDrawMode( DRAWMODE_DEFAULT ); - pVDev->EnableMapMode( FALSE ); - pVDev->DrawMask( Point(), pVDev->GetOutputSizePixel(), aMask, Color( COL_WHITE ) ); + // copy content from original to buffer + pVDev->DrawOutDev( + aPoint, pVDev->GetOutputSizePixel(), // dest + aDstRect.TopLeft(), pVDev->GetOutputSizePixel(), // source + *this); - aAlpha = pVDev->GetBitmap( Point(), pVDev->GetOutputSizePixel() ); + // draw MetaFile to buffer + pVDev->EnableMapMode(bBufferMapModeEnabled); + ((GDIMetaFile&)rMtf).WindStart(); + ((GDIMetaFile&)rMtf).Play(pVDev, rPos, rSize); + ((GDIMetaFile&)rMtf).WindStart(); - delete pVDev; + // get content bitmap from buffer + pVDev->EnableMapMode(false); + const Bitmap aPaint(pVDev->GetBitmap(aPoint, pVDev->GetOutputSizePixel())); - EnableMapMode( FALSE ); - DrawBitmapEx( aDstRect.TopLeft(), BitmapEx( aPaint, aAlpha ) ); - EnableMapMode( bOldMap ); + // create alpha mask from gradient and get as Bitmap + pVDev->EnableMapMode(bBufferMapModeEnabled); + pVDev->SetDrawMode(DRAWMODE_GRAYGRADIENT); + pVDev->DrawGradient(Rectangle(rPos, rSize), rTransparenceGradient); + pVDev->SetDrawMode(DRAWMODE_DEFAULT); + pVDev->EnableMapMode(false); + const AlphaMask aAlpha(pVDev->GetBitmap(aPoint, pVDev->GetOutputSizePixel())); + + // draw masked content to target and restore MapMode + DrawBitmapEx(aDstRect.TopLeft(), BitmapEx(aPaint, aAlpha)); + EnableMapMode(bOrigMapModeEnabled); + } + else + { + Bitmap aPaint, aMask; + AlphaMask aAlpha; + MapMode aMap( GetMapMode() ); + Point aOutPos( PixelToLogic( aDstRect.TopLeft() ) ); + const BOOL bOldMap = mbMap; + + aMap.SetOrigin( Point( -aOutPos.X(), -aOutPos.Y() ) ); + pVDev->SetMapMode( aMap ); + const BOOL bVDevOldMap = pVDev->IsMapModeEnabled(); + + // create paint bitmap + ( (GDIMetaFile&) rMtf ).WindStart(); + ( (GDIMetaFile&) rMtf ).Play( pVDev, rPos, rSize ); + ( (GDIMetaFile&) rMtf ).WindStart(); + pVDev->EnableMapMode( FALSE ); + aPaint = pVDev->GetBitmap( Point(), pVDev->GetOutputSizePixel() ); + pVDev->EnableMapMode( bVDevOldMap ); // #i35331#: MUST NOT use EnableMapMode( TRUE ) here! + + // create mask bitmap + pVDev->SetLineColor( COL_BLACK ); + pVDev->SetFillColor( COL_BLACK ); + pVDev->DrawRect( Rectangle( pVDev->PixelToLogic( Point() ), pVDev->GetOutputSize() ) ); + pVDev->SetDrawMode( DRAWMODE_WHITELINE | DRAWMODE_WHITEFILL | DRAWMODE_WHITETEXT | + DRAWMODE_WHITEBITMAP | DRAWMODE_WHITEGRADIENT ); + ( (GDIMetaFile&) rMtf ).WindStart(); + ( (GDIMetaFile&) rMtf ).Play( pVDev, rPos, rSize ); + ( (GDIMetaFile&) rMtf ).WindStart(); + pVDev->EnableMapMode( FALSE ); + aMask = pVDev->GetBitmap( Point(), pVDev->GetOutputSizePixel() ); + pVDev->EnableMapMode( bVDevOldMap ); // #i35331#: MUST NOT use EnableMapMode( TRUE ) here! + + // create alpha mask from gradient + pVDev->SetDrawMode( DRAWMODE_GRAYGRADIENT ); + pVDev->DrawGradient( Rectangle( rPos, rSize ), rTransparenceGradient ); + pVDev->SetDrawMode( DRAWMODE_DEFAULT ); + pVDev->EnableMapMode( FALSE ); + pVDev->DrawMask( Point(), pVDev->GetOutputSizePixel(), aMask, Color( COL_WHITE ) ); + + aAlpha = pVDev->GetBitmap( Point(), pVDev->GetOutputSizePixel() ); + + delete pVDev; + + EnableMapMode( FALSE ); + DrawBitmapEx( aDstRect.TopLeft(), BitmapEx( aPaint, aAlpha ) ); + EnableMapMode( bOldMap ); + } } else delete pVDev; diff --git a/vcl/source/gdi/pdfextoutdevdata.cxx b/vcl/source/gdi/pdfextoutdevdata.cxx index a7d91abcbd5f..9c8c1ec1bf5e 100644 --- a/vcl/source/gdi/pdfextoutdevdata.cxx +++ b/vcl/source/gdi/pdfextoutdevdata.cxx @@ -283,8 +283,6 @@ struct PageSyncData std::deque< Graphic > mGraphics; std::deque< ::boost::shared_ptr< PDFWriter::AnyWidget > > mControls; - std::set< ::rtl::OUString > mControlNames; - GlobalSyncData* mpGlobalData; sal_Bool mbGroupIgnoreGDIMtfActions; @@ -375,7 +373,6 @@ sal_Bool PageSyncData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIM if ( pControl.get() ) rWriter.CreateControl( *pControl ); mControls.pop_front(); - mControlNames.erase( pControl->Name ); } break; case PDFExtOutDevDataSync::BeginGroup : @@ -772,16 +769,6 @@ void PDFExtOutDevData::CreateControl( const PDFWriter::AnyWidget& rControlType, mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::CreateControl ); ::boost::shared_ptr< PDFWriter::AnyWidget > pClone( rControlType.Clone() ); - // ensure a unique name - ::rtl::OUString sUniqueName( pClone->Name ); - sal_Int32 nUniqueNumber( 0 ); - while ( mpPageSyncData->mControlNames.find( sUniqueName ) != mpPageSyncData->mControlNames.end() ) - { - sUniqueName = pClone->Name + ::rtl::OUString::valueOf( ++nUniqueNumber ); - } - pClone->Name = sUniqueName; - mpPageSyncData->mControlNames.insert( pClone->Name ); - mpPageSyncData->mControls.push_back( pClone ); } diff --git a/vcl/source/gdi/pdfwriter_impl.cxx b/vcl/source/gdi/pdfwriter_impl.cxx index 3f648fda8589..4146f1764204 100644 --- a/vcl/source/gdi/pdfwriter_impl.cxx +++ b/vcl/source/gdi/pdfwriter_impl.cxx @@ -41,7 +41,6 @@ #include #include #include -#include //for relative url #include #include #include @@ -50,6 +49,8 @@ #include #include #include +#include +#include #include #include #include @@ -666,26 +667,29 @@ OString PDFWriterImpl::convertWidgetFieldName( const rtl::OUString& rString ) } OString aRet = aBuffer.makeStringAndClear(); - std::hash_map::iterator it = m_aFieldNameMap.find( aRet ); - - if( it != m_aFieldNameMap.end() ) // not unique + if( ! m_aContext.AllowDuplicateFieldNames ) { - std::hash_map< OString, sal_Int32, OStringHash >::const_iterator check_it; - OString aTry; - do + std::hash_map::iterator it = m_aFieldNameMap.find( aRet ); + + if( it != m_aFieldNameMap.end() ) // not unique { - OStringBuffer aUnique( aRet.getLength() + 16 ); - aUnique.append( aRet ); - aUnique.append( '_' ); - aUnique.append( it->second ); - it->second++; - aTry = aUnique.makeStringAndClear(); - check_it = m_aFieldNameMap.find( aTry ); - } while( check_it != m_aFieldNameMap.end() ); - aRet = aTry; + std::hash_map< OString, sal_Int32, OStringHash >::const_iterator check_it; + OString aTry; + do + { + OStringBuffer aUnique( aRet.getLength() + 16 ); + aUnique.append( aRet ); + aUnique.append( '_' ); + aUnique.append( it->second ); + it->second++; + aTry = aUnique.makeStringAndClear(); + check_it = m_aFieldNameMap.find( aTry ); + } while( check_it != m_aFieldNameMap.end() ); + aRet = aTry; + } + else + m_aFieldNameMap[ aRet ] = 2; } - else - m_aFieldNameMap[ aRet ] = 2; return aRet; } @@ -792,7 +796,8 @@ static void appendNonStrokingColor( const Color& rColor, OStringBuffer& rBuffer } // matrix helper class -namespace vcl +// TODO: use basegfx matrix class instead or derive from it +namespace vcl // TODO: use anonymous namespace to keep this class local { /* for sparse matrices of the form (2D linear transformations) * f[0] f[1] 0 @@ -803,7 +808,7 @@ class Matrix3 { double f[6]; - void set( double *pn ) { for( int i = 0 ; i < 5; i++ ) f[i] = pn[i]; } + void set( double *pn ) { for( int i = 0 ; i < 6; i++ ) f[i] = pn[i]; } public: Matrix3(); ~Matrix3() {} @@ -812,6 +817,7 @@ public: void scale( double sx, double sy ); void rotate( double angle ); void translate( double tx, double ty ); + bool invert(); void append( PDFWriterImpl::PDFPage& rPage, OStringBuffer& rBuffer, Point* pBack = NULL ); @@ -888,6 +894,36 @@ void Matrix3::translate( double tx, double ty ) f[5] += ty; } +bool Matrix3::invert() +{ + // short circuit trivial cases + if( f[1]==f[2] && f[1]==0.0 && f[0]==f[3] && f[0]==1.0 ) + { + f[4] = -f[4]; + f[5] = -f[5]; + return true; + } + + // check determinant + const double fDet = f[0]*f[3]-f[1]*f[2]; + if( fDet == 0.0 ) + return false; + + // invert the matrix + double fn[6]; + fn[0] = +f[3] / fDet; + fn[1] = -f[1] / fDet; + fn[2] = -f[2] / fDet; + fn[3] = +f[0] / fDet; + + // apply inversion to translation + fn[4] = -(f[4]*fn[0] + f[5]*fn[2]); + fn[5] = -(f[4]*fn[1] + f[5]*fn[3]); + + set( fn ); + return true; +} + void Matrix3::append( PDFWriterImpl::PDFPage& rPage, OStringBuffer& rBuffer, Point* pBack ) { appendDouble( f[0], rBuffer ); @@ -2780,6 +2816,153 @@ sal_Int32 PDFWriterImpl::emitBuiltinFont( const ImplFontData* pFont, sal_Int32 n return nFontObject; } +typedef int ThreeInts[3]; +static bool getPfbSegmentLengths( const unsigned char* pFontBytes, int nByteLen, + ThreeInts& rSegmentLengths ) +{ + if( !pFontBytes || (nByteLen < 0) ) + return false; + const unsigned char* pPtr = pFontBytes; + const unsigned char* pEnd = pFontBytes + nByteLen; + + for( int i = 0; i < 3; ++i) { + // read segment1 header + if( pPtr+6 >= pEnd ) + return false; + if( (pPtr[0] != 0x80) || (pPtr[1] >= 0x03) ) + return false; + const int nLen = (pPtr[5]<<24) + (pPtr[4]<<16) + (pPtr[3]<<8) + pPtr[2]; + if( nLen <= 0) + return false; + rSegmentLengths[i] = nLen; + pPtr += nLen + 6; + } + + // read segment-end header + if( pPtr+2 >= pEnd ) + return false; + if( (pPtr[0] != 0x80) || (pPtr[1] != 0x03) ) + return false; + + return true; +} + +std::map< sal_Int32, sal_Int32 > PDFWriterImpl::emitSystemFont( const ImplFontData* pFont, EmbedFont& rEmbed ) +{ + std::map< sal_Int32, sal_Int32 > aRet; + if( isBuiltinFont( pFont ) ) + { + aRet[ rEmbed.m_nNormalFontID ] = emitBuiltinFont( pFont ); + return aRet; + } + + sal_Int32 nFontObject = 0; + sal_Int32 nFontDescriptor = 0; + rtl::OString aSubType( "/Type1" ); + FontSubsetInfo aInfo; + // fill in dummy values + aInfo.m_nAscent = 1000; + aInfo.m_nDescent = 200; + aInfo.m_nCapHeight = 1000; + aInfo.m_aFontBBox = Rectangle( Point( -200, -200 ), Size( 1700, 1700 ) ); + aInfo.m_aPSName = pFont->maName; + sal_Int32 pWidths[256]; + rtl_zeroMemory( pWidths, sizeof(pWidths) ); + if( pFont->IsEmbeddable() ) + { + const unsigned char* pFontData = NULL; + long nFontLen = 0; + sal_Ucs nEncodedCodes[256]; + sal_Int32 pEncWidths[256]; + if( (pFontData = (const unsigned char*)m_pReferenceDevice->mpGraphics->GetEmbedFontData( pFont, nEncodedCodes, pEncWidths, aInfo, &nFontLen )) != NULL ) + { + m_pReferenceDevice->mpGraphics->FreeEmbedFontData( pFontData, nFontLen ); + for( int i = 0; i < 256; i++ ) + { + if( nEncodedCodes[i] >= 32 && nEncodedCodes[i] < 256 ) + { + pWidths[i] = pEncWidths[ i ]; + } + } + } + } + else if( pFont->mbSubsettable ) + { + aSubType = rtl::OString( "/TrueType" ); + Int32Vector aGlyphWidths; + Ucs2UIntMap aUnicodeMap; + m_pReferenceDevice->mpGraphics->GetGlyphWidths( pFont, false, aGlyphWidths, aUnicodeMap ); + + OUString aTmpName; + osl_createTempFile( NULL, NULL, &aTmpName.pData ); + sal_Int32 pGlyphIDs[ 256 ]; + sal_uInt8 pEncoding[ 256 ]; + sal_Ucs pUnicodes[ 256 ]; + sal_Int32 pDuWidths[ 256 ]; + + memset( pGlyphIDs, 0, sizeof( pGlyphIDs ) ); + memset( pEncoding, 0, sizeof( pEncoding ) ); + memset( pUnicodes, 0, sizeof( pUnicodes ) ); + memset( pDuWidths, 0, sizeof( pDuWidths ) ); + + for( sal_Ucs c = 32; c < 256; c++ ) + { + pUnicodes[c] = c; + pEncoding[c] = c; + pGlyphIDs[c] = 0; + if( aUnicodeMap.find( c ) != aUnicodeMap.end() ) + pWidths[ c ] = aGlyphWidths[ aUnicodeMap[ c ] ]; + } + + m_pReferenceDevice->mpGraphics->CreateFontSubset( aTmpName, pFont, pGlyphIDs, pEncoding, pDuWidths, 256, aInfo ); + osl_removeFile( aTmpName.pData ); + } + else + { + DBG_ERROR( "system font neither embeddable nor subsettable" ); + } + + // write font descriptor + nFontDescriptor = emitFontDescriptor( pFont, aInfo, 0, 0 ); + if( nFontDescriptor ) + { + // write font object + sal_Int32 nObject = createObject(); + if( updateObject( nObject ) ) + { + OStringBuffer aLine( 1024 ); + aLine.append( nObject ); + aLine.append( " 0 obj\n" + "<mbSymbolFlag ) + aLine.append( "/Encoding/WinAnsiEncoding\n" ); + aLine.append( "/FirstChar 32 /LastChar 255\n" + "/Widths[" ); + for( int i = 32; i < 256; i++ ) + { + aLine.append( pWidths[i] ); + aLine.append( ((i&15) == 15) ? "\n" : " " ); + } + aLine.append( "]\n" + "/FontDescriptor " ); + aLine.append( nFontDescriptor ); + aLine.append( " 0 R>>\n" + "endobj\n\n" ); + writeBuffer( aLine.getStr(), aLine.getLength() ); + + nFontObject = nObject; + aRet[ rEmbed.m_nNormalFontID ] = nObject; + } + } + + return aRet; +} + +// TODO: always subset instead of embedding the full font => this method becomes obsolete then std::map< sal_Int32, sal_Int32 > PDFWriterImpl::emitEmbeddedFont( const ImplFontData* pFont, EmbedFont& rEmbed ) { std::map< sal_Int32, sal_Int32 > aRet; @@ -2820,7 +3003,7 @@ std::map< sal_Int32, sal_Int32 > PDFWriterImpl::emitEmbeddedFont( const ImplFont sal_Int32 nLength1, nLength2; if( (pFontData = (const unsigned char*)m_pReferenceDevice->mpGraphics->GetEmbedFontData( pFont, nEncodedCodes, pWidths, aInfo, &nFontLen )) != NULL ) { - if( aInfo.m_nFontType != SAL_FONTSUBSETINFO_TYPE_TYPE1 ) + if( (aInfo.m_nFontType & FontSubsetInfo::ANY_TYPE1) == 0 ) goto streamend; // see whether it is pfb or pfa; if it is a pfb, fill ranges // of 6 bytes that are not part of the font program @@ -2841,6 +3024,7 @@ std::map< sal_Int32, sal_Int32 > PDFWriterImpl::emitEmbeddedFont( const ImplFont } // search for eexec + // TODO: use getPfbSegmentLengths() if possible to skip the search thingies below nIndex = 0; int nEndAsciiIndex; int nBeginBinaryIndex; @@ -3537,22 +3721,28 @@ sal_Int32 PDFWriterImpl::emitFontDescriptor( const ImplFontData* pFont, FontSubs // According to PDF reference 1.4 StemV is required // seems a tad strange to me, but well ... aLine.append( "\n" - "/StemV 80\n" - "/FontFile" ); - switch( rInfo.m_nFontType ) + "/StemV 80\n" ); + if( nFontStream ) { - case SAL_FONTSUBSETINFO_TYPE_TRUETYPE: - aLine.append( '2' ); - break; - case SAL_FONTSUBSETINFO_TYPE_TYPE1: - break; - default: - DBG_ERROR( "unknown fonttype in PDF font descriptor" ); - return 0; + aLine.append( "/FontFile" ); + switch( rInfo.m_nFontType ) + { + case FontSubsetInfo::SFNT_TTF: + aLine.append( '2' ); + break; + case FontSubsetInfo::TYPE1_PFA: + case FontSubsetInfo::TYPE1_PFB: + case FontSubsetInfo::ANY_TYPE1: + break; + default: + DBG_ERROR( "unknown fonttype in PDF font descriptor" ); + return 0; + } + aLine.append( ' ' ); + aLine.append( nFontStream ); + aLine.append( " 0 R\n" ); } - aLine.append( ' ' ); - aLine.append( nFontStream ); - aLine.append( " 0 R>>\n" + aLine.append( ">>\n" "endobj\n\n" ); CHECK_RETURN( writeBuffer( aLine.getStr(), aLine.getLength() ) ); @@ -3577,7 +3767,6 @@ bool PDFWriterImpl::emitFonts() return false; OStringBuffer aLine( 1024 ); - char buf[8192]; std::map< sal_Int32, sal_Int32 > aFontIDToObject; @@ -3620,14 +3809,13 @@ bool PDFWriterImpl::emitFonts() FontSubsetInfo aSubsetInfo; if( m_pReferenceDevice->mpGraphics->CreateFontSubset( aTmpName, it->first, pGlyphIDs, pEncoding, pWidths, nGlyphs, aSubsetInfo ) ) { - DBG_ASSERT( aSubsetInfo.m_nFontType == SAL_FONTSUBSETINFO_TYPE_TRUETYPE, "wrong font type in font subset" ); // create font stream oslFileHandle aFontFile; CHECK_RETURN( (osl_File_E_None == osl_openFile( aTmpName.pData, &aFontFile, osl_File_OpenFlag_Read ) ) ); // get file size - sal_uInt64 nLength; + sal_uInt64 nLength1; CHECK_RETURN( (osl_File_E_None == osl_setFilePos( aFontFile, osl_Pos_End, 0 ) ) ); - CHECK_RETURN( (osl_File_E_None == osl_getFilePos( aFontFile, &nLength ) ) ); + CHECK_RETURN( (osl_File_E_None == osl_getFilePos( aFontFile, &nLength1 ) ) ); CHECK_RETURN( (osl_File_E_None == osl_setFilePos( aFontFile, osl_Pos_Absolut, 0 ) ) ); #if OSL_DEBUG_LEVEL > 1 @@ -3649,25 +3837,74 @@ bool PDFWriterImpl::emitFonts() "/Filter/FlateDecode" #endif "/Length1 " ); - aLine.append( (sal_Int32)nLength ); + + sal_uInt64 nStartPos = 0; + if( aSubsetInfo.m_nFontType == FontSubsetInfo::SFNT_TTF ) + { + aLine.append( (sal_Int32)nLength1 ); + aLine.append( ">>\n" "stream\n" ); CHECK_RETURN( writeBuffer( aLine.getStr(), aLine.getLength() ) ); - - sal_uInt64 nStartPos = 0; CHECK_RETURN( (osl_File_E_None == osl_getFilePos( m_aFile, &nStartPos ) ) ); // copy font file beginCompression(); checkAndEnableStreamEncryption( nFontStream ); - sal_uInt64 nRead; sal_Bool bEOF = sal_False; do { + char buf[8192]; + sal_uInt64 nRead; CHECK_RETURN( (osl_File_E_None == osl_readFile( aFontFile, buf, sizeof( buf ), &nRead ) ) ); CHECK_RETURN( writeBuffer( buf, nRead ) ); CHECK_RETURN( (osl_File_E_None == osl_isEndOfFile( aFontFile, &bEOF ) ) ); } while( ! bEOF ); + } + else if( (aSubsetInfo.m_nFontType & FontSubsetInfo::CFF_FONT) != 0 ) + { + // TODO: implement + DBG_ERROR( "PDFWriterImpl does not support CFF-font subsets yet!" ); + } + else if( (aSubsetInfo.m_nFontType & FontSubsetInfo::TYPE1_PFB) != 0 ) // TODO: also support PFA? + { + unsigned char* pBuffer = new unsigned char[ (int)nLength1 ]; + + sal_uInt64 nBytesRead = 0; + CHECK_RETURN( (osl_File_E_None == osl_readFile( aFontFile, pBuffer, nLength1, &nBytesRead ) ) ); + DBG_ASSERT( nBytesRead==nLength1, "PDF-FontSubset read incomplete!" ); + CHECK_RETURN( (osl_File_E_None == osl_setFilePos( aFontFile, osl_Pos_Absolut, 0 ) ) ); + // get the PFB-segment lengths + ThreeInts aSegmentLengths = {0,0,0}; + getPfbSegmentLengths( pBuffer, (int)nBytesRead, aSegmentLengths ); + // the lengths below are mandatory for PDF-exported Type1 fonts + // because the PFB segment headers get stripped! WhyOhWhy. + aLine.append( (sal_Int32)aSegmentLengths[0] ); + aLine.append( "/Length2 " ); + aLine.append( (sal_Int32)aSegmentLengths[1] ); + aLine.append( "/Length3 " ); + aLine.append( (sal_Int32)aSegmentLengths[2] ); + + aLine.append( ">>\n" + "stream\n" ); + CHECK_RETURN( writeBuffer( aLine.getStr(), aLine.getLength() ) ); + CHECK_RETURN( (osl_File_E_None == osl_getFilePos( m_aFile, &nStartPos ) ) ); + + // emit PFB-sections without section headers + beginCompression(); + checkAndEnableStreamEncryption( nFontStream ); + CHECK_RETURN( writeBuffer( pBuffer+ 6, aSegmentLengths[0] ) ); + CHECK_RETURN( writeBuffer( pBuffer+12 + aSegmentLengths[0], aSegmentLengths[1] ) ); + CHECK_RETURN( writeBuffer( pBuffer+18 + aSegmentLengths[0] + aSegmentLengths[1], aSegmentLengths[2] ) ); + + delete[] pBuffer; + } + else + { + fprintf( stderr, "PDF: CreateFontSubset result in not yet supported format=%d\n",aSubsetInfo.m_nFontType); + aLine.append( "0 >>\nstream\n" ); + } + endCompression(); disableStreamEncryption(); // close the file @@ -3699,8 +3936,11 @@ bool PDFWriterImpl::emitFonts() CHECK_RETURN( updateObject( nFontObject ) ); aLine.setLength( 0 ); aLine.append( nFontObject ); - aLine.append( " 0 obj\n" - "<m_nFontID, aSubsetInfo.m_aPSName, aLine ); aLine.append( "\n" "/FirstChar 0\n" @@ -3759,6 +3999,17 @@ bool PDFWriterImpl::emitFonts() } } + // emit system fonts + for( FontEmbedData::iterator sit = m_aSystemFonts.begin(); sit != m_aSystemFonts.end(); ++sit ) + { + std::map< sal_Int32, sal_Int32 > aObjects = emitSystemFont( sit->first, sit->second ); + for( std::map< sal_Int32, sal_Int32 >::iterator fit = aObjects.begin(); fit != aObjects.end(); ++fit ) + { + CHECK_RETURN( fit->second ); + aFontIDToObject[ fit->first ] = fit->second; + } + } + OStringBuffer aFontDict( 1024 ); aFontDict.append( getFontDictObject() ); aFontDict.append( " 0 obj\n" @@ -4459,13 +4710,25 @@ void PDFWriterImpl::createDefaultEditAppearance( PDFWidget& rEdit, const PDFWrit // prepare font to use, draw field border Font aFont = drawFieldBorder( rEdit, rWidget, rSettings ); - sal_Int32 nBest = getBestBuiltinFont( aFont ); + sal_Int32 nBest = m_aContext.FieldsUseSystemFonts ? getSystemFont( aFont ): getBestBuiltinFont( aFont ); // prepare DA string OStringBuffer aDA( 32 ); appendNonStrokingColor( replaceColor( rWidget.TextColor, rSettings.GetFieldTextColor() ), aDA ); aDA.append( ' ' ); - aDA.append( m_aBuiltinFonts[nBest].getNameObject() ); + if( m_aContext.FieldsUseSystemFonts ) + { + aDA.append( "/F" ); + aDA.append( nBest ); + + OStringBuffer aDR( 32 ); + aDR.append( "/Font " ); + aDR.append( getFontDictObject() ); + aDR.append( " 0 R" ); + rEdit.m_aDRDict = aDR.makeStringAndClear(); + } + else + aDA.append( m_aBuiltinFonts[nBest].getNameObject() ); aDA.append( ' ' ); m_aPages[ m_nCurrentPage ].appendMappedLength( sal_Int32( aFont.GetHeight() ), aDA ); aDA.append( " Tf" ); @@ -4499,7 +4762,7 @@ void PDFWriterImpl::createDefaultListBoxAppearance( PDFWidget& rBox, const PDFWr // prepare font to use, draw field border Font aFont = drawFieldBorder( rBox, rWidget, rSettings ); - sal_Int32 nBest = getBestBuiltinFont( aFont ); + sal_Int32 nBest = m_aContext.FieldsUseSystemFonts ? getSystemFont( aFont ): getBestBuiltinFont( aFont ); beginRedirect( pListBoxStream, rBox.m_aRect ); OStringBuffer aAppearance( 64 ); @@ -4547,9 +4810,22 @@ void PDFWriterImpl::createDefaultListBoxAppearance( PDFWidget& rBox, const PDFWr aDA.append( " 2 Tr " ); } #endif + // prepare DA string appendNonStrokingColor( replaceColor( rWidget.TextColor, rSettings.GetFieldTextColor() ), aDA ); aDA.append( ' ' ); - aDA.append( m_aBuiltinFonts[nBest].getNameObject() ); + if( m_aContext.FieldsUseSystemFonts ) + { + aDA.append( "/F" ); + aDA.append( nBest ); + + OStringBuffer aDR( 32 ); + aDR.append( "/Font " ); + aDR.append( getFontDictObject() ); + aDR.append( " 0 R" ); + rBox.m_aDRDict = aDR.makeStringAndClear(); + } + else + aDA.append( m_aBuiltinFonts[nBest].getNameObject() ); aDA.append( ' ' ); m_aPages[ m_nCurrentPage ].appendMappedLength( sal_Int32( aFont.GetHeight() ), aDA ); aDA.append( " Tf" ); @@ -5126,9 +5402,18 @@ bool PDFWriterImpl::emitWidgetAnnotations() } if( rWidget.m_aDAString.getLength() ) { - aLine.append( "/DR<>>>\n" ); + if( rWidget.m_aDRDict.getLength() ) + { + aLine.append( "/DR<<" ); + aLine.append( rWidget.m_aDRDict ); + aLine.append( ">>\n" ); + } + else + { + aLine.append( "/DR<>>>\n" ); + } aLine.append( "/DA" ); appendLiteralStringEncrypt( rWidget.m_aDAString, rWidget.m_nObject, aLine ); aLine.append( "\n" ); @@ -6269,6 +6554,29 @@ std::set< PDFWriter::ErrorCode > PDFWriterImpl::getErrors() return m_aErrors; } +sal_Int32 PDFWriterImpl::getSystemFont( const Font& i_rFont ) +{ + getReferenceDevice()->Push(); + getReferenceDevice()->SetFont( i_rFont ); + getReferenceDevice()->ImplNewFont(); + + const ImplFontData* pDevFont = m_pReferenceDevice->mpFontEntry->maFontSelData.mpFontData; + sal_Int32 nFontID = 0; + FontEmbedData::iterator it = m_aSystemFonts.find( pDevFont ); + if( it != m_aSystemFonts.end() ) + nFontID = it->second.m_nNormalFontID; + else + { + nFontID = m_nNextFID++; + m_aSystemFonts[ pDevFont ] = EmbedFont(); + m_aSystemFonts[ pDevFont ].m_nNormalFontID = nFontID; + } + + getReferenceDevice()->Pop(); + getReferenceDevice()->ImplNewFont(); + + return nFontID; +} void PDFWriterImpl::registerGlyphs( int nGlyphs, sal_GlyphId* pGlyphs, @@ -6635,6 +6943,7 @@ void PDFWriterImpl::drawHorizontalGlyphs( // subsequent use of that operator would move // the texline matrix relative to what was set before // making use of that would drive us into rounding issues + Matrix3 aMat; if( nRun == 0 && fAngle == 0.0 && fXScale == 1.0 && fSkew == 0.0 ) { m_aPages.back().appendPoint( aCurPos, rLine, false ); @@ -6642,7 +6951,6 @@ void PDFWriterImpl::drawHorizontalGlyphs( } else { - Matrix3 aMat; if( fSkew != 0.0 ) aMat.skew( 0.0, fSkew ); aMat.scale( fXScale, 1.0 ); @@ -6665,17 +6973,20 @@ void PDFWriterImpl::drawHorizontalGlyphs( appendHex( rGlyphs[nBeginRun].m_nMappedGlyphId, aKernedLine ); appendHex( rGlyphs[nBeginRun].m_nMappedGlyphId, aUnkernedLine ); + aMat.invert(); bool bNeedKern = false; for( sal_uInt32 nPos = nBeginRun+1; nPos < aRunEnds[nRun]; nPos++ ) { appendHex( rGlyphs[nPos].m_nMappedGlyphId, aUnkernedLine ); - // check for adjustment - double fTheoreticalGlyphWidth = rGlyphs[nPos].m_aPos.X() - rGlyphs[nPos-1].m_aPos.X(); - fTheoreticalGlyphWidth = fabs( fTheoreticalGlyphWidth ); // #i100522# workaround until #i87686# gets fixed - fTheoreticalGlyphWidth = 1000.0 * fTheoreticalGlyphWidth / fXScale / double(nPixelFontHeight); - sal_Int32 nAdjustment = rGlyphs[nPos-1].m_nNativeWidth - sal_Int32(fTheoreticalGlyphWidth+0.5); + // check if default glyph positioning is sufficient + const Point aThisPos = aMat.transform( rGlyphs[nPos].m_aPos ); + const Point aPrevPos = aMat.transform( rGlyphs[nPos-1].m_aPos ); + double fAdvance = aThisPos.X() - aPrevPos.X(); + fAdvance *= 1000.0 / nPixelFontHeight; + const sal_Int32 nAdjustment = (sal_Int32)(rGlyphs[nPos-1].m_nNativeWidth - fAdvance + 0.5); if( nAdjustment != 0 ) { + // apply individual glyph positioning bNeedKern = true; aKernedLine.append( ">" ); aKernedLine.append( nAdjustment ); @@ -7187,7 +7498,8 @@ void PDFWriterImpl::drawText( const Rectangle& rRect, const String& rOrigStr, US if ( nTextHeight ) { - nMaxTextWidth = m_pReferenceDevice->ImplGetTextLines( aMultiLineInfo, nWidth, aStr, nStyle ); + ::vcl::DefaultTextLayout aLayout( *m_pReferenceDevice ); + nMaxTextWidth = OutputDevice::ImplGetTextLines( aMultiLineInfo, nWidth, aStr, nStyle, aLayout ); nLines = (xub_StrLen)(nHeight/nTextHeight); nFormatLines = aMultiLineInfo.Count(); if ( !nLines ) @@ -8524,6 +8836,8 @@ void PDFWriterImpl::drawPolyLine( const Polygon& rPoly, const PDFWriter::ExtLine for(sal_uInt32 a(0); a < nEdgeCount; a++) { + if( a > 0 ) + aLine.append( " " ); const sal_uInt32 nNextIndex((a + 1) % nPointCount); const basegfx::B2DPoint aNext(aPoly.getB2DPoint(nNextIndex)); @@ -8670,6 +8984,13 @@ bool PDFWriterImpl::writeTransparentObject( TransparencyEmit& rObject ) aLine.append( ' ' ); appendFixedInt( rObject.m_aBoundRect.Bottom()+1, aLine ); aLine.append( " ]\n" ); + if( ! rObject.m_pSoftMaskStream ) + { + if( ! m_bIsPDF_A1 ) + { + aLine.append( "/Group<>\n" ); + } + } /* #i42884# the PDF reference recommends that each Form XObject * should have a resource dict; alas if that is the same object * as the one of the page it triggers an endless recursion in @@ -10011,12 +10332,17 @@ void PDFWriterImpl::setFont( const Font& rFont ) void PDFWriterImpl::push( sal_uInt16 nFlags ) { + OSL_ENSURE( m_aGraphicsStack.size() > 0, "invalid graphics stack" ); m_aGraphicsStack.push_front( m_aGraphicsStack.front() ); m_aGraphicsStack.front().m_nFlags = nFlags; } void PDFWriterImpl::pop() { + OSL_ENSURE( m_aGraphicsStack.size() > 1, "pop without push" ); + if( m_aGraphicsStack.size() < 2 ) + return; + GraphicsState aState = m_aGraphicsStack.front(); m_aGraphicsStack.pop_front(); GraphicsState& rOld = m_aGraphicsStack.front(); @@ -11777,3 +12103,4 @@ according to the table 3.15, pdf v 1.4 */ m_aContext.Encrypt = false; //then turn the encryption off } /* end i12626 methods */ + diff --git a/vcl/source/gdi/pdfwriter_impl.hxx b/vcl/source/gdi/pdfwriter_impl.hxx index 50c0bafc0489..e058cfa487db 100644 --- a/vcl/source/gdi/pdfwriter_impl.hxx +++ b/vcl/source/gdi/pdfwriter_impl.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: pdfwriter_impl.hxx,v $ - * $Revision: 1.55.134.2 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -57,7 +54,7 @@ class ImplFontSelectData; class ImplFontMetricData; -struct FontSubsetInfo; +class FontSubsetInfo; class ZCodec; // the maximum password length @@ -314,6 +311,8 @@ public: { sal_Int32 m_nNormalFontID; std::list< EmbedEncoding > m_aExtendedEncodings; + + EmbedFont() : m_nNormalFontID( 0 ) {} }; typedef std::map< const ImplFontData*, EmbedFont > FontEmbedData; @@ -399,6 +398,7 @@ public: USHORT m_nTextStyle; rtl::OUString m_aValue; rtl::OString m_aDAString; + rtl::OString m_aDRDict; rtl::OString m_aMKDict; rtl::OString m_aMKDictCAString; // i12626, added to be able to encrypt the /CA text string // since the object number is not known at the moment @@ -615,6 +615,7 @@ private: FontSubsetData m_aSubsets; bool m_bEmbedStandardFonts; FontEmbedData m_aEmbeddedFonts; + FontEmbedData m_aSystemFonts; sal_Int32 m_nNextFID; PDFFontCache m_aFontCache; @@ -682,6 +683,7 @@ private: m_aOverlineColor( COL_TRANSPARENT ), m_nAntiAlias( 1 ), m_nLayoutMode( 0 ), + m_aDigitLanguage( 0 ), m_nTransparentPercent( 0 ), m_nFlags( 0xffff ), m_nUpdateFlags( 0xffff ) @@ -696,6 +698,7 @@ private: m_aClipRegion( rState.m_aClipRegion ), m_nAntiAlias( rState.m_nAntiAlias ), m_nLayoutMode( rState.m_nLayoutMode ), + m_aDigitLanguage( rState.m_aDigitLanguage ), m_nTransparentPercent( rState.m_nTransparentPercent ), m_nFlags( rState.m_nFlags ), m_nUpdateFlags( rState.m_nUpdateFlags ) @@ -713,6 +716,7 @@ private: m_aClipRegion = rState.m_aClipRegion; m_nAntiAlias = rState.m_nAntiAlias; m_nLayoutMode = rState.m_nLayoutMode; + m_aDigitLanguage = rState.m_aDigitLanguage; m_nTransparentPercent = rState.m_nTransparentPercent; m_nFlags = rState.m_nFlags; m_nUpdateFlags = rState.m_nUpdateFlags; @@ -900,6 +904,8 @@ i12626 sal_Int32 emitBuiltinFont( const ImplFontData*, sal_Int32 nObject = -1 ); /* writes a type1 embedded font object and returns its mapping from font ids to object ids (or 0 in case of failure ) */ std::map< sal_Int32, sal_Int32 > emitEmbeddedFont( const ImplFontData*, EmbedFont& ); + /* writes a type1 system font object and returns its mapping from font ids to object ids (or 0 in case of failure ) */ + std::map< sal_Int32, sal_Int32 > emitSystemFont( const ImplFontData*, EmbedFont& ); /* writes a font descriptor and returns its object id (or 0) */ sal_Int32 emitFontDescriptor( const ImplFontData*, FontSubsetInfo&, sal_Int32 nSubsetID, sal_Int32 nStream ); /* writes a ToUnicode cmap, returns the corresponding stream object */ @@ -986,6 +992,7 @@ i12626 sal_Int32 findRadioGroupWidget( const PDFWriter::RadioButtonWidget& rRadio ); Font replaceFont( const Font& rControlFont, const Font& rAppSetFont ); sal_Int32 getBestBuiltinFont( const Font& rFont ); + sal_Int32 getSystemFont( const Font& i_rFont ); // used for edit and listbox Font drawFieldBorder( PDFWidget&, const PDFWriter::AnyWidget&, const StyleSettings& ); diff --git a/vcl/source/gdi/pngread.cxx b/vcl/source/gdi/pngread.cxx index 56c9025018b9..834116a9ffe9 100644 --- a/vcl/source/gdi/pngread.cxx +++ b/vcl/source/gdi/pngread.cxx @@ -156,6 +156,7 @@ private: BOOL mbIDAT; // TRUE if finished with enough IDAT chunks BOOL mbGamma; // TRUE if Gamma Correction available BOOL mbpHYs; // TRUE if pysical size of pixel available + sal_Bool mbIgnoreGammaChunk; bool ReadNextChunk(); void ReadRemainingChunks(); @@ -186,6 +187,7 @@ public: BitmapEx GetBitmapEx( const Size& rPreviewSizeHint ); const std::vector< PNGReader::ChunkData >& GetAllChunks(); + void SetIgnoreGammaChunk( sal_Bool bIgnore ){ mbIgnoreGammaChunk = bIgnore; }; }; // ------------------------------------------------------------------------------ @@ -205,8 +207,9 @@ PNGReaderImpl::PNGReaderImpl( SvStream& rPNGStream ) mbzCodecInUse ( sal_False ), mbStatus( TRUE), mbIDAT( FALSE ), - mbGamma ( sal_False ), - mbpHYs ( sal_False ) + mbGamma ( sal_False ), + mbpHYs ( sal_False ), + mbIgnoreGammaChunk ( sal_False ) { // prepare the PNG data stream mnOrigStreamMode = mrPNGStream.GetNumberFormatInt(); @@ -382,9 +385,9 @@ BitmapEx PNGReaderImpl::GetBitmapEx( const Size& rPreviewSizeHint ) break; case PNGCHUNK_gAMA : // the gamma chunk must precede - { - if ( mbIDAT == FALSE ) // the 'IDAT' and also the - ImplGetGamma(); // 'PLTE'(if available ) + { // the 'IDAT' and also the 'PLTE'(if available ) + if ( !mbIgnoreGammaChunk && ( mbIDAT == FALSE ) ) + ImplGetGamma(); } break; @@ -1568,4 +1571,12 @@ const std::vector< vcl::PNGReader::ChunkData >& PNGReader::GetChunks() const return mpImpl->GetAllChunks(); } +// ------------------------------------------------------------------------ + +void PNGReader::SetIgnoreGammaChunk( sal_Bool b ) +{ + mpImpl->SetIgnoreGammaChunk( b ); +} + + } // namespace vcl diff --git a/vcl/source/gdi/print.cxx b/vcl/source/gdi/print.cxx index 0a5fbb189885..937d966b3978 100644 --- a/vcl/source/gdi/print.cxx +++ b/vcl/source/gdi/print.cxx @@ -70,44 +70,22 @@ int nImplSysDialog = 0; // ======================================================================= -#define PAPER_SLOPPY 50 // Bigger sloppy value as PaperInfo uses only mm accuracy! -#define PAPER_COUNT 9 - -// Use more accurate metric values for Letter/Legal/Tabloid paper formats -static long ImplPaperFormats[PAPER_COUNT*2] = +namespace { - 29700, 42000, // A3 - 21000, 29700, // A4 - 14800, 21000, // A5 - 25000, 35300, // B4 - 17600, 25000, // B5 - 21590, 27940, // Letter - 21590, 35570, // Legal - 27960, 43130, // Tabloid - 0, 0 // USER -}; - -// ======================================================================= - -Paper ImplGetPaperFormat( long nWidth100thMM, long nHeight100thMM ) -{ - USHORT i; - - for( i = 0; i < PAPER_COUNT; i++ ) + static Paper ImplGetPaperFormat( long nWidth100thMM, long nHeight100thMM ) { - if ( (ImplPaperFormats[i*2] == nWidth100thMM) && - (ImplPaperFormats[i*2+1] == nHeight100thMM) ) - return (Paper)i; + PaperInfo aInfo(nWidth100thMM, nHeight100thMM); + aInfo.doSloppyFit(); + return aInfo.getPaper(); } - for( i = 0; i < PAPER_COUNT; i++ ) - { - if ( (Abs( ImplPaperFormats[i*2]-nWidth100thMM ) < PAPER_SLOPPY) && - (Abs( ImplPaperFormats[i*2+1]-nHeight100thMM ) < PAPER_SLOPPY) ) - return (Paper)i; - } +// ----------------------------------------------------------------------- - return PAPER_USER; + static const PaperInfo& ImplGetEmptyPaper() + { + static PaperInfo aInfo(PAPER_USER); + return aInfo; + } } // ======================================================================= @@ -121,8 +99,9 @@ void ImplUpdateJobSetupPaper( JobSetup& rJobSetup ) if ( pConstData->mePaperFormat != PAPER_USER ) { ImplJobSetup* pData = rJobSetup.ImplGetData(); - pData->mnPaperWidth = ImplPaperFormats[((USHORT)pConstData->mePaperFormat)*2]; - pData->mnPaperHeight = ImplPaperFormats[((USHORT)pConstData->mePaperFormat)*2+1]; + PaperInfo aInfo(pConstData->mePaperFormat); + pData->mnPaperWidth = aInfo.getWidth(); + pData->mnPaperHeight = aInfo.getHeight(); } } else if ( pConstData->mePaperFormat == PAPER_USER ) @@ -997,17 +976,6 @@ USHORT Printer::GetPaperBin() const // ----------------------------------------------------------------------- -static BOOL ImplPaperSizeEqual( unsigned long nPaperWidth1, unsigned long nPaperHeight1, - unsigned long nPaperWidth2, unsigned long nPaperHeight2 ) -{ - const long PAPER_ACCURACY = 1; // 1.0 mm accuracy - - return ( (Abs( long(nPaperWidth1)-long(nPaperWidth2) ) <= PAPER_ACCURACY ) && - (Abs( long(nPaperHeight1)-long(nPaperHeight2) ) <= PAPER_ACCURACY ) ); -} - -// ----------------------------------------------------------------------- - // Map user paper format to a available printer paper formats void Printer::ImplFindPaperFormatForUserSize( JobSetup& aJobSetup ) { @@ -1016,21 +984,17 @@ void Printer::ImplFindPaperFormatForUserSize( JobSetup& aJobSetup ) int nLandscapeAngle = GetLandscapeAngle(); int nPaperCount = GetPaperInfoCount(); - unsigned long nPaperWidth = pSetupData->mnPaperWidth/100; - unsigned long nPaperHeight = pSetupData->mnPaperHeight/100; + PaperInfo aInfo(pSetupData->mnPaperWidth, pSetupData->mnPaperHeight); // Alle Papierformate vergleichen und ein passendes raussuchen for ( int i = 0; i < nPaperCount; i++ ) { - const vcl::PaperInfo& rPaperInfo = GetPaperInfo( i ); + const PaperInfo& rPaperInfo = GetPaperInfo( i ); - if ( ImplPaperSizeEqual( rPaperInfo.m_nPaperWidth, - rPaperInfo.m_nPaperHeight, - nPaperWidth, - nPaperHeight ) ) + if ( aInfo.sloppyEqual(rPaperInfo) ) { - pSetupData->mePaperFormat = ImplGetPaperFormat( rPaperInfo.m_nPaperWidth*100, - rPaperInfo.m_nPaperHeight*100 ); + pSetupData->mePaperFormat = ImplGetPaperFormat( rPaperInfo.getWidth(), + rPaperInfo.getHeight() ); break; } } @@ -1042,17 +1006,17 @@ void Printer::ImplFindPaperFormatForUserSize( JobSetup& aJobSetup ) nLandscapeAngle != 0 && HasSupport( SUPPORT_SET_ORIENTATION )) { + + PaperInfo aRotatedInfo(pSetupData->mnPaperHeight, pSetupData->mnPaperWidth); + for ( int i = 0; i < nPaperCount; i++ ) { - const vcl::PaperInfo& rPaperInfo = GetPaperInfo( i ); + const PaperInfo& rPaperInfo = GetPaperInfo( i ); - if ( ImplPaperSizeEqual( rPaperInfo.m_nPaperWidth, - rPaperInfo.m_nPaperHeight, - nPaperHeight, - nPaperWidth )) + if ( aRotatedInfo.sloppyEqual( rPaperInfo ) ) { - pSetupData->mePaperFormat = ImplGetPaperFormat( rPaperInfo.m_nPaperWidth*100, - rPaperInfo.m_nPaperHeight*100 ); + pSetupData->mePaperFormat = ImplGetPaperFormat( rPaperInfo.getWidth(), + rPaperInfo.getHeight() ); break; } } @@ -1073,8 +1037,9 @@ BOOL Printer::SetPaper( Paper ePaper ) pSetupData->mePaperFormat = ePaper; if ( ePaper != PAPER_USER ) { - pSetupData->mnPaperWidth = ImplPaperFormats[((USHORT)ePaper)*2]; - pSetupData->mnPaperHeight = ImplPaperFormats[((USHORT)ePaper)*2+1]; + PaperInfo aInfo(ePaper); + pSetupData->mnPaperWidth = aInfo.getWidth(); + pSetupData->mnPaperHeight = aInfo.getHeight(); } if ( IsDisplayPrinter() ) @@ -1110,9 +1075,8 @@ BOOL Printer::SetPaperSizeUser( const Size& rSize ) if ( mbInPrintPage ) return FALSE; - MapMode aMap100thMM( MAP_100TH_MM ); Size aPixSize = LogicToPixel( rSize ); - Size aPageSize = PixelToLogic( aPixSize, aMap100thMM ); + Size aPageSize = PixelToLogic( aPixSize, MAP_100TH_MM ); if ( (maJobSetup.ImplGetConstData()->mePaperFormat != PAPER_USER) || (maJobSetup.ImplGetConstData()->mnPaperWidth != aPageSize.Width()) || (maJobSetup.ImplGetConstData()->mnPaperHeight != aPageSize.Height()) ) @@ -1150,15 +1114,6 @@ BOOL Printer::SetPaperSizeUser( const Size& rSize ) return TRUE; } - -// ----------------------------------------------------------------------- - -static const vcl::PaperInfo& ImplGetEmptyPaper() -{ - static vcl::PaperInfo aInfo; - return aInfo; -} - // ----------------------------------------------------------------------- int Printer::GetPaperInfoCount() const @@ -1172,7 +1127,7 @@ int Printer::GetPaperInfoCount() const // ----------------------------------------------------------------------- -const vcl::PaperInfo& Printer::GetPaperInfo( int nPaper ) const +const PaperInfo& Printer::GetPaperInfo( int nPaper ) const { if( ! mpInfoPrinter ) return ImplGetEmptyPaper(); @@ -1185,17 +1140,6 @@ const vcl::PaperInfo& Printer::GetPaperInfo( int nPaper ) const // ----------------------------------------------------------------------- -BOOL Printer::SetPaperFromInfo( const vcl::PaperInfo& rInfo ) -{ - MapMode aMap( MAP_MM ); - Size aSize( rInfo.m_nPaperWidth, rInfo.m_nPaperHeight ); - aSize = LogicToPixel( aSize, aMap ); - aSize = PixelToLogic( aSize ); - return SetPaperSizeUser( aSize ); -} - -// ----------------------------------------------------------------------- - DuplexMode Printer::GetDuplexMode() const { return mpInfoPrinter ? mpInfoPrinter->GetDuplexMode( maJobSetup.ImplGetConstData() ) : DUPLEX_UNKNOWN; @@ -1210,38 +1154,6 @@ int Printer::GetLandscapeAngle() const // ----------------------------------------------------------------------- -const vcl::PaperInfo& Printer::GetCurrentPaperInfo() const -{ - if( ! mpInfoPrinter ) - return ImplGetEmptyPaper(); - if( ! mpInfoPrinter->m_bPapersInit ) - mpInfoPrinter->InitPaperFormats( maJobSetup.ImplGetConstData() ); - if( mpInfoPrinter->m_aPaperFormats.empty() ) - return ImplGetEmptyPaper(); - - MapMode aMap( MAP_MM ); - Size aSize = PixelToLogic( GetPaperSizePixel(), aMap ); - int nMatch = -1; - long nDelta = 0; - for( unsigned int i = 0; i < mpInfoPrinter->m_aPaperFormats.size(); i++ ) - { - long nW = mpInfoPrinter->m_aPaperFormats[i].m_nPaperWidth; - long nH = mpInfoPrinter->m_aPaperFormats[i].m_nPaperHeight; - if( nW >= (aSize.Width()-1) && nH >= (aSize.Height()-1) ) - { - long nCurDelta = (nW - aSize.Width())*(nW - aSize.Width()) + (nH - aSize.Height() )*(nH - aSize.Height() ); - if( nMatch == -1 || nCurDelta < nDelta ) - { - nMatch = i; - nDelta = nCurDelta; - } - } - } - return nMatch != -1 ? mpInfoPrinter->m_aPaperFormats[nMatch] : ImplGetEmptyPaper(); -} - -// ----------------------------------------------------------------------- - Paper Printer::GetPaper() const { return maJobSetup.ImplGetConstData()->mePaperFormat; diff --git a/vcl/source/gdi/regband.cxx b/vcl/source/gdi/regband.cxx index 938a30351f9a..09c97ef7cd2b 100644 --- a/vcl/source/gdi/regband.cxx +++ b/vcl/source/gdi/regband.cxx @@ -110,7 +110,7 @@ ImplRegionBand::ImplRegionBand( if ( ! bIgnorePoints) { // Copy points. - ImplRegionBandPoint* pPoint = mpFirstBandPoint; + ImplRegionBandPoint* pPoint = rRegionBand.mpFirstBandPoint; ImplRegionBandPoint* pPrevPointCopy = NULL; while (pPoint != NULL) { diff --git a/vcl/source/gdi/region.cxx b/vcl/source/gdi/region.cxx index b98712419cf1..66865759db4b 100644 --- a/vcl/source/gdi/region.cxx +++ b/vcl/source/gdi/region.cxx @@ -153,7 +153,8 @@ void ImplAddMissingBands ( // We still have to cover two cases: // 1. The region does not yet contain any bands. // 2. The intervall nTop->nBottom extends past the bottom most band. - if (nCurrentTop < nBottom && (pBand==NULL || nBottom>pBand->mnYBottom)) + if (nCurrentTop <= nBottom + && (pBand==NULL || nBottom>pBand->mnYBottom)) { // When there is no previous band then the new one will be the // first. Otherwise the new band is inserted behind the last band. @@ -232,8 +233,9 @@ ImplRegion* ImplRectilinearPolygonToBands (const PolyPolygon& rPolyPoly) ImplRegionBand* pTopBand = pBand; // If necessary split the band at nTop so that nTop is contained // in the lower band. - if ( // Prevent the current band from becoming 0 pixel high - pBand->mnYTopmnYTopmnYBottom>=nTop // do not split a band that is just one pixel high @@ -248,8 +250,9 @@ ImplRegion* ImplRectilinearPolygonToBands (const PolyPolygon& rPolyPoly) pBand = pBand->mpNextBand; // The lowest band may have to be split at nBottom so that // nBottom itself remains in the upper band. - if ( // allow the current band becoming 1 pixel high - pBand->mnYTop<=nBottom + if (pBand!=NULL + // allow the current band becoming 1 pixel high + && pBand->mnYTop<=nBottom // prevent splitting off a band that is 0 pixel high && pBand->mnYBottom>nBottom // do not split a band that is just one pixel high @@ -2456,6 +2459,14 @@ SvStream& operator>>( SvStream& rIStrm, Region& rRegion ) } } + if( rIStrm.IsEof() ) + { + DBG_ERROR( "premature end of region stream" ); + delete rRegion.mpImplRegion; + rRegion.mpImplRegion = (ImplRegion*)&aImplEmptyRegion; + return rIStrm; + } + // get next header rIStrm >> nTmp16; } @@ -2534,7 +2545,13 @@ SvStream& operator<<( SvStream& rOStrm, const Region& rRegion ) rOStrm << bHasPolyPolygon; if( bHasPolyPolygon ) - rOStrm << rRegion.GetPolyPolygon(); + { + // #i105373# + PolyPolygon aNoCurvePolyPolygon; + rRegion.GetPolyPolygon().AdaptiveSubdivide(aNoCurvePolyPolygon); + + rOStrm << aNoCurvePolyPolygon; + } } return rOStrm; diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx index a96d4dc64b89..1f44b823ce44 100755 --- a/vcl/source/gdi/sallayout.cxx +++ b/vcl/source/gdi/sallayout.cxx @@ -63,6 +63,26 @@ #include +#ifdef DEBUG +//#define MULTI_SL_DEBUG +#endif + +#ifdef MULTI_SL_DEBUG +#include +FILE * mslLogFile = NULL; +FILE * mslLog() +{ +#ifdef MSC + std::string logFileName(getenv("TEMP")); + logFileName.append("\\msllayout.log"); + if (mslLogFile == NULL) mslLogFile = fopen(logFileName.c_str(),"w"); + else fflush(mslLogFile); + return mslLogFile; +#else + return stdout; +#endif +} +#endif // ======================================================================= // TODO: ask the glyph directly, for now we need this method because of #i99367# @@ -75,11 +95,12 @@ bool IsDiacritic( sal_UCS4 nChar ) if( nChar >= 0x2100 ) return false; + // TODO: #i105058# use icu uchar.h's character classification instead of the handcrafted table struct DiaRange { sal_UCS4 mnMin, mnEnd;}; static const DiaRange aRanges[] = { {0x0300, 0x0370}, - {0x0590, 0x05C0}, {0x05C1, 0x05C3}, {0x05C3, 0x05C6}, {0x05C7, 0x05C8}, - {0x0610, 0x061B}, {0x064B, 0x0660}, {0x0670, 0x0671}, {0x06D6, 0x06DC}, {0x06DF, 0x06EE}, + {0x0590, 0x05BE}, {0x05BF, 0x05C0}, {0x05C1, 0x05C3}, {0x05C4, 0x05C6}, {0x05C7, 0x05C8}, + {0x0610, 0x061B}, {0x064B, 0x0660}, {0x0670, 0x0671}, {0x06D6, 0x06DD}, {0x06DF, 0x06E5}, {0x06E7, 0x06E9}, {0x06EA,0x06EF}, {0x0730, 0x074D}, {0x07A6, 0x07B1}, {0x07EB, 0x07F4}, #if 0 // all known fonts have zero-width diacritics already, so no need to query it {0x0900, 0x0904}, {0x093C, 0x093D}, {0x0941, 0x0948}, {0x094D, 0x0950}, {0x0951, 0x0958}, @@ -87,7 +108,8 @@ bool IsDiacritic( sal_UCS4 nChar ) {0x0A00, 0x0A05}, {0x0A3C, 0x0A59}, //... #endif {0x1DC0, 0x1E00}, - {0x205F, 0x2070}, {0x20D0, 0x2100} + {0x205F, 0x2070}, {0x20D0, 0x2100}, + {0xFB1E, 0xFB1F} }; // TODO: almost anything is faster than an O(n) search @@ -1157,11 +1179,17 @@ void GenericSalLayout::ApplyDXArray( ImplLayoutArgs& rArgs ) for( int nCharPos = i = -1; rArgs.GetNextPos( &nCharPos, &bRTL ); ) { n = nCharPos - rArgs.mnMinCharPos; - i = pLogCluster[ n ]; - long nDelta = rArgs.mpDXArray[ n ] ; - if( n > 0 ) - nDelta -= rArgs.mpDXArray[ n-1 ]; - pNewGlyphWidths[ i ] += nDelta * mnUnitsPerPixel; + if( (n < 0) || (nCharCount <= n) ) continue; + + if( pLogCluster[ n ] >= 0 ) + i = pLogCluster[ n ]; + if( i >= 0 ) + { + long nDelta = rArgs.mpDXArray[ n ] ; + if( n > 0 ) + nDelta -= rArgs.mpDXArray[ n-1 ]; + pNewGlyphWidths[ i ] += nDelta * mnUnitsPerPixel; + } } // move cluster positions using the adjusted widths @@ -1768,6 +1796,19 @@ void MultiSalLayout::AdjustLayout( ImplLayoutArgs& rArgs ) } } + // Compute rtl flags, since in some scripts glyphs/char order can be + // reversed for a few character sequencies e.g. Myanmar + std::vector vRtl(rArgs.mnEndCharPos - rArgs.mnMinCharPos, false); + rArgs.ResetPos(); + bool bRtl; + int nRunStart, nRunEnd; + while (rArgs.GetNextRun(&nRunStart, &nRunEnd, &bRtl)) + { + if (bRtl) std::fill(vRtl.begin() + nRunStart - rArgs.mnMinCharPos, + vRtl.begin() + nRunEnd - rArgs.mnMinCharPos, true); + } + rArgs.ResetPos(); + // prepare "merge sort" int nStartOld[ MAX_FALLBACK ]; int nStartNew[ MAX_FALLBACK ]; @@ -1804,6 +1845,10 @@ void MultiSalLayout::AdjustLayout( ImplLayoutArgs& rArgs ) nStartNew[ nLevel ] = nStartOld[ nLevel ] = 0; nValid[ nLevel ] = mpLayouts[n]->GetNextGlyphs( 1, &nDummy, aPos, nStartNew[ nLevel ], &nGlyphAdv[ nLevel ], &nCharPos[ nLevel ] ); +#ifdef MULTI_SL_DEBUG + if (nValid[nLevel]) fprintf(mslLog(), "layout[%d]->GetNextGlyphs %d,%d x%d a%d c%d %x\n", n, nStartOld[nLevel], nStartNew[nLevel], aPos.X(), nGlyphAdv[nLevel], nCharPos[nLevel], + rArgs.mpStr[nCharPos[nLevel]]); +#endif if( (n > 0) && !nValid[ nLevel ] ) { // an empty fallback layout can be released @@ -1829,6 +1874,9 @@ void MultiSalLayout::AdjustLayout( ImplLayoutArgs& rArgs ) for( n = 0; n < nLevel; ++n ) maFallbackRuns[n].ResetPos(); int nActiveCharPos = nCharPos[0]; + int nLastRunEndChar = (vRtl[nActiveCharPos - mnMinCharPos])? + rArgs.mnEndCharPos : rArgs.mnMinCharPos - 1; + int nRunVisibleEndChar = nCharPos[0]; while( nValid[0] && (nLevel > 0)) { // find best fallback level @@ -1864,6 +1912,9 @@ void MultiSalLayout::AdjustLayout( ImplLayoutArgs& rArgs ) nStartOld[0] = nStartNew[0]; nValid[0] = mpLayouts[0]->GetNextGlyphs( 1, &nDummy, aPos, nStartNew[0], &nGlyphAdv[0], &nCharPos[0] ); +#ifdef MULTI_SL_DEBUG + if (nValid[0]) fprintf(mslLog(), "layout[0]->GetNextGlyphs %d,%d x%d a%d c%d %x\n", nStartOld[0], nStartNew[0], aPos.X(), nGlyphAdv[0], nCharPos[0], rArgs.mpStr[nCharPos[0]]); +#endif if( !nValid[0] ) break; } @@ -1881,7 +1932,9 @@ void MultiSalLayout::AdjustLayout( ImplLayoutArgs& rArgs ) int nOrigCharPos = nCharPos[n]; nValid[n] = mpLayouts[n]->GetNextGlyphs( 1, &nDummy, aPos, nStartNew[n], &nGlyphAdv[n], &nCharPos[n] ); - +#ifdef MULTI_SL_DEBUG + if (nValid[n]) fprintf(mslLog(), "layout[%d]->GetNextGlyphs %d,%d a%d c%d %x\n", n, nStartOld[n], nStartNew[n], nGlyphAdv[n], nCharPos[n], rArgs.mpStr[nCharPos[n]]); +#endif // break after last glyph of active layout if( !nValid[n] ) { @@ -1927,6 +1980,27 @@ void MultiSalLayout::AdjustLayout( ImplLayoutArgs& rArgs ) { maFallbackRuns[0].NextRun(); break; } bKeepNotDef = bNeedFallback; } + // check for reordered glyphs + if (aMultiArgs.mpDXArray && + nRunVisibleEndChar < mnEndCharPos && + nRunVisibleEndChar >= mnMinCharPos && + nCharPos[n] < mnEndCharPos && + nCharPos[n] >= mnMinCharPos) + { + if (vRtl[nActiveCharPos - mnMinCharPos]) + { + if (aMultiArgs.mpDXArray[nRunVisibleEndChar-mnMinCharPos] + >= aMultiArgs.mpDXArray[nCharPos[n] - mnMinCharPos]) + { + nRunVisibleEndChar = nCharPos[n]; + } + } + else if (aMultiArgs.mpDXArray[nRunVisibleEndChar-mnMinCharPos] + <= aMultiArgs.mpDXArray[nCharPos[n] - mnMinCharPos]) + { + nRunVisibleEndChar = nCharPos[n]; + } + } } // if a justification array is available @@ -1936,16 +2010,40 @@ void MultiSalLayout::AdjustLayout( ImplLayoutArgs& rArgs ) // the run advance is the width from the first char // in the run to the first char in the next run nRunAdvance = 0; - const bool bLTR = (nActiveCharPos < nCharPos[0]); +#ifdef MULTI_SL_DEBUG + const bool bLTR = !(vRtl[nActiveCharPos - mnMinCharPos]);//(nActiveCharPos < nCharPos[0]); + int nOldRunAdv = 0; int nDXIndex = nCharPos[0] - mnMinCharPos - bLTR; if( nDXIndex >= 0 ) - nRunAdvance += aMultiArgs.mpDXArray[ nDXIndex ]; + nOldRunAdv += aMultiArgs.mpDXArray[ nDXIndex ]; nDXIndex = nActiveCharPos - mnMinCharPos - bLTR; if( nDXIndex >= 0 ) - nRunAdvance -= aMultiArgs.mpDXArray[ nDXIndex ]; + nOldRunAdv -= aMultiArgs.mpDXArray[ nDXIndex ]; if( !bLTR ) - nRunAdvance = -nRunAdvance; - + nOldRunAdv = -nOldRunAdv; +#endif + if (vRtl[nActiveCharPos - mnMinCharPos]) + { + if (nRunVisibleEndChar > mnMinCharPos && nRunVisibleEndChar <= mnEndCharPos) + nRunAdvance -= aMultiArgs.mpDXArray[nRunVisibleEndChar - 1 - mnMinCharPos]; + if (nLastRunEndChar > mnMinCharPos && nLastRunEndChar <= mnEndCharPos) + nRunAdvance += aMultiArgs.mpDXArray[nLastRunEndChar - 1 - mnMinCharPos]; +#ifdef MULTI_SL_DEBUG + fprintf(mslLog(), "rtl visible %d-%d,%d-%d adv%d(%d)\n", nLastRunEndChar-1, nRunVisibleEndChar-1, nActiveCharPos - bLTR, nCharPos[0] - bLTR, nRunAdvance, nOldRunAdv); +#endif + } + else + { + if (nRunVisibleEndChar >= mnMinCharPos) + nRunAdvance += aMultiArgs.mpDXArray[nRunVisibleEndChar - mnMinCharPos]; + if (nLastRunEndChar >= mnMinCharPos) + nRunAdvance -= aMultiArgs.mpDXArray[nLastRunEndChar - mnMinCharPos]; +#ifdef MULTI_SL_DEBUG + fprintf(mslLog(), "visible %d-%d,%d-%d adv%d(%d)\n", nLastRunEndChar, nRunVisibleEndChar, nActiveCharPos - bLTR, nCharPos[0] - bLTR, nRunAdvance, nOldRunAdv); +#endif + } + nLastRunEndChar = nRunVisibleEndChar; + nRunVisibleEndChar = nCharPos[0]; // the requested width is still in pixel units // => convert it to base level font units nRunAdvance *= mnUnitsPerPixel; @@ -1963,9 +2061,27 @@ void MultiSalLayout::AdjustLayout( ImplLayoutArgs& rArgs ) // prepare for next fallback run nActiveCharPos = nCharPos[0]; + // it essential that the runs don't get ahead of themselves and in the + // if( bKeepNotDef && !bNeedFallback ) statement above, the next run may + // have already been reached on the base level for( int i = nFBLevel; --i >= 0;) - if( !maFallbackRuns[i].PosIsInRun( nActiveCharPos ) ) - maFallbackRuns[i].NextRun(); + { + if (maFallbackRuns[i].GetRun(&nRunStart, &nRunEnd, &bRtl)) + { + if (bRtl) + { + if (nRunStart > nActiveCharPos) + maFallbackRuns[i].NextRun(); + } + else + { + if (nRunEnd <= nActiveCharPos) + maFallbackRuns[i].NextRun(); + } + } + } +// if( !maFallbackRuns[i].PosIsInRun( nActiveCharPos ) ) +// maFallbackRuns[i].NextRun(); } mpLayouts[0]->Simplify( true ); diff --git a/vcl/source/gdi/salmisc.cxx b/vcl/source/gdi/salmisc.cxx index fc24c0289b50..8b442086eabf 100644 --- a/vcl/source/gdi/salmisc.cxx +++ b/vcl/source/gdi/salmisc.cxx @@ -426,10 +426,10 @@ BitmapBuffer* StretchAndConvert( const BitmapBuffer& rSrcBuffer, const SalTwoRec // memory exception, clean up // remark: the buffer ptr causing the exception // is still NULL here - delete pSrcScan; - delete pDstScan; - delete pMapX; - delete pMapY; + delete[] pSrcScan; + delete[] pDstScan; + delete[] pMapX; + delete[] pMapY; delete pDstBuffer; return NULL; } diff --git a/vcl/source/gdi/textlayout.cxx b/vcl/source/gdi/textlayout.cxx new file mode 100755 index 000000000000..67a30c351b7a --- /dev/null +++ b/vcl/source/gdi/textlayout.cxx @@ -0,0 +1,384 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2009 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* +* for a copy of the LGPLv3 License. +************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#include "vcl/ctrl.hxx" +#include "vcl/outdev.hxx" +#include "vcl/outfont.hxx" +#include "vcl/textlayout.hxx" + +#include + +#include + +#if OSL_DEBUG_LEVEL > 1 +#include +#endif + +//........................................................................ +namespace vcl +{ +//........................................................................ + + using ::com::sun::star::uno::Reference; + using ::com::sun::star::uno::Exception; + namespace ScriptDirection = ::com::sun::star::i18n::ScriptDirection; + + //==================================================================== + //= DefaultTextLayout + //==================================================================== + //-------------------------------------------------------------------- + DefaultTextLayout::~DefaultTextLayout() + { + } + + //-------------------------------------------------------------------- + long DefaultTextLayout::GetTextWidth( const XubString& _rText, xub_StrLen _nStartIndex, xub_StrLen _nLength ) const + { + return m_rTargetDevice.GetTextWidth( _rText, _nStartIndex, _nLength ); + } + + //-------------------------------------------------------------------- + void DefaultTextLayout::DrawText( const Point& _rStartPoint, const XubString& _rText, xub_StrLen _nStartIndex, + xub_StrLen _nLength, MetricVector* _pVector, String* _pDisplayText ) + { + m_rTargetDevice.DrawText( _rStartPoint, _rText, _nStartIndex, _nLength, _pVector, _pDisplayText ); + } + + //-------------------------------------------------------------------- + bool DefaultTextLayout::GetCaretPositions( const XubString& _rText, sal_Int32* _pCaretXArray, + xub_StrLen _nStartIndex, xub_StrLen _nLength ) const + { + return m_rTargetDevice.GetCaretPositions( _rText, _pCaretXArray, _nStartIndex, _nLength ); + } + + //-------------------------------------------------------------------- + xub_StrLen DefaultTextLayout::GetTextBreak( const XubString& _rText, long _nMaxTextWidth, xub_StrLen _nStartIndex, xub_StrLen _nLength ) const + { + return m_rTargetDevice.GetTextBreak( _rText, _nMaxTextWidth, _nStartIndex, _nLength ); + } + + //-------------------------------------------------------------------- + bool DefaultTextLayout::DecomposeTextRectAction() const + { + return false; + } + + //==================================================================== + //= ReferenceDeviceTextLayout + //==================================================================== + class ReferenceDeviceTextLayout : public ITextLayout + { + public: + ReferenceDeviceTextLayout( const Control& _rControl, OutputDevice& _rTargetDevice, OutputDevice& _rReferenceDevice ); + virtual ~ReferenceDeviceTextLayout(); + + // ITextLayout + virtual long GetTextWidth( const XubString& rStr, xub_StrLen nIndex, xub_StrLen nLen ) const; + virtual void DrawText( const Point& _rStartPoint, const XubString& _rText, xub_StrLen _nStartIndex, xub_StrLen _nLength, MetricVector* _pVector, String* _pDisplayText ); + virtual bool GetCaretPositions( const XubString& _rText, sal_Int32* _pCaretXArray, xub_StrLen _nStartIndex, xub_StrLen _nLength ) const; + virtual xub_StrLen GetTextBreak( const XubString& _rText, long _nMaxTextWidth, xub_StrLen _nStartIndex, xub_StrLen _nLength ) const; + virtual bool DecomposeTextRectAction() const; + + public: + // equivalents to the respective OutputDevice methods, which take the reference device into account + long GetTextArray( const XubString& _rText, sal_Int32* _pDXAry, xub_StrLen _nStartIndex, xub_StrLen _nLength ) const; + Rectangle DrawText( const Rectangle& _rRect, const XubString& _rText, USHORT _nStyle, MetricVector* _pVector, String* _pDisplayText ); + + protected: + void onBeginDrawText() + { + m_aCompleteTextRect.SetEmpty(); + } + Rectangle onEndDrawText() + { + return m_aCompleteTextRect; + } + + private: + OutputDevice& m_rTargetDevice; + OutputDevice& m_rReferenceDevice; + Font m_aUnzoomedPointFont; + const Fraction m_aZoom; + const bool m_bRTLEnabled; + + Rectangle m_aCompleteTextRect; + }; + + //==================================================================== + //= ControlTextRenderer + //==================================================================== + ReferenceDeviceTextLayout::ReferenceDeviceTextLayout( const Control& _rControl, OutputDevice& _rTargetDevice, + OutputDevice& _rReferenceDevice ) + :m_rTargetDevice( _rTargetDevice ) + ,m_rReferenceDevice( _rReferenceDevice ) + ,m_aUnzoomedPointFont( _rControl.GetUnzoomedControlPointFont() ) + ,m_aZoom( _rControl.GetZoom() ) + ,m_bRTLEnabled( _rControl.IsRTLEnabled() ) + { + m_rTargetDevice.Push( PUSH_MAPMODE | PUSH_FONT | PUSH_TEXTLAYOUTMODE ); + + MapMode aTargetMapMode( m_rTargetDevice.GetMapMode() ); + OSL_ENSURE( aTargetMapMode.GetOrigin() == Point(), "ReferenceDeviceTextLayout::ReferenceDeviceTextLayout: uhm, the code below won't work here ..." ); + + // normally, controls simulate "zoom" by "zooming" the font. This is responsible for (part of) the discrepancies + // between text in Writer and text in controls in Writer, though both have the same font. + // So, if we have a zoom set at the control, then we do not scale the font, but instead modify the map mode + // to accomodate for the zoom. + aTargetMapMode.SetScaleX( m_aZoom ); // TODO: shouldn't this be "current_scale * zoom"? + aTargetMapMode.SetScaleY( m_aZoom ); + + // also, use a higher-resolution map unit than "pixels", which should save us some rounding errors when + // translating coordinates between the reference device and the target device. + OSL_ENSURE( aTargetMapMode.GetMapUnit() == MAP_PIXEL, + "ReferenceDeviceTextLayout::ReferenceDeviceTextLayout: this class is not expected to work with such target devices!" ); + // we *could* adjust all the code in this class to handle this case, but at the moment, it's not necessary + const MapUnit eTargetMapUnit = m_rReferenceDevice.GetMapMode().GetMapUnit(); + aTargetMapMode.SetMapUnit( eTargetMapUnit ); + OSL_ENSURE( aTargetMapMode.GetMapUnit() != MAP_PIXEL, + "ReferenceDeviceTextLayout::ReferenceDeviceTextLayout: a reference device which has map mode PIXEL?!" ); + + m_rTargetDevice.SetMapMode( aTargetMapMode ); + + // now that the Zoom is part of the map mode, reset the target device's font to the "unzoomed" version + Font aDrawFont( m_aUnzoomedPointFont ); + aDrawFont.SetSize( m_rTargetDevice.LogicToLogic( aDrawFont.GetSize(), MAP_POINT, eTargetMapUnit ) ); + _rTargetDevice.SetFont( aDrawFont ); + + // transfer font to the reference device + m_rReferenceDevice.Push( PUSH_FONT | PUSH_TEXTLAYOUTMODE ); + Font aRefFont( m_aUnzoomedPointFont ); + aRefFont.SetSize( OutputDevice::LogicToLogic( + aRefFont.GetSize(), MAP_POINT, m_rReferenceDevice.GetMapMode().GetMapUnit() ) ); + m_rReferenceDevice.SetFont( aRefFont ); + } + + //-------------------------------------------------------------------- + ReferenceDeviceTextLayout::~ReferenceDeviceTextLayout() + { + m_rReferenceDevice.Pop(); + m_rTargetDevice.Pop(); + } + + //-------------------------------------------------------------------- + namespace + { + //................................................................ + bool lcl_normalizeLength( const XubString& _rText, const xub_StrLen _nStartIndex, xub_StrLen& _io_nLength ) + { + xub_StrLen nTextLength = _rText.Len(); + if ( _nStartIndex > nTextLength ) + return false; + if ( _nStartIndex + _io_nLength > nTextLength ) + _io_nLength = nTextLength - _nStartIndex; + return true; + } + } + + //-------------------------------------------------------------------- + long ReferenceDeviceTextLayout::GetTextArray( const XubString& _rText, sal_Int32* _pDXAry, xub_StrLen _nStartIndex, + xub_StrLen _nLength ) const + { + if ( !lcl_normalizeLength( _rText, _nStartIndex, _nLength ) ) + return 0; + + // retrieve the character widths from the reference device + long nTextWidth = m_rReferenceDevice.GetTextArray( _rText, _pDXAry, _nStartIndex, _nLength ); +#if OSL_DEBUG_LEVEL > 1 + if ( _pDXAry ) + { + ::rtl::OStringBuffer aTrace; + aTrace.append( "ReferenceDeviceTextLayout::GetTextArray( " ); + aTrace.append( ::rtl::OUStringToOString( _rText, RTL_TEXTENCODING_UTF8 ) ); + aTrace.append( " ): " ); + aTrace.append( nTextWidth ); + aTrace.append( " = ( " ); + for ( size_t i=0; i<_nLength; ) + { + aTrace.append( _pDXAry[i] ); + if ( ++i < _nLength ) + aTrace.append( ", " ); + } + aTrace.append( ")" ); + OSL_TRACE( aTrace.makeStringAndClear().getStr() ); + } +#endif + return nTextWidth; + } + + //-------------------------------------------------------------------- + long ReferenceDeviceTextLayout::GetTextWidth( const XubString& _rText, xub_StrLen _nStartIndex, xub_StrLen _nLength ) const + { + return GetTextArray( _rText, NULL, _nStartIndex, _nLength ); + } + + //-------------------------------------------------------------------- + void ReferenceDeviceTextLayout::DrawText( const Point& _rStartPoint, const XubString& _rText, xub_StrLen _nStartIndex, xub_StrLen _nLength, MetricVector* _pVector, String* _pDisplayText ) + { + if ( !lcl_normalizeLength( _rText, _nStartIndex, _nLength ) ) + return; + + if ( _pVector && _pDisplayText ) + { + MetricVector aGlyphBounds; + m_rReferenceDevice.GetGlyphBoundRects( _rStartPoint, _rText, _nStartIndex, _nLength, _nStartIndex, aGlyphBounds ); + ::std::copy( + aGlyphBounds.begin(), aGlyphBounds.end(), + ::std::insert_iterator< MetricVector > ( *_pVector, _pVector->end() ) ); + _pDisplayText->Append( _rText.Copy( _nStartIndex, _nLength ) ); + return; + } + + sal_Int32* pCharWidths = new sal_Int32[ _nLength ]; + long nTextWidth = GetTextArray( _rText, pCharWidths, _nStartIndex, _nLength ); + m_rTargetDevice.DrawTextArray( _rStartPoint, _rText, pCharWidths, _nStartIndex, _nLength ); + delete[] pCharWidths; + + m_aCompleteTextRect.Union( Rectangle( _rStartPoint, Size( nTextWidth, m_rTargetDevice.GetTextHeight() ) ) ); + } + + //-------------------------------------------------------------------- + bool ReferenceDeviceTextLayout::GetCaretPositions( const XubString& _rText, sal_Int32* _pCaretXArray, + xub_StrLen _nStartIndex, xub_StrLen _nLength ) const + { + if ( !lcl_normalizeLength( _rText, _nStartIndex, _nLength ) ) + return false; + + // retrieve the caret positions from the reference device + if ( !m_rReferenceDevice.GetCaretPositions( _rText, _pCaretXArray, _nStartIndex, _nLength ) ) + return false; + + return true; + } + + //-------------------------------------------------------------------- + xub_StrLen ReferenceDeviceTextLayout::GetTextBreak( const XubString& _rText, long _nMaxTextWidth, xub_StrLen _nStartIndex, xub_StrLen _nLength ) const + { + if ( !lcl_normalizeLength( _rText, _nStartIndex, _nLength ) ) + return 0; + + return m_rReferenceDevice.GetTextBreak( _rText, _nMaxTextWidth, _nStartIndex, _nLength ); + } + + //-------------------------------------------------------------------- + bool ReferenceDeviceTextLayout::DecomposeTextRectAction() const + { + return true; + } + + //-------------------------------------------------------------------- + namespace + { + long zoomBy( long _value, const Fraction& _zoom ) + { + double n = (double)_value; + n *= (double)_zoom.GetNumerator(); + n /= (double)_zoom.GetDenominator(); + return (long)::rtl::math::round( n ); + } + long unzoomBy( long _value, const Fraction& _zoom ) + { + return zoomBy( _value, Fraction( _zoom.GetDenominator(), _zoom.GetNumerator() ) ); + } + } + + //-------------------------------------------------------------------- + Rectangle ReferenceDeviceTextLayout::DrawText( const Rectangle& _rRect, const XubString& _rText, USHORT _nStyle, MetricVector* _pVector, String* _pDisplayText ) + { + if ( !_rText.Len() ) + return Rectangle(); + + // determine text layout mode from the RTL-ness of the control whose text we render + ULONG nTextLayoutMode = m_bRTLEnabled ? TEXT_LAYOUT_BIDI_RTL : TEXT_LAYOUT_BIDI_LTR; + m_rReferenceDevice.SetLayoutMode( nTextLayoutMode ); + m_rTargetDevice.SetLayoutMode( nTextLayoutMode | TEXT_LAYOUT_TEXTORIGIN_LEFT ); + // TEXT_LAYOUT_TEXTORIGIN_LEFT is because when we do actually draw the text (in DrawText( Point, ... )), then + // our caller gives us the left border of the draw position, regardless of script type, text layout, + // and the like + + // in our ctor, we set the map mode of the target device from pixel to twip, but our caller doesn't know this, + // but passed pixel coordinates. So, adjust the rect. + Rectangle aRect( m_rTargetDevice.PixelToLogic( _rRect ) ); + + onBeginDrawText(); + m_rTargetDevice.DrawText( aRect, _rText, _nStyle, _pVector, _pDisplayText, this ); + Rectangle aTextRect = onEndDrawText(); + + if ( aTextRect.IsEmpty() && !aRect.IsEmpty() ) + { + // this happens for instance if we're in a PaintToDevice call, where only a MetaFile is recorded, + // but no actual painting happens, so our "DrawText( Point, ... )" is never called + // In this case, calculate the rect from what OutputDevice::GetTextRect would give us. This has + // the disadvantage of less accuracy, compared with the approach to calculate the rect from the + // single "DrawText( Point, ... )" calls, since more intermediate arithmetics will translate + // from ref- to target-units. + aTextRect = m_rTargetDevice.GetTextRect( aRect, _rText, _nStyle, NULL, this ); + } + + // similar to above, the text rect now contains TWIPs (or whatever unit the ref device has), but the caller + // expects pixel coordinates + aTextRect = m_rTargetDevice.LogicToPixel( aTextRect ); + + // convert the metric vector + if ( _pVector ) + { + for ( MetricVector::iterator charRect = _pVector->begin(); + charRect != _pVector->end(); + ++charRect + ) + { + *charRect = m_rTargetDevice.LogicToPixel( *charRect ); + } + } + + return aTextRect; + } + + //==================================================================== + //= ControlTextRenderer + //==================================================================== + //-------------------------------------------------------------------- + ControlTextRenderer::ControlTextRenderer( const Control& _rControl, OutputDevice& _rTargetDevice, OutputDevice& _rReferenceDevice ) + :m_pImpl( new ReferenceDeviceTextLayout( _rControl, _rTargetDevice, _rReferenceDevice ) ) + { + } + + //-------------------------------------------------------------------- + ControlTextRenderer::~ControlTextRenderer() + { + } + + //-------------------------------------------------------------------- + Rectangle ControlTextRenderer::DrawText( const Rectangle& _rRect, const XubString& _rText, USHORT _nStyle, + MetricVector* _pVector, String* _pDisplayText ) + { + return m_pImpl->DrawText( _rRect, _rText, _nStyle, _pVector, _pDisplayText ); + } + +//........................................................................ +} // namespace vcl +//........................................................................ diff --git a/vcl/source/gdi/wall.cxx b/vcl/source/gdi/wall.cxx index e0c69ce582f4..587395fa783f 100644 --- a/vcl/source/gdi/wall.cxx +++ b/vcl/source/gdi/wall.cxx @@ -469,7 +469,7 @@ Gradient Wallpaper::ImplGetApplicationGradient() const g.SetStyle( GRADIENT_LINEAR ); g.SetStartColor( Application::GetSettings().GetStyleSettings().GetFaceColor() ); // no 'extreme' gradient when high contrast - if( Application::GetSettings().GetStyleSettings().GetFaceColor().IsDark() ) + if( Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) g.SetEndColor( Application::GetSettings().GetStyleSettings().GetFaceColor() ); else g.SetEndColor( Application::GetSettings().GetStyleSettings().GetFaceGradientColor() ); diff --git a/vcl/source/glyphs/gcach_ftyp.cxx b/vcl/source/glyphs/gcach_ftyp.cxx index d149ee26284f..18857b94af8f 100644 --- a/vcl/source/glyphs/gcach_ftyp.cxx +++ b/vcl/source/glyphs/gcach_ftyp.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: gcach_ftyp.cxx,v $ - * $Revision: 1.151 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -138,7 +135,8 @@ static int nFTVERSION = 0; static FT_Error (*pFTNewSize)(FT_Face,FT_Size*); static FT_Error (*pFTActivateSize)(FT_Size); static FT_Error (*pFTDoneSize)(FT_Size); -static FT_Error (*pFTEmbolden)(FT_GlyphSlot); +FT_Error (*pFTEmbolden)(FT_GlyphSlot); +FT_Error (*pFTOblique)(FT_GlyphSlot); static bool bEnableSizeFT = false; struct EqStr{ bool operator()(const char* a, const char* b) const { return !strcmp(a,b); } }; @@ -353,7 +351,7 @@ FT_FaceRec_* FtFontInfo::GetFaceFT() maFaceFT = NULL; } - return maFaceFT; + return maFaceFT; } // ----------------------------------------------------------------------- @@ -475,6 +473,7 @@ FreetypeManager::FreetypeManager() pFTActivateSize = (FT_Error(*)(FT_Size))(sal_IntPtr)dlsym( RTLD_DEFAULT, "FT_Activate_Size" ); pFTDoneSize = (FT_Error(*)(FT_Size))(sal_IntPtr)dlsym( RTLD_DEFAULT, "FT_Done_Size" ); pFTEmbolden = (FT_Error(*)(FT_GlyphSlot))(sal_IntPtr)dlsym( RTLD_DEFAULT, "FT_GlyphSlot_Embolden" ); + pFTOblique = (FT_Error(*)(FT_GlyphSlot))(sal_IntPtr)dlsym( RTLD_DEFAULT, "FT_GlyphSlot_Oblique" ); bEnableSizeFT = (pFTNewSize!=NULL) && (pFTActivateSize!=NULL) && (pFTDoneSize!=NULL); @@ -1058,7 +1057,7 @@ static inline void SplitGlyphFlags( const FreetypeServerFont& rFont, int& nGlyph // ----------------------------------------------------------------------- int FreetypeServerFont::ApplyGlyphTransform( int nGlyphFlags, - FT_GlyphRec_* pGlyphFT, bool bForBitmapProcessing ) const + FT_Glyph pGlyphFT, bool bForBitmapProcessing ) const { int nAngle = GetFontSelData().mnOrientation; // shortcut most common case @@ -1130,9 +1129,9 @@ int FreetypeServerFont::ApplyGlyphTransform( int nGlyphFlags, else { // FT<=2005 ignores transforms for bitmaps, so do it manually - FT_BitmapGlyph& rBmpGlyphFT = reinterpret_cast(pGlyphFT); - rBmpGlyphFT->left += (aVector.x + 32) >> 6; - rBmpGlyphFT->top += (aVector.y + 32) >> 6; + FT_BitmapGlyph pBmpGlyphFT = reinterpret_cast(pGlyphFT); + pBmpGlyphFT->left += (aVector.x + 32) >> 6; + pBmpGlyphFT->top += (aVector.y + 32) >> 6; } return nAngle; @@ -1425,6 +1424,20 @@ bool FreetypeServerFont::GetGlyphBitmap1( int nGlyphIndex, RawBitmap& rRawBitmap FT_Glyph_Transform( pGlyphFT, &aMatrix, NULL ); } + // Check for zero area bounding boxes as this crashes some versions of FT. + // This also provides a handy short cut as much of the code following + // becomes an expensive nop when a glyph covers no pixels. + FT_BBox cbox; + FT_Glyph_Get_CBox(pGlyphFT, ft_glyph_bbox_unscaled, &cbox); + + if( (cbox.xMax - cbox.xMin) == 0 || (cbox.yMax - cbox.yMin == 0) ) + { + nAngle = 0; + memset(&rRawBitmap, 0, sizeof rRawBitmap); + FT_Done_Glyph( pGlyphFT ); + return true; + } + if( pGlyphFT->format != FT_GLYPH_FORMAT_BITMAP ) { if( pGlyphFT->format == FT_GLYPH_FORMAT_OUTLINE ) @@ -1440,12 +1453,12 @@ bool FreetypeServerFont::GetGlyphBitmap1( int nGlyphIndex, RawBitmap& rRawBitmap } } - const FT_BitmapGlyph& rBmpGlyphFT = reinterpret_cast(pGlyphFT); + const FT_BitmapGlyph pBmpGlyphFT = reinterpret_cast(pGlyphFT); // NOTE: autohinting in FT<=2.0.2 miscalculates the offsets below by +-1 - rRawBitmap.mnXOffset = +rBmpGlyphFT->left; - rRawBitmap.mnYOffset = -rBmpGlyphFT->top; + rRawBitmap.mnXOffset = +pBmpGlyphFT->left; + rRawBitmap.mnYOffset = -pBmpGlyphFT->top; - const FT_Bitmap& rBitmapFT = rBmpGlyphFT->bitmap; + const FT_Bitmap& rBitmapFT = pBmpGlyphFT->bitmap; rRawBitmap.mnHeight = rBitmapFT.rows; rRawBitmap.mnBitCount = 1; if( mbArtBold && !pFTEmbolden ) @@ -1595,11 +1608,11 @@ bool FreetypeServerFont::GetGlyphBitmap8( int nGlyphIndex, RawBitmap& rRawBitmap } } - const FT_BitmapGlyph& rBmpGlyphFT = reinterpret_cast(pGlyphFT); - rRawBitmap.mnXOffset = +rBmpGlyphFT->left; - rRawBitmap.mnYOffset = -rBmpGlyphFT->top; + const FT_BitmapGlyph pBmpGlyphFT = reinterpret_cast(pGlyphFT); + rRawBitmap.mnXOffset = +pBmpGlyphFT->left; + rRawBitmap.mnYOffset = -pBmpGlyphFT->top; - const FT_Bitmap& rBitmapFT = rBmpGlyphFT->bitmap; + const FT_Bitmap& rBitmapFT = pBmpGlyphFT->bitmap; rRawBitmap.mnHeight = rBitmapFT.rows; rRawBitmap.mnWidth = rBitmapFT.width; rRawBitmap.mnBitCount = 8; @@ -1698,60 +1711,55 @@ bool FreetypeServerFont::GetGlyphBitmap8( int nGlyphIndex, RawBitmap& rRawBitmap // ----------------------------------------------------------------------- // TODO: replace with GetFontCharMap() -ULONG FreetypeServerFont::GetFontCodeRanges( sal_uInt32* pCodes ) const +bool FreetypeServerFont::GetFontCodeRanges( CmapResult& rResult ) const { - CmapResult aResult; - aResult.mnPairCount = 0; - aResult.mpPairCodes = NULL; - aResult.mbSymbolic = mpFontInfo->IsSymbolFont(); + rResult.mbSymbolic = mpFontInfo->IsSymbolFont(); + // TODO: is the full CmapResult needed on platforms calling this? if( FT_IS_SFNT( maFaceFT ) ) { ULONG nLength = 0; const unsigned char* pCmap = mpFontInfo->GetTable( "cmap", &nLength ); - if( pCmap && nLength && ParseCMAP( pCmap, nLength, aResult ) ) - { - // copy the ranges into the provided array... - if( pCodes ) - for( int i = 0; i < 2*aResult.mnPairCount; ++i ) - pCodes[ i ] = aResult.mpPairCodes[ i ]; - - delete[] aResult.mpPairCodes; - } + if( pCmap && (nLength > 0) ) + if( ParseCMAP( pCmap, nLength, rResult ) ) + return true; } - if( aResult.mnPairCount <= 0 ) + typedef std::vector U32Vector; + U32Vector aCodes; + + // FT's coverage is available since FT>=2.1.0 (OOo-baseline>=2.1.4 => ok) + aCodes.reserve( 0x1000 ); + FT_UInt nGlyphIndex; + for( sal_uInt32 cCode = FT_Get_First_Char( maFaceFT, &nGlyphIndex );; ) { - if( aResult.mbSymbolic ) - { - // we usually get here for Type1 symbol fonts - if( pCodes ) - { - pCodes[ 0 ] = 0xF020; - pCodes[ 1 ] = 0xF100; - } - aResult.mnPairCount = 1; - } - else - { - // we have to use the brute force method... - for( sal_uInt32 cCode = 0x0020;; ) - { - for(; cCode<0xFFF0 && !GetGlyphIndex( cCode ); ++cCode ) ; - if( cCode >= 0xFFF0 ) - break; - ++aResult.mnPairCount; - if( pCodes ) - *(pCodes++) = cCode; - for(; cCode<0xFFF0 && GetGlyphIndex( cCode ); ++cCode ) ; - if( pCodes ) - *(pCodes++) = cCode; - } - } + if( !nGlyphIndex ) + break; + aCodes.push_back( cCode ); // first code inside range + sal_uInt32 cNext = cCode; + do cNext = FT_Get_Next_Char( maFaceFT, cCode, &nGlyphIndex ); while( cNext == ++cCode ); + aCodes.push_back( cCode ); // first code outside range + cCode = cNext; } - return aResult.mnPairCount; + const int nCount = aCodes.size(); + if( !nCount) { + if( !rResult.mbSymbolic ) + return false; + + // we usually get here for Type1 symbol fonts + aCodes.push_back( 0xF020 ); + aCodes.push_back( 0xF100 ); + } + + sal_uInt32* pCodes = new sal_uInt32[ nCount ]; + for( int i = 0; i < nCount; ++i ) + pCodes[i] = aCodes[i]; + rResult.mpRangeCodes = pCodes; + rResult.mnRangeCount = nCount / 2; + return true; } + // ----------------------------------------------------------------------- // kerning stuff // ----------------------------------------------------------------------- @@ -2481,10 +2489,12 @@ bool FreetypeServerFont::ApplyGSUB( const ImplFontSelectData& rFSD ) { const USHORT nGlyph0 = GetUShort( pCoverage+0 ); const USHORT nGlyph1 = GetUShort( pCoverage+2 ); - const USHORT nCovIdx = GetUShort( pCoverage+4 ); + const USHORT nStartCoverageIndex = GetUShort( pCoverage+4 ); + DBG_ASSERT( aSubstVector.size() == nStartCoverageIndex, "coverage index mismatch"); + (void)nStartCoverageIndex; pCoverage += 6; for( USHORT j = nGlyph0; j <= nGlyph1; ++j ) - aSubstVector.push_back( GlyphSubst( j + nCovIdx, 0 ) ); + aSubstVector.push_back( GlyphSubst( j, 0 ) ); } } break; diff --git a/vcl/source/glyphs/gcach_ftyp.hxx b/vcl/source/glyphs/gcach_ftyp.hxx index 660f772d43ed..936abdc02e59 100644 --- a/vcl/source/glyphs/gcach_ftyp.hxx +++ b/vcl/source/glyphs/gcach_ftyp.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: gcach_ftyp.hxx,v $ - * $Revision: 1.41 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -208,7 +205,7 @@ protected: int ApplyGlyphTransform( int nGlyphFlags, FT_GlyphRec_*, bool ) const; virtual void InitGlyphData( int nGlyphIndex, GlyphData& ) const; - virtual ULONG GetFontCodeRanges( sal_uInt32* pCodes ) const; + virtual bool GetFontCodeRanges( CmapResult& ) const; bool ApplyGSUB( const ImplFontSelectData& ); virtual ServerFontLayoutEngine* GetLayoutEngine(); diff --git a/vcl/source/glyphs/gcach_layout.cxx b/vcl/source/glyphs/gcach_layout.cxx index 6bbf78f819b0..364a1fcd3beb 100755 --- a/vcl/source/glyphs/gcach_layout.cxx +++ b/vcl/source/glyphs/gcach_layout.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: gcach_layout.cxx,v $ - * $Revision: 1.46 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify diff --git a/vcl/source/glyphs/gcach_rbmp.cxx b/vcl/source/glyphs/gcach_rbmp.cxx index 9cba5332f281..1419a205f9a6 100755 --- a/vcl/source/glyphs/gcach_rbmp.cxx +++ b/vcl/source/glyphs/gcach_rbmp.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: gcach_rbmp.cxx,v $ - * $Revision: 1.10.114.1 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify diff --git a/vcl/source/glyphs/gcach_vdev.cxx b/vcl/source/glyphs/gcach_vdev.cxx index 31e0824ea0ba..1ac9ee9bf0a6 100644 --- a/vcl/source/glyphs/gcach_vdev.cxx +++ b/vcl/source/glyphs/gcach_vdev.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: gcach_vdev.cxx,v $ - * $Revision: 1.20 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify diff --git a/vcl/source/glyphs/gcach_vdev.hxx b/vcl/source/glyphs/gcach_vdev.hxx index ae90c23d46a4..01ebc0f704cd 100644 --- a/vcl/source/glyphs/gcach_vdev.hxx +++ b/vcl/source/glyphs/gcach_vdev.hxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: gcach_vdev.hxx,v $ - * $Revision: 1.11 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify diff --git a/vcl/source/glyphs/glyphcache.cxx b/vcl/source/glyphs/glyphcache.cxx index acfc8e3ac38d..e3e840e40730 100644 --- a/vcl/source/glyphs/glyphcache.cxx +++ b/vcl/source/glyphs/glyphcache.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: glyphcache.cxx,v $ - * $Revision: 1.44 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -41,6 +38,10 @@ #include #include +#ifdef ENABLE_GRAPHITE +#include +#endif + #include // used only for string=>hashvalue #include #include @@ -85,12 +86,23 @@ size_t GlyphCache::IFSD_Hash::operator()( const ImplFontSelectData& rFontSelData { // TODO: is it worth to improve this hash function? sal_IntPtr nFontId = reinterpret_cast( rFontSelData.mpFontData ); +#ifdef ENABLE_GRAPHITE + if (rFontSelData.maTargetName.Search(grutils::GrFeatureParser::FEAT_PREFIX) + != STRING_NOTFOUND) + { + rtl::OString aFeatName = rtl::OUStringToOString( rFontSelData.maTargetName, RTL_TEXTENCODING_UTF8 ); + nFontId ^= aFeatName.hashCode(); + } +#endif size_t nHash = nFontId << 8; nHash += rFontSelData.mnHeight; nHash += rFontSelData.mnOrientation; nHash += rFontSelData.mbVertical; nHash += rFontSelData.meItalic; nHash += rFontSelData.meWeight; +#ifdef ENABLE_GRAPHITE + nHash += rFontSelData.meLanguage; +#endif return nHash; } @@ -121,7 +133,16 @@ bool GlyphCache::IFSD_Equal::operator()( const ImplFontSelectData& rA, const Imp if( (rA.mnWidth != rB.mnWidth) && ((rA.mnHeight != rB.mnWidth) || (rA.mnWidth != 0)) ) return false; - +#ifdef ENABLE_GRAPHITE + if (rA.meLanguage != rB.meLanguage) + return false; + // check for features + if ((rA.maTargetName.Search(grutils::GrFeatureParser::FEAT_PREFIX) + != STRING_NOTFOUND || + rB.maTargetName.Search(grutils::GrFeatureParser::FEAT_PREFIX) + != STRING_NOTFOUND) && rA.maTargetName != rB.maTargetName) + return false; +#endif return true; } diff --git a/vcl/source/glyphs/graphite_adaptors.cxx b/vcl/source/glyphs/graphite_adaptors.cxx new file mode 100644 index 000000000000..34e2f5f5bbe3 --- /dev/null +++ b/vcl/source/glyphs/graphite_adaptors.cxx @@ -0,0 +1,329 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// Description: Implements the Graphite interfaces with access to the +// platform's font and graphics systems. + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +// We need this to enable namespace support in libgrengine headers. +#define GR_NAMESPACE + +// Header files +// +// Standard Library +#include +#include +// Libraries +#include +#include +#include +// Platform +#ifndef WNT +#include + +#include + +#include + +// Module +#include "gcach_ftyp.hxx" + +#include +#include + +// Module private type definitions and forward declarations. +// +using gr::GrResult; +namespace +{ + inline float from_hinted(const int x) { + return static_cast(x + 32) / 64.0; + } + typedef std::hash_map SilfMap; + SilfMap sSilfMap; +} +extern FT_Error (*pFTEmbolden)(FT_GlyphSlot); +extern FT_Error (*pFTOblique)(FT_GlyphSlot); + +// class CharacterRenderProperties implentation. +// +FontProperties::FontProperties(const FreetypeServerFont &font) throw() +{ + clrFore = gr::kclrBlack; + clrBack = gr::kclrTransparent; + + pixHeight = from_hinted(font.GetMetricsFT().height); + + switch (font.GetFontSelData().meWeight) + { + case WEIGHT_SEMIBOLD: case WEIGHT_BOLD: + case WEIGHT_ULTRABOLD: case WEIGHT_BLACK: + fBold = true; + break; + default : + fBold = false; + } + + switch (font.GetFontSelData().meItalic) + { + case ITALIC_NORMAL: case ITALIC_OBLIQUE: + fItalic = true; + break; + default : + fItalic = false; + } + + // Get the font name. + const sal_Unicode * name = font.GetFontSelData().maName.GetBuffer(); + const size_t name_sz = std::min(sizeof szFaceName/sizeof(wchar_t)-1, + size_t(font.GetFontSelData().maName.Len())); + + std::copy(name, name + name_sz, szFaceName); + szFaceName[name_sz] = '\0'; +} + +// class GraphiteFontAdaptor implementaion. +// +GraphiteFontAdaptor::GraphiteFontAdaptor(ServerFont & sfont, const sal_Int32 dpiX, const sal_Int32 dpiY) + : mrFont(static_cast(sfont)), + maFontProperties(static_cast(sfont)), + mnDpiX(dpiX), + mnDpiY(dpiY), + mfAscent(from_hinted(static_cast(sfont).GetMetricsFT().ascender)), + mfDescent(from_hinted(static_cast(sfont).GetMetricsFT().descender)), + mfEmUnits(static_cast(sfont).GetMetricsFT().y_ppem), + mpFeatures(NULL) +{ + //std::wstring face_name(maFontProperties.szFaceName); + const rtl::OString aLang = MsLangId::convertLanguageToIsoByteString( sfont.GetFontSelData().meLanguage ); +#ifdef DEBUG + printf("GraphiteFontAdaptor %lx\n", (long)this); +#endif + rtl::OString name = rtl::OUStringToOString( + sfont.GetFontSelData().maTargetName, RTL_TEXTENCODING_UTF8 ); + sal_Int32 nFeat = name.indexOf(grutils::GrFeatureParser::FEAT_PREFIX) + 1; + if (nFeat > 0) + { + rtl::OString aFeat = name.copy(nFeat, name.getLength() - nFeat); + mpFeatures = new grutils::GrFeatureParser(*this, aFeat.getStr(), aLang.getStr()); +#ifdef DEBUG + printf("GraphiteFontAdaptor %s/%s/%s %x language %d features %d errors\n", + rtl::OUStringToOString( sfont.GetFontSelData().maName, + RTL_TEXTENCODING_UTF8 ).getStr(), + rtl::OUStringToOString( sfont.GetFontSelData().maTargetName, + RTL_TEXTENCODING_UTF8 ).getStr(), + rtl::OUStringToOString( sfont.GetFontSelData().maSearchName, + RTL_TEXTENCODING_UTF8 ).getStr(), + sfont.GetFontSelData().meLanguage, + (int)mpFeatures->getFontFeatures(NULL), mpFeatures->parseErrors()); +#endif + } + else + { + mpFeatures = new grutils::GrFeatureParser(*this, aLang.getStr()); + } +} + +GraphiteFontAdaptor::GraphiteFontAdaptor(const GraphiteFontAdaptor &rhs) throw() + : Font(rhs), + mrFont (rhs.mrFont), maFontProperties(rhs.maFontProperties), + mnDpiX(rhs.mnDpiX), mnDpiY(rhs.mnDpiY), + mfAscent(rhs.mfAscent), mfDescent(rhs.mfDescent), mfEmUnits(rhs.mfEmUnits), + mpFeatures(NULL) +{ + if (rhs.mpFeatures) mpFeatures = new grutils::GrFeatureParser(*(rhs.mpFeatures)); +} + + +GraphiteFontAdaptor::~GraphiteFontAdaptor() throw() +{ + maGlyphMetricMap.clear(); + if (mpFeatures) delete mpFeatures; + mpFeatures = NULL; +} + +void GraphiteFontAdaptor::UniqueCacheInfo(std::wstring & face_name_out, bool & bold_out, bool & italic_out) +{ + face_name_out = maFontProperties.szFaceName; + bold_out = maFontProperties.fBold; + italic_out = maFontProperties.fItalic; +} + +bool GraphiteFontAdaptor::IsGraphiteEnabledFont(ServerFont & font) throw() +{ + // NOTE: this assumes that the same FTFace pointer won't be reused, + // so FtFontInfo::ReleaseFaceFT must only be called at shutdown. + FreetypeServerFont & aFtFont = dynamic_cast(font); + FT_Face aFace = reinterpret_cast(aFtFont.GetFtFace()); + SilfMap::iterator i = sSilfMap.find(reinterpret_cast(aFace)); + if (i != sSilfMap.end()) + { +#ifdef DEBUG + if (static_cast(aFtFont.GetTable("Silf", 0)) != (*i).second) + printf("Silf cache font mismatch\n"); +#endif + return (*i).second; + } + bool bHasSilf = aFtFont.GetTable("Silf", 0); + sSilfMap[reinterpret_cast(aFace)] = bHasSilf; + return bHasSilf; +} + + +gr::Font * GraphiteFontAdaptor::copyThis() { + return new GraphiteFontAdaptor(*this); +} + + +unsigned int GraphiteFontAdaptor::getDPIx() { + return mnDpiX; +} + + +unsigned int GraphiteFontAdaptor::getDPIy() { + return mnDpiY; +} + + +float GraphiteFontAdaptor::ascent() { + return mfAscent; +} + + +float GraphiteFontAdaptor::descent() { + return mfDescent; +} + + +bool GraphiteFontAdaptor::bold() { + return maFontProperties.fBold; +} + + +bool GraphiteFontAdaptor::italic() { + return maFontProperties.fItalic; +} + + +float GraphiteFontAdaptor::height() { + return maFontProperties.pixHeight; +} + + +void GraphiteFontAdaptor::getFontMetrics(float * ascent_out, float * descent_out, float * em_square_out) { + if (ascent_out) *ascent_out = mfAscent; + if (descent_out) *descent_out = mfDescent; + if (em_square_out) *em_square_out = mfEmUnits; +} + + +const void * GraphiteFontAdaptor::getTable(gr::fontTableId32 table_id, size_t * buffer_sz) +{ + char tag_name[5] = {char(table_id >> 24), char(table_id >> 16), char(table_id >> 8), char(table_id), 0}; + ULONG temp = *buffer_sz; + + const void * const tbl_buf = static_cast(mrFont).GetTable(tag_name, &temp); + *buffer_sz = temp; + + return tbl_buf; +} + +#define fix26_6(x) (x >> 6) + (x & 32 ? (x > 0 ? 1 : 0) : (x < 0 ? -1 : 0)) + +// Return the glyph's metrics in pixels. +void GraphiteFontAdaptor::getGlyphMetrics(gr::gid16 nGlyphId, gr::Rect & aBounding, gr::Point & advances) +{ + // Graphite gets really confused if the glyphs have been transformed, so + // if orientation has been set we can't use the font's glyph cache + // unfortunately the font selection data, doesn't always have the orientation + // set, even if it was when the glyphs were cached, so we use our own cache. + +// const GlyphMetric & metric = mrFont.GetGlyphMetric(nGlyphId); +// +// aBounding.right = aBounding.left = metric.GetOffset().X(); +// aBounding.bottom = aBounding.top = -metric.GetOffset().Y(); +// aBounding.right += metric.GetSize().Width(); +// aBounding.bottom -= metric.GetSize().Height(); +// +// advances.x = metric.GetDelta().X(); +// advances.y = -metric.GetDelta().Y(); + + GlyphMetricMap::const_iterator gm_itr = maGlyphMetricMap.find(nGlyphId); + if (gm_itr != maGlyphMetricMap.end()) + { + // We've cached the results from last time. + aBounding = gm_itr->second.first; + advances = gm_itr->second.second; + } + else + { + // We need to look up the glyph. + FT_Int nLoadFlags = mrFont.GetLoadFlags(); + + FT_Face aFace = reinterpret_cast(mrFont.GetFtFace()); + if (!aFace) + { + aBounding.top = aBounding.bottom = aBounding.left = aBounding.right = 0; + advances.x = advances.y = 0; + return; + } + FT_Error aStatus = -1; + aStatus = FT_Load_Glyph(aFace, nGlyphId, nLoadFlags); + if( aStatus != FT_Err_Ok || (!aFace->glyph)) + { + aBounding.top = aBounding.bottom = aBounding.left = aBounding.right = 0; + advances.x = advances.y = 0; + return; + } + // check whether we need synthetic bold/italic otherwise metric is wrong + if (mrFont.NeedsArtificialBold() && pFTEmbolden) + (*pFTEmbolden)(aFace->glyph); + + if (mrFont.NeedsArtificialItalic() && pFTOblique) + (*pFTOblique)(aFace->glyph); + + const FT_Glyph_Metrics &gm = aFace->glyph->metrics; + + // Fill out the bounding box an advances. + aBounding.top = aBounding.bottom = fix26_6(gm.horiBearingY); + aBounding.bottom -= fix26_6(gm.height); + aBounding.left = aBounding.right = fix26_6(gm.horiBearingX); + aBounding.right += fix26_6(gm.width); + advances.x = fix26_6(gm.horiAdvance); + advances.y = 0; + + // Now add an entry to our metrics map. + maGlyphMetricMap[nGlyphId] = std::make_pair(aBounding, advances); + } +} + +#endif diff --git a/vcl/source/glyphs/graphite_cache.cxx b/vcl/source/glyphs/graphite_cache.cxx new file mode 100644 index 000000000000..8c514c611d2c --- /dev/null +++ b/vcl/source/glyphs/graphite_cache.cxx @@ -0,0 +1,198 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#ifdef WNT +#include +#include +#endif + +#include +#include + +#include +#include + +#include +#include +#include + +#include "graphite_textsrc.hxx" + +GrSegRecord::GrSegRecord(rtl::OUString * rope, TextSourceAdaptor * textSrc, gr::Segment * seg, bool bIsRtl) + : m_rope(rope), m_text(textSrc), m_seg(seg), m_nextKey(NULL), + m_fontScale(0.0f), mbIsRtl(bIsRtl), m_lockCount(0) +{ + m_pStr = textSrc->getLayoutArgs().mpStr + seg->startCharacter(); + m_startChar = seg->startCharacter(); +} + +GrSegRecord::~GrSegRecord() +{ + clear(); +} + +void GrSegRecord::reuse(rtl::OUString * rope, TextSourceAdaptor * textSrc, gr::Segment * seg, bool bIsRtl) +{ + clear(); + mnWidth = 0; + m_rope = rope; + m_text = textSrc; + m_seg = seg; + m_nextKey = NULL; + m_pStr = textSrc->getLayoutArgs().mpStr + seg->startCharacter(); + m_startChar = seg->startCharacter(); + mbIsRtl = bIsRtl; +} + +void GrSegRecord::clearVectors() +{ + mvGlyphs.clear(); + mvCharDxs.clear(); + mvChar2BaseGlyph.clear(); + mvGlyph2Char.clear(); +} + +void GrSegRecord::clear() +{ +#ifdef GR_DEBUG_TEXT + if (m_lockCount != 0) + OutputDebugString("GrSegRecord locked!"); +#endif + clearVectors(); + delete m_rope; + delete m_seg; + delete m_text; + m_rope = NULL; + m_seg = NULL; + m_text = NULL; + m_fontScale = 0.0f; + m_lockCount = 0; +} + +GrSegRecord * GraphiteSegmentCache::cacheSegment(TextSourceAdaptor * adapter, gr::Segment * seg, bool bIsRtl) +{ + GrSegRecord * record = NULL; + // We keep a record of the oldest key and the last key added + // when the next key is added, the record for the prevKey's m_nextKey field + // is updated to the newest key so that m_oldestKey can be updated to the + // next oldest key when the record for m_oldestKey is deleted + if (m_segMap.size() > SEG_CACHE_SIZE) + { + GraphiteSegMap::iterator oldestPair = m_segMap.find(reinterpret_cast(m_oldestKey)); + // oldest record may no longer exist if a buffer was changed + if (oldestPair != m_segMap.end()) + { + record = oldestPair->second; + m_segMap.erase(reinterpret_cast(m_oldestKey)); + GrRMEntry range = m_ropeMap.equal_range((*(record->m_rope)).hashCode()); + while (range.first != range.second) + { + if (range.first->second == record) + { + m_ropeMap.erase(range.first); + break; + } + ++range.first; + } + m_oldestKey = record->m_nextKey; + // record will be reused, so don't delete + } + } + + +// const int seg_char_limit = min(adapter->maLayoutArgs().mnLength, +// adapter->maLayoutArgs().mnEndCharPos +// + GraphiteLayout::EXTRA_CONTEXT_LENGTH); +// if (seg->stopCharacter() - seg->startCharacter() <= 0) +// OutputDebugString("Invalid seg indices\n"); + rtl::OUString * pRope = new rtl::OUString(adapter->getLayoutArgs().mpStr + seg->startCharacter(), + seg->stopCharacter() - seg->startCharacter()); + if (!pRope) return NULL; + bool reuse = false; + if (record) + record->reuse(pRope, adapter, seg, bIsRtl); + else + record = new GrSegRecord(pRope, adapter, seg, bIsRtl); + if (!record) + { + delete pRope; + return NULL; + } + GraphiteSegMap::iterator iMap = + m_segMap.find(reinterpret_cast(record->m_pStr)); + if (iMap != m_segMap.end()) + { + // the buffer has changed, so the old cached Segment is useless + reuse = true; + GrSegRecord * found = iMap->second; + // Note: we reuse the old next key to avoid breaking our history + // chain. This means it will be prematurely deleted, but this is + // unlikely to happen very often. + record->m_nextKey = found->m_nextKey; + // overwrite the old record + m_segMap[reinterpret_cast(record->m_pStr)] = record; + // erase the old rope key and save the new one + GrRMEntry range = m_ropeMap.equal_range((*(found->m_rope)).hashCode()); + while (range.first != range.second) + { + if (range.first->second == found) + { + m_ropeMap.erase(range.first); + break; + } + ++range.first; + } + GraphiteRopeMap::value_type mapEntry(record->m_rope->hashCode(), record); + m_ropeMap.insert(mapEntry); + // remove the old record + delete found; + record->m_lockCount++; + return record; + } + m_segMap[reinterpret_cast(record->m_pStr)] = record; + GraphiteRopeMap::value_type mapEntry((*(record->m_rope)).hashCode(), record); + m_ropeMap.insert(mapEntry); + + if (m_oldestKey == NULL) + { + m_oldestKey = record->m_pStr; + m_prevKey = record->m_pStr; + } + else if (reuse == false) + { + DBG_ASSERT(m_segMap.count(reinterpret_cast(m_prevKey)), + "Previous key got lost somehow!"); + m_segMap.find(reinterpret_cast(m_prevKey)) + ->second->m_nextKey = record->m_pStr; + m_prevKey = record->m_pStr; + } + record->m_lockCount++; + return record; +} diff --git a/vcl/source/glyphs/graphite_features.cxx b/vcl/source/glyphs/graphite_features.cxx new file mode 100644 index 000000000000..dae1bfc2866e --- /dev/null +++ b/vcl/source/glyphs/graphite_features.cxx @@ -0,0 +1,289 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// Description: +// Parse a string of features specified as & separated pairs. +// e.g. +// 1001=1&2002=2&fav1=0 + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#include + +#ifdef WNT +#include +#include +#endif + +#include + +using namespace grutils; +// These mustn't conflict with font name lists which use ; and , +const char GrFeatureParser::FEAT_PREFIX = ':'; +const char GrFeatureParser::FEAT_SEPARATOR = '&'; +const char GrFeatureParser::FEAT_ID_VALUE_SEPARATOR = '='; +const std::string GrFeatureParser::ISO_LANG("lang"); + +GrFeatureParser::GrFeatureParser(gr::Font & font, const std::string lang) + : mnNumSettings(0), mbErrors(false) +{ + maLang.rgch[0] = maLang.rgch[1] = maLang.rgch[2] = maLang.rgch[3] = '\0'; + setLang(font, lang); +} + +GrFeatureParser::GrFeatureParser(gr::Font & font, const std::string features, const std::string lang) + : mnNumSettings(0), mbErrors(false) +{ + size_t nEquals = 0; + size_t nFeatEnd = 0; + size_t pos = 0; + maLang.rgch[0] = maLang.rgch[1] = maLang.rgch[2] = maLang.rgch[3] = '\0'; + setLang(font, lang); + while (pos < features.length() && mnNumSettings < MAX_FEATURES) + { + nEquals = features.find(FEAT_ID_VALUE_SEPARATOR,pos); + if (nEquals == std::string::npos) + { + mbErrors = true; + break; + } + // check for a lang=xxx specification + if (features.compare(pos, nEquals - pos, ISO_LANG) == 0) + { + pos = nEquals + 1; + nFeatEnd = features.find(FEAT_SEPARATOR, pos); + if (nFeatEnd == std::string::npos) + { + nFeatEnd = features.length(); + } + if (nFeatEnd - pos > 3) + mbErrors = true; + else + { + gr::isocode aLang = maLang; + for (size_t i = pos; i < nFeatEnd; i++) + aLang.rgch[i-pos] = features[i]; + std::pair aSupported + = font.getSupportedLanguages(); + gr::LanguageIterator iL = aSupported.first; + while (iL != aSupported.second) + { + gr::isocode aSupportedLang = *iL; + // here we only expect full 3 letter codes + if (aLang.rgch[0] == aSupportedLang.rgch[0] && + aLang.rgch[1] == aSupportedLang.rgch[1] && + aLang.rgch[2] == aSupportedLang.rgch[2] && + aLang.rgch[3] == aSupportedLang.rgch[3]) break; + ++iL; + } + if (iL == aSupported.second) mbErrors = true; + else maLang = aLang; + } + } + else + { + if (isCharId(features, pos, nEquals - pos)) + maSettings[mnNumSettings].id = getCharId(features, pos, nEquals - pos); + else maSettings[mnNumSettings].id = getIntValue(features, pos, nEquals - pos); + pos = nEquals + 1; + nFeatEnd = features.find(FEAT_SEPARATOR, pos); + if (nFeatEnd == std::string::npos) + { + nFeatEnd = features.length(); + } + if (isCharId(features, pos, nFeatEnd - pos)) + maSettings[mnNumSettings].value = getCharId(features, pos, nFeatEnd - pos); + else + maSettings[mnNumSettings].value= getIntValue(features, pos, nFeatEnd - pos); + if (isValid(font, maSettings[mnNumSettings])) + mnNumSettings++; + else + mbErrors = true; + } + pos = nFeatEnd + 1; + } +} + +void GrFeatureParser::setLang(gr::Font & font, const std::string & lang) +{ + gr::isocode aLang = {{0,0,0,0}}; + if (lang.length() > 2) + { + for (size_t i = 0; i < lang.length() && i < 3; i++) + { + if (lang[i] == '-') break; + aLang.rgch[i] = lang[i]; + } + std::pair aSupported + = font.getSupportedLanguages(); + gr::LanguageIterator iL = aSupported.first; + while (iL != aSupported.second) + { + gr::isocode aSupportedLang = *iL; + if (aLang.rgch[0] == aSupportedLang.rgch[0] && + aLang.rgch[1] == aSupportedLang.rgch[1] && + aLang.rgch[2] == aSupportedLang.rgch[2] && + aLang.rgch[3] == aSupportedLang.rgch[3]) break; + ++iL; + } + if (iL != aSupported.second) + maLang = aLang; +#ifdef DEBUG + else + printf("%s has no features\n", aLang.rgch); +#endif + } +} + +GrFeatureParser::GrFeatureParser(const GrFeatureParser & aCopy) + : maLang(aCopy.maLang), mbErrors(aCopy.mbErrors) +{ + mnNumSettings = aCopy.getFontFeatures(maSettings); +} + +GrFeatureParser::~GrFeatureParser() +{ +} + +size_t GrFeatureParser::getFontFeatures(gr::FeatureSetting settings[64]) const +{ + if (settings) + { + std::copy(maSettings, maSettings + mnNumSettings, settings); + } + return mnNumSettings; +} + +bool GrFeatureParser::isValid(gr::Font & font, gr::FeatureSetting & setting) +{ + gr::FeatureIterator i = font.featureWithID(setting.id); + if (font.getFeatures().second == i) + { + return false; + } + std::pair< gr::FeatureSettingIterator, gr::FeatureSettingIterator > + validValues = font.getFeatureSettings(i); + gr::FeatureSettingIterator j = validValues.first; + while (j != validValues.second) + { + if (*j == setting.value) return true; + ++j; + } + return false; +} + +bool GrFeatureParser::isCharId(const std::string & id, size_t offset, size_t length) +{ + if (length > 4) return false; + for (size_t i = 0; i < length; i++) + { + if (i > 0 && id[offset+i] == '\0') continue; + if ((id[offset+i]) < 0x20 || (id[offset+i]) < 0) + return false; + if (i==0 && id[offset+i] < 0x41) + return false; + } + return true; +} + +int GrFeatureParser::getCharId(const std::string & id, size_t offset, size_t length) +{ + FeatId charId; + charId.num = 0; +#ifdef WORDS_BIGENDIAN + for (size_t i = 0; i < length; i++) + { + charId.label[i] = id[offset+i]; + } +#else + for (size_t i = 0; i < length; i++) + { + charId.label[3-i] = id[offset+i]; + } +#endif + return charId.num; +} + +int GrFeatureParser::getIntValue(const std::string & id, size_t offset, size_t length) +{ + int value = 0; + int sign = 1; + for (size_t i = 0; i < length; i++) + { + switch (id[offset + i]) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + value *= 10; + if (sign < 0) + { + value = -(id[offset + i] - '0'); + sign = 1; + } + value += (id[offset + i] - '0'); + break; + case '-': + if (i == 0) + sign = -1; + else + { + mbErrors = true; + break; + } + default: + mbErrors = true; + break; + } + } + return value; +} + + +sal_Int32 GrFeatureParser::hashCode() const +{ + union IsoHash { sal_Int32 mInt; gr::isocode mCode; }; + IsoHash isoHash; + isoHash.mCode = maLang; + sal_Int32 hash = isoHash.mInt; + for (size_t i = 0; i < mnNumSettings; i++) + { + hash = (hash << 16) ^ ((maSettings[i].id << 8) | maSettings[i].value); + } + return hash; +} diff --git a/vcl/source/glyphs/graphite_layout.cxx b/vcl/source/glyphs/graphite_layout.cxx new file mode 100644 index 000000000000..86dee2749efa --- /dev/null +++ b/vcl/source/glyphs/graphite_layout.cxx @@ -0,0 +1,1367 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// Description: An implementation of the SalLayout interface that uses the +// Graphite engine. + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +// We need this to enable namespace support in libgrengine headers. +#define GR_NAMESPACE + +// Enable lots of debug info +#ifdef DEBUG +//#define GRLAYOUT_DEBUG 1 +//#undef NDEBUG +#endif + +// Header files +// +// Standard Library +#include +#include +#include +#include +#include +#include + +// Platform +#ifdef WNT +#include +#include +#endif + +#include + +#include +#include +#include + +// Graphite Libraries (must be after vcl headers on windows) +#include +#include +#include +#include +#include + +#include +#include +#include "graphite_textsrc.hxx" + + +// Module private type definitions and forward declarations. +// +// Module private names. +// + +#ifdef GRLAYOUT_DEBUG +FILE * grLogFile = NULL; +FILE * grLog() +{ +#ifdef WNT + std::string logFileName(getenv("TEMP")); + logFileName.append("\\graphitelayout.log"); + if (grLogFile == NULL) grLogFile = fopen(logFileName.c_str(),"w"); + else fflush(grLogFile); + return grLogFile; +#else + return stdout; +#endif +} +#endif + +#ifdef GRCACHE +#include +#endif + + +namespace +{ + typedef std::pair glyph_range_t; + typedef std::pair glyph_set_range_t; + + inline long round(const float n) { + return long(n + (n < 0 ? -0.5 : 0.5)); + } + + + template + inline bool in_range(const T i, const T b, const T e) { + return !(b > i) && i < e; + } + + + template + inline bool is_subrange(const T sb, const T se, const T b, const T e) { + return !(b > sb || se > e); + } + + + template + inline bool is_subrange(const std::pair &s, const T b, const T e) { + return is_subrange(s.first, s.second, b, e); + } + + int findSameDirLimit(const xub_Unicode* buffer, int charCount, bool rtl) + { + UErrorCode status = U_ZERO_ERROR; + UBiDi *ubidi = ubidi_openSized(charCount, 0, &status); + int limit = 0; + ubidi_setPara(ubidi, reinterpret_cast(buffer), charCount, + (rtl)?UBIDI_DEFAULT_RTL:UBIDI_DEFAULT_LTR, NULL, &status); + UBiDiLevel level = 0; + ubidi_getLogicalRun(ubidi, 0, &limit, &level); + ubidi_close(ubidi); + if ((rtl && !(level & 1)) || (!rtl && (level & 1))) + { + limit = 0; + } + return limit; + } + +} // namespace + + + +// Impementation of the GraphiteLayout::Glyphs container class. +// This is an extended vector class with methods added to enable +// o Correctly filling with glyphs. +// o Querying clustering relationships. +// o manipulations that affect neighouring glyphs. + +const int GraphiteLayout::EXTRA_CONTEXT_LENGTH = 10; +#ifdef GRCACHE +GraphiteCacheHandler GraphiteCacheHandler::instance; +#endif + +// The Graphite glyph stream is really a sequence of glyph attachment trees +// each rooted at a non-attached base glyph. fill_from walks the glyph stream +// find each non-attached base glyph and calls append to record them as a +// sequence of clusters. +void +GraphiteLayout::Glyphs::fill_from(gr::Segment & rSegment, ImplLayoutArgs &rArgs, + bool bRtl, long &rWidth, float fScaling, std::vector & rChar2Base, std::vector & rGlyph2Char, std::vector & rCharDxs) +{ + // Create a glyph item for each of the glyph and append it to the base class glyph list. + typedef std::pair< gr::GlyphSetIterator, gr::GlyphSetIterator > GrGlyphSet; + int nChar = rArgs.mnEndCharPos - rArgs.mnMinCharPos; + glyph_range_t iGlyphs = rSegment.glyphs(); + int nGlyphs = iGlyphs.second - iGlyphs.first; + gr::GlyphIterator prevBase = iGlyphs.second; + float fMinX = rSegment.advanceWidth(); + float fMaxX = 0.0f; + rGlyph2Char.assign(nGlyphs, -1); + long nDxOffset = 0; + int nGlyphIndex = (bRtl)? (nGlyphs - 1) : 0; + // OOo always expects the glyphs in ltr order + int nDelta = (bRtl)? -1 : 1; + + int nLastGlyph = (bRtl)? nGlyphs - 1: 0; + int nNextChar = (bRtl)? (rSegment.stopCharacter() - 1) : rSegment.startCharacter();//rArgs.mnMinCharPos; + // current glyph number (Graphite glyphs) + //int currGlyph = 0; + int nFirstCharInCluster = nNextChar; + int nFirstGlyphInCluster = nLastGlyph; + + // ltr first char in cluster is lowest, same is true for rtl + // ltr first glyph in cluster is lowest, rtl first glyph is highest + + // loop over the glyphs determining which characters are linked to them + gr::GlyphIterator gi; + for (gi = iGlyphs.first + nGlyphIndex; + nGlyphIndex >= 0 && nGlyphIndex < nGlyphs; + nGlyphIndex+= nDelta, gi = iGlyphs.first + nGlyphIndex) + { + gr::GlyphInfo info = (*gi); +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"Glyph %d %f,%f\n", (int)info.logicalIndex(), info.origin(), info.yOffset()); +#endif + // the last character associated with this glyph is after + // our current cluster buffer position + if ((bRtl && ((signed)info.firstChar() <= nNextChar)) || + (!bRtl && ((signed)info.lastChar() >= nNextChar))) + { + if ((bRtl && nGlyphIndex < nLastGlyph) || + (!bRtl && nGlyphIndex > nLastGlyph)) + { + // this glyph is after the previous one left->right + // if insertion is allowed before it then we are in a + // new cluster + int nAttachedBase = (*(info.attachedClusterBase())).logicalIndex(); + if (!info.isAttached() || + !in_range(nAttachedBase, nFirstGlyphInCluster, nGlyphIndex)) + { + if (in_range(nFirstCharInCluster, rArgs.mnMinCharPos, rArgs.mnEndCharPos) && + nFirstGlyphInCluster != nGlyphIndex) + { + std::pair aBounds = + appendCluster(rSegment, rArgs, bRtl, nFirstCharInCluster, + nNextChar, nFirstGlyphInCluster, nGlyphIndex, fScaling, + rChar2Base, rGlyph2Char, rCharDxs, nDxOffset); + fMinX = std::min(aBounds.first, fMinX); + fMaxX = std::max(aBounds.second, fMaxX); + } + nFirstCharInCluster = (bRtl)? info.lastChar() : info.firstChar(); + nFirstGlyphInCluster = nGlyphIndex; + } + nLastGlyph = (bRtl)? std::min(nGlyphIndex, nAttachedBase) : + std::max(nGlyphIndex, nAttachedBase); + } + // loop over chacters associated with this glyph and characters + // between nextChar and the last character associated with this glyph + // giving them the current cluster id. This allows for character /glyph + // order reversal. + // For each character we do a reverse glyph id look up + // and store the glyph id with the highest logical index in nLastGlyph + while ((bRtl && ((signed)info.firstChar() <= nNextChar)) || + (!bRtl && (signed)info.lastChar() >= nNextChar)) + { + GrGlyphSet charGlyphs = rSegment.charToGlyphs(nNextChar); + nNextChar += nDelta; + gr::GlyphSetIterator gj = charGlyphs.first; + while (gj != charGlyphs.second) + { + nLastGlyph = (bRtl)? min(nLastGlyph, (signed)(*gj).logicalIndex()) : max(nLastGlyph, (signed)(*gj).logicalIndex()); + ++gj; + } + } + // Loop over attached glyphs and make sure they are all in the cluster since you + // can have glyphs attached with another base glyph in between + glyph_set_range_t iAttached = info.attachedClusterGlyphs(); + for (gr::GlyphSetIterator agi = iAttached.first; agi != iAttached.second; ++agi) + { + nLastGlyph = (bRtl)? min(nLastGlyph, (signed)(*agi).logicalIndex()) : max(nLastGlyph, (signed)(*agi).logicalIndex()); + } + + // if this is a rtl attached glyph, then we need to include its + // base in the cluster, which will have a lower graphite index + if (bRtl) + { + if ((signed)info.attachedClusterBase()->logicalIndex() < nLastGlyph) + { + nLastGlyph = info.attachedClusterBase()->logicalIndex(); + } + } + } + + // it is possible for the lastChar to be after nextChar and + // firstChar to be before the nFirstCharInCluster in rare + // circumstances e.g. Myanmar word for cemetery + if ((bRtl && ((signed)info.lastChar() > nFirstCharInCluster)) || + (!bRtl && ((signed)info.firstChar() < nFirstCharInCluster))) + { + nFirstCharInCluster = info.firstChar(); + } + } + // process last cluster + if (in_range(nFirstCharInCluster, rArgs.mnMinCharPos, rArgs.mnEndCharPos) && + nFirstGlyphInCluster != nGlyphIndex) + { + std::pair aBounds = + appendCluster(rSegment, rArgs, bRtl, nFirstCharInCluster, nNextChar, + nFirstGlyphInCluster, nGlyphIndex, fScaling, + rChar2Base, rGlyph2Char, rCharDxs, nDxOffset); + fMinX = std::min(aBounds.first, fMinX); + fMaxX = std::max(aBounds.second, fMaxX); + } + long nXOffset = round(fMinX * fScaling); + rWidth = round(fMaxX * fScaling) - nXOffset + nDxOffset; + if (rWidth < 0) + { + // This can happen when there was no base inside the range + rWidth = 0; + } + // fill up non-base char dx with cluster widths from previous base glyph + if (bRtl) + { + if (rCharDxs[nChar-1] == -1) + rCharDxs[nChar-1] = 0; + else + rCharDxs[nChar-1] -= nXOffset; + for (int i = nChar - 2; i >= 0; i--) + { + if (rCharDxs[i] == -1) rCharDxs[i] = rCharDxs[i+1]; + else rCharDxs[i] -= nXOffset; + } + } + else + { + if (rCharDxs[0] == -1) + rCharDxs[0] = 0; + else + rCharDxs[0] -= nXOffset; + for (int i = 1; i < nChar; i++) + { + if (rCharDxs[i] == -1) rCharDxs[i] = rCharDxs[i-1]; + else rCharDxs[i] -= nXOffset; + } + } +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"Glyphs xOff%ld dropDx%ld w%ld\n", nXOffset, nDxOffset, rWidth); +#endif + // remove offset due to context if there is one + if (nXOffset != 0) + { + for (size_t i = 0; i < size(); i++) + (*this)[i].maLinearPos.X() -= nXOffset; + } +} + +std::pair GraphiteLayout::Glyphs::appendCluster(gr::Segment & rSeg, + ImplLayoutArgs & rArgs, bool bRtl, int nFirstCharInCluster, int nNextChar, + int nFirstGlyphInCluster, int nNextGlyph, float fScaling, + std::vector & rChar2Base, std::vector & rGlyph2Char, + std::vector & rCharDxs, long & rDXOffset) +{ + glyph_range_t iGlyphs = rSeg.glyphs(); + int nGlyphs = iGlyphs.second - iGlyphs.first; + int nDelta = (bRtl)? -1 : 1; + gr::GlyphInfo aFirstGlyph = *(iGlyphs.first + nFirstGlyphInCluster); + std::pair aBounds; + aBounds.first = aFirstGlyph.origin(); + aBounds.second = aFirstGlyph.origin(); + // before we add the glyphs to this vector, we record the + // glyph's index in the vector (which is not the same as + // the Segment's glyph index!) + assert(size() < rGlyph2Char.size()); + rChar2Base[nFirstCharInCluster-rArgs.mnMinCharPos] = size(); + rGlyph2Char[size()] = nFirstCharInCluster; + bool bBaseGlyph = true; + for (int j = nFirstGlyphInCluster; + j != nNextGlyph; j += nDelta) + { + long nNextOrigin; + float fNextOrigin; + gr::GlyphInfo aGlyph = *(iGlyphs.first + j); + if (j + nDelta >= nGlyphs || j + nDelta < 0) // at rhs ltr,rtl + { + fNextOrigin = rSeg.advanceWidth(); + nNextOrigin = round(rSeg.advanceWidth() * fScaling + rDXOffset); + aBounds.second = std::max(rSeg.advanceWidth(), aBounds.second); + } + else + { + gr::GlyphInfo aNextGlyph = *(iGlyphs.first + j + nDelta); + fNextOrigin = std::max(aNextGlyph.attachedClusterBase()->origin(), aNextGlyph.origin()); + aBounds.second = std::max(fNextOrigin, aBounds.second); + nNextOrigin = round(fNextOrigin * fScaling + rDXOffset); + } + aBounds.first = std::min(aGlyph.origin(), aBounds.first); + if ((signed)aGlyph.firstChar() < rArgs.mnEndCharPos && + (signed)aGlyph.firstChar() >= rArgs.mnMinCharPos) + { + rCharDxs[aGlyph.firstChar()-rArgs.mnMinCharPos] = nNextOrigin; + } + if ((signed)aGlyph.attachedClusterBase()->logicalIndex() == j) + { + append(rSeg, rArgs, aGlyph, fNextOrigin, fScaling, rChar2Base, rGlyph2Char, rCharDxs, rDXOffset, bBaseGlyph); + bBaseGlyph = false; + } + } + // from the point of view of the dx array, the xpos is + // the origin of the first glyph of the next cluster ltr + // rtl it is the origin of the 1st glyph of the cluster + long nXPos = (bRtl)? + round(aFirstGlyph.attachedClusterBase()->origin() * fScaling) + rDXOffset : + round(aBounds.second * fScaling) + rDXOffset; + // force the last char in range to have the width of the cluster + if (bRtl) + { + for (int n = nNextChar + 1; n <= nFirstCharInCluster; n++) + { + if ((n < rArgs.mnEndCharPos) && (n >= rArgs.mnMinCharPos)) + rCharDxs[n-rArgs.mnMinCharPos] = nXPos; + } + } + else + { + for (int n = nNextChar - 1; n >= nFirstCharInCluster; n--) + { + if (n < rArgs.mnEndCharPos && n >= rArgs.mnMinCharPos) + rCharDxs[n-rArgs.mnMinCharPos] = nXPos; + } + } +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"Cluster g[%d-%d) c[%d-%d)%x x%ld y%f\n", nFirstGlyphInCluster, nNextGlyph, nFirstCharInCluster, nNextChar, rArgs.mpStr[nFirstCharInCluster], nXPos, aFirstGlyph.yOffset()); +#endif + return aBounds; +} + +// append walks an attachment tree, flattening it, and converting it into a +// sequence of GlyphItem objects which we can later manipulate. +void +GraphiteLayout::Glyphs::append(gr::Segment &segment, ImplLayoutArgs &args, gr::GlyphInfo & gi, float nextGlyphOrigin, float scaling, std::vector & rChar2Base, std::vector & rGlyph2Char, std::vector & rCharDxs, long & rDXOffset, bool bIsBase) +{ + float nextOrigin = nextGlyphOrigin; + int firstChar = std::min(gi.firstChar(), gi.lastChar()); + assert(size() < rGlyph2Char.size()); + if (!bIsBase) rGlyph2Char[size()] = firstChar; + // is the next glyph attached or in the next cluster? + glyph_set_range_t iAttached = gi.attachedClusterGlyphs(); + if (iAttached.first != iAttached.second) + { + nextOrigin = iAttached.first->origin(); + } + long glyphId = gi.glyphID(); + long deltaOffset = 0; + int glyphWidth = round(nextOrigin * scaling) - round(gi.origin() * scaling); +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"c%d g%d gWidth%d x%f ", firstChar, (int)gi.logicalIndex(), glyphWidth, nextOrigin); +#endif + if (glyphId == 0) + { + args.NeedFallback( + firstChar, + gr::RightToLeftDir(gr::DirCode(gi.directionality()))); + if( (SAL_LAYOUT_FOR_FALLBACK & args.mnFlags )) + { + glyphId = GF_DROPPED; + deltaOffset -= glyphWidth; + glyphWidth = 0; + } + } + else if(args.mnFlags & SAL_LAYOUT_FOR_FALLBACK) + { +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"fallback c%d %x in run %d\n", firstChar, args.mpStr[firstChar], + args.maRuns.PosIsInAnyRun(firstChar)); +#endif + // glyphs that aren't requested for fallback will be taken from base + // layout, so mark them as dropped (should this wait until Simplify(false) is called?) + if (!args.maRuns.PosIsInAnyRun(firstChar) && + in_range(firstChar, args.mnMinCharPos, args.mnEndCharPos)) + { + glyphId = GF_DROPPED; + deltaOffset -= glyphWidth; + glyphWidth = 0; + } + } + // append this glyph. + long nGlyphFlags = bIsBase ? 0 : GlyphItem::IS_IN_CLUSTER; + // directionality seems to be unreliable + //nGlyphFlags |= gr::RightToLeftDir(gr::DirCode(gi.attachedClusterBase()->directionality())) ? GlyphItem::IS_RTL_GLYPH : 0; + nGlyphFlags |= (gi.directionLevel() & 0x1)? GlyphItem::IS_RTL_GLYPH : 0; + GlyphItem aGlyphItem(size(),//gi.logicalIndex(), + glyphId, + Point(round(gi.origin() * scaling + rDXOffset), + round((-gi.yOffset() * scaling) - segment.AscentOffset()* scaling)), + nGlyphFlags, + glyphWidth); + aGlyphItem.mnOrigWidth = round(gi.advanceWidth() * scaling); + push_back(aGlyphItem); + + // update the offset if this glyph was dropped + rDXOffset += deltaOffset; + + // Recursively apply append all the attached glyphs. + for (gr::GlyphSetIterator agi = iAttached.first; agi != iAttached.second; ++agi) + { + if (agi + 1 == iAttached.second) + append(segment, args, *agi, nextGlyphOrigin, scaling, rChar2Base, rGlyph2Char,rCharDxs, rDXOffset, false); + else + append(segment, args, *agi, (agi + 1)->origin(), scaling, rChar2Base, rGlyph2Char, rCharDxs, rDXOffset, false); + } +} + +// +// An implementation of the SalLayout interface to enable Graphite enabled fonts to be used. +// +GraphiteLayout::GraphiteLayout(const gr::Font & font, const grutils::GrFeatureParser * pFeatures) throw() + : mpTextSrc(0), + mrFont(font), + mnWidth(0), + mfScaling(1.0), + mpFeatures(pFeatures) +{ + // Line settings can have subtle affects on space handling + // since we don't really know whether it is the end of a line or just a run + // in the middle, it is hard to know what to set them to. + // If true, it can cause end of line spaces to be hidden e.g. Doulos SIL + maLayout.setStartOfLine(false); + maLayout.setEndOfLine(false); +// maLayout.setDumbFallback(false); + // trailing ws doesn't seem to always take affect if end of line is true + maLayout.setTrailingWs(gr::ktwshAll); +#ifdef GRLAYOUT_DEBUG + gr::ScriptDirCode aDirCode = font.getSupportedScriptDirections(); + fprintf(grLog(),"GraphiteLayout scripts %x %lx\n", aDirCode, long(this)); +#endif +} + + +GraphiteLayout::~GraphiteLayout() throw() +{ + clear(); + // the features are owned by the platform layers + mpFeatures = NULL; +} + +void GraphiteLayout::clear() +{ + // Destroy the segment and text source from any previous invocation of + // LayoutText + mvGlyphs.clear(); + mvCharDxs.clear(); + mvChar2BaseGlyph.clear(); + mvGlyph2Char.clear(); + +#ifndef GRCACHE + delete mpTextSrc; +#endif + + // Reset the state to the empty state. + mpTextSrc=0; + mnWidth = 0; + // Don't reset the scaling, because it is set before LayoutText +} + +// This method shouldn't be called on windows, since it needs the dc reset +bool GraphiteLayout::LayoutText(ImplLayoutArgs & rArgs) +{ +#ifdef GRCACHE + GrSegRecord * pSegRecord = NULL; + gr::Segment * pSegment = CreateSegment(rArgs, &pSegRecord); + if (!pSegment) + return false; + + // layout the glyphs as required by OpenOffice + bool success = LayoutGlyphs(rArgs, pSegment, pSegRecord); + + if (pSegRecord) pSegRecord->unlock(); + else delete pSegment; +#else + gr::Segment * pSegment = CreateSegment(rArgs); + bool success = LayoutGlyphs(rArgs, pSegment); + delete pSegment; +#endif + return success; +} + +#ifdef GRCACHE +class GrFontHasher : public gr::Font +{ +public: + GrFontHasher(const gr::Font & aFont) : gr::Font(aFont), mrRealFont(const_cast(aFont)) {}; + ~GrFontHasher(){}; + virtual bool bold() { return mrRealFont.bold(); }; + virtual bool italic() { return mrRealFont.italic(); }; + virtual float ascent() { return mrRealFont.ascent(); }; + virtual float descent() { return mrRealFont.descent(); }; + virtual float height() { return mrRealFont.height(); }; + virtual gr::Font* copyThis() { return mrRealFont.copyThis(); }; + virtual unsigned int getDPIx() { return mrRealFont.getDPIx(); }; + virtual unsigned int getDPIy() { return mrRealFont.getDPIy(); }; + virtual const void* getTable(gr::fontTableId32 nId, size_t* nSize) + { return mrRealFont.getTable(nId,nSize); } + virtual void getFontMetrics(float*pA, float*pB, float*pC) { mrRealFont.getFontMetrics(pA,pB,pC); }; + + sal_Int32 hashCode(const grutils::GrFeatureParser * mpFeatures) + { + // is this sufficient? + std::wstring aFace; + bool bBold; + bool bItalic; + UniqueCacheInfo(aFace, bBold, bItalic); + sal_Unicode uName[32]; // max length used in gr::Font + // Note: graphite stores font names as UTF-16 even if wchar_t is 32bit + // this conversion should be OK. + for (size_t i = 0; i < aFace.size() && i < 32; i++) + { + uName[i] = aFace[i]; + } + size_t iSize = aFace.size(); + if (0 == iSize) return 0; + sal_Int32 hash = rtl_ustr_hashCode_WithLength(uName, iSize); + hash ^= static_cast(height()); + hash |= (bBold)? 0x1000000 : 0; + hash |= (bItalic)? 0x2000000 : 0; + if (mpFeatures) + hash ^= mpFeatures->hashCode(); +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(), "font hash %x size %f\n", (int)hash, height()); +#endif + return hash; + }; + +private: + gr::Font & mrRealFont; +}; +#endif + +#ifdef GRCACHE +gr::Segment * GraphiteLayout::CreateSegment(ImplLayoutArgs& rArgs, GrSegRecord ** pSegRecord) +#else +gr::Segment * GraphiteLayout::CreateSegment(ImplLayoutArgs& rArgs) +#endif +{ + assert(rArgs.mnLength >= 0); + + gr::Segment * pSegment = NULL; + + // Set the SalLayouts values to be the inital ones. + SalLayout::AdjustLayout(rArgs); + // TODO check if this is needed + if (mnUnitsPerPixel > 1) + mfScaling = 1.0f / mnUnitsPerPixel; + + // Clear out any previous buffers + clear(); + bool bRtl = mnLayoutFlags & SAL_LAYOUT_BIDI_RTL; + try + { + // Don't set RTL if font doesn't support it otherwise it forces rtl on + // everything + if (bRtl && (mrFont.getSupportedScriptDirections() & gr::kfsdcHorizRtl)) + maLayout.setRightToLeft(bRtl); + +#ifdef GRCACHE + GrFontHasher hasher(mrFont); + sal_Int32 aFontHash = hasher.hashCode(mpFeatures); + GraphiteSegmentCache * pCache = + (GraphiteCacheHandler::instance).getCache(aFontHash); + if (pCache) + { + *pSegRecord = pCache->getSegment(rArgs, bRtl); + if (*pSegRecord) + { + pSegment = (*pSegRecord)->getSegment(); + mpTextSrc = (*pSegRecord)->getTextSrc(); + maLayout.setRightToLeft((*pSegRecord)->isRtl()); + if (rArgs.mpStr != mpTextSrc->getLayoutArgs().mpStr || + rArgs.mnMinCharPos != mpTextSrc->getLayoutArgs().mnMinCharPos || + rArgs.mnEndCharPos != mpTextSrc->getLayoutArgs().mnEndCharPos || + (SAL_LAYOUT_FOR_FALLBACK & rArgs.mnFlags) ) + { + (*pSegRecord)->clearVectors(); + } + mpTextSrc->switchLayoutArgs(rArgs); + return pSegment; + } + } +#endif + + // Context is often needed beyond the specified end, however, we don't + // want it if there has been a direction change, since it is hard + // to tell between reordering within one direction and multi-directional + // text. + const int segCharLimit = min(rArgs.mnLength, mnEndCharPos + EXTRA_CONTEXT_LENGTH); + int limit = rArgs.mnEndCharPos; + if (segCharLimit > limit) + { + limit += findSameDirLimit(rArgs.mpStr + rArgs.mnEndCharPos, + segCharLimit - rArgs.mnEndCharPos, bRtl); + } + + // Create a new TextSource object for the engine. + mpTextSrc = new TextSourceAdaptor(rArgs, limit); + if (mpFeatures) mpTextSrc->setFeatures(mpFeatures); + + pSegment = new gr::RangeSegment((gr::Font *)&mrFont, mpTextSrc, &maLayout, mnMinCharPos, limit); + if (pSegment != NULL) + { +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"Gr::LayoutText %d-%d, context %d,len%d rtl%d/%d scaling %f\n", rArgs.mnMinCharPos, + rArgs.mnEndCharPos, limit, rArgs.mnLength, maLayout.rightToLeft(), pSegment->rightToLeft(), mfScaling); +#endif +#ifdef GRCACHE + // on a new segment rightToLeft should be correct + *pSegRecord = pCache->cacheSegment(mpTextSrc, pSegment, pSegment->rightToLeft()); +#endif + } + else + { + clear(); + return NULL; + } + } + catch (...) + { + clear(); // destroy the text source and any partially built segments. + return NULL; + } + return pSegment; +} + +#ifdef GRCACHE +bool GraphiteLayout::LayoutGlyphs(ImplLayoutArgs& rArgs, gr::Segment * pSegment, GrSegRecord * pSegRecord) +#else +bool GraphiteLayout::LayoutGlyphs(ImplLayoutArgs& rArgs, gr::Segment * pSegment) +#endif +{ +#ifdef GRCACHE +#ifdef GRCACHE_REUSE_VECTORS + // if we have an exact match, then we can reuse the glyph vectors from before + if (pSegRecord && (pSegRecord->glyphs().size() > 0) && + !(SAL_LAYOUT_FOR_FALLBACK & rArgs.mnFlags) ) + { + mnWidth = pSegRecord->width(); + mvGlyphs = pSegRecord->glyphs(); + mvCharDxs = pSegRecord->charDxs(); + mvChar2BaseGlyph = pSegRecord->char2BaseGlyph(); + mvGlyph2Char = pSegRecord->glyph2Char(); + return true; + } +#endif +#endif + // Calculate the initial character dxs. + mvCharDxs.assign(mnEndCharPos - mnMinCharPos, -1); + mvChar2BaseGlyph.assign(mnEndCharPos - mnMinCharPos, -1); + mnWidth = 0; + if (mvCharDxs.size() > 0) + { + // Discover all the clusters. + try + { + // Note: we use the layout rightToLeft() because in cached segments + // rightToLeft() may no longer be valid if the engine has been run + // ltr since the segment was created. +#ifdef GRCACHE + bool bRtl = pSegRecord? pSegRecord->isRtl() : pSegment->rightToLeft(); +#else + bool bRtl = pSegment->rightToLeft(); +#endif + mvGlyphs.fill_from(*pSegment, rArgs, bRtl, + mnWidth, mfScaling, mvChar2BaseGlyph, mvGlyph2Char, mvCharDxs); + + if (bRtl) + { + // not needed for adjacent differences, but for mouse clicks to char + std::transform(mvCharDxs.begin(), mvCharDxs.end(), mvCharDxs.begin(), + std::bind1st(std::minus(), mnWidth)); + // fixup last dx to ensure it always equals the width + mvCharDxs[mvCharDxs.size() - 1] = mnWidth; + } +#ifdef GRCACHE +#ifdef GRCACHE_REUSE_VECTORS + if (pSegRecord && rArgs.maReruns.IsEmpty() && + !(SAL_LAYOUT_FOR_FALLBACK & rArgs.mnFlags)) + { + pSegRecord->setGlyphVectors(mnWidth, mvGlyphs, mvCharDxs, + mvChar2BaseGlyph, mvGlyph2Char); + } +#endif +#endif + } + catch (std::exception e) + { +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"LayoutGlyphs failed %s\n", e.what()); +#endif + return false; + } + catch (...) + { +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"LayoutGlyphs failed with exception"); +#endif + return false; + } + } + else + { + mnWidth = 0; + } + return true; +} + +int GraphiteLayout::GetTextBreak(long maxmnWidth, long char_extra, int factor) const +{ + // Adjust maxmnWidth so FindNextBreakPoint returns a sensible answer. + maxmnWidth -= (mnEndCharPos-mnMinCharPos-1)*char_extra; // extra character spacing. + maxmnWidth /= factor; // scaling factor. + + // Ask the segment for the nearest whole letter break for the width. + //float width; + float targetWidth = maxmnWidth/mfScaling; + // return quickly if this segment is narrower than the target width + // (sometimes graphite doesn't seem to realise this!) + if (targetWidth > mnWidth) + return STRING_LEN; + //int nBreak = mpSegment->findNextBreakPoint(mnMinCharPos, + // gr::klbWordBreak, gr::klbLetterBreak, targetWidth, &width); + + // LineFillSegment seems to give better results that findNextBreakPoint + // though it may be slower + gr::LayoutEnvironment aLE; + gr::LineFillSegment lineSeg(const_cast(&mrFont), mpTextSrc, &aLE, + mnMinCharPos, mpTextSrc->getContextLength(), + targetWidth); + int nBreak = lineSeg.stopCharacter(); + + if (nBreak > mnEndCharPos) nBreak = STRING_LEN; + else if (nBreak < mnMinCharPos) nBreak = mnMinCharPos; + return nBreak; +} + + +long GraphiteLayout::FillDXArray( sal_Int32* pDXArray ) const +{ + if (mnEndCharPos == mnMinCharPos) + // Then we must be zero width! + return 0; + + if (pDXArray) + { + for (size_t i = 0; i < mvCharDxs.size(); i++) + { + assert((mvChar2BaseGlyph[i] >= -1) && (mvChar2BaseGlyph[i] < (signed)mvGlyphs.size())); + if (mvChar2BaseGlyph[i] != -1 && + mvGlyphs[mvChar2BaseGlyph[i]].mnGlyphIndex == GF_DROPPED) + { + // when used in MultiSalLayout::GetTextBreak dropped glyphs + // must have zero width + pDXArray[i] = 0; + } + else + { + pDXArray[i] = mvCharDxs[i]; + if (i > 0) pDXArray[i] -= mvCharDxs[i-1]; + } +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"%d,%d,%ld ", (int)i, (int)mvCharDxs[i], pDXArray[i]); +#endif + } + //std::adjacent_difference(mvCharDxs.begin(), mvCharDxs.end(), pDXArray); + //for (size_t i = 0; i < mvCharDxs.size(); i++) + // fprintf(grLog(),"%d,%d,%d ", (int)i, (int)mvCharDxs[i], pDXArray[i]); + //fprintf(grLog(),"FillDX %ld,%d\n", mnWidth, std::accumulate(pDXArray, pDXArray + mvCharDxs.size(), 0)); + } +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"FillDXArray %d-%d,%d=%ld\n", mnMinCharPos, mnEndCharPos, (int)mpTextSrc->getLength(), mnWidth); +#endif + return mnWidth; +} + + +void GraphiteLayout::AdjustLayout(ImplLayoutArgs& rArgs) +{ + SalLayout::AdjustLayout(rArgs); + + if(rArgs.mpDXArray) + { + std::vector vDeltaWidths(mvGlyphs.size(), 0); + ApplyDXArray(rArgs, vDeltaWidths); + + if( (mnLayoutFlags & SAL_LAYOUT_BIDI_RTL) && + !(rArgs.mnFlags & SAL_LAYOUT_FOR_FALLBACK) ) + { + // check if this is a kashida script + bool bKashidaScript = false; + for (int i = rArgs.mnMinCharPos; i < rArgs.mnEndCharPos; i++) + { + UErrorCode aStatus = U_ZERO_ERROR; + UScriptCode scriptCode = uscript_getScript(rArgs.mpStr[i], &aStatus); + if (scriptCode == USCRIPT_ARABIC || scriptCode == USCRIPT_SYRIAC) + { + bKashidaScript = true; + break; + } + } + int nKashidaWidth = 0; + int nKashidaIndex = getKashidaGlyph(nKashidaWidth); + if( nKashidaIndex != 0 && bKashidaScript) + { + kashidaJustify( vDeltaWidths, nKashidaIndex, nKashidaWidth ); + } + } + } +} + + +void GraphiteLayout::ApplyDXArray(ImplLayoutArgs &args, std::vector & rDeltaWidth) +{ + const size_t nChars = args.mnEndCharPos - args.mnMinCharPos; + if (nChars == 0) return; + +#ifdef GRLAYOUT_DEBUG + for (size_t iDx = 0; iDx < mvCharDxs.size(); iDx++) + fprintf(grLog(),"%d,%d,%ld ", (int)iDx, (int)mvCharDxs[iDx], args.mpDXArray[iDx]); + fprintf(grLog(),"ApplyDx\n"); +#endif + bool bRtl = mnLayoutFlags & SAL_LAYOUT_BIDI_RTL; + int nXOffset = 0; + if (bRtl) + { + nXOffset = args.mpDXArray[nChars - 1] - mvCharDxs[nChars - 1]; + } + int nPrevClusterGlyph = (bRtl)? mvGlyphs.size() : -1; + int nPrevClusterLastChar = -1; + for (size_t i = 0; i < nChars; i++) + { + if (mvChar2BaseGlyph[i] > -1 && mvChar2BaseGlyph[i] != nPrevClusterGlyph) + { + assert((mvChar2BaseGlyph[i] > -1) && (mvChar2BaseGlyph[i] < (signed)mvGlyphs.size())); + GlyphItem & gi = mvGlyphs[mvChar2BaseGlyph[i]]; + if (!gi.IsClusterStart()) + continue; + + // find last glyph of this cluster + size_t j = i + 1; + int nLastChar = i; + int nLastGlyph = mvChar2BaseGlyph[i]; + for (; j < nChars; j++) + { + assert((mvChar2BaseGlyph[j] >= -1) && (mvChar2BaseGlyph[j] < (signed)mvGlyphs.size())); + if (mvChar2BaseGlyph[j] != -1 && mvGlyphs[mvChar2BaseGlyph[j]].IsClusterStart()) + { + nLastGlyph = mvChar2BaseGlyph[j] + ((bRtl)? 1 : -1); + nLastChar = j - 1; + break; + } + } + if (nLastGlyph < 0) + { + nLastGlyph = mvChar2BaseGlyph[i]; + } + // Its harder to find the last glyph rtl, since the first of + // cluster is still on the left so we need to search towards + // the previous cluster to the right + if (bRtl) + { + nLastGlyph = mvChar2BaseGlyph[i]; + while (nLastGlyph + 1 < (signed)mvGlyphs.size() && + !mvGlyphs[nLastGlyph+1].IsClusterStart()) + { + ++nLastGlyph; + } + } + if (j == nChars) + { + nLastChar = nChars - 1; + if (!bRtl) nLastGlyph = mvGlyphs.size() - 1; + } + assert((nLastChar > -1) && (nLastChar < (signed)nChars)); + long nNewClusterWidth = args.mpDXArray[nLastChar]; + long nOrigClusterWidth = mvCharDxs[nLastChar]; + long nDGlyphOrigin = 0; + if (nPrevClusterLastChar > - 1) + { + assert(nPrevClusterLastChar < (signed)nChars); + nNewClusterWidth -= args.mpDXArray[nPrevClusterLastChar]; + nOrigClusterWidth -= mvCharDxs[nPrevClusterLastChar]; + nDGlyphOrigin = args.mpDXArray[nPrevClusterLastChar] - mvCharDxs[nPrevClusterLastChar]; + } + long nDWidth = nNewClusterWidth - nOrigClusterWidth; +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(), "c%d last glyph %d/%d\n", i, nLastGlyph, mvGlyphs.size()); +#endif + assert((nLastGlyph > -1) && (nLastGlyph < (signed)mvGlyphs.size())); + mvGlyphs[nLastGlyph].mnNewWidth += nDWidth; + if (gi.mnGlyphIndex != GF_DROPPED) + mvGlyphs[nLastGlyph].mnNewWidth += nDWidth; + else + nDGlyphOrigin += nDWidth; + // update glyph positions + if (bRtl) + { + for (int n = mvChar2BaseGlyph[i]; n <= nLastGlyph; n++) + { + assert((n > - 1) && (n < (signed)mvGlyphs.size())); + mvGlyphs[n].maLinearPos.X() += -nDGlyphOrigin + nXOffset; + } + } + else + { + for (int n = mvChar2BaseGlyph[i]; n <= nLastGlyph; n++) + { + assert((n > - 1) && (n < (signed)mvGlyphs.size())); + mvGlyphs[n].maLinearPos.X() += nDGlyphOrigin + nXOffset; + } + } + rDeltaWidth[mvChar2BaseGlyph[i]] = nDWidth; +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"c%d g%d-%d dW%ld-%ld=%ld dX%ld x%ld\t", (int)i, mvChar2BaseGlyph[i], nLastGlyph, nNewClusterWidth, nOrigClusterWidth, nDWidth, nDGlyphOrigin, mvGlyphs[mvChar2BaseGlyph[i]].maLinearPos.X()); +#endif + nPrevClusterGlyph = mvChar2BaseGlyph[i]; + nPrevClusterLastChar = nLastChar; + i = nLastChar; + } + } + // Update the dx vector with the new values. + std::copy(args.mpDXArray, args.mpDXArray + nChars, + mvCharDxs.begin() + (args.mnMinCharPos - mnMinCharPos)); +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"ApplyDx %ld(%ld)\n", args.mpDXArray[nChars - 1], mnWidth); +#endif + mnWidth = args.mpDXArray[nChars - 1]; +} + +void GraphiteLayout::kashidaJustify(std::vector& rDeltaWidths, sal_GlyphId nKashidaIndex, int nKashidaWidth) +{ + // skip if the kashida glyph in the font looks suspicious + if( nKashidaWidth <= 0 ) + return; + + // calculate max number of needed kashidas + Glyphs::iterator i = mvGlyphs.begin(); + int nKashidaCount = 0; + int nOrigGlyphIndex = -1; + int nGlyphIndex = -1; + while (i != mvGlyphs.end()) + { + nOrigGlyphIndex++; + nGlyphIndex++; + // only inject kashidas in RTL contexts + if( !(*i).IsRTLGlyph() ) + { + ++i; + continue; + } + // no kashida-injection for blank justified expansion either + if( IsSpacingGlyph( (*i).mnGlyphIndex ) ) + { + ++i; + continue; + } + // calculate gap, ignore if too small + int nGapWidth = rDeltaWidths[nOrigGlyphIndex];; + // worst case is one kashida even for mini-gaps + if( 3 * nGapWidth < nKashidaWidth ) + { + ++i; + continue; + } + nKashidaCount = 1 + (nGapWidth / nKashidaWidth); +#ifdef GRLAYOUT_DEBUG + printf("inserting %d kashidas at %ld\n", nKashidaCount, (*i).mnGlyphIndex); +#endif + GlyphItem glyphItem = *i; + Point aPos(0, 0); + aPos.X() = (*i).maLinearPos.X(); + GlyphItem newGi(glyphItem.mnCharPos, nKashidaIndex, aPos, + GlyphItem::IS_IN_CLUSTER|GlyphItem::IS_RTL_GLYPH, nKashidaWidth); + mvGlyphs.reserve(mvGlyphs.size() + nKashidaCount); + i = mvGlyphs.begin() + nGlyphIndex; + mvGlyphs.insert(i, nKashidaCount, newGi); + i = mvGlyphs.begin() + nGlyphIndex; + nGlyphIndex += nKashidaCount; + // now fix up the kashida positions + for (int j = 0; j < nKashidaCount; j++) + { + (*(i)).maLinearPos.X() -= nGapWidth; + nGapWidth -= nKashidaWidth; + i++; + } + + // fixup rightmost kashida for gap remainder + if( nGapWidth < 0 ) + { + if( nKashidaCount <= 1 ) + nGapWidth /= 2; // for small gap move kashida to middle + (*(i-1)).mnNewWidth += nGapWidth; // adjust kashida width to gap width + (*(i-1)).maLinearPos.X() += nGapWidth; + } + + (*i).mnNewWidth = (*i).mnOrigWidth; + ++i; + } + +} + +void GraphiteLayout::GetCaretPositions( int nArraySize, sal_Int32* pCaretXArray ) const +{ + // For each character except the last discover the caret positions + // immediatly before and after that character. + // This is used for underlines in the GUI amongst other things. + // It may be used from MultiSalLayout, in which case it must take into account + // glyphs that have been moved. + std::fill(pCaretXArray, pCaretXArray + nArraySize, -1); + // the layout method doesn't modify the layout even though it isn't + // const in the interface + bool bRtl = const_cast(this)->maLayout.rightToLeft(); + int prevBase = -1; + long prevClusterWidth = 0; + for (int i = 0, nCharSlot = 0; i < nArraySize && nCharSlot < static_cast(mvCharDxs.size()); ++nCharSlot, i+=2) + { + if (mvChar2BaseGlyph[nCharSlot] != -1) + { + assert((mvChar2BaseGlyph[nCharSlot] > -1) && (mvChar2BaseGlyph[nCharSlot] < (signed)mvGlyphs.size())); + GlyphItem gi = mvGlyphs[mvChar2BaseGlyph[nCharSlot]]; + if (gi.mnGlyphIndex == GF_DROPPED) + { + continue; + } + int nCluster = mvChar2BaseGlyph[nCharSlot]; + long origClusterWidth = gi.mnNewWidth; + long nMin = gi.maLinearPos.X(); + long nMax = gi.maLinearPos.X() + gi.mnNewWidth; + // attached glyphs are always stored after their base rtl or ltr + while (++nCluster < static_cast(mvGlyphs.size()) && + !mvGlyphs[nCluster].IsClusterStart()) + { + origClusterWidth += mvGlyphs[nCluster].mnNewWidth; + if (mvGlyph2Char[nCluster] == nCharSlot) + { + nMin = std::min(nMin, mvGlyphs[nCluster].maLinearPos.X()); + nMax = std::min(nMax, mvGlyphs[nCluster].maLinearPos.X() + mvGlyphs[nCluster].mnNewWidth); + } + } + if (bRtl) + { + pCaretXArray[i+1] = nMin; + pCaretXArray[i] = nMax; + } + else + { + pCaretXArray[i] = nMin; + pCaretXArray[i+1] = nMax; + } + prevBase = mvChar2BaseGlyph[nCharSlot]; + prevClusterWidth = origClusterWidth; + } + else if (prevBase > -1) + { + // this could probably be improved + assert((prevBase > -1) && (prevBase < (signed)mvGlyphs.size())); + GlyphItem gi = mvGlyphs[prevBase]; + int nGlyph = prevBase + 1; + // try to find a better match, otherwise default to complete cluster + for (; nGlyph < static_cast(mvGlyphs.size()) && + !mvGlyphs[nGlyph].IsClusterStart(); nGlyph++) + { + if (mvGlyph2Char[nGlyph] == nCharSlot) + { + gi = mvGlyphs[nGlyph]; + break; + } + } + long nGWidth = gi.mnNewWidth; + // if no match position at end of cluster + if (nGlyph == static_cast(mvGlyphs.size()) || + mvGlyphs[nGlyph].IsClusterStart()) + { + nGWidth = prevClusterWidth; + if (bRtl) + { + pCaretXArray[i+1] = gi.maLinearPos.X(); + pCaretXArray[i] = gi.maLinearPos.X(); + } + else + { + pCaretXArray[i] = gi.maLinearPos.X() + prevClusterWidth; + pCaretXArray[i+1] = gi.maLinearPos.X() + prevClusterWidth; + } + } + else + { + if (bRtl) + { + pCaretXArray[i+1] = gi.maLinearPos.X(); + pCaretXArray[i] = gi.maLinearPos.X() + gi.mnNewWidth; + } + else + { + pCaretXArray[i] = gi.maLinearPos.X(); + pCaretXArray[i+1] = gi.maLinearPos.X() + gi.mnNewWidth; + } + } + } + else + { + pCaretXArray[i] = pCaretXArray[i+1] = 0; + } +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"%d,%ld-%ld\t", nCharSlot, pCaretXArray[i], pCaretXArray[i+1]); +#endif + } +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"\n"); +#endif +} + + +// GetNextGlyphs returns a contiguous sequence of glyphs that can be +// rendered together. It should never return a dropped glyph. +// The glyph_slot returned should be the index of the next visible +// glyph after the last glyph returned by this call. +// The char_index array should be filled with the characters corresponding +// to each glyph returned. +// glyph_adv array should be a virtual width such that if successive +// glyphs returned by this method are added one after the other they +// have the correct spacing. +// The logic in this method must match that expected in MultiSalLayout which +// is used when glyph fallback is in operation. +int GraphiteLayout::GetNextGlyphs( int length, sal_GlyphId * glyph_out, + ::Point & aPosOut, int &glyph_slot, sal_Int32 * glyph_adv, int *char_index) const +{ + // Sanity check on the slot index. + if (glyph_slot >= signed(mvGlyphs.size())) + { + glyph_slot = mvGlyphs.size(); + return 0; + } + assert(glyph_slot >= 0); + // Find the first glyph in the substring. + for (; glyph_slot < signed(mvGlyphs.size()) && + ((mvGlyphs.begin() + glyph_slot)->mnGlyphIndex == GF_DROPPED); + ++glyph_slot) {}; + + // Update the length + const int nGlyphSlotEnd = std::min(size_t(glyph_slot + length), mvGlyphs.size()); + + // We're all out of glyphs here. + if (glyph_slot == nGlyphSlotEnd) + { + return 0; + } + + // Find as many glyphs as we can which can be drawn in one go. + Glyphs::const_iterator glyph_itr = mvGlyphs.begin() + glyph_slot; + const int glyph_slot_begin = glyph_slot; + const int initial_y_pos = glyph_itr->maLinearPos.Y(); + + // Set the position to the position of the start glyph. + ::Point aStartPos = glyph_itr->maLinearPos; + //aPosOut = glyph_itr->maLinearPos; + aPosOut = GetDrawPosition(aStartPos); + + + for (;;) // Forever + { + // last index of the range from glyph_to_chars does not include this glyph + if (char_index) + { + assert((glyph_slot >= -1) && (glyph_slot < (signed)mvGlyph2Char.size())); + if (mvGlyph2Char[glyph_slot] == -1) + *char_index++ = mvCharDxs.size(); + else + *char_index++ = mvGlyph2Char[glyph_slot]; + } + // Copy out this glyphs data. + ++glyph_slot; + *glyph_out++ = glyph_itr->mnGlyphIndex; + + // Find the actual advance - this must be correct if called from + // MultiSalLayout::AdjustLayout which requests one glyph at a time. + const long nGlyphAdvance = (glyph_slot == static_cast(mvGlyphs.size()))? + glyph_itr->mnNewWidth : + ((glyph_itr+1)->maLinearPos.X() - glyph_itr->maLinearPos.X()); + +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"GetNextGlyphs g%d c%d x%ld,%ld adv%ld, pos %ld,%ld\n", glyph_slot - 1, + mvGlyph2Char[glyph_slot-1], glyph_itr->maLinearPos.X(), glyph_itr->maLinearPos.Y(), nGlyphAdvance, + aPosOut.X(), aPosOut.Y()); +#endif + + if (glyph_adv) // If we are returning advance store it. + *glyph_adv++ = nGlyphAdvance; + else // Stop when next advance is unexpected. + if (glyph_itr->mnOrigWidth != nGlyphAdvance) break; + + // Have fetched all the glyphs we need to + if (glyph_slot == nGlyphSlotEnd) + break; + + ++glyph_itr; + // Stop when next y position is unexpected. + if (initial_y_pos != glyph_itr->maLinearPos.Y()) + break; + + // Stop if glyph dropped + if (glyph_itr->mnGlyphIndex == GF_DROPPED) + break; + } + int numGlyphs = glyph_slot - glyph_slot_begin; + // move the next glyph_slot to a glyph that hasn't been dropped + while (glyph_slot < static_cast(mvGlyphs.size()) && + (mvGlyphs.begin() + glyph_slot)->mnGlyphIndex == GF_DROPPED) + ++glyph_slot; + return numGlyphs; +} + + +void GraphiteLayout::MoveGlyph( int nGlyphIndex, long nNewPos ) +{ + // TODO it might be better to actualy implement simplify properly, but this + // needs to be done carefully so the glyph/char maps are maintained + // If a glyph has been dropped then it wasn't returned by GetNextGlyphs, so + // the index here may be wrong + while ((mvGlyphs[nGlyphIndex].mnGlyphIndex == GF_DROPPED) && + (nGlyphIndex < (signed)mvGlyphs.size())) + { + nGlyphIndex++; + } + const long dx = nNewPos - mvGlyphs[nGlyphIndex].maLinearPos.X(); + + if (dx == 0) return; + // GenericSalLayout only changes maLinearPos, mvCharDxs doesn't change +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"Move %d (%ld,%ld) c%d by %ld\n", nGlyphIndex, mvGlyphs[nGlyphIndex].maLinearPos.X(), nNewPos, mvGlyph2Char[nGlyphIndex], dx); +#endif + for (size_t gi = nGlyphIndex; gi < mvGlyphs.size(); gi++) + { + mvGlyphs[gi].maLinearPos.X() += dx; + } + // width does need to be updated for correct fallback + mnWidth += dx; +} + + +void GraphiteLayout::DropGlyph( int nGlyphIndex ) +{ + if(nGlyphIndex >= signed(mvGlyphs.size())) + return; + + GlyphItem & glyph = mvGlyphs[nGlyphIndex]; + glyph.mnGlyphIndex = GF_DROPPED; +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"Dropped %d\n", nGlyphIndex); +#endif +} + +void GraphiteLayout::Simplify( bool isBaseLayout ) +{ + const sal_GlyphId dropMarker = isBaseLayout ? GF_DROPPED : 0; + + Glyphs::iterator gi = mvGlyphs.begin(); + // TODO check whether we need to adjust positions here + // MultiSalLayout seems to move the glyphs itself, so it may not be needed. + long deltaX = 0; + while (gi != mvGlyphs.end()) + { + if (gi->mnGlyphIndex == dropMarker) + { + deltaX += gi->mnNewWidth; + gi->mnNewWidth = 0; + } + else + { + deltaX = 0; + } + //mvCharDxs[mvGlyph2Char[gi->mnCharPos]] -= deltaX; + ++gi; + } +#ifdef GRLAYOUT_DEBUG + fprintf(grLog(),"Simplify base%d dx=%ld newW=%ld\n", isBaseLayout, deltaX, mnWidth - deltaX); +#endif + // discard width from trailing dropped glyphs, but not those in the middle + mnWidth -= deltaX; +} diff --git a/vcl/source/glyphs/graphite_serverfont.cxx b/vcl/source/glyphs/graphite_serverfont.cxx new file mode 100644 index 000000000000..be424c94b9d2 --- /dev/null +++ b/vcl/source/glyphs/graphite_serverfont.cxx @@ -0,0 +1,88 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +// We need this to enable namespace support in libgrengine headers. +#define GR_NAMESPACE + +// Header files +// + +// Platform +#include +// Module +#include "gcach_ftyp.hxx" +#include +#include "graphite_textsrc.hxx" +#include + +#ifndef WNT + +// +// An implementation of the GraphiteLayout interface to enable Graphite enabled fonts to be used. +// + +GraphiteServerFontLayout::GraphiteServerFontLayout(GraphiteFontAdaptor * pFont) throw() + : ServerFontLayout(pFont->font()), mpFont(pFont), + maImpl(*mpFont, mpFont->features(), pFont) +{ + // Nothing needed here +} + +GraphiteServerFontLayout::~GraphiteServerFontLayout() throw() +{ + delete mpFont; + mpFont = NULL; +} + +const sal_Unicode* GraphiteServerFontLayout::getTextPtr() const +{ + return maImpl.textSrc()->getLayoutArgs().mpStr + + maImpl.textSrc()->getLayoutArgs().mnMinCharPos; +} + +sal_GlyphId GraphiteLayoutImpl::getKashidaGlyph(int & width) +{ + int nKashidaIndex = mpFont->font().GetGlyphIndex( 0x0640 ); + if( nKashidaIndex != 0 ) + { + const GlyphMetric& rGM = mpFont->font().GetGlyphMetric( nKashidaIndex ); + width = rGM.GetCharWidth(); + } + else + { + width = 0; + } + return nKashidaIndex; +} + +#endif diff --git a/vcl/source/glyphs/graphite_textsrc.cxx b/vcl/source/glyphs/graphite_textsrc.cxx new file mode 100644 index 000000000000..adc2ae99c4f8 --- /dev/null +++ b/vcl/source/glyphs/graphite_textsrc.cxx @@ -0,0 +1,172 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +// We need this to enable namespace support in libgrengine headers. +#define GR_NAMESPACE + +// Header files +// +// Standard Library +#include +#include +#include "graphite_textsrc.hxx" +#include + +// class TextSourceAdaptor implementation. +// +TextSourceAdaptor::~TextSourceAdaptor() +{ + delete mpFeatures; +} + +gr::UtfType TextSourceAdaptor::utfEncodingForm() { + return gr::kutf16; +} + + +size_t TextSourceAdaptor::getLength() +{ + return maLayoutArgs.mnLength; +} + + +size_t TextSourceAdaptor::fetch(gr::toffset, size_t, gr::utf32 *) +{ + assert(false); + return 0; +} + + +size_t TextSourceAdaptor::fetch(gr::toffset offset, size_t char_count, gr::utf16 * char_buffer) +{ + assert(char_buffer); + + size_t copy_count = std::min(size_t(maLayoutArgs.mnLength), char_count); + std::copy(maLayoutArgs.mpStr + offset, maLayoutArgs.mpStr + offset + copy_count, char_buffer); + + return copy_count; +} + + +size_t TextSourceAdaptor::fetch(gr::toffset, size_t, gr::utf8 *) +{ + assert(false); + return 0; +} + + +inline void TextSourceAdaptor::getCharProperties(const int nCharIdx, int & min, int & lim, size_t & depth) +{ + maLayoutArgs.ResetPos(); + bool rtl = maLayoutArgs.mnFlags & SAL_LAYOUT_BIDI_RTL; + for(depth = ((rtl)? 1:0); maLayoutArgs.maRuns.GetRun(&min, &lim, &rtl); maLayoutArgs.maRuns.NextRun()) + { + if (min > nCharIdx) + break; + // Only increase the depth when a change of direction occurs. + depth += int(rtl ^ bool(depth & 0x1)); + if (min <= nCharIdx && nCharIdx < lim) + break; + } + // If there is no run for this position increment the depth, but don't + // change if this is out of bounds context + if (lim > 0 && nCharIdx >= lim && nCharIdx < maLayoutArgs.mnEndCharPos) + depth++; +} + + +bool TextSourceAdaptor::getRightToLeft(gr::toffset nCharIdx) +{ + size_t depth; + int min, lim = 0; + getCharProperties(nCharIdx, min, lim, depth); + //printf("getRtl %d,%x=%d\n", nCharIdx, maLayoutArgs.mpStr[nCharIdx], depth & 0x1); + return depth & 0x1; +} + + +unsigned int TextSourceAdaptor::getDirectionDepth(gr::toffset nCharIdx) +{ + size_t depth; + int min, lim; + getCharProperties(nCharIdx, min, lim, depth); + //printf("getDirectionDepth %d,%x=%d\n", nCharIdx, maLayoutArgs.mpStr[nCharIdx], depth); + return depth; +} + + +float TextSourceAdaptor::getVerticalOffset(gr::toffset) +{ + return 0.0f; //TODO: Implement correctly +} + +gr::isocode TextSourceAdaptor::getLanguage(gr::toffset) +{ + if (mpFeatures && mpFeatures->hasLanguage()) + return mpFeatures->getLanguage(); + gr::isocode unknown = {{0,0,0,0}}; + return unknown; +} + +std::pair TextSourceAdaptor::propertyRange(gr::toffset nCharIdx) +{ + + if (nCharIdx < unsigned(maLayoutArgs.mnMinCharPos)) + return std::make_pair(0, maLayoutArgs.mnMinCharPos); + + if (nCharIdx < mnEnd) + return std::make_pair(maLayoutArgs.mnMinCharPos, mnEnd); + + return std::make_pair(mnEnd, maLayoutArgs.mnLength); +} + +size_t TextSourceAdaptor::getFontFeatures(gr::toffset, gr::FeatureSetting * settings) +{ + if (mpFeatures) return mpFeatures->getFontFeatures(settings); + return 0; +} + + +bool TextSourceAdaptor::sameSegment(gr::toffset char_idx1, gr::toffset char_idx2) +{ + const std::pair + range1 = propertyRange(char_idx1), + range2 = propertyRange(char_idx2); + + return range1 == range2; +} + +void TextSourceAdaptor::setFeatures(const grutils::GrFeatureParser * pFeatures) +{ + mpFeatures = new grutils::GrFeatureParser(*pFeatures); +} diff --git a/vcl/source/glyphs/graphite_textsrc.hxx b/vcl/source/glyphs/graphite_textsrc.hxx new file mode 100644 index 000000000000..6f701988bb01 --- /dev/null +++ b/vcl/source/glyphs/graphite_textsrc.hxx @@ -0,0 +1,131 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: $ + * $Revision: $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _SV_GRAPHITETEXTSRC_HXX +#define _SV_GRAPHITETEXTSRC_HXX +// Description: Implements the Graphite interfaces IGrTextSource and +// IGrGraphics which provide Graphite with access to the +// app's text storage system and the platform's font and +// graphics systems. + +// We need this to enable namespace support in libgrengine headers. +#define GR_NAMESPACE + +// Standard Library +#include +// Platform + +#ifndef _SVWIN_H +#include +#endif + +#ifndef _SV_SVSYS_HXX +#include +#endif + +#ifndef _SV_SALGDI_HXX +#include +#endif + +#ifndef _SV_SALLAYOUT_HXX +#include +#endif + +// Module +#include "vcl/dllapi.h" + +// Libraries +#include +#include +#include + +// Module type definitions and forward declarations. +// +namespace grutils +{ + class GrFeatureParser; +} +// Implements the Adaptor pattern to adapt the LayoutArgs and the ServerFont interfaces to the +// gr::IGrTextSource interface. +// @author tse +// +class TextSourceAdaptor : public gr::ITextSource +{ +public: + TextSourceAdaptor(ImplLayoutArgs &layout_args, const int nContextLen) throw(); + ~TextSourceAdaptor(); + virtual gr::UtfType utfEncodingForm(); + virtual size_t getLength(); + virtual size_t fetch(gr::toffset ichMin, size_t cch, gr::utf32 * prgchBuffer); + virtual size_t fetch(gr::toffset ichMin, size_t cch, gr::utf16 * prgchwBuffer); + virtual size_t fetch(gr::toffset ichMin, size_t cch, gr::utf8 * prgchsBuffer); + virtual bool getRightToLeft(gr::toffset ich); + virtual unsigned int getDirectionDepth(gr::toffset ich); + virtual float getVerticalOffset(gr::toffset ich); + virtual gr::isocode getLanguage(gr::toffset ich); + + virtual std::pair propertyRange(gr::toffset ich); + virtual size_t getFontFeatures(gr::toffset ich, gr::FeatureSetting * prgfset); + virtual bool sameSegment(gr::toffset ich1, gr::toffset ich2); + + operator ImplLayoutArgs & () throw(); + void setFeatures(const grutils::GrFeatureParser * pFeatures); + const ImplLayoutArgs & getLayoutArgs() const { return maLayoutArgs; } + size_t getContextLength() const { return mnEnd; }; + inline void switchLayoutArgs(ImplLayoutArgs & newArgs); +private: + // Prevent the generation of a default assignment operator. + TextSourceAdaptor & operator=(const TextSourceAdaptor &); + + void getCharProperties(const int, int &, int &, size_t &); + + ImplLayoutArgs maLayoutArgs; + size_t mnEnd; + const grutils::GrFeatureParser * mpFeatures; +}; + +inline TextSourceAdaptor::TextSourceAdaptor(ImplLayoutArgs &la, const int nContextLen) throw() + : maLayoutArgs(la), + mnEnd(std::min(la.mnLength, nContextLen)), + mpFeatures(NULL) +{ +} + +inline TextSourceAdaptor::operator ImplLayoutArgs & () throw() { + return maLayoutArgs; +} + +inline void TextSourceAdaptor::switchLayoutArgs(ImplLayoutArgs & aNewArgs) +{ + mnEnd += aNewArgs.mnMinCharPos - maLayoutArgs.mnMinCharPos; + maLayoutArgs = aNewArgs; +} + +#endif diff --git a/vcl/source/glyphs/makefile.mk b/vcl/source/glyphs/makefile.mk index b08777d7020f..e43daaeac2ee 100644 --- a/vcl/source/glyphs/makefile.mk +++ b/vcl/source/glyphs/makefile.mk @@ -42,18 +42,40 @@ ENABLE_EXCEPTIONS=true .INCLUDE : $(PRJ)$/util$/makefile2.pmk CFLAGS+= $(FREETYPE_CFLAGS) -.IF "$(USE_FT_EMBOLDEN)" == "YES" -CFLAGS+=-DUSE_FT_EMBOLDEN -.ENDIF # --- Files -------------------------------------------------------- .IF "$(USE_BUILTIN_RASTERIZER)" != "" +# GlyphCache + FreeType support (only on UNX platforms currently) SLOFILES=\ $(SLO)$/glyphcache.obj \ $(SLO)$/gcach_rbmp.obj \ $(SLO)$/gcach_layout.obj \ $(SLO)$/gcach_ftyp.obj + +.IF "$(ENABLE_GRAPHITE)" != "" +# Graphite support using the glyphcache infrastructure +CFLAGS+=-DENABLE_GRAPHITE +SLOFILES+= $(SLO)$/graphite_adaptors.obj \ + $(SLO)$/graphite_features.obj \ + $(SLO)$/graphite_cache.obj \ + $(SLO)$/graphite_textsrc.obj \ + $(SLO)$/graphite_serverfont.obj \ + $(SLO)$/graphite_layout.obj +.ENDIF + +.ELSE + +.IF "$(ENABLE_GRAPHITE)" == "TRUE" +# Graphite support on non-UNX platforms +# make use of stlport headerfiles +EXT_USE_STLPORT=TRUE +SLOFILES=\ + $(SLO)$/graphite_textsrc.obj \ + $(SLO)$/graphite_cache.obj \ + $(SLO)$/graphite_features.obj \ + $(SLO)$/graphite_layout.obj +.ENDIF .ENDIF # --- Targets ------------------------------------------------------ diff --git a/vcl/source/helper/lazydelete.cxx b/vcl/source/helper/lazydelete.cxx index f5a8d8fbb14e..a300aedf8175 100644 --- a/vcl/source/helper/lazydelete.cxx +++ b/vcl/source/helper/lazydelete.cxx @@ -84,6 +84,9 @@ template<> bool LazyDeletor::is_less( Menu* left, Menu* right ) DeleteOnDeinitBase::~DeleteOnDeinitBase() { + ImplSVData* pSVData = ImplGetSVData(); + if( pSVData && pSVData->mpDeinitDeleteList != NULL ) + pSVData->mpDeinitDeleteList->remove( this ); } void DeleteOnDeinitBase::addDeinitContainer( DeleteOnDeinitBase* i_pContainer ) diff --git a/vcl/source/window/accmgr.cxx b/vcl/source/window/accmgr.cxx index 71373bbabee5..36064fc8bc6b 100644 --- a/vcl/source/window/accmgr.cxx +++ b/vcl/source/window/accmgr.cxx @@ -83,6 +83,23 @@ void ImplAccelManager::RemoveAccel( Accelerator* pAccel ) if ( !mpAccelList ) return; + //e.g. #i90599#. Someone starts typing a sequence in a dialog, but doesn't + //end it, and then closes the dialog, deleting the accelerators. So if + //we're removing an accelerator that a sub-accelerator which is in the + //sequence list, throw away the entire sequence + if ( mpSequenceList ) + { + for (USHORT i = 0; i < pAccel->GetItemCount(); ++i) + { + Accelerator* pSubAccel = pAccel->GetAccel(pAccel->GetItemId(i)); + if ( mpSequenceList->GetPos( pSubAccel ) != LIST_ENTRY_NOTFOUND ) + { + EndSequence( true ); + break; + } + } + } + // Raus damit mpAccelList->Remove( pAccel ); } diff --git a/vcl/source/window/brdwin.cxx b/vcl/source/window/brdwin.cxx index f8baad0b4137..c9e8d11557e8 100644 --- a/vcl/source/window/brdwin.cxx +++ b/vcl/source/window/brdwin.cxx @@ -1840,7 +1840,7 @@ void ImplBorderWindow::ImplInit( Window* pParent, { // Alle WindowBits entfernen, die wir nicht haben wollen WinBits nOrgStyle = nStyle; - WinBits nTestStyle = (WB_MOVEABLE | WB_SIZEABLE | WB_ROLLABLE | WB_PINABLE | WB_CLOSEABLE | WB_STANDALONE | WB_DIALOGCONTROL | WB_NODIALOGCONTROL | WB_SYSTEMFLOATWIN | WB_INTROWIN | WB_DEFAULTWIN | WB_TOOLTIPWIN | WB_NOSHADOW | WB_OWNERDRAWDECORATION | WB_SYSTEMCHILDWINDOW ); + WinBits nTestStyle = (WB_MOVEABLE | WB_SIZEABLE | WB_ROLLABLE | WB_PINABLE | WB_CLOSEABLE | WB_STANDALONE | WB_DIALOGCONTROL | WB_NODIALOGCONTROL | WB_SYSTEMFLOATWIN | WB_INTROWIN | WB_DEFAULTWIN | WB_TOOLTIPWIN | WB_NOSHADOW | WB_OWNERDRAWDECORATION | WB_SYSTEMCHILDWINDOW | WB_NEEDSFOCUS); if ( nTypeStyle & BORDERWINDOW_STYLE_APP ) nTestStyle |= WB_APP; nStyle &= nTestStyle; diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index 1fc2b9be703a..997e63d8b22e 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -453,6 +453,14 @@ Dialog::~Dialog() // ----------------------------------------------------------------------- +IMPL_LINK( Dialog, ImplAsyncCloseHdl, void*, EMPTYARG ) +{ + Close(); + return 0; +} + +// ----------------------------------------------------------------------- + long Dialog::Notify( NotifyEvent& rNEvt ) { // Zuerst Basisklasse rufen wegen TabSteuerung @@ -468,7 +476,11 @@ long Dialog::Notify( NotifyEvent& rNEvt ) if ( (nKeyCode == KEY_ESCAPE) && ((GetStyle() & WB_CLOSEABLE) || ImplGetCancelButton( this ) || ImplGetOKButton( this )) ) { - Close(); + // #i89505# for the benefit of slightly mentally challenged implementations + // like e.g. SfxModelessDialog which destroy themselves inside Close() + // post this Close asynchronous so we can leave our key handler before + // we get destroyed + PostUserEvent( LINK( this, Dialog, ImplAsyncCloseHdl ), this ); return TRUE; } } diff --git a/vcl/source/window/dlgctrl.cxx b/vcl/source/window/dlgctrl.cxx index 392c2ceaa478..c6f64d74c5fc 100644 --- a/vcl/source/window/dlgctrl.cxx +++ b/vcl/source/window/dlgctrl.cxx @@ -46,10 +46,41 @@ using namespace ::com::sun::star; // ======================================================================= +static BOOL ImplHasIndirectTabParent( Window* pWindow ) +{ + // The window has inderect tab parent if it is included in tab hierarchy + // of the indirect parent window + + return ( pWindow && pWindow->GetParent() + && ( pWindow->GetParent()->ImplGetWindow()->GetStyle() & WB_CHILDDLGCTRL ) ); +} + +// ----------------------------------------------------------------------- + +static Window* ImplGetTopParentOfTabHierarchy( Window* pParent ) +{ + // The method allows to find the most close parent containing all the + // window from the current tab-hierarchy + // The direct parent should be provided as a parameter here + + Window* pResult = pParent; + + if ( pResult ) + { + while ( pResult->GetParent() && ( pResult->ImplGetWindow()->GetStyle() & WB_CHILDDLGCTRL ) ) + pResult = pResult->GetParent(); + } + + return pResult; +} + +// ----------------------------------------------------------------------- + static Window* ImplGetSubChildWindow( Window* pParent, USHORT n, USHORT& nIndex ) { Window* pTabPage = NULL; Window* pFoundWindow = NULL; + Window* pWindow = pParent->GetWindow( WINDOW_FIRSTCHILD ); Window* pNextWindow = pWindow; while ( pWindow ) @@ -96,7 +127,8 @@ static Window* ImplGetSubChildWindow( Window* pParent, USHORT n, USHORT& nIndex } } } - else if ( pWindow->GetStyle() & WB_DIALOGCONTROL ) + else if ( ( pWindow->GetStyle() & WB_DIALOGCONTROL ) + || ( pWindow->GetStyle() & WB_CHILDDLGCTRL ) ) pFoundWindow = ImplGetSubChildWindow( pWindow, n, nIndex ); } @@ -122,6 +154,8 @@ static Window* ImplGetSubChildWindow( Window* pParent, USHORT n, USHORT& nIndex static Window* ImplGetChildWindow( Window* pParent, USHORT n, USHORT& nIndex, BOOL bTestEnable ) { + pParent = ImplGetTopParentOfTabHierarchy( pParent ); + nIndex = 0; Window* pWindow = ImplGetSubChildWindow( pParent, n, nIndex ); if ( bTestEnable ) @@ -284,14 +318,16 @@ static Window* ImplFindDlgCtrlWindow( Window* pParent, Window* pWindow, USHORT& USHORT nFormEnd; // Focus-Fenster in der Child-Liste suchen - pSWindow = ImplGetChildWindow( pParent, 0, i, FALSE ); + Window* pFirstChildWindow = pSWindow = ImplGetChildWindow( pParent, 0, i, FALSE ); if( pWindow == NULL ) pWindow = pSWindow; while ( pSWindow ) { - if ( pSWindow->ImplGetWindow()->IsDialogControlStart() ) + // the DialogControlStart mark is only accepted for the direct children + if ( !ImplHasIndirectTabParent( pSWindow ) + && pSWindow->ImplGetWindow()->IsDialogControlStart() ) nFormStart = i; // SecondWindow wegen zusammengesetzten Controls wie @@ -331,12 +367,33 @@ static Window* ImplFindDlgCtrlWindow( Window* pParent, Window* pWindow, USHORT& // Formularende suchen nFormEnd = nFormStart; pTempWindow = pSWindow; + sal_Int32 nIteration = 0; do { nFormEnd = i; pTempWindow = ImplGetNextWindow( pParent, i, i, FALSE ); - if ( !i || (pTempWindow && pTempWindow->ImplGetWindow()->IsDialogControlStart()) ) + + // the DialogControlStart mark is only accepted for the direct children + if ( !i + || ( pTempWindow && !ImplHasIndirectTabParent( pTempWindow ) + && pTempWindow->ImplGetWindow()->IsDialogControlStart() ) ) break; + + if ( pTempWindow && pTempWindow == pFirstChildWindow ) + { + // It is possible to go through the begin of hierarchy once + // while looking for DialogControlStart mark. + // If it happens second time, it looks like an endless loop, + // that should be impossible, but just for the case... + nIteration++; + if ( nIteration >= 2 ) + { + // this is an unexpected scenario + DBG_ASSERT( FALSE, "It seems to be an endless loop!" ); + rFormStart = 0; + break; + } + } } while ( pTempWindow ); rFormEnd = nFormEnd; diff --git a/vcl/source/window/dockmgr.cxx b/vcl/source/window/dockmgr.cxx index b5f1ada74a98..c587b7ad8441 100644 --- a/vcl/source/window/dockmgr.cxx +++ b/vcl/source/window/dockmgr.cxx @@ -1238,8 +1238,8 @@ void ImplDockingWindowWrapper::StartPopupMode( ToolBox *pParentToolBox ) ULONG nFlags = FLOATWIN_POPUPMODE_ALLOWTEAROFF | FLOATWIN_POPUPMODE_NOFOCUSCLOSE | FLOATWIN_POPUPMODE_ALLMOUSEBUTTONCLOSE | - FLOATWIN_POPUPMODE_NOMOUSEUPCLOSE | - FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE; + FLOATWIN_POPUPMODE_NOMOUSEUPCLOSE; +// |FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE; // if the subtoolbar was opened via keyboard make sure that key events // will go into subtoolbar diff --git a/vcl/source/window/floatwin.cxx b/vcl/source/window/floatwin.cxx index 7bcb90bbb8fc..5f1578c4b9e2 100644 --- a/vcl/source/window/floatwin.cxx +++ b/vcl/source/window/floatwin.cxx @@ -243,6 +243,13 @@ FloatingWindow::~FloatingWindow() // ----------------------------------------------------------------------- +Point FloatingWindow::CalcFloatingPosition( Window* pWindow, const Rectangle& rRect, ULONG nFlags, USHORT& rArrangeIndex ) +{ + return ImplCalcPos( pWindow, rRect, nFlags, rArrangeIndex ); +} + +// ----------------------------------------------------------------------- + Point FloatingWindow::ImplCalcPos( Window* pWindow, const Rectangle& rRect, ULONG nFlags, USHORT& rArrangeIndex ) @@ -676,8 +683,6 @@ void FloatingWindow::StartPopupMode( const Rectangle& rRect, ULONG nFlags ) // avoid close on focus change for decorated floating windows only if( mpWindowImpl->mbFrame && (GetStyle() & WB_MOVEABLE) ) nFlags |= FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE; - else - nFlags &= ~FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE; // #102010# For debugging Accessibility static const char* pEnv = getenv("SAL_FLOATWIN_NOAPPFOCUSCLOSE" ); @@ -751,8 +756,9 @@ void FloatingWindow::StartPopupMode( ToolBox* pBox, ULONG nFlags ) // FLOATWIN_POPUPMODE_NOMOUSECLOSE | FLOATWIN_POPUPMODE_ALLMOUSEBUTTONCLOSE | // FLOATWIN_POPUPMODE_NOMOUSERECTCLOSE | // #105968# floating toolboxes should close when clicked in (parent's) float rect - FLOATWIN_POPUPMODE_NOMOUSEUPCLOSE | - FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE; + FLOATWIN_POPUPMODE_NOMOUSEUPCLOSE; +// | FLOATWIN_POPUPMODE_NOAPPFOCUSCLOSE; + /* * FLOATWIN_POPUPMODE_NOKEYCLOSE | * don't set since it disables closing floaters with escape diff --git a/vcl/source/window/makefile.mk b/vcl/source/window/makefile.mk index cdd4aef73bb0..169cf44b2b13 100644 --- a/vcl/source/window/makefile.mk +++ b/vcl/source/window/makefile.mk @@ -96,10 +96,10 @@ SLOFILES= \ $(INCCOM)$/cuilib.hxx: makefile.mk .IF "$(GUI)"=="UNX" - $(RM) $@ - echo \#define DLL_NAME \"libcui$(DLLPOSTFIX)$(DLLPOST)\" >$@ + @$(RM) $@ + @echo \#define DLL_NAME \"libcui$(DLLPOSTFIX)$(DLLPOST)\" >$@ .ELSE - echo $(EMQ)#define DLL_NAME $(EMQ)"cui$(DLLPOSTFIX)$(DLLPOST)$(EMQ)" >$@ + @echo $(EMQ)#define DLL_NAME $(EMQ)"cui$(DLLPOSTFIX)$(DLLPOST)$(EMQ)" >$@ .ENDIF $(SLO)$/abstdlg.obj : $(INCCOM)$/cuilib.hxx diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx index c827905e94e6..c9e0c23e7f16 100644 --- a/vcl/source/window/menu.cxx +++ b/vcl/source/window/menu.cxx @@ -557,7 +557,7 @@ public: void DataChanged( const DataChangedEvent& rDCEvt ); - void SetImages( long nMaxHeight = 0 ); + void SetImages( long nMaxHeight = 0, bool bForce = false ); void calcMinSize(); Size getMinSize(); @@ -591,7 +591,7 @@ void DecoToolBox::DataChanged( const DataChangedEvent& rDCEvt ) { calcMinSize(); SetBackground(); - SetImages(); + SetImages( 0, true); } } @@ -625,7 +625,7 @@ Size DecoToolBox::getMinSize() return maMinSize; } -void DecoToolBox::SetImages( long nMaxHeight ) +void DecoToolBox::SetImages( long nMaxHeight, bool bForce ) { long border = getMinSize().Height() - maImage.GetSizePixel().Height(); @@ -635,13 +635,13 @@ void DecoToolBox::SetImages( long nMaxHeight ) if( nMaxHeight < getMinSize().Height() ) nMaxHeight = getMinSize().Height(); - if( lastSize != nMaxHeight - border ) + if( (lastSize != nMaxHeight - border) || bForce ) { lastSize = nMaxHeight - border; Color aEraseColor( 255, 255, 255, 255 ); BitmapEx aBmpExDst( maImage.GetBitmapEx() ); - BitmapEx aBmpExSrc( GetSettings().GetStyleSettings().GetMenuBarColor().IsDark() ? + BitmapEx aBmpExSrc( GetSettings().GetStyleSettings().GetHighContrastMode() ? maImageHC.GetBitmapEx() : aBmpExDst ); aEraseColor.SetTransparency( 255 ); @@ -2731,7 +2731,14 @@ void Menu::ImplPaint( Window* pWin, USHORT nBorder, long nStartY, MenuItemData* } if ( pThisItemOnly && bHighlighted ) - pWin->SetTextColor( rSettings.GetMenuTextColor() ); + { + // This restores the normal menu or menu bar text + // color for when it is no longer highlighted. + if ( bIsMenuBar ) + pWin->SetTextColor( rSettings.GetMenuBarTextColor() ); + else + pWin->SetTextColor( rSettings.GetMenuTextColor() ); + } } if( bLayout ) { @@ -3480,11 +3487,6 @@ USHORT PopupMenu::Execute( Window* pExecWindow, const Rectangle& rRect, USHORT n USHORT PopupMenu::ImplExecute( Window* pW, const Rectangle& rRect, ULONG nPopupModeFlags, Menu* pSFrom, BOOL bPreSelectFirst ) { - - // #59614# Mit TH abgesprochen dass die ASSERTION raus kommt, - // weil es evtl. legitim ist... -// DBG_ASSERT( !PopupMenu::IsInExecute() || pSFrom, "PopupMenu::Execute() called in PopupMenu::Execute()" ); - if ( !pSFrom && ( PopupMenu::IsInExecute() || !GetItemCount() ) ) return 0; @@ -3660,8 +3662,16 @@ USHORT PopupMenu::ImplExecute( Window* pW, const Rectangle& rRect, ULONG nPopupM { pWin->ImplAddDel( &aDelData ); + ImplDelData aModalWinDel; + pW->ImplAddDel( &aModalWinDel ); + pW->ImplIncModalCount(); + pWin->Execute(); + DBG_ASSERT( ! aModalWinDel.IsDead(), "window for popup died, modal count incorrect !" ); + if( ! aModalWinDel.IsDead() ) + pW->ImplDecModalCount(); + if ( !aDelData.IsDelete() ) pWin->ImplRemoveDel( &aDelData ); else @@ -3784,7 +3794,10 @@ static void ImplInitMenuWindow( Window* pWin, BOOL bFont, BOOL bMenuBar ) pWin->SetBackground( Wallpaper( rStyleSettings.GetMenuColor() ) ); } - pWin->SetTextColor( rStyleSettings.GetMenuTextColor() ); + if ( bMenuBar ) + pWin->SetTextColor( rStyleSettings.GetMenuBarTextColor() ); + else + pWin->SetTextColor( rStyleSettings.GetMenuTextColor() ); pWin->SetTextFillColor(); pWin->SetLineColor(); } @@ -5053,7 +5066,7 @@ MenuBarWindow::MenuBarWindow( Window* pParent ) : aCloser.SetParentClipMode( PARENTCLIPMODE_NOCLIP ); aCloser.InsertItem( IID_DOCUMENTCLOSE, - GetSettings().GetStyleSettings().GetMenuBarColor().IsDark() ? aCloser.maImageHC : aCloser.maImage, 0 ); + GetSettings().GetStyleSettings().GetHighContrastMode() ? aCloser.maImageHC : aCloser.maImage, 0 ); aCloser.SetSelectHdl( LINK( this, MenuBarWindow, CloserHdl ) ); aCloser.AddEventListener( LINK( this, MenuBarWindow, ToolboxEventHdl ) ); aCloser.SetQuickHelpText( IID_DOCUMENTCLOSE, XubString( ResId( SV_HELPTEXT_CLOSEDOCUMENT, *pResMgr ) ) ); @@ -5123,15 +5136,23 @@ IMPL_LINK( MenuBarWindow, CloserHdl, PushButton*, EMPTYARG ) return 0; if( aCloser.GetCurItemId() == IID_DOCUMENTCLOSE ) - return ((MenuBar*)pMenu)->GetCloserHdl().Call( pMenu ); - std::map::iterator it = m_aAddButtons.find( aCloser.GetCurItemId() ); - if( it != m_aAddButtons.end() ) { - MenuBar::MenuBarButtonCallbackArg aArg; - aArg.nId = it->first; - aArg.bHighlight = (aCloser.GetHighlightItemId() == it->first); - aArg.pMenuBar = dynamic_cast(pMenu); - return it->second.m_aSelectLink.Call( &aArg ); + // #i106052# call close hdl asynchronously to ease handler implementation + // this avoids still being in the handler while the DecoToolBox already + // gets destroyed + Application::PostUserEvent( ((MenuBar*)pMenu)->GetCloserHdl(), pMenu ); + } + else + { + std::map::iterator it = m_aAddButtons.find( aCloser.GetCurItemId() ); + if( it != m_aAddButtons.end() ) + { + MenuBar::MenuBarButtonCallbackArg aArg; + aArg.nId = it->first; + aArg.bHighlight = (aCloser.GetHighlightItemId() == it->first); + aArg.pMenuBar = dynamic_cast(pMenu); + return it->second.m_aSelectLink.Call( &aArg ); + } } return 0; } @@ -5694,7 +5715,7 @@ void MenuBarWindow::Paint( const Rectangle& ) // in high contrast mode draw a separating line on the lower edge if( ! IsNativeControlSupported( CTRL_MENUBAR, PART_ENTIRE_CONTROL) && - GetSettings().GetStyleSettings().GetFaceColor().IsDark() ) + GetSettings().GetStyleSettings().GetHighContrastMode() ) { Push( PUSH_LINECOLOR | PUSH_MAPMODE ); SetLineColor( Color( COL_WHITE ) ); diff --git a/vcl/source/window/msgbox.cxx b/vcl/source/window/msgbox.cxx index bd727092a836..3d3245af831f 100644 --- a/vcl/source/window/msgbox.cxx +++ b/vcl/source/window/msgbox.cxx @@ -500,7 +500,7 @@ void InfoBox::ImplInitInfoBoxData() if ( !GetText().Len() ) SetText( Application::GetDisplayName() ); - SetImage( GetSettings().GetStyleSettings().GetDialogColor().IsDark() ? + SetImage( GetSettings().GetStyleSettings().GetHighContrastMode() ? InfoBox::GetStandardImageHC() : InfoBox::GetStandardImage() ); mnSoundType = ((USHORT)SOUND_INFO)+1; } @@ -591,7 +591,7 @@ void ErrorBox::ImplInitErrorBoxData() if ( !GetText().Len() ) SetText( Application::GetDisplayName() ); - SetImage( GetSettings().GetStyleSettings().GetDialogColor().IsDark() ? + SetImage( GetSettings().GetStyleSettings().GetHighContrastMode() ? ErrorBox::GetStandardImageHC() : ErrorBox::GetStandardImage() ); mnSoundType = ((USHORT)SOUND_ERROR)+1; } @@ -637,7 +637,7 @@ void QueryBox::ImplInitQueryBoxData() if ( !GetText().Len() ) SetText( Application::GetDisplayName() ); - SetImage( GetSettings().GetStyleSettings().GetDialogColor().IsDark() ? + SetImage( GetSettings().GetStyleSettings().GetHighContrastMode() ? QueryBox::GetStandardImageHC() : QueryBox::GetStandardImage() ); mnSoundType = ((USHORT)SOUND_QUERY)+1; } diff --git a/vcl/source/window/status.cxx b/vcl/source/window/status.cxx index 4aaef6a707b1..ede3bcc107aa 100644 --- a/vcl/source/window/status.cxx +++ b/vcl/source/window/status.cxx @@ -1320,8 +1320,13 @@ void StatusBar::SetItemText( USHORT nItemId, const XubString& rText ) // adjust item width - see also DataChanged() long nFudge = GetTextHeight()/4; long nWidth = GetTextWidth( pItem->maText ) + nFudge; - if( nWidth > pItem->mnWidth + STATUSBAR_OFFSET ) + if( (nWidth > pItem->mnWidth + STATUSBAR_OFFSET) || + ((nWidth < pItem->mnWidth) && (mnDX - STATUSBAR_OFFSET) < mnItemsWidth )) + { pItem->mnWidth = nWidth + STATUSBAR_OFFSET; + ImplFormat(); + Invalidate(); + } // Item neu Zeichen, wenn StatusBar sichtbar und // UpdateMode gesetzt ist diff --git a/vcl/source/window/syswin.cxx b/vcl/source/window/syswin.cxx index f3ce8b2d05ea..2d99fbb20b65 100644 --- a/vcl/source/window/syswin.cxx +++ b/vcl/source/window/syswin.cxx @@ -62,6 +62,7 @@ public: TaskPaneList* mpTaskPaneList; Size maMaxOutSize; + rtl::OUString maRepresentedURL; }; SystemWindow::ImplData::ImplData() @@ -277,6 +278,29 @@ void SystemWindow::SetZLevel( BYTE nLevel ) // ----------------------------------------------------------------------- +void SystemWindow::SetRepresentedURL( const rtl::OUString& i_rURL ) +{ + bool bChanged = (i_rURL != mpImplData->maRepresentedURL); + mpImplData->maRepresentedURL = i_rURL; + if ( !mbSysChild && bChanged ) + { + const Window* pWindow = this; + while ( pWindow->mpWindowImpl->mpBorderWindow ) + pWindow = pWindow->mpWindowImpl->mpBorderWindow; + + if ( pWindow->mpWindowImpl->mbFrame ) + pWindow->mpWindowImpl->mpFrame->SetRepresentedURL( i_rURL ); + } +} +// ----------------------------------------------------------------------- + +const rtl::OUString& SystemWindow::GetRepresentedURL() const +{ + return mpImplData->maRepresentedURL; +} + +// ----------------------------------------------------------------------- + void SystemWindow::SetIcon( USHORT nIcon ) { if ( mnIcon == nIcon ) diff --git a/vcl/source/window/tabpage.cxx b/vcl/source/window/tabpage.cxx index 57eec66e705a..e28026876fad 100644 --- a/vcl/source/window/tabpage.cxx +++ b/vcl/source/window/tabpage.cxx @@ -121,6 +121,8 @@ void TabPage::StateChanged( StateChangedType nType ) { if ( GetSettings().GetStyleSettings().GetAutoMnemonic() ) ImplWindowAutoMnemonic( this ); + // FIXME: no layouting, workaround some clipping issues + ImplAdjustNWFSizes(); } else if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) { diff --git a/vcl/source/window/taskpanelist.cxx b/vcl/source/window/taskpanelist.cxx index bae6d99430f0..d1e598532b88 100644 --- a/vcl/source/window/taskpanelist.cxx +++ b/vcl/source/window/taskpanelist.cxx @@ -197,18 +197,21 @@ BOOL TaskPaneList::HandleKeyEvent( KeyEvent aKeyEvent ) { // F6 cycles through everything and works always - // Ctrl-TAB cycles through Menubar, Toolbars and Floatingwindows only and is - // only active if one of those items has the focus - BOOL bF6 = FALSE; + + // MAV, #i104204# + // The old design was the following one: + // < Ctrl-TAB cycles through Menubar, Toolbars and Floatingwindows only and is + // < only active if one of those items has the focus + // + // Since the design of Ctrl-Tab looks to be inconsistent ( non-modal dialogs are not reachable + // and the shortcut conflicts with tab-control shortcut ), it is no more supported BOOL bSplitterOnly = FALSE; BOOL bFocusInList = FALSE; KeyCode aKeyCode = aKeyEvent.GetKeyCode(); BOOL bForward = !aKeyCode.IsShift(); - if( ( (aKeyCode.IsMod1() || aKeyCode.IsMod2()) && aKeyCode.GetCode() == KEY_TAB ) // Ctrl-TAB or Alt-TAB - || ( bF6 = ( aKeyCode.GetCode()) == KEY_F6 ) != FALSE // F6 - ) + if( aKeyCode.GetCode() == KEY_F6 ) // F6 { - bSplitterOnly = bF6 && aKeyCode.IsMod1() && aKeyCode.IsShift(); + bSplitterOnly = aKeyCode.IsMod1() && aKeyCode.IsShift(); // is the focus in the list ? ::std::vector< Window* >::iterator p = mTaskPanes.begin(); @@ -219,12 +222,8 @@ BOOL TaskPaneList::HandleKeyEvent( KeyEvent aKeyEvent ) { bFocusInList = TRUE; - // Ctrl-TAB does not work in Dialogs - if( !bF6 && pWin->IsDialog() ) - return FALSE; - // Ctrl-F6 goes directly to the document - if( !pWin->IsDialog() && bF6 && aKeyCode.IsMod1() && !aKeyCode.IsShift() ) + if( !pWin->IsDialog() && aKeyCode.IsMod1() && !aKeyCode.IsShift() ) { pWin->GrabFocusToDocument(); return TRUE; @@ -236,7 +235,8 @@ BOOL TaskPaneList::HandleKeyEvent( KeyEvent aKeyEvent ) if( bSplitterOnly ) pNextWin = FindNextSplitter( *p, TRUE ); else - pNextWin = bF6 ? FindNextFloat( *p, bForward ) : FindNextPane( *p, bForward ); + pNextWin = FindNextFloat( *p, bForward ); + if( pNextWin != pWin ) { ImplGetSVData()->maWinData.mbNoSaveFocus = TRUE; @@ -261,7 +261,7 @@ BOOL TaskPaneList::HandleKeyEvent( KeyEvent aKeyEvent ) } // the focus is not in the list: activate first float if F6 was pressed - if( !bFocusInList && bF6 ) + if( !bFocusInList ) { Window *pWin; if( bSplitterOnly ) diff --git a/vcl/source/window/toolbox.cxx b/vcl/source/window/toolbox.cxx index bb1f428c6626..8aa4926f5e1a 100644 --- a/vcl/source/window/toolbox.cxx +++ b/vcl/source/window/toolbox.cxx @@ -397,7 +397,7 @@ void ToolBox::ImplDrawGradientBackground( ToolBox* pThis, ImplDockingWindowWrapp Color startCol, endCol; startCol = pThis->GetSettings().GetStyleSettings().GetFaceGradientColor(); endCol = pThis->GetSettings().GetStyleSettings().GetFaceColor(); - if( endCol.IsDark() ) + if( pThis->GetSettings().GetStyleSettings().GetHighContrastMode() ) // no 'extreme' gradient when high contrast startCol = endCol; @@ -1901,37 +1901,78 @@ BOOL ToolBox::ImplCalcItem() nDefWidth = GetDefaultImageSize().Width(); nDefHeight = GetDefaultImageSize().Height(); + mnWinHeight = 0; // determine minimum size necessary in NWF - if( IsNativeControlSupported( CTRL_TOOLBAR, PART_BUTTON ) ) { Rectangle aRect( Point( 0, 0 ), Size( nMinWidth, nMinHeight ) ); - Region aArrowReg = aRect; + Region aReg = aRect; ImplControlValue aVal; Region aNativeBounds, aNativeContent; - if( GetNativeControlRegion( CTRL_TOOLBAR, PART_BUTTON, - aArrowReg, + if( IsNativeControlSupported( CTRL_TOOLBAR, PART_BUTTON ) ) + { + if( GetNativeControlRegion( CTRL_TOOLBAR, PART_BUTTON, + aReg, + CTRL_STATE_ENABLED | CTRL_STATE_ROLLOVER, + aVal, OUString(), + aNativeBounds, aNativeContent ) ) + { + aRect = aNativeBounds.GetBoundRect(); + if( aRect.GetWidth() > nMinWidth ) + nMinWidth = aRect.GetWidth(); + if( aRect.GetHeight() > nMinHeight ) + nMinHeight = aRect.GetHeight(); + if( nDropDownArrowWidth < nMinWidth ) + nDropDownArrowWidth = nMinWidth; + if( nMinWidth > mpData->mnMenuButtonWidth ) + mpData->mnMenuButtonWidth = nMinWidth; + else if( nMinWidth < TB_MENUBUTTON_SIZE ) + mpData->mnMenuButtonWidth = TB_MENUBUTTON_SIZE; + } + } + + // also calculate the area for comboboxes, drop down list boxes and spinfields + // as these are often inserted into toolboxes; set mnWinHeight to the + // greater of those values to prevent toolbar flickering (#i103385#) + aRect = Rectangle( Point( 0, 0 ), Size( nMinWidth, nMinHeight ) ); + aReg = aRect; + if( GetNativeControlRegion( CTRL_COMBOBOX, PART_ENTIRE_CONTROL, + aReg, CTRL_STATE_ENABLED | CTRL_STATE_ROLLOVER, aVal, OUString(), aNativeBounds, aNativeContent ) ) { aRect = aNativeBounds.GetBoundRect(); - if( aRect.GetWidth() > nMinWidth ) - nMinWidth = aRect.GetWidth(); - if( aRect.GetHeight() > nMinHeight ) - nMinHeight = aRect.GetHeight(); - if( nDropDownArrowWidth < nMinWidth ) - nDropDownArrowWidth = nMinWidth; - if( nMinWidth > mpData->mnMenuButtonWidth ) - mpData->mnMenuButtonWidth = nMinWidth; - else if( nMinWidth < TB_MENUBUTTON_SIZE ) - mpData->mnMenuButtonWidth = TB_MENUBUTTON_SIZE; + if( aRect.GetHeight() > mnWinHeight ) + mnWinHeight = aRect.GetHeight(); + } + aRect = Rectangle( Point( 0, 0 ), Size( nMinWidth, nMinHeight ) ); + aReg = aRect; + if( GetNativeControlRegion( CTRL_LISTBOX, PART_ENTIRE_CONTROL, + aReg, + CTRL_STATE_ENABLED | CTRL_STATE_ROLLOVER, + aVal, OUString(), + aNativeBounds, aNativeContent ) ) + { + aRect = aNativeBounds.GetBoundRect(); + if( aRect.GetHeight() > mnWinHeight ) + mnWinHeight = aRect.GetHeight(); + } + aRect = Rectangle( Point( 0, 0 ), Size( nMinWidth, nMinHeight ) ); + aReg = aRect; + if( GetNativeControlRegion( CTRL_SPINBOX, PART_ENTIRE_CONTROL, + aReg, + CTRL_STATE_ENABLED | CTRL_STATE_ROLLOVER, + aVal, OUString(), + aNativeBounds, aNativeContent ) ) + { + aRect = aNativeBounds.GetBoundRect(); + if( aRect.GetHeight() > mnWinHeight ) + mnWinHeight = aRect.GetHeight(); } } if ( ! mpData->m_aItems.empty() ) { - mnWinHeight = 0; - std::vector< ImplToolItem >::iterator it = mpData->m_aItems.begin(); while ( it != mpData->m_aItems.end() ) { diff --git a/vcl/source/window/toolbox2.cxx b/vcl/source/window/toolbox2.cxx index 7fa8f76e1586..ecc335420f18 100644 --- a/vcl/source/window/toolbox2.cxx +++ b/vcl/source/window/toolbox2.cxx @@ -1002,6 +1002,9 @@ const Size& ToolBox::GetDefaultImageSize() const case STYLE_SYMBOLS_CRYSTAL: aLargeButtonSize = Size( TB_LARGEIMAGESIZE_CRYSTAL, TB_LARGEIMAGESIZE_CRYSTAL ); break; + case STYLE_SYMBOLS_OXYGEN: + aLargeButtonSize = Size( TB_LARGEIMAGESIZE_OXYGEN, TB_LARGEIMAGESIZE_OXYGEN ); + break; default: aLargeButtonSize = Size( TB_LARGEIMAGESIZE, TB_LARGEIMAGESIZE ); } @@ -2413,10 +2416,10 @@ void ToolBox::ImplUpdateImageList() { if (mpData->mpImageListProvider != NULL) { - BOOL bIsDark = GetSettings().GetStyleSettings().GetFaceColor().IsDark(); + BOOL bHC = GetSettings().GetStyleSettings().GetHighContrastMode(); try { - ImageListType eType = bIsDark ? vcl::HIGHCONTRAST_YES : vcl::HIGHCONTRAST_NO; + ImageListType eType = bHC ? vcl::HIGHCONTRAST_YES : vcl::HIGHCONTRAST_NO; if (eType != mpData->meImageListType) { diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx index 279775d712e4..bcf86c749673 100644 --- a/vcl/source/window/window.cxx +++ b/vcl/source/window/window.cxx @@ -68,7 +68,7 @@ #include "vcl/wall.hxx" #include "vcl/gradient.hxx" #include "vcl/toolbox.h" -#include "vcl/fontcfg.hxx" +#include "unotools/fontcfg.hxx" #include "vcl/sysdata.hxx" #include "vcl/sallayout.hxx" #include "vcl/button.hxx" // Button::GetStandardText @@ -292,6 +292,13 @@ bool Window::ImplCheckUIFont( const Font& rFont ) void Window::ImplUpdateGlobalSettings( AllSettings& rSettings, BOOL bCallHdl ) { + // reset high contrast to false, so the system can either update it + // or AutoDetectSystemHC can kick in (see below) + StyleSettings aTmpSt( rSettings.GetStyleSettings() ); + aTmpSt.SetHighContrastMode( FALSE ); + rSettings.SetStyleSettings( aTmpSt ); + ImplGetFrame()->UpdateSettings( rSettings ); + // Verify availability of the configured UI font, otherwise choose "Andale Sans UI" String aUserInterfaceFont; bool bUseSystemFont = rSettings.GetStyleSettings().GetUseSystemUIFonts(); @@ -303,7 +310,7 @@ void Window::ImplUpdateGlobalSettings( AllSettings& rSettings, BOOL bCallHdl ) if ( !bUseSystemFont ) { ImplInitFontList(); - String aConfigFont = vcl::DefaultFontConfiguration::get()->getUserInterfaceFont( rSettings.GetUILocale() ); + String aConfigFont = utl::DefaultFontConfiguration::get()->getUserInterfaceFont( rSettings.GetUILocale() ); xub_StrLen nIndex = 0; while( nIndex != STRING_NOTFOUND ) { @@ -472,7 +479,8 @@ void Window::ImplUpdateGlobalSettings( AllSettings& rSettings, BOOL bCallHdl ) rSettings.SetStyleSettings( aStyleSettings ); - // #104427# auto detect HC mode ? + // auto detect HC mode; if the system already set it to "yes" + // (see above) then accept that if( !rSettings.GetStyleSettings().GetHighContrastMode() ) { sal_Bool bTmp = sal_False, bAutoHCMode = sal_True; @@ -728,7 +736,7 @@ void Window::ImplInit( Window* pParent, WinBits nStyle, SystemParentData* pSyste nBorderTypeStyle |= BORDERWINDOW_STYLE_FRAME; nStyle |= WB_BORDER; } - ImplBorderWindow* pBorderWin = new ImplBorderWindow( pParent, nStyle & (WB_BORDER | WB_DIALOGCONTROL | WB_NODIALOGCONTROL), nBorderTypeStyle ); + ImplBorderWindow* pBorderWin = new ImplBorderWindow( pParent, nStyle & (WB_BORDER | WB_DIALOGCONTROL | WB_NODIALOGCONTROL | WB_NEEDSFOCUS), nBorderTypeStyle ); ((Window*)pBorderWin)->mpWindowImpl->mpClientWindow = this; pBorderWin->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder ); mpWindowImpl->mpBorderWindow = pBorderWin; @@ -783,6 +791,8 @@ void Window::ImplInit( Window* pParent, WinBits nStyle, SystemParentData* pSyste nFrameStyle = SAL_FRAME_STYLE_FLOAT; if( nStyle & WB_OWNERDRAWDECORATION ) nFrameStyle |= (SAL_FRAME_STYLE_OWNERDRAWDECORATION | SAL_FRAME_STYLE_NOSHADOW); + if( nStyle & WB_NEEDSFOCUS ) + nFrameStyle |= SAL_FRAME_STYLE_FLOAT_FOCUSABLE; } else if( mpWindowImpl->mbFloatWin ) nFrameStyle |= SAL_FRAME_STYLE_TOOLWINDOW; @@ -923,7 +933,7 @@ void Window::ImplInit( Window* pParent, WinBits nStyle, SystemParentData* pSyste ! (nStyle & (WB_INTROWIN|WB_DEFAULTWIN)) ) { - mpWindowImpl->mpFrame->UpdateSettings( *pSVData->maAppData.mpSettings ); + // side effect: ImplUpdateGlobalSettings does an ImplGetFrame()->UpdateSettings ImplUpdateGlobalSettings( *pSVData->maAppData.mpSettings ); OutputDevice::SetSettings( *pSVData->maAppData.mpSettings ); pSVData->maAppData.mbSettingsInit = TRUE; @@ -5844,18 +5854,15 @@ void Window::UpdateSettings( const AllSettings& rSettings, BOOL bChild ) ImplInitResolutionSettings(); /* #i73785# - * do not overwrite a NoWheelActionWithoutFocus with false - * this looks kind of a hack, but NoWheelActionWithoutFocus + * do not overwrite a WheelBehavior with false + * this looks kind of a hack, but WheelBehavior * is always a local change, not a system property, - * so we can spare all our users the hassel of reacting on + * so we can spare all our users the hassle of reacting on * this in their respective DataChanged. */ - if( aOldSettings.GetMouseSettings().GetNoWheelActionWithoutFocus() ) - { - MouseSettings aSet( maSettings.GetMouseSettings() ); - aSet.SetNoWheelActionWithoutFocus( TRUE ); - maSettings.SetMouseSettings( aSet ); - } + MouseSettings aSet( maSettings.GetMouseSettings() ); + aSet.SetWheelBehavior( aOldSettings.GetMouseSettings().GetWheelBehavior() ); + maSettings.SetMouseSettings( aSet ); if( (nChangeFlags & SETTINGS_STYLE) && IsBackground() ) { @@ -6224,6 +6231,15 @@ void Window::SetParent( Window* pNewParent ) pSysWin->GetTaskPaneList()->RemoveWindow( this ); } } + // remove ownerdraw decorated windows from list in the top-most frame window + if( (GetStyle() & WB_OWNERDRAWDECORATION) && mpWindowImpl->mbFrame ) + { + ::std::vector< Window* >& rList = ImplGetOwnerDrawList(); + ::std::vector< Window* >::iterator p; + p = ::std::find( rList.begin(), rList.end(), this ); + if( p != rList.end() ) + rList.erase( p ); + } ImplSetFrameParent( pNewParent ); @@ -6353,6 +6369,9 @@ void Window::SetParent( Window* pNewParent ) if( bChangeTaskPaneList ) pNewSysWin->GetTaskPaneList()->AddWindow( this ); + if( (GetStyle() & WB_OWNERDRAWDECORATION) && mpWindowImpl->mbFrame ) + ImplGetOwnerDrawList().push_back( this ); + if ( bVisible ) Show( TRUE, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE ); } @@ -6495,7 +6514,7 @@ void Window::Show( BOOL bVisible, USHORT nFlags ) // nach vorne, wenn es gewuenscht ist if ( ImplIsOverlapWindow() && !(nFlags & SHOW_NOACTIVATE) ) { - ImplStartToTop( 0 ); + ImplStartToTop(( nFlags & SHOW_FOREGROUNDTASK ) ? TOTOP_FOREGROUNDTASK : 0 ); ImplFocusToTop( 0, FALSE ); } @@ -9733,6 +9752,8 @@ void Window::ImplPaintToDevice( OutputDevice* i_pTargetOutDev, const Point& i_rP EnableOutput(); DBG_ASSERT( GetMapMode().GetMapUnit() == MAP_PIXEL, "MapMode must be PIXEL based" ); + if ( GetMapMode().GetMapUnit() != MAP_PIXEL ) + return; // preserve graphicsstate Push(); diff --git a/vcl/source/window/wrkwin.cxx b/vcl/source/window/wrkwin.cxx index 0c19c5c5ee4f..c1f80bb061e5 100644 --- a/vcl/source/window/wrkwin.cxx +++ b/vcl/source/window/wrkwin.cxx @@ -310,7 +310,7 @@ void WorkWindow::Maximize( BOOL bMaximize ) ImplSetFrameState( bMaximize ? SAL_FRAMESTATE_MAXIMIZED : SAL_FRAMESTATE_NORMAL ); } -BOOL WorkWindow::IsMaximized() +BOOL WorkWindow::IsMaximized() const { BOOL bRet = FALSE; diff --git a/vcl/unx/gtk/a11y/atklistener.cxx b/vcl/unx/gtk/a11y/atklistener.cxx index c3b2859f7c3f..f083e7cc584e 100644 --- a/vcl/unx/gtk/a11y/atklistener.cxx +++ b/vcl/unx/gtk/a11y/atklistener.cxx @@ -360,6 +360,32 @@ void AtkListener::notifyEvent( const accessibility::AccessibleEventObject& aEven break; } + // --> OD 2009-05-26 #i92103# + case accessibility::AccessibleEventId::LISTBOX_ENTRY_EXPANDED: + { + AtkObject *pChild = getObjFromAny( aEvent.NewValue ); + if( pChild ) + { + AtkStateType eExpandedState = ATK_STATE_EXPANDED; + atk_object_notify_state_change( pChild, eExpandedState, true ); + g_object_unref( pChild ); + } + break; + } + + case accessibility::AccessibleEventId::LISTBOX_ENTRY_COLLAPSED: + { + AtkObject *pChild = getObjFromAny( aEvent.NewValue ); + if( pChild ) + { + AtkStateType eExpandedState = ATK_STATE_EXPANDED; + atk_object_notify_state_change( pChild, eExpandedState, false ); + g_object_unref( pChild ); + } + break; + } + // <-- + // AtkAction signals ... case accessibility::AccessibleEventId::ACTION_CHANGED: g_signal_emit_by_name( G_OBJECT( atk_obj ), "property_change::accessible-actions"); diff --git a/vcl/unx/gtk/a11y/atktext.cxx b/vcl/unx/gtk/a11y/atktext.cxx index 1c839ed58839..0a97e5ba1ca6 100644 --- a/vcl/unx/gtk/a11y/atktext.cxx +++ b/vcl/unx/gtk/a11y/atktext.cxx @@ -33,12 +33,15 @@ #include "atkwrapper.hxx" #include "atktextattributes.hxx" +#include #include #include #include #include #include +#include +#include // #define ENABLE_TRACING @@ -175,6 +178,35 @@ static accessibility::XAccessibleText* /*****************************************************************************/ +static accessibility::XAccessibleTextMarkup* + getTextMarkup( AtkText *pText ) throw (uno::RuntimeException) +{ + AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pText ); + if( pWrap ) + { + if( !pWrap->mpTextMarkup && pWrap->mpContext ) + { + uno::Any any = pWrap->mpContext->queryInterface( accessibility::XAccessibleTextMarkup::static_type(NULL) ); + /* Since this not a dedicated interface in Atk and thus has not + * been queried during wrapper initialization, we need to check + * the return value here. + */ + if( typelib_TypeClass_INTERFACE == any.pType->eTypeClass ) + { + pWrap->mpTextMarkup = reinterpret_cast< accessibility::XAccessibleTextMarkup * > (any.pReserved); + if( pWrap->mpTextMarkup ) + pWrap->mpTextMarkup->acquire(); + } + } + + return pWrap->mpTextMarkup; + } + + return NULL; +} + +/*****************************************************************************/ + static accessibility::XAccessibleTextAttributes* getTextAttributes( AtkText *pText ) throw (uno::RuntimeException) { @@ -434,6 +466,8 @@ text_wrapper_get_run_attributes( AtkText *text, AtkAttributeSet *pSet = NULL; try { + bool bOffsetsAreValid = false; + accessibility::XAccessibleText* pText = getText( text ); accessibility::XAccessibleTextAttributes* pTextAttributes = getTextAttributes( text ); if( pText && pTextAttributes ) @@ -442,17 +476,61 @@ text_wrapper_get_run_attributes( AtkText *text, pTextAttributes->getRunAttributes( offset, uno::Sequence< rtl::OUString > () ); pSet = attribute_set_new_from_property_values( aAttributeList, true, text ); - if( pSet ) + // --> OD 2009-06-22 #i100938# + // - always provide start_offset and end_offset +// if( pSet ) + // <-- { accessibility::TextSegment aTextSegment = pText->getTextAtIndex(offset, accessibility::AccessibleTextType::ATTRIBUTE_RUN); *start_offset = aTextSegment.SegmentStart; - *end_offset = aTextSegment.SegmentEnd + 1; // FIXME: TESTME + // --> OD 2009-06-22 #i100938# + // Do _not_ increment the end_offset provide by instance +// *end_offset = aTextSegment.SegmentEnd + 1; // FIXME: TESTME + *end_offset = aTextSegment.SegmentEnd; + // <-- + bOffsetsAreValid = true; + } + } + + // Special handling for missspelled + accessibility::XAccessibleTextMarkup* pTextMarkup = getTextMarkup( text ); + if( pTextMarkup ) + { + uno::Sequence< accessibility::TextSegment > aTextSegmentSeq = + pTextMarkup->getTextMarkupAtIndex( offset, com::sun::star::text::TextMarkupType::SPELLCHECK ); + if( aTextSegmentSeq.getLength() > 0 ) + { + accessibility::TextSegment aTextSegment = aTextSegmentSeq[0]; + gint nStartOffsetMisspelled = aTextSegment.SegmentStart; + gint nEndOffsetMisspelled = aTextSegment.SegmentEnd; + + // Get attribute run here if it hasn't been done before + if( !bOffsetsAreValid ) + { + accessibility::TextSegment aAttributeTextSegment = + pText->getTextAtIndex(offset, accessibility::AccessibleTextType::ATTRIBUTE_RUN); + *start_offset = aAttributeTextSegment.SegmentStart; + *end_offset = aAttributeTextSegment.SegmentEnd; + } + + if( nEndOffsetMisspelled <= offset ) + *start_offset = ::std::max( *start_offset, nEndOffsetMisspelled ); + else if( nStartOffsetMisspelled <= offset ) + *start_offset = ::std::max( *start_offset, nStartOffsetMisspelled ); + + if( nStartOffsetMisspelled > offset ) + *end_offset = ::std::min( *end_offset, nStartOffsetMisspelled ); + else if( nEndOffsetMisspelled > offset ) + *end_offset = ::std::min( *end_offset, nEndOffsetMisspelled ); + + if( nStartOffsetMisspelled <= offset && nEndOffsetMisspelled > offset ) + pSet = attribute_set_prepend_misspelled( pSet ); } } } - catch(const uno::Exception& e) { + catch(const uno::Exception& e){ g_warning( "Exception in get_run_attributes()" ); diff --git a/vcl/unx/gtk/a11y/atktextattributes.cxx b/vcl/unx/gtk/a11y/atktextattributes.cxx index f6b1eccc882a..58dd5f200bbd 100644 --- a/vcl/unx/gtk/a11y/atktextattributes.cxx +++ b/vcl/unx/gtk/a11y/atktextattributes.cxx @@ -76,6 +76,7 @@ static AtkTextAttribute atk_text_attribute_tab_interval = ATK_TEXT_ATTR_INVALID; static AtkTextAttribute atk_text_attribute_tab_stops = ATK_TEXT_ATTR_INVALID; static AtkTextAttribute atk_text_attribute_writing_mode = ATK_TEXT_ATTR_INVALID; static AtkTextAttribute atk_text_attribute_vertical_align = ATK_TEXT_ATTR_INVALID; +static AtkTextAttribute atk_text_attribute_misspelled = ATK_TEXT_ATTR_INVALID; /*****************************************************************************/ @@ -1299,6 +1300,18 @@ attribute_set_new_from_property_values( } +AtkAttributeSet* attribute_set_prepend_misspelled( AtkAttributeSet* attribute_set ) +{ + if( ATK_TEXT_ATTR_INVALID == atk_text_attribute_misspelled ) + atk_text_attribute_misspelled = atk_text_attribute_register( "text-spelling" ); + + attribute_set = attribute_set_prepend( attribute_set, atk_text_attribute_misspelled, + g_strdup_printf( "misspelled" ) ); + + return attribute_set; +} + + /*****************************************************************************/ struct AtkTextAttrMapping diff --git a/vcl/unx/gtk/a11y/atktextattributes.hxx b/vcl/unx/gtk/a11y/atktextattributes.hxx index 909f09eb1522..ca67fd946a20 100644 --- a/vcl/unx/gtk/a11y/atktextattributes.hxx +++ b/vcl/unx/gtk/a11y/atktextattributes.hxx @@ -47,5 +47,6 @@ attribute_set_map_to_property_values( AtkAttributeSet* attribute_set, com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >& rValueList ); +AtkAttributeSet* attribute_set_prepend_misspelled( AtkAttributeSet* attribute_set ); #endif diff --git a/vcl/unx/gtk/a11y/atkutil.cxx b/vcl/unx/gtk/a11y/atkutil.cxx index 91f4b3280448..c92a69d3fb49 100644 --- a/vcl/unx/gtk/a11y/atkutil.cxx +++ b/vcl/unx/gtk/a11y/atkutil.cxx @@ -36,6 +36,9 @@ #include #include #include +// --> OD 2009-04-14 #i93269# +#include +// <-- #include #include #include @@ -86,6 +89,34 @@ atk_wrapper_focus_idle_handler (gpointer data) fprintf(stderr, "notifying focus event for %p\n", atk_obj); #endif atk_focus_tracker_notify(atk_obj); + // --> OD 2009-04-14 #i93269# + // emit text_caret_moved event for object, + // if cursor is inside the object. + // also emit state-changed:focused event under the same condition. + { + AtkObjectWrapper* wrapper_obj = ATK_OBJECT_WRAPPER (atk_obj); + if( !wrapper_obj->mpText && wrapper_obj->mpContext ) + { + uno::Any any = wrapper_obj->mpContext->queryInterface( accessibility::XAccessibleText::static_type(NULL) ); + if ( typelib_TypeClass_INTERFACE == any.pType->eTypeClass && + any.pReserved != 0 ) + { + wrapper_obj->mpText = reinterpret_cast< accessibility::XAccessibleText * > (any.pReserved); + if ( wrapper_obj->mpText != 0 ) + { + wrapper_obj->mpText->acquire(); + gint caretPos = wrapper_obj->mpText->getCaretPosition(); + + if ( caretPos != -1 ) + { + atk_object_notify_state_change( atk_obj, ATK_STATE_FOCUSED, TRUE ); + g_signal_emit_by_name( atk_obj, "text_caret_moved", caretPos ); + } + } + } + } + } + // <-- g_object_unref(atk_obj); } } @@ -190,7 +221,7 @@ void DocumentFocusListener::notifyEvent( const accessibility::AccessibleEventObj if( accessibility::AccessibleStateType::FOCUSED == nState ) atk_wrapper_focus_tracker_notify_when_idle( getAccessible(aEvent) ); } - catch(lang::IndexOutOfBoundsException e) + catch(const lang::IndexOutOfBoundsException &e) { g_warning("Focused object has invalid index in parent"); } @@ -546,7 +577,14 @@ static void handle_get_focus(::VclWindowEvent const * pEvent) if( g_aWindowList.find(pWindow) == g_aWindowList.end() ) { g_aWindowList.insert(pWindow); - aDocumentFocusListener->attachRecursive(xAccessible, xContext, xStateSet); + try + { + aDocumentFocusListener->attachRecursive(xAccessible, xContext, xStateSet); + } + catch( const uno::Exception &e ) + { + g_warning( "Exception caught processing focus events" ); + } } #ifdef ENABLE_TRACING else @@ -577,7 +615,7 @@ static void handle_menu_highlighted(::VclMenuEvent const * pEvent) } } } - catch( uno::Exception e ) + catch( const uno::Exception& e ) { g_warning( "Exception caught processing menu highlight events" ); } diff --git a/vcl/unx/gtk/a11y/atkwrapper.cxx b/vcl/unx/gtk/a11y/atkwrapper.cxx index 927b8548a77a..8854083e1509 100644 --- a/vcl/unx/gtk/a11y/atkwrapper.cxx +++ b/vcl/unx/gtk/a11y/atkwrapper.cxx @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -893,6 +894,7 @@ void atk_object_wrapper_dispose(AtkObjectWrapper* wrapper) RELEASE( wrapper->mpMultiLineText ) RELEASE( wrapper->mpTable ) RELEASE( wrapper->mpText ) + RELEASE( wrapper->mpTextMarkup ) RELEASE( wrapper->mpTextAttributes ) RELEASE( wrapper->mpValue ) } diff --git a/vcl/unx/gtk/a11y/atkwrapper.hxx b/vcl/unx/gtk/a11y/atkwrapper.hxx index 1003d0d25cc7..95cf30096e7b 100644 --- a/vcl/unx/gtk/a11y/atkwrapper.hxx +++ b/vcl/unx/gtk/a11y/atkwrapper.hxx @@ -49,6 +49,7 @@ namespace com { namespace sun { namespace star { namespace accessibility { class XAccessibleSelection; class XAccessibleTable; class XAccessibleText; + class XAccessibleTextMarkup; class XAccessibleTextAttributes; class XAccessibleValue; } } } } @@ -69,6 +70,7 @@ struct _AtkObjectWrapper ::com::sun::star::accessibility::XAccessibleSelection *mpSelection; ::com::sun::star::accessibility::XAccessibleTable *mpTable; ::com::sun::star::accessibility::XAccessibleText *mpText; + ::com::sun::star::accessibility::XAccessibleTextMarkup *mpTextMarkup; ::com::sun::star::accessibility::XAccessibleTextAttributes *mpTextAttributes; ::com::sun::star::accessibility::XAccessibleValue *mpValue; diff --git a/vcl/unx/gtk/app/gtkdata.cxx b/vcl/unx/gtk/app/gtkdata.cxx index bb08477e82e9..b55798608b37 100644 --- a/vcl/unx/gtk/app/gtkdata.cxx +++ b/vcl/unx/gtk/app/gtkdata.cxx @@ -138,8 +138,6 @@ GdkFilterReturn GtkSalDisplay::filterGdkEvent( GdkXEvent* sys_event, GdkEvent*, gpointer data ) { - GTK_YIELD_GRAB(); - GdkFilterReturn aFilterReturn = GDK_FILTER_CONTINUE; XEvent *pEvent = (XEvent *)sys_event; @@ -150,6 +148,8 @@ GdkFilterReturn GtkSalDisplay::filterGdkEvent( GdkXEvent* sys_event, CallEventCallback( pEvent, sizeof( XEvent ) ) ) aFilterReturn = GDK_FILTER_REMOVE; + GTK_YIELD_GRAB(); + if (pDisplay->GetDisplay() == pEvent->xany.display ) { // #i53471# gtk has no callback mechanism that lets us be notified diff --git a/vcl/unx/gtk/app/gtkinst.cxx b/vcl/unx/gtk/app/gtkinst.cxx index 73b4432342bf..af3a1df97a8c 100644 --- a/vcl/unx/gtk/app/gtkinst.cxx +++ b/vcl/unx/gtk/app/gtkinst.cxx @@ -134,6 +134,16 @@ extern "C" VCL_DLLPUBLIC SalInstance* create_SalInstance( oslModule pModule ) { + /* #i92121# workaround deadlocks in the X11 implementation + */ + static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" ); + /* #i90094# + from now on we know that an X connection will be + established, so protect X against itself + */ + if( ! ( pNoXInitThreads && *pNoXInitThreads ) ) + XInitThreads(); + #if OSL_DEBUG_LEVEL > 1 int nFd = open( "/home/pl93762/log.txt", O_CREAT | O_TRUNC | O_WRONLY, 0755 ); dup2( nFd, STDERR_FILENO ); @@ -206,6 +216,34 @@ SalObject* GtkInstance::CreateObject( SalFrame* pParent, SystemWindowData* pWind return new GtkSalObject( static_cast(pParent), bShow ); } +extern "C" +{ + typedef void*(* getDefaultFnc)(); + typedef void(* addItemFnc)(void *, const char *); +} + +void GtkInstance::AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType) +{ +#if GTK_CHECK_VERSION(2,10,0) + GtkRecentManager *manager = gtk_recent_manager_get_default (); + gtk_recent_manager_add_item (manager, rtl::OUStringToOString(rFileUrl, RTL_TEXTENCODING_UTF8).getStr()); + (void)rMimeType; +#else + static getDefaultFnc sym_gtk_recent_manager_get_default = + (getDefaultFnc)osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "gtk_recent_manager_get_default" ); + + static addItemFnc sym_gtk_recent_manager_add_item = + (addItemFnc)osl_getAsciiFunctionSymbol( GetSalData()->m_pPlugin, "gtk_recent_manager_add_item"); + if (sym_gtk_recent_manager_get_default && sym_gtk_recent_manager_add_item) + { + sym_gtk_recent_manager_add_item(sym_gtk_recent_manager_get_default(), + rtl::OUStringToOString(rFileUrl, RTL_TEXTENCODING_UTF8).getStr()); + } + else + X11SalInstance::AddToRecentDocumentList(rFileUrl, rMimeType); +#endif +} + GtkYieldMutex::GtkYieldMutex() { } diff --git a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx index 9dbb218403d0..f922552ce923 100644 --- a/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx +++ b/vcl/unx/gtk/gdi/salnativewidgets-gtk.cxx @@ -454,6 +454,10 @@ void GtkData::deInitNWF( void ) gtk_widget_destroy( gWidgetData[i].gMenuWidget ); if( gWidgetData[i].gTooltipPopup ) gtk_widget_destroy( gWidgetData[i].gTooltipPopup ); + delete gWidgetData[i].gCacheTabPages; + gWidgetData[i].gCacheTabPages = NULL; + delete gWidgetData[i].gCacheTabItems; + gWidgetData[i].gCacheTabItems = NULL; delete gWidgetData[i].gNWPixmapCacheList; gWidgetData[i].gNWPixmapCacheList = NULL; } @@ -3287,12 +3291,38 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings ) aBackColor = getColor( pMenubarStyle->bg[GTK_STATE_NORMAL] ); aStyleSet.SetMenuBarColor( aBackColor ); aBackColor = getColor( pMenuStyle->bg[GTK_STATE_NORMAL] ); - aTextColor = getColor( pMenuTextStyle->fg[GTK_STATE_NORMAL] ); - if( aBackColor == aTextColor ) - aTextColor = (aBackColor.GetLuminance() < 128) ? Color( COL_WHITE ) : Color( COL_BLACK ); + aTextColor = getColor( pMenuTextStyle->text[GTK_STATE_NORMAL] ); aStyleSet.SetMenuColor( aBackColor ); aStyleSet.SetMenuTextColor( aTextColor ); + aTextColor = getColor( pMenubarStyle->text[GTK_STATE_NORMAL] ); + aStyleSet.SetMenuBarTextColor( aTextColor ); + +#if OSL_DEBUG_LEVEL > 1 + std::fprintf( stderr, "==\n" ); + std::fprintf( stderr, "MenuColor = %x (%d)\n", (int)aStyleSet.GetMenuColor().GetColor(), aStyleSet.GetMenuColor().GetLuminance() ); + std::fprintf( stderr, "MenuTextColor = %x (%d)\n", (int)aStyleSet.GetMenuTextColor().GetColor(), aStyleSet.GetMenuTextColor().GetLuminance() ); + std::fprintf( stderr, "MenuBarColor = %x (%d)\n", (int)aStyleSet.GetMenuBarColor().GetColor(), aStyleSet.GetMenuBarColor().GetLuminance() ); + std::fprintf( stderr, "MenuBarTextColor = %x (%d)\n", (int)aStyleSet.GetMenuBarTextColor().GetColor(), aStyleSet.GetMenuBarTextColor().GetLuminance() ); + std::fprintf( stderr, "LightColor = %x (%d)\n", (int)aStyleSet.GetLightColor().GetColor(), aStyleSet.GetLightColor().GetLuminance() ); + std::fprintf( stderr, "ShadowColor = %x (%d)\n", (int)aStyleSet.GetShadowColor().GetColor(), aStyleSet.GetShadowColor().GetLuminance() ); +#endif + + // Awful hack for menu separators in the Sonar and similar themes. + // If the menu color is not too dark, and the menu text color is lighter, + // make the "light" color lighter than the menu color and the "shadow" + // color darker than it. + if ( aStyleSet.GetMenuColor().GetLuminance() >= 32 && + aStyleSet.GetMenuColor().GetLuminance() <= aStyleSet.GetMenuTextColor().GetLuminance() ) + { + Color temp = aStyleSet.GetMenuColor(); + temp.IncreaseLuminance( 8 ); + aStyleSet.SetLightColor( temp ); + temp = aStyleSet.GetMenuColor(); + temp.DecreaseLuminance( 16 ); + aStyleSet.SetShadowColor( temp ); + } + aHighlightColor = getColor( pMenuItemStyle->bg[ GTK_STATE_SELECTED ] ); aHighlightTextColor = getColor( pMenuTextStyle->fg[ GTK_STATE_PRELIGHT ] ); if( aHighlightColor == aHighlightTextColor ) @@ -3435,13 +3465,6 @@ void GtkSalGraphics::updateSettings( AllSettings& rSettings ) // FIXME: need some way of fetching toolbar icon size. // aStyleSet.SetToolbarIconSize( STYLE_TOOLBAR_ICONSIZE_SMALL ); - /* #i35482# do not override HC mode per force - // #i59364# high contrast mode - bool bHC = ( aStyleSet.GetFaceColor().IsDark() || - aStyleSet.GetWindowColor().IsDark() ); - aStyleSet.SetHighContrastMode( bHC ); - */ - // finally update the collected settings rSettings.SetStyleSettings( aStyleSet ); diff --git a/vcl/unx/gtk/window/gtkframe.cxx b/vcl/unx/gtk/window/gtkframe.cxx index 57f48df66c3c..92ff2d3b8d8e 100644 --- a/vcl/unx/gtk/window/gtkframe.cxx +++ b/vcl/unx/gtk/window/gtkframe.cxx @@ -70,9 +70,9 @@ #ifdef ENABLE_DBUS #include -#define GSS_DBUS_SERVICE "org.gnome.ScreenSaver" -#define GSS_DBUS_PATH "/org/gnome/ScreenSaver" -#define GSS_DBUS_INTERFACE "org.gnome.ScreenSaver" +#define GSM_DBUS_SERVICE "org.gnome.SessionManager" +#define GSM_DBUS_PATH "/org/gnome/SessionManager" +#define GSM_DBUS_INTERFACE "org.gnome.SessionManager" #endif // make compile on gtk older than 2.10 @@ -565,7 +565,7 @@ void GtkSalFrame::InitCommon() m_pIMHandler = NULL; m_hBackgroundPixmap = None; m_nSavedScreenSaverTimeout = 0; - m_nGSSCookie = 0; + m_nGSMCookie = 0; m_nExtStyle = 0; m_pRegion = NULL; m_ePointerStyle = 0xffff; @@ -772,7 +772,10 @@ void GtkSalFrame::Init( SalFrame* pParent, ULONG nStyle ) m_aForeignTopLevelWindow = None; m_nStyle = nStyle; - GtkWindowType eWinType = ((nStyle & SAL_FRAME_STYLE_FLOAT) && ! (nStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION)) + GtkWindowType eWinType = ( (nStyle & SAL_FRAME_STYLE_FLOAT) && + ! (nStyle & (SAL_FRAME_STYLE_OWNERDRAWDECORATION| + SAL_FRAME_STYLE_FLOAT_FOCUSABLE)) + ) ? GTK_WINDOW_POPUP : GTK_WINDOW_TOPLEVEL; if( nStyle & SAL_FRAME_STYLE_SYSTEMCHILD ) @@ -801,7 +804,7 @@ void GtkSalFrame::Init( SalFrame* pParent, ULONG nStyle ) bool bDecoHandling = ! isChild() && ( ! (nStyle & SAL_FRAME_STYLE_FLOAT) || - (nStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION) ); + (nStyle & (SAL_FRAME_STYLE_OWNERDRAWDECORATION|SAL_FRAME_STYLE_FLOAT_FOCUSABLE) ) ); /* #i100116# metacity has a peculiar behavior regarding WM_HINT accept focus and _NET_WM_USER_TIME at some point that may be fixed in metacity and we will have to revisit this @@ -832,9 +835,14 @@ void GtkSalFrame::Init( SalFrame* pParent, ULONG nStyle ) lcl_set_accept_focus( GTK_WINDOW(m_pWindow), FALSE, true ); bNoDecor = true; } + else if( (nStyle & SAL_FRAME_STYLE_FLOAT_FOCUSABLE) ) + { + eType = GDK_WINDOW_TYPE_HINT_UTILITY; + } + if( (nStyle & SAL_FRAME_STYLE_PARTIAL_FULLSCREEN ) ) { - eType = GDK_WINDOW_TYPE_HINT_DOCK; + eType = GDK_WINDOW_TYPE_HINT_TOOLBAR; gtk_window_set_keep_above( GTK_WINDOW(m_pWindow), true ); } @@ -869,7 +877,7 @@ void GtkSalFrame::Init( SalFrame* pParent, ULONG nStyle ) if( bDecoHandling ) { gtk_window_set_resizable( GTK_WINDOW(m_pWindow), (nStyle & SAL_FRAME_STYLE_SIZEABLE) ? TRUE : FALSE ); - if( ( (nStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION) ) || bMetaCityToolWindowHack ) + if( ( (nStyle & (SAL_FRAME_STYLE_OWNERDRAWDECORATION)) ) || bMetaCityToolWindowHack ) lcl_set_accept_focus( GTK_WINDOW(m_pWindow), FALSE, false ); } @@ -1123,7 +1131,7 @@ void GtkSalFrame::SetIcon( USHORT nIcon ) USHORT nIndex; // Use high contrast icons where appropriate - if( Application::GetSettings().GetStyleSettings().GetFaceColor().IsDark() ) + if( Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) { nOffsets[0] = SV_ICON_LARGE_HC_START; nOffsets[1] = SV_ICON_SMALL_HC_START; @@ -1506,7 +1514,7 @@ void GtkSalFrame::SetPosSize( long nX, long nY, long nWidth, long nHeight, USHOR if( isChild( false, true ) ) gtk_widget_set_size_request( m_pWindow, nWidth, nHeight ); - else + else if( ! ( m_nState & GDK_WINDOW_STATE_MAXIMIZED ) ) gtk_window_resize( GTK_WINDOW(m_pWindow), nWidth, nHeight ); setMinMaxSize(); } @@ -1608,6 +1616,7 @@ void GtkSalFrame::SetWindowState( const SalFrameState* pState ) SAL_FRAMESTATE_MASK_MAXIMIZED_WIDTH | SAL_FRAMESTATE_MASK_MAXIMIZED_HEIGHT; if( (pState->mnMask & SAL_FRAMESTATE_MASK_STATE) && + ! ( m_nState & GDK_WINDOW_STATE_MAXIMIZED ) && (pState->mnState & SAL_FRAMESTATE_MAXIMIZED) && (pState->mnMask & nMaxGeometryMask) == nMaxGeometryMask ) { @@ -1903,8 +1912,9 @@ void GtkSalFrame::setAutoLock( bool bLock ) #ifdef ENABLE_DBUS /** cookie is returned as an unsigned integer */ static guint -dbus_inhibit_gss (const gchar *appname, - const gchar *reason) +dbus_inhibit_gsm (const gchar *appname, + const gchar *reason, + guint xid) { gboolean res; guint cookie; @@ -1920,20 +1930,22 @@ dbus_inhibit_gss (const gchar *appname, return -1; } - /* get the proxy with gnome-screensaver */ + /* get the proxy with gnome-session-manager */ proxy = dbus_g_proxy_new_for_name (session_connection, - GSS_DBUS_SERVICE, - GSS_DBUS_PATH, - GSS_DBUS_INTERFACE); + GSM_DBUS_SERVICE, + GSM_DBUS_PATH, + GSM_DBUS_INTERFACE); if (proxy == NULL) { - g_warning ("Could not get DBUS proxy: %s", GSS_DBUS_SERVICE); + g_warning ("Could not get DBUS proxy: %s", GSM_DBUS_SERVICE); return -1; } res = dbus_g_proxy_call (proxy, "Inhibit", &error, G_TYPE_STRING, appname, + G_TYPE_UINT, xid, G_TYPE_STRING, reason, + G_TYPE_UINT, 8, //Inhibit the session being marked as idle G_TYPE_INVALID, G_TYPE_UINT, &cookie, G_TYPE_INVALID); @@ -1956,15 +1968,14 @@ dbus_inhibit_gss (const gchar *appname, } static void -dbus_uninhibit_gss (guint cookie) +dbus_uninhibit_gsm (guint cookie) { gboolean res; GError *error = NULL; DBusGProxy *proxy = NULL; DBusGConnection *session_connection = NULL; - /* cookies have to be positive as unsigned */ - if (cookie < 0) { + if (cookie == guint(-1)) { g_warning ("Invalid cookie"); return; } @@ -1977,18 +1988,18 @@ dbus_uninhibit_gss (guint cookie) return; } - /* get the proxy with gnome-screensaver */ + /* get the proxy with gnome-session-manager */ proxy = dbus_g_proxy_new_for_name (session_connection, - GSS_DBUS_SERVICE, - GSS_DBUS_PATH, - GSS_DBUS_INTERFACE); + GSM_DBUS_SERVICE, + GSM_DBUS_PATH, + GSM_DBUS_INTERFACE); if (proxy == NULL) { - g_warning ("Could not get DBUS proxy: %s", GSS_DBUS_SERVICE); + g_warning ("Could not get DBUS proxy: %s", GSM_DBUS_SERVICE); return; } res = dbus_g_proxy_call (proxy, - "UnInhibit", + "Uninhibit", &error, G_TYPE_UINT, cookie, G_TYPE_INVALID, @@ -1996,12 +2007,12 @@ dbus_uninhibit_gss (guint cookie) /* check the return value */ if (! res) { - g_warning ("UnInhibit method failed"); + g_warning ("Uninhibit method failed"); } /* check the error value */ if (error != NULL) { - g_warning ("Inhibit problem : %s", error->message); + g_warning ("Uninhibit problem : %s", error->message); g_error_free (error); cookie = -1; } @@ -2029,7 +2040,8 @@ void GtkSalFrame::StartPresentation( BOOL bStart ) bPreferBlanking, bAllowExposures ); } #ifdef ENABLE_DBUS - m_nGSSCookie = dbus_inhibit_gss(g_get_application_name(), "presentation"); + m_nGSMCookie = dbus_inhibit_gsm(g_get_application_name(), "presentation", + GDK_WINDOW_XID(m_pWindow->window)); #endif } else @@ -2040,7 +2052,7 @@ void GtkSalFrame::StartPresentation( BOOL bStart ) bAllowExposures ); m_nSavedScreenSaverTimeout = 0; #ifdef ENABLE_DBUS - dbus_uninhibit_gss(m_nGSSCookie); + dbus_uninhibit_gsm(m_nGSMCookie); #endif } } @@ -2071,7 +2083,7 @@ void GtkSalFrame::ToTop( USHORT nFlags ) * to our window - which it of course won't since our input hint * is set to false. */ - if( (m_nStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION) ) + if( (m_nStyle & (SAL_FRAME_STYLE_OWNERDRAWDECORATION|SAL_FRAME_STYLE_FLOAT_FOCUSABLE)) ) XSetInputFocus( getDisplay()->GetDisplay(), GDK_WINDOW_XWINDOW( m_pWindow->window ), RevertToParent, CurrentTime ); } else @@ -2365,6 +2377,11 @@ void GtkSalFrame::createNewWindow( XLIB_Window aNewParent, bool bXEmbed, int nSc } } + // free xrender resources + for( unsigned int i = 0; i < sizeof(m_aGraphics)/sizeof(m_aGraphics[0]); i++ ) + if( m_aGraphics[i].bInUse ) + m_aGraphics[i].pGraphics->SetDrawable( None, m_nScreen ); + // first deinit frame if( m_pIMHandler ) { diff --git a/vcl/unx/headless/svpgdi.cxx b/vcl/unx/headless/svpgdi.cxx index cd3e286d167a..bd317c883b0b 100644 --- a/vcl/unx/headless/svpgdi.cxx +++ b/vcl/unx/headless/svpgdi.cxx @@ -429,7 +429,7 @@ void SvpSalGraphics::copyArea( long nDestX, { B2IRange aSrcRect( nSrcX, nSrcY, nSrcX+nSrcWidth, nSrcY+nSrcHeight ); B2IRange aDestRect( nDestX, nDestY, nDestX+nSrcWidth, nDestY+nSrcHeight ); - m_aDevice->drawBitmap( m_aDevice, aSrcRect, aDestRect, DrawMode_PAINT, m_aClipMap ); + m_aDevice->drawBitmap( m_aOrigDevice, aSrcRect, aDestRect, DrawMode_PAINT, m_aClipMap ); dbgOut( m_aDevice ); } @@ -444,7 +444,7 @@ void SvpSalGraphics::copyBits( const SalTwoRect* pPosAry, B2IRange aDestRect( pPosAry->mnDestX, pPosAry->mnDestY, pPosAry->mnDestX+pPosAry->mnDestWidth, pPosAry->mnDestY+pPosAry->mnDestHeight ); - m_aDevice->drawBitmap( pSrc->m_aDevice, aSrcRect, aDestRect, DrawMode_PAINT, m_aClipMap ); + m_aDevice->drawBitmap( pSrc->m_aOrigDevice, aSrcRect, aDestRect, DrawMode_PAINT, m_aClipMap ); dbgOut( m_aDevice ); } @@ -519,7 +519,7 @@ SalBitmap* SvpSalGraphics::getBitmap( long nX, long nY, long nWidth, long nHeigh m_aDevice ); B2IRange aSrcRect( nX, nY, nX+nWidth, nY+nHeight ); B2IRange aDestRect( 0, 0, nWidth, nHeight ); - aCopy->drawBitmap( m_aDevice, aSrcRect, aDestRect, DrawMode_PAINT ); + aCopy->drawBitmap( m_aOrigDevice, aSrcRect, aDestRect, DrawMode_PAINT ); SvpSalBitmap* pBitmap = new SvpSalBitmap(); pBitmap->setBitmap( aCopy ); diff --git a/vcl/unx/headless/svpinst.cxx b/vcl/unx/headless/svpinst.cxx index 87d0e4662f29..7b93e59b6acd 100644 --- a/vcl/unx/headless/svpinst.cxx +++ b/vcl/unx/headless/svpinst.cxx @@ -504,6 +504,10 @@ void SvpSalInstance::StartTimer( ULONG nMS ) } } +void SvpSalInstance::AddToRecentDocumentList(const rtl::OUString&, const rtl::OUString&) +{ +} + SvpSalTimer::~SvpSalTimer() { } diff --git a/vcl/unx/headless/svpinst.hxx b/vcl/unx/headless/svpinst.hxx index 71c463f071a9..e77debb53f1d 100644 --- a/vcl/unx/headless/svpinst.hxx +++ b/vcl/unx/headless/svpinst.hxx @@ -193,6 +193,8 @@ public: virtual SalSession* CreateSalSession(); virtual void* GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes ); + + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); }; #endif // _SV_SALINST_HXX diff --git a/vcl/unx/headless/svpprn.cxx b/vcl/unx/headless/svpprn.cxx index 862eb99ab18d..1882b50e6ad7 100644 --- a/vcl/unx/headless/svpprn.cxx +++ b/vcl/unx/headless/svpprn.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: svpprn.cxx,v $ - * $Revision: 1.4 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -28,6 +25,9 @@ * ************************************************************************/ +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + #include "vcl/svapp.hxx" #include "vcl/jobset.h" #include "vcl/print.h" @@ -73,37 +73,6 @@ inline int PtTo10Mu( int nPoints ) { return (int)((((double)nPoints)*35.27777778 inline int TenMuToPt( int nUnits ) { return (int)((((double)nUnits)/35.27777778)+0.5); } -static struct -{ - int width; - int height; - const char* name; - int namelength; - Paper paper; -} aPaperTab[] = -{ - { 29700, 42000, "A3", 2, PAPER_A3 }, - { 21000, 29700, "A4", 2, PAPER_A4 }, - { 14800, 21000, "A5", 2, PAPER_A5 }, - { 25000, 35300, "B4", 2, PAPER_B4 }, - { 17600, 25000, "B5", 2, PAPER_B5 }, - { 21600, 27900, "Letter", 6, PAPER_LETTER }, - { 21600, 35600, "Legal", 5, PAPER_LEGAL }, - { 27900, 43100, "Tabloid", 7, PAPER_TABLOID }, - { 0, 0, "USER", 4, PAPER_USER } -}; - -static Paper getPaperType( const String& rPaperName ) -{ - ByteString aPaper( rPaperName, RTL_TEXTENCODING_ISO_8859_1 ); - for( unsigned int i = 0; i < sizeof( aPaperTab )/sizeof( aPaperTab[0] ); i++ ) - { - if( ! strcmp( aPaper.GetBuffer(), aPaperTab[i].name ) ) - return aPaperTab[i].paper; - } - return PAPER_USER; -} - static void copyJobDataToJobSetup( ImplJobSetup* pJobSetup, JobData& rData ) { pJobSetup->meOrientation = (Orientation)(rData.m_eOrientation == orientation::Landscape ? ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT); @@ -113,7 +82,7 @@ static void copyJobDataToJobSetup( ImplJobSetup* pJobSetup, JobData& rData ) int width, height; rData.m_aContext.getPageSize( aPaper, width, height ); - pJobSetup->mePaperFormat = getPaperType( aPaper ); + pJobSetup->mePaperFormat = PaperInfo::fromPSName(OUStringToOString( aPaper, RTL_TEXTENCODING_ISO_8859_1 )); pJobSetup->mnPaperWidth = 0; pJobSetup->mnPaperHeight = 0; if( pJobSetup->mePaperFormat == PAPER_USER ) @@ -475,14 +444,9 @@ void PspSalInfoPrinter::InitPaperFormats( const ImplJobSetup* ) for( int i = 0; i < nValues; i++ ) { const PPDValue* pValue = pKey->getValue( i ); - vcl::PaperInfo aInfo; - aInfo.m_aPaperName = pValue->m_aOptionTranslation; - if( ! aInfo.m_aPaperName.Len() ) - aInfo.m_aPaperName = pValue->m_aOption; int nWidth = 0, nHeight = 0; m_aJobData.m_pParser->getPaperDimension( pValue->m_aOption, nWidth, nHeight ); - aInfo.m_nPaperWidth = (unsigned long)((PtTo10Mu( nWidth )+50)/100); - aInfo.m_nPaperHeight = (unsigned long)((PtTo10Mu( nHeight )+50)/100); + PaperInfo aInfo(PtTo10Mu( nWidth ), PtTo10Mu( nHeight )); m_aPaperFormats.push_back( aInfo ); } } @@ -628,7 +592,7 @@ BOOL PspSalInfoPrinter::SetData( TenMuToPt( pJobSetup->mnPaperWidth ), TenMuToPt( pJobSetup->mnPaperHeight ) ); else - aPaper = String( ByteString( aPaperTab[ pJobSetup->mePaperFormat ].name ), RTL_TEXTENCODING_ISO_8859_1 ); + aPaper = rtl::OStringToOUString(PaperInfo::toPSName(pJobSetup->mePaperFormat), RTL_TEXTENCODING_ISO_8859_1); pKey = aData.m_pParser->getKey( String( RTL_CONSTASCII_USTRINGPARAM( "PageSize" ) ) ); pValue = pKey ? pKey->getValue( aPaper ) : NULL; diff --git a/vcl/unx/headless/svppspgraphics.cxx b/vcl/unx/headless/svppspgraphics.cxx index eb342a130d85..1311aaed4ee4 100644 --- a/vcl/unx/headless/svppspgraphics.cxx +++ b/vcl/unx/headless/svppspgraphics.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: svppspgraphics.cxx,v $ - * $Revision: 1.9 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -28,6 +25,9 @@ * ************************************************************************/ +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + #include "svppspgraphics.hxx" #include "svpbmp.hxx" @@ -39,6 +39,7 @@ #include "vcl/glyphcache.hxx" #include "vcl/impfont.hxx" #include "vcl/outfont.hxx" +#include "vcl/fontsubset.hxx" #include "vcl/svapp.hxx" #include "vcl/salprn.hxx" #include "vcl/sysdata.hxx" @@ -685,16 +686,13 @@ void PspGraphics::DrawServerFontLayout( const ServerFontLayout& rLayout ) ImplFontCharMap* PspGraphics::GetImplFontCharMap() const { // TODO: get ImplFontCharMap directly from fonts - int nPairCount = 0; - if( m_pServerFont[0] ) - nPairCount = m_pServerFont[0]->GetFontCodeRanges( NULL ); - if( !nPairCount ) + if( !m_pServerFont[0] ) return NULL; - sal_uInt32* pCodePairs = new sal_uInt32[ 2 * nPairCount ]; - if( m_pServerFont[0] ) - m_pServerFont[0]->GetFontCodeRanges( pCodePairs ); - return new ImplFontCharMap( nPairCount, pCodePairs ); + CmapResult aCmapResult; + if( !m_pServerFont[0]->GetFontCodeRanges( aCmapResult ) ) + return NULL; + return new ImplFontCharMap( aCmapResult ); } USHORT PspGraphics::SetFont( ImplFontSelectData *pEntry, int nFallbackLevel ) @@ -906,7 +904,7 @@ BOOL PspGraphics::CreateFontSubset( sal_Int32* pGlyphIDs, sal_uInt8* pEncoding, sal_Int32* pWidths, - int nGlyphs, + int nGlyphCount, FontSubsetInfo& rInfo ) { @@ -916,7 +914,16 @@ BOOL PspGraphics::CreateFontSubset( // which this method was created). The correct way would // be to have the GlyphCache search for the ImplFontData pFont psp::fontID aFont = pFont->GetFontId(); - return PspGraphics::DoCreateFontSubset( rToFile, aFont, pGlyphIDs, pEncoding, pWidths, nGlyphs, rInfo ); + + psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); + bool bSuccess = rMgr.createFontSubset( rInfo, + aFont, + rToFile, + pGlyphIDs, + pEncoding, + pWidths, + nGlyphCount ); + return bSuccess; } //-------------------------------------------------------------------------- @@ -970,50 +977,6 @@ void PspGraphics::GetGlyphWidths( const ImplFontData* pFont, // static helpers of PspGraphics -bool PspGraphics::DoCreateFontSubset( const rtl::OUString& rToFile, - psp::fontID aFont, - sal_Int32* pGlyphIDs, - sal_uInt8* pEncoding, - sal_Int32* pWidths, - int nGlyphs, - FontSubsetInfo& rInfo ) -{ - psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); - psp::PrintFontInfo aFontInfo; - - if( ! rMgr.getFontInfo( aFont, aFontInfo ) ) - return false; - - // fill in font info - switch( aFontInfo.m_eType ) - { - case psp::fonttype::TrueType: rInfo.m_nFontType = SAL_FONTSUBSETINFO_TYPE_TRUETYPE;break; - case psp::fonttype::Type1: rInfo.m_nFontType = SAL_FONTSUBSETINFO_TYPE_TYPE1;break; - default: - return false; - } - rInfo.m_nAscent = aFontInfo.m_nAscend; - rInfo.m_nDescent = aFontInfo.m_nDescend; - rInfo.m_aPSName = rMgr.getPSName( aFont ); - - int xMin, yMin, xMax, yMax; - rMgr.getFontBoundingBox( aFont, xMin, yMin, xMax, yMax ); - - if( ! rMgr.createFontSubset( aFont, - rToFile, - pGlyphIDs, - pEncoding, - pWidths, - nGlyphs - ) ) - return false; - - rInfo.m_aFontBBox = Rectangle( Point( xMin, yMin ), Size( xMax-xMin, yMax-yMin ) ); - rInfo.m_nCapHeight = yMax; // Well ... - - return true; -} - const void* PspGraphics::DoGetEmbedFontData( fontID aFont, const sal_Ucs* pUnicodes, sal_Int32* pWidths, FontSubsetInfo& rInfo, long* pDataLen ) { psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); @@ -1023,13 +986,6 @@ const void* PspGraphics::DoGetEmbedFontData( fontID aFont, const sal_Ucs* pUnico return NULL; // fill in font info - switch( aFontInfo.m_eType ) - { - case psp::fonttype::TrueType: rInfo.m_nFontType = SAL_FONTSUBSETINFO_TYPE_TRUETYPE;break; - case psp::fonttype::Type1: rInfo.m_nFontType = SAL_FONTSUBSETINFO_TYPE_TYPE1;break; - default: - return NULL; - } rInfo.m_nAscent = aFontInfo.m_nAscend; rInfo.m_nDescent = aFontInfo.m_nDescend; rInfo.m_aPSName = rMgr.getPSName( aFont ); @@ -1066,9 +1022,22 @@ const void* PspGraphics::DoGetEmbedFontData( fontID aFont, const sal_Ucs* pUnico rInfo.m_nCapHeight = yMax; // Well ... for( int i = 0; i < 256; i++ ) - pWidths[i] = (aMetrics[i].width > 0 ? aMetrics[i].width : 0); + switch( aFontInfo.m_eType ) + { + case psp::fonttype::TrueType: + rInfo.m_nFontType = FontSubsetInfo::SFNT_TTF; + break; + case psp::fonttype::Type1: { + const bool bPFA = ((*(unsigned char*)pFile) < 0x80); + rInfo.m_nFontType = bPFA ? FontSubsetInfo::TYPE1_PFA : FontSubsetInfo::TYPE1_PFB; + } + break; + default: + return NULL; + } + return pFile; } diff --git a/vcl/unx/headless/svppspgraphics.hxx b/vcl/unx/headless/svppspgraphics.hxx index 81e4a29b8d55..7e5ff051f27b 100644 --- a/vcl/unx/headless/svppspgraphics.hxx +++ b/vcl/unx/headless/svppspgraphics.hxx @@ -72,13 +72,6 @@ public: virtual ~PspGraphics(); // helper methods for sharing with X11SalGraphics - static bool DoCreateFontSubset( const rtl::OUString& rToFile, - psp::fontID aFont, - sal_Int32* pGlyphIDs, - sal_uInt8* pEncoding, - sal_Int32* pWidths, - int nGlyphs, - FontSubsetInfo& rInfo ); static const void* DoGetEmbedFontData( psp::fontID aFont, const sal_Ucs* pUnicodes, sal_Int32* pWidths, FontSubsetInfo& rInfo, long* pDataLen ); static void DoFreeEmbedFontData( const void* pData, long nLen ); static const Ucs2SIntMap* DoGetFontEncodingVector( psp::fontID aFont, const Ucs2OStrMap** pNonEncoded ); diff --git a/vcl/unx/headless/svptext.cxx b/vcl/unx/headless/svptext.cxx index dc96aaaa8160..eac9e46c2348 100644 --- a/vcl/unx/headless/svptext.cxx +++ b/vcl/unx/headless/svptext.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: svptext.cxx,v $ - * $Revision: 1.4 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -274,20 +271,13 @@ ULONG SvpSalGraphics::GetKernPairs( ULONG nPairs, ImplKernPairData* pKernPairs ) ImplFontCharMap* SvpSalGraphics::GetImplFontCharMap() const { - ImplFontCharMap* pMap = NULL; + if( !m_pServerFont[0] ) + return NULL; - int nPairCount = 0; - if( m_pServerFont[0] ) - nPairCount = m_pServerFont[0]->GetFontCodeRanges( NULL ); - - if( nPairCount > 0 ) - { - sal_uInt32* pCodePairs = new sal_uInt32[ 2 * nPairCount ]; - m_pServerFont[0]->GetFontCodeRanges( pCodePairs ); - pMap = new ImplFontCharMap( nPairCount, pCodePairs ); - } - - return pMap; + CmapResult aCmapResult; + if( !m_pServerFont[0]->GetFontCodeRanges( aCmapResult ) ) + return NULL; + return new ImplFontCharMap( aCmapResult ); } // --------------------------------------------------------------------------- @@ -354,7 +344,7 @@ BOOL SvpSalGraphics::CreateFontSubset( sal_Int32* pGlyphIDs, sal_uInt8* pEncoding, sal_Int32* pWidths, - int nGlyphs, + int nGlyphCount, FontSubsetInfo& rInfo ) { @@ -364,7 +354,16 @@ BOOL SvpSalGraphics::CreateFontSubset( // which this method was created). The correct way would // be to have the GlyphCache search for the ImplFontData pFont psp::fontID aFont = pFont->GetFontId(); - return PspGraphics::DoCreateFontSubset( rToFile, aFont, pGlyphIDs, pEncoding, pWidths, nGlyphs, rInfo ); + + psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); + bool bSuccess = rMgr.createFontSubset( rInfo, + aFont, + rToFile, + pGlyphIDs, + pEncoding, + pWidths, + nGlyphCount ); + return bSuccess; } // --------------------------------------------------------------------------- diff --git a/vcl/unx/headless/svpvd.cxx b/vcl/unx/headless/svpvd.cxx index 2d7342093e47..6220af0b28b8 100644 --- a/vcl/unx/headless/svpvd.cxx +++ b/vcl/unx/headless/svpvd.cxx @@ -34,6 +34,8 @@ #include #include +#include "stdio.h" + using namespace basegfx; using namespace basebmp; @@ -65,9 +67,14 @@ BOOL SvpSalVirtualDevice::SetSize( long nNewDX, long nNewDY ) if( ! m_aDevice.get() || m_aDevice->getSize() != aDevSize ) { sal_uInt32 nFormat = SVP_DEFAULT_BITMAP_FORMAT; + std::vector< basebmp::Color > aDevPal; switch( m_nBitCount ) { - case 1: nFormat = Format::ONE_BIT_MSB_PAL; break; + case 1: nFormat = Format::ONE_BIT_MSB_PAL; + aDevPal.reserve(2); + aDevPal.push_back( basebmp::Color( 0, 0, 0 ) ); + aDevPal.push_back( basebmp::Color( 0xff, 0xff, 0xff ) ); + break; case 4: nFormat = Format::FOUR_BIT_MSB_PAL; break; case 8: nFormat = Format::EIGHT_BIT_PAL; break; #ifdef OSL_BIGENDIAN @@ -75,14 +82,19 @@ BOOL SvpSalVirtualDevice::SetSize( long nNewDX, long nNewDY ) #else case 16: nFormat = Format::SIXTEEN_BIT_LSB_TC_MASK; break; #endif + case 0: case 24: nFormat = Format::TWENTYFOUR_BIT_TC_MASK; break; case 32: nFormat = Format::THIRTYTWO_BIT_TC_MASK; break; } - m_aDevice = createBitmapDevice( aDevSize, false, nFormat ); + m_aDevice = aDevPal.empty() + ? createBitmapDevice( aDevSize, false, nFormat ) + : createBitmapDevice( aDevSize, false, nFormat, PaletteMemorySharedVector( new std::vector< basebmp::Color >(aDevPal) ) ); + // update device in existing graphics for( std::list< SvpSalGraphics* >::iterator it = m_aGraphics.begin(); it != m_aGraphics.end(); ++it ) (*it)->setDevice( m_aDevice ); + } return true; } diff --git a/vcl/unx/inc/kde_headers.h b/vcl/unx/inc/kde_headers.h deleted file mode 100644 index ccbffc99cb99..000000000000 --- a/vcl/unx/inc/kde_headers.h +++ /dev/null @@ -1,97 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * $RCSfile: kde_headers.h,v $ - * $Revision: 1.6 $ - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifndef INCLUDED_VCL_KDE_HEADERS_H -#define INCLUDED_VCL_KDE_HEADERS_H - -/* ********* Suppress warnings if needed */ -#include "sal/config.h" - -#if defined __GNUC__ -#pragma GCC system_header -#endif - - -/* ********* Hack, but needed because of conflicting types... */ -#define Region QtXRegion - - -/* ********* Qt headers */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* ********* See hack on top of this file */ -#undef Region - - -/* ********* KDE base headers */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -/* ********* KDE address book connectivity headers */ -#include -#include -#include -#include - - -#endif diff --git a/vcl/unx/inc/plugins/gtk/gtkframe.hxx b/vcl/unx/inc/plugins/gtk/gtkframe.hxx index 74394c71e4b2..c2a147517ac8 100644 --- a/vcl/unx/inc/plugins/gtk/gtkframe.hxx +++ b/vcl/unx/inc/plugins/gtk/gtkframe.hxx @@ -180,7 +180,7 @@ class GtkSalFrame : public SalFrame GdkVisibilityState m_nVisibility; PointerStyle m_ePointerStyle; int m_nSavedScreenSaverTimeout; - guint m_nGSSCookie; + guint m_nGSMCookie; int m_nWorkArea; bool m_bFullscreen; bool m_bSingleAltPress; @@ -242,9 +242,10 @@ class GtkSalFrame : public SalFrame bool isFloatGrabWindow() const { return - (m_nStyle & SAL_FRAME_STYLE_FLOAT) && // only a float can be floatgrab - !(m_nStyle & SAL_FRAME_STYLE_TOOLTIP) && // tool tips are not - !(m_nStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION); // toolbars are also not + (m_nStyle & SAL_FRAME_STYLE_FLOAT) && // only a float can be floatgrab + !(m_nStyle & SAL_FRAME_STYLE_TOOLTIP) && // tool tips are not + !(m_nStyle & SAL_FRAME_STYLE_OWNERDRAWDECORATION) && // toolbars are also not + !(m_nStyle & SAL_FRAME_STYLE_FLOAT_FOCUSABLE); // focusable floats are not } bool isChild( bool bPlug = true, bool bSysChild = true ) diff --git a/vcl/unx/inc/plugins/gtk/gtkinst.hxx b/vcl/unx/inc/plugins/gtk/gtkinst.hxx index 22c50f627e0c..16dce4688ede 100644 --- a/vcl/unx/inc/plugins/gtk/gtkinst.hxx +++ b/vcl/unx/inc/plugins/gtk/gtkinst.hxx @@ -91,6 +91,7 @@ public: virtual SalFrame* CreateChildFrame( SystemParentData* pParent, ULONG nStyle ); virtual SalObject* CreateObject( SalFrame* pParent, SystemWindowData* pWindowData, BOOL bShow = TRUE ); virtual SalSystem* CreateSalSystem(); + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); }; class GtkSalSystem : public X11SalSystem diff --git a/vcl/unx/inc/plugins/kde/kdedata.hxx b/vcl/unx/inc/plugins/kde/kdedata.hxx index 831621e38cc1..04730b39fad2 100644 --- a/vcl/unx/inc/plugins/kde/kdedata.hxx +++ b/vcl/unx/inc/plugins/kde/kdedata.hxx @@ -75,7 +75,7 @@ public: virtual SalGraphics* GetGraphics(); virtual void ReleaseGraphics( SalGraphics *pGraphics ); - virtual void updateGraphics(); + virtual void updateGraphics( bool bClear ); virtual void UpdateSettings( AllSettings& rSettings ); virtual void Show( BOOL bVisible, BOOL bNoActivate ); }; diff --git a/vcl/unx/inc/pspgraphics.h b/vcl/unx/inc/pspgraphics.h index 219cc5f0a8ff..0ccc13291714 100644 --- a/vcl/unx/inc/pspgraphics.h +++ b/vcl/unx/inc/pspgraphics.h @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: pspgraphics.h,v $ - * $Revision: 1.21 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -68,13 +65,6 @@ public: virtual ~PspGraphics(); // helper methods for sharing with X11SalGraphics - static bool DoCreateFontSubset( const rtl::OUString& rToFile, - psp::fontID aFont, - sal_Int32* pGlyphIDs, - sal_uInt8* pEncoding, - sal_Int32* pWidths, - int nGlyphs, - FontSubsetInfo& rInfo ); static const void* DoGetEmbedFontData( psp::fontID aFont, const sal_Ucs* pUnicodes, sal_Int32* pWidths, FontSubsetInfo& rInfo, long* pDataLen ); static void DoFreeEmbedFontData( const void* pData, long nLen ); static const Ucs2SIntMap* DoGetFontEncodingVector( psp::fontID aFont, const Ucs2OStrMap** pNonEncoded ); diff --git a/vcl/unx/inc/salframe.h b/vcl/unx/inc/salframe.h index 848f2250d31c..8dad0350a937 100644 --- a/vcl/unx/inc/salframe.h +++ b/vcl/unx/inc/salframe.h @@ -212,7 +212,9 @@ public: virtual SalGraphics* GetGraphics(); virtual void ReleaseGraphics( SalGraphics* pGraphics ); - virtual void updateGraphics(); + // call with true to clear graphics (setting None as drawable) + // call with false to setup graphics with window (GetWindow()) + virtual void updateGraphics( bool bClear ); virtual BOOL PostEvent( void* pData ); diff --git a/vcl/unx/inc/salgdi.h b/vcl/unx/inc/salgdi.h index 16276cdeb5c9..f893b547e847 100644 --- a/vcl/unx/inc/salgdi.h +++ b/vcl/unx/inc/salgdi.h @@ -106,6 +106,8 @@ protected: Pixel nTextPixel_; BOOL bFontVertical_; + BOOL bDisableGraphite_; + GC pBrushGC_; // Brush attributes SalColor nBrushColor_; Pixel nBrushPixel_; diff --git a/vcl/unx/inc/salinst.h b/vcl/unx/inc/salinst.h index c0614a78af9b..399326c44f27 100644 --- a/vcl/unx/inc/salinst.h +++ b/vcl/unx/inc/salinst.h @@ -116,6 +116,13 @@ public: virtual void* GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes ); void FillFontPathList( std::list< rtl::OString >& o_rFontPaths ); + // dtrans implementation + virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > + CreateClipboard( const com::sun::star::uno::Sequence< com::sun::star::uno::Any >& i_rArguments ); + virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > CreateDragSource(); + virtual com::sun::star::uno::Reference< com::sun::star::uno::XInterface > CreateDropTarget(); + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); + bool isPrinterInit() const { diff --git a/vcl/unx/inc/sm.hxx b/vcl/unx/inc/sm.hxx index 17bb40e2106a..09d2f5557e1d 100644 --- a/vcl/unx/inc/sm.hxx +++ b/vcl/unx/inc/sm.hxx @@ -69,7 +69,7 @@ public: static bool checkDocumentsSaved(); static bool queryInteraction(); static void saveDone(); - static void interactionDone(); + static void interactionDone( bool bCancelShutdown ); static String getExecName(); static VCL_DLLPUBLIC const ByteString& getSessionID(); diff --git a/vcl/unx/kde/kdedata.cxx b/vcl/unx/kde/kdedata.cxx index f29ef1d4ff96..9da57b6e790d 100644 --- a/vcl/unx/kde/kdedata.cxx +++ b/vcl/unx/kde/kdedata.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: kdedata.cxx,v $ - * $Revision: 1.21 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -32,7 +29,7 @@ #include "precompiled_vcl.hxx" #define _SV_SALDATA_CXX -#include "kde_headers.h" +#include #include #include @@ -235,6 +232,16 @@ void KDEData::Init() extern "C" { VCL_DLLPUBLIC SalInstance* create_SalInstance( oslModule ) { + /* #i92121# workaround deadlocks in the X11 implementation + */ + static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" ); + /* #i90094# + from now on we know that an X connection will be + established, so protect X against itself + */ + if( ! ( pNoXInitThreads && *pNoXInitThreads ) ) + XInitThreads(); + rtl::OString aVersion( qVersion() ); #if OSL_DEBUG_LEVEL > 1 fprintf( stderr, "qt version string is \"%s\"\n", aVersion.getStr() ); @@ -248,7 +255,7 @@ extern "C" { if( nMajor != 3 || nMinor < 2 || (nMinor == 2 && nMicro < 2) ) { #if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "unsuitable qt version %"SAL_PRIdINT32".%"SAL_PRIdINT32".%"SAL_PRIdINT32"\n", nMajor, nMinor, nMicro ); + fprintf( stderr, "unsuitable qt version %d.%d.%d\n", (int)nMajor, (int)nMinor, (int)nMicro ); #endif return NULL; } diff --git a/vcl/unx/kde/salnativewidgets-kde.cxx b/vcl/unx/kde/salnativewidgets-kde.cxx index 24358022d6a1..cd461fc36c8f 100644 --- a/vcl/unx/kde/salnativewidgets-kde.cxx +++ b/vcl/unx/kde/salnativewidgets-kde.cxx @@ -32,7 +32,7 @@ #include "precompiled_vcl.hxx" #define _SV_SALNATIVEWIDGETS_KDE_CXX -#include "kde_headers.h" +#include #include #include @@ -1996,6 +1996,7 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings ) } aStyleSettings.SetMenuTextColor( aMenuFore ); + aStyleSettings.SetMenuBarTextColor( aMenuFore ); aStyleSettings.SetMenuColor( aMenuBack ); aStyleSettings.SetMenuBarColor( aMenuBack ); @@ -2035,13 +2036,6 @@ void KDESalFrame::UpdateSettings( AllSettings& rSettings ) // Scroll bar size aStyleSettings.SetScrollBarSize( kapp->style().pixelMetric( QStyle::PM_ScrollBarExtent ) ); - /* #i35482# do not override HC mode - // #i59364# high contrast mode - bool bHC = ( aStyleSettings.GetFaceColor().IsDark() || - aStyleSettings.GetWindowColor().IsDark() ); - aStyleSettings.SetHighContrastMode( bHC ); - */ - rSettings.SetStyleSettings( aStyleSettings ); } @@ -2079,12 +2073,13 @@ void KDESalFrame::ReleaseGraphics( SalGraphics *pGraphics ) } } -void KDESalFrame::updateGraphics() +void KDESalFrame::updateGraphics( bool bClear ) { + Drawable aDrawable = bClear ? None : GetWindow(); for( int i = 0; i < nMaxGraphics; i++ ) { if( m_aGraphics[i].bInUse ) - m_aGraphics[i].pGraphics->SetDrawable( GetWindow(), GetScreenNumber() ); + m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() ); } } diff --git a/vcl/unx/kde4/KDEData.cxx b/vcl/unx/kde4/KDEData.cxx new file mode 100644 index 000000000000..91e3a758da3c --- /dev/null +++ b/vcl/unx/kde4/KDEData.cxx @@ -0,0 +1,54 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "KDEData.hxx" + +#include "KDEXLib.hxx" + +KDEData::~KDEData() +{ +} + +void KDEData::Init() +{ + pXLib_ = new KDEXLib(); + pXLib_->Init(); +} + +void KDEData::initNWF() +{ + ImplSVData *pSVData = ImplGetSVData(); + + // draw toolbars on separate lines + pSVData->maNWFData.mbDockingAreaSeparateTB = true; + // no borders for menu, theming does that + pSVData->maNWFData.mbFlatMenu = true; +} + +void KDEData::deInitNWF() +{ +} \ No newline at end of file diff --git a/svtools/source/config/options.cxx b/vcl/unx/kde4/KDEData.hxx similarity index 76% rename from svtools/source/config/options.cxx rename to vcl/unx/kde4/KDEData.hxx index b418b90530a3..68645abc28d3 100644 --- a/svtools/source/config/options.cxx +++ b/vcl/unx/kde4/KDEData.hxx @@ -2,13 +2,10 @@ * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * Copyright 2008 by Sun Microsystems, Inc. + * Copyright 2009 by Sun Microsystems, Inc. * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: options.cxx,v $ - * $Revision: 1.5 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -28,15 +25,18 @@ * ************************************************************************/ -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#pragma once -#include "sal/config.h" +#include +#include -#include +class KDEData : public X11SalData +{ + public: + KDEData() {} + virtual ~KDEData(); -using svt::detail::Options; - -Options::Options() {} - -Options::~Options() {} + virtual void Init(); + virtual void initNWF(); + virtual void deInitNWF(); +}; \ No newline at end of file diff --git a/vcl/unx/kde4/KDESalDisplay.cxx b/vcl/unx/kde4/KDESalDisplay.cxx new file mode 100644 index 000000000000..61044c3de71b --- /dev/null +++ b/vcl/unx/kde4/KDESalDisplay.cxx @@ -0,0 +1,45 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "KDESalDisplay.hxx" + +#include "KDEXLib.hxx" + +SalKDEDisplay::SalKDEDisplay( Display* pDisp ) + : SalX11Display( pDisp ) +{ +} + +SalKDEDisplay::~SalKDEDisplay() +{ + // in case never a frame opened + static_cast(GetXLib())->doStartup(); + // clean up own members + doDestruct(); + // prevent SalDisplay from closing KApplication's display + pDisp_ = NULL; +} \ No newline at end of file diff --git a/vcl/unx/kde4/KDESalDisplay.hxx b/vcl/unx/kde4/KDESalDisplay.hxx new file mode 100644 index 000000000000..ce294f45087d --- /dev/null +++ b/vcl/unx/kde4/KDESalDisplay.hxx @@ -0,0 +1,37 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#pragma once + +#include + +class SalKDEDisplay : public SalX11Display +{ + public: + SalKDEDisplay( Display* pDisp ); + virtual ~SalKDEDisplay(); +}; diff --git a/vcl/unx/kde4/KDESalFrame.cxx b/vcl/unx/kde4/KDESalFrame.cxx new file mode 100644 index 000000000000..6177c4b2896a --- /dev/null +++ b/vcl/unx/kde4/KDESalFrame.cxx @@ -0,0 +1,405 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#define Region QtXRegion + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#undef Region + +#include "KDESalFrame.hxx" +#include "KDEXLib.hxx" +#include "KDESalGraphics.hxx" + +#include +#include +#include + +#include + +#include + +#if OSL_DEBUG_LEVEL > 1 +#include +#endif + +KDESalFrame::KDESalFrame( SalFrame* pParent, ULONG nState ) : + X11SalFrame( pParent, nState ) +{ +} + +void KDESalFrame::Show( BOOL bVisible, BOOL bNoActivate ) +{ + if ( !GetParent() && ! (GetStyle() & SAL_FRAME_STYLE_INTRO) ) + { + KDEXLib* pXLib = static_cast(GetDisplay()->GetXLib()); + pXLib->doStartup(); + } + + X11SalFrame::Show( bVisible, bNoActivate ); +} + +/** Helper function to convert colors. +*/ +static Color toColor( const QColor &rColor ) +{ + return Color( rColor.red(), rColor.green(), rColor.blue() ); +} + +/** Helper function to read untranslated text entry from KConfig configuration repository. +*/ +static OUString readEntryUntranslated( KConfigGroup *pGroup, const char *pKey ) +{ + return OUString::createFromAscii( (const char *) pGroup->readEntryUntranslated( pKey ).toAscii() ); +} + +/** Helper function to read color from KConfig configuration repository. +*/ +static Color readColor( KConfigGroup *pGroup, const char *pKey ) +{ + return toColor( pGroup->readEntry( pKey, QColor(Qt::white) ) ); +} + +/** Helper function to add information to Font from QFont. + + Mostly grabbed from the Gtk+ vclplug (salnativewidgets-gtk.cxx). +*/ +static Font toFont( const QFont &rQFont, const ::com::sun::star::lang::Locale& rLocale ) +{ + psp::FastPrintFontInfo aInfo; + QFontInfo qFontInfo( rQFont ); + + // set family name + aInfo.m_aFamilyName = String( (const char *) rQFont.family().toUtf8(), RTL_TEXTENCODING_UTF8 ); + + // set italic + aInfo.m_eItalic = ( qFontInfo.italic()? psp::italic::Italic: psp::italic::Upright ); + + // set weight + int nWeight = qFontInfo.weight(); + if ( nWeight <= QFont::Light ) + aInfo.m_eWeight = psp::weight::Light; + else if ( nWeight <= QFont::Normal ) + aInfo.m_eWeight = psp::weight::Normal; + else if ( nWeight <= QFont::DemiBold ) + aInfo.m_eWeight = psp::weight::SemiBold; + else if ( nWeight <= QFont::Bold ) + aInfo.m_eWeight = psp::weight::Bold; + else + aInfo.m_eWeight = psp::weight::UltraBold; + + // set width + int nStretch = rQFont.stretch(); + if ( nStretch <= QFont::UltraCondensed ) + aInfo.m_eWidth = psp::width::UltraCondensed; + else if ( nStretch <= QFont::ExtraCondensed ) + aInfo.m_eWidth = psp::width::ExtraCondensed; + else if ( nStretch <= QFont::Condensed ) + aInfo.m_eWidth = psp::width::Condensed; + else if ( nStretch <= QFont::SemiCondensed ) + aInfo.m_eWidth = psp::width::SemiCondensed; + else if ( nStretch <= QFont::Unstretched ) + aInfo.m_eWidth = psp::width::Normal; + else if ( nStretch <= QFont::SemiExpanded ) + aInfo.m_eWidth = psp::width::SemiExpanded; + else if ( nStretch <= QFont::Expanded ) + aInfo.m_eWidth = psp::width::Expanded; + else if ( nStretch <= QFont::ExtraExpanded ) + aInfo.m_eWidth = psp::width::ExtraExpanded; + else + aInfo.m_eWidth = psp::width::UltraExpanded; + +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "font name BEFORE system match: \"%s\"\n", OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() ); +#endif + + // match font to e.g. resolve "Sans" + psp::PrintFontManager::get().matchFont( aInfo, rLocale ); + +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "font match %s, name AFTER: \"%s\"\n", + aInfo.m_nID != 0 ? "succeeded" : "failed", + OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr() ); +#endif + + // font height + int nPointHeight = qFontInfo.pointSize(); + if ( nPointHeight <= 0 ) + nPointHeight = rQFont.pointSize(); + + // Create the font + Font aFont( aInfo.m_aFamilyName, Size( 0, nPointHeight ) ); + if( aInfo.m_eWeight != psp::weight::Unknown ) + aFont.SetWeight( PspGraphics::ToFontWeight( aInfo.m_eWeight ) ); + if( aInfo.m_eWidth != psp::width::Unknown ) + aFont.SetWidthType( PspGraphics::ToFontWidth( aInfo.m_eWidth ) ); + if( aInfo.m_eItalic != psp::italic::Unknown ) + aFont.SetItalic( PspGraphics::ToFontItalic( aInfo.m_eItalic ) ); + if( aInfo.m_ePitch != psp::pitch::Unknown ) + aFont.SetPitch( PspGraphics::ToFontPitch( aInfo.m_ePitch ) ); + + return aFont; +} + +/** Implementation of KDE integration's main method. +*/ +void KDESalFrame::UpdateSettings( AllSettings& rSettings ) +{ + StyleSettings style( rSettings.GetStyleSettings() ); + BOOL bSetTitleFont = false; + + // General settings + QPalette pal = kapp->palette(); + + style.SetActiveColor(toColor(pal.color(QPalette::Active, QPalette::Window))); + style.SetDeactiveColor(toColor(pal.color(QPalette::Inactive, QPalette::Window))); + + style.SetActiveColor2(toColor(pal.color(QPalette::Active, QPalette::Window))); + style.SetDeactiveColor2(toColor(pal.color(QPalette::Inactive, QPalette::Window))); + + style.SetActiveTextColor(toColor(pal.color(QPalette::Active, QPalette::WindowText))); + style.SetDeactiveTextColor(toColor(pal.color(QPalette::Inactive, QPalette::WindowText))); + + // WM settings + KConfig *pConfig = KGlobal::config().data(); + if ( pConfig ) + { + KConfigGroup aGroup = pConfig->group( "WM" ); + const char *pKey; + + pKey = "titleFont"; + if ( aGroup.hasKey( pKey ) ) + { + Font aFont = toFont( aGroup.readEntry( pKey, QFont() ), rSettings.GetUILocale() ); + style.SetTitleFont( aFont ); + bSetTitleFont = true; + } + + aGroup = pConfig->group( "Icons" ); + + pKey = "Theme"; + if ( aGroup.hasKey( pKey ) ) + style.SetPreferredSymbolsStyleName( readEntryUntranslated( &aGroup, pKey ) ); + + //toolbar + pKey = "toolbarFont"; + if ( aGroup.hasKey( pKey ) ) + { + Font aFont = toFont( aGroup.readEntry( pKey, QFont() ), rSettings.GetUILocale() ); + style.SetToolFont( aFont ); + } + } + + Color aFore = toColor( pal.color( QPalette::Active, QPalette::WindowText ) ); + Color aBack = toColor( pal.color( QPalette::Active, QPalette::Window ) ); + Color aText = toColor( pal.color( QPalette::Active, QPalette::Text ) ); + Color aBase = toColor( pal.color( QPalette::Active, QPalette::Base ) ); + Color aButn = toColor( pal.color( QPalette::Active, QPalette::ButtonText ) ); + Color aMid = toColor( pal.color( QPalette::Active, QPalette::Mid ) ); + Color aHigh = toColor( pal.color( QPalette::Active, QPalette::Highlight ) ); + + // Foreground + style.SetRadioCheckTextColor( aFore ); + style.SetLabelTextColor( aFore ); + style.SetInfoTextColor( aFore ); + style.SetDialogTextColor( aFore ); + style.SetGroupTextColor( aFore ); + + // Text + style.SetFieldTextColor( aText ); + style.SetFieldRolloverTextColor( aText ); + style.SetWindowTextColor( aText ); + style.SetHelpTextColor( aText ); + + // Base + style.SetFieldColor( aBase ); + style.SetHelpColor( aBase ); + style.SetWindowColor( aBase ); + style.SetActiveTabColor( aBase ); + + // Buttons + style.SetButtonTextColor( aButn ); + style.SetButtonRolloverTextColor( aButn ); + + // Disable color + style.SetDisableColor( aMid ); + + // Workspace + style.SetWorkspaceColor( aMid ); + + // Background + style.Set3DColors( aBack ); + style.SetFaceColor( aBack ); + style.SetInactiveTabColor( aBack ); + style.SetDialogColor( aBack ); + + if( aBack == COL_LIGHTGRAY ) + style.SetCheckedColor( Color( 0xCC, 0xCC, 0xCC ) ); + else + { + Color aColor2 = style.GetLightColor(); + style. + SetCheckedColor( Color( (BYTE)(((USHORT)aBack.GetRed()+(USHORT)aColor2.GetRed())/2), + (BYTE)(((USHORT)aBack.GetGreen()+(USHORT)aColor2.GetGreen())/2), + (BYTE)(((USHORT)aBack.GetBlue()+(USHORT)aColor2.GetBlue())/2) + ) ); + } + + // Selection + style.SetHighlightColor( aHigh ); + style.SetHighlightTextColor( toColor(pal.color( QPalette::HighlightedText)) ); + + // Font + Font aFont = toFont( kapp->font(), rSettings.GetUILocale() ); + + style.SetAppFont( aFont ); + style.SetHelpFont( aFont ); + + if( !bSetTitleFont ) + { + style.SetTitleFont( aFont ); + } + + style.SetFloatTitleFont( aFont ); + style.SetMenuFont( aFont ); // will be changed according to pMenuBar + //style.SetToolFont( aFont ); //already set above + style.SetLabelFont( aFont ); + style.SetInfoFont( aFont ); + style.SetRadioCheckFont( aFont ); + style.SetPushButtonFont( aFont ); + style.SetFieldFont( aFont ); + style.SetIconFont( aFont ); + style.SetGroupFont( aFont ); + + int flash_time = QApplication::cursorFlashTime(); + style.SetCursorBlinkTime( flash_time != 0 ? flash_time/2 : STYLE_CURSOR_NOBLINKTIME ); + + // Menu + style.SetSkipDisabledInMenus( TRUE ); + KMenuBar* pMenuBar = new KMenuBar(); + if ( pMenuBar ) + { + // Color + QPalette qMenuCG = pMenuBar->palette(); + + // Menu text and background color, theme specific + Color aMenuFore = toColor( qMenuCG.color( QPalette::WindowText ) ); + Color aMenuBack = toColor( qMenuCG.color( QPalette::Window ) ); + + aMenuFore = toColor( qMenuCG.color( QPalette::ButtonText ) ); + aMenuBack = toColor( qMenuCG.color( QPalette::Button ) ); + + style.SetMenuTextColor( aMenuFore ); + style.SetMenuBarTextColor( aMenuFore ); + style.SetMenuColor( aMenuBack ); + style.SetMenuBarColor( aMenuBack ); + + style.SetMenuHighlightColor( toColor ( qMenuCG.color( QPalette::Highlight ) ) ); + + style.SetMenuHighlightTextColor( aMenuFore ); + + // set special menubar higlight text color + if ( kapp->style()->inherits( "HighContrastStyle" ) ) + ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = toColor( qMenuCG.color( QPalette::HighlightedText ) ); + else + ImplGetSVData()->maNWFData.maMenuBarHighlightTextColor = aMenuFore; + + // Font + aFont = toFont( pMenuBar->font(), rSettings.GetUILocale() ); + style.SetMenuFont( aFont ); + } + + delete pMenuBar; + + // Scroll bar size + style.SetScrollBarSize( kapp->style()->pixelMetric( QStyle::PM_ScrollBarExtent ) ); + + rSettings.SetStyleSettings( style ); +} + + +void KDESalFrame::ReleaseGraphics( SalGraphics *pGraphics ) +{ + for( int i = 0; i < nMaxGraphics; i++ ) + { + if( m_aGraphics[i].pGraphics == pGraphics ) + { + m_aGraphics[i].bInUse = false; + break; + } + } +} + +void KDESalFrame::updateGraphics( bool bClear ) +{ + Drawable aDrawable = bClear ? None : GetWindow(); + for( int i = 0; i < nMaxGraphics; i++ ) + { + if( m_aGraphics[i].bInUse ) + m_aGraphics[i].pGraphics->SetDrawable( aDrawable, GetScreenNumber() ); + } +} + +KDESalFrame::~KDESalFrame() +{ +} + +KDESalFrame::GraphicsHolder::~GraphicsHolder() +{ + delete pGraphics; +} + +SalGraphics* KDESalFrame::GetGraphics() +{ + if( GetWindow() ) + { + for( int i = 0; i < nMaxGraphics; i++ ) + { + if( ! m_aGraphics[i].bInUse ) + { + m_aGraphics[i].bInUse = true; + if( ! m_aGraphics[i].pGraphics ) + { + m_aGraphics[i].pGraphics = new KDESalGraphics(); + m_aGraphics[i].pGraphics->Init( this, GetWindow(), GetScreenNumber() ); + } + return m_aGraphics[i].pGraphics; + } + } + } + + return NULL; +} \ No newline at end of file diff --git a/svtools/inc/whmap.hxx b/vcl/unx/kde4/KDESalFrame.hxx similarity index 56% rename from svtools/inc/whmap.hxx rename to vcl/unx/kde4/KDESalFrame.hxx index 9677bdf328ce..de3a5af189ee 100644 --- a/svtools/inc/whmap.hxx +++ b/vcl/unx/kde4/KDESalFrame.hxx @@ -2,13 +2,10 @@ * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * Copyright 2008 by Sun Microsystems, Inc. + * Copyright 2009 by Sun Microsystems, Inc. * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: whmap.hxx,v $ - * $Revision: 1.3 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -27,35 +24,35 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -#ifndef _SFX_WHMAP_HXX -#define _SFX_WHMAP_HXX -#include +#pragma once -struct SfxWhichMapEntry +#include +#include + +class KDESalFrame : public X11SalFrame { - USHORT nWhichId; - USHORT nSlotId; -}; + private: + static const int nMaxGraphics = 2; -class SfxWhichMap -{ - const SfxWhichMapEntry *pMap; + struct GraphicsHolder + { + X11SalGraphics* pGraphics; + bool bInUse; -public: - inline SfxWhichMap( const SfxWhichMapEntry *pMappings = 0 ); - virtual ~SfxWhichMap(); + GraphicsHolder() : pGraphics(0),bInUse( false ) {} + ~GraphicsHolder(); + }; - int IsNull() const - { return 0 == pMap; } - virtual USHORT GetWhich(USHORT nSlot) const; - virtual USHORT GetSlot(USHORT nWhich) const; - virtual SfxWhichMap*Clone() const; -}; + GraphicsHolder m_aGraphics[ nMaxGraphics ]; -inline SfxWhichMap::SfxWhichMap( const SfxWhichMapEntry *pMappings ): - pMap( pMappings ) -{ -} + public: + KDESalFrame( SalFrame* pParent, ULONG nStyle ); + virtual ~KDESalFrame(); -#endif + virtual SalGraphics* GetGraphics(); + virtual void ReleaseGraphics( SalGraphics *pGraphics ); + virtual void updateGraphics( bool bClear ); + virtual void UpdateSettings( AllSettings& rSettings ); + virtual void Show( BOOL bVisible, BOOL bNoActivate ); +}; \ No newline at end of file diff --git a/vcl/unx/kde4/KDESalGraphics.cxx b/vcl/unx/kde4/KDESalGraphics.cxx new file mode 100644 index 000000000000..1c9882923b43 --- /dev/null +++ b/vcl/unx/kde4/KDESalGraphics.cxx @@ -0,0 +1,850 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#define _SV_SALNATIVEWIDGETS_KDE_CXX + +#define Region QtXRegion + +#include +#include +#include +#include +#include + +#include + +#undef Region + +#include "KDESalGraphics.hxx" + +#include "vcl/settings.hxx" +#include "vcl/decoview.hxx" +#include "rtl/ustrbuf.hxx" + +using namespace ::rtl; + +/** + Conversion function between VCL ControlState together with + ImplControlValue and Qt state flags. + @param nControlState State of the widget (default, focused, ...) in Native Widget Framework. + @param aValue Value held by the widget (on, off, ...) +*/ +QStyle::State vclStateValue2StateFlag( ControlState nControlState, + const ImplControlValue& aValue ) +{ + QStyle::State nState = + ( (nControlState & CTRL_STATE_DEFAULT)? QStyle::State_None: QStyle::State_None ) | + ( (nControlState & CTRL_STATE_ENABLED)? QStyle::State_Enabled: QStyle::State_None ) | + ( (nControlState & CTRL_STATE_FOCUSED)? QStyle::State_HasFocus: QStyle::State_None ) | + ( (nControlState & CTRL_STATE_PRESSED)? QStyle::State_Sunken: QStyle::State_None ) | + ( (nControlState & CTRL_STATE_SELECTED)? QStyle::State_Selected : QStyle::State_None ) | + ( (nControlState & CTRL_STATE_ROLLOVER)? QStyle::State_MouseOver: QStyle::State_None ); + //TODO ( (nControlState & CTRL_STATE_HIDDEN)? QStyle::State_: QStyle::State_None ) | + + switch ( aValue.getTristateVal() ) + { + case BUTTONVALUE_ON: nState |= QStyle::State_On; break; + case BUTTONVALUE_OFF: nState |= QStyle::State_Off; break; + case BUTTONVALUE_MIXED: nState |= QStyle::State_NoChange; break; + default: break; + } + + return nState; +} + +/** + Convert VCL Region to QRect. + @param rControlRegion The region to convert. + @return The bounding box of the region. +*/ +QRect region2QRect( const Region& rControlRegion ) +{ + Rectangle aRect = rControlRegion.GetBoundRect(); + + return QRect( QPoint( aRect.Left(), aRect.Top() ), + QPoint( aRect.Right(), aRect.Bottom() ) ); +} + +BOOL KDESalGraphics::IsNativeControlSupported( ControlType type, ControlPart part ) +{ + if (type == CTRL_PUSHBUTTON) return true; + + if (type == CTRL_MENUBAR) return true; + + if (type == CTRL_MENU_POPUP) return true; + + if (type == CTRL_EDITBOX) return true; + + if (type == CTRL_COMBOBOX) return true; + + if (type == CTRL_TOOLBAR) return true; + + if (type == CTRL_CHECKBOX) return true; + + if (type == CTRL_LISTBOX) return true; + + if (type == CTRL_LISTNODE) return true; + + if (type == CTRL_FRAME) return true; + + if (type == CTRL_SCROLLBAR) return true; + + if (type == CTRL_WINDOW_BACKGROUND) return true; + + if (type == CTRL_SPINBOX && (part == PART_ENTIRE_CONTROL || part == HAS_BACKGROUND_TEXTURE) ) return true; + + // no spinbuttons for KDE, paint spinbox complete + //if (type == CTRL_SPINBUTTONS) return true; + + if (type == CTRL_GROUPBOX) return true; + + if (type == CTRL_FIXEDLINE) return true; + + if (type == CTRL_FIXEDBORDER) return true; + + if (type == CTRL_TOOLTIP) return true; + + if (type == CTRL_RADIOBUTTON) return true; + + return false; + + if ( (type == CTRL_TAB_ITEM) && (part == PART_ENTIRE_CONTROL) ) return true; + if ( (type == CTRL_TAB_PANE) && (part == PART_ENTIRE_CONTROL) ) return true; + // no CTRL_TAB_BODY for KDE + if ( (type == CTRL_PROGRESS) && (part == PART_ENTIRE_CONTROL) ) return true; + + return false; +} + + +BOOL KDESalGraphics::hitTestNativeControl( ControlType, ControlPart, + const Region&, const Point&, + SalControlHandle&, BOOL& ) +{ + return FALSE; +} + +void lcl_drawFrame( QRect& i_rRect, QPainter& i_rPainter, QStyle::PrimitiveElement i_nElement, + ControlState i_nState, const ImplControlValue& i_rValue ) +{ + #if ( QT_VERSION >= QT_VERSION_CHECK( 4, 5, 0 ) ) + QStyleOptionFrameV3 styleOption; + styleOption.frameShape = QFrame::StyledPanel; + #else + QStyleOptionFrame styleOption; + QFrame aFrame( NULL ); + aFrame.setFrameRect( QRect(0, 0, i_rRect.width(), i_rRect.height()) ); + aFrame.setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); + aFrame.ensurePolished(); + styleOption.initFrom( &aFrame ); + styleOption.lineWidth = aFrame.lineWidth(); + styleOption.midLineWidth = aFrame.midLineWidth(); + #endif + styleOption.rect = QRect(0, 0, i_rRect.width(), i_rRect.height()); + styleOption.state = vclStateValue2StateFlag( i_nState, i_rValue ); + #if ( QT_VERSION < QT_VERSION_CHECK( 4, 5, 0 ) ) + styleOption.state |= QStyle::State_Sunken; + #endif + kapp->style()->drawPrimitive(i_nElement, &styleOption, &i_rPainter); +} + +BOOL KDESalGraphics::drawNativeControl( ControlType type, ControlPart part, + const Region& rControlRegion, ControlState nControlState, + const ImplControlValue& value, SalControlHandle&, + const OUString& ) +{ + // put not implemented types here + if (type == CTRL_SPINBUTTONS) + { + return false; + } + + BOOL returnVal = true; + + Display* dpy = GetXDisplay(); + XLIB_Window drawable = GetDrawable(); + GC gc = SelectPen(); + + QRect widgetRect = region2QRect(rControlRegion); + if( type == CTRL_SPINBOX && part == PART_ALL_BUTTONS ) + type = CTRL_SPINBUTTONS; + if( type == CTRL_SPINBUTTONS ) + { + SpinbuttonValue* pSpinVal = (SpinbuttonValue *)(value.getOptionalVal()); + Rectangle aButtonRect( pSpinVal->maUpperRect); + aButtonRect.Union( pSpinVal->maLowerRect );; + widgetRect = QRect( aButtonRect.Left(), aButtonRect.Top(), + aButtonRect.Right(), aButtonRect.Bottom() ); + } + + //draw right onto the window + QPixmap pixmap(widgetRect.width(), widgetRect.height()); + + if (pixmap.isNull()) + { + return false; + } + + QPainter painter(&pixmap); + // painter.setBackgroundMode(Qt::OpaqueMode); + + //copy previous screen contents for proper blending + #if ( QT_VERSION >= QT_VERSION_CHECK( 4, 5, 0 ) ) + QPixmap screen = QPixmap::fromX11Pixmap(drawable); + painter.drawPixmap(0,0, screen, widgetRect.left(), widgetRect.top(), widgetRect.width(), widgetRect.height()); + #else + const QX11Info& rX11Info( pixmap.x11Info() ); + X11SalGraphics::CopyScreenArea( dpy, + drawable, GetScreenNumber(), GetBitCount(), + pixmap.handle(), rX11Info.screen(), rX11Info.depth(), + GetDisplay()->GetCopyGC( GetScreenNumber() ), + widgetRect.left(), widgetRect.top(), widgetRect.width(), widgetRect.height(), + 0, 0 ); + #endif + + if (type == CTRL_PUSHBUTTON) + { + QStyleOptionButton styleOption; + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state =vclStateValue2StateFlag( nControlState, value ); + + kapp->style()->drawControl( QStyle::CE_PushButton, &styleOption, &painter); + } + else if ( (type == CTRL_MENUBAR)) + { + if (part == PART_MENU_ITEM) + { + QStyleOptionMenuItem styleOption; + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + kapp->style()->drawControl( QStyle::CE_MenuBarItem, &styleOption, &painter); + } + else + { + pixmap.fill(KApplication::palette().color(QPalette::Window)); + } + } + else if (type == CTRL_MENU_POPUP) + { + if (part == PART_MENU_ITEM) + { + QStyleOptionMenuItem styleOption; + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + kapp->style()->drawControl( QStyle::CE_MenuItem, &styleOption, &painter); + } + else if (part == PART_MENU_ITEM_CHECK_MARK) + { + QStyleOptionButton styleOption; + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + if (nControlState & CTRL_STATE_PRESSED) + { + kapp->style()->drawPrimitive( QStyle::PE_IndicatorMenuCheckMark, &styleOption, &painter); + } + } + else if (part == PART_MENU_ITEM_RADIO_MARK) + { + QStyleOptionButton styleOption; + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + if (nControlState & CTRL_STATE_PRESSED) + { + kapp->style()->drawPrimitive( QStyle::PE_IndicatorRadioButton, &styleOption, &painter); + } + } + else + { + pixmap.fill(KApplication::palette().color(QPalette::Window)); + + #if ( QT_VERSION >= QT_VERSION_CHECK( 4, 5, 0 ) ) + QStyleOptionFrameV3 styleOption; + #else + QStyleOptionFrameV2 styleOption; + #endif + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + #if ( QT_VERSION >= QT_VERSION_CHECK( 4, 5, 0 ) ) + styleOption.frameShape = QFrame::StyledPanel; + #endif + + kapp->style()->drawPrimitive( QStyle::PE_FrameMenu, &styleOption, &painter); + } + } + else if ( (type == CTRL_TOOLBAR) && (part == PART_BUTTON) ) + { + QStyleOptionToolButton styleOption; + + styleOption.arrowType = Qt::NoArrow; + styleOption.subControls = QStyle::SC_ToolButton; + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + styleOption.state |= QStyle::State_Raised | QStyle::State_Enabled | QStyle::State_AutoRaise; + + kapp->style()->drawComplexControl( QStyle::CC_ToolButton, &styleOption, &painter); + } + else if ( (type == CTRL_TOOLBAR) && (part == PART_ENTIRE_CONTROL) ) + { + QStyleOptionToolBar styleOption; + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + kapp->style()->drawControl( QStyle::CE_ToolBar, &styleOption, &painter); + } + else if ( (type == CTRL_TOOLBAR) && (part == PART_THUMB_VERT) ) + { + QStyleOption styleOption; + + int width = kapp->style()->pixelMetric(QStyle::PM_ToolBarHandleExtent); + + styleOption.rect = QRect(0, 0, width, widgetRect.height()); + styleOption.state = QStyle::State_Horizontal; + + kapp->style()->drawPrimitive( QStyle::PE_IndicatorToolBarHandle, &styleOption, &painter); + } + else if (type == CTRL_EDITBOX) + { + pixmap.fill(KApplication::palette().color(QPalette::Window)); + + //TODO hover?? OO does not seem to do this for line edits + + #if ( QT_VERSION >= QT_VERSION_CHECK( 4, 5, 0 ) ) + QStyleOptionFrameV3 styleOption; + #else + QStyleOptionFrameV2 styleOption; + #endif + + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + //TODO...how does the line edit draw itself internally?? + styleOption.rect = QRect(2, 2, widgetRect.width()-4, widgetRect.height()-4); + kapp->style()->drawPrimitive( QStyle::PE_PanelLineEdit, &styleOption, &painter); + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + kapp->style()->drawPrimitive( QStyle::PE_FrameLineEdit, &styleOption, &painter); + } + else if (type == CTRL_COMBOBOX) + { + pixmap.fill(KApplication::palette().color(QPalette::Window)); + + QStyleOptionComboBox styleOption; + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + styleOption.editable = true; + + kapp->style()->drawComplexControl(QStyle::CC_ComboBox, &styleOption, &painter); + } + else if (type == CTRL_LISTBOX) + { + if( part == PART_WINDOW ) + { + lcl_drawFrame( widgetRect, painter, QStyle::PE_Frame, nControlState, value ); + } + else + { + QStyleOptionComboBox styleOption; + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + if (part == PART_SUB_EDIT) + { + kapp->style()->drawControl(QStyle::CE_ComboBoxLabel, &styleOption, &painter); + } + else + { + kapp->style()->drawComplexControl(QStyle::CC_ComboBox, &styleOption, &painter); + } + } + } + else if (type == CTRL_LISTNODE) + { + QStyleOption styleOption; + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + styleOption.state |= QStyle::State_Item; + styleOption.state |= QStyle::State_Children; + + if (nControlState & CTRL_STATE_PRESSED) + { + styleOption.state |= QStyle::State_Open; + } + + kapp->style()->drawPrimitive(QStyle::PE_IndicatorBranch, &styleOption, &painter); + } + else if (type == CTRL_CHECKBOX) + { + QStyleOptionButton styleOption; + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + kapp->style()->drawControl(QStyle::CE_CheckBox, &styleOption, &painter); + } + else if (type == CTRL_SCROLLBAR) + { + pixmap.fill(KApplication::palette().color(QPalette::Window)); + + if ((part == PART_DRAW_BACKGROUND_VERT) || (part == PART_DRAW_BACKGROUND_HORZ)) + { + ScrollbarValue* sbVal = static_cast ( value.getOptionalVal() ); + + QStyleOptionSlider styleOption; + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + + //if the scroll bar is active (aka not degenrate...allow for hover events + if (sbVal->mnVisibleSize < sbVal->mnMax) + { + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + styleOption.state |= QStyle::State_MouseOver; + } + + //horizontal or vertical + if (part == PART_DRAW_BACKGROUND_VERT) + { + styleOption.orientation = Qt::Vertical; + } + else + { + styleOption.state |= QStyle::State_Horizontal; + } + + //setup parameters from the OO values + styleOption.minimum = sbVal->mnMin; + styleOption.maximum = sbVal->mnMax - sbVal->mnVisibleSize; + styleOption.sliderValue = sbVal->mnCur; + styleOption.sliderPosition = sbVal->mnCur; + styleOption.pageStep = sbVal->mnVisibleSize; + + //setup the active control...always the slider + if (sbVal->mnThumbState & CTRL_STATE_ROLLOVER) + { + styleOption.activeSubControls = QStyle::SC_ScrollBarSlider; + } + + kapp->style()->drawComplexControl(QStyle::CC_ScrollBar, &styleOption, &painter); + } + } + else if (type == CTRL_SPINBOX) + { + pixmap.fill(KApplication::palette().color(QPalette::Window)); + + QStyleOptionSpinBox styleOption; + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + // determine active control + SpinbuttonValue* pSpinVal = (SpinbuttonValue *)(value.getOptionalVal()); + if( pSpinVal ) + { + if( (pSpinVal->mnUpperState & CTRL_STATE_PRESSED) ) + styleOption.activeSubControls |= QStyle::SC_SpinBoxUp; + if( (pSpinVal->mnLowerState & CTRL_STATE_PRESSED) ) + styleOption.activeSubControls |= QStyle::SC_SpinBoxDown; + } + + kapp->style()->drawComplexControl(QStyle::CC_SpinBox, &styleOption, &painter); + } + else if (type == CTRL_GROUPBOX) + { + QStyleOptionGroupBox styleOption; + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + kapp->style()->drawComplexControl(QStyle::CC_GroupBox, &styleOption, &painter); + } + else if (type == CTRL_RADIOBUTTON) + { + QStyleOptionButton styleOption; + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + kapp->style()->drawControl(QStyle::CE_RadioButton, &styleOption, &painter); + } + else if (type == CTRL_TOOLTIP) + { + QStyleOption styleOption; + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + + kapp->style()->drawPrimitive(QStyle::PE_PanelTipLabel, &styleOption, &painter); + } + else if (type == CTRL_FRAME) + { + pixmap.fill(KApplication::palette().color(QPalette::Window)); + lcl_drawFrame( widgetRect, painter, QStyle::PE_Frame, nControlState, value ); + } + else if (type == CTRL_FIXEDBORDER) + { + pixmap.fill(KApplication::palette().color(QPalette::Window)); + lcl_drawFrame( widgetRect, painter, QStyle::PE_FrameWindow, nControlState, value ); + } + else if (type == CTRL_WINDOW_BACKGROUND) + { + pixmap.fill(KApplication::palette().color(QPalette::Window)); + } + else if (type == CTRL_FIXEDLINE) + { + QStyleOptionMenuItem styleOption; + + styleOption.rect = QRect(0, 0, widgetRect.width(), widgetRect.height()); + styleOption.state = vclStateValue2StateFlag( nControlState, value ); + styleOption.menuItemType = QStyleOptionMenuItem::Separator; + styleOption.state |= QStyle::State_Item; + + kapp->style()->drawControl( QStyle::CE_MenuItem, &styleOption, &painter); + } + else + { + returnVal = false; + } + + if (returnVal) + { + X11SalGraphics::CopyScreenArea( dpy, + pixmap.handle(), pixmap.x11Info().screen(), pixmap.x11Info().depth(), + drawable, GetScreenNumber(), GetVisual().GetDepth(), gc, + 0, 0, widgetRect.width(), widgetRect.height(), widgetRect.left(), widgetRect.top() ); + } + + return returnVal; +} + +BOOL KDESalGraphics::getNativeControlRegion( ControlType type, ControlPart part, + const Region& controlRegion, ControlState controlState, + const ImplControlValue& val, SalControlHandle&, + const OUString&, + Region &nativeBoundingRegion, Region &nativeContentRegion ) +{ + bool retVal = false; + + QRect boundingRect = region2QRect( controlRegion ); + QRect contentRect = boundingRect; + QStyleOptionComplex styleOption; + + switch ( type ) + { + // Metrics of the push button + case CTRL_PUSHBUTTON: + if (part == PART_ENTIRE_CONTROL) + { + styleOption.state = vclStateValue2StateFlag(controlState, val); + + if ( controlState & CTRL_STATE_DEFAULT ) + { + int size = kapp->style()->pixelMetric( + QStyle::PM_ButtonDefaultIndicator, &styleOption ); + + boundingRect.adjust( -size, -size, size, size ); + + retVal = true; + } + } + break; + case CTRL_EDITBOX: + { + int nFontHeight = kapp->fontMetrics().height(); + //int nFrameSize = kapp->style()->pixelMetric(QStyle::PM_DefaultFrameWidth); + int nLayoutTop = kapp->style()->pixelMetric(QStyle::PM_LayoutTopMargin); + int nLayoutBottom = kapp->style()->pixelMetric(QStyle::PM_LayoutBottomMargin); + int nLayoutLeft = kapp->style()->pixelMetric(QStyle::PM_LayoutLeftMargin); + int nLayoutRight = kapp->style()->pixelMetric(QStyle::PM_LayoutRightMargin); + + int nMinHeight = (nFontHeight + nLayoutTop + nLayoutBottom); + if( boundingRect.height() < nMinHeight ) + { + int delta = nMinHeight - boundingRect.height(); + boundingRect.adjust( 0, 0, 0, delta ); + } + contentRect = boundingRect; + contentRect.adjust( -nLayoutLeft+1, -nLayoutTop+1, nLayoutRight-1, nLayoutBottom-1 ); + retVal = true; + + break; + } + case CTRL_CHECKBOX: + if (part == PART_ENTIRE_CONTROL) + { + styleOption.state = vclStateValue2StateFlag(controlState, val); + + contentRect.setWidth(kapp->style()->pixelMetric( + QStyle::PM_IndicatorWidth, &styleOption)); + contentRect.setHeight(kapp->style()->pixelMetric( + QStyle::PM_IndicatorHeight, &styleOption)); + + contentRect.adjust(0, 0, + 2 * kapp->style()->pixelMetric( + QStyle::PM_FocusFrameHMargin, &styleOption), + 2 * kapp->style()->pixelMetric( + QStyle::PM_FocusFrameVMargin, &styleOption) + ); + + boundingRect = contentRect; + + retVal = true; + + break; + } + case CTRL_COMBOBOX: + case CTRL_LISTBOX: + { + QStyleOptionComboBox cbo; + + cbo.rect = QRect(0, 0, contentRect.width(), contentRect.height()); + cbo.state = vclStateValue2StateFlag(controlState, val); + + switch ( part ) + { + case PART_ENTIRE_CONTROL: + { + int size = kapp->style()->pixelMetric(QStyle::PM_ComboBoxFrameWidth) - 2; + + // find out the minimum size that should be used + // assume contents is a text ling + int nHeight = kapp->fontMetrics().height(); + QSize aContentSize( contentRect.width(), nHeight ); + QSize aMinSize = kapp->style()-> + sizeFromContents( QStyle::CT_ComboBox, &cbo, aContentSize ); + if( aMinSize.height() > contentRect.height() ) + contentRect.adjust( 0, 0, 0, aMinSize.height() - contentRect.height() ); + boundingRect = contentRect; + // FIXME: why this difference between comboboxes and listboxes ? + // because a combobox has a sub edit and that is positioned + // inside the outer bordered control ? + if( type == CTRL_COMBOBOX ) + contentRect.adjust(-size,-size,size,size); + retVal = true; + break; + } + case PART_BUTTON_DOWN: + //the entire control can be used as the "down" button + retVal = true; + break; + case PART_SUB_EDIT: + contentRect = kapp->style()->subControlRect( + QStyle::CC_ComboBox, &cbo, QStyle::SC_ComboBoxEditField ); + + contentRect.translate( boundingRect.left(), boundingRect.top() ); + + retVal = true; + break; + case PART_WINDOW: + retVal = true; + break; + } + break; + } + case CTRL_SPINBOX: + { + QStyleOptionSpinBox sbo; + + sbo.rect = QRect(0, 0, contentRect.width(), contentRect.height()); + sbo.state = vclStateValue2StateFlag(controlState, val); + + switch ( part ) + { + case PART_BUTTON_UP: + contentRect = kapp->style()->subControlRect( + QStyle::CC_SpinBox, &sbo, QStyle::SC_SpinBoxUp ); + contentRect.translate( boundingRect.left(), boundingRect.top() ); + retVal = true; + boundingRect = QRect(); + break; + + case PART_BUTTON_DOWN: + contentRect = kapp->style()->subControlRect( + QStyle::CC_SpinBox, &sbo, QStyle::SC_SpinBoxDown ); + retVal = true; + contentRect.translate( boundingRect.left(), boundingRect.top() ); + boundingRect = QRect(); + break; + + case PART_SUB_EDIT: + contentRect = kapp->style()->subControlRect( + QStyle::CC_SpinBox, &sbo, QStyle::SC_SpinBoxEditField ); + retVal = true; + contentRect.translate( boundingRect.left(), boundingRect.top() ); + break; + default: + retVal = true; + } + break; + } + case CTRL_MENU_POPUP: + //just limit the widget of the menu items + //OO isn't very flexible in all reguards with the menu + //so we do the best we can + if (part == PART_MENU_ITEM_CHECK_MARK) + { + contentRect.setWidth(contentRect.height()); + retVal = true; + } + else if (part == PART_MENU_ITEM_RADIO_MARK) + { + contentRect.setWidth(contentRect.height()); + retVal = true; + } + break; + case CTRL_FRAME: + { + if( part == PART_BORDER ) + { + int size = kapp->style()->pixelMetric(QStyle::PM_LayoutLeftMargin); + USHORT nStyle = val.getNumericVal(); + if( nStyle & FRAME_DRAW_NODRAW ) + { + // in this case the question is: how thick would a frame be + // see brdwin.cxx, decoview.cxx + // most probably the behavior in decoview.cxx is wrong. + contentRect.adjust(size, size, -size, -size); + } + retVal = true; + } + break; + } + case CTRL_RADIOBUTTON: + { + const int h = kapp->style()->pixelMetric(QStyle::PM_ExclusiveIndicatorHeight); + const int w = kapp->style()->pixelMetric(QStyle::PM_ExclusiveIndicatorWidth); + + contentRect = QRect(boundingRect.left(), boundingRect.top(), w, h); + contentRect.adjust(0, 0, + 2 * kapp->style()->pixelMetric( + QStyle::PM_FocusFrameHMargin, &styleOption), + 2 * kapp->style()->pixelMetric( + QStyle::PM_FocusFrameVMargin, &styleOption) + ); + boundingRect = contentRect; + + retVal = true; + } + default: + break; + } +#if 0 + + + // Metrics of the scroll bar + case CTRL_SCROLLBAR: + //pWidget = pWidgetPainter->scrollBar( rControlRegion, + //( part == PART_BUTTON_LEFT || part == PART_BUTTON_RIGHT ), + //ImplControlValue() ); + //aStyleOption.initFrom( pWidget ); + + switch ( part ) + { + case PART_BUTTON_LEFT: + case PART_BUTTON_UP: + qRect = kapp->style()->subControlRect( + QStyle::CC_ScrollBar, &aStyleOption, QStyle::SC_ScrollBarSubLine ); + + // Workaround for Platinum style scroll bars. It makes the + // left/up button invisible. + if ( part == PART_BUTTON_LEFT ) + { + if ( qRect.left() > kapp->style()->subControlRect( + QStyle::CC_ScrollBar, &aStyleOption, + QStyle::SC_ScrollBarSubPage ).left() ) + { + qRect.setLeft( 0 ); + qRect.setRight( 0 ); + } + } + else + { + if ( qRect.top() > kapp->style()->subControlRect( + QStyle::CC_ScrollBar, &aStyleOption, + QStyle::SC_ScrollBarSubPage ).top() ) + { + qRect.setTop( 0 ); + qRect.setBottom( 0 ); + } + } + + qRect.translate( qBoundingRect.left(), qBoundingRect.top() ); + + bReturn = TRUE; + break; + + case PART_BUTTON_RIGHT: + case PART_BUTTON_DOWN: + qRect = kapp->style()->subControlRect( + QStyle::CC_ScrollBar, &aStyleOption, QStyle::SC_ScrollBarAddLine ); + + // Workaround for Platinum and 3 button style scroll bars. + // It makes the right/down button bigger. + if ( part == PART_BUTTON_RIGHT ) + qRect.setLeft( kapp->style()->subControlRect( + QStyle::CC_ScrollBar, &aStyleOption, + QStyle::SC_ScrollBarAddPage ).right() + 1 ); + else + qRect.setTop( kapp->style()->subControlRect( + QStyle::CC_ScrollBar, &aStyleOption, + QStyle::SC_ScrollBarAddPage ).bottom() + 1 ); + + qRect.translate( qBoundingRect.left(), qBoundingRect.top() ); + + bReturn = TRUE; + break; + } + break; + } +#endif + + if (retVal) + { + // Bounding region + Point aBPoint( boundingRect.x(), boundingRect.y() ); + Size aBSize( boundingRect.width(), boundingRect.height() ); + nativeBoundingRegion = Region( Rectangle( aBPoint, aBSize ) ); + + // Region of the content + Point aPoint( contentRect.x(), contentRect.y() ); + Size aSize( contentRect.width(), contentRect.height() ); + nativeContentRegion = Region( Rectangle( aPoint, aSize ) ); + } + + return retVal; +} diff --git a/vcl/unx/kde4/KDESalGraphics.hxx b/vcl/unx/kde4/KDESalGraphics.hxx new file mode 100644 index 000000000000..e598f75be75f --- /dev/null +++ b/vcl/unx/kde4/KDESalGraphics.hxx @@ -0,0 +1,114 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#pragma once + +#include +#include +#include + +/** handles graphics drawings requests and performs the needed drawing operations */ +class KDESalGraphics : public X11SalGraphics +{ + public: + KDESalGraphics() {} + virtual ~KDESalGraphics() {} + + /** + What widgets can be drawn the native way. + @param type Type of the widget. + @param part Specification of the widget's part if it consists of more than one. + @return true if the platform supports native drawing of the widget type defined by part. + */ + virtual BOOL IsNativeControlSupported( ControlType type, ControlPart part ); + + /** Test whether the position is in the native widget. + If the return value is TRUE, bIsInside contains information whether + aPos was or was not inside the native widget specified by the + type/part combination. + */ + virtual BOOL hitTestNativeControl( ControlType type, ControlPart part, + const Region& rControlRegion, const Point& aPos, + SalControlHandle& rControlHandle, BOOL& rIsInside ); + /** Draw the requested control described by part/nControlState. + + @param rControlRegion + The bounding region of the complete control in VCL frame coordinates. + + @param aValue + An optional value (tristate/numerical/string). + + @param rControlHandle + Carries platform dependent data and is maintained by the SalFrame implementation. + + @param aCaption + A caption or title string (like button text etc.) + */ + virtual BOOL drawNativeControl( ControlType type, ControlPart part, + const Region& rControlRegion, ControlState nControlState, + const ImplControlValue& aValue, SalControlHandle& rControlHandle, + const rtl::OUString& aCaption ); + + /** Draw text on the widget. + OPTIONAL. Draws the requested text for the control described by part/nControlState. + Used if text is not drawn by DrawNativeControl(). + + @param rControlRegion The bounding region of the complete control in VCL frame coordinates. + @param aValue An optional value (tristate/numerical/string) + @param rControlHandle Carries platform dependent data and is maintained by the SalFrame implementation. + @param aCaption A caption or title string (like button text etc.) + */ + virtual BOOL drawNativeControlText( ControlType, ControlPart, + const Region&, ControlState, + const ImplControlValue&, SalControlHandle&, + const rtl::OUString& ) { return false; } + /** Check if the bounding regions match. + + If the return value is TRUE, rNativeBoundingRegion + contains the true bounding region covered by the control + including any adornment, while rNativeContentRegion contains the area + within the control that can be safely drawn into without drawing over + the borders of the control. + + @param rControlRegion + The bounding region of the control in VCL frame coordinates. + + @param aValue + An optional value (tristate/numerical/string) + + @param rControlHandle + Carries platform dependent data and is maintained by the SalFrame implementation. + + @param aCaption + A caption or title string (like button text etc.) + */ + virtual BOOL getNativeControlRegion( ControlType type, ControlPart part, + const Region& rControlRegion, ControlState nControlState, + const ImplControlValue& aValue, SalControlHandle& rControlHandle, + const rtl::OUString& aCaption, + Region &rNativeBoundingRegion, Region &rNativeContentRegion ); +}; \ No newline at end of file diff --git a/vcl/unx/kde4/KDESalInstance.cxx b/vcl/unx/kde4/KDESalInstance.cxx new file mode 100644 index 000000000000..b9aab9a0184a --- /dev/null +++ b/vcl/unx/kde4/KDESalInstance.cxx @@ -0,0 +1,35 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "KDESalInstance.hxx" + +#include "KDESalFrame.hxx" + +SalFrame* KDESalInstance::CreateFrame( SalFrame *pParent, ULONG nState ) +{ + return new KDESalFrame( pParent, nState ); +} \ No newline at end of file diff --git a/vcl/unx/kde4/KDESalInstance.hxx b/vcl/unx/kde4/KDESalInstance.hxx new file mode 100644 index 000000000000..6f0b268cc397 --- /dev/null +++ b/vcl/unx/kde4/KDESalInstance.hxx @@ -0,0 +1,41 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#pragma once + +#include + +class SalYieldMutex; +class SalFrame; + +class KDESalInstance : public X11SalInstance +{ + public: + KDESalInstance( SalYieldMutex* pMutex ) : X11SalInstance( pMutex ) {} + virtual ~KDESalInstance() {} + virtual SalFrame* CreateFrame( SalFrame* pParent, ULONG nStyle ); +}; \ No newline at end of file diff --git a/vcl/unx/kde4/KDEXLib.cxx b/vcl/unx/kde4/KDEXLib.cxx new file mode 100644 index 000000000000..dedda64d157e --- /dev/null +++ b/vcl/unx/kde4/KDEXLib.cxx @@ -0,0 +1,178 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "VCLKDEApplication.hxx" + +#define Region QtXRegion + +#include +#include +#include +#include +#include + +#undef Region + +#include "KDEXLib.hxx" + +#include +#include + +#include +#include + +#include "KDESalDisplay.hxx" + +#if OSL_DEBUG_LEVEL > 1 +#include +#endif + +KDEXLib::KDEXLib() : + SalXLib(), m_bStartupDone(false), m_pApplication(0), + m_pFreeCmdLineArgs(0), m_pAppCmdLineArgs(0), m_nFakeCmdLineArgs( 0 ) +{ +} + +KDEXLib::~KDEXLib() +{ + delete (VCLKDEApplication*)m_pApplication; + + // free the faked cmdline arguments no longer needed by KApplication + for( int i = 0; i < m_nFakeCmdLineArgs; i++ ) + { + free( m_pFreeCmdLineArgs[i] ); + } + + delete [] m_pFreeCmdLineArgs; + delete [] m_pAppCmdLineArgs; +} + +void KDEXLib::Init() +{ + SalI18N_InputMethod* pInputMethod = new SalI18N_InputMethod; + pInputMethod->SetLocale(); + XrmInitialize(); + + KAboutData *kAboutData = new KAboutData("OpenOffice.org", + "kdelibs4", + ki18n( "OpenOffice.org" ), + "3.0.0", + ki18n( "OpenOffice.org with KDE Native Widget Support." ), + KAboutData::License_LGPL, + ki18n( "Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Novell, Inc"), + ki18n( "OpenOffice.org is an office suite.\n" ), + "http://kde.openoffice.org/index.html", + "dev@kde.openoffice.org" ); + + kAboutData->addAuthor( ki18n( "Jan Holesovsky" ), + ki18n( "Original author and maintainer of the KDE NWF." ), + "kendy@artax.karlin.mff.cuni.cz", + "http://artax.karlin.mff.cuni.cz/~kendy" ); + kAboutData->addAuthor( ki18n("Roman Shtylman"), + ki18n( "Porting to KDE 4." ), + "shtylman@gmail.com", "http://shtylman.com" ); + kAboutData->addAuthor( ki18n("Eric Bischoff"), + ki18n( "Accessibility fixes, porting to KDE 4." ), + "bischoff@kde.org" ); + + //kAboutData->setProgramIconName("OpenOffice"); + + m_nFakeCmdLineArgs = 1; + USHORT nIdx; + vos::OExtCommandLine aCommandLine; + int nParams = aCommandLine.getCommandArgCount(); + rtl::OString aDisplay; + rtl::OUString aParam, aBin; + + for ( nIdx = 0; nIdx < nParams; ++nIdx ) + { + aCommandLine.getCommandArg( nIdx, aParam ); + if ( !m_pFreeCmdLineArgs && aParam.equalsAscii( "-display" ) && nIdx + 1 < nParams ) + { + aCommandLine.getCommandArg( nIdx + 1, aParam ); + aDisplay = rtl::OUStringToOString( aParam, osl_getThreadTextEncoding() ); + + m_nFakeCmdLineArgs = 3; + m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; + m_pFreeCmdLineArgs[ 1 ] = strdup( "-display" ); + m_pFreeCmdLineArgs[ 2 ] = strdup( aDisplay.getStr() ); + } + } + if ( !m_pFreeCmdLineArgs ) + m_pFreeCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; + + osl_getExecutableFile( &aParam.pData ); + osl_getSystemPathFromFileURL( aParam.pData, &aBin.pData ); + rtl::OString aExec = rtl::OUStringToOString( aBin, osl_getThreadTextEncoding() ); + m_pFreeCmdLineArgs[0] = strdup( aExec.getStr() ); + + // make a copy of the string list for freeing it since + // KApplication manipulates the pointers inside the argument vector + // note: KApplication bad ! + m_pAppCmdLineArgs = new char*[ m_nFakeCmdLineArgs ]; + for( int i = 0; i < m_nFakeCmdLineArgs; i++ ) + m_pAppCmdLineArgs[i] = m_pFreeCmdLineArgs[i]; + + KCmdLineArgs::init( m_nFakeCmdLineArgs, m_pAppCmdLineArgs, kAboutData ); + + m_pApplication = new VCLKDEApplication(); + kapp->disableSessionManagement(); + KApplication::setQuitOnLastWindowClosed(false); + + Display* pDisp = QX11Info::display(); + SalKDEDisplay *pSalDisplay = new SalKDEDisplay(pDisp); + + ((VCLKDEApplication*)m_pApplication)->disp = pSalDisplay; + + XSetIOErrorHandler ( (XIOErrorHandler)X11SalData::XIOErrorHdl ); + XSetErrorHandler ( (XErrorHandler)X11SalData::XErrorHdl ); + + pInputMethod->CreateMethod( pDisp ); + pInputMethod->AddConnectionWatch( pDisp, (void*)this ); + pSalDisplay->SetInputMethod( pInputMethod ); + + PushXErrorLevel( true ); + SalI18N_KeyboardExtension *pKbdExtension = new SalI18N_KeyboardExtension( pDisp ); + XSync( pDisp, False ); + + pKbdExtension->UseExtension( ! HasXErrorOccured() ); + PopXErrorLevel(); + + pSalDisplay->SetKbdExtension( pKbdExtension ); +} + +void KDEXLib::doStartup() +{ + if( ! m_bStartupDone ) + { + KStartupInfo::appStarted(); + m_bStartupDone = true; + #if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "called KStartupInfo::appStarted()\n" ); + #endif + } +} \ No newline at end of file diff --git a/vcl/unx/kde4/KDEXLib.hxx b/vcl/unx/kde4/KDEXLib.hxx new file mode 100644 index 000000000000..0380db7212ef --- /dev/null +++ b/vcl/unx/kde4/KDEXLib.hxx @@ -0,0 +1,48 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#pragma once + +#include + +class KDEXLib : public SalXLib +{ + private: + bool m_bStartupDone; + void* m_pApplication; + char** m_pFreeCmdLineArgs; + char** m_pAppCmdLineArgs; + int m_nFakeCmdLineArgs; + + public: + KDEXLib(); + + virtual ~KDEXLib(); + virtual void Init(); + + void doStartup(); +}; diff --git a/svtools/source/misc/iniprop.cxx b/vcl/unx/kde4/VCLKDEApplication.cxx similarity index 69% rename from svtools/source/misc/iniprop.cxx rename to vcl/unx/kde4/VCLKDEApplication.cxx index 16e0e5bc48a7..29adcae6ceff 100644 --- a/svtools/source/misc/iniprop.cxx +++ b/vcl/unx/kde4/VCLKDEApplication.cxx @@ -2,13 +2,10 @@ * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * Copyright 2008 by Sun Microsystems, Inc. + * Copyright 2009 by Sun Microsystems, Inc. * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: iniprop.cxx,v $ - * $Revision: 1.4 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -28,20 +25,28 @@ * ************************************************************************/ -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_svtools.hxx" +#include "VCLKDEApplication.hxx" +#define Region QtXRegion +#include +#undef Region -#include "iniprop.hxx" +#include "KDESalDisplay.hxx" -//------------------------------------------------------------------------- - -TYPEINIT1(SfxAppIniManagerProperty, ApplicationProperty); - -//------------------------------------------------------------------------- - -SfxAppIniManagerProperty::~SfxAppIniManagerProperty() +VCLKDEApplication::VCLKDEApplication() : + KApplication() { + disp = 0; } +bool VCLKDEApplication::x11EventFilter(XEvent* event) +{ + //if we have a display and the display consumes the event + //do not process the event in qt + if (disp && disp->Dispatch(event) > 0) + { + return true; + } + return false; +} \ No newline at end of file diff --git a/vcl/unx/kde4/VCLKDEApplication.hxx b/vcl/unx/kde4/VCLKDEApplication.hxx new file mode 100644 index 000000000000..839b664ea8d2 --- /dev/null +++ b/vcl/unx/kde4/VCLKDEApplication.hxx @@ -0,0 +1,53 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#pragma once + +#define Region QtXRegion + +#include + +#include + +#undef Region + +class SalKDEDisplay; + +/* #i59042# override KApplications method for session management + * since it will interfere badly with our own. + */ +class VCLKDEApplication : public KApplication +{ + public: + VCLKDEApplication(); + + virtual void commitData(QSessionManager&) {}; + + virtual bool x11EventFilter(XEvent* event); + + SalKDEDisplay* disp; +}; \ No newline at end of file diff --git a/vcl/unx/kde4/main.cxx b/vcl/unx/kde4/main.cxx new file mode 100644 index 000000000000..798990c06466 --- /dev/null +++ b/vcl/unx/kde4/main.cxx @@ -0,0 +1,93 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2009 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#define Region QtXRegion +#include +#undef Region + +#include "KDEData.hxx" +#include "KDESalInstance.hxx" + +#if OSL_DEBUG_LEVEL > 1 +#include +#endif + +#include + +/// entry point for the KDE4 VCL plugin +extern "C" { + VCL_DLLPUBLIC SalInstance* create_SalInstance( oslModule ) + { + /* #i92121# workaround deadlocks in the X11 implementation + */ + static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" ); + /* #i90094# + from now on we know that an X connection will be + established, so protect X against itself + */ + if( ! ( pNoXInitThreads && *pNoXInitThreads ) ) + XInitThreads(); + +#if QT_VERSION < 0x050000 + // Qt 4.x support needs >= 4.1.0 + rtl::OString aVersion( qVersion() ); +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "qt version string is \"%s\"\n", aVersion.getStr() ); +#endif + sal_Int32 nIndex = 0, nMajor = 0, nMinor = 0, nMicro = 0; + nMajor = aVersion.getToken( 0, '.', nIndex ).toInt32(); + if( nIndex > 0 ) + nMinor = aVersion.getToken( 0, '.', nIndex ).toInt32(); + if( nIndex > 0 ) + nMicro = aVersion.getToken( 0, '.', nIndex ).toInt32(); + if( nMajor != 4 || nMinor < 1 ) + { +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "unsuitable qt version %d.%d.%d\n", nMajor, nMinor, nMicro ); +#endif + return NULL; + } +#endif + + KDESalInstance* pInstance = new KDESalInstance( new SalYieldMutex() ); +#if OSL_DEBUG_LEVEL > 1 + fprintf( stderr, "created KDESalInstance 0x%p\n", pInstance ); +#endif + + // initialize SalData + KDEData *salData = new KDEData(); + SetSalData(salData); + salData->m_pInstance = pInstance; + salData->Init(); + salData->initNWF(); + + return pInstance; + } +} diff --git a/vcl/unx/kde4/makefile.mk b/vcl/unx/kde4/makefile.mk new file mode 100644 index 000000000000..48a2dc87c3a6 --- /dev/null +++ b/vcl/unx/kde4/makefile.mk @@ -0,0 +1,92 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.10 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/.. + +PRJNAME=vcl +TARGET=kde4plug +.INCLUDE : $(PRJ)$/util$/makefile.pmk + +# workaround for makedepend hang +MKDEPENDSOLVER= + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/util$/makefile2.pmk + +# For some of the included external KDE headers, GCC complains about shadowed +# symbols in instantiated template code only at the end of a compilation unit, +# so the only solution is to disable that warning here: +.IF "$(COM)" == "GCC" +CFLAGSCXX+=-Wno-shadow +.ENDIF + +# --- Files -------------------------------------------------------- + +.IF "$(GUIBASE)"!="unx" + +dummy: + @echo "Nothing to build for GUIBASE $(GUIBASE)" + +.ELSE # "$(GUIBASE)"!="unx" + +.IF "$(ENABLE_KDE4)" != "" + +CFLAGS+=$(KDE4_CFLAGS) + +.IF "$(ENABLE_RANDR)" != "" +CDEFS+=-DUSE_RANDR +.ENDIF + +SLOFILES=\ + $(SLO)$/main.obj \ + $(SLO)$/VCLKDEApplication.obj \ + $(SLO)$/KDEXLib.obj \ + $(SLO)$/KDESalDisplay.obj \ + $(SLO)$/KDESalFrame.obj \ + $(SLO)$/KDESalGraphics.obj \ + $(SLO)$/KDESalInstance.obj \ + $(SLO)$/KDEData.obj + + +.ELSE # "$(ENABLE_KDE4)" != "" + +dummy: + @echo KDE disabled - nothing to build +.ENDIF +.ENDIF # "$(GUIBASE)"!="unx" + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + +.INCLUDE : $(PRJ)$/util$/target.pmk diff --git a/vcl/unx/source/app/salinst.cxx b/vcl/unx/source/app/salinst.cxx index c160ea4c2fa5..6b7753960290 100644 --- a/vcl/unx/source/app/salinst.cxx +++ b/vcl/unx/source/app/salinst.cxx @@ -35,6 +35,8 @@ #include #include +#include + #include "salunx.h" #include "saldata.hxx" @@ -48,7 +50,7 @@ #include "vcl/salwtype.hxx" #include "vcl/salatype.hxx" #include "vcl/helper.hxx" - +#include #include "vos/mutex.hxx" // ------------------------------------------------------------------------- @@ -61,6 +63,7 @@ SalYieldMutex::SalYieldMutex() { mnCount = 0; mnThreadId = 0; + ::tools::SolarMutex::SetSolarMutex( this ); } void SalYieldMutex::acquire() @@ -103,6 +106,16 @@ extern "C" { VCL_DLLPUBLIC SalInstance* create_SalInstance() { + /* #i92121# workaround deadlocks in the X11 implementation + */ + static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" ); + /* #i90094# + from now on we know that an X connection will be + established, so protect X against itself + */ + if( ! ( pNoXInitThreads && *pNoXInitThreads ) ) + XInitThreads(); + X11SalInstance* pInstance = new X11SalInstance( new SalYieldMutex() ); // initialize SalData @@ -129,6 +142,7 @@ X11SalInstance::~X11SalInstance() delete pSalData; SetSalData( NULL ); + ::tools::SolarMutex::SetSolarMutex( 0 ); delete mpSalYieldMutex; } @@ -403,3 +417,20 @@ void X11SalInstance::FillFontPathList( std::list< rtl::OString >& o_rFontPaths ) #endif /* SOLARIS */ } +extern "C" { static void SAL_CALL thisModule() {} } + +void X11SalInstance::AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType) +{ + const rtl::OUString SYM_ADD_TO_RECENTLY_USED_FILE_LIST(RTL_CONSTASCII_USTRINGPARAM("add_to_recently_used_file_list")); + const rtl::OUString LIB_RECENT_FILE(RTL_CONSTASCII_USTRINGPARAM("librecentfile.so")); + typedef void (*PFUNC_ADD_TO_RECENTLY_USED_LIST)(const rtl::OUString&, const rtl::OUString&); + + PFUNC_ADD_TO_RECENTLY_USED_LIST add_to_recently_used_file_list = 0; + + osl::Module module; + module.loadRelative( &thisModule, LIB_RECENT_FILE ); + if (module.is()) + add_to_recently_used_file_list = (PFUNC_ADD_TO_RECENTLY_USED_LIST)module.getFunctionSymbol(SYM_ADD_TO_RECENTLY_USED_FILE_LIST); + if (add_to_recently_used_file_list) + add_to_recently_used_file_list(rFileUrl, rMimeType); +} diff --git a/vcl/unx/source/app/sm.cxx b/vcl/unx/source/app/sm.cxx index 7e4e16579623..c5605cec1dfb 100644 --- a/vcl/unx/source/app/sm.cxx +++ b/vcl/unx/source/app/sm.cxx @@ -48,6 +48,7 @@ #include #include #include +#include #include #include @@ -113,7 +114,7 @@ void IceSalSession::queryInteraction() void IceSalSession::interactionDone() { - SessionManagerClient::interactionDone(); + SessionManagerClient::interactionDone( false ); } void IceSalSession::saveDone() @@ -128,6 +129,7 @@ void IceSalSession::saveDone() bool IceSalSession::cancelShutdown() { + SessionManagerClient::interactionDone( true ); return false; } @@ -187,6 +189,7 @@ bool SessionManagerClient::bDocSaveDone = false; static SmProp* pSmProps = NULL; static SmProp** ppSmProps = NULL; static int nSmProps = 0; +static unsigned char *pSmRestartHint = NULL; static void BuildSmPropertyList() @@ -195,7 +198,7 @@ static void BuildSmPropertyList() { ByteString aExec( SessionManagerClient::getExecName(), osl_getThreadTextEncoding() ); - nSmProps = 4; + nSmProps = 5; pSmProps = new SmProp[ nSmProps ]; pSmProps[ 0 ].name = const_cast(SmCloneCommand); @@ -243,6 +246,15 @@ static void BuildSmPropertyList() pSmProps[ 3 ].vals->value = strdup( aUser.getStr() ); pSmProps[ 3 ].vals->length = strlen( (char *)pSmProps[ 3 ].vals->value )+1; + pSmProps[ 4 ].name = const_cast(SmRestartStyleHint); + pSmProps[ 4 ].type = const_cast(SmCARD8); + pSmProps[ 4 ].num_vals = 1; + pSmProps[ 4 ].vals = new SmPropValue; + pSmProps[ 4 ].vals->value = malloc(1); + pSmRestartHint = (unsigned char *)pSmProps[ 4 ].vals->value; + *pSmRestartHint = SmRestartIfRunning; + pSmProps[ 4 ].vals->length = 1; + ppSmProps = new SmProp*[ nSmProps ]; for( int i = 0; i < nSmProps; i++ ) ppSmProps[ i ] = &pSmProps[i]; @@ -257,6 +269,31 @@ bool SessionManagerClient::checkDocumentsSaved() IMPL_STATIC_LINK( SessionManagerClient, SaveYourselfHdl, void*, EMPTYARG ) { SMprintf( "posting save documents event shutdown = %s\n", (pThis!=0) ? "true" : "false" ); + + static bool bFirstShutdown=true; + if (pThis != 0 && bFirstShutdown) //first shutdown request + { + bFirstShutdown = false; + /* + If we have no actual frames open, e.g. we launched a quickstarter, + and then shutdown all our frames leaving just a quickstarter running, + then we don't want to launch an empty toplevel frame on the next + start. (The job of scheduling the restart of the quick-starter is a + task of the quick-starter) + */ + *pSmRestartHint = SmRestartNever; + const std::list< SalFrame* >& rFrames = GetX11SalData()->GetDisplay()->getFrames(); + for( std::list< SalFrame* >::const_iterator it = rFrames.begin(); it != rFrames.end(); ++it ) + { + Window *pWindow = (*it)->GetWindow(); + if (pWindow && pWindow->IsVisible()) + { + *pSmRestartHint = SmRestartIfRunning; + break; + } + } + } + if( pOneInstance ) { SalSessionSaveRequestEvent aEvent( pThis != 0, false ); @@ -332,6 +369,12 @@ void SessionManagerClient::SaveYourselfProc( IMPL_STATIC_LINK_NOINSTANCE( SessionManagerClient, ShutDownHdl, void*, EMPTYARG ) { + if( pOneInstance ) + { + SalSessionQuitEvent aEvent; + pOneInstance->CallCallback( &aEvent ); + } + const std::list< SalFrame* >& rFrames = GetX11SalData()->GetDisplay()->getFrames(); SMprintf( rFrames.begin() != rFrames.end() ? "shutdown on first frame\n" : "shutdown event but no frame\n" ); if( rFrames.begin() != rFrames.end() ) @@ -385,7 +428,7 @@ void SessionManagerClient::saveDone() ICEConnectionObserver::lock(); SmcSetProperties( aSmcConnection, nSmProps, ppSmProps ); SmcSaveYourselfDone( aSmcConnection, True ); - SMprintf( "sent SaveYourselfDone\n" ); + SMprintf( "sent SaveYourselfDone SmRestartHint of %d\n", *pSmRestartHint ); bDocSaveDone = true; ICEConnectionObserver::unlock(); } @@ -490,12 +533,12 @@ bool SessionManagerClient::queryInteraction() return bRet; } -void SessionManagerClient::interactionDone() +void SessionManagerClient::interactionDone( bool bCancelShutdown ) { if( aSmcConnection ) { ICEConnectionObserver::lock(); - SmcInteractDone( aSmcConnection, False ); + SmcInteractDone( aSmcConnection, bCancelShutdown ? True : False ); ICEConnectionObserver::unlock(); } } diff --git a/vcl/unx/source/desktopdetect/desktopdetector.cxx b/vcl/unx/source/desktopdetect/desktopdetector.cxx new file mode 100644 index 000000000000..07fb18fa8344 --- /dev/null +++ b/vcl/unx/source/desktopdetect/desktopdetector.cxx @@ -0,0 +1,346 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: salplug.cxx,v $ + * $Revision: 1.30 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#include +#include +#include +#include + +#include "vcl/dllapi.h" + +#include "rtl/ustrbuf.hxx" +#include "osl/module.h" +#include "osl/process.h" +#include "osl/thread.h" + +#include + +using namespace rtl; + +enum { + DESKTOP_NONE = 0, + DESKTOP_UNKNOWN, + DESKTOP_GNOME, + DESKTOP_KDE, + DESKTOP_KDE4, + DESKTOP_CDE +}; + +static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4", "CDE" }; + +static bool is_gnome_desktop( Display* pDisplay ) +{ + bool ret = false; + + // warning: these checks are coincidental, GNOME does not + // explicitly advertise itself + + if ( NULL != getenv( "GNOME_DESKTOP_SESSION_ID" ) ) + ret = true; + + if( ! ret ) + { + Atom nAtom1 = XInternAtom( pDisplay, "GNOME_SM_PROXY", True ); + Atom nAtom2 = XInternAtom( pDisplay, "NAUTILUS_DESKTOP_WINDOW_ID", True ); + if( nAtom1 || nAtom2 ) + { + int nProperties = 0; + Atom* pProperties = XListProperties( pDisplay, DefaultRootWindow( pDisplay ), &nProperties ); + if( pProperties && nProperties ) + { + for( int i = 0; i < nProperties; i++ ) + if( pProperties[ i ] == nAtom1 || + pProperties[ i ] == nAtom2 ) + { + ret = true; + } + XFree( pProperties ); + } + } + } + + if( ! ret ) + { + Atom nUTFAtom = XInternAtom( pDisplay, "UTF8_STRING", True ); + Atom nNetWMNameAtom = XInternAtom( pDisplay, "_NET_WM_NAME", True ); + if( nUTFAtom && nNetWMNameAtom ) + { + // another, more expensive check: search for a gnome-panel + XLIB_Window aRoot, aParent, *pChildren = NULL; + unsigned int nChildren = 0; + XQueryTree( pDisplay, DefaultRootWindow( pDisplay ), + &aRoot, &aParent, &pChildren, &nChildren ); + if( pChildren && nChildren ) + { + for( unsigned int i = 0; i < nChildren && ! ret; i++ ) + { + Atom nType = None; + int nFormat = 0; + unsigned long nItems = 0, nBytes = 0; + unsigned char* pProp = NULL; + XGetWindowProperty( pDisplay, + pChildren[i], + nNetWMNameAtom, + 0, 8, + False, + nUTFAtom, + &nType, + &nFormat, + &nItems, + &nBytes, + &pProp ); + if( pProp && nType == nUTFAtom ) + { + OString aWMName( (sal_Char*)pProp ); + if( aWMName.equalsIgnoreAsciiCase( "gnome-panel" ) ) + ret = true; + } + if( pProp ) + XFree( pProp ); + } + XFree( pChildren ); + } + } + } + + return ret; +} + +static bool bWasXError = false; + +static inline bool WasXError() +{ + bool bRet = bWasXError; + bWasXError = false; + return bRet; +} + +extern "C" +{ + static int autodect_error_handler( Display*, XErrorEvent* ) + { + bWasXError = true; + return 0; + } + + typedef int(* XErrorHandler)(Display*,XErrorEvent*); +} + +static int KDEVersion( Display* pDisplay ) +{ + int nRet = 0; + + Atom nFullSession = XInternAtom( pDisplay, "KDE_FULL_SESSION", True ); + Atom nKDEVersion = XInternAtom( pDisplay, "KDE_SESSION_VERSION", True ); + + if( nFullSession ) + { + if( !nKDEVersion ) + return 3; + + Atom aRealType = None; + int nFormat = 8; + unsigned long nItems = 0; + unsigned long nBytesLeft = 0; + unsigned char* pProperty = NULL; + XGetWindowProperty( pDisplay, + DefaultRootWindow( pDisplay ), + nKDEVersion, + 0, 1, + False, + AnyPropertyType, + &aRealType, + &nFormat, + &nItems, + &nBytesLeft, + &pProperty ); + if( !WasXError() && nItems != 0 && pProperty ) + { + nRet = *reinterpret_cast< sal_Int32* >( pProperty ); + } + if( pProperty ) + { + XFree( pProperty ); + pProperty = NULL; + } + } + return nRet; +} + +static bool is_kde_desktop( Display* pDisplay ) +{ + if ( NULL != getenv( "KDE_FULL_SESSION" ) ) + { + const char *pVer = getenv( "KDE_SESSION_VERSION" ); + if ( !pVer || pVer[0] == '0' ) + { + return true; // does not exist => KDE3 + } + + rtl::OUString aVer( RTL_CONSTASCII_USTRINGPARAM( "3" ) ); + if ( aVer.equalsIgnoreAsciiCaseAscii( pVer ) ) + { + return true; + } + } + + if ( KDEVersion( pDisplay ) == 3 ) + return true; + + return false; +} + +static bool is_kde4_desktop( Display* pDisplay ) +{ + if ( NULL != getenv( "KDE_FULL_SESSION" ) ) + { + rtl::OUString aVer( RTL_CONSTASCII_USTRINGPARAM( "4" ) ); + + const char *pVer = getenv( "KDE_SESSION_VERSION" ); + if ( pVer && aVer.equalsIgnoreAsciiCaseAscii( pVer ) ) + return true; + } + + if ( KDEVersion( pDisplay ) == 4 ) + return true; + + return false; +} + +static bool is_cde_desktop( Display* pDisplay ) +{ + void* pLibrary = NULL; + + Atom nDtAtom = XInternAtom( pDisplay, "_DT_WM_READY", True ); + OUString aPathName( RTL_CONSTASCII_USTRINGPARAM( "file:///usr/dt/lib/libDtSvc.so" ) ); + if( nDtAtom && ( pLibrary = osl_loadModule( aPathName.pData, SAL_LOADMODULE_DEFAULT ) ) ) + { + osl_unloadModule( (oslModule)pLibrary ); + return true; + } + + return false; +} + + +extern "C" +{ + +VCL_DLLPUBLIC rtl::OUString get_desktop_environment() +{ + rtl::OUStringBuffer aRet( 8 ); + static const char *pOverride = getenv( "OOO_FORCE_DESKTOP" ); + + if ( pOverride && *pOverride ) + { + OString aOver( pOverride ); + + if ( aOver.equalsIgnoreAsciiCase( "cde" ) ) + aRet.appendAscii( desktop_strings[DESKTOP_CDE] ); + if ( aOver.equalsIgnoreAsciiCase( "kde4" ) ) + aRet.appendAscii( desktop_strings[DESKTOP_KDE4] ); + if ( aOver.equalsIgnoreAsciiCase( "gnome" ) ) + aRet.appendAscii( desktop_strings[DESKTOP_GNOME] ); + if ( aOver.equalsIgnoreAsciiCase( "kde" ) ) + aRet.appendAscii( desktop_strings[DESKTOP_KDE] ); + if ( aOver.equalsIgnoreAsciiCase( "none" ) ) + aRet.appendAscii( desktop_strings[DESKTOP_UNKNOWN] ); + } + + if( aRet.getLength() == 0 ) + { + // get display to connect to + const char* pDisplayStr = getenv( "DISPLAY" ); + int nParams = osl_getCommandArgCount(); + OUString aParam; + OString aBParm; + for( int i = 0; i < nParams; i++ ) + { + osl_getCommandArg( i, &aParam.pData ); + if( aParam.equalsAscii( "-headless" ) ) + { + pDisplayStr = NULL; + break; + } + if( i < nParams-1 && (aParam.equalsAscii( "-display" ) || aParam.equalsAscii( "--display" )) ) + { + osl_getCommandArg( i+1, &aParam.pData ); + aBParm = OUStringToOString( aParam, osl_getThreadTextEncoding() ); + pDisplayStr = aBParm.getStr(); + break; + } + } + + // no server at all + if( ! pDisplayStr || !*pDisplayStr ) + aRet.appendAscii( desktop_strings[DESKTOP_NONE] ); + else + { + /* #i92121# workaround deadlocks in the X11 implementation + */ + static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" ); + /* #i90094# + from now on we know that an X connection will be + established, so protect X against itself + */ + if( ! ( pNoXInitThreads && *pNoXInitThreads ) ) + XInitThreads(); + + Display* pDisplay = XOpenDisplay( pDisplayStr ); + if( pDisplay ) + { + XErrorHandler pOldHdl = XSetErrorHandler( autodect_error_handler ); + + if ( is_kde4_desktop( pDisplay ) ) + aRet.appendAscii( desktop_strings[DESKTOP_KDE4] ); + else if ( is_gnome_desktop( pDisplay ) ) + aRet.appendAscii( desktop_strings[DESKTOP_GNOME] ); + else if ( is_cde_desktop( pDisplay ) ) + aRet.appendAscii( desktop_strings[DESKTOP_CDE] ); + else if ( is_kde_desktop( pDisplay ) ) + aRet.appendAscii( desktop_strings[DESKTOP_KDE] ); + else + aRet.appendAscii( desktop_strings[DESKTOP_UNKNOWN] ); + + // set the default handler again + XSetErrorHandler( pOldHdl ); + + XCloseDisplay( pDisplay ); + } + } + } + + return aRet.makeStringAndClear(); +} + +} diff --git a/vcl/unx/source/desktopdetect/makefile.mk b/vcl/unx/source/desktopdetect/makefile.mk new file mode 100644 index 000000000000..cc845ee34887 --- /dev/null +++ b/vcl/unx/source/desktopdetect/makefile.mk @@ -0,0 +1,61 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.8 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/..$/.. + +PRJNAME=vcl +TARGET=dtdetect + +.INCLUDE : $(PRJ)$/util$/makefile.pmk + +# --- Settings ----------------------------------------------------- + +.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/util$/makefile2.pmk + +# --- Files -------------------------------------------------------- + +.IF "$(GUIBASE)"!="unx" + +dummy: + @echo "Nothing to build for GUIBASE $(GUIBASE)" + +.ELSE # "$(GUIBASE)"!="unx" + +SLOFILES=$(SLO)$/desktopdetector.obj + +.ENDIF # "$(GUIBASE)"!="unx" + +# --- Targets ------------------------------------------------------ + +.INCLUDE : target.mk + +.INCLUDE : $(PRJ)$/util$/target.pmk diff --git a/dtrans/source/X11/X11_clipboard.cxx b/vcl/unx/source/dtrans/X11_clipboard.cxx similarity index 99% rename from dtrans/source/X11/X11_clipboard.cxx rename to vcl/unx/source/dtrans/X11_clipboard.cxx index ddef361e0670..0a47076f0d09 100644 --- a/dtrans/source/X11/X11_clipboard.cxx +++ b/vcl/unx/source/dtrans/X11_clipboard.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include #include diff --git a/dtrans/source/X11/X11_clipboard.hxx b/vcl/unx/source/dtrans/X11_clipboard.hxx similarity index 100% rename from dtrans/source/X11/X11_clipboard.hxx rename to vcl/unx/source/dtrans/X11_clipboard.hxx diff --git a/dtrans/source/X11/X11_dndcontext.cxx b/vcl/unx/source/dtrans/X11_dndcontext.cxx similarity index 99% rename from dtrans/source/X11/X11_dndcontext.cxx rename to vcl/unx/source/dtrans/X11_dndcontext.cxx index b9d8f10efa23..59832c27c2a7 100644 --- a/dtrans/source/X11/X11_dndcontext.cxx +++ b/vcl/unx/source/dtrans/X11_dndcontext.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include #include diff --git a/dtrans/source/X11/X11_dndcontext.hxx b/vcl/unx/source/dtrans/X11_dndcontext.hxx similarity index 100% rename from dtrans/source/X11/X11_dndcontext.hxx rename to vcl/unx/source/dtrans/X11_dndcontext.hxx diff --git a/dtrans/source/X11/X11_droptarget.cxx b/vcl/unx/source/dtrans/X11_droptarget.cxx similarity index 82% rename from dtrans/source/X11/X11_droptarget.cxx rename to vcl/unx/source/dtrans/X11_droptarget.cxx index 501eff09ead8..153514c668a0 100644 --- a/dtrans/source/X11/X11_droptarget.cxx +++ b/vcl/unx/source/dtrans/X11_droptarget.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include @@ -143,15 +143,13 @@ void DropTarget::setDefaultActions( sal_Int8 actions ) throw() void DropTarget::drop( const DropTargetDropEvent& dtde ) throw() { - ::osl::Guard< ::osl::Mutex > aGuard( m_aMutex ); + osl::ClearableGuard< ::osl::Mutex > aGuard( m_aMutex ); + std::list< Reference< XDropTargetListener > > aListeners( m_aListeners ); + aGuard.clear(); - ::std::list< Reference< XDropTargetListener > >::iterator it1, it2; - it1 = m_aListeners.begin(); - while( it1 != m_aListeners.end() ) + for( std::list< Reference< XDropTargetListener > >::iterator it = aListeners.begin(); it!= aListeners.end(); ++it ) { - it2 = it1; - it1++; - (*it2)->drop( dtde ); + (*it)->drop( dtde ); } } @@ -159,15 +157,13 @@ void DropTarget::drop( const DropTargetDropEvent& dtde ) throw() void DropTarget::dragEnter( const DropTargetDragEnterEvent& dtde ) throw() { - ::osl::Guard< ::osl::Mutex > aGuard( m_aMutex ); + osl::ClearableGuard< ::osl::Mutex > aGuard( m_aMutex ); + std::list< Reference< XDropTargetListener > > aListeners( m_aListeners ); + aGuard.clear(); - ::std::list< Reference< XDropTargetListener > >::iterator it1, it2; - it1 = m_aListeners.begin(); - while( it1 != m_aListeners.end() ) + for( std::list< Reference< XDropTargetListener > >::iterator it = aListeners.begin(); it!= aListeners.end(); ++it ) { - it2 = it1; - it1++; - (*it2)->dragEnter( dtde ); + (*it)->dragEnter( dtde ); } } @@ -175,15 +171,13 @@ void DropTarget::dragEnter( const DropTargetDragEnterEvent& dtde ) throw() void DropTarget::dragExit( const DropTargetEvent& dte ) throw() { - ::osl::Guard< ::osl::Mutex > aGuard( m_aMutex ); + osl::ClearableGuard< ::osl::Mutex > aGuard( m_aMutex ); + std::list< Reference< XDropTargetListener > > aListeners( m_aListeners ); + aGuard.clear(); - ::std::list< Reference< XDropTargetListener > >::iterator it1, it2; - it1 = m_aListeners.begin(); - while( it1 != m_aListeners.end() ) + for( std::list< Reference< XDropTargetListener > >::iterator it = aListeners.begin(); it!= aListeners.end(); ++it ) { - it2 = it1; - it1++; - (*it2)->dragExit( dte ); + (*it)->dragExit( dte ); } } @@ -191,15 +185,13 @@ void DropTarget::dragExit( const DropTargetEvent& dte ) throw() void DropTarget::dragOver( const DropTargetDragEvent& dtde ) throw() { - ::osl::Guard< ::osl::Mutex > aGuard( m_aMutex ); + osl::ClearableGuard< ::osl::Mutex > aGuard( m_aMutex ); + std::list< Reference< XDropTargetListener > > aListeners( m_aListeners ); + aGuard.clear(); - ::std::list< Reference< XDropTargetListener > >::iterator it1, it2; - it1 = m_aListeners.begin(); - while( it1 != m_aListeners.end() ) + for( std::list< Reference< XDropTargetListener > >::iterator it = aListeners.begin(); it!= aListeners.end(); ++it ) { - it2 = it1; - it1++; - (*it2)->dragOver( dtde ); + (*it)->dragOver( dtde ); } } diff --git a/dtrans/source/X11/X11_selection.cxx b/vcl/unx/source/dtrans/X11_selection.cxx similarity index 98% rename from dtrans/source/X11/X11_selection.cxx rename to vcl/unx/source/dtrans/X11_selection.cxx index 2a424984850a..c6036ae4f78e 100644 --- a/dtrans/source/X11/X11_selection.cxx +++ b/vcl/unx/source/dtrans/X11_selection.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include #include @@ -219,28 +219,64 @@ SelectionManager::SelectionManager() : m_aWindow( None ), m_nSelectionTimeout( 0 ), m_nSelectionTimestamp( CurrentTime ), + m_bDropEnterSent( true ), m_aCurrentDropWindow( None ), + m_nDropTime( None ), + m_nLastDropAction( 0 ), + m_nLastX( 0 ), + m_nLastY( 0 ), + m_nDropTimestamp( 0 ), m_bDropWaitingForCompletion( false ), m_aDropWindow( None ), m_aDropProxy( None ), m_aDragSourceWindow( None ), + m_nLastDragX( 0 ), + m_nLastDragY( 0 ), m_nNoPosX( 0 ), m_nNoPosY( 0 ), m_nNoPosWidth( 0 ), m_nNoPosHeight( 0 ), + m_nDragButton( 0 ), + m_nUserDragAction( 0 ), + m_nTargetAcceptAction( 0 ), + m_nSourceActions( 0 ), m_bLastDropAccepted( false ), m_bDropSuccess( false ), m_bDropSent( false ), m_bWaitingForPrimaryConversion( false ), + m_nDragTimestamp( None ), m_aMoveCursor( None ), m_aCopyCursor( None ), m_aLinkCursor( None ), m_aNoneCursor( None ), m_aCurrentCursor( None ), - m_nCurrentProtocolVersion( nXdndProtocolRevision ) + m_nCurrentProtocolVersion( nXdndProtocolRevision ), + m_nCLIPBOARDAtom( None ), + m_nTARGETSAtom( None ), + m_nTIMESTAMPAtom( None ), + m_nTEXTAtom( None ), + m_nINCRAtom( None ), + m_nCOMPOUNDAtom( None ), + m_nMULTIPLEAtom( None ), + m_nUTF16Atom( None ), + m_nImageBmpAtom( None ), + m_nXdndAware( None ), + m_nXdndEnter( None ), + m_nXdndLeave( None ), + m_nXdndPosition( None ), + m_nXdndStatus( None ), + m_nXdndDrop( None ), + m_nXdndFinished( None ), + m_nXdndSelection( None ), + m_nXdndTypeList( None ), + m_nXdndProxy( None ), + m_nXdndActionCopy( None ), + m_nXdndActionMove( None ), + m_nXdndActionLink( None ), + m_nXdndActionAsk( None ), + m_nXdndActionPrivate( None ) { m_aDropEnterEvent.data.l[0] = None; - m_bDropEnterSent = true; m_aDragRunning.reset(); } @@ -293,25 +329,11 @@ void SelectionManager::initialize( const Sequence< Any >& arguments ) throw (::c * registering us as XEventHandler on it. * * implementor's note: - * - * Because XDND implementations send their ClientMessage events with - * XSendEvent and event mask 0 (which is perfectly sensible) - * these events get only sent to the connection that created - * the window in question: the vcl display. - * - * So this whole service should be implemented in vcl where - * it belongs. But as usual the dogmatics win and the dogma says: - * "vcl bad, service good". So instead of making vcl a service - * providing library we make a new one that is "independent" of vcl, - * because it is not linked against it and dispatch every event of - * the vcl event loop to here via uno mechanisms (that is copying it, - * locking and unlocking mutexes). Well, the user has fast computers - * these days, so why do we need performance where more memory and - * a faster CPU will do the job ? - * And that is why this runs under the title: - * How NOT to implement a service - * or the victory of dogma over common sense. - * + * FIXME: + * finally the clipboard and XDND service is back in the module it belongs + * now cleanup and sharing of resources with the normal vcl event loop + * needs to be added. The display used whould be that of the normal event loop + * and synchronization should be done via the SolarMutex. */ if( arguments.getLength() > 0 ) arguments.getConstArray()[0] >>= m_xDisplayConnection; @@ -338,20 +360,8 @@ void SelectionManager::initialize( const Sequence< Any >& arguments ) throw (::c arguments.getConstArray()[2] >>= m_xBitmapConverter; } - int nParams = osl_getCommandArgCount(); OUString aParam; - bool bIsHeadless = false; - for( int i = 0; i < nParams; i++ ) - { - osl_getCommandArg( i, &aParam.pData ); - if( aParam.equalsAscii( "-headless" ) ) - { - bIsHeadless = true; - break; - } - } - - if( ! m_pDisplay && ! bIsHeadless ) + if( ! m_pDisplay ) { OUString aUDisplay; if( m_xDisplayConnection.is() ) @@ -515,6 +525,15 @@ SelectionManager::~SelectionManager() // destroy message window if( m_aWindow ) XDestroyWindow( m_pDisplay, m_aWindow ); + // release cursors + if (m_aMoveCursor != None) + XFreeCursor(m_pDisplay, m_aMoveCursor); + if (m_aCopyCursor != None) + XFreeCursor(m_pDisplay, m_aCopyCursor); + if (m_aLinkCursor != None) + XFreeCursor(m_pDisplay, m_aLinkCursor); + if (m_aNoneCursor != None) + XFreeCursor(m_pDisplay, m_aNoneCursor); // paranoia setting, the drag thread should have // done that already @@ -1117,7 +1136,7 @@ bool SelectionManager::getPasteData( Atom selection, const ::rtl::OUString& rTyp bSuccess = getPasteData( selection, m_nImageBmpAtom, rData ); #if OSL_DEBUG_LEVEL > 1 if( bSuccess ) - fprintf( stderr, "got %d bytes of image/bmp\n" ), (int)rData.getLength(); + fprintf( stderr, "got %d bytes of image/bmp\n", (int)rData.getLength() ); #endif if( ! bSuccess ) { @@ -1685,7 +1704,7 @@ bool SelectionManager::handleSelectionRequest( XSelectionRequestEvent& rRequest XA_INTEGER, 32, PropModeReplace, (const unsigned char*)&nTimeStamp, 1 ); aNotify.xselection.property = rRequest.property; #if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "sending timestamp: %d\n", nTimeStamp ); + fprintf( stderr, "sending timestamp: %d\n", (int)nTimeStamp ); #endif } else diff --git a/dtrans/source/X11/X11_selection.hxx b/vcl/unx/source/dtrans/X11_selection.hxx similarity index 100% rename from dtrans/source/X11/X11_selection.hxx rename to vcl/unx/source/dtrans/X11_selection.hxx diff --git a/vcl/unx/source/dtrans/X11_service.cxx b/vcl/unx/source/dtrans/X11_service.cxx new file mode 100644 index 000000000000..cf971a2f8eb6 --- /dev/null +++ b/vcl/unx/source/dtrans/X11_service.cxx @@ -0,0 +1,138 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: X11_service.cxx,v $ + * $Revision: 1.11 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#include "salinst.h" + +#include +#include +#include +#include +#include // declaration of generic uno interface +#include // mapping stuff +#include +#include + +using namespace rtl; +using namespace cppu; +using namespace com::sun::star::lang; +using namespace com::sun::star::datatransfer::clipboard; +using namespace com::sun::star::awt; +using namespace x11; + +Sequence< OUString > SAL_CALL x11::X11Clipboard_getSupportedServiceNames() +{ + Sequence< OUString > aRet(1); + aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.clipboard.SystemClipboard"); + return aRet; +} + +Sequence< OUString > SAL_CALL x11::Xdnd_getSupportedServiceNames() +{ + Sequence< OUString > aRet(1); + aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.dnd.X11DragSource"); + return aRet; +} + +Sequence< OUString > SAL_CALL x11::Xdnd_dropTarget_getSupportedServiceNames() +{ + Sequence< OUString > aRet(1); + aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.dnd.X11DropTarget"); + return aRet; +} + +// ------------------------------------------------------------------------ + +Reference< XInterface > X11SalInstance::CreateClipboard( const Sequence< Any >& arguments ) +{ + static std::hash_map< OUString, ::std::hash_map< Atom, Reference< XClipboard > >, ::rtl::OUStringHash > m_aInstances; + + OUString aDisplayName; + Atom nSelection; + + // extract display name from connection argument. An exception is thrown + // by SelectionManager.initialize() if no display connection is given. + if( arguments.getLength() > 0 ) + { + Reference< XDisplayConnection > xConn; + arguments.getConstArray()[0] >>= xConn; + + if( xConn.is() ) + { + Any aIdentifier = xConn->getIdentifier(); + aIdentifier >>= aDisplayName; + } + } + + SelectionManager& rManager = SelectionManager::get( aDisplayName ); + rManager.initialize( arguments ); + + // check if any other selection than clipboard selection is specified + if( arguments.getLength() > 1 ) + { + OUString aSelectionName; + + arguments.getConstArray()[1] >>= aSelectionName; + nSelection = rManager.getAtom( aSelectionName ); + } + else + { + // default atom is clipboard selection + nSelection = rManager.getAtom( OUString::createFromAscii( "CLIPBOARD" ) ); + } + + ::std::hash_map< Atom, Reference< XClipboard > >& rMap( m_aInstances[ aDisplayName ] ); + ::std::hash_map< Atom, Reference< XClipboard > >::iterator it = rMap.find( nSelection ); + if( it != rMap.end() ) + return it->second; + + X11Clipboard* pClipboard = new X11Clipboard( rManager, nSelection ); + rMap[ nSelection ] = pClipboard; + + return static_cast(pClipboard); +} + +// ------------------------------------------------------------------------ + +Reference< XInterface > X11SalInstance::CreateDragSource() +{ + return Reference < XInterface >( ( OWeakObject * ) new SelectionManagerHolder() ); +} + +// ------------------------------------------------------------------------ + +Reference< XInterface > X11SalInstance::CreateDropTarget() +{ + return Reference < XInterface >( ( OWeakObject * ) new DropTarget() ); +} + + diff --git a/dtrans/source/X11/X11_transferable.cxx b/vcl/unx/source/dtrans/X11_transferable.cxx similarity index 99% rename from dtrans/source/X11/X11_transferable.cxx rename to vcl/unx/source/dtrans/X11_transferable.cxx index d9dfa3a659a4..a95b87fe1c15 100644 --- a/dtrans/source/X11/X11_transferable.cxx +++ b/vcl/unx/source/dtrans/X11_transferable.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #if OSL_DEBUG_LEVEL > 1 #include diff --git a/dtrans/source/X11/X11_transferable.hxx b/vcl/unx/source/dtrans/X11_transferable.hxx similarity index 100% rename from dtrans/source/X11/X11_transferable.hxx rename to vcl/unx/source/dtrans/X11_transferable.hxx diff --git a/dtrans/source/X11/bmp.cxx b/vcl/unx/source/dtrans/bmp.cxx similarity index 99% rename from dtrans/source/X11/bmp.cxx rename to vcl/unx/source/dtrans/bmp.cxx index 372dad10b696..49219bfb0e2a 100644 --- a/dtrans/source/X11/bmp.cxx +++ b/vcl/unx/source/dtrans/bmp.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include #include diff --git a/dtrans/source/X11/bmp.hxx b/vcl/unx/source/dtrans/bmp.hxx similarity index 100% rename from dtrans/source/X11/bmp.hxx rename to vcl/unx/source/dtrans/bmp.hxx diff --git a/dtrans/source/X11/config.cxx b/vcl/unx/source/dtrans/config.cxx similarity index 99% rename from dtrans/source/X11/config.cxx rename to vcl/unx/source/dtrans/config.cxx index f2f8a0f19b90..2402fb4452c3 100644 --- a/dtrans/source/X11/config.cxx +++ b/vcl/unx/source/dtrans/config.cxx @@ -29,7 +29,7 @@ ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_dtrans.hxx" +#include "precompiled_vcl.hxx" #include #include diff --git a/dtrans/source/X11/copydata_curs.h b/vcl/unx/source/dtrans/copydata_curs.h similarity index 100% rename from dtrans/source/X11/copydata_curs.h rename to vcl/unx/source/dtrans/copydata_curs.h diff --git a/dtrans/source/X11/copydata_mask.h b/vcl/unx/source/dtrans/copydata_mask.h similarity index 100% rename from dtrans/source/X11/copydata_mask.h rename to vcl/unx/source/dtrans/copydata_mask.h diff --git a/dtrans/source/X11/linkdata_curs.h b/vcl/unx/source/dtrans/linkdata_curs.h similarity index 100% rename from dtrans/source/X11/linkdata_curs.h rename to vcl/unx/source/dtrans/linkdata_curs.h diff --git a/dtrans/source/X11/linkdata_mask.h b/vcl/unx/source/dtrans/linkdata_mask.h similarity index 100% rename from dtrans/source/X11/linkdata_mask.h rename to vcl/unx/source/dtrans/linkdata_mask.h diff --git a/dtrans/source/X11/makefile.mk b/vcl/unx/source/dtrans/makefile.mk similarity index 81% rename from dtrans/source/X11/makefile.mk rename to vcl/unx/source/dtrans/makefile.mk index 219033cb706d..6af3a7c75048 100644 --- a/dtrans/source/X11/makefile.mk +++ b/vcl/unx/source/dtrans/makefile.mk @@ -29,15 +29,13 @@ # #************************************************************************* -PRJ=..$/.. +PRJ=..$/..$/.. -PRJNAME=dtrans +PRJNAME=vcl TARGET=dtransX11 TARGETTYPE=GUI ENABLE_EXCEPTIONS=TRUE -COMP1TYPELIST=$(TARGET) -LIBTARGET=NO # --- Settings ----------------------------------------------------- @@ -67,28 +65,6 @@ SLOFILES=\ $(SLO)$/bmp.obj \ $(SLO)$/config.obj -SHL1TARGET= $(TARGET)$(DLLPOSTFIX) - -.IF "$(OS)"=="MACOSX" -SHL1STDLIBS= $(LIBSTLPORT) $(CPPUHELPERLIB) -.ELSE -SHL1STDLIBS= $(CPPUHELPERLIB) -.ENDIF - -SHL1STDLIBS+= \ - $(UNOTOOLSLIB) \ - $(CPPULIB) \ - $(SALLIB) \ - -lX11 - -SHL1DEPN= -SHL1IMPLIB= i$(SHL1TARGET) -SHL1OBJS= $(SLOFILES) - -SHL1VERSIONMAP=exports.map -SHL1DEF=$(MISC)$/$(SHL1TARGET).def -DEF1NAME=$(SHL1TARGET) - .ENDIF # "$(OS)"=="MACOSX" # --- Targets ------------------------------------------------------ diff --git a/dtrans/source/X11/movedata_curs.h b/vcl/unx/source/dtrans/movedata_curs.h similarity index 100% rename from dtrans/source/X11/movedata_curs.h rename to vcl/unx/source/dtrans/movedata_curs.h diff --git a/dtrans/source/X11/movedata_mask.h b/vcl/unx/source/dtrans/movedata_mask.h similarity index 100% rename from dtrans/source/X11/movedata_mask.h rename to vcl/unx/source/dtrans/movedata_mask.h diff --git a/dtrans/source/X11/nodrop_curs.h b/vcl/unx/source/dtrans/nodrop_curs.h similarity index 100% rename from dtrans/source/X11/nodrop_curs.h rename to vcl/unx/source/dtrans/nodrop_curs.h diff --git a/dtrans/source/X11/nodrop_mask.h b/vcl/unx/source/dtrans/nodrop_mask.h similarity index 100% rename from dtrans/source/X11/nodrop_mask.h rename to vcl/unx/source/dtrans/nodrop_mask.h diff --git a/vcl/unx/source/fontmanager/fontcache.cxx b/vcl/unx/source/fontmanager/fontcache.cxx index 4932f7a771e0..524a365ee20b 100644 --- a/vcl/unx/source/fontmanager/fontcache.cxx +++ b/vcl/unx/source/fontmanager/fontcache.cxx @@ -7,7 +7,6 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: fontcache.cxx,v $ - * $Revision: 1.26 $ * * This file is part of OpenOffice.org. * @@ -50,7 +49,7 @@ #endif #define FONTCACHEFILE "/user/psprint/pspfontcache" -#define CACHE_MAGIC "PspFontCacheFile format 3" +#define CACHE_MAGIC "PspFontCacheFile format 4" using namespace std; using namespace rtl; diff --git a/vcl/unx/source/fontmanager/fontmanager.cxx b/vcl/unx/source/fontmanager/fontmanager.cxx index 995abb5fb89f..99f19ba2fc31 100644 --- a/vcl/unx/source/fontmanager/fontmanager.cxx +++ b/vcl/unx/source/fontmanager/fontmanager.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: fontmanager.cxx,v $ - * $Revision: 1.81.22.2 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -41,7 +38,8 @@ #include "vcl/fontmanager.hxx" #include "vcl/fontcache.hxx" -#include "vcl/helper.hxx" +#include "vcl/fontcache.hxx" +#include "vcl/fontsubset.hxx" #include "vcl/strhelper.hxx" #include "vcl/ppdparser.hxx" #include "vcl/svdata.hxx" @@ -377,6 +375,15 @@ PrintFontManager::Type1FontFile::~Type1FontFile() // ------------------------------------------------------------------------- +PrintFontManager::TrueTypeFontFile::TrueTypeFontFile() +: PrintFont( fonttype::TrueType ) +, m_nDirectory( 0 ) +, m_nCollectionEntry(-1) +, m_nTypeFlags( TYPEFLAG_INVALID ) +{} + +// ------------------------------------------------------------------------- + PrintFontManager::TrueTypeFontFile::~TrueTypeFontFile() { } @@ -1353,7 +1360,7 @@ bool PrintFontManager::analyzeFontFile( int nDirID, const OString& rFontFile, co } else if( aExt.EqualsIgnoreCaseAscii( "ttf" ) || aExt.EqualsIgnoreCaseAscii( "tte" ) // #i33947# for Gaiji support - || aExt.EqualsIgnoreCaseAscii( "otf" ) ) // #112957# allow GLYF-OTF + || aExt.EqualsIgnoreCaseAscii( "otf" ) ) // check for TTF- and PS-OpenType too { TrueTypeFontFile* pFont = new TrueTypeFontFile(); pFont->m_nDirectory = nDirID; @@ -2625,6 +2632,10 @@ void PrintFontManager::fillPrintFontInfo( PrintFont* pFont, FastPrintFontInfo& r rInfo.m_aEncoding = pFont->m_aEncoding; rInfo.m_eEmbeddedbitmap = pFont->m_eEmbeddedbitmap; rInfo.m_eAntialias = pFont->m_eAntialias; + + rInfo.m_bEmbeddable = (pFont->m_eType == fonttype::Type1); + rInfo.m_bSubsettable = (pFont->m_eType == fonttype::TrueType); // TODO: rename to SfntType + rInfo.m_aAliases.clear(); for( ::std::list< int >::iterator it = pFont->m_aAliases.begin(); it != pFont->m_aAliases.end(); ++it ) rInfo.m_aAliases.push_back( m_pAtoms->getString( ATOM_FAMILYNAME, *it ) ); @@ -3054,7 +3065,7 @@ bool PrintFontManager::isFontDownloadingAllowed( fontID nFont ) const if( pFont && pFont->m_eType == fonttype::TrueType ) { TrueTypeFontFile* pTTFontFile = static_cast(pFont); - if( pTTFontFile->m_nTypeFlags & 0x80000000 ) + if( pTTFontFile->m_nTypeFlags & TYPEFLAG_INVALID ) { TrueTypeFont* pTTFont = NULL; ByteString aFile = getFontFile( pFont ); @@ -3068,7 +3079,7 @@ bool PrintFontManager::isFontDownloadingAllowed( fontID nFont ) const } } - unsigned int nCopyrightFlags = pTTFontFile->m_nTypeFlags & 0x0e; + unsigned int nCopyrightFlags = pTTFontFile->m_nTypeFlags & TYPEFLAG_COPYRIGHT_MASK; // font embedding is allowed if either // no restriction at all (bit 1 clear) @@ -3610,7 +3621,9 @@ bool PrintFontManager::getAlternativeFamilyNames( fontID nFont, ::std::list< OUS // ------------------------------------------------------------------------- +// TODO: move most of this stuff into the central font-subsetting code bool PrintFontManager::createFontSubset( + FontSubsetInfo& rInfo, fontID nFont, const OUString& rOutFile, sal_Int32* pGlyphIDs, @@ -3621,27 +3634,31 @@ bool PrintFontManager::createFontSubset( ) { PrintFont* pFont = getFont( nFont ); - if( !pFont || pFont->m_eType != fonttype::TrueType ) + if( !pFont ) return false; - OUString aSysPath; - if( osl_File_E_None != osl_getSystemPathFromFileURL( rOutFile.pData, &aSysPath.pData ) ) + switch( pFont->m_eType ) + { + case psp::fonttype::TrueType: rInfo.m_nFontType = FontSubsetInfo::SFNT_TTF; break; + case psp::fonttype::Type1: rInfo.m_nFontType = FontSubsetInfo::ANY_TYPE1; break; + default: + return false; + } + // TODO: remove when Type1 subsetting gets implemented + if( pFont->m_eType != fonttype::TrueType ) return false; - rtl_TextEncoding aEncoding = osl_getThreadTextEncoding(); - ByteString aFromFile = getFontFile( pFont ); - ByteString aToFile( OUStringToOString( aSysPath, aEncoding ) ); - + // reshuffle array of requested glyphs to make sure glyph0==notdef sal_uInt8 pEnc[256]; sal_uInt16 pGID[256]; sal_uInt8 pOldIndex[256]; - memset( pEnc, 0, sizeof( pEnc ) ); memset( pGID, 0, sizeof( pGID ) ); memset( pOldIndex, 0, sizeof( pOldIndex ) ); + if( nGlyphs > 256 ) + return false; int nChar = 1; - int i; - for( i = 0; i < nGlyphs; i++ ) + for( int i = 0; i < nGlyphs; i++ ) { if( pNewEncoding[i] == 0 ) { @@ -3660,21 +3677,70 @@ bool PrintFontManager::createFontSubset( } nGlyphs = nChar; // either input value or increased by one - if( nGlyphs > 256 ) - return false; + // prepare system name for read access for subset source file + // TODO: since this file is usually already mmapped there is no need to open it again + const ByteString aFromFile = getFontFile( pFont ); - TrueTypeFont* pTTFont = NULL; + TrueTypeFont* pTTFont = NULL; // TODO: rename to SfntFont TrueTypeFontFile* pTTFontFile = static_cast< TrueTypeFontFile* >(pFont); if( OpenTTFontFile( aFromFile.GetBuffer(), pTTFontFile->m_nCollectionEntry < 0 ? 0 : pTTFontFile->m_nCollectionEntry, &pTTFont ) != SF_OK ) return false; + // prepare system name for write access for subset file target + OUString aSysPath; + if( osl_File_E_None != osl_getSystemPathFromFileURL( rOutFile.pData, &aSysPath.pData ) ) + return false; + const rtl_TextEncoding aEncoding = osl_getThreadTextEncoding(); + const ByteString aToFile( OUStringToOString( aSysPath, aEncoding ) ); + + // do CFF subsetting if possible + int nCffLength = 0; + const sal_uInt8* pCffBytes = NULL; + if( GetSfntTable( pTTFont, O_CFF, &pCffBytes, &nCffLength ) ) + { + rInfo.LoadFont( FontSubsetInfo::CFF_FONT, pCffBytes, nCffLength ); +#if 1 // TODO: remove 16bit->long conversion when related methods handle non-16bit glyphids + long aRequestedGlyphs[256]; + for( int i = 0; i < nGlyphs; ++i ) + aRequestedGlyphs[i] = pGID[i]; +#endif + // create subset file at requested path + FILE* pOutFile = fopen( aToFile.GetBuffer(), "wb" ); + // create font subset + const char* pGlyphSetName = NULL; // TODO: better name? + const bool bOK = rInfo.CreateFontSubset( + FontSubsetInfo::TYPE1_PFB, + pOutFile, pGlyphSetName, + aRequestedGlyphs, pEnc, nGlyphs, pWidths ); + fclose( pOutFile ); + // cleanup before early return + CloseTTFont( pTTFont ); + return bOK; + } + + // do TTF->Type42 or Type3 subsetting + // fill in font info + psp::PrintFontInfo aFontInfo; + if( ! getFontInfo( nFont, aFontInfo ) ) + return false; + + rInfo.m_nAscent = aFontInfo.m_nAscend; + rInfo.m_nDescent = aFontInfo.m_nDescend; + rInfo.m_aPSName = getPSName( nFont ); + + int xMin, yMin, xMax, yMax; + getFontBoundingBox( nFont, xMin, yMin, xMax, yMax ); + rInfo.m_aFontBBox = Rectangle( Point( xMin, yMin ), Size( xMax-xMin, yMax-yMin ) ); + rInfo.m_nCapHeight = yMax; // Well ... + + // fill in glyph advance widths TTSimpleGlyphMetrics* pMetrics = GetTTSimpleGlyphMetrics( pTTFont, pGID, nGlyphs, bVertical ? 1 : 0 ); if( pMetrics ) { - for( i = 0; i < nGlyphs; i++ ) + for( int i = 0; i < nGlyphs; i++ ) pWidths[pOldIndex[i]] = pMetrics[i].adv; free( pMetrics ); } diff --git a/vcl/unx/source/gdi/cdeint.cxx b/vcl/unx/source/gdi/cdeint.cxx index 4d2a6dba78ca..3794737b293e 100644 --- a/vcl/unx/source/gdi/cdeint.cxx +++ b/vcl/unx/source/gdi/cdeint.cxx @@ -216,6 +216,7 @@ void CDEIntegrator::GetSystemLook( AllSettings& rSettings ) aStyleSettings.SetDialogTextColor( aDeactive ); aStyleSettings.SetMenuTextColor( aDeactive ); + aStyleSettings.SetMenuBarTextColor( aDeactive ); aStyleSettings.SetButtonTextColor( aDeactive ); aStyleSettings.SetRadioCheckTextColor( aDeactive ); aStyleSettings.SetGroupTextColor( aDeactive ); diff --git a/vcl/unx/source/gdi/makefile.mk b/vcl/unx/source/gdi/makefile.mk index 8f0faf863af2..fb513a66a841 100644 --- a/vcl/unx/source/gdi/makefile.mk +++ b/vcl/unx/source/gdi/makefile.mk @@ -90,6 +90,10 @@ ENVCFLAGS+=-DUSE_CDE CFLAGS+=-DXRENDER_LINK .ENDIF +.IF "$(ENABLE_GRAPHITE)" == "TRUE" +CFLAGS+=-DENABLE_GRAPHITE +.ENDIF + .ENDIF # "$(GUIBASE)"!="unx" # --- Targets ------------------------------------------------------ @@ -103,8 +107,8 @@ ALLTAR : $(MACOSXRC) XSALSETLIBNAME=$(DLLPRE)spa$(DLLPOSTFIX)$(DLLPOST) $(INCCOM)$/rtsname.hxx: - rm -f $(INCCOM)$/rtsname.hxx ; \ - echo "#define _XSALSET_LIBNAME "\"$(XSALSETLIBNAME)\" > $(INCCOM)$/rtsname.hxx + @rm -f $(INCCOM)$/rtsname.hxx ; \ + echo "#define _XSALSET_LIBNAME "\"$(XSALSETLIBNAME)\" > $(INCCOM)$/rtsname.hxx $(SLO)$/salpimpl.obj : $(INCCOM)$/rtsname.hxx $(SLO)$/salprnpsp.obj : $(INCCOM)$/rtsname.hxx diff --git a/vcl/unx/source/gdi/pspgraphics.cxx b/vcl/unx/source/gdi/pspgraphics.cxx index e8dfe391dc86..227d6cd7e9b2 100644 --- a/vcl/unx/source/gdi/pspgraphics.cxx +++ b/vcl/unx/source/gdi/pspgraphics.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: pspgraphics.cxx,v $ - * $Revision: 1.33 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -40,6 +37,7 @@ #include "vcl/glyphcache.hxx" #include "vcl/impfont.hxx" #include "vcl/outfont.hxx" +#include "vcl/fontsubset.hxx" #include "vcl/svapp.hxx" #include "vcl/salprn.hxx" #include "vcl/sysdata.hxx" @@ -51,6 +49,11 @@ #include #include +#ifdef ENABLE_GRAPHITE +#include +#include +#endif + using namespace psp; using namespace rtl; @@ -699,9 +702,30 @@ static void DrawPrinterLayout( const SalLayout& rLayout, ::psp::PrinterGfx& rGfx Point aPos; long nUnitsPerPixel = rLayout.GetUnitsPerPixel(); - const sal_Unicode* pText = bIsPspServerFontLayout ? static_cast(rLayout).getTextPtr() : NULL; - int nMinCharPos = bIsPspServerFontLayout ? static_cast(rLayout).getMinCharPos() : 0; - int nMaxCharPos = bIsPspServerFontLayout ? static_cast(rLayout).getMaxCharPos() : 0; + const sal_Unicode* pText = NULL; + int nMinCharPos = 0; + int nMaxCharPos = 0; + if (bIsPspServerFontLayout) + { + const PspServerFontLayout * pPspLayout = dynamic_cast(&rLayout); +#ifdef ENABLE_GRAPHITE + const GraphiteServerFontLayout * pGrLayout = dynamic_cast(&rLayout); +#endif + if (pPspLayout) + { + pText = pPspLayout->getTextPtr(); + nMinCharPos = pPspLayout->getMinCharPos(); + nMaxCharPos = pPspLayout->getMaxCharPos(); + } +#ifdef ENABLE_GRAPHITE + else if (pGrLayout) + { + pText = pGrLayout->getTextPtr(); + nMinCharPos = pGrLayout->getMinCharPos(); + nMaxCharPos = pGrLayout->getMaxCharPos(); + } +#endif + } for( int nStart = 0;; ) { int nGlyphCount = rLayout.GetNextGlyphs( nMaxGlyphs, aGlyphAry, aPos, nStart, aWidthAry, bIsPspServerFontLayout ? aCharPosAry : NULL ); @@ -749,16 +773,13 @@ void PspGraphics::DrawServerFontLayout( const ServerFontLayout& rLayout ) ImplFontCharMap* PspGraphics::GetImplFontCharMap() const { // TODO: get ImplFontCharMap directly from fonts - int nPairCount = 0; - if( m_pServerFont[0] ) - nPairCount = m_pServerFont[0]->GetFontCodeRanges( NULL ); - if( !nPairCount ) + if( !m_pServerFont[0] ) return NULL; - sal_uInt32* pCodePairs = new sal_uInt32[ 2 * nPairCount ]; - if( m_pServerFont[0] ) - m_pServerFont[0]->GetFontCodeRanges( pCodePairs ); - return new ImplFontCharMap( nPairCount, pCodePairs ); + CmapResult aCmapResult; + if( !m_pServerFont[0]->GetFontCodeRanges( aCmapResult ) ) + return NULL; + return new ImplFontCharMap( aCmapResult ); } USHORT PspGraphics::SetFont( ImplFontSelectData *pEntry, int nFallbackLevel ) @@ -961,7 +982,21 @@ SalLayout* PspGraphics::GetTextLayout( ImplLayoutArgs& rArgs, int nFallbackLevel if( m_pServerFont[ nFallbackLevel ] && !(rArgs.mnFlags & SAL_LAYOUT_DISABLE_GLYPH_PROCESSING) ) - pLayout = new PspServerFontLayout( *m_pPrinterGfx, *m_pServerFont[nFallbackLevel], rArgs ); + { +#ifdef ENABLE_GRAPHITE + // Is this a Graphite font? + if (GraphiteFontAdaptor::IsGraphiteEnabledFont(*m_pServerFont[nFallbackLevel])) + { + sal_Int32 xdpi, ydpi; + GetResolution(xdpi, ydpi); + GraphiteFontAdaptor * pGrfont = new GraphiteFontAdaptor( *m_pServerFont[nFallbackLevel], xdpi, ydpi); + if (!pGrfont) return NULL; + pLayout = new GraphiteServerFontLayout(pGrfont); + } + else +#endif + pLayout = new PspServerFontLayout( *m_pPrinterGfx, *m_pServerFont[nFallbackLevel], rArgs ); + } else pLayout = new PspFontLayout( *m_pPrinterGfx ); @@ -976,7 +1011,7 @@ BOOL PspGraphics::CreateFontSubset( sal_Int32* pGlyphIDs, sal_uInt8* pEncoding, sal_Int32* pWidths, - int nGlyphs, + int nGlyphCount, FontSubsetInfo& rInfo ) { @@ -986,7 +1021,16 @@ BOOL PspGraphics::CreateFontSubset( // which this method was created). The correct way would // be to have the GlyphCache search for the ImplFontData pFont psp::fontID aFont = pFont->GetFontId(); - return PspGraphics::DoCreateFontSubset( rToFile, aFont, pGlyphIDs, pEncoding, pWidths, nGlyphs, rInfo ); + + psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); + bool bSuccess = rMgr.createFontSubset( rInfo, + aFont, + rToFile, + pGlyphIDs, + pEncoding, + pWidths, + nGlyphCount ); + return bSuccess; } //-------------------------------------------------------------------------- @@ -1041,50 +1085,6 @@ void PspGraphics::GetGlyphWidths( const ImplFontData* pFont, // static helpers of PspGraphics -bool PspGraphics::DoCreateFontSubset( const rtl::OUString& rToFile, - psp::fontID aFont, - sal_Int32* pGlyphIDs, - sal_uInt8* pEncoding, - sal_Int32* pWidths, - int nGlyphs, - FontSubsetInfo& rInfo ) -{ - psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); - psp::PrintFontInfo aFontInfo; - - if( ! rMgr.getFontInfo( aFont, aFontInfo ) ) - return false; - - // fill in font info - switch( aFontInfo.m_eType ) - { - case psp::fonttype::TrueType: rInfo.m_nFontType = SAL_FONTSUBSETINFO_TYPE_TRUETYPE;break; - case psp::fonttype::Type1: rInfo.m_nFontType = SAL_FONTSUBSETINFO_TYPE_TYPE1;break; - default: - return false; - } - rInfo.m_nAscent = aFontInfo.m_nAscend; - rInfo.m_nDescent = aFontInfo.m_nDescend; - rInfo.m_aPSName = rMgr.getPSName( aFont ); - - int xMin, yMin, xMax, yMax; - rMgr.getFontBoundingBox( aFont, xMin, yMin, xMax, yMax ); - - if( ! rMgr.createFontSubset( aFont, - rToFile, - pGlyphIDs, - pEncoding, - pWidths, - nGlyphs - ) ) - return false; - - rInfo.m_aFontBBox = Rectangle( Point( xMin, yMin ), Size( xMax-xMin, yMax-yMin ) ); - rInfo.m_nCapHeight = yMax; // Well ... - - return true; -} - const void* PspGraphics::DoGetEmbedFontData( fontID aFont, const sal_Ucs* pUnicodes, sal_Int32* pWidths, FontSubsetInfo& rInfo, long* pDataLen ) { psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); @@ -1094,13 +1094,6 @@ const void* PspGraphics::DoGetEmbedFontData( fontID aFont, const sal_Ucs* pUnico return NULL; // fill in font info - switch( aFontInfo.m_eType ) - { - case psp::fonttype::TrueType: rInfo.m_nFontType = SAL_FONTSUBSETINFO_TYPE_TRUETYPE;break; - case psp::fonttype::Type1: rInfo.m_nFontType = SAL_FONTSUBSETINFO_TYPE_TYPE1;break; - default: - return NULL; - } rInfo.m_nAscent = aFontInfo.m_nAscend; rInfo.m_nDescent = aFontInfo.m_nDescend; rInfo.m_aPSName = rMgr.getPSName( aFont ); @@ -1137,9 +1130,22 @@ const void* PspGraphics::DoGetEmbedFontData( fontID aFont, const sal_Ucs* pUnico rInfo.m_nCapHeight = yMax; // Well ... for( int i = 0; i < 256; i++ ) - pWidths[i] = (aMetrics[i].width > 0 ? aMetrics[i].width : 0); + switch( aFontInfo.m_eType ) + { + case psp::fonttype::TrueType: + rInfo.m_nFontType = FontSubsetInfo::SFNT_TTF; + break; + case psp::fonttype::Type1: { + const bool bPFA = ((*(unsigned char*)pFile) < 0x80); + rInfo.m_nFontType = bPFA ? FontSubsetInfo::TYPE1_PFA : FontSubsetInfo::TYPE1_PFB; + } + break; + default: + return NULL; + } + return pFile; } @@ -1275,6 +1281,8 @@ ImplDevFontAttributes PspGraphics::Info2DevFontAttributes( const psp::FastPrintF aDFA.meWidthType = ToFontWidth (rInfo.m_eWidth); aDFA.mePitch = ToFontPitch (rInfo.m_ePitch); aDFA.mbSymbolFlag = (rInfo.m_aEncoding == RTL_TEXTENCODING_SYMBOL); + aDFA.mbSubsettable = rInfo.m_bSubsettable; + aDFA.mbEmbeddable = rInfo.m_bEmbeddable; switch (rInfo.m_eEmbeddedbitmap) { @@ -1307,26 +1315,18 @@ ImplDevFontAttributes PspGraphics::Info2DevFontAttributes( const psp::FastPrintF case psp::fonttype::Builtin: aDFA.mnQuality = 1024; aDFA.mbDevice = true; - aDFA.mbSubsettable = false; - aDFA.mbEmbeddable = false; break; case psp::fonttype::TrueType: aDFA.mnQuality = 512; aDFA.mbDevice = false; - aDFA.mbSubsettable = true; - aDFA.mbEmbeddable = false; break; case psp::fonttype::Type1: aDFA.mnQuality = 0; aDFA.mbDevice = false; - aDFA.mbSubsettable = false; - aDFA.mbEmbeddable = true; break; default: aDFA.mnQuality = 0; aDFA.mbDevice = false; - aDFA.mbSubsettable = false; - aDFA.mbEmbeddable = false; break; } diff --git a/vcl/unx/source/gdi/salgdi.cxx b/vcl/unx/source/gdi/salgdi.cxx index db49c97de00c..cb554bccea21 100644 --- a/vcl/unx/source/gdi/salgdi.cxx +++ b/vcl/unx/source/gdi/salgdi.cxx @@ -1,1539 +1,1890 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2008 by Sun Microsystems, Inc. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_vcl.hxx" - -#include "Xproto.h" - -#include "salunx.h" -#include "saldata.hxx" -#include "saldisp.hxx" -#include "salgdi.h" -#include "salframe.h" -#include "salvd.h" -#include "xrender_peer.hxx" - -#include "vcl/printergfx.hxx" -#include "vcl/jobdata.hxx" - -#include "tools/debug.hxx" - -#include "basegfx/polygon/b2dpolygon.hxx" -#include "basegfx/polygon/b2dpolypolygon.hxx" -#include "basegfx/polygon/b2dpolypolygontools.hxx" -#include "basegfx/polygon/b2dpolygontools.hxx" -#include "basegfx/polygon/b2dpolygonclipper.hxx" -#include "basegfx/polygon/b2dlinegeometry.hxx" -#include "basegfx/matrix/b2dhommatrix.hxx" -#include "basegfx/polygon/b2dpolypolygoncutter.hxx" - -#include -#include -#include - -// -=-= SalPolyLine =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -#define STATIC_POINTS 64 - -class SalPolyLine -{ - XPoint Points_[STATIC_POINTS]; - XPoint *pFirst_; -public: - inline SalPolyLine( ULONG nPoints ); - inline SalPolyLine( ULONG nPoints, const SalPoint *p ); - inline ~SalPolyLine(); - inline XPoint &operator [] ( ULONG n ) const - { return pFirst_[n]; } -}; - -inline SalPolyLine::SalPolyLine( ULONG nPoints ) - : pFirst_( nPoints+1 > STATIC_POINTS ? new XPoint[nPoints+1] : Points_ ) -{} - -inline SalPolyLine::SalPolyLine( ULONG nPoints, const SalPoint *p ) - : pFirst_( nPoints+1 > STATIC_POINTS ? new XPoint[nPoints+1] : Points_ ) -{ - for( ULONG i = 0; i < nPoints; i++ ) - { - pFirst_[i].x = (short)p[i].mnX; - pFirst_[i].y = (short)p[i].mnY; - } - pFirst_[nPoints] = pFirst_[0]; // close polyline -} - -inline SalPolyLine::~SalPolyLine() -{ if( pFirst_ != Points_ ) delete [] pFirst_; } - -#undef STATIC_POINTS -// -=-= X11SalGraphics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -X11SalGraphics::X11SalGraphics() -{ - m_pFrame = NULL; - m_pVDev = NULL; - m_pDeleteColormap = NULL; - hDrawable_ = None; - m_aRenderPicture = 0; - m_pRenderFormat = NULL; - - pClipRegion_ = NULL; - pPaintRegion_ = NULL; - - pPenGC_ = NULL; - nPenPixel_ = 0; - nPenColor_ = MAKE_SALCOLOR( 0x00, 0x00, 0x00 ); // Black - - pFontGC_ = NULL; - for( int i = 0; i < MAX_FALLBACK; ++i ) - { - mXFont[i] = NULL; - mpServerFont[i] = NULL; - } - - nTextPixel_ = 0; - nTextColor_ = MAKE_SALCOLOR( 0x00, 0x00, 0x00 ); // Black - - pBrushGC_ = NULL; - nBrushPixel_ = 0; - nBrushColor_ = MAKE_SALCOLOR( 0xFF, 0xFF, 0xFF ); // White - hBrush_ = None; - - pMonoGC_ = NULL; - pCopyGC_ = NULL; - pMaskGC_ = NULL; - pInvertGC_ = NULL; - pInvert50GC_ = NULL; - pStippleGC_ = NULL; - pTrackingGC_ = NULL; - - bWindow_ = FALSE; - bPrinter_ = FALSE; - bVirDev_ = FALSE; - bPenGC_ = FALSE; - bFontGC_ = FALSE; - bBrushGC_ = FALSE; - bMonoGC_ = FALSE; - bCopyGC_ = FALSE; - bInvertGC_ = FALSE; - bInvert50GC_ = FALSE; - bStippleGC_ = FALSE; - bTrackingGC_ = FALSE; - bXORMode_ = FALSE; - bDitherBrush_ = FALSE; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -X11SalGraphics::~X11SalGraphics() -{ - ReleaseFonts(); - freeResources(); -} - -// -=-= SalGraphics / X11SalGraphics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -void X11SalGraphics::freeResources() -{ - Display *pDisplay = GetXDisplay(); - - DBG_ASSERT( !pPaintRegion_, "pPaintRegion_" ); - if( pClipRegion_ ) XDestroyRegion( pClipRegion_ ), pClipRegion_ = None; - - if( hBrush_ ) XFreePixmap( pDisplay, hBrush_ ), hBrush_ = None; - if( pPenGC_ ) XFreeGC( pDisplay, pPenGC_ ), pPenGC_ = None; - if( pFontGC_ ) XFreeGC( pDisplay, pFontGC_ ), pFontGC_ = None; - if( pBrushGC_ ) XFreeGC( pDisplay, pBrushGC_ ), pBrushGC_ = None; - if( pMonoGC_ ) XFreeGC( pDisplay, pMonoGC_ ), pMonoGC_ = None; - if( pCopyGC_ ) XFreeGC( pDisplay, pCopyGC_ ), pCopyGC_ = None; - if( pMaskGC_ ) XFreeGC( pDisplay, pMaskGC_ ), pMaskGC_ = None; - if( pInvertGC_ ) XFreeGC( pDisplay, pInvertGC_ ), pInvertGC_ = None; - if( pInvert50GC_ ) XFreeGC( pDisplay, pInvert50GC_ ), pInvert50GC_ = None; - if( pStippleGC_ ) XFreeGC( pDisplay, pStippleGC_ ), pStippleGC_ = None; - if( pTrackingGC_ ) XFreeGC( pDisplay, pTrackingGC_ ), pTrackingGC_ = None; - if( m_pDeleteColormap ) - delete m_pDeleteColormap, m_pColormap = m_pDeleteColormap = NULL; - - if( m_aRenderPicture ) - XRenderPeer::GetInstance().FreePicture( m_aRenderPicture ), m_aRenderPicture = 0; - - bPenGC_ = bFontGC_ = bBrushGC_ = bMonoGC_ = bCopyGC_ = bInvertGC_ = bInvert50GC_ = bStippleGC_ = bTrackingGC_ = false; -} - -void X11SalGraphics::SetDrawable( Drawable aDrawable, int nScreen ) -{ - // shortcut if nothing changed - if( hDrawable_ == aDrawable ) - return; - - // free screen specific resources if needed - if( nScreen != m_nScreen ) - { - freeResources(); - m_pColormap = &GetX11SalData()->GetDisplay()->GetColormap( nScreen ); - m_nScreen = nScreen; - } - - hDrawable_ = aDrawable; - SetXRenderFormat( NULL ); - if( m_aRenderPicture ) - { - XRenderPeer::GetInstance().FreePicture( m_aRenderPicture ); - m_aRenderPicture = 0; - } - - if( hDrawable_ ) - { - nPenPixel_ = GetPixel( nPenColor_ ); - nTextPixel_ = GetPixel( nTextColor_ ); - nBrushPixel_ = GetPixel( nBrushColor_ ); - } -} - -void X11SalGraphics::Init( SalFrame *pFrame, Drawable aTarget, int nScreen ) -{ -#if 0 // TODO: use SetDrawable() instead - m_pColormap = &GetX11SalData()->GetDisplay()->GetColormap(nScreen); - hDrawable_ = aTarget; - m_nScreen = nScreen; - SetXRenderFormat( NULL ); - if( m_aRenderPicture ) - XRenderPeer::GetInstance().FreePicture( m_aRenderPicture ), m_aRenderPicture = 0; - - nPenPixel_ = GetPixel( nPenColor_ ); - nTextPixel_ = GetPixel( nTextColor_ ); - nBrushPixel_ = GetPixel( nBrushColor_ ); -#else - m_pColormap = &GetX11SalData()->GetDisplay()->GetColormap(nScreen); - m_nScreen = nScreen; - SetDrawable( aTarget, nScreen ); -#endif - - bWindow_ = TRUE; - m_pFrame = pFrame; - m_pVDev = NULL; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::DeInit() -{ - SetDrawable( None, m_nScreen ); -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::SetClipRegion( GC pGC, XLIB_Region pXReg ) const -{ - Display *pDisplay = GetXDisplay(); - - int n = 0; - XLIB_Region Regions[3]; - - if( pClipRegion_ /* && !XEmptyRegion( pClipRegion_ ) */ ) - Regions[n++] = pClipRegion_; -// if( pPaintRegion_ /* && !XEmptyRegion( pPaintRegion_ ) */ ) -// Regions[n++] = pPaintRegion_; - - if( pXReg && !XEmptyRegion( pXReg ) ) - Regions[n++] = pXReg; - - if( 0 == n ) - XSetClipMask( pDisplay, pGC, None ); - else if( 1 == n ) - XSetRegion( pDisplay, pGC, Regions[0] ); - else - { - XLIB_Region pTmpRegion = XCreateRegion(); - XIntersectRegion( Regions[0], Regions[1], pTmpRegion ); -// if( 3 == n ) -// XIntersectRegion( Regions[2], pTmpRegion, pTmpRegion ); - XSetRegion( pDisplay, pGC, pTmpRegion ); - XDestroyRegion( pTmpRegion ); - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -GC X11SalGraphics::SelectPen() -{ - Display *pDisplay = GetXDisplay(); - - if( !pPenGC_ ) - { - XGCValues values; - values.subwindow_mode = ClipByChildren; - values.fill_rule = EvenOddRule; // Pict import/ Gradient - values.graphics_exposures = False; - - pPenGC_ = XCreateGC( pDisplay, hDrawable_, - GCSubwindowMode | GCFillRule | GCGraphicsExposures, - &values ); - } - - if( !bPenGC_ ) - { - if( nPenColor_ != SALCOLOR_NONE ) - XSetForeground( pDisplay, pPenGC_, nPenPixel_ ); - XSetFunction ( pDisplay, pPenGC_, bXORMode_ ? GXxor : GXcopy ); - SetClipRegion( pPenGC_ ); - bPenGC_ = TRUE; - } - - return pPenGC_; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -GC X11SalGraphics::SelectBrush() -{ - Display *pDisplay = GetXDisplay(); - - DBG_ASSERT( nBrushColor_ != SALCOLOR_NONE, "Brush Transparent" ); - - if( !pBrushGC_ ) - { - XGCValues values; - // values.subwindow_mode = IncludeInferiors; - values.subwindow_mode = ClipByChildren; - values.fill_rule = EvenOddRule; // Pict import/ Gradient - values.graphics_exposures = False; - - pBrushGC_ = XCreateGC( pDisplay, hDrawable_, - GCSubwindowMode | GCFillRule | GCGraphicsExposures, - &values ); - } - - if( !bBrushGC_ ) - { - if( !bDitherBrush_ ) - { - XSetFillStyle ( pDisplay, pBrushGC_, FillSolid ); - XSetForeground( pDisplay, pBrushGC_, nBrushPixel_ ); - #if defined(_USE_PRINT_EXTENSION_) - XSetBackground( pDisplay, pBrushGC_, - WhitePixel(pDisplay, DefaultScreen(pDisplay)) ); - #else - if( bPrinter_ ) - XSetTile( pDisplay, pBrushGC_, None ); - #endif - } - else - { - // Bug in Sun Solaris 2.5.1, XFillPolygon doesn't allways reflect - // changes of the tile. PROPERTY_BUG_Tile doesn't fix this ! - if (GetDisplay()->GetProperties() & PROPERTY_BUG_FillPolygon_Tile) - XSetFillStyle ( pDisplay, pBrushGC_, FillSolid ); - - XSetFillStyle ( pDisplay, pBrushGC_, FillTiled ); - XSetTile ( pDisplay, pBrushGC_, hBrush_ ); - } - XSetFunction ( pDisplay, pBrushGC_, bXORMode_ ? GXxor : GXcopy ); - SetClipRegion( pBrushGC_ ); - - bBrushGC_ = TRUE; - } - - return pBrushGC_; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -GC X11SalGraphics::GetTrackingGC() -{ - const char dash_list[2] = {2, 2}; - - if( !pTrackingGC_ ) - { - XGCValues values; - - values.graphics_exposures = False; - values.foreground = m_pColormap->GetBlackPixel() - ^ m_pColormap->GetWhitePixel(); - values.function = GXxor; - values.line_width = 1; - values.line_style = LineOnOffDash; - - pTrackingGC_ = XCreateGC( GetXDisplay(), GetDrawable(), - GCGraphicsExposures | GCForeground | GCFunction - | GCLineWidth | GCLineStyle, - &values ); - XSetDashes( GetXDisplay(), pTrackingGC_, 0, dash_list, 2 ); - } - - if( !bTrackingGC_ ) - { - SetClipRegion( pTrackingGC_ ); - bTrackingGC_ = TRUE; - } - - return pTrackingGC_; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::DrawLines( ULONG nPoints, - const SalPolyLine &rPoints, - GC pGC, - bool bClose - ) -{ - // errechne wie viele Linien XWindow auf einmal zeichnen kann - ULONG nMaxLines = (GetDisplay()->GetMaxRequestSize() - sizeof(xPolyPointReq)) - / sizeof(xPoint); - if( nMaxLines > nPoints ) nMaxLines = nPoints; - - // gebe alle Linien aus, die XWindows zeichnen kann. - ULONG n; - for( n = 0; nPoints - n > nMaxLines; n += nMaxLines - 1 ) - XDrawLines( GetXDisplay(), - GetDrawable(), - pGC, - &rPoints[n], - nMaxLines, - CoordModeOrigin ); - - if( n < nPoints ) - XDrawLines( GetXDisplay(), - GetDrawable(), - pGC, - &rPoints[n], - nPoints - n, - CoordModeOrigin ); - if( bClose ) - { - if( rPoints[nPoints-1].x != rPoints[0].x || rPoints[nPoints-1].y != rPoints[0].y ) - drawLine( rPoints[nPoints-1].x, rPoints[nPoints-1].y, rPoints[0].x, rPoints[0].y ); - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -// Dithern: Calculate a dither-pixmap and make a brush of it -#define P_DELTA 51 -#define DMAP( v, m ) ((v % P_DELTA) > m ? (v / P_DELTA) + 1 : (v / P_DELTA)) - -BOOL X11SalGraphics::GetDitherPixmap( SalColor nSalColor ) -{ - static const short nOrdDither8Bit[ 8 ][ 8 ] = - { - { 0, 38, 9, 48, 2, 40, 12, 50}, - {25, 12, 35, 22, 28, 15, 37, 24}, - { 6, 44, 3, 41, 8, 47, 5, 44}, - {32, 19, 28, 16, 34, 21, 31, 18}, - { 1, 40, 11, 49, 0, 39, 10, 48}, - {27, 14, 36, 24, 26, 13, 36, 23}, - { 8, 46, 4, 43, 7, 45, 4, 42}, - {33, 20, 30, 17, 32, 20, 29, 16} - }; - - // test for correct depth (8bit) - if( GetColormap().GetVisual().GetDepth() != 8 ) - return FALSE; - - char pBits[64]; - char *pBitsPtr = pBits; - - // Set the pallette-entries for the dithering tile - UINT8 nSalColorRed = SALCOLOR_RED ( nSalColor ); - UINT8 nSalColorGreen = SALCOLOR_GREEN ( nSalColor ); - UINT8 nSalColorBlue = SALCOLOR_BLUE ( nSalColor ); - - for( int nY = 0; nY < 8; nY++ ) - { - for( int nX = 0; nX < 8; nX++ ) - { - short nMagic = nOrdDither8Bit[nY][nX]; - UINT8 nR = P_DELTA * DMAP( nSalColorRed, nMagic ); - UINT8 nG = P_DELTA * DMAP( nSalColorGreen, nMagic ); - UINT8 nB = P_DELTA * DMAP( nSalColorBlue, nMagic ); - - *pBitsPtr++ = GetColormap().GetPixel( MAKE_SALCOLOR( nR, nG, nB ) ); - } - } - - // create the tile as ximage and an according pixmap -> caching - XImage *pImage = XCreateImage( GetXDisplay(), - GetColormap().GetXVisual(), - 8, - ZPixmap, - 0, // offset - pBits, // data - 8, 8, // width & height - 8, // bitmap_pad - 0 ); // (default) bytes_per_line - - if ( GetDisplay()->GetProperties() & PROPERTY_BUG_Tile ) - { - if (hBrush_) - XFreePixmap (GetXDisplay(), hBrush_); - hBrush_ = XCreatePixmap( GetXDisplay(), GetDrawable(), 8, 8, 8 ); - } - else - if( !hBrush_ ) - hBrush_ = XCreatePixmap( GetXDisplay(), GetDrawable(), 8, 8, 8 ); - - // put the ximage to the pixmap - XPutImage( GetXDisplay(), - hBrush_, - GetDisplay()->GetCopyGC( m_nScreen ), - pImage, - 0, 0, // Source - 0, 0, // Destination - 8, 8 ); // width & height - - // destroy image-frame but not palette-data - pImage->data = NULL; - XDestroyImage( pImage ); - - return TRUE; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::GetResolution( sal_Int32 &rDPIX, sal_Int32 &rDPIY ) // const -{ - const SalDisplay *pDisplay = GetDisplay(); - - rDPIX = pDisplay->GetResolution().A(); - rDPIY = pDisplay->GetResolution().B(); - if( !pDisplay->GetExactResolution() && rDPIY < 96 ) - { - rDPIX = Divide( rDPIX * 96, rDPIY ); - rDPIY = 96; - } - else if ( rDPIY > 200 ) - { - rDPIX = Divide( rDPIX * 200, rDPIY ); - rDPIY = 200; - } - - // #i12705# equalize x- and y-resolution if they are close enough - if( rDPIX != rDPIY ) - { - // different x- and y- resolutions are usually artifacts of - // a wrongly calculated screen size. - //if( (13*rDPIX >= 10*rDPIY) && (13*rDPIY >= 10*rDPIX) ) //+-30% - { -#ifdef DEBUG - printf("Forcing Resolution from %" SAL_PRIdINT32 "x%" SAL_PRIdINT32 " to %" SAL_PRIdINT32 "x%" SAL_PRIdINT32 "\n", - rDPIX,rDPIY,rDPIY,rDPIY); -#endif - rDPIX = rDPIY; // y-resolution is more trustworthy - } - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -USHORT X11SalGraphics::GetBitCount() // const -{ - return GetVisual().GetDepth(); -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -long X11SalGraphics::GetGraphicsWidth() const -{ - if( m_pFrame ) - return m_pFrame->maGeometry.nWidth; - else if( m_pVDev ) - return m_pVDev->GetWidth(); - else - return 0; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -long X11SalGraphics::GetGraphicsHeight() const -{ - if( m_pFrame ) - return m_pFrame->maGeometry.nHeight; - else if( m_pVDev ) - return m_pVDev->GetHeight(); - else - return 0; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::ResetClipRegion() -{ - if( pClipRegion_ ) - { - bPenGC_ = FALSE; - bFontGC_ = FALSE; - bBrushGC_ = FALSE; - bMonoGC_ = FALSE; - bCopyGC_ = FALSE; - bInvertGC_ = FALSE; - bInvert50GC_ = FALSE; - bStippleGC_ = FALSE; - bTrackingGC_ = FALSE; - - XDestroyRegion( pClipRegion_ ); - pClipRegion_ = NULL; - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::BeginSetClipRegion( ULONG ) -{ - if( pClipRegion_ ) - XDestroyRegion( pClipRegion_ ); - pClipRegion_ = XCreateRegion(); -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -BOOL X11SalGraphics::unionClipRegion( long nX, long nY, long nDX, long nDY ) -{ - if (!nDX || !nDY) - return TRUE; - - XRectangle aRect; - aRect.x = (short)nX; - aRect.y = (short)nY; - aRect.width = (unsigned short)nDX; - aRect.height = (unsigned short)nDY; - - XUnionRectWithRegion( &aRect, pClipRegion_, pClipRegion_ ); - - return TRUE; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -bool X11SalGraphics::unionClipRegion( const ::basegfx::B2DPolyPolygon& ) -{ - // TODO: implement and advertise OutDevSupport_B2DClip support - return false; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::EndSetClipRegion() -{ - bPenGC_ = FALSE; - bFontGC_ = FALSE; - bBrushGC_ = FALSE; - bMonoGC_ = FALSE; - bCopyGC_ = FALSE; - bInvertGC_ = FALSE; - bInvert50GC_ = FALSE; - bStippleGC_ = FALSE; - bTrackingGC_ = FALSE; - - if( XEmptyRegion( pClipRegion_ ) ) - { - XDestroyRegion( pClipRegion_ ); - pClipRegion_= NULL; - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::SetLineColor() -{ - if( nPenColor_ != SALCOLOR_NONE ) - { - nPenColor_ = SALCOLOR_NONE; - bPenGC_ = FALSE; - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::SetLineColor( SalColor nSalColor ) -{ - if( nPenColor_ != nSalColor ) - { - nPenColor_ = nSalColor; - nPenPixel_ = GetPixel( nSalColor ); - bPenGC_ = FALSE; - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::SetFillColor() -{ - if( nBrushColor_ != SALCOLOR_NONE ) - { - bDitherBrush_ = FALSE; - nBrushColor_ = SALCOLOR_NONE; - bBrushGC_ = FALSE; - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::SetFillColor( SalColor nSalColor ) -{ - if( nBrushColor_ != nSalColor ) - { - bDitherBrush_ = FALSE; - nBrushColor_ = nSalColor; - nBrushPixel_ = GetPixel( nSalColor ); - if( TrueColor != GetColormap().GetVisual().GetClass() - && GetColormap().GetColor( nBrushPixel_ ) != nBrushColor_ - && nSalColor != MAKE_SALCOLOR( 0x00, 0x00, 0x00 ) // black - && nSalColor != MAKE_SALCOLOR( 0x00, 0x00, 0x80 ) // blue - && nSalColor != MAKE_SALCOLOR( 0x00, 0x80, 0x00 ) // green - && nSalColor != MAKE_SALCOLOR( 0x00, 0x80, 0x80 ) // cyan - && nSalColor != MAKE_SALCOLOR( 0x80, 0x00, 0x00 ) // red - && nSalColor != MAKE_SALCOLOR( 0x80, 0x00, 0x80 ) // magenta - && nSalColor != MAKE_SALCOLOR( 0x80, 0x80, 0x00 ) // brown - && nSalColor != MAKE_SALCOLOR( 0x80, 0x80, 0x80 ) // gray - && nSalColor != MAKE_SALCOLOR( 0xC0, 0xC0, 0xC0 ) // light gray - && nSalColor != MAKE_SALCOLOR( 0x00, 0x00, 0xFF ) // light blue - && nSalColor != MAKE_SALCOLOR( 0x00, 0xFF, 0x00 ) // light green - && nSalColor != MAKE_SALCOLOR( 0x00, 0xFF, 0xFF ) // light cyan - && nSalColor != MAKE_SALCOLOR( 0xFF, 0x00, 0x00 ) // light red - && nSalColor != MAKE_SALCOLOR( 0xFF, 0x00, 0xFF ) // light magenta - && nSalColor != MAKE_SALCOLOR( 0xFF, 0xFF, 0x00 ) // light brown - && nSalColor != MAKE_SALCOLOR( 0xFF, 0xFF, 0xFF ) ) - bDitherBrush_ = GetDitherPixmap(nSalColor); - bBrushGC_ = FALSE; - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::SetROPLineColor( SalROPColor nROPColor ) -{ - switch( nROPColor ) - { - case SAL_ROP_0 : // 0 - nPenPixel_ = (Pixel)0; - break; - case SAL_ROP_1 : // 1 - nPenPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1; - break; - case SAL_ROP_INVERT : // 2 - nPenPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1; - break; - } - nPenColor_ = GetColormap().GetColor( nPenPixel_ ); - bPenGC_ = FALSE; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::SetROPFillColor( SalROPColor nROPColor ) -{ - switch( nROPColor ) - { - case SAL_ROP_0 : // 0 - nBrushPixel_ = (Pixel)0; - break; - case SAL_ROP_1 : // 1 - nBrushPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1; - break; - case SAL_ROP_INVERT : // 2 - nBrushPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1; - break; - } - bDitherBrush_ = FALSE; - nBrushColor_ = GetColormap().GetColor( nBrushPixel_ ); - bBrushGC_ = FALSE; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::SetXORMode( bool bSet, bool ) -{ - if( !bXORMode_ == bSet ) - { - bXORMode_ = bSet; - bPenGC_ = FALSE; - bBrushGC_ = FALSE; - bMonoGC_ = FALSE; - bCopyGC_ = FALSE; - bInvertGC_ = FALSE; - bInvert50GC_ = FALSE; - bStippleGC_ = FALSE; - bTrackingGC_ = FALSE; - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::drawPixel( long nX, long nY ) -{ - if( nPenColor_ != SALCOLOR_NONE ) - XDrawPoint( GetXDisplay(), GetDrawable(), SelectPen(), nX, nY ); -} - -void X11SalGraphics::drawPixel( long nX, long nY, SalColor nSalColor ) -{ - if( nSalColor != SALCOLOR_NONE ) - { - Display *pDisplay = GetXDisplay(); - - if( (nPenColor_ == SALCOLOR_NONE) && !bPenGC_ ) - { - SetLineColor( nSalColor ); - XDrawPoint( pDisplay, GetDrawable(), SelectPen(), nX, nY ); - nPenColor_ = SALCOLOR_NONE; - bPenGC_ = False; - } - else - { - GC pGC = SelectPen(); - - if( nSalColor != nPenColor_ ) - XSetForeground( pDisplay, pGC, GetPixel( nSalColor ) ); - - XDrawPoint( pDisplay, GetDrawable(), pGC, nX, nY ); - - if( nSalColor != nPenColor_ ) - XSetForeground( pDisplay, pGC, nPenPixel_ ); - } - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::drawLine( long nX1, long nY1, long nX2, long nY2 ) -{ - if( nPenColor_ != SALCOLOR_NONE ) - { - if ( GetDisplay()->GetProperties() & PROPERTY_BUG_DrawLine ) - { - GC aGC = SelectPen(); - XDrawPoint (GetXDisplay(), GetDrawable(), aGC, (int)nX1, (int)nY1); - XDrawPoint (GetXDisplay(), GetDrawable(), aGC, (int)nX2, (int)nY2); - XDrawLine (GetXDisplay(), GetDrawable(), aGC, nX1, nY1, nX2, nY2 ); - } - else - XDrawLine( GetXDisplay(), GetDrawable(),SelectPen(), - nX1, nY1, nX2, nY2 ); - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::drawRect( long nX, long nY, long nDX, long nDY ) -{ - if( nBrushColor_ != SALCOLOR_NONE ) - { - XFillRectangle( GetXDisplay(), - GetDrawable(), - SelectBrush(), - nX, nY, nDX, nDY ); - } - // Beschreibung DrawRect verkehrt, deshalb -1 - if( nPenColor_ != SALCOLOR_NONE ) - XDrawRectangle( GetXDisplay(), - GetDrawable(), - SelectPen(), - nX, nY, nDX-1, nDY-1 ); -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::drawPolyLine( ULONG nPoints, const SalPoint *pPtAry ) -{ - drawPolyLine( nPoints, pPtAry, false ); -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::drawPolyLine( ULONG nPoints, const SalPoint *pPtAry, bool bClose ) -{ - if( nPenColor_ != 0xFFFFFFFF ) - { - SalPolyLine Points( nPoints, pPtAry ); - - DrawLines( nPoints, Points, SelectPen(), bClose ); - } -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::drawPolygon( ULONG nPoints, const SalPoint* pPtAry ) -{ - if( nPoints == 0 ) - return; - - if( nPoints < 3 ) - { - if( !bXORMode_ ) - { - if( 1 == nPoints ) - drawPixel( pPtAry[0].mnX, pPtAry[0].mnY ); - else - drawLine( pPtAry[0].mnX, pPtAry[0].mnY, - pPtAry[1].mnX, pPtAry[1].mnY ); - } - return; - } - - SalPolyLine Points( nPoints, pPtAry ); - - nPoints++; - - /* WORKAROUND: some Xservers (Xorg, VIA chipset in this case) - * do not draw the visible part of a polygon - * if it overlaps to the left of screen 0,y. - * This happens to be the case in the gradient drawn in the - * menubar background. workaround for the special case of - * of a rectangle overlapping to the left. - */ - if( nPoints == 5 && - Points[ 0 ].x == Points[ 1 ].x && - Points[ 1 ].y == Points[ 2 ].y && - Points[ 2 ].x == Points[ 3 ].x && - Points[ 0 ].x == Points[ 4 ].x && Points[ 0 ].y == Points[ 4 ].y - ) - { - bool bLeft = false; - bool bRight = false; - for(unsigned int i = 0; i < nPoints; i++ ) - { - if( Points[i].x < 0 ) - bLeft = true; - else - bRight= true; - } - if( bLeft && ! bRight ) - return; - if( bLeft && bRight ) - { - for( unsigned int i = 0; i < nPoints; i++ ) - if( Points[i].x < 0 ) - Points[i].x = 0; - } - } - - if( nBrushColor_ != SALCOLOR_NONE ) - XFillPolygon( GetXDisplay(), - GetDrawable(), - SelectBrush(), - &Points[0], nPoints, - Complex, CoordModeOrigin ); - - if( nPenColor_ != 0xFFFFFFFF ) - DrawLines( nPoints, Points, SelectPen(), true ); -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -void X11SalGraphics::drawPolyPolygon( sal_uInt32 nPoly, - const sal_uInt32 *pPoints, - PCONSTSALPOINT *pPtAry ) -{ - if( nBrushColor_ != SALCOLOR_NONE ) - { - ULONG i, n; - XLIB_Region pXRegA = NULL; - - for( i = 0; i < nPoly; i++ ) { - n = pPoints[i]; - SalPolyLine Points( n, pPtAry[i] ); - if( n > 2 ) - { - XLIB_Region pXRegB = XPolygonRegion( &Points[0], n+1, WindingRule ); - if( !pXRegA ) - pXRegA = pXRegB; - else - { - XXorRegion( pXRegA, pXRegB, pXRegA ); - XDestroyRegion( pXRegB ); - } - } - } - - if( pXRegA ) - { - XRectangle aXRect; - XClipBox( pXRegA, &aXRect ); - - GC pGC = SelectBrush(); - SetClipRegion( pGC, pXRegA ); // ??? doppelt - XDestroyRegion( pXRegA ); - bBrushGC_ = FALSE; - - XFillRectangle( GetXDisplay(), - GetDrawable(), - pGC, - aXRect.x, aXRect.y, aXRect.width, aXRect.height ); - } - } - - if( nPenColor_ != SALCOLOR_NONE ) - for( ULONG i = 0; i < nPoly; i++ ) - drawPolyLine( pPoints[i], pPtAry[i], true ); -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -sal_Bool X11SalGraphics::drawPolyLineBezier( ULONG, const SalPoint*, const BYTE* ) -{ - return sal_False; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -sal_Bool X11SalGraphics::drawPolygonBezier( ULONG, const SalPoint*, const BYTE* ) -{ - return sal_False; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -sal_Bool X11SalGraphics::drawPolyPolygonBezier( sal_uInt32, const sal_uInt32*, - const SalPoint* const*, const BYTE* const* ) -{ - return sal_False; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -void X11SalGraphics::invert( ULONG nPoints, - const SalPoint* pPtAry, - SalInvert nFlags ) -{ - SalPolyLine Points ( nPoints, pPtAry ); - - GC pGC; - if( SAL_INVERT_50 & nFlags ) - pGC = GetInvert50GC(); - else - if ( SAL_INVERT_TRACKFRAME & nFlags ) - pGC = GetTrackingGC(); - else - pGC = GetInvertGC(); - - if( SAL_INVERT_TRACKFRAME & nFlags ) - DrawLines ( nPoints, Points, pGC, true ); - else - XFillPolygon( GetXDisplay(), - GetDrawable(), - pGC, - &Points[0], nPoints, - Complex, CoordModeOrigin ); -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -BOOL X11SalGraphics::drawEPS( long,long,long,long,void*,ULONG ) -{ - return FALSE; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -XID X11SalGraphics::GetXRenderPicture() -{ - if( !m_aRenderPicture ) - { - // check xrender support for matching visual - // find a XRenderPictFormat compatible with the Drawable - XRenderPeer& rRenderPeer = XRenderPeer::GetInstance(); - XRenderPictFormat* pVisualFormat = static_cast(GetXRenderFormat()); - if( !pVisualFormat ) - { - Visual* pVisual = GetDisplay()->GetVisual( m_nScreen ).GetVisual(); - pVisualFormat = rRenderPeer.FindVisualFormat( pVisual ); - if( !pVisualFormat ) - return 0; - // cache the XRenderPictFormat - SetXRenderFormat( static_cast(pVisualFormat) ); - } - - // get the matching xrender target for drawable - m_aRenderPicture = rRenderPeer.CreatePicture( hDrawable_, pVisualFormat, 0, NULL ); - } - -#if 0 - // setup clipping so the callers don't have to do it themselves - // TODO: avoid clipping if already set correctly - if( pClipRegion_ && !XEmptyRegion( pClipRegion_ ) ) - rRenderPeer.SetPictureClipRegion( aDstPic, pClipRegion_ ); -#endif - - return m_aRenderPicture; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -SystemGraphicsData X11SalGraphics::GetGraphicsData() const -{ - SystemGraphicsData aRes; - - aRes.nSize = sizeof(aRes); - aRes.pDisplay = GetXDisplay(); - aRes.hDrawable = hDrawable_; - aRes.pVisual = GetDisplay()->GetVisual( m_nScreen ).GetVisual(); - aRes.nScreen = m_nScreen; - aRes.nDepth = GetDisplay()->GetVisual( m_nScreen ).GetDepth(); - aRes.aColormap = GetDisplay()->GetColormap( m_nScreen ).GetXColormap(); - aRes.pRenderFormat = m_pRenderFormat; - return aRes; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -// B2DPolygon support methods - -namespace { // anonymous namespace to prevent export -// the methods and structures here are used by the -// B2DPolyPolygon->RenderTrapezoid conversion algorithm - -// compare two line segments -// assumption: both segments point downward -// assumption: they must have at least some y-overlap -// assumption: rA.p1.y <= rB.p1.y -bool IsLeftOf( const XLineFixed& rA, const XLineFixed& rB ) -{ - bool bAbove = (rA.p1.y <= rB.p1.y); - const XLineFixed& rU = bAbove ? rA : rB; - const XLineFixed& rL = bAbove ? rB : rA; - - const XFixed aXDiff = rU.p2.x - rU.p1.x; - const XFixed aYDiff = rU.p2.y - rU.p1.y; - - if( (rU.p1.y != rL.p1.y) || (rU.p1.x != rL.p1.x) ) - { - const sal_Int64 n1 = (sal_Int64)aXDiff * (rL.p1.y - rU.p1.y); - const sal_Int64 n2 = (sal_Int64)aYDiff * (rL.p1.x - rU.p1.x); - if( n1 != n2 ) - return ((n1 < n2) == bAbove); - } - - if( (rU.p2.y != rL.p2.y) || (rU.p2.x != rL.p2.x) ) - { - const sal_Int64 n3 = (sal_Int64)aXDiff * (rL.p2.y - rU.p1.y); - const sal_Int64 n4 = (sal_Int64)aYDiff * (rL.p2.x - rU.p1.x); - if( n3 != n4 ) - return ((n3 < n4) == bAbove); - } - - // both segments overlap - return false; -} - -struct HalfTrapezoid -{ - // assumptions: - // maLine.p1.y <= mnY < maLine.p2.y - XLineFixed maLine; - XFixed mnY; -}; - -struct HalfTrapCompare -{ - bool operator()( const HalfTrapezoid& rA, const HalfTrapezoid& rB ) const - { - bool bIsTopLeft = false; - if( rA.mnY != rB.mnY ) // sort top-first if possible - bIsTopLeft = (rA.mnY < rB.mnY); - else // else sort left-first - bIsTopLeft = IsLeftOf( rA.maLine, rB.maLine ); - // adjust to priority_queue sorting convention - return !bIsTopLeft; - } -}; - -typedef std::priority_queue< HalfTrapezoid, std::vector, HalfTrapCompare > HTQueueBase; -// we need a priority queue with a reserve() to prevent countless reallocations -class HTQueue -: public HTQueueBase -{ -public: - void reserve( size_t n ) { c.reserve( n ); } - int capacity() { return c.capacity(); } -}; - -typedef std::vector TrapezoidVector; - -class TrapezoidXCompare -{ - const TrapezoidVector& mrVector; -public: - TrapezoidXCompare( const TrapezoidVector& rVector ) - : mrVector( rVector ) {} - bool operator()( int nA, int nB ) const - { return IsLeftOf( mrVector[nA].left, mrVector[nB].left ); } -}; - -typedef std::multiset< int, TrapezoidXCompare > ActiveTrapSet; - -class TrapezoidYCompare -{ - const TrapezoidVector& mrVector; -public: - TrapezoidYCompare( const TrapezoidVector& rVector ) - : mrVector( rVector ) {} - bool operator()( int nA, int nB ) const - { return (mrVector[nA].bottom < mrVector[nB].bottom); } -}; - -typedef std::multiset< int, TrapezoidYCompare > VerticalTrapSet; -} // end of anonymous namespace - -// draw a poly-polygon -bool X11SalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPoly, double fTransparency) -{ - // nothing to do for empty polypolygons - const int nPolygonCount = rPolyPoly.count(); - if( nPolygonCount <= 0 ) - return TRUE; - - // nothing to do if everything is transparent - if( (nBrushColor_ == SALCOLOR_NONE) - && (nPenColor_ == SALCOLOR_NONE) ) - return TRUE; - - // cannot handle pencolor!=brushcolor yet - if( (nPenColor_ != SALCOLOR_NONE) - && (nPenColor_ != nBrushColor_) ) - return FALSE; - - // TODO: remove the env-variable when no longer needed - static const char* pRenderEnv = getenv( "SAL_DISABLE_RENDER_POLY" ); - if( pRenderEnv ) - return FALSE; - - // check xrender support for trapezoids - XRenderPeer& rRenderPeer = XRenderPeer::GetInstance(); - if( !rRenderPeer.AreTrapezoidsSupported() ) - return FALSE; - Picture aDstPic = GetXRenderPicture(); - // check xrender support for this drawable - if( !aDstPic ) - return FALSE; - - // don't bother with polygons outside of visible area - const basegfx::B2DRange aViewRange( 0, 0, GetGraphicsWidth(), GetGraphicsHeight() ); - const basegfx::B2DRange aPolyRange = basegfx::tools::getRange( rPolyPoly ); - const bool bNeedViewClip = !aPolyRange.isInside( aViewRange ); - if( !aPolyRange.overlaps( aViewRange ) ) - return true; - - // convert the polypolygon to trapezoids - - // first convert the B2DPolyPolygon to HalfTrapezoids - // #i100922# try to prevent priority-queue reallocations by reservering enough - int nHTQueueReserve = 0; - for( int nOuterPolyIdx = 0; nOuterPolyIdx < nPolygonCount; ++nOuterPolyIdx ) - { - const ::basegfx::B2DPolygon aOuterPolygon = rPolyPoly.getB2DPolygon( nOuterPolyIdx ); - const int nPointCount = aOuterPolygon.count(); - nHTQueueReserve += aOuterPolygon.areControlPointsUsed() ? 8 * nPointCount : nPointCount; - } - nHTQueueReserve = ((4*nHTQueueReserve) | 0x1FFF) + 1; - HTQueue aHTQueue; - aHTQueue.reserve( nHTQueueReserve ); - for( int nOuterPolyIdx = 0; nOuterPolyIdx < nPolygonCount; ++nOuterPolyIdx ) - { - const ::basegfx::B2DPolygon aOuterPolygon = rPolyPoly.getB2DPolygon( nOuterPolyIdx ); - - // render-trapezoids should be inside the view => clip polygon against view range - basegfx::B2DPolyPolygon aClippedPolygon( aOuterPolygon ); - if( bNeedViewClip ) - { - aClippedPolygon = basegfx::tools::clipPolygonOnRange( aOuterPolygon, aViewRange, true, false ); - DBG_ASSERT( aClippedPolygon.count(), "polygon confirmed to overlap with view should not get here" ); - if( !aClippedPolygon.count() ) - continue; - } - - // render-trapezoids have linear edges => get rid of bezier segments - if( aClippedPolygon.areControlPointsUsed() ) - aClippedPolygon = ::basegfx::tools::adaptiveSubdivideByDistance( aClippedPolygon, 0.125 ); - - // test and remove self intersections - // TODO: make code intersection save, then remove this test - basegfx::B2DPolyPolygon aInnerPolyPoly(basegfx::tools::solveCrossovers( aClippedPolygon)); - const int nInnerPolyCount = aInnerPolyPoly.count(); - for( int nInnerPolyIdx = 0; nInnerPolyIdx < nInnerPolyCount; ++nInnerPolyIdx ) - { - ::basegfx::B2DPolygon aInnerPolygon = aInnerPolyPoly.getB2DPolygon( nInnerPolyIdx ); - const int nPointCount = aInnerPolygon.count(); - if( !nPointCount ) - continue; - - aHTQueue.reserve( aHTQueue.size() + 8 * nPointCount ); - - // convert polygon point pairs to HalfTrapezoids - // connect the polygon point with the first one if needed - XPointFixed aOldXPF = { 0, 0 }; - XPointFixed aNewXPF; - for( int nPointIdx = 0; nPointIdx <= nPointCount; ++nPointIdx, aOldXPF = aNewXPF ) - { - const int k = (nPointIdx < nPointCount) ? nPointIdx : 0; - const ::basegfx::B2DPoint& aPoint = aInnerPolygon.getB2DPoint( k ); - - // convert the B2DPoint into XRENDER units - if(getAntiAliasB2DDraw()) - { - aNewXPF.x = XDoubleToFixed( aPoint.getX() ); - aNewXPF.y = XDoubleToFixed( aPoint.getY() ); - } - else - { - aNewXPF.x = XDoubleToFixed( basegfx::fround( aPoint.getX() ) ); - aNewXPF.y = XDoubleToFixed( basegfx::fround( aPoint.getY() ) ); - } - - // check if enough data is available for a new HalfTrapezoid - if( nPointIdx == 0 ) - continue; - // ignore vertical segments - if( aNewXPF.y == aOldXPF.y ) - continue; - - // construct HalfTrapezoid as topdown segment - HalfTrapezoid aHT; - if( aNewXPF.y < aOldXPF.y ) - { - aHT.maLine.p1 = aNewXPF; - aHT.maLine.p2 = aOldXPF; - } - else - { - aHT.maLine.p2 = aNewXPF; - aHT.maLine.p1 = aOldXPF; - } - - aHT.mnY = aHT.maLine.p1.y; - -#if 0 // ignore clipped HalfTrapezoids - if( aHT.mnY < 0 ) - aHT.mnY = 0; - else if( aHT.mnY > 10000 ) - continue; -#endif - - // queue up the HalfTrapezoid - aHTQueue.push( aHT ); - } - } - } - - if( aHTQueue.empty() ) - return TRUE; - - // then convert the HalfTrapezoids into full Trapezoids - TrapezoidVector aTrapVector; - aTrapVector.reserve( aHTQueue.size() * 2 ); // just a guess - - TrapezoidXCompare aTrapXCompare( aTrapVector ); - ActiveTrapSet aActiveTraps( aTrapXCompare ); - - TrapezoidYCompare aTrapYCompare( aTrapVector ); - VerticalTrapSet aVerticalTraps( aTrapYCompare ); - - while( !aHTQueue.empty() ) - { - XTrapezoid aTrapezoid; - - // convert a HalfTrapezoid pair - const HalfTrapezoid& rLeft = aHTQueue.top(); - aTrapezoid.top = rLeft.mnY; - aTrapezoid.bottom = rLeft.maLine.p2.y; - aTrapezoid.left = rLeft.maLine; - -#if 0 - // ignore empty trapezoids - if( aTrapezoid.bottom <= aTrapezoid.top ) - continue; -#endif - - aHTQueue.pop(); - if( aHTQueue.empty() ) // TODO: assert - break; - const HalfTrapezoid& rRight = aHTQueue.top(); - aTrapezoid.right = rRight.maLine; - aHTQueue.pop(); - - aTrapezoid.bottom = aTrapezoid.left.p2.y; - if( aTrapezoid.bottom > aTrapezoid.right.p2.y ) - aTrapezoid.bottom = aTrapezoid.right.p2.y; - - // keep the full Trapezoid candidate - aTrapVector.push_back( aTrapezoid ); - - // unless it splits an older trapezoid - bool bSplit = false; - for(;;) - { - // check if the new trapezoid overlaps with an old trapezoid - ActiveTrapSet::iterator aActiveTrapsIt - = aActiveTraps.upper_bound( aTrapVector.size()-1 ); - if( aActiveTrapsIt == aActiveTraps.begin() ) - break; - --aActiveTrapsIt; - - XTrapezoid& rLeftTrap = aTrapVector[ *aActiveTrapsIt ]; - - // in the ActiveTrapSet there are still trapezoids where - // a vertical overlap with new trapezoids is no longer possible - // they could have been removed in the verticaltraps loop below - // but this would have been expensive and is not needed as we can - // simply ignore them now and remove them from the ActiveTrapSet - // so they won't bother us in the future - if( rLeftTrap.bottom <= aTrapezoid.top ) - { - aActiveTraps.erase( aActiveTrapsIt ); - continue; - } - - // check if there is horizontal overlap - // aTrapezoid.left==rLeftTrap.right is allowed though - if( !IsLeftOf( aTrapezoid.left, rLeftTrap.right ) ) - break; - - // split the old trapezoid and keep its upper part - // find the old trapezoids entry in the VerticalTrapSet and remove it - typedef std::pair VTSPair; - VTSPair aVTSPair = aVerticalTraps.equal_range( *aActiveTrapsIt ); - VerticalTrapSet::iterator aVTSit = aVTSPair.first; - for(; (aVTSit != aVTSPair.second) && (*aVTSit != *aActiveTrapsIt); ++aVTSit ) ; - if( aVTSit != aVTSPair.second ) - aVerticalTraps.erase( aVTSit ); - // then update the old trapezoid's bottom - rLeftTrap.bottom = aTrapezoid.top; - // enter the updated old trapzoid in VerticalTrapSet - aVerticalTraps.insert( aVerticalTraps.begin(), *aActiveTrapsIt ); - // the old trapezoid is no longer active - aActiveTraps.erase( aActiveTrapsIt ); - - // the trapezoid causing the split has become obsolete - // so its both sides have to be re-queued - HalfTrapezoid aHT; - aHT.mnY = aTrapezoid.top; - aHT.maLine = aTrapezoid.left; - aHTQueue.push( aHT ); - aHT.maLine = aTrapezoid.right; - aHTQueue.push( aHT ); - - bSplit = true; - break; - } - - // keep or forget the resulting full Trapezoid - if( bSplit ) - aTrapVector.pop_back(); - else - { - aActiveTraps.insert( aTrapVector.size()-1 ); - aVerticalTraps.insert( aTrapVector.size()-1 ); - } - - // mark trapezoids that can no longer be split as inactive - // and recycle their sides which were not fully resolved - static const XFixed nMaxTop = +0x7FFFFFFF; - XFixed nNewTop = aHTQueue.empty() ? nMaxTop : aHTQueue.top().mnY; - while( !aVerticalTraps.empty() ) - { - const XTrapezoid& rOldTrap = aTrapVector[ *aVerticalTraps.begin() ]; - if( nNewTop < rOldTrap.bottom ) - break; - // the reference Trapezoid can no longer be split - aVerticalTraps.erase( aVerticalTraps.begin() ); - - // recycle its sides that were not fully resolved - HalfTrapezoid aHT; - aHT.mnY = rOldTrap.bottom; - if( rOldTrap.left.p2.y > rOldTrap.bottom ) - { - aHT.maLine = rOldTrap.left; - aHTQueue.push( aHT ); - } - if( rOldTrap.right.p2.y > rOldTrap.bottom ) - { - aHT.maLine = rOldTrap.right; - aHTQueue.push( aHT ); - } - } - } - - // create xrender Picture for polygon foreground - SalDisplay::RenderEntry& rEntry = GetDisplay()->GetRenderEntries( m_nScreen )[ 32 ]; - if( !rEntry.m_aPicture ) - { - Display* pXDisplay = GetXDisplay(); - - rEntry.m_aPixmap = ::XCreatePixmap( pXDisplay, hDrawable_, 1, 1, 32 ); - XRenderPictureAttributes aAttr; - aAttr.repeat = true; - - XRenderPictFormat* pXRPF = rRenderPeer.FindStandardFormat( PictStandardARGB32 ); - rEntry.m_aPicture = rRenderPeer.CreatePicture( rEntry.m_aPixmap, pXRPF, CPRepeat, &aAttr ); - } - - // set polygon foreground color and opacity - XRenderColor aRenderColor = GetXRenderColor( nBrushColor_ , fTransparency ); - rRenderPeer.FillRectangle( PictOpSrc, rEntry.m_aPicture, &aRenderColor, 0, 0, 1, 1 ); - - // set clipping - // TODO: move into GetXRenderPicture? - if( pClipRegion_ && !XEmptyRegion( pClipRegion_ ) ) - rRenderPeer.SetPictureClipRegion( aDstPic, pClipRegion_ ); - - // render the trapezoids - const XRenderPictFormat* pMaskFormat = rRenderPeer.GetStandardFormatA8(); - rRenderPeer.CompositeTrapezoids( PictOpOver, - rEntry.m_aPicture, aDstPic, pMaskFormat, 0, 0, &aTrapVector[0], aTrapVector.size() ); - - return TRUE; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -bool X11SalGraphics::drawPolyLine(const ::basegfx::B2DPolygon& rPolygon, const ::basegfx::B2DVector& rLineWidth, basegfx::B2DLineJoin eLineJoin) -{ - const XRenderPeer& rRenderPeer = XRenderPeer::GetInstance(); - if( !rRenderPeer.AreTrapezoidsSupported() ) - return false; - - // get the area polygon for the line polygon - basegfx::B2DPolygon aPolygon = rPolygon; - if( (rLineWidth.getX() != rLineWidth.getY()) - && !basegfx::fTools::equalZero( rLineWidth.getY() ) ) - { - // prepare for createAreaGeometry() with anisotropic linewidth - basegfx::B2DHomMatrix aAnisoMatrix; - aAnisoMatrix.scale( 1.0, rLineWidth.getX() / rLineWidth.getY() ); - aPolygon.transform( aAnisoMatrix ); - } - - // AW: reSegment no longer needed; new createAreaGeometry will remove exteme positions - // and create bezier polygons - //if( aPolygon.areControlPointsUsed() ) - // aPolygon = basegfx::tools::reSegmentPolygonEdges( aPolygon, 8, true, false ); - //const basegfx::B2DPolyPolygon aAreaPolyPoly = basegfx::tools::createAreaGeometryForSimplePolygon( - // aPolygon, 0.5*rLineWidth.getX(), eLineJoin ); - const basegfx::B2DPolyPolygon aAreaPolyPoly(basegfx::tools::createAreaGeometry(aPolygon, 0.5*rLineWidth.getX(), eLineJoin)); - - if( (rLineWidth.getX() != rLineWidth.getY()) - && !basegfx::fTools::equalZero( rLineWidth.getX() ) ) - { - // postprocess createAreaGeometry() for anisotropic linewidth - basegfx::B2DHomMatrix aAnisoMatrix; - aAnisoMatrix.scale( 1.0, rLineWidth.getY() / rLineWidth.getX() ); - aPolygon.transform( aAnisoMatrix ); - } - - // temporarily adjust brush color to pen color - // since the line is drawn as an area-polygon - const SalColor aKeepBrushColor = nBrushColor_; - nBrushColor_ = nPenColor_; - - // draw each area polypolygon component individually - // to emulate the polypolygon winding rule "non-zero" - bool bDrawOk = true; - const int nPolyCount = aAreaPolyPoly.count(); - for( int nPolyIdx = 0; nPolyIdx < nPolyCount; ++nPolyIdx ) - { - const ::basegfx::B2DPolyPolygon aOnePoly( aAreaPolyPoly.getB2DPolygon( nPolyIdx ) ); - bDrawOk = drawPolyPolygon( aOnePoly, 0.0); - if( !bDrawOk ) - break; - } - - // restore the original brush GC - nBrushColor_ = aKeepBrushColor; - return bDrawOk; -} - -// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_vcl.hxx" + +#include "Xproto.h" + +#include "salunx.h" +#include "saldata.hxx" +#include "saldisp.hxx" +#include "salgdi.h" +#include "salframe.h" +#include "salvd.h" +#include "xrender_peer.hxx" + +#include "vcl/printergfx.hxx" +#include "vcl/jobdata.hxx" + +#include "tools/debug.hxx" + +#include "basegfx/polygon/b2dpolygon.hxx" +#include "basegfx/polygon/b2dpolypolygon.hxx" +#include "basegfx/polygon/b2dpolypolygontools.hxx" +#include "basegfx/polygon/b2dpolygontools.hxx" +#include "basegfx/polygon/b2dpolygonclipper.hxx" +#include "basegfx/polygon/b2dlinegeometry.hxx" +#include "basegfx/matrix/b2dhommatrix.hxx" +#include "basegfx/polygon/b2dpolypolygoncutter.hxx" + +#include +#include +#include + +// -=-= SalPolyLine =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#define STATIC_POINTS 64 + +class SalPolyLine +{ + XPoint Points_[STATIC_POINTS]; + XPoint *pFirst_; +public: + inline SalPolyLine( ULONG nPoints ); + inline SalPolyLine( ULONG nPoints, const SalPoint *p ); + inline ~SalPolyLine(); + inline XPoint &operator [] ( ULONG n ) const + { return pFirst_[n]; } +}; + +inline SalPolyLine::SalPolyLine( ULONG nPoints ) + : pFirst_( nPoints+1 > STATIC_POINTS ? new XPoint[nPoints+1] : Points_ ) +{} + +inline SalPolyLine::SalPolyLine( ULONG nPoints, const SalPoint *p ) + : pFirst_( nPoints+1 > STATIC_POINTS ? new XPoint[nPoints+1] : Points_ ) +{ + for( ULONG i = 0; i < nPoints; i++ ) + { + pFirst_[i].x = (short)p[i].mnX; + pFirst_[i].y = (short)p[i].mnY; + } + pFirst_[nPoints] = pFirst_[0]; // close polyline +} + +inline SalPolyLine::~SalPolyLine() +{ if( pFirst_ != Points_ ) delete [] pFirst_; } + +#undef STATIC_POINTS +// -=-= X11SalGraphics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +X11SalGraphics::X11SalGraphics() +{ + m_pFrame = NULL; + m_pVDev = NULL; + m_pDeleteColormap = NULL; + hDrawable_ = None; + m_aRenderPicture = 0; + m_pRenderFormat = NULL; + + pClipRegion_ = NULL; + pPaintRegion_ = NULL; + + pPenGC_ = NULL; + nPenPixel_ = 0; + nPenColor_ = MAKE_SALCOLOR( 0x00, 0x00, 0x00 ); // Black + + pFontGC_ = NULL; + for( int i = 0; i < MAX_FALLBACK; ++i ) + { + mXFont[i] = NULL; + mpServerFont[i] = NULL; + } + + nTextPixel_ = 0; + nTextColor_ = MAKE_SALCOLOR( 0x00, 0x00, 0x00 ); // Black + +#ifdef ENABLE_GRAPHITE + // check if graphite fonts have been disabled + static const char* pDisableGraphiteStr = getenv( "SAL_DISABLE_GRAPHITE" ); + bDisableGraphite_ = pDisableGraphiteStr ? (pDisableGraphiteStr[0]!='0') : FALSE; +#endif + + pBrushGC_ = NULL; + nBrushPixel_ = 0; + nBrushColor_ = MAKE_SALCOLOR( 0xFF, 0xFF, 0xFF ); // White + hBrush_ = None; + + pMonoGC_ = NULL; + pCopyGC_ = NULL; + pMaskGC_ = NULL; + pInvertGC_ = NULL; + pInvert50GC_ = NULL; + pStippleGC_ = NULL; + pTrackingGC_ = NULL; + + bWindow_ = FALSE; + bPrinter_ = FALSE; + bVirDev_ = FALSE; + bPenGC_ = FALSE; + bFontGC_ = FALSE; + bBrushGC_ = FALSE; + bMonoGC_ = FALSE; + bCopyGC_ = FALSE; + bInvertGC_ = FALSE; + bInvert50GC_ = FALSE; + bStippleGC_ = FALSE; + bTrackingGC_ = FALSE; + bXORMode_ = FALSE; + bDitherBrush_ = FALSE; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +X11SalGraphics::~X11SalGraphics() +{ + ReleaseFonts(); + freeResources(); +} + +// -=-= SalGraphics / X11SalGraphics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +void X11SalGraphics::freeResources() +{ + Display *pDisplay = GetXDisplay(); + + DBG_ASSERT( !pPaintRegion_, "pPaintRegion_" ); + if( pClipRegion_ ) XDestroyRegion( pClipRegion_ ), pClipRegion_ = None; + + if( hBrush_ ) XFreePixmap( pDisplay, hBrush_ ), hBrush_ = None; + if( pPenGC_ ) XFreeGC( pDisplay, pPenGC_ ), pPenGC_ = None; + if( pFontGC_ ) XFreeGC( pDisplay, pFontGC_ ), pFontGC_ = None; + if( pBrushGC_ ) XFreeGC( pDisplay, pBrushGC_ ), pBrushGC_ = None; + if( pMonoGC_ ) XFreeGC( pDisplay, pMonoGC_ ), pMonoGC_ = None; + if( pCopyGC_ ) XFreeGC( pDisplay, pCopyGC_ ), pCopyGC_ = None; + if( pMaskGC_ ) XFreeGC( pDisplay, pMaskGC_ ), pMaskGC_ = None; + if( pInvertGC_ ) XFreeGC( pDisplay, pInvertGC_ ), pInvertGC_ = None; + if( pInvert50GC_ ) XFreeGC( pDisplay, pInvert50GC_ ), pInvert50GC_ = None; + if( pStippleGC_ ) XFreeGC( pDisplay, pStippleGC_ ), pStippleGC_ = None; + if( pTrackingGC_ ) XFreeGC( pDisplay, pTrackingGC_ ), pTrackingGC_ = None; + if( m_pDeleteColormap ) + delete m_pDeleteColormap, m_pColormap = m_pDeleteColormap = NULL; + + if( m_aRenderPicture ) + XRenderPeer::GetInstance().FreePicture( m_aRenderPicture ), m_aRenderPicture = 0; + + bPenGC_ = bFontGC_ = bBrushGC_ = bMonoGC_ = bCopyGC_ = bInvertGC_ = bInvert50GC_ = bStippleGC_ = bTrackingGC_ = false; +} + +void X11SalGraphics::SetDrawable( Drawable aDrawable, int nScreen ) +{ + // shortcut if nothing changed + if( hDrawable_ == aDrawable ) + return; + + // free screen specific resources if needed + if( nScreen != m_nScreen ) + { + freeResources(); + m_pColormap = &GetX11SalData()->GetDisplay()->GetColormap( nScreen ); + m_nScreen = nScreen; + } + + hDrawable_ = aDrawable; + SetXRenderFormat( NULL ); + if( m_aRenderPicture ) + { + XRenderPeer::GetInstance().FreePicture( m_aRenderPicture ); + m_aRenderPicture = 0; + } + + if( hDrawable_ ) + { + nPenPixel_ = GetPixel( nPenColor_ ); + nTextPixel_ = GetPixel( nTextColor_ ); + nBrushPixel_ = GetPixel( nBrushColor_ ); + } +} + +void X11SalGraphics::Init( SalFrame *pFrame, Drawable aTarget, int nScreen ) +{ +#if 0 // TODO: use SetDrawable() instead + m_pColormap = &GetX11SalData()->GetDisplay()->GetColormap(nScreen); + hDrawable_ = aTarget; + m_nScreen = nScreen; + SetXRenderFormat( NULL ); + if( m_aRenderPicture ) + XRenderPeer::GetInstance().FreePicture( m_aRenderPicture ), m_aRenderPicture = 0; + + nPenPixel_ = GetPixel( nPenColor_ ); + nTextPixel_ = GetPixel( nTextColor_ ); + nBrushPixel_ = GetPixel( nBrushColor_ ); +#else + m_pColormap = &GetX11SalData()->GetDisplay()->GetColormap(nScreen); + m_nScreen = nScreen; + SetDrawable( aTarget, nScreen ); +#endif + + bWindow_ = TRUE; + m_pFrame = pFrame; + m_pVDev = NULL; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::DeInit() +{ + SetDrawable( None, m_nScreen ); +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::SetClipRegion( GC pGC, XLIB_Region pXReg ) const +{ + Display *pDisplay = GetXDisplay(); + + int n = 0; + XLIB_Region Regions[3]; + + if( pClipRegion_ /* && !XEmptyRegion( pClipRegion_ ) */ ) + Regions[n++] = pClipRegion_; +// if( pPaintRegion_ /* && !XEmptyRegion( pPaintRegion_ ) */ ) +// Regions[n++] = pPaintRegion_; + + if( pXReg && !XEmptyRegion( pXReg ) ) + Regions[n++] = pXReg; + + if( 0 == n ) + XSetClipMask( pDisplay, pGC, None ); + else if( 1 == n ) + XSetRegion( pDisplay, pGC, Regions[0] ); + else + { + XLIB_Region pTmpRegion = XCreateRegion(); + XIntersectRegion( Regions[0], Regions[1], pTmpRegion ); +// if( 3 == n ) +// XIntersectRegion( Regions[2], pTmpRegion, pTmpRegion ); + XSetRegion( pDisplay, pGC, pTmpRegion ); + XDestroyRegion( pTmpRegion ); + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +GC X11SalGraphics::SelectPen() +{ + Display *pDisplay = GetXDisplay(); + + if( !pPenGC_ ) + { + XGCValues values; + values.subwindow_mode = ClipByChildren; + values.fill_rule = EvenOddRule; // Pict import/ Gradient + values.graphics_exposures = False; + + pPenGC_ = XCreateGC( pDisplay, hDrawable_, + GCSubwindowMode | GCFillRule | GCGraphicsExposures, + &values ); + } + + if( !bPenGC_ ) + { + if( nPenColor_ != SALCOLOR_NONE ) + XSetForeground( pDisplay, pPenGC_, nPenPixel_ ); + XSetFunction ( pDisplay, pPenGC_, bXORMode_ ? GXxor : GXcopy ); + SetClipRegion( pPenGC_ ); + bPenGC_ = TRUE; + } + + return pPenGC_; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +GC X11SalGraphics::SelectBrush() +{ + Display *pDisplay = GetXDisplay(); + + DBG_ASSERT( nBrushColor_ != SALCOLOR_NONE, "Brush Transparent" ); + + if( !pBrushGC_ ) + { + XGCValues values; + // values.subwindow_mode = IncludeInferiors; + values.subwindow_mode = ClipByChildren; + values.fill_rule = EvenOddRule; // Pict import/ Gradient + values.graphics_exposures = False; + + pBrushGC_ = XCreateGC( pDisplay, hDrawable_, + GCSubwindowMode | GCFillRule | GCGraphicsExposures, + &values ); + } + + if( !bBrushGC_ ) + { + if( !bDitherBrush_ ) + { + XSetFillStyle ( pDisplay, pBrushGC_, FillSolid ); + XSetForeground( pDisplay, pBrushGC_, nBrushPixel_ ); + #if defined(_USE_PRINT_EXTENSION_) + XSetBackground( pDisplay, pBrushGC_, + WhitePixel(pDisplay, DefaultScreen(pDisplay)) ); + #else + if( bPrinter_ ) + XSetTile( pDisplay, pBrushGC_, None ); + #endif + } + else + { + // Bug in Sun Solaris 2.5.1, XFillPolygon doesn't allways reflect + // changes of the tile. PROPERTY_BUG_Tile doesn't fix this ! + if (GetDisplay()->GetProperties() & PROPERTY_BUG_FillPolygon_Tile) + XSetFillStyle ( pDisplay, pBrushGC_, FillSolid ); + + XSetFillStyle ( pDisplay, pBrushGC_, FillTiled ); + XSetTile ( pDisplay, pBrushGC_, hBrush_ ); + } + XSetFunction ( pDisplay, pBrushGC_, bXORMode_ ? GXxor : GXcopy ); + SetClipRegion( pBrushGC_ ); + + bBrushGC_ = TRUE; + } + + return pBrushGC_; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +GC X11SalGraphics::GetTrackingGC() +{ + const char dash_list[2] = {2, 2}; + + if( !pTrackingGC_ ) + { + XGCValues values; + + values.graphics_exposures = False; + values.foreground = m_pColormap->GetBlackPixel() + ^ m_pColormap->GetWhitePixel(); + values.function = GXxor; + values.line_width = 1; + values.line_style = LineOnOffDash; + + pTrackingGC_ = XCreateGC( GetXDisplay(), GetDrawable(), + GCGraphicsExposures | GCForeground | GCFunction + | GCLineWidth | GCLineStyle, + &values ); + XSetDashes( GetXDisplay(), pTrackingGC_, 0, dash_list, 2 ); + } + + if( !bTrackingGC_ ) + { + SetClipRegion( pTrackingGC_ ); + bTrackingGC_ = TRUE; + } + + return pTrackingGC_; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::DrawLines( ULONG nPoints, + const SalPolyLine &rPoints, + GC pGC, + bool bClose + ) +{ + // errechne wie viele Linien XWindow auf einmal zeichnen kann + ULONG nMaxLines = (GetDisplay()->GetMaxRequestSize() - sizeof(xPolyPointReq)) + / sizeof(xPoint); + if( nMaxLines > nPoints ) nMaxLines = nPoints; + + // gebe alle Linien aus, die XWindows zeichnen kann. + ULONG n; + for( n = 0; nPoints - n > nMaxLines; n += nMaxLines - 1 ) + XDrawLines( GetXDisplay(), + GetDrawable(), + pGC, + &rPoints[n], + nMaxLines, + CoordModeOrigin ); + + if( n < nPoints ) + XDrawLines( GetXDisplay(), + GetDrawable(), + pGC, + &rPoints[n], + nPoints - n, + CoordModeOrigin ); + if( bClose ) + { + if( rPoints[nPoints-1].x != rPoints[0].x || rPoints[nPoints-1].y != rPoints[0].y ) + drawLine( rPoints[nPoints-1].x, rPoints[nPoints-1].y, rPoints[0].x, rPoints[0].y ); + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// Dithern: Calculate a dither-pixmap and make a brush of it +#define P_DELTA 51 +#define DMAP( v, m ) ((v % P_DELTA) > m ? (v / P_DELTA) + 1 : (v / P_DELTA)) + +BOOL X11SalGraphics::GetDitherPixmap( SalColor nSalColor ) +{ + static const short nOrdDither8Bit[ 8 ][ 8 ] = + { + { 0, 38, 9, 48, 2, 40, 12, 50}, + {25, 12, 35, 22, 28, 15, 37, 24}, + { 6, 44, 3, 41, 8, 47, 5, 44}, + {32, 19, 28, 16, 34, 21, 31, 18}, + { 1, 40, 11, 49, 0, 39, 10, 48}, + {27, 14, 36, 24, 26, 13, 36, 23}, + { 8, 46, 4, 43, 7, 45, 4, 42}, + {33, 20, 30, 17, 32, 20, 29, 16} + }; + + // test for correct depth (8bit) + if( GetColormap().GetVisual().GetDepth() != 8 ) + return FALSE; + + char pBits[64]; + char *pBitsPtr = pBits; + + // Set the pallette-entries for the dithering tile + UINT8 nSalColorRed = SALCOLOR_RED ( nSalColor ); + UINT8 nSalColorGreen = SALCOLOR_GREEN ( nSalColor ); + UINT8 nSalColorBlue = SALCOLOR_BLUE ( nSalColor ); + + for( int nY = 0; nY < 8; nY++ ) + { + for( int nX = 0; nX < 8; nX++ ) + { + short nMagic = nOrdDither8Bit[nY][nX]; + UINT8 nR = P_DELTA * DMAP( nSalColorRed, nMagic ); + UINT8 nG = P_DELTA * DMAP( nSalColorGreen, nMagic ); + UINT8 nB = P_DELTA * DMAP( nSalColorBlue, nMagic ); + + *pBitsPtr++ = GetColormap().GetPixel( MAKE_SALCOLOR( nR, nG, nB ) ); + } + } + + // create the tile as ximage and an according pixmap -> caching + XImage *pImage = XCreateImage( GetXDisplay(), + GetColormap().GetXVisual(), + 8, + ZPixmap, + 0, // offset + pBits, // data + 8, 8, // width & height + 8, // bitmap_pad + 0 ); // (default) bytes_per_line + + if ( GetDisplay()->GetProperties() & PROPERTY_BUG_Tile ) + { + if (hBrush_) + XFreePixmap (GetXDisplay(), hBrush_); + hBrush_ = XCreatePixmap( GetXDisplay(), GetDrawable(), 8, 8, 8 ); + } + else + if( !hBrush_ ) + hBrush_ = XCreatePixmap( GetXDisplay(), GetDrawable(), 8, 8, 8 ); + + // put the ximage to the pixmap + XPutImage( GetXDisplay(), + hBrush_, + GetDisplay()->GetCopyGC( m_nScreen ), + pImage, + 0, 0, // Source + 0, 0, // Destination + 8, 8 ); // width & height + + // destroy image-frame but not palette-data + pImage->data = NULL; + XDestroyImage( pImage ); + + return TRUE; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::GetResolution( sal_Int32 &rDPIX, sal_Int32 &rDPIY ) // const +{ + const SalDisplay *pDisplay = GetDisplay(); + + rDPIX = pDisplay->GetResolution().A(); + rDPIY = pDisplay->GetResolution().B(); + if( !pDisplay->GetExactResolution() && rDPIY < 96 ) + { + rDPIX = Divide( rDPIX * 96, rDPIY ); + rDPIY = 96; + } + else if ( rDPIY > 200 ) + { + rDPIX = Divide( rDPIX * 200, rDPIY ); + rDPIY = 200; + } + + // #i12705# equalize x- and y-resolution if they are close enough + if( rDPIX != rDPIY ) + { + // different x- and y- resolutions are usually artifacts of + // a wrongly calculated screen size. + //if( (13*rDPIX >= 10*rDPIY) && (13*rDPIY >= 10*rDPIX) ) //+-30% + { +#ifdef DEBUG + printf("Forcing Resolution from %" SAL_PRIdINT32 "x%" SAL_PRIdINT32 " to %" SAL_PRIdINT32 "x%" SAL_PRIdINT32 "\n", + rDPIX,rDPIY,rDPIY,rDPIY); +#endif + rDPIX = rDPIY; // y-resolution is more trustworthy + } + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +USHORT X11SalGraphics::GetBitCount() // const +{ + return GetVisual().GetDepth(); +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +long X11SalGraphics::GetGraphicsWidth() const +{ + if( m_pFrame ) + return m_pFrame->maGeometry.nWidth; + else if( m_pVDev ) + return m_pVDev->GetWidth(); + else + return 0; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +long X11SalGraphics::GetGraphicsHeight() const +{ + if( m_pFrame ) + return m_pFrame->maGeometry.nHeight; + else if( m_pVDev ) + return m_pVDev->GetHeight(); + else + return 0; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::ResetClipRegion() +{ + if( pClipRegion_ ) + { + bPenGC_ = FALSE; + bFontGC_ = FALSE; + bBrushGC_ = FALSE; + bMonoGC_ = FALSE; + bCopyGC_ = FALSE; + bInvertGC_ = FALSE; + bInvert50GC_ = FALSE; + bStippleGC_ = FALSE; + bTrackingGC_ = FALSE; + + XDestroyRegion( pClipRegion_ ); + pClipRegion_ = NULL; + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::BeginSetClipRegion( ULONG ) +{ + if( pClipRegion_ ) + XDestroyRegion( pClipRegion_ ); + pClipRegion_ = XCreateRegion(); +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +BOOL X11SalGraphics::unionClipRegion( long nX, long nY, long nDX, long nDY ) +{ + if (!nDX || !nDY) + return TRUE; + + XRectangle aRect; + aRect.x = (short)nX; + aRect.y = (short)nY; + aRect.width = (unsigned short)nDX; + aRect.height = (unsigned short)nDY; + + XUnionRectWithRegion( &aRect, pClipRegion_, pClipRegion_ ); + + return TRUE; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +bool X11SalGraphics::unionClipRegion( const ::basegfx::B2DPolyPolygon& ) +{ + // TODO: implement and advertise OutDevSupport_B2DClip support + return false; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::EndSetClipRegion() +{ + bPenGC_ = FALSE; + bFontGC_ = FALSE; + bBrushGC_ = FALSE; + bMonoGC_ = FALSE; + bCopyGC_ = FALSE; + bInvertGC_ = FALSE; + bInvert50GC_ = FALSE; + bStippleGC_ = FALSE; + bTrackingGC_ = FALSE; + + if( XEmptyRegion( pClipRegion_ ) ) + { + XDestroyRegion( pClipRegion_ ); + pClipRegion_= NULL; + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::SetLineColor() +{ + if( nPenColor_ != SALCOLOR_NONE ) + { + nPenColor_ = SALCOLOR_NONE; + bPenGC_ = FALSE; + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::SetLineColor( SalColor nSalColor ) +{ + if( nPenColor_ != nSalColor ) + { + nPenColor_ = nSalColor; + nPenPixel_ = GetPixel( nSalColor ); + bPenGC_ = FALSE; + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::SetFillColor() +{ + if( nBrushColor_ != SALCOLOR_NONE ) + { + bDitherBrush_ = FALSE; + nBrushColor_ = SALCOLOR_NONE; + bBrushGC_ = FALSE; + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::SetFillColor( SalColor nSalColor ) +{ + if( nBrushColor_ != nSalColor ) + { + bDitherBrush_ = FALSE; + nBrushColor_ = nSalColor; + nBrushPixel_ = GetPixel( nSalColor ); + if( TrueColor != GetColormap().GetVisual().GetClass() + && GetColormap().GetColor( nBrushPixel_ ) != nBrushColor_ + && nSalColor != MAKE_SALCOLOR( 0x00, 0x00, 0x00 ) // black + && nSalColor != MAKE_SALCOLOR( 0x00, 0x00, 0x80 ) // blue + && nSalColor != MAKE_SALCOLOR( 0x00, 0x80, 0x00 ) // green + && nSalColor != MAKE_SALCOLOR( 0x00, 0x80, 0x80 ) // cyan + && nSalColor != MAKE_SALCOLOR( 0x80, 0x00, 0x00 ) // red + && nSalColor != MAKE_SALCOLOR( 0x80, 0x00, 0x80 ) // magenta + && nSalColor != MAKE_SALCOLOR( 0x80, 0x80, 0x00 ) // brown + && nSalColor != MAKE_SALCOLOR( 0x80, 0x80, 0x80 ) // gray + && nSalColor != MAKE_SALCOLOR( 0xC0, 0xC0, 0xC0 ) // light gray + && nSalColor != MAKE_SALCOLOR( 0x00, 0x00, 0xFF ) // light blue + && nSalColor != MAKE_SALCOLOR( 0x00, 0xFF, 0x00 ) // light green + && nSalColor != MAKE_SALCOLOR( 0x00, 0xFF, 0xFF ) // light cyan + && nSalColor != MAKE_SALCOLOR( 0xFF, 0x00, 0x00 ) // light red + && nSalColor != MAKE_SALCOLOR( 0xFF, 0x00, 0xFF ) // light magenta + && nSalColor != MAKE_SALCOLOR( 0xFF, 0xFF, 0x00 ) // light brown + && nSalColor != MAKE_SALCOLOR( 0xFF, 0xFF, 0xFF ) ) + bDitherBrush_ = GetDitherPixmap(nSalColor); + bBrushGC_ = FALSE; + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::SetROPLineColor( SalROPColor nROPColor ) +{ + switch( nROPColor ) + { + case SAL_ROP_0 : // 0 + nPenPixel_ = (Pixel)0; + break; + case SAL_ROP_1 : // 1 + nPenPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1; + break; + case SAL_ROP_INVERT : // 2 + nPenPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1; + break; + } + nPenColor_ = GetColormap().GetColor( nPenPixel_ ); + bPenGC_ = FALSE; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::SetROPFillColor( SalROPColor nROPColor ) +{ + switch( nROPColor ) + { + case SAL_ROP_0 : // 0 + nBrushPixel_ = (Pixel)0; + break; + case SAL_ROP_1 : // 1 + nBrushPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1; + break; + case SAL_ROP_INVERT : // 2 + nBrushPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1; + break; + } + bDitherBrush_ = FALSE; + nBrushColor_ = GetColormap().GetColor( nBrushPixel_ ); + bBrushGC_ = FALSE; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::SetXORMode( bool bSet, bool ) +{ + if( !bXORMode_ == bSet ) + { + bXORMode_ = bSet; + bPenGC_ = FALSE; + bBrushGC_ = FALSE; + bMonoGC_ = FALSE; + bCopyGC_ = FALSE; + bInvertGC_ = FALSE; + bInvert50GC_ = FALSE; + bStippleGC_ = FALSE; + bTrackingGC_ = FALSE; + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::drawPixel( long nX, long nY ) +{ + if( nPenColor_ != SALCOLOR_NONE ) + XDrawPoint( GetXDisplay(), GetDrawable(), SelectPen(), nX, nY ); +} + +void X11SalGraphics::drawPixel( long nX, long nY, SalColor nSalColor ) +{ + if( nSalColor != SALCOLOR_NONE ) + { + Display *pDisplay = GetXDisplay(); + + if( (nPenColor_ == SALCOLOR_NONE) && !bPenGC_ ) + { + SetLineColor( nSalColor ); + XDrawPoint( pDisplay, GetDrawable(), SelectPen(), nX, nY ); + nPenColor_ = SALCOLOR_NONE; + bPenGC_ = False; + } + else + { + GC pGC = SelectPen(); + + if( nSalColor != nPenColor_ ) + XSetForeground( pDisplay, pGC, GetPixel( nSalColor ) ); + + XDrawPoint( pDisplay, GetDrawable(), pGC, nX, nY ); + + if( nSalColor != nPenColor_ ) + XSetForeground( pDisplay, pGC, nPenPixel_ ); + } + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::drawLine( long nX1, long nY1, long nX2, long nY2 ) +{ + if( nPenColor_ != SALCOLOR_NONE ) + { + if ( GetDisplay()->GetProperties() & PROPERTY_BUG_DrawLine ) + { + GC aGC = SelectPen(); + XDrawPoint (GetXDisplay(), GetDrawable(), aGC, (int)nX1, (int)nY1); + XDrawPoint (GetXDisplay(), GetDrawable(), aGC, (int)nX2, (int)nY2); + XDrawLine (GetXDisplay(), GetDrawable(), aGC, nX1, nY1, nX2, nY2 ); + } + else + XDrawLine( GetXDisplay(), GetDrawable(),SelectPen(), + nX1, nY1, nX2, nY2 ); + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::drawRect( long nX, long nY, long nDX, long nDY ) +{ + if( nBrushColor_ != SALCOLOR_NONE ) + { + XFillRectangle( GetXDisplay(), + GetDrawable(), + SelectBrush(), + nX, nY, nDX, nDY ); + } + // Beschreibung DrawRect verkehrt, deshalb -1 + if( nPenColor_ != SALCOLOR_NONE ) + XDrawRectangle( GetXDisplay(), + GetDrawable(), + SelectPen(), + nX, nY, nDX-1, nDY-1 ); +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::drawPolyLine( ULONG nPoints, const SalPoint *pPtAry ) +{ + drawPolyLine( nPoints, pPtAry, false ); +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::drawPolyLine( ULONG nPoints, const SalPoint *pPtAry, bool bClose ) +{ + if( nPenColor_ != 0xFFFFFFFF ) + { + SalPolyLine Points( nPoints, pPtAry ); + + DrawLines( nPoints, Points, SelectPen(), bClose ); + } +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::drawPolygon( ULONG nPoints, const SalPoint* pPtAry ) +{ + if( nPoints == 0 ) + return; + + if( nPoints < 3 ) + { + if( !bXORMode_ ) + { + if( 1 == nPoints ) + drawPixel( pPtAry[0].mnX, pPtAry[0].mnY ); + else + drawLine( pPtAry[0].mnX, pPtAry[0].mnY, + pPtAry[1].mnX, pPtAry[1].mnY ); + } + return; + } + + SalPolyLine Points( nPoints, pPtAry ); + + nPoints++; + + /* WORKAROUND: some Xservers (Xorg, VIA chipset in this case) + * do not draw the visible part of a polygon + * if it overlaps to the left of screen 0,y. + * This happens to be the case in the gradient drawn in the + * menubar background. workaround for the special case of + * of a rectangle overlapping to the left. + */ + if( nPoints == 5 && + Points[ 0 ].x == Points[ 1 ].x && + Points[ 1 ].y == Points[ 2 ].y && + Points[ 2 ].x == Points[ 3 ].x && + Points[ 0 ].x == Points[ 4 ].x && Points[ 0 ].y == Points[ 4 ].y + ) + { + bool bLeft = false; + bool bRight = false; + for(unsigned int i = 0; i < nPoints; i++ ) + { + if( Points[i].x < 0 ) + bLeft = true; + else + bRight= true; + } + if( bLeft && ! bRight ) + return; + if( bLeft && bRight ) + { + for( unsigned int i = 0; i < nPoints; i++ ) + if( Points[i].x < 0 ) + Points[i].x = 0; + } + } + + if( nBrushColor_ != SALCOLOR_NONE ) + XFillPolygon( GetXDisplay(), + GetDrawable(), + SelectBrush(), + &Points[0], nPoints, + Complex, CoordModeOrigin ); + + if( nPenColor_ != 0xFFFFFFFF ) + DrawLines( nPoints, Points, SelectPen(), true ); +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +void X11SalGraphics::drawPolyPolygon( sal_uInt32 nPoly, + const sal_uInt32 *pPoints, + PCONSTSALPOINT *pPtAry ) +{ + if( nBrushColor_ != SALCOLOR_NONE ) + { + ULONG i, n; + XLIB_Region pXRegA = NULL; + + for( i = 0; i < nPoly; i++ ) { + n = pPoints[i]; + SalPolyLine Points( n, pPtAry[i] ); + if( n > 2 ) + { + XLIB_Region pXRegB = XPolygonRegion( &Points[0], n+1, WindingRule ); + if( !pXRegA ) + pXRegA = pXRegB; + else + { + XXorRegion( pXRegA, pXRegB, pXRegA ); + XDestroyRegion( pXRegB ); + } + } + } + + if( pXRegA ) + { + XRectangle aXRect; + XClipBox( pXRegA, &aXRect ); + + GC pGC = SelectBrush(); + SetClipRegion( pGC, pXRegA ); // ??? doppelt + XDestroyRegion( pXRegA ); + bBrushGC_ = FALSE; + + XFillRectangle( GetXDisplay(), + GetDrawable(), + pGC, + aXRect.x, aXRect.y, aXRect.width, aXRect.height ); + } + } + + if( nPenColor_ != SALCOLOR_NONE ) + for( ULONG i = 0; i < nPoly; i++ ) + drawPolyLine( pPoints[i], pPtAry[i], true ); +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +sal_Bool X11SalGraphics::drawPolyLineBezier( ULONG, const SalPoint*, const BYTE* ) +{ + return sal_False; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +sal_Bool X11SalGraphics::drawPolygonBezier( ULONG, const SalPoint*, const BYTE* ) +{ + return sal_False; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +sal_Bool X11SalGraphics::drawPolyPolygonBezier( sal_uInt32, const sal_uInt32*, + const SalPoint* const*, const BYTE* const* ) +{ + return sal_False; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +void X11SalGraphics::invert( ULONG nPoints, + const SalPoint* pPtAry, + SalInvert nFlags ) +{ + SalPolyLine Points ( nPoints, pPtAry ); + + GC pGC; + if( SAL_INVERT_50 & nFlags ) + pGC = GetInvert50GC(); + else + if ( SAL_INVERT_TRACKFRAME & nFlags ) + pGC = GetTrackingGC(); + else + pGC = GetInvertGC(); + + if( SAL_INVERT_TRACKFRAME & nFlags ) + DrawLines ( nPoints, Points, pGC, true ); + else + XFillPolygon( GetXDisplay(), + GetDrawable(), + pGC, + &Points[0], nPoints, + Complex, CoordModeOrigin ); +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +BOOL X11SalGraphics::drawEPS( long,long,long,long,void*,ULONG ) +{ + return FALSE; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +XID X11SalGraphics::GetXRenderPicture() +{ + XRenderPeer& rRenderPeer = XRenderPeer::GetInstance(); + + if( !m_aRenderPicture ) + { + // check xrender support for matching visual + // find a XRenderPictFormat compatible with the Drawable + XRenderPictFormat* pVisualFormat = static_cast(GetXRenderFormat()); + if( !pVisualFormat ) + { + Visual* pVisual = GetDisplay()->GetVisual( m_nScreen ).GetVisual(); + pVisualFormat = rRenderPeer.FindVisualFormat( pVisual ); + if( !pVisualFormat ) + return 0; + // cache the XRenderPictFormat + SetXRenderFormat( static_cast(pVisualFormat) ); + } + + // get the matching xrender target for drawable + m_aRenderPicture = rRenderPeer.CreatePicture( hDrawable_, pVisualFormat, 0, NULL ); + } + +#if 0 + // setup clipping so the callers don't have to do it themselves + // TODO: avoid clipping if already set correctly + if( pClipRegion_ && !XEmptyRegion( pClipRegion_ ) ) + rRenderPeer.SetPictureClipRegion( aDstPic, pClipRegion_ ); + else +#endif + { + // reset clip region + // TODO: avoid clip reset if already done + XRenderPictureAttributes aAttr; + aAttr.clip_mask = None; + rRenderPeer.ChangePicture( m_aRenderPicture, CPClipMask, &aAttr ); + } + + return m_aRenderPicture; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +SystemGraphicsData X11SalGraphics::GetGraphicsData() const +{ + SystemGraphicsData aRes; + + aRes.nSize = sizeof(aRes); + aRes.pDisplay = GetXDisplay(); + aRes.hDrawable = hDrawable_; + aRes.pVisual = GetDisplay()->GetVisual( m_nScreen ).GetVisual(); + aRes.nScreen = m_nScreen; + aRes.nDepth = GetDisplay()->GetVisual( m_nScreen ).GetDepth(); + aRes.aColormap = GetDisplay()->GetColormap( m_nScreen ).GetXColormap(); + aRes.pRenderFormat = m_pRenderFormat; + return aRes; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +// B2DPolygon support methods + +namespace { // anonymous namespace to prevent export +// the methods and structures here are used by the +// B2DPolyPolygon->RenderTrapezoid conversion algorithm + +// compare two line segments +// assumption: both segments point downward +// assumption: they must have at least some y-overlap +// assumption: rA.p1.y <= rB.p1.y +bool IsLeftOf( const XLineFixed& rA, const XLineFixed& rB ) +{ + bool bAbove = (rA.p1.y <= rB.p1.y); + const XLineFixed& rU = bAbove ? rA : rB; + const XLineFixed& rL = bAbove ? rB : rA; + + const XFixed aXDiff = rU.p2.x - rU.p1.x; + const XFixed aYDiff = rU.p2.y - rU.p1.y; + + // compare upper point of lower segment with line through upper segment + if( (rU.p1.y != rL.p1.y) || (rU.p1.x != rL.p1.x) ) + { + const sal_Int64 n1 = (sal_Int64)aXDiff * (rL.p1.y - rU.p1.y); + const sal_Int64 n2 = (sal_Int64)aYDiff * (rL.p1.x - rU.p1.x); + if( n1 != n2 ) + return ((n1 < n2) == bAbove); + } + + // compare lower point of lower segment with line through upper segment + if( (rU.p2.y != rL.p2.y) || (rU.p2.x != rL.p2.x) ) + { + const sal_Int64 n3 = (sal_Int64)aXDiff * (rL.p2.y - rU.p1.y); + const sal_Int64 n4 = (sal_Int64)aYDiff * (rL.p2.x - rU.p1.x); + if( n3 != n4 ) + return ((n3 < n4) == bAbove); + } + + // both segments overlap + return false; +} + +struct HalfTrapezoid +{ + // assumptions: + // maLine.p1.y <= mnY < maLine.p2.y + XLineFixed maLine; + XFixed mnY; + + XFixed getXMin() const { return std::min( maLine.p1.x, maLine.p2.x); } + XFixed getXMax() const { return std::max( maLine.p1.x, maLine.p2.x); } +}; + +class HalfTrapCompare +{ +public: + bool operator()( const HalfTrapezoid& rA, const HalfTrapezoid& rB ) const + { + bool bIsTopLeft = false; + if( rA.mnY != rB.mnY ) // sort top-first if possible + bIsTopLeft = (rA.mnY < rB.mnY); + else // else sort left-first + bIsTopLeft = IsLeftOf( rA.maLine, rB.maLine ); + // adjust to priority_queue sorting convention + return !bIsTopLeft; + } +}; + +typedef std::vector< HalfTrapezoid > HTVector; +typedef std::priority_queue< HalfTrapezoid, HTVector, HalfTrapCompare > HTQueueBase; +// we need a priority queue with a reserve() to prevent countless reallocations +class HTQueue +: public HTQueueBase +{ +public: + void reserve( size_t n ) { c.reserve( n ); } + void swapvec( HTVector& v ) { c.swap( v ); } +}; + +typedef std::vector TrapezoidVector; + +class TrapezoidXCompare +{ + const TrapezoidVector& mrVector; +public: + TrapezoidXCompare( const TrapezoidVector& rVector ) + : mrVector( rVector ) {} + bool operator()( int nA, int nB ) const + { return IsLeftOf( mrVector[nA].left, mrVector[nB].left ); } +}; + +typedef std::multiset< int, TrapezoidXCompare > ActiveTrapSet; + +class TrapezoidYCompare +{ + const TrapezoidVector& mrVector; +public: + TrapezoidYCompare( const TrapezoidVector& rVector ) + : mrVector( rVector ) {} + bool operator()( int nA, int nB ) const + { return (mrVector[nA].bottom < mrVector[nB].bottom); } +}; + +typedef std::multiset< int, TrapezoidYCompare > VerticalTrapSet; + +#ifndef DISABLE_SOLVECROSSOVER_WORKAROUND +void splitIntersectingSegments( HTVector&); +#endif // DISABLE_SOLVECROSSOVER_WORKAROUND +} // end of anonymous namespace + +// draw a poly-polygon +bool X11SalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rOrigPolyPoly, double fTransparency) +{ + // nothing to do for empty polypolygons + const int nOrigPolyCount = rOrigPolyPoly.count(); + if( nOrigPolyCount <= 0 ) + return TRUE; + + // nothing to do if everything is transparent + if( (nBrushColor_ == SALCOLOR_NONE) + && (nPenColor_ == SALCOLOR_NONE) ) + return TRUE; + + // cannot handle pencolor!=brushcolor yet + if( (nPenColor_ != SALCOLOR_NONE) + && (nPenColor_ != nBrushColor_) ) + return FALSE; + + // TODO: remove the env-variable when no longer needed + static const char* pRenderEnv = getenv( "SAL_DISABLE_RENDER_POLY" ); + if( pRenderEnv ) + return FALSE; + + // check xrender support for trapezoids + XRenderPeer& rRenderPeer = XRenderPeer::GetInstance(); + if( !rRenderPeer.AreTrapezoidsSupported() ) + return FALSE; + Picture aDstPic = GetXRenderPicture(); + // check xrender support for this drawable + if( !aDstPic ) + return FALSE; + + // don't bother with polygons outside of visible area + const basegfx::B2DRange aViewRange( 0, 0, GetGraphicsWidth(), GetGraphicsHeight() ); + const basegfx::B2DRange aPolyRange = basegfx::tools::getRange( rOrigPolyPoly ); + const bool bNeedViewClip = aPolyRange.isInside( aViewRange ); + if( !aPolyRange.overlaps( aViewRange ) ) + return true; + + // convert the polypolygon to trapezoids + + // prepare the polypolygon for the algorithm below: + // - clip it against the view range + // - make sure it contains no self-intersections + // while we are at it guess the number of involved polygon points + int nHTQueueReserve = 0; + basegfx::B2DPolyPolygon aGoodPolyPoly; + for( int nOrigPolyIdx = 0; nOrigPolyIdx < nOrigPolyCount; ++nOrigPolyIdx ) + { + const ::basegfx::B2DPolygon aOuterPolygon = rOrigPolyPoly.getB2DPolygon( nOrigPolyIdx ); + + // render-trapezoids should be inside the view => clip polygon against view range + basegfx::B2DPolyPolygon aClippedPolygon( aOuterPolygon ); + if( bNeedViewClip ) + { + aClippedPolygon = basegfx::tools::clipPolygonOnRange( aOuterPolygon, aViewRange, true, false ); + DBG_ASSERT( aClippedPolygon.count(), "polygon confirmed to overlap with view should not get here" ); + } + const int nClippedPolyCount = aClippedPolygon.count(); + if( !nClippedPolyCount ) + continue; + +#ifndef DISABLE_SOLVECROSSOVER_WORKAROUND + for( int nClippedPolyIdx = 0; nClippedPolyIdx < nClippedPolyCount; ++nClippedPolyIdx ) + { + const ::basegfx::B2DPolygon aSolvedPolygon = aClippedPolygon.getB2DPolygon( nClippedPolyIdx ); + const int nPointCount = aSolvedPolygon.count(); + aGoodPolyPoly.append( aSolvedPolygon ); + nHTQueueReserve += aSolvedPolygon.areControlPointsUsed() ? 8 * nPointCount : nPointCount; + } +#else // DISABLE_SOLVECROSSOVER_WORKAROUND + // #i103259# polypoly.solveCrossover() fails to remove self-intersections + // but polygon.solveCrossover() works. Use it to build the intersection-free polypolygon + // TODO: if the self-intersection prevention is too expensive make the trap-algorithm tolerate intersections + for( int nClippedPolyIdx = 0; nClippedPolyIdx < nClippedPolyCount; ++nClippedPolyIdx ) + { + ::basegfx::B2DPolygon aUnsolvedPolygon = aClippedPolygon.getB2DPolygon( nClippedPolyIdx ); + basegfx::B2DPolyPolygon aSolvedPolyPoly( basegfx::tools::solveCrossovers( aUnsolvedPolygon) ); + const int nSolvedPolyCount = aSolvedPolyPoly.count(); + for( int nSolvedPolyIdx = 0; nSolvedPolyIdx < nSolvedPolyCount; ++nSolvedPolyIdx ) + { + // build the intersection-free polypolygon one by one + const ::basegfx::B2DPolygon aSolvedPolygon = aSolvedPolyPoly.getB2DPolygon( nSolvedPolyIdx ); + aGoodPolyPoly.append( aSolvedPolygon ); + // and while we are at it use the conviently available point count to guess the number of needed half-traps + const int nPointCount = aSolvedPolygon.count(); + nHTQueueReserve += aSolvedPolygon.areControlPointsUsed() ? 8 * nPointCount : nPointCount; + } + } +#endif // DISABLE_SOLVECROSSOVER_WORKAROUND + } + // #i100922# try to prevent priority-queue reallocations by reservering enough + nHTQueueReserve = ((4*nHTQueueReserve) | 0x1FFF) + 1; + HTVector aHTVector; + aHTVector.reserve( nHTQueueReserve ); + + // first convert the B2DPolyPolygon to HalfTrapezoids + const int nGoodPolyCount = aGoodPolyPoly.count(); + for( int nGoodPolyIdx = 0; nGoodPolyIdx < nGoodPolyCount; ++nGoodPolyIdx ) + { + ::basegfx::B2DPolygon aInnerPolygon = aGoodPolyPoly.getB2DPolygon( nGoodPolyIdx ); + + // render-trapezoids have linear edges => get rid of bezier segments + if( aInnerPolygon.areControlPointsUsed() ) + aInnerPolygon = ::basegfx::tools::adaptiveSubdivideByDistance( aInnerPolygon, 0.125 ); + + const int nPointCount = aInnerPolygon.count(); + if( nPointCount >= 3 ) + { + // convert polygon point pairs to HalfTrapezoids + // connect the polygon point with the first one if needed + XPointFixed aOldXPF = { 0, 0 }; + XPointFixed aNewXPF; + for( int nPointIdx = 0; nPointIdx <= nPointCount; ++nPointIdx, aOldXPF = aNewXPF ) + { + // auto-close the polygon if needed + const int k = (nPointIdx < nPointCount) ? nPointIdx : 0; + const ::basegfx::B2DPoint& aPoint = aInnerPolygon.getB2DPoint( k ); + + // convert the B2DPoint into XRENDER units + if(getAntiAliasB2DDraw()) + { + aNewXPF.x = XDoubleToFixed( aPoint.getX() ); + aNewXPF.y = XDoubleToFixed( aPoint.getY() ); + } + else + { + aNewXPF.x = XDoubleToFixed( basegfx::fround( aPoint.getX() ) ); + aNewXPF.y = XDoubleToFixed( basegfx::fround( aPoint.getY() ) ); + } + + // check if enough data is available for a new HalfTrapezoid + if( nPointIdx == 0 ) + continue; + + // construct HalfTrapezoid as topdown segment + HalfTrapezoid aHT; + if( aNewXPF.y < aOldXPF.y ) + { + aHT.maLine.p1 = aNewXPF; + aHT.maLine.p2 = aOldXPF; + } + else + { + aHT.maLine.p2 = aNewXPF; + aHT.maLine.p1 = aOldXPF; + } + + aHT.mnY = aHT.maLine.p1.y; + +#if 0 // ignore clipped HalfTrapezoids + if( aHT.mnY < 0 ) + aHT.mnY = 0; + else if( aHT.mnY > 10000 ) + continue; +#endif + + // queue up the HalfTrapezoid + aHTVector.push_back( aHT ); + } + } + } + + if( aHTVector.empty() ) + return TRUE; + +#ifndef DISABLE_SOLVECROSSOVER_WORKAROUND + // find intersecting halftraps and split them up + // TODO: remove when solveCrossOvers gets fast enough so its use can be enabled above + // FAQ: why should segment intersection be handled before adaptiveSubdivide()? + // Answer: because it is conceptually much faster + // Example: consider two intersecting circles with a diameter of 1000 pixels + // before subdivision: eight bezier segments + // after subdivision: more than a thousand line segments + // since even the best generic intersection finders have a complexity of O((n+k)*log(n+k)) + // it shows that testing while the segment count is still low is a much better approach. + splitIntersectingSegments( aHTVector); +#endif // DISABLE_SOLVECROSSOVER_WORKAROUND + + // build queue from vector of intersection-free segments + // TODO: is replacing the priority-queue by a sorted vector worth it? + std::make_heap( aHTVector.begin(), aHTVector.end(), HalfTrapCompare()); + HTQueue aHTQueue; + aHTQueue.swapvec( aHTVector); + + // then convert the HalfTrapezoids into full Trapezoids + TrapezoidVector aTrapVector; + aTrapVector.reserve( aHTQueue.size() * 2 ); // just a guess + + TrapezoidXCompare aTrapXCompare( aTrapVector ); + ActiveTrapSet aActiveTraps( aTrapXCompare ); + + TrapezoidYCompare aTrapYCompare( aTrapVector ); + VerticalTrapSet aVerticalTraps( aTrapYCompare ); + + while( !aHTQueue.empty() ) + { + XTrapezoid aTrapezoid; + + // convert a HalfTrapezoid pair + // get the left side of the trapezoid + const HalfTrapezoid& rLeft = aHTQueue.top(); + aTrapezoid.top = rLeft.mnY; + aTrapezoid.left = rLeft.maLine; + aHTQueue.pop(); + + // ignore left segment that would result in an empty trapezoid + if( aTrapezoid.left.p2.y <= aTrapezoid.top ) + continue; + + // get the right side of the trapezoid + aTrapezoid.right.p2.y = aTrapezoid.bottom; + while( !aHTQueue.empty() ) { + const HalfTrapezoid& rRight = aHTQueue.top(); + aTrapezoid.right = rRight.maLine; + aHTQueue.pop(); + // ignore right segment that would result in an empty trapezoid + if( aTrapezoid.right.p2.y > aTrapezoid.top ) + break; + } + + // the topmost endpoint determines the trapezoid bottom + aTrapezoid.bottom = aTrapezoid.left.p2.y; + if( aTrapezoid.bottom > aTrapezoid.right.p2.y ) + aTrapezoid.bottom = aTrapezoid.right.p2.y; + + // keep the full Trapezoid candidate + aTrapVector.push_back( aTrapezoid ); + + // unless it splits another trapezoid that is still active + bool bSplit = false; + ActiveTrapSet::iterator aActiveTrapsIt = aActiveTraps.begin(); + for(; aActiveTrapsIt != aActiveTraps.end(); ++aActiveTrapsIt ) + { + XTrapezoid& rLeftTrap = aTrapVector[ *aActiveTrapsIt ]; + + // skip until first overlap candidate + // TODO: use stl::*er_bound() instead + if( IsLeftOf( aTrapezoid.left, rLeftTrap.left) ) + continue; + + // in the ActiveTrapSet there are still trapezoids where + // a vertical overlap with new trapezoids is no longer possible + // they could have been removed in the verticaltraps loop below + // but this would be expensive and is not needed as we can + // simply ignore them until we stumble upon them here. + if( rLeftTrap.bottom <= aTrapezoid.top ) + { + ActiveTrapSet::iterator it = aActiveTrapsIt; + if( aActiveTrapsIt != aActiveTraps.begin() ) + --aActiveTrapsIt; + aActiveTraps.erase( it ); + continue; + } + + // check if there is horizontal overlap + // aTrapezoid.left==rLeftTrap.right is allowed though + if( !IsLeftOf( aTrapezoid.left, rLeftTrap.right ) ) + continue; + + // prepare to split the old trapezoid and keep its upper part + // find the old trapezoids entry in the VerticalTrapSet and remove it + typedef std::pair VTSPair; + VTSPair aVTSPair = aVerticalTraps.equal_range( *aActiveTrapsIt ); + VerticalTrapSet::iterator aVTSit = aVTSPair.first; + for(; aVTSit != aVTSPair.second; ++aVTSit ) + { + if( *aVTSit != *aActiveTrapsIt ) + continue; + aVerticalTraps.erase( aVTSit ); + break; + } + // then update the old trapezoid's bottom + rLeftTrap.bottom = aTrapezoid.top; + // enter the updated old trapzoid in VerticalTrapSet + aVerticalTraps.insert( aVerticalTraps.begin(), *aActiveTrapsIt ); + // the old trapezoid is no longer active + aActiveTraps.erase( aActiveTrapsIt ); + + // the trapezoid causing the split has become obsolete + // so its both sides have to be re-queued + HalfTrapezoid aHT; + aHT.mnY = aTrapezoid.top; + aHT.maLine = aTrapezoid.left; + aHTQueue.push( aHT ); + aHT.maLine = aTrapezoid.right; + aHTQueue.push( aHT ); + + bSplit = true; + break; + } + + // keep or forget the resulting full Trapezoid + if( bSplit ) + aTrapVector.pop_back(); + else + { + aActiveTraps.insert( aTrapVector.size()-1 ); + aVerticalTraps.insert( aTrapVector.size()-1 ); + } + + // mark trapezoids that can no longer be split as inactive + // and recycle their sides which were not fully resolved + static const XFixed nMaxTop = +0x7FFFFFFF; + const XFixed nNewTop = aHTQueue.empty() ? nMaxTop : aHTQueue.top().mnY; + while( !aVerticalTraps.empty() ) + { + // check the next trapezoid to be retired + const XTrapezoid& rOldTrap = aTrapVector[ *aVerticalTraps.begin() ]; + if( nNewTop < rOldTrap.bottom ) + break; + // this trapezoid can no longer be split + aVerticalTraps.erase( aVerticalTraps.begin() ); + + // recycle its sides that were not fully resolved + HalfTrapezoid aHT; + aHT.mnY = rOldTrap.bottom; + + if( rOldTrap.left.p2.y > aHT.mnY ) + { + aHT.maLine = rOldTrap.left; + aHTQueue.push( aHT ); + } + if( rOldTrap.right.p2.y > aHT.mnY ) + { + aHT.maLine = rOldTrap.right; + aHTQueue.push( aHT ); + } + } + } + + // create xrender Picture for polygon foreground + SalDisplay::RenderEntry& rEntry = GetDisplay()->GetRenderEntries( m_nScreen )[ 32 ]; + if( !rEntry.m_aPicture ) + { + Display* pXDisplay = GetXDisplay(); + + rEntry.m_aPixmap = ::XCreatePixmap( pXDisplay, hDrawable_, 1, 1, 32 ); + XRenderPictureAttributes aAttr; + aAttr.repeat = true; + + XRenderPictFormat* pXRPF = rRenderPeer.FindStandardFormat( PictStandardARGB32 ); + rEntry.m_aPicture = rRenderPeer.CreatePicture( rEntry.m_aPixmap, pXRPF, CPRepeat, &aAttr ); + } + + // set polygon foreground color and opacity + XRenderColor aRenderColor = GetXRenderColor( nBrushColor_ , fTransparency ); + rRenderPeer.FillRectangle( PictOpSrc, rEntry.m_aPicture, &aRenderColor, 0, 0, 1, 1 ); + + // set clipping + // TODO: move into GetXRenderPicture? + if( pClipRegion_ && !XEmptyRegion( pClipRegion_ ) ) + rRenderPeer.SetPictureClipRegion( aDstPic, pClipRegion_ ); + + // render the trapezoids + const XRenderPictFormat* pMaskFormat = rRenderPeer.GetStandardFormatA8(); + rRenderPeer.CompositeTrapezoids( PictOpOver, + rEntry.m_aPicture, aDstPic, pMaskFormat, 0, 0, &aTrapVector[0], aTrapVector.size() ); + + return TRUE; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +bool X11SalGraphics::drawPolyLine(const ::basegfx::B2DPolygon& rPolygon, const ::basegfx::B2DVector& rLineWidth, basegfx::B2DLineJoin eLineJoin) +{ + // #i101491# + if(rPolygon.count() > 1000) + { + // the used basegfx::tools::createAreaGeometry is simply too + // expensive with very big polygons; fallback to caller (who + // should use ImplLineConverter normally) + return false; + } + const XRenderPeer& rRenderPeer = XRenderPeer::GetInstance(); + if( !rRenderPeer.AreTrapezoidsSupported() ) + return false; + + // get the area polygon for the line polygon + basegfx::B2DPolygon aPolygon = rPolygon; + if( (rLineWidth.getX() != rLineWidth.getY()) + && !basegfx::fTools::equalZero( rLineWidth.getY() ) ) + { + // prepare for createAreaGeometry() with anisotropic linewidth + basegfx::B2DHomMatrix aAnisoMatrix; + aAnisoMatrix.scale( 1.0, rLineWidth.getX() / rLineWidth.getY() ); + aPolygon.transform( aAnisoMatrix ); + } + + // special handling for hairlines to improve the drawing performance + // TODO: revisit after basegfx performance related changes + const bool bIsHairline = (rLineWidth.getX() < 1.2) && (rLineWidth.getY() < 1.2); + if( bIsHairline ) + { + // for hairlines the linejoin style becomes irrelevant + eLineJoin = basegfx::B2DLINEJOIN_NONE; + // createAreaGeometry is still too expensive when beziers are involved + if( aPolygon.areControlPointsUsed() ) + aPolygon = ::basegfx::tools::adaptiveSubdivideByDistance( aPolygon, 0.125 ); + } + + // create the area-polygon for the line + const basegfx::B2DPolyPolygon aAreaPolyPoly( basegfx::tools::createAreaGeometry(aPolygon, 0.5*rLineWidth.getX(), eLineJoin) ); + + if( (rLineWidth.getX() != rLineWidth.getY()) + && !basegfx::fTools::equalZero( rLineWidth.getX() ) ) + { + // postprocess createAreaGeometry() for anisotropic linewidth + basegfx::B2DHomMatrix aAnisoMatrix; + aAnisoMatrix.scale( 1.0, rLineWidth.getY() / rLineWidth.getX() ); + aPolygon.transform( aAnisoMatrix ); + } + + // temporarily adjust brush color to pen color + // since the line is drawn as an area-polygon + const SalColor aKeepBrushColor = nBrushColor_; + nBrushColor_ = nPenColor_; + + // draw each area polypolygon component individually + // to emulate the polypolygon winding rule "non-zero" + bool bDrawOk = true; + const int nPolyCount = aAreaPolyPoly.count(); + for( int nPolyIdx = 0; nPolyIdx < nPolyCount; ++nPolyIdx ) + { + const ::basegfx::B2DPolyPolygon aOnePoly( aAreaPolyPoly.getB2DPolygon( nPolyIdx ) ); + bDrawOk = drawPolyPolygon( aOnePoly, 0.0); + if( !bDrawOk ) + break; + } + + // restore the original brush GC + nBrushColor_ = aKeepBrushColor; + return bDrawOk; +} + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +#ifndef DISABLE_SOLVECROSSOVER_WORKAROUND +// TODO: move the intersection solver into basegfx +// and then support bezier-intersection finding too + +namespace { // anonymous namespace to prevent export + +typedef HalfTrapezoid LineSeg; +typedef HTVector LSVector; + +inline bool operator==( const LineSeg& r1, const LineSeg& r2) +{ + if( r1.maLine.p2.y != r2.maLine.p2.y) return false; + if( r1.maLine.p2.x != r2.maLine.p2.x) return false; + if( r1.maLine.p1.y != r2.maLine.p1.y) return false; + if( r1.maLine.p1.x != r2.maLine.p1.x) return false; + return true; +} + +struct LSYMinCmp +{ + bool operator()( const LineSeg& r1, const LineSeg& r2) const + { return r2.maLine.p1.y < r1.maLine.p1.y; } +}; + +struct LSYMaxCmp +{ + bool operator()( const LineSeg& r1, const LineSeg& r2) const + { return r2.maLine.p2.y < r1.maLine.p2.y; } +}; + +struct LSXMinCmp +{ + bool operator()( const LineSeg& r1, const LineSeg& r2) const + { return( r1.getXMin() < r2.getXMin()); } +}; + +struct CutPoint +{ + XFixed mnSegmentId; + float mfCutParam; + XPointFixed maPoint; +}; + +struct CutPointCmp +{ + bool operator()( const CutPoint& r1, const CutPoint& r2) const + { + if( r1.mnSegmentId != r2.mnSegmentId) + return (r1.mnSegmentId < r2.mnSegmentId); + return (r1.mfCutParam < r2.mfCutParam); + } +}; + +bool findIntersection( const LineSeg& rLS1, const LineSeg& rLS2, CutPoint aCutPoints[2]) +{ + // segments intersect at r1.p1 + s*(r1.p2-r1.p1) == r2.p1 + t*(r2.p2-r2.p1) + // when both segment-parameters are ((0 + // (r1.p1x - r2.p1x) == s * (r1.p1x - r1.p2x) + t * (r2.p2x - r2.p1x) + // (r1.p1y - r2.p1y) == s * (r1.p1y - r1.p2y) + t * (r2.p2y - r2.p1y) + // check if lines are identical or parallel => not intersecting + const XLineFixed& r1 = rLS1.maLine; + const XLineFixed& r2 = rLS2.maLine; + const double fDet = (double)(r1.p1.x - r1.p2.x) * (r2.p2.y - r2.p1.y) + - (double)(r2.p2.x - r2.p1.x) * (r1.p1.y - r1.p2.y); + static const double fEps = 1e-8; + if( fabs(fDet) < fEps) + return false; + // check if intersecting with first segment + const double fS1 = (double)(r2.p2.y - r2.p1.y) * (r1.p1.x - r2.p1.x); + const double fS2 = (double)(r2.p2.x - r2.p1.x) * (r2.p1.y - r1.p1.y); + const double fS = (fS1 + fS2) / fDet; + if( (fS <= +fEps) || (fS >= 1-fEps)) + return false; + // check if intersecting with second segment + const double fT1 = (double)(r1.p2.y - r1.p1.y) * (r1.p1.x - r2.p1.x); + const double fT2 = (double)(r1.p2.x - r1.p1.x) * (r2.p1.y - r1.p1.y); + const double fT = (fT1 + fT2) / fDet; + if( (fT <= +fEps) || (fT >= 1-fEps)) + return false; + // force the intersection point to be exactly identical on both segments + aCutPoints[0].maPoint.x = (XFixed)(r1.p1.x + fS * (r1.p2.x - r1.p1.x)); + aCutPoints[0].maPoint.y = (XFixed)(r1.p1.y + fS * (r1.p2.y - r1.p1.y)); + aCutPoints[1].maPoint.x = aCutPoints[0].maPoint.x; + aCutPoints[1].maPoint.y = aCutPoints[0].maPoint.y; + aCutPoints[0].mnSegmentId = rLS1.mnY; + aCutPoints[0].mfCutParam = (float)fS; + aCutPoints[1].mnSegmentId = rLS2.mnY; + aCutPoints[1].mfCutParam = (float)fT; + return true; +} + +typedef std::priority_queue< LineSeg, LSVector, LSYMinCmp> LSYMinQueueBase; +typedef std::priority_queue< LineSeg, LSVector, LSYMaxCmp> LSYMaxQueueBase; +typedef std::multiset< LineSeg, LSXMinCmp> LSXMinSet; +typedef std::set< CutPoint, CutPointCmp> CutPointSet; + +class LSYMinQueue : public LSYMinQueueBase +{ +public: + void reserve( size_t n) { c.reserve(n);} + void swapvec( LSVector& v) { c.swap(v);} +}; + +class LSYMaxQueue : public LSYMaxQueueBase +{ +public: + void reserve( size_t n) { c.reserve(n);} +}; + +void addAndCutSegment( LSVector& rLSVector, const LineSeg& rLS, CutPointSet& rCutPointSet) +{ + // short circuit when no segment was cut + if( rCutPointSet.empty()) { + rLSVector.push_back( rLS); + return; + } + + // find the first cut point for this segment + LineSeg aCS = rLS; + CutPoint aMinCutPoint; + aMinCutPoint.mnSegmentId = rLS.mnY; + aMinCutPoint.mfCutParam = 0.0; + CutPointSet::iterator itFirst = rCutPointSet.lower_bound( aMinCutPoint); + CutPointSet::iterator it = itFirst; + // iterate through all cut points of this segment + for(; it != rCutPointSet.end(); ++it) { + const CutPoint rCutPoint = (*it); + if( rCutPoint.mnSegmentId != rLS.mnY) + break; + // cut segment at the cutpoint + aCS.maLine.p2 = rCutPoint.maPoint; + rLSVector.push_back( aCS); + // prepare for next segment cut + aCS.maLine.p1 = aCS.maLine.p2; + } + // remove cutparams that will no longer be needed + // TODO: is it worth it or should we just keep the cutparams? + rCutPointSet.erase( itFirst, it); + + // add segment part remaining after last cut + aCS.maLine.p2 = rLS.maLine.p2; + rLSVector.push_back( aCS); +} + +void splitIntersectingSegments( LSVector& rLSVector) +{ + // get a unique id for each lineseg, temporarily abuse the mnY member + LSVector::iterator aLSit = rLSVector.begin(); + for( int i = 0; aLSit != rLSVector.end(); ++aLSit) { + LineSeg& rLS = *aLSit; + rLS.mnY = i++; + } + // get an y-sorted queue from the input vector + LSYMinQueue aYMinQueue; + std::make_heap( rLSVector.begin(), rLSVector.end(), LSYMinCmp()); + aYMinQueue.swapvec( rLSVector); + + // prepare the result vector + // try to avoid reallocations by guessing a reasonable result size + rLSVector.reserve( aYMinQueue.size() * 3/2 ); + + // find all intersections + CutPointSet aCutPointSet; + LSXMinSet aXMinSet; + LSYMaxQueue aYMaxQueue; + aYMaxQueue.reserve( aYMinQueue.size()); + // sweep-down and check all segment-pairs that overlap + while( !aYMinQueue.empty()) { + // get next input-segment + const LineSeg& rLS = aYMinQueue.top(); + // retire obsoleted segments + const XFixed fYCur = rLS.maLine.p1.y; + while( !aYMaxQueue.empty()) { + // check next segment to be retired + const LineSeg& rOS = aYMaxQueue.top(); + if( fYCur < rOS.maLine.p2.y) + break; + // emit resolved segment into result + addAndCutSegment( rLSVector, rOS, aCutPointSet); + // find segment to be retired in xmin-compare-set + LSXMinSet::iterator itR = aXMinSet.lower_bound( rOS); + while( !(*itR == rOS)) ++itR; + // retire segment from xmin-compare-set + aXMinSet.erase( itR); + // this segment is pining for the fjords + aYMaxQueue.pop(); + } + + // iterate over all segments that might overlap + // skip over the leftmost segments that cannot overlap + const XFixed fXMax = rLS.getXMax(); + LSXMinSet::const_iterator itC = aXMinSet.begin(); + for(; itC != aXMinSet.end(); ++itC) + if( (*itC).getXMin() <= fXMax) + break; + // TODO: if the linear search becomes too expensive + // then use an XMaxQueue based approach to replace it + const XFixed fXMin = rLS.getXMin(); + for(; itC != aXMinSet.end(); ++itC) { + const LineSeg& rOS = *itC; + if( fXMin >= rOS.getXMax()) + continue; + if( fXMax < rOS.getXMin()) + break; + CutPoint aCutPoints[2]; + if( !findIntersection( rLS, rOS, aCutPoints)) + continue; + // remember cut parameters + // TODO: std::set seems to use individual allocations + // which results in perf-problems for many entries + // => pre-allocate nodes by using a non-default allocator + aCutPointSet.insert( aCutPoints[0]); + aCutPointSet.insert( aCutPoints[1]); + } + // add segment to xmin-compare-set + // TODO: do we have a good insertion hint? + aXMinSet.insert( /*itC,*/ rLS); + // register segment for retirement + aYMaxQueue.push( rLS); + aYMinQueue.pop(); + } + + // retire the remaining segments + aXMinSet.clear(); + while( !aYMaxQueue.empty()) { + // emit segments and cut them up if needed + const LineSeg& rLS = aYMaxQueue.top(); + addAndCutSegment( rLSVector, rLS, aCutPointSet); + aYMaxQueue.pop(); + } + + // get the segments ready to be consumed by the drawPolygon() caller + aLSit = rLSVector.begin(); + LSVector::iterator aLSit2 = aLSit; + for(; aLSit != rLSVector.end(); ++aLSit) { + LineSeg& rLS = *aLSit; + // restore the segment top member + rLS.mnY = rLS.maLine.p1.y; + // remove horizontal segments for now + // TODO: until the trapezoid converter is adjusted to handle them + if( rLS.maLine.p1.y == rLS.maLine.p2.y ) + continue; + *(aLSit2++) = rLS; + } + if(aLSit2 != aLSit) + rLSVector.resize( aLSit2 - rLSVector.begin() ); +} + +} // end anonymous namespace + +#endif // DISABLE_SOLVECROSSOVER_WORKAROUND + +// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + diff --git a/vcl/unx/source/gdi/salgdi3.cxx b/vcl/unx/source/gdi/salgdi3.cxx index d1a60cda4097..5d6cd464376a 100644 --- a/vcl/unx/source/gdi/salgdi3.cxx +++ b/vcl/unx/source/gdi/salgdi3.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: salgdi3.cxx,v $ - * $Revision: 1.157.12.2 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -82,6 +79,11 @@ #include +#ifdef ENABLE_GRAPHITE +#include +#include +#endif + struct cairo_surface_t; struct cairo_t; struct cairo_font_face_t; @@ -1450,21 +1452,17 @@ void X11SalGraphics::DrawStringUCS2MB( ExtendedFontStruct& rFont, ImplFontCharMap* X11SalGraphics::GetImplFontCharMap() const { // TODO: get ImplFontCharMap directly from fonts - int nPairCount = 0; - if( mpServerFont[0] ) - nPairCount = mpServerFont[0]->GetFontCodeRanges( NULL ); - else if( mXFont[0] ) - nPairCount = mXFont[0]->GetFontCodeRanges( NULL ); - - if( !nPairCount ) + if( !mpServerFont[0] ) +#if 0 // RIP XLFD fonts + if( mXFont[0] ) + // TODO?: nPairCount = mXFont[0]->GetFontCodeRanges( NULL ); +#endif return NULL; - sal_uInt32* pCodePairs = new sal_uInt32[ 2 * nPairCount ]; - if( mpServerFont[0] ) - mpServerFont[0]->GetFontCodeRanges( pCodePairs ); - else if( mXFont[0] ) - mXFont[0]->GetFontCodeRanges( pCodePairs ); - return new ImplFontCharMap( nPairCount, pCodePairs ); + CmapResult aCmapResult; + if( !mpServerFont[0]->GetFontCodeRanges( aCmapResult ) ) + return NULL; + return new ImplFontCharMap( aCmapResult ); } // ---------------------------------------------------------------------------- @@ -1681,11 +1679,29 @@ BOOL X11SalGraphics::GetGlyphOutline( long nGlyphIndex, SalLayout* X11SalGraphics::GetTextLayout( ImplLayoutArgs& rArgs, int nFallbackLevel ) { - GenericSalLayout* pLayout = NULL; + SalLayout* pLayout = NULL; if( mpServerFont[ nFallbackLevel ] && !(rArgs.mnFlags & SAL_LAYOUT_DISABLE_GLYPH_PROCESSING) ) - pLayout = new ServerFontLayout( *mpServerFont[ nFallbackLevel ] ); + { +#ifdef ENABLE_GRAPHITE + // Is this a Graphite font? + if (!bDisableGraphite_ && + GraphiteFontAdaptor::IsGraphiteEnabledFont(*mpServerFont[nFallbackLevel])) + { + sal_Int32 xdpi, ydpi; + + xdpi = GetDisplay()->GetResolution().A(); + ydpi = GetDisplay()->GetResolution().B(); + + GraphiteFontAdaptor * pGrfont = new GraphiteFontAdaptor( *mpServerFont[nFallbackLevel], xdpi, ydpi); + if (!pGrfont) return NULL; + pLayout = new GraphiteServerFontLayout(pGrfont); + } + else +#endif + pLayout = new ServerFontLayout( *mpServerFont[ nFallbackLevel ] ); + } else if( mXFont[ nFallbackLevel ] ) pLayout = new X11FontLayout( *mXFont[ nFallbackLevel ] ); else @@ -1727,21 +1743,26 @@ BOOL X11SalGraphics::CreateFontSubset( sal_Int32* pGlyphIDs, sal_uInt8* pEncoding, sal_Int32* pWidths, - int nGlyphs, + int nGlyphCount, FontSubsetInfo& rInfo ) { -#ifndef _USE_PRINT_EXTENSION_ // in this context the pFont->GetFontId() is a valid PSP // font since they are the only ones left after the PDF // export has filtered its list of subsettable fonts (for // which this method was created). The correct way would // be to have the GlyphCache search for the ImplFontData pFont psp::fontID aFont = pFont->GetFontId(); - return PspGraphics::DoCreateFontSubset( rToFile, aFont, pGlyphIDs, pEncoding, pWidths, nGlyphs, rInfo ); -#else - return FALSE; -#endif + + psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); + bool bSuccess = rMgr.createFontSubset( rInfo, + aFont, + rToFile, + pGlyphIDs, + pEncoding, + pWidths, + nGlyphCount ); + return bSuccess; } //-------------------------------------------------------------------------- diff --git a/vcl/unx/source/gdi/salprnpsp.cxx b/vcl/unx/source/gdi/salprnpsp.cxx index 5f8c76fdb16f..2cf4e3baedd3 100644 --- a/vcl/unx/source/gdi/salprnpsp.cxx +++ b/vcl/unx/source/gdi/salprnpsp.cxx @@ -126,37 +126,6 @@ inline int PtTo10Mu( int nPoints ) { return (int)((((double)nPoints)*35.27777778 inline int TenMuToPt( int nUnits ) { return (int)((((double)nUnits)/35.27777778)+0.5); } -static struct -{ - int width; - int height; - const char* name; - int namelength; - Paper paper; -} aPaperTab[] = -{ - { 29700, 42000, "A3", 2, PAPER_A3 }, - { 21000, 29700, "A4", 2, PAPER_A4 }, - { 14800, 21000, "A5", 2, PAPER_A5 }, - { 25000, 35300, "B4", 2, PAPER_B4 }, - { 17600, 25000, "B5", 2, PAPER_B5 }, - { 21600, 27900, "Letter", 6, PAPER_LETTER }, - { 21600, 35600, "Legal", 5, PAPER_LEGAL }, - { 27900, 43100, "Tabloid", 7, PAPER_TABLOID }, - { 0, 0, "USER", 4, PAPER_USER } -}; - -static Paper getPaperType( const String& rPaperName ) -{ - ByteString aPaper( rPaperName, RTL_TEXTENCODING_ISO_8859_1 ); - for( unsigned int i = 0; i < sizeof( aPaperTab )/sizeof( aPaperTab[0] ); i++ ) - { - if( ! rtl_str_compareIgnoreAsciiCase( aPaper.GetBuffer(), aPaperTab[i].name ) ) - return aPaperTab[i].paper; - } - return PAPER_USER; -} - static void copyJobDataToJobSetup( ImplJobSetup* pJobSetup, JobData& rData ) { pJobSetup->meOrientation = (Orientation)(rData.m_eOrientation == orientation::Landscape ? ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT); @@ -166,7 +135,8 @@ static void copyJobDataToJobSetup( ImplJobSetup* pJobSetup, JobData& rData ) int width, height; rData.m_aContext.getPageSize( aPaper, width, height ); - pJobSetup->mePaperFormat = getPaperType( aPaper ); + pJobSetup->mePaperFormat = PaperInfo::fromPSName(OUStringToOString( aPaper, RTL_TEXTENCODING_ISO_8859_1 )); + pJobSetup->mnPaperWidth = 0; pJobSetup->mnPaperHeight = 0; if( pJobSetup->mePaperFormat == PAPER_USER ) @@ -544,14 +514,9 @@ void PspSalInfoPrinter::InitPaperFormats( const ImplJobSetup* ) for( int i = 0; i < nValues; i++ ) { const PPDValue* pValue = pKey->getValue( i ); - vcl::PaperInfo aInfo; - aInfo.m_aPaperName = pValue->m_aOptionTranslation; - if( ! aInfo.m_aPaperName.Len() ) - aInfo.m_aPaperName = pValue->m_aOption; int nWidth = 0, nHeight = 0; m_aJobData.m_pParser->getPaperDimension( pValue->m_aOption, nWidth, nHeight ); - aInfo.m_nPaperWidth = (unsigned long)((PtTo10Mu( nWidth )+50)/100); - aInfo.m_nPaperHeight = (unsigned long)((PtTo10Mu( nHeight )+50)/100); + PaperInfo aInfo(PtTo10Mu( nWidth ), PtTo10Mu( nHeight )); m_aPaperFormats.push_back( aInfo ); } } @@ -730,7 +695,7 @@ BOOL PspSalInfoPrinter::SetData( TenMuToPt( pJobSetup->mnPaperWidth ), TenMuToPt( pJobSetup->mnPaperHeight ) ); else - aPaper = String( ByteString( aPaperTab[ pJobSetup->mePaperFormat ].name ), RTL_TEXTENCODING_ISO_8859_1 ); + aPaper = rtl::OStringToOUString(PaperInfo::toPSName(pJobSetup->mePaperFormat), RTL_TEXTENCODING_ISO_8859_1); pKey = aData.m_pParser->getKey( String( RTL_CONSTASCII_USTRINGPARAM( "PageSize" ) ) ); pValue = pKey ? pKey->getValueCaseInsensitive( aPaper ) : NULL; diff --git a/vcl/unx/source/gdi/xrender_peer.cxx b/vcl/unx/source/gdi/xrender_peer.cxx index d8f2045c6fde..fc8de818fafd 100644 --- a/vcl/unx/source/gdi/xrender_peer.cxx +++ b/vcl/unx/source/gdi/xrender_peer.cxx @@ -142,6 +142,10 @@ void XRenderPeer::InitRenderLib() mpXRenderCreatePicture = (Picture(*)(Display*,Drawable,const XRenderPictFormat*, unsigned long,const XRenderPictureAttributes*))pFunc; + pFunc = osl_getAsciiFunctionSymbol( mpRenderLib, "XRenderChangePicture" ); + if( !pFunc ) return; + mpXRenderChangePicture = (void(*)(Display*,Picture,unsigned long,const XRenderPictureAttributes*))pFunc; + pFunc = osl_getAsciiFunctionSymbol( mpRenderLib, "XRenderSetPictureClipRegion" ); if( !pFunc ) return; mpXRenderSetPictureClipRegion = (void(*)(Display*,Picture,XLIB_Region))pFunc; diff --git a/vcl/unx/source/gdi/xrender_peer.hxx b/vcl/unx/source/gdi/xrender_peer.hxx index f1e2fd77a273..27c8fb3dcaeb 100644 --- a/vcl/unx/source/gdi/xrender_peer.hxx +++ b/vcl/unx/source/gdi/xrender_peer.hxx @@ -66,6 +66,8 @@ public: const XRenderPictFormat& ) const; Picture CreatePicture( Drawable, const XRenderPictFormat*, unsigned long nDrawable, const XRenderPictureAttributes* ) const; + void ChangePicture( Picture, unsigned long nValueMask, + const XRenderPictureAttributes* ) const; void SetPictureClipRegion( Picture, XLIB_Region ) const; void CompositePicture( int nOp, Picture aSrc, Picture aMask, Picture aDst, int nXSrc, int nYSrc, int nXMask, int nYMask, @@ -103,6 +105,8 @@ private: Picture (*mpXRenderCreatePicture)(Display*,Drawable, const XRenderPictFormat*, unsigned long,const XRenderPictureAttributes*); + void (*mpXRenderChangePicture)(Display*,Picture, + unsigned long,const XRenderPictureAttributes*); void (*mpXRenderSetPictureClipRegion)(Display*,Picture,XLIB_Region); void (*mpXRenderFreePicture)(Display*,Picture); void (*mpXRenderComposite)(Display*,int,Picture,Picture,Picture, @@ -194,6 +198,16 @@ inline Picture XRenderPeer::CreatePicture( Drawable aDrawable, #endif } +inline void XRenderPeer::ChangePicture( Picture aPicture, + unsigned long nValueMask, const XRenderPictureAttributes* pRenderAttr ) const +{ +#ifdef XRENDER_LINK + XRenderChangePicture( mpDisplay, aPicture, nValueMask, pRenderAttr ); +#else + (*mpXRenderChangePicture)( mpDisplay, aPicture, nValueMask, pRenderAttr ); +#endif +} + inline void XRenderPeer::SetPictureClipRegion( Picture aPicture, XLIB_Region aXlibRegion ) const { diff --git a/vcl/unx/source/plugadapt/salplug.cxx b/vcl/unx/source/plugadapt/salplug.cxx index 0c791ca8091f..f1c63b8abee7 100644 --- a/vcl/unx/source/plugadapt/salplug.cxx +++ b/vcl/unx/source/plugadapt/salplug.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: salplug.cxx,v $ - * $Revision: 1.30 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -31,18 +28,14 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_vcl.hxx" -#include -#include +#include "osl/module.h" +#include "osl/process.h" -#include +#include "rtl/ustrbuf.hxx" -#include -#include -#include -#include -#include -#include +#include "vcl/salinst.hxx" +#include "saldata.hxx" #include #include @@ -55,13 +48,16 @@ typedef SalInstance*(*salFactoryProc)( oslModule pModule); static oslModule pCloseModule = NULL; -#define DESKTOP_NONE 0 -#define DESKTOP_UNKNOWN 1 -#define DESKTOP_GNOME 2 -#define DESKTOP_KDE 3 -#define DESKTOP_CDE 4 +enum { + DESKTOP_NONE = 0, + DESKTOP_UNKNOWN, + DESKTOP_GNOME, + DESKTOP_KDE, + DESKTOP_KDE4, + DESKTOP_CDE +}; -static const char * desktop_strings[5] = { "none", "unknown", "GNOME", "KDE", "CDE" }; +static const char * desktop_strings[] = { "none", "unknown", "GNOME", "KDE", "KDE4", "CDE" }; static SalInstance* tryInstance( const OUString& rModuleBase ) { @@ -127,321 +123,79 @@ static SalInstance* tryInstance( const OUString& rModuleBase ) return pInst; } -static bool is_gnome_desktop( Display* pDisplay ) +static const rtl::OUString& get_desktop_environment() { - bool ret = false; - - // warning: these checks are coincidental, GNOME does not - // explicitly advertise itself - - if ( NULL != getenv( "GNOME_DESKTOP_SESSION_ID" ) ) - ret = true; - - if( ! ret ) + static rtl::OUString aRet; + if( ! aRet.getLength() ) { - Atom nAtom1 = XInternAtom( pDisplay, "GNOME_SM_PROXY", True ); - Atom nAtom2 = XInternAtom( pDisplay, "NAUTILUS_DESKTOP_WINDOW_ID", True ); - if( nAtom1 || nAtom2 ) + OUStringBuffer aModName( 128 ); + aModName.appendAscii( SAL_DLLPREFIX"desktop_detector" ); + aModName.appendAscii( SAL_DLLPOSTFIX ); + aModName.appendAscii( SAL_DLLEXTENSION ); + OUString aModule = aModName.makeStringAndClear(); + + oslModule aMod = osl_loadModuleRelative( + reinterpret_cast< oslGenericFunction >( &tryInstance ), aModule.pData, + SAL_LOADMODULE_DEFAULT ); + if( aMod ) { - int nProperties = 0; - Atom* pProperties = XListProperties( pDisplay, DefaultRootWindow( pDisplay ), &nProperties ); - if( pProperties && nProperties ) - { - for( int i = 0; i < nProperties; i++ ) - if( pProperties[ i ] == nAtom1 || - pProperties[ i ] == nAtom2 ) - { - ret = true; - } - XFree( pProperties ); - } - } - } - - if( ! ret ) - { - Atom nUTFAtom = XInternAtom( pDisplay, "UTF8_STRING", True ); - Atom nNetWMNameAtom = XInternAtom( pDisplay, "_NET_WM_NAME", True ); - if( nUTFAtom && nNetWMNameAtom ) - { - // another, more expensive check: search for a gnome-panel - XLIB_Window aRoot, aParent, *pChildren = NULL; - unsigned int nChildren = 0; - XQueryTree( pDisplay, DefaultRootWindow( pDisplay ), - &aRoot, &aParent, &pChildren, &nChildren ); - if( pChildren && nChildren ) - { - for( unsigned int i = 0; i < nChildren && ! ret; i++ ) - { - Atom nType = None; - int nFormat = 0; - unsigned long nItems = 0, nBytes = 0; - unsigned char* pProp = NULL; - XGetWindowProperty( pDisplay, - pChildren[i], - nNetWMNameAtom, - 0, 8, - False, - nUTFAtom, - &nType, - &nFormat, - &nItems, - &nBytes, - &pProp ); - if( pProp && nType == nUTFAtom ) - { - OString aWMName( (sal_Char*)pProp ); - if( aWMName.equalsIgnoreAsciiCase( "gnome-panel" ) ) - ret = true; - } - if( pProp ) - XFree( pProp ); - } - XFree( pChildren ); - } - } - } - - return ret; -} - -static bool bWasXError = false; - -static inline bool WasXError() -{ - bool bRet = bWasXError; - bWasXError = false; - return bRet; -} - -extern "C" -{ - static int autodect_error_handler( Display*, XErrorEvent* ) - { - bWasXError = true; - return 0; - } - - typedef int(* XErrorHandler)(Display*,XErrorEvent*); -} - -static OUString getNetWMName( Display* pDisplay ) -{ - OUString aRet; - - Atom nWmCheck = XInternAtom( pDisplay, "_NET_SUPPORTING_WM_CHECK", True ); - Atom nWmName = XInternAtom( pDisplay, "_NET_WM_NAME", True ); - if( nWmName && nWmCheck ) - { - XLIB_Window aCheckWin = None; - Atom aRealType = None; - int nFormat = 8; - unsigned long nItems = 0; - unsigned long nBytesLeft = 0; - unsigned char* pProperty = NULL; - XGetWindowProperty( pDisplay, - DefaultRootWindow( pDisplay ), - nWmCheck, - 0, 1, - False, - XA_WINDOW, - &aRealType, - &nFormat, - &nItems, - &nBytesLeft, - &pProperty ); - if( aRealType == XA_WINDOW && nFormat == 32 && nItems != 0 ) - aCheckWin = *(XLIB_Window*)pProperty; - if( pProperty ) - { - XFree( pProperty ); - pProperty = NULL; - } - - // see if that window really exists and has the check property set - if( aCheckWin != None ) - { - // clear error flag - WasXError(); - // get the property - XGetWindowProperty( pDisplay, - aCheckWin, - nWmCheck, - 0, 1, - False, - XA_WINDOW, - &aRealType, - &nFormat, - &nItems, - &nBytesLeft, - &pProperty ); - if( ! WasXError() && aRealType == XA_WINDOW && nFormat == 32 && nItems != 0 && pProperty ) - { - if( aCheckWin == *(XLIB_Window*)pProperty ) - { - XFree( pProperty ); - pProperty = NULL; - XGetWindowProperty( pDisplay, - aCheckWin, - nWmName, - 0, 256, - False, - AnyPropertyType, - &aRealType, - &nFormat, - &nItems, - &nBytesLeft, - &pProperty ); - if( !WasXError() && nItems != 0 && pProperty && *pProperty ) - { - if( aRealType == XA_STRING ) // some WM's use this although the should use UTF8_STRING - { - aRet = rtl::OStringToOUString( rtl::OString( (sal_Char*)pProperty ), RTL_TEXTENCODING_ISO_8859_1 ); - } - else - aRet = rtl::OStringToOUString( rtl::OString( (sal_Char*)pProperty ), RTL_TEXTENCODING_UTF8 ); - } - } - } - if( pProperty ) - { - XFree( pProperty ); - pProperty = NULL; - } + rtl::OUString (*pSym)() = (rtl::OUString(*)()) + osl_getAsciiFunctionSymbol( aMod, "get_desktop_environment" ); + if( pSym ) + aRet = pSym(); } + osl_unloadModule( aMod ); } return aRet; } -static bool is_kde_desktop( Display* pDisplay ) +static SalInstance* autodetect_plugin() { - if ( NULL != getenv( "KDE_FULL_SESSION" ) ) - return true; - - // check for kwin - rtl::OUString aWM = getNetWMName( pDisplay ); - if( aWM.equalsIgnoreAsciiCaseAscii( "KWin" ) ) - return true; - - return false; -} - -static bool is_cde_desktop( Display* pDisplay ) -{ - void* pLibrary = NULL; - - Atom nDtAtom = XInternAtom( pDisplay, "_DT_WM_READY", True ); - OUString aPathName( RTL_CONSTASCII_USTRINGPARAM( "file:///usr/dt/lib/libDtSvc.so" ) ); - if( nDtAtom && ( pLibrary = osl_loadModule( aPathName.pData, SAL_LOADMODULE_DEFAULT ) ) ) + static const char* pKDEFallbackList[] = { - osl_unloadModule( (oslModule)pLibrary ); - return true; - } + "kde4", "kde", "gtk", "gen", 0 + }; - return false; -} - - -static const char * get_desktop_environment() -{ - static const char *pRet = NULL; - static const char *pOverride = getenv( "OOO_FORCE_DESKTOP" ); - - if ( pOverride && *pOverride ) + static const char* pStandardFallbackList[] = { - OString aOver( pOverride ); + "gtk", "gen", 0 + }; - if ( aOver.equalsIgnoreAsciiCase( "cde" ) ) - pRet = desktop_strings[DESKTOP_CDE]; - if ( aOver.equalsIgnoreAsciiCase( "kde" ) ) - pRet = desktop_strings[DESKTOP_KDE]; - if ( aOver.equalsIgnoreAsciiCase( "gnome" ) ) - pRet = desktop_strings[DESKTOP_GNOME]; - if ( aOver.equalsIgnoreAsciiCase( "none" ) ) - pRet = desktop_strings[DESKTOP_UNKNOWN]; - } - - if ( NULL == pRet ) + static const char* pHeadlessFallbackList[] = { - // get display to connect to - const char* pDisplayStr = getenv( "DISPLAY" ); - int nParams = osl_getCommandArgCount(); - OUString aParam; - OString aBParm; - for( int i = 0; i < nParams; i++ ) - { - osl_getCommandArg( i, &aParam.pData ); - if( aParam.equalsAscii( "-headless" ) ) - { - pDisplayStr = NULL; - break; - } - if( i < nParams-1 && (aParam.equalsAscii( "-display" ) || aParam.equalsAscii( "--display" )) ) - { - osl_getCommandArg( i+1, &aParam.pData ); - aBParm = OUStringToOString( aParam, osl_getThreadTextEncoding() ); - pDisplayStr = aBParm.getStr(); - break; - } - } + "svp", 0 + }; - // no server at all - if( ! pDisplayStr || !*pDisplayStr ) - pRet = desktop_strings[DESKTOP_NONE]; - else - { - Display* pDisplay = XOpenDisplay( pDisplayStr ); - if( pDisplay ) - { - XErrorHandler pOldHdl = XSetErrorHandler( autodect_error_handler ); - - if ( is_kde_desktop( pDisplay ) ) - pRet = desktop_strings[DESKTOP_KDE]; - else if ( is_gnome_desktop( pDisplay ) ) - pRet = desktop_strings[DESKTOP_GNOME]; - else if ( is_cde_desktop( pDisplay ) ) - pRet = desktop_strings[DESKTOP_CDE]; - else - pRet = desktop_strings[DESKTOP_UNKNOWN]; - - // set the default handler again - XSetErrorHandler( pOldHdl ); - - XCloseDisplay( pDisplay ); - } - } - } - - return pRet; -} - - -static const char* autodetect_plugin() -{ - const char * desktop = get_desktop_environment(); - const char * pRet = "gen"; + const rtl::OUString& desktop( get_desktop_environment() ); + const char ** pList = pStandardFallbackList; + int nListEntry = 0; // no server at all: dummy plugin - if ( desktop == desktop_strings[DESKTOP_NONE] ) - pRet = "svp"; - else if ( desktop == desktop_strings[DESKTOP_GNOME] ) - pRet = "gtk"; - else if( desktop == desktop_strings[DESKTOP_KDE] ) - pRet = "kde"; - else + if ( desktop.equalsAscii( desktop_strings[DESKTOP_NONE] ) ) + pList = pHeadlessFallbackList; + else if ( desktop.equalsAscii( desktop_strings[DESKTOP_GNOME] ) ) + pList = pStandardFallbackList; + else if( desktop.equalsAscii( desktop_strings[DESKTOP_KDE] ) ) { - // #i95296# use the much nicer looking gtk plugin - // on desktops that set gtk variables (e.g. XFCE) - static const char* pEnv = getenv( "GTK2_RC_FILES" ); - if( pEnv && *pEnv ) // check for existance and non emptiness - pRet = "gtk"; + pList = pKDEFallbackList; + nListEntry = 1; + } + else if( desktop.equalsAscii( desktop_strings[DESKTOP_KDE4] ) ) + pList = pKDEFallbackList; + + SalInstance* pInst = NULL; + while( pList[nListEntry] && pInst == NULL ) + { + rtl::OUString aTry( rtl::OUString::createFromAscii( pList[nListEntry] ) ); + pInst = tryInstance( aTry ); + #if OSL_DEBUG_LEVEL > 1 + if( pInst ) + std::fprintf( stderr, "plugin autodetection: %s\n", pList[nListEntry] ); + #endif + nListEntry++; } -#if OSL_DEBUG_LEVEL > 1 - std::fprintf( stderr, "plugin autodetection: %s\n", pRet ); -#endif - - return pRet; + return pInst; } static SalInstance* check_headless_plugin() @@ -466,24 +220,8 @@ SalInstance *CreateSalInstance() if( !(pUsePlugin && *pUsePlugin) ) pInst = check_headless_plugin(); - if( ! pInst ) - { - /* #i92121# workaround deadlocks in the X11 implementation - */ - static const char* pNoXInitThreads = getenv( "SAL_NO_XINITTHREADS" ); - /* #i90094# - from now on we know that an X connection will be - established, so protect X against itself - */ - if( ! ( pNoXInitThreads && *pNoXInitThreads ) ) - XInitThreads(); - } - if( ! pInst && !(pUsePlugin && *pUsePlugin) ) - pUsePlugin = autodetect_plugin(); - - if( ! pInst && pUsePlugin && *pUsePlugin ) - pInst = tryInstance( OUString::createFromAscii( pUsePlugin ) ); + pInst = autodetect_plugin(); // fallback to gen if( ! pInst ) @@ -538,8 +276,7 @@ void SalAbort( const XubString& rErrorText ) const OUString& SalGetDesktopEnvironment() { - static OUString aRet = OStringToOUString(OString(get_desktop_environment()), RTL_TEXTENCODING_ASCII_US); - return aRet; + return get_desktop_environment(); } SalData::SalData() : diff --git a/vcl/unx/source/printer/ppdparser.cxx b/vcl/unx/source/printer/ppdparser.cxx index 1caf64ef7e2c..95bc7bca41ca 100644 --- a/vcl/unx/source/printer/ppdparser.cxx +++ b/vcl/unx/source/printer/ppdparser.cxx @@ -293,8 +293,14 @@ void PPDParser::initPPDFiles() } } -void PPDParser::getKnownPPDDrivers( std::list< rtl::OUString >& o_rDrivers ) +void PPDParser::getKnownPPDDrivers( std::list< rtl::OUString >& o_rDrivers, bool bRefresh ) { + if( bRefresh ) + { + delete pAllPPDFiles; + pAllPPDFiles = NULL; + } + initPPDFiles(); o_rDrivers.clear(); diff --git a/vcl/unx/source/printer/printerinfomanager.cxx b/vcl/unx/source/printer/printerinfomanager.cxx index cf5a4a886c41..b3e5b4667a6a 100644 --- a/vcl/unx/source/printer/printerinfomanager.cxx +++ b/vcl/unx/source/printer/printerinfomanager.cxx @@ -44,6 +44,8 @@ #include "tools/debug.hxx" #include "tools/config.hxx" +#include "i18npool/paper.hxx" + #include "rtl/strbuf.hxx" #include "osl/thread.hxx" @@ -154,77 +156,9 @@ void PrinterInfoManager::setCUPSDisabled( bool bDisable ) void PrinterInfoManager::initSystemDefaultPaper() { - bool bSuccess = false; - - // try libpaper - - // #i78617# workaround missing paperconf command - FILE* pPipe = popen( "sh -c paperconf 2>/dev/null", "r" ); - if( pPipe ) - { - char pBuffer[ 1024 ]; - *pBuffer = 0; - fgets( pBuffer, sizeof(pBuffer)-1, pPipe ); - pclose( pPipe ); - - ByteString aPaper( pBuffer ); - aPaper = WhitespaceToSpace( aPaper ); - if( aPaper.Len() ) - { - m_aSystemDefaultPaper = OUString( OStringToOUString( aPaper, osl_getThreadTextEncoding() ) ); - bSuccess = true; - #if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "paper from paperconf = %s\n", aPaper.GetBuffer() ); - #endif - } - if( bSuccess ) - return; - } - - // default value is Letter for US (en_US), Cannada (en_CA, fr_CA); else A4 - // en will be interpreted as en_US - - // note: at this point m_aSystemDefaultPaper is set to "A4" from the constructor - - // check for LC_PAPER - const char* pPaperLang = getenv( "LC_PAPER" ); - if( pPaperLang && *pPaperLang ) - { - OString aLang( pPaperLang ); - if( aLang.getLength() > 5 ) - aLang = aLang.copy( 0, 5 ); - if( aLang.getLength() == 5 ) - { - if( aLang.equalsIgnoreAsciiCase( "en_us" ) - || aLang.equalsIgnoreAsciiCase( "en_ca" ) - || aLang.equalsIgnoreAsciiCase( "fr_ca" ) - ) - m_aSystemDefaultPaper = OUString( RTL_CONSTASCII_USTRINGPARAM( "Letter" ) ); - } - else if( aLang.getLength() == 2 && aLang.equalsIgnoreAsciiCase( "en" ) ) - m_aSystemDefaultPaper = OUString( RTL_CONSTASCII_USTRINGPARAM( "Letter" ) ); - return; - } - - // use process locale to determine paper - rtl_Locale* pLoc = NULL; - osl_getProcessLocale( &pLoc ); - if( pLoc ) - { - if( 0 == rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pLoc->Language->buffer, pLoc->Language->length, "en") ) - { - if( 0 == rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pLoc->Country->buffer, pLoc->Country->length, "us") - || 0 == rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pLoc->Country->buffer, pLoc->Country->length, "ca") - || pLoc->Country->length == 0 - ) - m_aSystemDefaultPaper = OUString( RTL_CONSTASCII_USTRINGPARAM( "Letter" ) ); - } - else if( 0 == rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pLoc->Language->buffer, pLoc->Language->length, "fr") ) - { - if( 0 == rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength( pLoc->Country->buffer, pLoc->Country->length, "ca") ) - m_aSystemDefaultPaper = OUString( RTL_CONSTASCII_USTRINGPARAM( "Letter" ) ); - } - } + m_aSystemDefaultPaper = rtl::OStringToOUString( + PaperInfo::toPSName(PaperInfo::getSystemDefaultPaper().getPaper()), + RTL_TEXTENCODING_UTF8); } // ----------------------------------------------------------------- diff --git a/vcl/unx/source/printergfx/common_gfx.cxx b/vcl/unx/source/printergfx/common_gfx.cxx index 632f0d70aa2f..9b305ff323ba 100644 --- a/vcl/unx/source/printergfx/common_gfx.cxx +++ b/vcl/unx/source/printergfx/common_gfx.cxx @@ -7,7 +7,6 @@ * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: common_gfx.cxx,v $ - * $Revision: 1.20.18.1 $ * * This file is part of OpenOffice.org. * @@ -535,68 +534,47 @@ PrinterGfx::DrawPolyLineBezier (sal_uInt32 nPoints, const Point* pPath, const BY const sal_uInt32 nBezString = 1024; sal_Char pString[nBezString]; - if ( maLineColor.Is() && nPoints && pPath ) + if ( nPoints > 1 && maLineColor.Is() && pPath ) { PSSetColor (maLineColor); PSSetColor (); PSSetLineWidth (); - if (pFlgAry[0] != POLY_NORMAL) //There must be a starting point to moveto - { - return; - } - else - { - snprintf(pString, nBezString, "%li %li moveto\n", pPath[0].X(), pPath[0].Y()); - WritePS(mpPageBody, pString); - } + snprintf(pString, nBezString, "%li %li moveto\n", pPath[0].X(), pPath[0].Y()); + WritePS(mpPageBody, pString); // Handle the drawing of mixed lines mixed with curves // - a normal point followed by a normal point is a line // - a normal point followed by 2 control points and a normal point is a curve for (unsigned int i=1; i= nPoints) return; //Make sure we don't pass the end of the array snprintf(pString, nBezString, "%li %li lineto\n", pPath[i].X(), pPath[i].Y()); i++; } else //Otherwise we're drawing a spline { - if (i+3 >= nPoints) return; //Make sure we don't pass the end of the array - snprintf(pString, nBezString, "%li %li %li %li %li %li curveto\n", - pPath[i+1].X(), pPath[i+1].Y(), - pPath[i+2].X(), pPath[i+2].Y(), - pPath[i+3].X(), pPath[i+3].Y()); + if (i+2 >= nPoints) + return; //Error: wrong sequence of contol/normal points somehow + if ((pFlgAry[i] == POLY_CONTROL) && (pFlgAry[i+1] == POLY_CONTROL) && + (pFlgAry[i+2] != POLY_CONTROL)) + { + snprintf(pString, nBezString, "%li %li %li %li %li %li curveto\n", + pPath[i].X(), pPath[i].Y(), + pPath[i+1].X(), pPath[i+1].Y(), + pPath[i+2].X(), pPath[i+2].Y()); + } + else + { + DBG_ERROR( "PrinterGfx::DrawPolyLineBezier: Strange output" ); + } i+=3; } WritePS(mpPageBody, pString); } - } - // if eofill and stroke, save the current path - if( maFillColor.Is() && maLineColor.Is()) - PSGSave(); - - // first draw area - if( maFillColor.Is() ) - { - PSSetColor (maFillColor); - PSSetColor (); - WritePS (mpPageBody, "eofill\n"); - } - - // restore the current path - if( maFillColor.Is() && maLineColor.Is()) - PSGRestore(); - - // now draw outlines - if( maLineColor.Is() ) - { - PSSetColor (maLineColor); - PSSetColor (); - PSSetLineWidth (); + // now draw outlines WritePS (mpPageBody, "stroke\n"); } } @@ -635,7 +613,7 @@ PrinterGfx::DrawPolygonBezier (sal_uInt32 nPoints, const Point* pPath, const BYT } else { - fprintf(stderr, "Strange output\n"); + DBG_ERROR( "PrinterGfx::DrawPolygonBezier: Strange output" ); } i+=3; } @@ -699,9 +677,7 @@ PrinterGfx::DrawPolyPolygonBezier (sal_uInt32 nPoly, const sal_uInt32 * pPoints, } else { -#if OSL_DEBUG_LEVEL > 1 - fprintf(stderr, "Strange output\n"); -#endif + DBG_ERROR( "PrinterGfx::DrawPolyPolygonBezier: Strange output" ); } j+=3; } diff --git a/vcl/unx/source/printergfx/glyphset.cxx b/vcl/unx/source/printergfx/glyphset.cxx index 2a35e975cbab..5adff6683267 100644 --- a/vcl/unx/source/printergfx/glyphset.cxx +++ b/vcl/unx/source/printergfx/glyphset.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: glyphset.cxx,v $ - * $Revision: 1.24 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -38,6 +35,7 @@ #include "vcl/printergfx.hxx" #include "vcl/fontmanager.hxx" +#include "vcl/fontsubset.hxx" #include "osl/thread.h" @@ -48,6 +46,7 @@ #include #include +#include using namespace vcl; using namespace psp; @@ -787,8 +786,55 @@ GlyphSet::PSUploadEncoding(osl::File* pOutFile, PrinterGfx &rGfx) return sal_True; } +struct EncEntry +{ + sal_uChar aEnc; + long aGID; + + EncEntry() : aEnc( 0 ), aGID( 0 ) {} + + bool operator<( const EncEntry& rRight ) const + { return aEnc < rRight.aEnc; } +}; + +static void CreatePSUploadableFont( TrueTypeFont* pSrcFont, FILE* pTmpFile, + const char* pGlyphSetName, int nGlyphCount, + /*const*/ sal_uInt16* pRequestedGlyphs, /*const*/ sal_uChar* pEncoding, + bool bAllowType42, bool /*bAllowCID*/ ) +{ + // match the font-subset to the printer capabilities + // TODO: allow CFF for capable printers + int nTargetMask = FontSubsetInfo::TYPE1_PFA | FontSubsetInfo::TYPE3_FONT; + if( bAllowType42 ) + nTargetMask |= FontSubsetInfo::TYPE42_FONT; + + std::vector< EncEntry > aSorted( nGlyphCount, EncEntry() ); + for( int i = 0; i < nGlyphCount; i++ ) + { + aSorted[i].aEnc = pEncoding[i]; + aSorted[i].aGID = pRequestedGlyphs[i]; + } + + std::stable_sort( aSorted.begin(), aSorted.end() ); + + std::vector< sal_uChar > aEncoding( nGlyphCount ); + std::vector< long > aRequestedGlyphs( nGlyphCount ); + + for( int i = 0; i < nGlyphCount; i++ ) + { + aEncoding[i] = aSorted[i].aEnc; + aRequestedGlyphs[i] = aSorted[i].aGID; + } + + FontSubsetInfo aInfo; + aInfo.LoadFont( pSrcFont ); + + aInfo.CreateFontSubset( nTargetMask, pTmpFile, pGlyphSetName, + &aRequestedGlyphs[0], &aEncoding[0], nGlyphCount, NULL ); +} + sal_Bool -GlyphSet::PSUploadFont (osl::File& rOutFile, PrinterGfx &rGfx, bool bAsType42, std::list< OString >& rSuppliedFonts ) +GlyphSet::PSUploadFont (osl::File& rOutFile, PrinterGfx &rGfx, bool bAllowType42, std::list< OString >& rSuppliedFonts ) { // only for truetype fonts if (meBaseType != fonttype::TrueType) @@ -811,6 +857,7 @@ GlyphSet::PSUploadFont (osl::File& rOutFile, PrinterGfx &rGfx, bool bAsType42, s // of the glyph in the output file sal_uChar pEncoding[256]; sal_uInt16 pTTGlyphMapping[256]; + const bool bAllowCID = false; // TODO: nPSLanguageLevel>=3 // loop thru all the font subsets sal_Int32 nCharSetID; @@ -838,13 +885,8 @@ GlyphSet::PSUploadFont (osl::File& rOutFile, PrinterGfx &rGfx, bool bAsType42, s // create the current subset OString aCharSetName = GetCharSetName(nCharSetID); fprintf( pTmpFile, "%%%%BeginResource: font %s\n", aCharSetName.getStr() ); - if( bAsType42 ) - CreateT42FromTTGlyphs (pTTFont, pTmpFile, aCharSetName.getStr(), - pTTGlyphMapping, pEncoding, (*aCharSet).size() ); - else - CreateT3FromTTGlyphs (pTTFont, pTmpFile, aCharSetName.getStr(), - pTTGlyphMapping, pEncoding, (*aCharSet).size(), - 0 /* 0 = horizontal, 1 = vertical */ ); + CreatePSUploadableFont( pTTFont, pTmpFile, aCharSetName.getStr(), (*aCharSet).size(), + pTTGlyphMapping, pEncoding, bAllowType42, bAllowCID ); fprintf( pTmpFile, "%%%%EndResource\n" ); rSuppliedFonts.push_back( aCharSetName ); } @@ -872,13 +914,8 @@ GlyphSet::PSUploadFont (osl::File& rOutFile, PrinterGfx &rGfx, bool bAsType42, s // create the current subset OString aGlyphSetName = GetGlyphSetName(nGlyphSetID); fprintf( pTmpFile, "%%%%BeginResource: font %s\n", aGlyphSetName.getStr() ); - if( bAsType42 ) - CreateT42FromTTGlyphs (pTTFont, pTmpFile, aGlyphSetName.getStr(), - pTTGlyphMapping, pEncoding, (*aGlyphSet).size() ); - else - CreateT3FromTTGlyphs (pTTFont, pTmpFile, aGlyphSetName.getStr(), - pTTGlyphMapping, pEncoding, (*aGlyphSet).size(), - 0 /* 0 = horizontal, 1 = vertical */ ); + CreatePSUploadableFont( pTTFont, pTmpFile, aGlyphSetName.getStr(), (*aGlyphSet).size(), + pTTGlyphMapping, pEncoding, bAllowType42, bAllowCID ); fprintf( pTmpFile, "%%%%EndResource\n" ); rSuppliedFonts.push_back( aGlyphSetName ); } @@ -903,5 +940,3 @@ GlyphSet::PSUploadFont (osl::File& rOutFile, PrinterGfx &rGfx, bool bAsType42, s return sal_True; } - - diff --git a/vcl/unx/source/printergfx/text_gfx.cxx b/vcl/unx/source/printergfx/text_gfx.cxx index e9c173682f87..00e3ab5f44c2 100644 --- a/vcl/unx/source/printergfx/text_gfx.cxx +++ b/vcl/unx/source/printergfx/text_gfx.cxx @@ -199,7 +199,7 @@ void PrinterGfx::drawGlyphs( void PrinterGfx::DrawGlyphs( const Point& rPoint, - sal_uInt32* pGlyphIds, + sal_GlyphId* pGlyphIds, sal_Unicode* pUnicodes, sal_Int16 nLen, sal_Int32* pDeltaArray @@ -256,8 +256,8 @@ void PrinterGfx::DrawGlyphs( for( sal_Int16 i = 0; i < nLen; i++ ) { - sal_Int32 nRot = ((pGlyphIds[i] >> 24) & 3); - if( nRot == 0 ) + const sal_GlyphId nRot = pGlyphIds[i] & GF_ROTMASK; + if( nRot == GF_NONE ) { pTempUnicodes[nTempLen] = pUnicodes[i]; pTempGlyphIds[nTempLen] = pGlyphIds[i]; @@ -282,20 +282,20 @@ void PrinterGfx::DrawGlyphs( sal_Int32 nRotAngle = 0; switch( nRot ) { - case 3: + case GF_ROTR: nRotAngle = 2700; aRotPoint = Point( -nAscend*nTextWidth/nTextHeight, -nDescend*nTextWidth/nTextHeight - nOffset ); break; - case 2: + case GF_VERT: nRotAngle = 1800; aRotPoint = Point( -nOffset, (nAscend+nDescend) ); break; - case 1: + case GF_ROTL: nRotAngle = 900; aRotPoint = Point( -nDescend*nTextWidth/nTextHeight, nOffset + nAscend*nTextWidth/nTextHeight ); break; } - sal_uInt32 nRotGlyphId = pGlyphIds[i]; + sal_GlyphId nRotGlyphId = pGlyphIds[i]; sal_Unicode nRotUnicode = pUnicodes[i]; sal_Int32 nRotDelta = 0; diff --git a/vcl/unx/source/window/salframe.cxx b/vcl/unx/source/window/salframe.cxx index 22e43999caa6..68c99e05da77 100644 --- a/vcl/unx/source/window/salframe.cxx +++ b/vcl/unx/source/window/salframe.cxx @@ -72,6 +72,7 @@ #include "tools/debug.hxx" #include "sal/alloca.h" +#include #include @@ -425,15 +426,26 @@ void X11SalFrame::Init( ULONG nSalFrameStyle, int nScreen, SystemParentData* pPa if( IsOverrideRedirect() ) Attributes.override_redirect = True; // default icon - if( (nStyle_ & SAL_FRAME_STYLE_INTRO) == 0 && - SelectAppIconPixmap( pDisplay_, m_nScreen, - mnIconID != 1 ? mnIconID : - (mpParent ? mpParent->mnIconID : 1), 32, - Hints.icon_pixmap, Hints.icon_mask )) + if( (nStyle_ & SAL_FRAME_STYLE_INTRO) == 0 ) { - Hints.flags |= IconPixmapHint; - if( Hints.icon_mask ) - Hints.flags |= IconMaskHint; + bool bOk=false; + try + { + bOk=SelectAppIconPixmap( pDisplay_, m_nScreen, + mnIconID != 1 ? mnIconID : + (mpParent ? mpParent->mnIconID : 1), 32, + Hints.icon_pixmap, Hints.icon_mask ); + } + catch( com::sun::star::uno::Exception& ) + { + // can happen - no ucb during early startup + } + if( bOk ) + { + Hints.flags |= IconPixmapHint; + if( Hints.icon_mask ) + Hints.flags |= IconMaskHint; + } } // find the top level frame of the transience hierarchy @@ -918,12 +930,13 @@ void X11SalFrame::ReleaseGraphics( SalGraphics *pGraphics ) pGraphics_ = NULL; } -void X11SalFrame::updateGraphics() +void X11SalFrame::updateGraphics( bool bClear ) { + Drawable aDrawable = bClear ? None : GetWindow(); if( pGraphics_ ) - pGraphics_->SetDrawable( GetWindow(), m_nScreen ); + pGraphics_->SetDrawable( aDrawable, m_nScreen ); if( pFreeGraphics_ ) - pFreeGraphics_->SetDrawable( GetWindow(), m_nScreen ); + pFreeGraphics_->SetDrawable( aDrawable, m_nScreen ); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -1200,7 +1213,12 @@ void X11SalFrame::Show( BOOL bVisible, BOOL bNoActivate ) XLIB_Time nUserTime = 0; if( ! bNoActivate && (nStyle_ & (SAL_FRAME_STYLE_OWNERDRAWDECORATION|SAL_FRAME_STYLE_TOOLWINDOW)) == 0 ) - nUserTime = pDisplay_->GetLastUserEventTime(); + { + if( GetDisplay()->getWMAdaptor()->getWindowManagerName().EqualsAscii("Metacity") ) + nUserTime = pDisplay_->GetLastUserEventTime( true ); + else + nUserTime = pDisplay_->GetLastUserEventTime(); + } GetDisplay()->getWMAdaptor()->setUserTime( this, nUserTime ); // actually map the window @@ -2709,6 +2727,7 @@ void X11SalFrame::createNewWindow( XLIB_Window aNewParent, int nScreen ) } // first deinit frame + updateGraphics(true); if( mpInputContext ) { mpInputContext->UnsetICFocus( this ); @@ -2731,7 +2750,7 @@ void X11SalFrame::createNewWindow( XLIB_Window aNewParent, int nScreen ) Init( nStyle_ & ~SAL_FRAME_STYLE_PLUG, nScreen, NULL, true ); // update graphics if necessary - updateGraphics(); + updateGraphics(false); if( m_aTitle.Len() ) SetTitle( m_aTitle ); diff --git a/vcl/util/linksvp/makefile.mk b/vcl/util/linksvp/makefile.mk index 8e7d6f35ef83..e5e82323af5c 100644 --- a/vcl/util/linksvp/makefile.mk +++ b/vcl/util/linksvp/makefile.mk @@ -54,6 +54,7 @@ SHL1LIBS=$(LIB1TARGET) SHL1DEPN=$(LB)$/libvcl$(DLLPOSTFIX)$(DLLPOST) SHL1STDLIBS=\ $(VCLLIB)\ + $(I18NPAPERLIB)\ $(BASEBMPLIB)\ $(BASEGFXLIB)\ $(TOOLSLIB) \ diff --git a/vcl/util/makefile.mk b/vcl/util/makefile.mk index 08d6f9197f28..ef4f13301ecd 100644 --- a/vcl/util/makefile.mk +++ b/vcl/util/makefile.mk @@ -6,10 +6,6 @@ # # OpenOffice.org - a multi-platform office productivity suite # -# $RCSfile: makefile.mk,v $ -# -# $Revision: 1.111.36.3 $ -# # This file is part of OpenOffice.org. # # OpenOffice.org is free software: you can redistribute it and/or modify @@ -77,7 +73,6 @@ HXXDEPNLST= $(INC)$/vcl$/accel.hxx \ $(INC)$/vcl$/fixed.hxx \ $(INC)$/vcl$/floatwin.hxx \ $(INC)$/vcl$/font.hxx \ - $(INC)$/vcl$/fontcvt.hxx \ $(INC)$/vcl$/floatwin.hxx \ $(INC)$/vcl$/graph.hxx \ $(INC)$/vcl$/group.hxx \ @@ -162,6 +157,9 @@ LIB1FILES+= \ $(SLB)$/salwin.lib \ $(SLB)$/salgdi.lib \ $(SLB)$/salapp.lib +.IF "$(GUIBASE)" == "aqua" +LIB1FILES+= $(SLB)$/dtransaqua.lib +.ENDIF .ENDIF SHL1TARGET= vcl$(DLLPOSTFIX) @@ -170,8 +168,9 @@ SHL1STDLIBS+=\ $(SOTLIB) \ $(UNOTOOLSLIB) \ $(TOOLSLIB) \ + $(I18NPAPERLIB) \ $(I18NISOLANGLIB) \ - $(I18NUTILLIB) \ + $(I18NUTILLIB) \ $(COMPHELPERLIB) \ $(UCBHELPERLIB) \ $(CPPUHELPERLIB) \ @@ -183,12 +182,23 @@ SHL1STDLIBS+=\ $(ICUDATALIB) \ $(ICULELIB) \ $(JVMACCESSLIB) + +.IF "$(GUI)" == "UNX" +.IF "$(ENABLE_GRAPHITE)" != "" +.IF "$(SYSTEM_GRAPHITE)" == "YES" +SHL1STDLIBS+= $(GRAPHITE_LIBS) +.ELSE +SHL1STDLIBS+= $(SOLARVERSION)/$(INPATH)/lib$(UPDMINOREXT)/libgraphite.a +.ENDIF +.ENDIF +.ENDIF SHL1USE_EXPORTS=name .IF "$(GUIBASE)"=="aqua" SHL1STDLIBS+= \ $(BASEBMPLIB) \ - -lAppleRemote$(DLLPOSTFIX) + -lAppleRemote$(DLLPOSTFIX) \ + -framework QuickTime LIB1FILES+= \ $(SLB)$/sala11y.lib @@ -197,12 +207,16 @@ LIB1FILES+= \ .IF "$(USE_BUILTIN_RASTERIZER)"!="" LIB1FILES += $(SLB)$/glyphs.lib SHL1STDLIBS+= $(FREETYPELIB) +.ELSE +.IF "$(ENABLE_GRAPHITE)" == "TRUE" + LIB1FILES += $(SLB)$/glyphs.lib +.ENDIF .ENDIF # USE_BUILTIN_RASTERIZER SHL1LIBS= $(LIB1TARGET) .IF "$(GUI)"!="UNX" .IF "$(COM)"!="GCC" -SHL1OBJS= $(SLO)$/salshl.obj +#SHL1OBJS= $(SLO)$/salshl.obj .ENDIF .ENDIF @@ -222,6 +236,14 @@ DEFLIB1NAME =vcl .IF "$(GUI)" == "WNT" +.IF "$(ENABLE_GRAPHITE)" == "TRUE" +.IF "$(COM)" == "GCC" +SHL1STDLIBS += -lgraphite +.ELSE +SHL1STDLIBS += graphite_dll.lib +.ENDIF +.ENDIF + SHL1STDLIBS += $(UWINAPILIB) \ $(GDI32LIB) \ $(GDIPLUSLIB) \ @@ -249,9 +271,20 @@ STDSHL1 += ft2lib.lib # UNX sal plugins .IF "$(GUI)" == "UNX" && "$(GUIBASE)" != "aqua" +# desktop detector +LIB7TARGET=$(SLB)$/idet +LIB7FILES=$(SLB)$/dtdetect.lib +SHL7TARGET=desktop_detector$(DLLPOSTFIX) +SHL7STDLIBS=\ + $(SALLIB) \ + $(X11LINK_DYNAMIC) +SHL7IMPLIB=idet +SHL7LIBS=$(LIB7TARGET) + # basic pure X11 plugin LIB2TARGET=$(SLB)$/ipure_x LIB2FILES= \ + $(SLB)$/dtransX11.lib \ $(SLB)$/printergfx.lib \ $(SLB)$/salwin.lib \ $(SLB)$/salgdi.lib \ @@ -264,9 +297,13 @@ SHL2DEPN=$(SHL1IMPLIBN) $(SHL1TARGETN) # libs for generic plugin SHL2STDLIBS=\ $(VCLLIB)\ + $(I18NPAPERLIB) \ $(TOOLSLIB) \ $(VOSLIB) \ $(BASEGFXLIB) \ + $(UNOTOOLSLIB) \ + $(CPPUHELPERLIB) \ + $(CPPULIB) \ $(SALLIB) # prepare linking of Xinerama @@ -294,7 +331,7 @@ SHL2STDLIBS+=`pkg-config --libs xrender` .IF "$(GUIBASE)"=="unx" SHL2STDLIBS += -lXext -lSM -lICE -lX11 -.IF "$(OS)"!="MACOSX" && "$(OS)"!="FREEBSD" +.IF "$(OS)"!="MACOSX" && "$(OS)"!="FREEBSD" && "$(OS)"!="NETBSD" # needed by salprnpsp.cxx SHL2STDLIBS+= -ldl .ENDIF @@ -342,7 +379,8 @@ SHL4STDLIBS+=\ $(CPPUHELPERLIB) \ $(CPPULIB) \ $(VOSLIB) \ - $(SALLIB) + $(SALLIB) \ + $(X11LINK_DYNAMIC) .IF "$(ENABLE_RANDR)" != "" .IF "$(XRANDR_DLOPEN)" == "FALSE" @@ -364,13 +402,14 @@ SHL5IMPLIB=ikde_plug_ SHL5LIBS=$(LIB5TARGET) SHL5DEPN=$(SHL2TARGETN) # libs for KDE plugin -SHL5STDLIBS=$(KDE_LIBS) +SHL5LINKFLAGS+=$(KDE_LIBS) SHL5STDLIBS+=-l$(SHL2TARGET) SHL5STDLIBS+=\ $(VCLLIB) \ $(TOOLSLIB) \ $(VOSLIB) \ - $(SALLIB) + $(SALLIB) \ + $(X11LINK_DYNAMIC) .IF "$(ENABLE_RANDR)" != "" .IF "$(XRANDR_DLOPEN)" == "FALSE" @@ -380,6 +419,36 @@ SHL5STDLIBS+= $(XRANDR_LIBS) .ENDIF # "$(ENABLE_KDE)" != "" +# KDE4 plugin +.IF "$(ENABLE_KDE4)" != "" +.IF "$(KDE4_ROOT)"!="" +EXTRALIBPATHS+=-L$(KDE4_ROOT)$/lib +.ENDIF +LIB6TARGET=$(SLB)$/ikde4_plug_ +LIB6FILES=$(SLB)$/kde4plug.lib +SHL6TARGET=vclplug_kde4$(DLLPOSTFIX) +SHL6IMPLIB=ikde4_plug_ +SHL6LIBS=$(LIB6TARGET) +SHL6DEPN=$(SHL2TARGETN) +# libs for KDE4 plugin +SHL6LINKFLAGS+=$(KDE4_LIBS) +SHL6STDLIBS+=-l$(SHL2TARGET) +SHL6STDLIBS+=\ + $(VCLLIB) \ + $(PSPLIB) \ + $(TOOLSLIB) \ + $(VOSLIB) \ + $(SALLIB) \ + $(X11LINK_DYNAMIC) + +.IF "$(ENABLE_RANDR)" != "" +.IF "$(XRANDR_DLOPEN)" == "FALSE" +SHL6STDLIBS+= $(XRANDR_LIBS) +.ENDIF +.ENDIF + +.ENDIF # "$(ENABLE_KDE4)" != "" + .ENDIF # UNX # --- Allgemein ---------------------------------------------------------- diff --git a/vcl/util/makefile2.pmk b/vcl/util/makefile2.pmk index 0e57d7aeb80b..63b2889bc15d 100644 --- a/vcl/util/makefile2.pmk +++ b/vcl/util/makefile2.pmk @@ -34,6 +34,5 @@ CDEFS += -DVCL_DLLIMPLEMENTATION VISIBILITY_HIDDEN=TRUE .IF "$(GUIBASE)"=="aqua" -OBJCXXFLAGS=-x objective-c++ -fobjc-exceptions CFLAGSCXX+=$(OBJCXXFLAGS) .ENDIF # "$(GUIBASE)"=="aqua" diff --git a/vcl/win/inc/salgdi.h b/vcl/win/inc/salgdi.h index 0475ea4a193e..c7ceb68199b9 100644 --- a/vcl/win/inc/salgdi.h +++ b/vcl/win/inc/salgdi.h @@ -81,6 +81,9 @@ public: bool SupportsArabic() const { return mbHasArabicSupport; } bool AliasSymbolsHigh() const { return mbAliasSymbolsHigh; } bool AliasSymbolsLow() const { return mbAliasSymbolsLow; } +#ifdef ENABLE_GRAPHITE + bool SupportsGraphite() const { return mbHasGraphiteSupport; } +#endif ImplFontCharMap* GetImplFontCharMap() const; const Ucs2SIntMap* GetEncodingVector() const { return mpEncodingVector; } @@ -97,6 +100,9 @@ private: mutable bool mbDisableGlyphApi; mutable bool mbHasKoreanRange; mutable bool mbHasCJKSupport; +#ifdef ENABLE_GRAPHITE + mutable bool mbHasGraphiteSupport; +#endif mutable bool mbHasArabicSupport; mutable ImplFontCharMap* mpUnicodeMap; mutable const Ucs2SIntMap* mpEncodingVector; diff --git a/vcl/win/inc/salinst.h b/vcl/win/inc/salinst.h index 26afe892b9a3..33a1a941ed49 100644 --- a/vcl/win/inc/salinst.h +++ b/vcl/win/inc/salinst.h @@ -88,6 +88,7 @@ public: virtual void DestroyMenuItem( SalMenuItem* ); virtual SalSession* CreateSalSession(); virtual void* GetConnectionIdentifier( ConnectionIdentifierType& rReturnedType, int& rReturnedBytes ); + virtual void AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& rMimeType); static int WorkaroundExceptionHandlingInUSER32Lib(int nExcept, LPEXCEPTION_POINTERS pExceptionInfo); }; diff --git a/vcl/win/source/app/salinst.cxx b/vcl/win/source/app/salinst.cxx index d57cdd48eed2..68177795c8db 100644 --- a/vcl/win/source/app/salinst.cxx +++ b/vcl/win/source/app/salinst.cxx @@ -39,7 +39,7 @@ #ifdef __MINGW32__ #include #endif - +#include #include #include #include @@ -55,6 +55,7 @@ #include #include #include // CS_DROPSHADOW +#include #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) @@ -65,11 +66,13 @@ #if defined _MSC_VER #pragma warning(push, 1) +#pragma warning( disable: 4917 ) #endif #include #include #include +#include #if defined _MSC_VER #pragma warning(pop) @@ -456,10 +459,10 @@ void InitSalData() { SalData* pSalData = new SalData; CoInitialize(0); - - // init GDIPlus - static Gdiplus::GdiplusStartupInput gdiplusStartupInput; - Gdiplus::GdiplusStartup(&pSalData->gdiplusToken, &gdiplusStartupInput, NULL); + + // init GDIPlus + static Gdiplus::GdiplusStartupInput gdiplusStartupInput; + Gdiplus::GdiplusStartup(&pSalData->gdiplusToken, &gdiplusStartupInput, NULL); } @@ -471,7 +474,7 @@ void DeInitSalData() // deinit GDIPlus if(pSalData) { - Gdiplus::GdiplusShutdown(pSalData->gdiplusToken); + Gdiplus::GdiplusShutdown(pSalData->gdiplusToken); } delete pSalData; @@ -659,12 +662,14 @@ WinSalInstance::WinSalInstance() mpSalWaitMutex = new vos::OMutex; mnYieldWaitCount = 0; mpSalYieldMutex->acquire(); + ::tools::SolarMutex::SetSolarMutex( mpSalYieldMutex ); } // ----------------------------------------------------------------------- WinSalInstance::~WinSalInstance() { + ::tools::SolarMutex::SetSolarMutex( 0 ); mpSalYieldMutex->release(); delete mpSalYieldMutex; delete mpSalWaitMutex; @@ -1089,6 +1094,26 @@ void* WinSalInstance::GetConnectionIdentifier( ConnectionIdentifierType& rReturn // ----------------------------------------------------------------------- +/** Add a file to the system shells recent document list if there is any. + This function may have no effect under Unix because there is no + standard API among the different desktop managers. + + @param aFileUrl + The file url of the document. +*/ +void WinSalInstance::AddToRecentDocumentList(const rtl::OUString& rFileUrl, const rtl::OUString& /*rMimeType*/) +{ + rtl::OUString system_path; + osl::FileBase::RC rc = osl::FileBase::getSystemPathFromFileURL(rFileUrl, system_path); + + OSL_ENSURE(osl::FileBase::E_None == rc, "Invalid file url"); + + if (osl::FileBase::E_None == rc) + SHAddToRecentDocs(SHARD_PATHW, system_path.getStr()); +} + +// ----------------------------------------------------------------------- + SalTimer* WinSalInstance::CreateSalTimer() { return new WinSalTimer(); diff --git a/vcl/win/source/gdi/MAKEFILE.MK b/vcl/win/source/gdi/MAKEFILE.MK index d50abc1b5aa3..3d8fd904b35b 100644 --- a/vcl/win/source/gdi/MAKEFILE.MK +++ b/vcl/win/source/gdi/MAKEFILE.MK @@ -44,7 +44,6 @@ TARGET=salgdi # --- #105371# .IF "$(COM)"=="GCC" -CDEFS += -UWINVER -DWINVER=0x0400 .ELSE CFLAGS += -DWINVER=0x0400 .ENDIF @@ -65,6 +64,10 @@ SLOFILES= $(SLO)$/salgdi.obj \ EXCEPTIONSFILES= $(SLO)$/salprn.obj +.IF "$(ENABLE_GRAPHITE)" == "TRUE" +CFLAGS+=-DENABLE_GRAPHITE +.ENDIF + # --- Targets ------------------------------------------------------ .INCLUDE : target.mk diff --git a/vcl/win/source/gdi/salgdi3.cxx b/vcl/win/source/gdi/salgdi3.cxx index 99f276faa964..d82830a9022f 100644 --- a/vcl/win/source/gdi/salgdi3.cxx +++ b/vcl/win/source/gdi/salgdi3.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: salgdi3.cxx,v $ - * $Revision: 1.95.14.5 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -47,6 +44,7 @@ #include "vcl/svapp.hxx" #include "vcl/outfont.hxx" #include "vcl/font.hxx" +#include "vcl/fontsubset.hxx" #include "vcl/sallayout.hxx" #include "rtl/logfile.hxx" @@ -74,6 +72,11 @@ #include #endif +#ifdef ENABLE_GRAPHITE +#include +#include +#endif + #include #include #include @@ -551,13 +554,10 @@ static ImplDevFontAttributes WinFont2DevFontAttributes( const ENUMLOGFONTEXA& rE aDFA.mbEmbeddable = false; aDFA.mbSubsettable = false; - if( (rMetric.tmPitchAndFamily & TMPF_TRUETYPE) != 0 ) - if( (rMetric.tmPitchAndFamily & TMPF_DEVICE) == 0 ) - // TODO: implement type1 or CFF subsetting - if( 0 == (rMetric.ntmFlags & (NTM_PS_OPENTYPE | NTM_TYPE1) ) ) - aDFA.mbSubsettable = true; - // for now we can only embed Type1 fonts - if( 0 != (rMetric.ntmFlags & NTM_TYPE1 ) ) + if( 0 != (rMetric.ntmFlags & (NTM_TT_OPENTYPE | NTM_PS_OPENTYPE)) + || 0 != (rMetric.tmPitchAndFamily & TMPF_TRUETYPE)) + aDFA.mbSubsettable = true; + else if( 0 != (rMetric.ntmFlags & NTM_TYPE1) ) // TODO: implement subsetting for type1 too aDFA.mbEmbeddable = true; // heuristics for font quality @@ -566,7 +566,7 @@ static ImplDevFontAttributes WinFont2DevFontAttributes( const ENUMLOGFONTEXA& rE aDFA.mnQuality = 0; if( rMetric.tmPitchAndFamily & TMPF_TRUETYPE ) aDFA.mnQuality += 50; - if( rMetric.ntmFlags & NTM_TT_OPENTYPE ) + if( 0 != (rMetric.ntmFlags & (NTM_TT_OPENTYPE | NTM_PS_OPENTYPE)) ) aDFA.mnQuality += 10; if( aDFA.mbSubsettable ) aDFA.mnQuality += 200; @@ -633,13 +633,10 @@ static ImplDevFontAttributes WinFont2DevFontAttributes( const ENUMLOGFONTEXW& rE aDFA.mbEmbeddable = false; aDFA.mbSubsettable = false; - if( (rMetric.tmPitchAndFamily & TMPF_TRUETYPE) != 0 ) - if( (rMetric.tmPitchAndFamily & TMPF_DEVICE) == 0 ) - // TODO: implement type1 or CFF subsetting - if( 0 == (rMetric.ntmFlags & (NTM_PS_OPENTYPE | NTM_TYPE1) ) ) - aDFA.mbSubsettable = true; - // for now we can only embed Type1 fonts - if( rMetric.ntmFlags & NTM_TYPE1 ) + if( 0 != (rMetric.ntmFlags & (NTM_TT_OPENTYPE | NTM_PS_OPENTYPE)) + || 0 != (rMetric.tmPitchAndFamily & TMPF_TRUETYPE)) + aDFA.mbSubsettable = true; + else if( 0 != (rMetric.ntmFlags & NTM_TYPE1) ) // TODO: implement subsetting for type1 too aDFA.mbEmbeddable = true; // heuristics for font quality @@ -648,7 +645,7 @@ static ImplDevFontAttributes WinFont2DevFontAttributes( const ENUMLOGFONTEXW& rE aDFA.mnQuality = 0; if( rMetric.tmPitchAndFamily & TMPF_TRUETYPE ) aDFA.mnQuality += 50; - if( rMetric.ntmFlags & NTM_TT_OPENTYPE ) + if( 0 != (rMetric.ntmFlags & (NTM_TT_OPENTYPE | NTM_PS_OPENTYPE)) ) aDFA.mnQuality += 10; if( aDFA.mbSubsettable ) aDFA.mnQuality += 200; @@ -807,6 +804,9 @@ ImplWinFontData::ImplWinFontData( const ImplDevFontAttributes& rDFS, mbDisableGlyphApi( false ), mbHasKoreanRange( false ), mbHasCJKSupport( false ), +#ifdef ENABLE_GRAPHITE + mbHasGraphiteSupport( false ), +#endif mbHasArabicSupport ( false ), mbAliasSymbolsLow( false ), mbAliasSymbolsHigh( false ), @@ -865,6 +865,13 @@ void ImplWinFontData::UpdateFromHDC( HDC hDC ) const ReadCmapTable( hDC ); ReadOs2Table( hDC ); +#ifdef ENABLE_GRAPHITE + static const char* pDisableGraphiteText = getenv( "SAL_DISABLE_GRAPHITE" ); + if( !pDisableGraphiteText || (pDisableGraphiteText[0] == '0') ) + { + mbHasGraphiteSupport = gr::WinFont::FontHasGraphiteTables(hDC); + } +#endif // even if the font works some fonts have problems with the glyph API // => the heuristic below tries to figure out which fonts have the problem @@ -993,27 +1000,25 @@ void ImplWinFontData::ReadGsubTable( HDC hDC ) const void ImplWinFontData::ReadCmapTable( HDC hDC ) const { - CmapResult aResult; - aResult.mnPairCount = 0; - aResult.mpPairCodes = NULL; - aResult.mpStartGlyphs = NULL; - aResult.mbSymbolic = (meWinCharSet == SYMBOL_CHARSET); - aResult.mbRecoded = true; + if( mpUnicodeMap != NULL ) + return; + bool bIsSymbolFont = (meWinCharSet == SYMBOL_CHARSET); // get the CMAP table from the font which is selected into the DC const DWORD nCmapTag = CalcTag( "cmap" ); const RawFontData aRawFontData( hDC, nCmapTag ); // parse the CMAP table if available - if( aRawFontData.get() ) + if( aRawFontData.get() ) { + CmapResult aResult; ParseCMAP( aRawFontData.get(), aRawFontData.size(), aResult ); + mbDisableGlyphApi |= aResult.mbRecoded; + aResult.mbSymbolic = bIsSymbolFont; + if( aResult.mnRangeCount > 0 ) + mpUnicodeMap = new ImplFontCharMap( aResult ); + } - mbDisableGlyphApi |= aResult.mbRecoded; - - if( aResult.mnPairCount > 0 ) - mpUnicodeMap = new ImplFontCharMap( aResult.mnPairCount, - aResult.mpPairCodes, aResult.mpStartGlyphs ); - else - mpUnicodeMap = ImplFontCharMap::GetDefaultMap(); + if( !mpUnicodeMap ) + mpUnicodeMap = ImplFontCharMap::GetDefaultMap( bIsSymbolFont ); } // ======================================================================= @@ -2157,7 +2162,7 @@ void WinSalGraphics::GetDevFontList( ImplDevFontList* pFontList ) ::rtl::OUString aExecutableFile( aPath ); aPath = aPath.copy( 0, aPath.lastIndexOf('/') ); String aFontDirUrl = aPath.copy( 0, aPath.lastIndexOf('/') ); - aFontDirUrl += String( RTL_CONSTASCII_USTRINGPARAM("/share/fonts/truetype") ); + aFontDirUrl += String( RTL_CONSTASCII_USTRINGPARAM("/Basis/share/fonts/truetype") ); // collect fonts in font path that could not be registered osl::Directory aFontDir( aFontDirUrl ); @@ -2547,6 +2552,8 @@ BOOL WinSalGraphics::CreateFontSubset( const rtl::OUString& rToFile, const ImplFontData* pFont, long* pGlyphIDs, sal_uInt8* pEncoding, sal_Int32* pGlyphWidths, int nGlyphCount, FontSubsetInfo& rInfo ) { + // TODO: use more of the central font-subsetting code, move stuff there if needed + // create matching ImplFontSelectData // we need just enough to get to the font file data // use height=1000 for easier debugging (to match psprint's font units) @@ -2554,10 +2561,14 @@ BOOL WinSalGraphics::CreateFontSubset( const rtl::OUString& rToFile, // TODO: much better solution: move SetFont and restoration of old font to caller ScopedFont aOldFont(*this); - float fScale = 0.0; + float fScale = 1.0; HFONT hOldFont = 0; ImplDoSetFont( &aIFSD, fScale, hOldFont ); + ImplWinFontData* pWinFontData = (ImplWinFontData*)aIFSD.mpFontData; + pWinFontData->UpdateFromHDC( mhDC ); +/*const*/ ImplFontCharMap* pImplFontCharMap = pWinFontData->GetImplFontCharMap(); + #if OSL_DEBUG_LEVEL > 1 // get font metrics TEXTMETRICA aWinMetric; @@ -2568,8 +2579,42 @@ BOOL WinSalGraphics::CreateFontSubset( const rtl::OUString& rToFile, DBG_ASSERT( aWinMetric.tmPitchAndFamily & TMPF_TRUETYPE, "can only subset TT font" ); #endif + rtl::OUString aSysPath; + if( osl_File_E_None != osl_getSystemPathFromFileURL( rToFile.pData, &aSysPath.pData ) ) + return FALSE; + const rtl_TextEncoding aThreadEncoding = osl_getThreadTextEncoding(); + const ByteString aToFile( aSysPath.getStr(), (xub_StrLen)aSysPath.getLength(), aThreadEncoding ); + + // check if the font has a CFF-table + const DWORD nCffTag = CalcTag( "CFF " ); + const RawFontData aRawCffData( mhDC, nCffTag ); + if( aRawCffData.get() ) + { + long nRealGlyphIds[ 256 ]; + for( int i = 0; i < nGlyphCount; ++i ) + { + // TODO: remap notdef glyph if needed + // TODO: use GDI's GetGlyphIndices instead? Does it handle GSUB properly? + sal_uInt32 nGlyphIdx = pGlyphIDs[i] & GF_IDXMASK; + if( pGlyphIDs[i] & GF_ISCHAR ) // remaining pseudo-glyphs need to be translated + nGlyphIdx = pImplFontCharMap->GetGlyphIndex( nGlyphIdx ); + if( (pGlyphIDs[i] & (GF_ROTMASK|GF_GSUB)) != 0) // TODO: vertical substitution + {/*####*/} + + nRealGlyphIds[i] = nGlyphIdx; + } + + // provide a font subset from the CFF-table + FILE* pOutFile = fopen( aToFile.GetBuffer(), "wb" ); + rInfo.LoadFont( FontSubsetInfo::CFF_FONT, aRawCffData.get(), aRawCffData.size() ); + bool bRC = rInfo.CreateFontSubset( FontSubsetInfo::TYPE1_PFB, pOutFile, NULL, + nRealGlyphIds, pEncoding, nGlyphCount, pGlyphWidths ); + fclose( pOutFile ); + return bRC; + } + // get raw font file data - const RawFontData xRawFontData( mhDC ); + const RawFontData xRawFontData( mhDC, NULL ); if( !xRawFontData.get() ) return FALSE; @@ -2585,7 +2630,7 @@ BOOL WinSalGraphics::CreateFontSubset( const rtl::OUString& rToFile, TTGlobalFontInfo aTTInfo; ::GetTTGlobalFontInfo( aSftTTF.get(), &aTTInfo ); - rInfo.m_nFontType = SAL_FONTSUBSETINFO_TYPE_TRUETYPE; + rInfo.m_nFontType = FontSubsetInfo::SFNT_TTF; rInfo.m_aPSName = ImplSalGetUniString( aTTInfo.psname ); rInfo.m_nAscent = +aTTInfo.winAscent; rInfo.m_nDescent = -aTTInfo.winDescent; @@ -2593,7 +2638,7 @@ BOOL WinSalGraphics::CreateFontSubset( const rtl::OUString& rToFile, Point( aTTInfo.xMax, aTTInfo.yMax ) ); rInfo.m_nCapHeight = aTTInfo.yMax; // Well ... - // subset glyphs and get their properties + // subset TTF-glyphs and get their properties // take care that subset fonts require the NotDef glyph in pos 0 int nOrigCount = nGlyphCount; USHORT aShortIDs[ 256 ]; @@ -2649,11 +2694,6 @@ BOOL WinSalGraphics::CreateFontSubset( const rtl::OUString& rToFile, free( pMetrics ); // write subset into destination file - rtl::OUString aSysPath; - if( osl_File_E_None != osl_getSystemPathFromFileURL( rToFile.pData, &aSysPath.pData ) ) - return FALSE; - rtl_TextEncoding aThreadEncoding = osl_getThreadTextEncoding(); - ByteString aToFile( rtl::OUStringToOString( aSysPath, aThreadEncoding ) ); nRC = ::CreateTTFromTTGlyphs( aSftTTF.get(), aToFile.GetBuffer(), aShortIDs, aTempEncs, nGlyphCount, 0, NULL, 0 ); return (nRC == SF_OK); @@ -2683,7 +2723,8 @@ const void* WinSalGraphics::GetEmbedFontData( const ImplFontData* pFont, TEXTMETRICA aTm; if( !::GetTextMetricsA( mhDC, &aTm ) ) *pDataLen = 0; - rInfo.m_nFontType = SAL_FONTSUBSETINFO_TYPE_TYPE1; + const bool bPFA = (*aRawFontData.get() < 0x80); + rInfo.m_nFontType = bPFA ? FontSubsetInfo::TYPE1_PFA : FontSubsetInfo::TYPE1_PFB; WCHAR aFaceName[64]; int nFNLen = ::GetTextFaceW( mhDC, 64, aFaceName ); // #i59854# strip eventual null byte @@ -2876,3 +2917,4 @@ SystemFontData WinSalGraphics::GetSysFontData( int nFallbacklevel ) const } //-------------------------------------------------------------------------- + diff --git a/vcl/win/source/gdi/salgdi_gdiplus.cxx b/vcl/win/source/gdi/salgdi_gdiplus.cxx index 8709fc872540..5c00c786e22d 100644 --- a/vcl/win/source/gdi/salgdi_gdiplus.cxx +++ b/vcl/win/source/gdi/salgdi_gdiplus.cxx @@ -64,75 +64,79 @@ void impAddB2DPolygonToGDIPlusGraphicsPath(Gdiplus::GraphicsPath& rPath, const basegfx::B2DPolygon& rPolygon) { - const sal_uInt32 nCount(rPolygon.count()); - - if(nCount) - { - const sal_uInt32 nEdgeCount(rPolygon.isClosed() ? nCount : nCount - 1); - const bool bControls(rPolygon.areControlPointsUsed()); - basegfx::B2DPoint aCurr(rPolygon.getB2DPoint(0)); - Gdiplus::PointF aFCurr(Gdiplus::REAL(aCurr.getX()), Gdiplus::REAL(aCurr.getY())); - - for(sal_uInt32 a(0); a < nEdgeCount; a++) - { - const sal_uInt32 nNextIndex((a + 1) % nCount); - const basegfx::B2DPoint aNext(rPolygon.getB2DPoint(nNextIndex)); - const Gdiplus::PointF aFNext(Gdiplus::REAL(aNext.getX()), Gdiplus::REAL(aNext.getY())); - - if(bControls && (rPolygon.isNextControlPointUsed(a) || rPolygon.isPrevControlPointUsed(nNextIndex))) - { - const basegfx::B2DPoint aCa(rPolygon.getNextControlPoint(a)); - const basegfx::B2DPoint aCb(rPolygon.getPrevControlPoint(nNextIndex)); - - rPath.AddBezier( - aFCurr, - Gdiplus::PointF(Gdiplus::REAL(aCa.getX()), Gdiplus::REAL(aCa.getY())), - Gdiplus::PointF(Gdiplus::REAL(aCb.getX()), Gdiplus::REAL(aCb.getY())), - aFNext); - } - else - { - rPath.AddLine(aFCurr, aFNext); - } - - if(a + 1 < nEdgeCount) - { - aCurr = aNext; - aFCurr = aFNext; - } - } - } + const sal_uInt32 nCount(rPolygon.count()); + + if(nCount) + { + const sal_uInt32 nEdgeCount(rPolygon.isClosed() ? nCount : nCount - 1); + const bool bControls(rPolygon.areControlPointsUsed()); + basegfx::B2DPoint aCurr(rPolygon.getB2DPoint(0)); + Gdiplus::PointF aFCurr(Gdiplus::REAL(aCurr.getX()), Gdiplus::REAL(aCurr.getY())); + + for(sal_uInt32 a(0); a < nEdgeCount; a++) + { + const sal_uInt32 nNextIndex((a + 1) % nCount); + const basegfx::B2DPoint aNext(rPolygon.getB2DPoint(nNextIndex)); + const Gdiplus::PointF aFNext(Gdiplus::REAL(aNext.getX()), Gdiplus::REAL(aNext.getY())); + + if(bControls && (rPolygon.isNextControlPointUsed(a) || rPolygon.isPrevControlPointUsed(nNextIndex))) + { + const basegfx::B2DPoint aCa(rPolygon.getNextControlPoint(a)); + const basegfx::B2DPoint aCb(rPolygon.getPrevControlPoint(nNextIndex)); + + rPath.AddBezier( + aFCurr, + Gdiplus::PointF(Gdiplus::REAL(aCa.getX()), Gdiplus::REAL(aCa.getY())), + Gdiplus::PointF(Gdiplus::REAL(aCb.getX()), Gdiplus::REAL(aCb.getY())), + aFNext); + } + else + { + rPath.AddLine(aFCurr, aFNext); + } + + if(a + 1 < nEdgeCount) + { + aCurr = aNext; + aFCurr = aFNext; + } + } + } } bool WinSalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPolygon, double fTransparency) { - const sal_uInt32 nCount(rPolyPolygon.count()); + const sal_uInt32 nCount(rPolyPolygon.count()); if(mbBrush && nCount && (fTransparency >= 0.0 && fTransparency < 1.0)) { - Gdiplus::Graphics aGraphics(mhDC); + Gdiplus::Graphics aGraphics(mhDC); const sal_uInt8 aTrans((sal_uInt8)255 - (sal_uInt8)basegfx::fround(fTransparency * 255.0)); - Gdiplus::Color aTestColor(aTrans, SALCOLOR_RED(maFillColor), SALCOLOR_GREEN(maFillColor), SALCOLOR_BLUE(maFillColor)); - Gdiplus::SolidBrush aTestBrush(aTestColor); - Gdiplus::GraphicsPath aPath; + Gdiplus::Color aTestColor(aTrans, SALCOLOR_RED(maFillColor), SALCOLOR_GREEN(maFillColor), SALCOLOR_BLUE(maFillColor)); + Gdiplus::SolidBrush aTestBrush(aTestColor); + Gdiplus::GraphicsPath aPath; for(sal_uInt32 a(0); a < nCount; a++) { - aPath.StartFigure(); + if(0 != a) + { + aPath.StartFigure(); // #i101491# not needed for first run + } + impAddB2DPolygonToGDIPlusGraphicsPath(aPath, rPolyPolygon.getB2DPolygon(a)); aPath.CloseFigure(); } if(getAntiAliasB2DDraw()) { - aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); - } - else - { - aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeNone); - } - - aGraphics.FillPath(&aTestBrush, &aPath); + aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); + } + else + { + aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeNone); + } + + aGraphics.FillPath(&aTestBrush, &aPath); } return true; @@ -140,53 +144,59 @@ bool WinSalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPoly bool WinSalGraphics::drawPolyLine(const basegfx::B2DPolygon& rPolygon, const basegfx::B2DVector& rLineWidths, basegfx::B2DLineJoin eLineJoin) { - const sal_uInt32 nCount(rPolygon.count()); + const sal_uInt32 nCount(rPolygon.count()); if(mbPen && nCount) { - Gdiplus::Graphics aGraphics(mhDC); - Gdiplus::Color aTestColor(255, SALCOLOR_RED(maLineColor), SALCOLOR_GREEN(maLineColor), SALCOLOR_BLUE(maLineColor)); - Gdiplus::Pen aTestPen(aTestColor, Gdiplus::REAL(rLineWidths.getX())); - Gdiplus::GraphicsPath aPath; - - switch(eLineJoin) - { + Gdiplus::Graphics aGraphics(mhDC); + Gdiplus::Color aTestColor(255, SALCOLOR_RED(maLineColor), SALCOLOR_GREEN(maLineColor), SALCOLOR_BLUE(maLineColor)); + Gdiplus::Pen aTestPen(aTestColor, Gdiplus::REAL(rLineWidths.getX())); + Gdiplus::GraphicsPath aPath; + + switch(eLineJoin) + { default : // basegfx::B2DLINEJOIN_NONE : { break; } case basegfx::B2DLINEJOIN_BEVEL : { - aTestPen.SetLineJoin(Gdiplus::LineJoinBevel); + aTestPen.SetLineJoin(Gdiplus::LineJoinBevel); break; } case basegfx::B2DLINEJOIN_MIDDLE : case basegfx::B2DLINEJOIN_MITER : { const Gdiplus::REAL aMiterLimit(15.0); - aTestPen.SetMiterLimit(aMiterLimit); - aTestPen.SetLineJoin(Gdiplus::LineJoinMiter); + aTestPen.SetMiterLimit(aMiterLimit); + aTestPen.SetLineJoin(Gdiplus::LineJoinMiter); break; } case basegfx::B2DLINEJOIN_ROUND : { - aTestPen.SetLineJoin(Gdiplus::LineJoinRound); + aTestPen.SetLineJoin(Gdiplus::LineJoinRound); break; } - } + } impAddB2DPolygonToGDIPlusGraphicsPath(aPath, rPolygon); - - if(getAntiAliasB2DDraw()) - { - aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); - } - else - { - aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeNone); - } - - aGraphics.DrawPath(&aTestPen, &aPath); + + if(rPolygon.isClosed()) + { + // #i101491# needed to create the correct line joins + aPath.CloseFigure(); + } + + if(getAntiAliasB2DDraw()) + { + aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); + } + else + { + aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeNone); + } + + aGraphics.DrawPath(&aTestPen, &aPath); } return true; diff --git a/vcl/win/source/gdi/salprn.cxx b/vcl/win/source/gdi/salprn.cxx index cc359da97cd9..ecf91aea7c1b 100644 --- a/vcl/win/source/gdi/salprn.cxx +++ b/vcl/win/source/gdi/salprn.cxx @@ -894,6 +894,24 @@ static void ImplDevModeToJobSetup( WinSalInfoPrinter* pPrinter, ImplJobSetup* pS } switch( CHOOSE_DEVMODE(dmPaperSize) ) { + case( DMPAPER_LETTER ): + pSetupData->mePaperFormat = PAPER_LETTER; + break; + case( DMPAPER_TABLOID ): + pSetupData->mePaperFormat = PAPER_TABLOID; + break; + case( DMPAPER_LEDGER ): + pSetupData->mePaperFormat = PAPER_LEDGER; + break; + case( DMPAPER_LEGAL ): + pSetupData->mePaperFormat = PAPER_LEGAL; + break; + case( DMPAPER_STATEMENT ): + pSetupData->mePaperFormat = PAPER_STATEMENT; + break; + case( DMPAPER_EXECUTIVE ): + pSetupData->mePaperFormat = PAPER_EXECUTIVE; + break; case( DMPAPER_A3 ): pSetupData->mePaperFormat = PAPER_A3; break; @@ -903,20 +921,138 @@ static void ImplDevModeToJobSetup( WinSalInfoPrinter* pPrinter, ImplJobSetup* pS case( DMPAPER_A5 ): pSetupData->mePaperFormat = PAPER_A5; break; + //See http://wiki.services.openoffice.org/wiki/DefaultPaperSize + //i.e. + //http://msdn.microsoft.com/en-us/library/dd319099(VS.85).aspx + //DMPAPER_B4 12 B4 (JIS) 257 x 364 mm + //http://partners.adobe.com/public/developer/en/ps/5003.PPD_Spec_v4.3.pdf + //also says that the MS DMPAPER_B4 is JIS, which makes most sense. And + //matches our Excel filter's belief about the matching XlPaperSize + //enumeration. + // + //http://msdn.microsoft.com/en-us/library/ms776398(VS.85).aspx said + ////"DMPAPER_B4 12 B4 (JIS) 250 x 354" + //which is bogus as it's either JIS 257 × 364 or ISO 250 × 353 + //(cmc) case( DMPAPER_B4 ): - pSetupData->mePaperFormat = PAPER_B4; + pSetupData->mePaperFormat = PAPER_B4_JIS; break; case( DMPAPER_B5 ): - pSetupData->mePaperFormat = PAPER_B5; + pSetupData->mePaperFormat = PAPER_B5_JIS; break; - case( DMPAPER_LETTER ): + case( DMPAPER_QUARTO ): + pSetupData->mePaperFormat = PAPER_QUARTO; + break; + case( DMPAPER_10X14 ): + pSetupData->mePaperFormat = PAPER_10x14; + break; + case( DMPAPER_NOTE ): pSetupData->mePaperFormat = PAPER_LETTER; break; - case( DMPAPER_LEGAL ): - pSetupData->mePaperFormat = PAPER_LEGAL; + case( DMPAPER_ENV_9 ): + pSetupData->mePaperFormat = PAPER_ENV_9; break; - case( DMPAPER_TABLOID ): - pSetupData->mePaperFormat = PAPER_TABLOID; + case( DMPAPER_ENV_10 ): + pSetupData->mePaperFormat = PAPER_ENV_10; + break; + case( DMPAPER_ENV_11 ): + pSetupData->mePaperFormat = PAPER_ENV_11; + break; + case( DMPAPER_ENV_12 ): + pSetupData->mePaperFormat = PAPER_ENV_12; + break; + case( DMPAPER_ENV_14 ): + pSetupData->mePaperFormat = PAPER_ENV_14; + break; + case( DMPAPER_CSHEET ): + pSetupData->mePaperFormat = PAPER_C; + break; + case( DMPAPER_DSHEET ): + pSetupData->mePaperFormat = PAPER_D; + break; + case( DMPAPER_ESHEET ): + pSetupData->mePaperFormat = PAPER_E; + break; + case( DMPAPER_ENV_DL): + pSetupData->mePaperFormat = PAPER_ENV_DL; + break; + case( DMPAPER_ENV_C5): + pSetupData->mePaperFormat = PAPER_ENV_C5; + break; + case( DMPAPER_ENV_C3): + pSetupData->mePaperFormat = PAPER_ENV_C3; + break; + case( DMPAPER_ENV_C4): + pSetupData->mePaperFormat = PAPER_ENV_C4; + break; + case( DMPAPER_ENV_C6): + pSetupData->mePaperFormat = PAPER_ENV_C6; + break; + case( DMPAPER_ENV_C65): + pSetupData->mePaperFormat = PAPER_ENV_C65; + break; + case( DMPAPER_ENV_ITALY ): + pSetupData->mePaperFormat = PAPER_ENV_ITALY; + break; + case( DMPAPER_ENV_MONARCH ): + pSetupData->mePaperFormat = PAPER_ENV_MONARCH; + break; + case( DMPAPER_ENV_PERSONAL ): + pSetupData->mePaperFormat = PAPER_ENV_PERSONAL; + break; + case( DMPAPER_FANFOLD_US ): + pSetupData->mePaperFormat = PAPER_FANFOLD_US; + break; + case( DMPAPER_FANFOLD_STD_GERMAN ): + pSetupData->mePaperFormat = PAPER_FANFOLD_DE; + break; + case( DMPAPER_FANFOLD_LGL_GERMAN ): + pSetupData->mePaperFormat = PAPER_FANFOLD_LEGAL_DE; + break; + case( DMPAPER_ISO_B4 ): + pSetupData->mePaperFormat = PAPER_B4_ISO; + break; + case( DMPAPER_JAPANESE_POSTCARD ): + pSetupData->mePaperFormat = PAPER_POSTCARD_JP; + break; + case( DMPAPER_9X11 ): + pSetupData->mePaperFormat = PAPER_9x11; + break; + case( DMPAPER_10X11 ): + pSetupData->mePaperFormat = PAPER_10x11; + break; + case( DMPAPER_15X11 ): + pSetupData->mePaperFormat = PAPER_15x11; + break; + case( DMPAPER_ENV_INVITE ): + pSetupData->mePaperFormat = PAPER_ENV_INVITE; + break; + case( DMPAPER_A_PLUS ): + pSetupData->mePaperFormat = PAPER_A_PLUS; + break; + case( DMPAPER_B_PLUS ): + pSetupData->mePaperFormat = PAPER_B_PLUS; + break; + case( DMPAPER_LETTER_PLUS ): + pSetupData->mePaperFormat = PAPER_LETTER_PLUS; + break; + case( DMPAPER_A4_PLUS ): + pSetupData->mePaperFormat = PAPER_A4_PLUS; + break; + case( DMPAPER_A2 ): + pSetupData->mePaperFormat = PAPER_A2; + break; + case( DMPAPER_DBL_JAPANESE_POSTCARD ): + pSetupData->mePaperFormat = PAPER_DOUBLEPOSTCARD_JP; + break; + case( DMPAPER_A6 ): + pSetupData->mePaperFormat = PAPER_A6; + break; + case( DMPAPER_B6_JIS ): + pSetupData->mePaperFormat = PAPER_B6_JIS; + break; + case( DMPAPER_12X11 ): + pSetupData->mePaperFormat = PAPER_12x11; break; default: pSetupData->mePaperFormat = PAPER_USER; @@ -927,17 +1063,6 @@ static void ImplDevModeToJobSetup( WinSalInfoPrinter* pPrinter, ImplJobSetup* pS // ----------------------------------------------------------------------- -static BOOL ImplPaperSizeEqual( short nPaperWidth1, short nPaperHeight1, - short nPaperWidth2, short nPaperHeight2 ) -{ - const short PAPER_SLOPPY = 1; // 0.1 mm accuracy - - return ( (Abs( nPaperWidth1-nPaperWidth2 ) <= PAPER_SLOPPY) && - (Abs( nPaperHeight1-nPaperHeight2 ) <= PAPER_SLOPPY) ); -} - -// ----------------------------------------------------------------------- - static void ImplJobSetupToDevMode( WinSalInfoPrinter* pPrinter, ImplJobSetup* pSetupData, ULONG nFlags ) { if ( !pSetupData || !pSetupData->mpDriverData ) @@ -979,6 +1104,9 @@ static void ImplJobSetupToDevMode( WinSalInfoPrinter* pPrinter, ImplJobSetup* pS switch( pSetupData->mePaperFormat ) { + case( PAPER_A2 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_A2; + break; case( PAPER_A3 ): CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_A3; break; @@ -988,11 +1116,8 @@ static void ImplJobSetupToDevMode( WinSalInfoPrinter* pPrinter, ImplJobSetup* pS case( PAPER_A5 ): CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_A5; break; - case( PAPER_B4 ): - CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_B4; - break; - case( PAPER_B5 ): - CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_B5; + case( PAPER_B4_ISO): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ISO_B4; break; case( PAPER_LETTER ): CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_LETTER; @@ -1003,6 +1128,136 @@ static void ImplJobSetupToDevMode( WinSalInfoPrinter* pPrinter, ImplJobSetup* pS case( PAPER_TABLOID ): CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_TABLOID; break; +#if 0 + //http://msdn.microsoft.com/en-us/library/ms776398(VS.85).aspx + //DMPAPER_ENV_B6 is documented as: + //"DMPAPER_ENV_B6 35 Envelope B6 176 x 125 mm" + //which is the wrong way around, it is surely 125 x 176, i.e. + //compare DMPAPER_ENV_B4 and DMPAPER_ENV_B4 as + //DMPAPER_ENV_B4 33 Envelope B4 250 x 353 mm + //DMPAPER_ENV_B5 34 Envelope B5 176 x 250 mm + case( PAPER_B6_ISO ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_B6; + break; +#endif + case( PAPER_ENV_C4 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_C4; + break; + case( PAPER_ENV_C5 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_C5; + break; + case( PAPER_ENV_C6 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_C6; + break; + case( PAPER_ENV_C65 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_C65; + break; + case( PAPER_ENV_DL ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_DL; + break; + case( PAPER_C ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_CSHEET; + break; + case( PAPER_D ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_DSHEET; + break; + case( PAPER_E ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ESHEET; + break; + case( PAPER_EXECUTIVE ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_EXECUTIVE; + break; + case( PAPER_FANFOLD_LEGAL_DE ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_FANFOLD_LGL_GERMAN; + break; + case( PAPER_ENV_MONARCH ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_MONARCH; + break; + case( PAPER_ENV_PERSONAL ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_PERSONAL; + break; + case( PAPER_ENV_9 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_9; + break; + case( PAPER_ENV_10 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_10; + break; + case( PAPER_ENV_11 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_11; + break; + case( PAPER_ENV_12 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_12; + break; + //See the comments on DMPAPER_B4 above + case( PAPER_B4_JIS ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_B4; + break; + case( PAPER_B5_JIS ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_B5; + break; + case( PAPER_B6_JIS ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_B6_JIS; + break; + case( PAPER_LEDGER ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_LEDGER; + break; + case( PAPER_STATEMENT ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_STATEMENT; + break; + case( PAPER_10x14 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_10X14; + break; + case( PAPER_ENV_14 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_14; + break; + case( PAPER_ENV_C3 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_C3; + break; + case( PAPER_ENV_ITALY ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_ITALY; + break; + case( PAPER_FANFOLD_US ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_FANFOLD_US; + break; + case( PAPER_FANFOLD_DE ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_FANFOLD_STD_GERMAN; + break; + case( PAPER_POSTCARD_JP ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_JAPANESE_POSTCARD; + break; + case( PAPER_9x11 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_9X11; + break; + case( PAPER_10x11 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_10X11; + break; + case( PAPER_15x11 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_15X11; + break; + case( PAPER_ENV_INVITE ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_ENV_INVITE; + break; + case( PAPER_A_PLUS ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_A_PLUS; + break; + case( PAPER_B_PLUS ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_B_PLUS; + break; + case( PAPER_LETTER_PLUS ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_LETTER_PLUS; + break; + case( PAPER_A4_PLUS ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_A4_PLUS; + break; + case( PAPER_DOUBLEPOSTCARD_JP ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_DBL_JAPANESE_POSTCARD; + break; + case( PAPER_A6 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_A6; + break; + case( PAPER_12x11 ): + CHOOSE_DEVMODE(dmPaperSize) = DMPAPER_12X11; + break; default: { short nPaper = 0; @@ -1023,13 +1278,11 @@ static void ImplJobSetupToDevMode( WinSalInfoPrinter* pPrinter, ImplJobSetup* pS } if ( (nPaperSizeCount == nPaperCount) && pPapers && pPaperSizes ) { + PaperInfo aInfo(pSetupData->mnPaperWidth, pSetupData->mnPaperHeight); // compare paper formats and select a good match for ( ULONG i = 0; i < nPaperCount; i++ ) { - if ( ImplPaperSizeEqual( (short)(pSetupData->mnPaperWidth/10), - (short)(pSetupData->mnPaperHeight/10), - (short)pPaperSizes[i].x, - (short)pPaperSizes[i].y ) ) + if ( aInfo.sloppyEqual(PaperInfo(pPaperSizes[i].x*10, pPaperSizes[i].y*10))) { nPaper = pPapers[i]; break; @@ -1041,12 +1294,10 @@ static void ImplJobSetupToDevMode( WinSalInfoPrinter* pPrinter, ImplJobSetup* pS // all paper sizes with portrait orientation only!! if ( !nPaper && nLandscapeAngle != 0 ) { + PaperInfo aRotatedInfo(pSetupData->mnPaperHeight, pSetupData->mnPaperWidth); for ( ULONG i = 0; i < nPaperCount; i++ ) { - if ( ImplPaperSizeEqual( (short)(pSetupData->mnPaperWidth/10), - (short)(pSetupData->mnPaperHeight/10), - (short)pPaperSizes[i].y, - (short)pPaperSizes[i].x ) ) + if ( aRotatedInfo.sloppyEqual(PaperInfo(pPaperSizes[i].x*10, pPaperSizes[i].y*10)) ) { nPaper = pPapers[i]; break; @@ -1284,11 +1535,7 @@ void WinSalInfoPrinter::InitPaperFormats( const ImplJobSetup* pSetupData ) ImplDeviceCaps( this, DC_PAPERNAMES, (BYTE*)pNamesBuffer, pSetupData ); for( DWORD i = 0; i < nCount; ++i ) { - vcl::PaperInfo aInfo; - aInfo.m_nPaperWidth = (pPaperSizes[i].x + 5) / 10; - aInfo.m_nPaperHeight = (pPaperSizes[i].y + 5) / 10; - pNamesBuffer[(i+1)*64-1] = '\0'; // make very long names zero terminated - aInfo.m_aPaperName = pNamesBuffer + (i*64); + PaperInfo aInfo(pPaperSizes[i].x * 10, pPaperSizes[i].y * 10); m_aPaperFormats.push_back( aInfo ); } rtl_freeMemory( pNamesBuffer ); @@ -1299,11 +1546,7 @@ void WinSalInfoPrinter::InitPaperFormats( const ImplJobSetup* pSetupData ) ImplDeviceCaps( this, DC_PAPERNAMES, (BYTE*)pNamesBuffer, pSetupData ); for( DWORD i = 0; i < nCount; ++i ) { - vcl::PaperInfo aInfo; - aInfo.m_nPaperWidth = (pPaperSizes[i].x + 5) / 10; - aInfo.m_nPaperHeight = (pPaperSizes[i].y + 5) / 10; - pNamesBuffer[(i+1)*64-1] = '\0'; // make very long names zero terminated - aInfo.m_aPaperName = ImplSalGetUniString( (const char*)(pNamesBuffer + (i*64)) ); + PaperInfo aInfo(pPaperSizes[i].x * 10, pPaperSizes[i].y * 10); m_aPaperFormats.push_back( aInfo ); } rtl_freeMemory( pNamesBuffer ); diff --git a/vcl/win/source/gdi/winlayout.cxx b/vcl/win/source/gdi/winlayout.cxx index 8d9347e7e352..bf56b2a1082b 100755 --- a/vcl/win/source/gdi/winlayout.cxx +++ b/vcl/win/source/gdi/winlayout.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: winlayout.cxx,v $ - * $Revision: 1.113.6.9 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -71,6 +68,17 @@ typedef std::hash_map IntMap; typedef std::set IntSet; +// Graphite headers +#ifdef ENABLE_GRAPHITE +#include +#include +#include +#include +#include +#include +#include +#endif + #define DROPPED_OUTGLYPH 0xFFFF using namespace rtl; @@ -1374,7 +1382,7 @@ bool UniscribeLayout::LayoutText( ImplLayoutArgs& rArgs ) mpScriptItems = NULL; if( nRC != E_OUTOFMEMORY ) return false; - if( nItemCapacity > (nSubStringEnd - mnSubStringMin) ) + if( nItemCapacity > (nSubStringEnd - mnSubStringMin) + 16 ) return false; } @@ -1757,6 +1765,8 @@ bool UniscribeLayout::GetItemSubrange( const VisualItem& rVisualItem, if( nMaxGlyphPos < n ) nMaxGlyphPos = n; } + if (nMaxGlyphPos > rVisualItem.mnEndGlyphPos) + nMaxGlyphPos = rVisualItem.mnEndGlyphPos - 1; // extend the glyph range to account for all glyphs in referenced clusters if( !rVisualItem.IsRTL() ) // LTR-item @@ -1907,7 +1917,7 @@ int UniscribeLayout::GetNextGlyphs( int nLen, sal_GlyphId* pGlyphs, Point& rPos, // calculate the absolute position of the first result glyph in pixel units const GOFFSET aGOffset = mpGlyphOffsets[ nStart ]; - Point aRelativePos( nXOffset + aGOffset.du, aGOffset.dv ); + Point aRelativePos( nXOffset + aGOffset.du, -aGOffset.dv ); rPos = GetDrawPosition( aRelativePos ); // fill the result arrays @@ -2041,11 +2051,25 @@ void UniscribeLayout::MoveGlyph( int nStartx8, long nNewXPos ) long nDelta = nNewXPos - pVI->mnXOffset; if( nStart > nMinGlyphPos ) { - // move the glyph by expanding its left glyph - int i; + // move the glyph by expanding its left glyph but ignore dropped glyphs + int i, nLastUndropped = nMinGlyphPos - 1; for( i = nMinGlyphPos; i < nStart; ++i ) - nDelta -= mpGlyphAdvances[ i ]; - mpGlyphAdvances[ i-1 ] += nDelta; + { + if (mpOutGlyphs[i] != DROPPED_OUTGLYPH) + { + nDelta -= (mpJustifications)? mpJustifications[ i ] : mpGlyphAdvances[ i ]; + nLastUndropped = i; + } + } + if (nLastUndropped >= nMinGlyphPos) + { + mpGlyphAdvances[ nLastUndropped ] += nDelta; + if (mpJustifications) mpJustifications[ nLastUndropped ] += nDelta; + } + else + { + pVI->mnXOffset += nDelta; + } } else { @@ -2066,11 +2090,18 @@ void UniscribeLayout::DropGlyph( int nStartx8 ) --nStart; else // nStart<=0 for first visible glyph { - const VisualItem* pVI = mpVisualItems; + VisualItem* pVI = mpVisualItems; for( int i = mnItemCount, nDummy; --i >= 0; ++pVI ) if( GetItemSubrange( *pVI, nStart, nDummy ) ) break; DBG_ASSERT( nStart <= mnGlyphCount, "USPLayout::DropG overflow" ); + int nOffset = 0; + int j = pVI->mnMinGlyphPos; + while (mpOutGlyphs[j] == DROPPED_OUTGLYPH) j++; + if (j == nStart) + { + pVI->mnXOffset += ((mpJustifications)? mpJustifications[nStart] : mpGlyphAdvances[nStart]); + } } mpOutGlyphs[ nStart ] = DROPPED_OUTGLYPH; @@ -2127,11 +2158,12 @@ void UniscribeLayout::Simplify( bool /*bIsBase*/ ) } // handle dropped glyphs at start of visual item - int nEndGlyphPos; - GetItemSubrange( rVI, i, nEndGlyphPos ); + int nMinGlyphPos, nEndGlyphPos, nOrigMinGlyphPos = rVI.mnMinGlyphPos; + GetItemSubrange( rVI, nMinGlyphPos, nEndGlyphPos ); + i = nMinGlyphPos; while( (mpOutGlyphs[i] == cDroppedGlyph) && (i < nEndGlyphPos) ) { - rVI.mnXOffset += pGlyphWidths[ i ]; + //rVI.mnXOffset += pGlyphWidths[ i ]; rVI.mnMinGlyphPos = ++i; } @@ -2141,6 +2173,17 @@ void UniscribeLayout::Simplify( bool /*bIsBase*/ ) rVI.mnEndGlyphPos = 0; continue; } + // If there are still glyphs in the cluster and mnMinGlyphPos + // has changed then we need to remove the dropped glyphs at start + // to correct logClusters, which is unsigned and relative to the + // item start. + if (rVI.mnMinGlyphPos != nOrigMinGlyphPos) + { + // drop any glyphs in the visual item outside the range + for (i = nOrigMinGlyphPos; i < nMinGlyphPos; i++) + mpOutGlyphs[ i ] = cDroppedGlyph; + rVI.mnMinGlyphPos = i = nOrigMinGlyphPos; + } // handle dropped glyphs in the middle of visual item for(; i < nEndGlyphPos; ++i ) @@ -2157,9 +2200,10 @@ void UniscribeLayout::Simplify( bool /*bIsBase*/ ) mpGlyphAdvances[ j ] = mpGlyphAdvances[ i ]; if( mpJustifications ) mpJustifications[ j ] = mpJustifications[ i ]; - int k = mpGlyphs2Chars[ i ]; + const int k = mpGlyphs2Chars[ i ]; mpGlyphs2Chars[ j ] = k; - mpLogClusters[ k ] = sal::static_int_cast(j++); + const int nRelGlyphPos = (j++) - rVI.mnMinGlyphPos; + mpLogClusters[ k ] = static_cast(nRelGlyphPos); } rVI.mnEndGlyphPos = j; @@ -2751,6 +2795,234 @@ bool UniscribeLayout::IsKashidaPosValid ( int nCharPos ) const #endif // USE_UNISCRIBE +#ifdef ENABLE_GRAPHITE + +class GraphiteLayoutWinImpl : public GraphiteLayout +{ +public: + GraphiteLayoutWinImpl(const gr::Font & font, ImplWinFontEntry & rFont) + throw() + : GraphiteLayout(font), mrFont(rFont) {}; + virtual ~GraphiteLayoutWinImpl() throw() {}; + virtual sal_GlyphId getKashidaGlyph(int & rWidth); +private: + ImplWinFontEntry & mrFont; +}; + +sal_GlyphId GraphiteLayoutWinImpl::getKashidaGlyph(int & rWidth) +{ + rWidth = mrFont.GetMinKashidaWidth(); + return mrFont.GetMinKashidaGlyph(); +} + +// This class uses the SIL Graphite engine to provide complex text layout services to the VCL +// @author tse +// +class GraphiteWinLayout : public WinLayout +{ +private: + mutable gr::WinFont mpFont; + grutils::GrFeatureParser * mpFeatures; + mutable GraphiteLayoutWinImpl maImpl; +public: + GraphiteWinLayout(HDC hDC, const ImplWinFontData& rWFD, ImplWinFontEntry& rWFE); + + static bool IsGraphiteEnabledFont(HDC hDC) throw(); + + // used by upper layers + virtual bool LayoutText( ImplLayoutArgs& ); // first step of layout + virtual void AdjustLayout( ImplLayoutArgs& ); // adjusting after fallback etc. + // virtual void InitFont() const; + virtual void DrawText( SalGraphics& ) const; + + // methods using string indexing + virtual int GetTextBreak( long nMaxWidth, long nCharExtra=0, int nFactor=1 ) const; + virtual long FillDXArray( long* pDXArray ) const; + + virtual void GetCaretPositions( int nArraySize, long* pCaretXArray ) const; + + // methods using glyph indexing + virtual int GetNextGlyphs(int nLen, sal_GlyphId* pGlyphIdxAry, ::Point & rPos, int&, + long* pGlyphAdvAry = 0, int* pCharPosAry = 0 ) const; + + // used by glyph+font+script fallback + virtual void MoveGlyph( int nStart, long nNewXPos ); + virtual void DropGlyph( int nStart ); + virtual void Simplify( bool bIsBase ); + ~GraphiteWinLayout() { delete mpFeatures; mpFeatures = NULL; }; +protected: + virtual void ReplaceDC(gr::Segment & segment) const; + virtual void RestoreDC(gr::Segment & segment) const; +}; + +bool GraphiteWinLayout::IsGraphiteEnabledFont(HDC hDC) throw() +{ + return gr::WinFont::FontHasGraphiteTables(hDC); +} + +GraphiteWinLayout::GraphiteWinLayout(HDC hDC, const ImplWinFontData& rWFD, ImplWinFontEntry& rWFE) throw() + : WinLayout(hDC, rWFD, rWFE), mpFont(hDC), + maImpl(mpFont, rWFE) +{ + const rtl::OString aLang = MsLangId::convertLanguageToIsoByteString( rWFE.maFontSelData.meLanguage ); + rtl::OString name = rtl::OUStringToOString( + rWFE.maFontSelData.maTargetName, RTL_TEXTENCODING_UTF8 ); + sal_Int32 nFeat = name.indexOf(grutils::GrFeatureParser::FEAT_PREFIX) + 1; + if (nFeat > 0) + { + rtl::OString aFeat = name.copy(nFeat, name.getLength() - nFeat); + mpFeatures = new grutils::GrFeatureParser(mpFont, aFeat.getStr(), aLang.getStr()); + } + else + { + mpFeatures = new grutils::GrFeatureParser(mpFont, aLang.getStr()); + } + maImpl.SetFeatures(mpFeatures); +} + +void GraphiteWinLayout::ReplaceDC(gr::Segment & segment) const +{ + COLORREF color = GetTextColor(mhDC); + dynamic_cast(segment.getFont()).replaceDC(mhDC); + SetTextColor(mhDC, color); +} + +void GraphiteWinLayout::RestoreDC(gr::Segment & segment) const +{ + dynamic_cast(segment.getFont()).restoreDC(); +} + +bool GraphiteWinLayout::LayoutText( ImplLayoutArgs & args) +{ + HFONT hUnRotatedFont; + if (args.mnOrientation) + { + // Graphite gets very confused if the font is rotated + LOGFONTW aLogFont; + ::GetObjectW( mhFont, sizeof(LOGFONTW), &aLogFont); + aLogFont.lfEscapement = 0; + aLogFont.lfOrientation = 0; + hUnRotatedFont = ::CreateFontIndirectW( &aLogFont); + ::SelectFont(mhDC, hUnRotatedFont); + } + WinLayout::AdjustLayout(args); + mpFont.replaceDC(mhDC); + maImpl.SetFontScale(WinLayout::mfFontScale); + //bool succeeded = maImpl.LayoutText(args); +#ifdef GRCACHE + GrSegRecord * pSegRecord = NULL; + gr::Segment * pSegment = maImpl.CreateSegment(args, &pSegRecord); +#else + gr::Segment * pSegment = maImpl.CreateSegment(args); +#endif + bool bSucceeded = false; + if (pSegment) + { + // replace the DC on the font within the segment + ReplaceDC(*pSegment); + // create glyph vectors +#ifdef GRCACHE + bSucceeded = maImpl.LayoutGlyphs(args, pSegment, pSegRecord); +#else + bSucceeded = maImpl.LayoutGlyphs(args, pSegment); +#endif + // restore original DC + RestoreDC(*pSegment); +#ifdef GRCACHE + if (pSegRecord) pSegRecord->unlock(); + else delete pSegment; +#else + delete pSegment; +#endif + } + mpFont.restoreDC(); + if (args.mnOrientation) + { + // restore the rotated font + ::SelectFont(mhDC, mhFont); + ::DeleteObject(hUnRotatedFont); + } + return bSucceeded; +} + +void GraphiteWinLayout::AdjustLayout(ImplLayoutArgs& rArgs) +{ + WinLayout::AdjustLayout(rArgs); + maImpl.DrawBase() = WinLayout::maDrawBase; + maImpl.DrawOffset() = WinLayout::maDrawOffset; + if ( (rArgs.mnFlags & SAL_LAYOUT_BIDI_RTL) && rArgs.mpDXArray) + { + mrWinFontEntry.InitKashidaHandling(mhDC); + } + maImpl.AdjustLayout(rArgs); +} + +void GraphiteWinLayout::DrawText(SalGraphics &sal_graphics) const +{ + HFONT hOrigFont = DisableFontScaling(); + HDC aHDC = static_cast(sal_graphics).mhDC; + maImpl.DrawBase() = WinLayout::maDrawBase; + maImpl.DrawOffset() = WinLayout::maDrawOffset; + const int MAX_GLYPHS = 2; + sal_GlyphId glyphIntStr[MAX_GLYPHS]; + WORD glyphWStr[MAX_GLYPHS]; + int glyphIndex = 0; + Point aPos(0,0); + int nGlyphs = 0; + do + { + nGlyphs = maImpl.GetNextGlyphs(1, glyphIntStr, aPos, glyphIndex); + if (nGlyphs < 1) + break; + std::copy(glyphIntStr, glyphIntStr + nGlyphs, glyphWStr); + ::ExtTextOutW(aHDC, aPos.X(), aPos.Y(), ETO_GLYPH_INDEX, + NULL, (LPCWSTR)&(glyphWStr), nGlyphs, NULL); + } while (nGlyphs); + if( hOrigFont ) + DeleteFont( SelectFont( mhDC, hOrigFont ) ); +} + +int GraphiteWinLayout::GetTextBreak( long nMaxWidth, long nCharExtra, int nFactor ) const +{ + mpFont.replaceDC(mhDC); + int nBreak = maImpl.GetTextBreak(nMaxWidth, nCharExtra, nFactor); + mpFont.restoreDC(); + return nBreak; +} + +long GraphiteWinLayout::FillDXArray( long* pDXArray ) const +{ + return maImpl.FillDXArray(pDXArray); +} + +void GraphiteWinLayout::GetCaretPositions( int nArraySize, long* pCaretXArray ) const +{ + maImpl.GetCaretPositions(nArraySize, pCaretXArray); +} + +int GraphiteWinLayout::GetNextGlyphs( int length, sal_GlyphId* glyph_out, + ::Point & pos_out, int &glyph_slot, long * glyph_adv, int *char_index) const +{ + maImpl.DrawBase() = WinLayout::maDrawBase; + maImpl.DrawOffset() = WinLayout::maDrawOffset; + return maImpl.GetNextGlyphs(length, glyph_out, pos_out, glyph_slot, glyph_adv, char_index); +} + +void GraphiteWinLayout::MoveGlyph( int glyph_idx, long new_x_pos ) +{ + maImpl.MoveGlyph(glyph_idx, new_x_pos); +} + +void GraphiteWinLayout::DropGlyph( int glyph_idx ) +{ + maImpl.DropGlyph(glyph_idx); +} + +void GraphiteWinLayout::Simplify( bool is_base ) +{ + maImpl.Simplify(is_base); +} +#endif // ENABLE_GRAPHITE // ======================================================================= SalLayout* WinSalGraphics::GetTextLayout( ImplLayoutArgs& rArgs, int nFallbackLevel ) @@ -2766,6 +3038,11 @@ SalLayout* WinSalGraphics::GetTextLayout( ImplLayoutArgs& rArgs, int nFallbackLe if( !(rArgs.mnFlags & SAL_LAYOUT_COMPLEX_DISABLED) && (aUspModule || (bUspEnabled && InitUSP())) ) // CTL layout engine { +#ifdef ENABLE_GRAPHITE + if (rFontFace.SupportsGraphite()) + pWinLayout = new GraphiteWinLayout(mhDC, rFontFace, rFontInstance); + else +#endif // ENABLE_GRAPHITE // script complexity is determined in upper layers pWinLayout = new UniscribeLayout( mhDC, rFontFace, rFontInstance ); // NOTE: it must be guaranteed that the WinSalGraphics lives longer than @@ -2788,7 +3065,12 @@ SalLayout* WinSalGraphics::GetTextLayout( ImplLayoutArgs& rArgs, int nFallbackLe BYTE eCharSet = ANSI_CHARSET; if( mpLogFont ) eCharSet = mpLogFont->lfCharSet; - pWinLayout = new SimpleWinLayout( mhDC, eCharSet, rFontFace, rFontInstance ); +#ifdef ENABLE_GRAPHITE + if (rFontFace.SupportsGraphite()) + pWinLayout = new GraphiteWinLayout(mhDC, rFontFace, rFontInstance); + else +#endif // ENABLE_GRAPHITE + pWinLayout = new SimpleWinLayout( mhDC, eCharSet, rFontFace, rFontInstance ); } if( mfFontScale != 1.0 ) diff --git a/vcl/win/source/window/MAKEFILE.MK b/vcl/win/source/window/MAKEFILE.MK index 9a65a5000ccf..67cb1bf3e080 100644 --- a/vcl/win/source/window/MAKEFILE.MK +++ b/vcl/win/source/window/MAKEFILE.MK @@ -43,7 +43,7 @@ ENABLE_EXCEPTIONS=TRUE # --- #105371# .IF "$(COM)"=="GCC" -CDEFS += -UWINVER -DWINVER=0x0400 -D_WIN32_WINNT=0x0501 +CFLAGS += -D_WIN32_WINNT=0x0501 .ELSE CFLAGS += -DWINVER=0x0400 -D_WIN32_WINNT=0x0501 @@ -60,6 +60,10 @@ SLOFILES= \ EXCEPTIONSFILES= $(SLO)$/salframe.obj .ENDIF +.IF "$(ENABLE_GRAPHITE)" == "TRUE" +CFLAGS+=-DENABLE_GRAPHITE +.ENDIF + # --- Targets ------------------------------------------------------ .INCLUDE : target.mk diff --git a/vcl/win/source/window/salframe.cxx b/vcl/win/source/window/salframe.cxx index 57ad272bcf51..fc92757e0925 100644 --- a/vcl/win/source/window/salframe.cxx +++ b/vcl/win/source/window/salframe.cxx @@ -6,9 +6,6 @@ * * OpenOffice.org - a multi-platform office productivity suite * - * $RCSfile: salframe.cxx,v $ - * $Revision: 1.157.20.2 $ - * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify @@ -42,6 +39,7 @@ #include #include #include +#include #include #include @@ -355,11 +353,9 @@ SalFrame* ImplSalCreateFrame( WinSalInstance* pInst, { OUString aLibraryName( RTL_CONSTASCII_USTRINGPARAM( "user32" ) ); oslModule pLib = osl_loadModule( aLibraryName.pData, SAL_LOADMODULE_DEFAULT ); - void *pFunc = NULL; + oslGenericFunction pFunc = NULL; if( pLib ) - { pFunc = osl_getAsciiFunctionSymbol( pLib, "SetLayeredWindowAttributes" ); - } lpfnSetLayeredWindowAttributes = ( SetLayeredWindowAttributes_Proc_T ) pFunc; @@ -445,11 +441,11 @@ SalFrame* ImplSalCreateFrame( WinSalInstance* pInst, nExSysStyle |= WS_EX_TOOLWINDOW; pFrame->mbFloatWin = TRUE; - if ( pEnvTransparentFloats && bLayeredAPI == 1 /*&& !(nSalFrameStyle & SAL_FRAME_STYLE_MOVEABLE) */) + if ( (bLayeredAPI == 1) && (pEnvTransparentFloats /* does not work remote! || (nSalFrameStyle & SAL_FRAME_STYLE_FLOAT_FOCUSABLE) */ ) ) nExSysStyle |= WS_EX_LAYERED; } - if( nSalFrameStyle & SAL_FRAME_STYLE_TOOLTIP ) + if( (nSalFrameStyle & SAL_FRAME_STYLE_TOOLTIP) || (nSalFrameStyle & SAL_FRAME_STYLE_FLOAT_FOCUSABLE) ) nExSysStyle |= WS_EX_TOPMOST; // init frame data @@ -2162,7 +2158,17 @@ static void ImplSalToTop( HWND hWnd, USHORT nFlags ) BringWindowToTop( hWnd ); if ( nFlags & SAL_FRAME_TOTOP_FOREGROUNDTASK ) - SetForegroundWindow( hWnd ); + { + // This magic code is necessary to connect the input focus of the + // current window thread and the thread which owns the window that + // should be the new foreground window. + HWND hCurrWnd = GetForegroundWindow(); + DWORD myThreadID = GetCurrentThreadId(); + DWORD currThreadID = GetWindowThreadProcessId(hCurrWnd,NULL); + AttachThreadInput(myThreadID, currThreadID,TRUE); + SetForegroundWindow(hWnd); + AttachThreadInput(myThreadID,currThreadID,FALSE); + } if ( nFlags & SAL_FRAME_TOTOP_RESTOREWHENMIN ) { @@ -2935,6 +2941,7 @@ void WinSalFrame::UpdateSettings( AllSettings& rSettings ) aStyleSettings.SetUseFlatBorders( FALSE ); aStyleSettings.SetUseFlatMenues( FALSE ); aStyleSettings.SetMenuTextColor( ImplWinColorToSal( GetSysColor( COLOR_MENUTEXT ) ) ); + aStyleSettings.SetMenuBarTextColor( ImplWinColorToSal( GetSysColor( COLOR_MENUTEXT ) ) ); aStyleSettings.SetActiveColor( ImplWinColorToSal( GetSysColor( COLOR_ACTIVECAPTION ) ) ); aStyleSettings.SetActiveTextColor( ImplWinColorToSal( GetSysColor( COLOR_CAPTIONTEXT ) ) ); aStyleSettings.SetDeactiveColor( ImplWinColorToSal( GetSysColor( COLOR_INACTIVECAPTION ) ) ); @@ -3089,7 +3096,7 @@ void WinSalFrame::UpdateSettings( AllSettings& rSettings ) if ( (nValue > 1000) && (nValue < 10000) ) { MiscSettings aMiscSettings = rSettings.GetMiscSettings(); - aMiscSettings.SetTwoDigitYearStart( (USHORT)(nValue-99) ); + utl::MiscCfg().SetYear2000( (sal_Int32)(nValue-99) ); rSettings.SetMiscSettings( aMiscSettings ); } } @@ -3155,7 +3162,8 @@ void WinSalFrame::Beep( SoundType eSoundType ) MB_ICONQUESTION // SOUND_QUERY }; - MessageBeep( aImplSoundTab[eSoundType] ); + if( eSoundType != SOUND_DISABLE ) // don't beep on disable + MessageBeep( aImplSoundTab[eSoundType] ); } // ----------------------------------------------------------------------- @@ -5429,7 +5437,7 @@ static BOOL ImplHandleIMECompositionInput( WinSalFrame* pFrame, WCHAR* pTextBuf = new WCHAR[nTextLen]; ImmGetCompositionStringW( hIMC, GCS_RESULTSTR, pTextBuf, nTextLen*sizeof( WCHAR ) ); aEvt.maText = XubString( reinterpret_cast(pTextBuf), (xub_StrLen)nTextLen ); - delete pTextBuf; + delete [] pTextBuf; } aEvt.mnCursorPos = aEvt.maText.Len(); @@ -5455,7 +5463,7 @@ static BOOL ImplHandleIMECompositionInput( WinSalFrame* pFrame, WCHAR* pTextBuf = new WCHAR[nTextLen]; ImmGetCompositionStringW( hIMC, GCS_COMPSTR, pTextBuf, nTextLen*sizeof( WCHAR ) ); aEvt.maText = XubString( reinterpret_cast(pTextBuf), (xub_StrLen)nTextLen ); - delete pTextBuf; + delete [] pTextBuf; WIN_BYTE* pAttrBuf = NULL; LONG nAttrLen = ImmGetCompositionStringW( hIMC, GCS_COMPATTR, 0, 0 ); @@ -5491,7 +5499,7 @@ static BOOL ImplHandleIMECompositionInput( WinSalFrame* pFrame, } aEvt.mpTextAttr = pSalAttrAry; - delete pAttrBuf; + delete [] pAttrBuf; } } @@ -5528,7 +5536,7 @@ static BOOL ImplHandleIMECompositionInput( WinSalFrame* pFrame, } if ( pSalAttrAry ) - delete pSalAttrAry; + delete [] pSalAttrAry; } return !bDef; diff --git a/vcl/workben/makefile.mk b/vcl/workben/makefile.mk index 83abbbf4e6bf..0b89f031651d 100644 --- a/vcl/workben/makefile.mk +++ b/vcl/workben/makefile.mk @@ -125,6 +125,7 @@ APP5OBJS= $(OBJ)$/svpclient.obj APP5STDLIBS= $(CPPULIB) \ $(CPPUHELPERLIB) \ $(COMPHELPERLIB) \ + $(UCBHELPERLIB) \ $(VCLLIB) \ $(TOOLSLIB) \ $(SALLIB) \ @@ -139,6 +140,7 @@ APP5STDLIBS+=-lsocket .ENDIF .INCLUDE : target.mk +.IF "$(L10N_framework)"=="" ALLTAR : $(BIN)$/applicat.rdb @@ -150,4 +152,4 @@ $(BIN)$/applicat.rdb : makefile.mk $(UNOUCRRDB) $(REGCOMP) -register -r applicat.rdb \ -c i18nsearch.uno$(DLLPOST) \ -c i18npool.uno$(DLLPOST) - +.ENDIF diff --git a/vcl/workben/outdevgrind.cxx b/vcl/workben/outdevgrind.cxx index a92da7c05531..1109111b63c5 100755 --- a/vcl/workben/outdevgrind.cxx +++ b/vcl/workben/outdevgrind.cxx @@ -163,12 +163,12 @@ void setupMethodStubs( functor_vector_type& res ) xub_StrLen nIndex = 0, xub_StrLen nLen = STRING_LEN, MetricVector* pVector = NULL, String* pDisplayText = NULL ); */ - add(res, - "DrawText", - boost::bind( - &OutputDevice::DrawText, - _1, - aPt1, aString, (USHORT)0, aString.Len(), (MetricVector*)0, (String*)0 )); +// add(res, +// "DrawText", +// boost::bind( +// &OutputDevice::DrawText, +// _1, +// aPt1, aString, (USHORT)0, aString.Len(), (MetricVector*)0, (String*)0, (vcl::ITextLayout*)0 )); /* void DrawTextArray( const Point& rStartPt, const XubString& rStr, const sal_Int32* pDXAry = NULL, diff --git a/vcl/workben/svpclient.cxx b/vcl/workben/svpclient.cxx index cf64d58110e8..7bea0b94f76a 100644 --- a/vcl/workben/svpclient.cxx +++ b/vcl/workben/svpclient.cxx @@ -50,6 +50,8 @@ #include #include #include +#include "ucbhelper/contentbroker.hxx" +#include "ucbhelper/configurationkeys.hxx" #include #include @@ -60,6 +62,8 @@ using namespace rtl; +using namespace cppu; +using namespace comphelper; using namespace ::com::sun::star::uno; using namespace ::com::sun::star::lang; // ----------------------------------------------------------------------- @@ -73,10 +77,47 @@ SAL_IMPLEMENT_MAIN() { tools::extendApplicationEnvironment(); - Reference< XMultiServiceFactory > xMS; - xMS = cppu::createRegistryServiceFactory( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "applicat.rdb" ) ), sal_True ); + //------------------------------------------------- + // create the global service-manager + //------------------------------------------------- + Reference< XMultiServiceFactory > xFactory; + try + { + Reference< XComponentContext > xCtx = defaultBootstrap_InitialComponentContext(); + xFactory = Reference< XMultiServiceFactory >( xCtx->getServiceManager(), UNO_QUERY ); + if( xFactory.is() ) + setProcessServiceFactory( xFactory ); + } + catch( com::sun::star::uno::Exception& rExc) + { + } - InitVCL( xMS ); + if( ! xFactory.is() ) + { + fprintf( stderr, "Could not bootstrap UNO, installation must be in disorder. Exiting.\n" ); + exit( 1 ); + } + + /* + * Create UCB. + */ + Sequence< Any > aArgs( 2 ); + aArgs[ 0 ] <<= OUString::createFromAscii( UCB_CONFIGURATION_KEY1_LOCAL ); + aArgs[ 1 ] <<= OUString::createFromAscii( UCB_CONFIGURATION_KEY2_OFFICE ); +#if OSL_DEBUG_LEVEL > 1 + sal_Bool bSuccess = +#endif + ::ucbhelper::ContentBroker::initialize( xFactory, aArgs ); + +#if OSL_DEBUG_LEVEL > 1 + if ( !bSuccess ) + { + fprintf( stderr, "Error creating UCB, installation must be in disorder. Exiting.\n" ); + exit( 1 ); + } +#endif + + InitVCL( xFactory ); ::Main(); DeInitVCL();