[Libreoffice-commits] .: Branch 'integration/dev300_m98' - 267 commits - jfreereport/java jfreereport/patches jfreereport/prj jfreereport/version.mk migrationanalysis/src reportbuilder/java reportbuilder/util sdext/source tomcat/makefile.mk xpdf/makefile.mk xpdf/xpdf-3.02-sec.patch

Michael Meeks mmeeks at kemper.freedesktop.org
Tue Mar 1 08:51:59 PST 2011


 jfreereport/java/flute/makefile.mk                                               |   30 
 jfreereport/java/jfreereport/makefile.mk                                         |   15 
 jfreereport/java/libbase/makefile.mk                                             |   28 
 jfreereport/java/libfonts/makefile.mk                                            |   28 
 jfreereport/java/libformula/makefile.mk                                          |   30 
 jfreereport/java/liblayout/makefile.mk                                           |   14 
 jfreereport/java/libloader/makefile.mk                                           |   29 
 jfreereport/java/librepository/makefile.mk                                       |   29 
 jfreereport/java/libserializer/makefile.mk                                       |   28 
 jfreereport/java/libxml/makefile.mk                                              |   28 
 jfreereport/java/sac/makefile.mk                                                 |    4 
 jfreereport/patches/common_build.patch                                           |   76 +
 jfreereport/patches/flow-engine.patch                                            |    4 
 jfreereport/patches/flute.patch                                                  |   19 
 jfreereport/patches/libbase.patch                                                |   19 
 jfreereport/patches/libfonts.patch                                               |   10 
 jfreereport/patches/libformula.patch                                             |   27 
 jfreereport/patches/liblayout.patch                                              |    4 
 jfreereport/patches/libloader.patch                                              |   11 
 jfreereport/patches/librepository.patch                                          |   10 
 jfreereport/patches/libserializer.patch                                          |   10 
 jfreereport/patches/libxml.patch                                                 |   10 
 jfreereport/prj/d.lst                                                            |    1 
 jfreereport/version.mk                                                           |   12 
 migrationanalysis/src/msokill/StdAfx.cpp                                         |   76 -
 migrationanalysis/src/msokill/StdAfx.h                                           |  114 +-
 reportbuilder/java/com/sun/star/report/function/metadata/makefile.mk             |    5 
 reportbuilder/java/com/sun/star/report/pentaho/Manifest.mf                       |    8 
 reportbuilder/java/com/sun/star/report/pentaho/loader/InputRepositoryLoader.java |    1 
 reportbuilder/java/com/sun/star/report/pentaho/makefile.mk                       |   14 
 reportbuilder/java/com/sun/star/report/util/makefile.mk                          |    6 
 reportbuilder/util/hidother.src                                                  |  146 ---
 reportbuilder/util/makefile.mk                                                   |   22 
 sdext/source/minimizer/description.xml                                           |    1 
 sdext/source/minimizer/graphiccollector.cxx                                      |    8 
 sdext/source/minimizer/graphiccollector.hxx                                      |    5 
 sdext/source/minimizer/impoptimizer.cxx                                          |  118 +-
 sdext/source/minimizer/makefile.mk                                               |    6 
 sdext/source/pdfimport/config/pdf_import_filter.xcu                              |    6 
 sdext/source/pdfimport/inc/treevisitorfactory.hxx                                |    2 
 sdext/source/pdfimport/makefile.mk                                               |    2 
 sdext/source/pdfimport/tree/drawtreevisiting.cxx                                 |   38 
 sdext/source/pdfimport/tree/drawtreevisiting.hxx                                 |   14 
 sdext/source/pdfimport/tree/pdfiprocessor.cxx                                    |  415 +++++++++-
 sdext/source/pdfimport/tree/pdfiprocessor.hxx                                    |    9 
 sdext/source/pdfimport/tree/treevisitorfactory.cxx                               |   14 
 sdext/source/presenter/PresenterController.cxx                                   |    2 
 sdext/source/presenter/description.xml                                           |    1 
 sdext/source/presenter/makefile.mk                                               |   23 
 tomcat/makefile.mk                                                               |    2 
 xpdf/makefile.mk                                                                 |   34 
 xpdf/xpdf-3.02-sec.patch                                                         |   29 
 52 files changed, 1014 insertions(+), 583 deletions(-)

New commits:
commit f2fe3cdefc1f6679e812cfa55360275e7b91a0b0
Merge: 361d6d1... 342b98b...
Author: Michael Meeks <michael.meeks at novell.com>
Date:   Tue Mar 1 15:54:04 2011 +0000

    Merge remote branch 'stage/ooo/dev300_m98_fixed' into integration/dev300_m98
    
    Conflicts:
    	jfreereport/java/flute/makefile.mk
    	jfreereport/java/jfreereport/makefile.mk
    	jfreereport/java/libbase/makefile.mk
    	jfreereport/java/libfonts/makefile.mk
    	jfreereport/java/libformula/makefile.mk
    	jfreereport/java/liblayout/makefile.mk
    	jfreereport/java/libloader/makefile.mk
    	jfreereport/java/librepository/makefile.mk
    	jfreereport/java/libserializer/makefile.mk
    	jfreereport/java/libxml/makefile.mk
    	jfreereport/java/sac/makefile.mk
    	migrationanalysis/src/msokill/StdAfx.cpp
    	migrationanalysis/src/msokill/StdAfx.h
    	migrationanalysis/src/msokill/msokill.cpp
    	mysqlc/source/description.xml
    	mysqlc/source/makefile.mk
    	mysqlc/source/mysqlc.xml
    	mysqlc/source/mysqlc_connection.cxx
    	mysqlc/source/mysqlc_connection.hxx
    	mysqlc/source/mysqlc_databasemetadata.cxx
    	mysqlc/source/mysqlc_databasemetadata.hxx
    	mysqlc/source/mysqlc_driver.cxx
    	mysqlc/source/mysqlc_driver.hxx
    	mysqlc/source/mysqlc_general.cxx
    	mysqlc/source/mysqlc_general.hxx
    	mysqlc/source/mysqlc_preparedstatement.cxx
    	mysqlc/source/mysqlc_preparedstatement.hxx
    	mysqlc/source/mysqlc_propertyids.cxx
    	mysqlc/source/mysqlc_propertyids.hxx
    	mysqlc/source/mysqlc_resultset.cxx
    	mysqlc/source/mysqlc_resultset.hxx
    	mysqlc/source/mysqlc_resultsetmetadata.cxx
    	mysqlc/source/mysqlc_resultsetmetadata.hxx
    	mysqlc/source/mysqlc_services.cxx
    	mysqlc/source/mysqlc_statement.cxx
    	mysqlc/source/mysqlc_statement.hxx
    	mysqlc/source/mysqlc_subcomponent.hxx
    	mysqlc/source/mysqlc_types.cxx
    	mysqlc/source/mysqlc_types.hxx
    	mysqlc/source/registry/data/org/openoffice/Office/DataAccess/Drivers.xcu
    	reportbuilder/java/com/sun/star/report/function/metadata/makefile.mk
    	reportbuilder/util/description.xml
    	reportbuilder/util/hidother.src
    	reportbuilder/util/makefile.mk
    	sdext/source/minimizer/description.xml
    	sdext/source/minimizer/fileopendialog.hxx
    	sdext/source/minimizer/impoptimizer.cxx
    	sdext/source/minimizer/informationdialog.cxx
    	sdext/source/minimizer/makefile.mk
    	sdext/source/minimizer/optimizerdialog.cxx
    	sdext/source/pdfimport/config/description.xml
    	sdext/source/pdfimport/makefile.mk
    	sdext/source/pdfimport/pdfparse/pdfparse.cxx
    	sdext/source/pdfimport/test/tests.cxx
    	sdext/source/pdfimport/tree/drawtreevisiting.cxx
    	sdext/source/pdfimport/tree/drawtreevisiting.hxx
    	sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx
    	sdext/source/presenter/PresenterController.cxx
    	sdext/source/presenter/description.xml
    	sdext/source/presenter/makefile.mk
    	swext/mediawiki/build.xml
    	swext/prj/build.lst
    	xpdf/makefile.mk

diff --cc migrationanalysis/src/msokill/StdAfx.cpp
index 2785112,511051c..394cdcd
--- a/migrationanalysis/src/msokill/StdAfx.cpp
+++ b/migrationanalysis/src/msokill/StdAfx.cpp
@@@ -1,38 -1,35 +1,38 @@@
- /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
--/*************************************************************************
-- *
-- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-- * 
-- * Copyright 2000, 2010 Oracle and/or its affiliates.
-- *
-- * 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
-- * <http://www.openoffice.org/license.html>
-- * for a copy of the LGPLv3 License.
-- *
-- ************************************************************************/
--
--// stdafx.cpp : source file that includes just the standard includes
--//	msokill.pch will be the pre-compiled header
--//	stdafx.obj will contain the pre-compiled type information
--
--#include "stdafx.h"
--
--// TODO: reference any additional headers you need in STDAFX.H
--// and not in this file
- 
- /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
++/*************************************************************************
++ *
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ * 
++ * Copyright 2000, 2010 Oracle and/or its affiliates.
++ *
++ * 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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++// stdafx.cpp : source file that includes just the standard includes
++//	msokill.pch will be the pre-compiled header
++//	stdafx.obj will contain the pre-compiled type information
++
++#include "stdafx.h"
++
++// TODO: reference any additional headers you need in STDAFX.H
++// and not in this file
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --cc migrationanalysis/src/msokill/StdAfx.h
index 88357f6,35f5ef0..9645e0a
--- a/migrationanalysis/src/msokill/StdAfx.h
+++ b/migrationanalysis/src/msokill/StdAfx.h
@@@ -1,57 -1,54 +1,57 @@@
- /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
--/*************************************************************************
-- *
-- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
-- * 
-- * Copyright 2000, 2010 Oracle and/or its affiliates.
-- *
-- * 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
-- * <http://www.openoffice.org/license.html>
-- * for a copy of the LGPLv3 License.
-- *
-- ************************************************************************/
--
--/*
-- *
-- * Description: Put MSO in a state where it can be closed using
-- *              automation or kill it completely
-- *
-- */
--
--#if !defined(AFX_STDAFX_H__12149A50_72AF_409A_9B43_8ACCD98F50CE__INCLUDED_)
--#define AFX_STDAFX_H__12149A50_72AF_409A_9B43_8ACCD98F50CE__INCLUDED_
--
--#if _MSC_VER > 1000
--#pragma once
--#endif // _MSC_VER > 1000
--
--#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
--
--#include <stdio.h>
--#pragma warning(push, 1)
--#include <windows.h>
--#pragma warning(pop)
--
--// TODO: reference additional headers your program requires here
--
--//{{AFX_INSERT_LOCATION}}
--// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
--
--#endif // !defined(AFX_STDAFX_H__12149A50_72AF_409A_9B43_8ACCD98F50CE__INCLUDED_)
- 
- /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
++/*************************************************************************
++ *
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
++ * 
++ * Copyright 2000, 2010 Oracle and/or its affiliates.
++ *
++ * 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
++ * <http://www.openoffice.org/license.html>
++ * for a copy of the LGPLv3 License.
++ *
++ ************************************************************************/
++
++/*
++ *
++ * Description: Put MSO in a state where it can be closed using
++ *              automation or kill it completely
++ *
++ */
++
++#if !defined(AFX_STDAFX_H__12149A50_72AF_409A_9B43_8ACCD98F50CE__INCLUDED_)
++#define AFX_STDAFX_H__12149A50_72AF_409A_9B43_8ACCD98F50CE__INCLUDED_
++
++#if _MSC_VER > 1000
++#pragma once
++#endif // _MSC_VER > 1000
++
++#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
++
++#include <stdio.h>
++#pragma warning(push, 1)
++#include <windows.h>
++#pragma warning(pop)
++
++// TODO: reference additional headers your program requires here
++
++//{{AFX_INSERT_LOCATION}}
++// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
++
++#endif // !defined(AFX_STDAFX_H__12149A50_72AF_409A_9B43_8ACCD98F50CE__INCLUDED_)
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --cc reportbuilder/java/com/sun/star/report/pentaho/loader/InputRepositoryLoader.java
index 124b4cd,265ea19..95a6679
--- a/reportbuilder/java/com/sun/star/report/pentaho/loader/InputRepositoryLoader.java
+++ b/reportbuilder/java/com/sun/star/report/pentaho/loader/InputRepositoryLoader.java
@@@ -34,8 -34,8 +34,9 @@@ import java.util.HashMap
  import java.util.Map;
  
  import org.pentaho.reporting.libraries.resourceloader.ResourceData;
+ import org.pentaho.reporting.libraries.resourceloader.ResourceException;
  import org.pentaho.reporting.libraries.resourceloader.ResourceKey;
 +import org.pentaho.reporting.libraries.resourceloader.ResourceException;
  import org.pentaho.reporting.libraries.resourceloader.ResourceKeyCreationException;
  import org.pentaho.reporting.libraries.resourceloader.ResourceLoader;
  import org.pentaho.reporting.libraries.resourceloader.ResourceLoadingException;
diff --cc reportbuilder/util/makefile.mk
index c299ce5,8106868..bb2ef32
mode 100755,100644..100755
--- a/reportbuilder/util/makefile.mk
+++ b/reportbuilder/util/makefile.mk
diff --cc sdext/source/minimizer/description.xml
index f10e8c2,a4f172d..27f9dc2
mode 100755,100644..100755
--- a/sdext/source/minimizer/description.xml
+++ b/sdext/source/minimizer/description.xml
@@@ -25,6 -31,7 +25,7 @@@
  
      <icon>
        <default xlink:href="bitmaps/extension_32.png" />
 -      <high-contrast xlink:href="bitmaps/extension_32_h.png" />
 +    </icon>
+     </icon>
  
  </description>
diff --cc sdext/source/minimizer/graphiccollector.cxx
index fffa1e8,78dc037..e5061ac
--- a/sdext/source/minimizer/graphiccollector.cxx
+++ b/sdext/source/minimizer/graphiccollector.cxx
@@@ -71,10 -70,10 +71,10 @@@ const DeviceInfo& GraphicCollector::Get
      return aDeviceInfo;
  }
  
- void ImpAddEntity( std::vector< GraphicCollector::GraphicEntity >& rGraphicEntities, Reference< XGraphic >& rxGraphic, const GraphicSettings& rGraphicSettings, const GraphicCollector::GraphicUser& rUser )
+ void ImpAddEntity( std::vector< GraphicCollector::GraphicEntity >& rGraphicEntities, const GraphicSettings& rGraphicSettings, const GraphicCollector::GraphicUser& rUser )
  {
      const rtl::OUString aGraphicURL( rUser.maGraphicURL );
 -    const rtl::OUString sPackageURL( OUString::createFromAscii( "vnd.sun.star.GraphicObject:" ) );
 +    const rtl::OUString sPackageURL( RTL_CONSTASCII_USTRINGPARAM("vnd.sun.star.GraphicObject:") );
  
      if ( rGraphicSettings.mbEmbedLinkedGraphics || ( !aGraphicURL.getLength() || aGraphicURL.match( sPackageURL, 0 ) ) )
      {
diff --cc sdext/source/minimizer/impoptimizer.cxx
index 30edc80,8a3e600..3070c26
--- a/sdext/source/minimizer/impoptimizer.cxx
+++ b/sdext/source/minimizer/impoptimizer.cxx
@@@ -406,69 -409,87 +406,87 @@@ void CompressGraphics( ImpOptimizer& rO
              rOptimizer.SetStatusValue( TK_Progress, Any( static_cast< sal_Int32 >( nProgress ) ) );
              rOptimizer.DispatchStatus();
  
-             GraphicSettings aGraphicSettings( rGraphicSettings );
-             aGraphicSettings.mbRemoveCropArea = aGraphicIter->mbRemoveCropArea;
- 
-             Reference< XPropertySet > xNewGraphicPropertySet( aGraphicIter->mxGraphic, UNO_QUERY_THROW );
-             awt::Size aSize100thMM( GraphicCollector::GetOriginalSize( rxMSF, aGraphicIter->mxGraphic ) );
-             Reference< XGraphic > xNewGraphic( ImpCompressGraphic( rxMSF, aGraphicIter->mxGraphic, aGraphicIter->maLogicalSize, aGraphicIter->maGraphicCropLogic, aGraphicSettings ) );
-             if ( xNewGraphic.is() )
+             if ( aGraphicIter->maUser.size() )
              {
-                 // applying graphic to each user
-                 std::vector< GraphicCollector::GraphicUser >::iterator aGraphicUserIter( aGraphicIter->maUser.begin() );
-                 while( aGraphicUserIter != aGraphicIter->maUser.end() )
-                 {
-                     if ( aGraphicUserIter->mxShape.is() )
-                     {
-                         rtl::OUString sEmptyGraphicURL;
-                         Reference< XPropertySet > xShapePropertySet( aGraphicUserIter->mxShape, UNO_QUERY_THROW );
-                         xShapePropertySet->setPropertyValue( TKGet( TK_GraphicURL ), Any( sEmptyGraphicURL ) );
-                         xShapePropertySet->setPropertyValue( TKGet( TK_Graphic ), Any( xNewGraphic ) );
+                 GraphicSettings aGraphicSettings( rGraphicSettings );
+                 aGraphicSettings.mbRemoveCropArea = aGraphicIter->mbRemoveCropArea;
  
-                         if ( aGraphicUserIter->maGraphicCropLogic.Left || aGraphicUserIter->maGraphicCropLogic.Top
-                         || aGraphicUserIter->maGraphicCropLogic.Right || aGraphicUserIter->maGraphicCropLogic.Bottom )
-                         {	// removing crop area was not possible or should't been applied
-                             text::GraphicCrop aGraphicCropLogic( 0, 0, 0, 0 );
-                             if ( !aGraphicSettings.mbRemoveCropArea )
-                             {
-                                 awt::Size aNewSize( GraphicCollector::GetOriginalSize( rxMSF, xNewGraphic ) );
-                                 aGraphicCropLogic.Left = (sal_Int32)((double)aGraphicUserIter->maGraphicCropLogic.Left * ((double)aNewSize.Width / (double)aSize100thMM.Width));
-                                 aGraphicCropLogic.Top = (sal_Int32)((double)aGraphicUserIter->maGraphicCropLogic.Top * ((double)aNewSize.Height / (double)aSize100thMM.Height));
-                                 aGraphicCropLogic.Right = (sal_Int32)((double)aGraphicUserIter->maGraphicCropLogic.Right * ((double)aNewSize.Width / (double)aSize100thMM.Width));
-                                 aGraphicCropLogic.Bottom = (sal_Int32)((double)aGraphicUserIter->maGraphicCropLogic.Bottom * ((double)aNewSize.Height / (double)aSize100thMM.Height));
-                             }
-                             xShapePropertySet->setPropertyValue( TKGet( TK_GraphicCrop ), Any( aGraphicCropLogic ) );
-                         }
-                     }
-                     else if ( aGraphicUserIter->mxPropertySet.is() )
+                 Reference< XGraphic > xGraphic;
+                 if ( aGraphicIter->maUser[ 0 ].mbFillBitmap && aGraphicIter->maUser[ 0 ].mxPropertySet.is() )
+                 {
+                     Reference< XBitmap > xFillBitmap;
+                     if ( aGraphicIter->maUser[ 0 ].mxPropertySet->getPropertyValue( TKGet( TK_FillBitmap ) ) >>= xFillBitmap )
+                         xGraphic = Reference< XGraphic >( xFillBitmap, UNO_QUERY_THROW );
+                 }
+                 else if ( aGraphicIter->maUser[ 0 ].mxShape.is() )
+                 {
+                     Reference< XPropertySet > xShapePropertySet( aGraphicIter->maUser[ 0 ].mxShape, UNO_QUERY_THROW );
+                     xShapePropertySet->getPropertyValue( TKGet( TK_Graphic ) ) >>= xGraphic;
+                 }
+                 if ( xGraphic.is() )
+                 {
+                     Reference< XPropertySet > xNewGraphicPropertySet( xGraphic, UNO_QUERY_THROW );
+                     awt::Size aSize100thMM( GraphicCollector::GetOriginalSize( rxMSF, xGraphic ) );
+                     Reference< XGraphic > xNewGraphic( ImpCompressGraphic( rxMSF, xGraphic, aGraphicIter->maLogicalSize, aGraphicIter->maGraphicCropLogic, aGraphicSettings ) );
+                     if ( xNewGraphic.is() )
                      {
-                         Reference< XBitmap > xFillBitmap( xNewGraphic, UNO_QUERY );
-                         if ( xFillBitmap.is() )
+                         // applying graphic to each user
+                         std::vector< GraphicCollector::GraphicUser >::iterator aGraphicUserIter( aGraphicIter->maUser.begin() );
+                         while( aGraphicUserIter != aGraphicIter->maUser.end() )
                          {
-                             awt::Size aSize;
-                             sal_Bool bLogicalSize;
+                             if ( aGraphicUserIter->mxShape.is() )
+                             {
+                                 rtl::OUString sEmptyGraphicURL;
+                                 Reference< XPropertySet > xShapePropertySet( aGraphicUserIter->mxShape, UNO_QUERY_THROW );
+                                 xShapePropertySet->setPropertyValue( TKGet( TK_GraphicURL ), Any( sEmptyGraphicURL ) );
+                                 xShapePropertySet->setPropertyValue( TKGet( TK_Graphic ), Any( xNewGraphic ) );
  
-                             Reference< XPropertySet >& rxPropertySet( aGraphicUserIter->mxPropertySet );
-                             rxPropertySet->setPropertyValue( TKGet( TK_FillBitmap ), Any( xFillBitmap ) );
-                             if ( ( rxPropertySet->getPropertyValue( TKGet( TK_FillBitmapLogicalSize ) ) >>= bLogicalSize )
-                                 && ( rxPropertySet->getPropertyValue( TKGet( TK_FillBitmapSizeX ) ) >>= aSize.Width )
-                                 && ( rxPropertySet->getPropertyValue( TKGet( TK_FillBitmapSizeY ) ) >>= aSize.Height ) )
+                                 if ( aGraphicUserIter->maGraphicCropLogic.Left || aGraphicUserIter->maGraphicCropLogic.Top
+                                 || aGraphicUserIter->maGraphicCropLogic.Right || aGraphicUserIter->maGraphicCropLogic.Bottom )
+                                 {	// removing crop area was not possible or should't been applied
+                                     text::GraphicCrop aGraphicCropLogic( 0, 0, 0, 0 );
+                                     if ( !aGraphicSettings.mbRemoveCropArea )
+                                     {
+                                         awt::Size aNewSize( GraphicCollector::GetOriginalSize( rxMSF, xNewGraphic ) );
+                                         aGraphicCropLogic.Left = (sal_Int32)((double)aGraphicUserIter->maGraphicCropLogic.Left * ((double)aNewSize.Width / (double)aSize100thMM.Width));
+                                         aGraphicCropLogic.Top = (sal_Int32)((double)aGraphicUserIter->maGraphicCropLogic.Top * ((double)aNewSize.Height / (double)aSize100thMM.Height));
+                                         aGraphicCropLogic.Right = (sal_Int32)((double)aGraphicUserIter->maGraphicCropLogic.Right * ((double)aNewSize.Width / (double)aSize100thMM.Width));
+                                         aGraphicCropLogic.Bottom = (sal_Int32)((double)aGraphicUserIter->maGraphicCropLogic.Bottom * ((double)aNewSize.Height / (double)aSize100thMM.Height));
+                                     }
+                                     xShapePropertySet->setPropertyValue( TKGet( TK_GraphicCrop ), Any( aGraphicCropLogic ) );
+                                 }
+                             }
+                             else if ( aGraphicUserIter->mxPropertySet.is() )
                              {
-                                 if ( !aSize.Width || !aSize.Height )
+                                 Reference< XBitmap > xFillBitmap( xNewGraphic, UNO_QUERY );
+                                 if ( xFillBitmap.is() )
                                  {
-                                     rxPropertySet->setPropertyValue( TKGet( TK_FillBitmapLogicalSize ), Any( sal_True ) );
-                                     rxPropertySet->setPropertyValue( TKGet( TK_FillBitmapSizeX ), Any( aGraphicUserIter->maLogicalSize.Width ) );
-                                     rxPropertySet->setPropertyValue( TKGet( TK_FillBitmapSizeY ), Any( aGraphicUserIter->maLogicalSize.Height ) );
+                                     awt::Size aSize;
+                                     sal_Bool bLogicalSize;
+ 
+                                     Reference< XPropertySet >& rxPropertySet( aGraphicUserIter->mxPropertySet );
+                                     rxPropertySet->setPropertyValue( TKGet( TK_FillBitmap ), Any( xFillBitmap ) );
+                                     if ( ( rxPropertySet->getPropertyValue( TKGet( TK_FillBitmapLogicalSize ) ) >>= bLogicalSize )
+                                         && ( rxPropertySet->getPropertyValue( TKGet( TK_FillBitmapSizeX ) ) >>= aSize.Width )
+                                         && ( rxPropertySet->getPropertyValue( TKGet( TK_FillBitmapSizeY ) ) >>= aSize.Height ) )
+                                     {
+                                         if ( !aSize.Width || !aSize.Height )
+                                         {
+                                             rxPropertySet->setPropertyValue( TKGet( TK_FillBitmapLogicalSize ), Any( sal_True ) );
+                                             rxPropertySet->setPropertyValue( TKGet( TK_FillBitmapSizeX ), Any( aGraphicUserIter->maLogicalSize.Width ) );
+                                             rxPropertySet->setPropertyValue( TKGet( TK_FillBitmapSizeY ), Any( aGraphicUserIter->maLogicalSize.Height ) );
+                                         }
+                                     }
+                                     if ( aGraphicUserIter->mxPagePropertySet.is() )
+                                         aGraphicUserIter->mxPagePropertySet->setPropertyValue( TKGet( TK_Background ), Any( rxPropertySet ) );
                                  }
                              }
-                             if ( aGraphicUserIter->mxPagePropertySet.is() )
-                                 aGraphicUserIter->mxPagePropertySet->setPropertyValue( TKGet( TK_Background ), Any( rxPropertySet ) );
 -                            aGraphicUserIter++;
++                            ++aGraphicUserIter;
                          }
                      }
-                     ++aGraphicUserIter;
++                    ++aGraphicIter;
                  }
 -            }			
 -            aGraphicIter++;
 +            }
-             ++aGraphicIter;
          }
      }
      catch ( Exception& )
diff --cc sdext/source/minimizer/makefile.mk
index 152f0b0,4158119..f4474b9
mode 100755,100644..100755
--- a/sdext/source/minimizer/makefile.mk
+++ b/sdext/source/minimizer/makefile.mk
@@@ -98,11 -98,15 +98,15 @@@ COMPONENT_LIBRARIES= 
  COMPONENT_BITMAPS= \
      $(EXTENSIONDIR)$/bitmaps$/opt_16.png \
      $(EXTENSIONDIR)$/bitmaps$/opt_26.png \
 -    $(EXTENSIONDIR)$/bitmaps$/opt_16_h.png \
 -    $(EXTENSIONDIR)$/bitmaps$/opt_26_h.png \
 -    $(EXTENSIONDIR)$/bitmaps$/minimizepresi_80.png \
 -    $(EXTENSIONDIR)$/bitmaps$/minimizepresi_80_h.png
 +    $(EXTENSIONDIR)$/bitmaps$/minimizepresi_80.png
 +
 +COMPONENT_IMAGES=\
 +    $(EXTENSIONDIR)$/bitmaps$/extension_32.png
  
+ COMPONENT_IMAGES=\
+     $(EXTENSIONDIR)$/bitmaps$/extension_32.png \
+     $(EXTENSIONDIR)$/bitmaps$/extension_32_h.png
+ 
  # rather freestyle or common to all?
  COMPONENT_HELP= \
      $(EXTENSIONDIR)$/help$/help_de.odt \
diff --cc sdext/source/pdfimport/makefile.mk
index 2a9697f,8444086..64accda
mode 100755,100644..100755
--- a/sdext/source/pdfimport/makefile.mk
+++ b/sdext/source/pdfimport/makefile.mk
diff --cc sdext/source/pdfimport/tree/drawtreevisiting.cxx
index 155c569,5c8d359..7249831
--- a/sdext/source/pdfimport/tree/drawtreevisiting.cxx
+++ b/sdext/source/pdfimport/tree/drawtreevisiting.cxx
@@@ -37,17 -36,19 +37,17 @@@
  #include "drawtreevisiting.hxx"
  #include "genericelements.hxx"
  
- #include <basegfx/polygon/b2dpolypolygontools.hxx>
- #include <basegfx/range/b2drange.hxx>
+ #include "basegfx/polygon/b2dpolypolygontools.hxx"
+ #include "basegfx/range/b2drange.hxx"
  
 -#include "com/sun/star/i18n/XBreakIterator.hpp"
 -#include "com/sun/star/lang/XMultiServiceFactory.hpp"
 +#include <com/sun/star/i18n/XBreakIterator.hpp>
 +#include <com/sun/star/lang/XMultiServiceFactory.hpp>
  #include "comphelper/processfactory.hxx"
 -#include "com/sun/star/i18n/ScriptType.hpp"
 +#include <com/sun/star/i18n/ScriptType.hpp>
+ #include "com/sun/star/i18n/DirectionProperty.hpp"
  #include <string.h>
  
  using namespace ::com::sun::star;
--using namespace ::com::sun::star;
  using namespace ::com::sun::star::lang;
  using namespace ::com::sun::star::i18n;
  using namespace ::com::sun::star::uno;
@@@ -120,6 -133,26 +132,26 @@@ void DrawXmlEmitter::visit( TextElement
  
      rtl::OUString str(elem.Text.getStr());
  
+     // Check for RTL
+     bool isRTL = false;
+     Reference< i18n::XCharacterClassification > xCC( GetCharacterClassification() );
+     if( xCC.is() )
+     {
+         for(int i=1; i< elem.Text.getLength(); i++)
+         {
+             sal_Int16 nType = xCC->getCharacterDirection( str, i );
+             if ( nType == ::com::sun::star::i18n::DirectionProperty_RIGHT_TO_LEFT           ||
+                  nType == ::com::sun::star::i18n::DirectionProperty_RIGHT_TO_LEFT_ARABIC    ||
+                  nType == ::com::sun::star::i18n::DirectionProperty_RIGHT_TO_LEFT_EMBEDDING ||
 -                 nType == ::com::sun::star::i18n::DirectionProperty_RIGHT_TO_LEFT_OVERRIDE 
++                 nType == ::com::sun::star::i18n::DirectionProperty_RIGHT_TO_LEFT_OVERRIDE
+                 )
+                 isRTL = true;
+         }
+     }
+ 
+     if (isRTL)  // If so, reverse string
+         str = m_rProcessor.mirrorString( str );
+ 
      m_rEmitContext.rEmitter.beginTag( "text:span", aProps );
  
      for(int i=0; i< elem.Text.getLength(); i++)
diff --cc sdext/source/pdfimport/tree/drawtreevisiting.hxx
index 1671b93,9931d4b..bd25cda
--- a/sdext/source/pdfimport/tree/drawtreevisiting.hxx
+++ b/sdext/source/pdfimport/tree/drawtreevisiting.hxx
@@@ -30,9 -29,11 +30,10 @@@
  #define INCLUDED_PDFI_DRAWTREEVISITING_HXX
  
  #include "treevisiting.hxx"
- #include <com/sun/star/i18n/XBreakIterator.hpp>
- #include <com/sun/star/lang/XMultiServiceFactory.hpp>
- #include <com/sun/star/uno/XComponentContext.hpp>
 -
+ #include "com/sun/star/i18n/XBreakIterator.hpp"
+ #include "com/sun/star/i18n/XCharacterClassification.hpp"
+ #include "com/sun/star/lang/XMultiServiceFactory.hpp"
+ #include "com/sun/star/uno/XComponentContext.hpp"
  
  namespace pdfi
  {
diff --cc sdext/source/pdfimport/tree/pdfiprocessor.cxx
index cd94b97,6c2e410..806f24a
--- a/sdext/source/pdfimport/tree/pdfiprocessor.cxx
+++ b/sdext/source/pdfimport/tree/pdfiprocessor.cxx
@@@ -1046,7 -1046,415 +1047,417 @@@ void PDFIProcessor::sortElements( Eleme
              // over and out.
              return outRect;
          }
+         
+ // helper method: get a mirrored string
+ rtl::OUString PDFIProcessor::mirrorString( const rtl::OUString& i_rString )
+ {
+     if( ! m_xMirrorMapper.is() && ! m_bMirrorMapperTried )
+     {
+         m_bMirrorMapperTried = true;
+         uno::Reference< lang::XMultiComponentFactory > xMSF(  m_xContext->getServiceManager(), uno::UNO_SET_THROW );
+         uno::Reference < uno::XInterface > xInterface = xMSF->createInstanceWithContext(::rtl::OUString::createFromAscii("com.sun.star.awt.StringMirror"), m_xContext);
+         m_xMirrorMapper = uno::Reference< util::XStringMapping >( xInterface, uno::UNO_QUERY );
+         #if OSL_DEBUG_LEVEL > 1
+         if( m_xMirrorMapper.is() )
+             fprintf( stderr, "using mirror mapper service\n" );
+         #endif
+     }
+     if( m_xMirrorMapper.is() )
+     {
+         uno::Sequence< rtl::OUString > aSeq( 1 );
+         aSeq.getArray()[0] = i_rString;
+         m_xMirrorMapper->mapStrings( aSeq );
+         return  aSeq[0];
+     }
+ 
+     prepareMirrorMap();
+     sal_Int32 nLen = i_rString.getLength();
+     rtl::OUStringBuffer aRet( nLen );
+     for(int i = nLen - 1; i >= 0; i--)
+     {
+         sal_Unicode cChar = i_rString[ i ];
+         aRet.append( m_aMirrorMap[cChar] );
+     }
+     return aRet.makeStringAndClear();
+ }
+ 
+ void PDFIProcessor::prepareMirrorMap()
+ {
+     if( m_aMirrorMap.empty() )
+     {
+         #if OSL_DEBUG_LEVEL > 1
+         fprintf( stderr, "falling back to static mirror list\n" );
+         #endif
+     
+         m_aMirrorMap.reserve( 0x10000 );
+         for( int i = 0; i < 0x10000; i++ )
+             m_aMirrorMap.push_back( sal_Unicode(i) );
+         
+         m_aMirrorMap[ 0x0028 ] = 0x0029; // LEFT PARENTHESIS
+         m_aMirrorMap[ 0x0029 ] = 0x0028; // RIGHT PARENTHESIS
+         m_aMirrorMap[ 0x003C ] = 0x003E; // LESS-THAN SIGN
+         m_aMirrorMap[ 0x003E ] = 0x003C; // GREATER-THAN SIGN
+         m_aMirrorMap[ 0x005B ] = 0x005D; // LEFT SQUARE BRACKET
+         m_aMirrorMap[ 0x005D ] = 0x005B; // RIGHT SQUARE BRACKET
+         m_aMirrorMap[ 0x007B ] = 0x007D; // LEFT CURLY BRACKET
+         m_aMirrorMap[ 0x007D ] = 0x007B; // RIGHT CURLY BRACKET
+         m_aMirrorMap[ 0x00AB ] = 0x00BB; // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+         m_aMirrorMap[ 0x00BB ] = 0x00AB; // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+         m_aMirrorMap[ 0x0F3A ] = 0x0F3B; // TIBETAN MARK GUG RTAGS GYON
+         m_aMirrorMap[ 0x0F3B ] = 0x0F3A; // TIBETAN MARK GUG RTAGS GYAS
+         m_aMirrorMap[ 0x0F3C ] = 0x0F3D; // TIBETAN MARK ANG KHANG GYON
+         m_aMirrorMap[ 0x0F3D ] = 0x0F3C; // TIBETAN MARK ANG KHANG GYAS
+         m_aMirrorMap[ 0x169B ] = 0x169C; // OGHAM FEATHER MARK
+         m_aMirrorMap[ 0x169C ] = 0x169B; // OGHAM REVERSED FEATHER MARK
+         m_aMirrorMap[ 0x2039 ] = 0x203A; // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+         m_aMirrorMap[ 0x203A ] = 0x2039; // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+         m_aMirrorMap[ 0x2045 ] = 0x2046; // LEFT SQUARE BRACKET WITH QUILL
+         m_aMirrorMap[ 0x2046 ] = 0x2045; // RIGHT SQUARE BRACKET WITH QUILL
+         m_aMirrorMap[ 0x207D ] = 0x207E; // SUPERSCRIPT LEFT PARENTHESIS
+         m_aMirrorMap[ 0x207E ] = 0x207D; // SUPERSCRIPT RIGHT PARENTHESIS
+         m_aMirrorMap[ 0x208D ] = 0x208E; // SUBSCRIPT LEFT PARENTHESIS
+         m_aMirrorMap[ 0x208E ] = 0x208D; // SUBSCRIPT RIGHT PARENTHESIS
+         m_aMirrorMap[ 0x2208 ] = 0x220B; // ELEMENT OF
+         m_aMirrorMap[ 0x2209 ] = 0x220C; // NOT AN ELEMENT OF
+         m_aMirrorMap[ 0x220A ] = 0x220D; // SMALL ELEMENT OF
+         m_aMirrorMap[ 0x220B ] = 0x2208; // CONTAINS AS MEMBER
+         m_aMirrorMap[ 0x220C ] = 0x2209; // DOES NOT CONTAIN AS MEMBER
+         m_aMirrorMap[ 0x220D ] = 0x220A; // SMALL CONTAINS AS MEMBER
+         m_aMirrorMap[ 0x2215 ] = 0x29F5; // DIVISION SLASH
+         m_aMirrorMap[ 0x223C ] = 0x223D; // TILDE OPERATOR
+         m_aMirrorMap[ 0x223D ] = 0x223C; // REVERSED TILDE
+         m_aMirrorMap[ 0x2243 ] = 0x22CD; // ASYMPTOTICALLY EQUAL TO
+         m_aMirrorMap[ 0x2252 ] = 0x2253; // APPROXIMATELY EQUAL TO OR THE IMAGE OF
+         m_aMirrorMap[ 0x2253 ] = 0x2252; // IMAGE OF OR APPROXIMATELY EQUAL TO
+         m_aMirrorMap[ 0x2254 ] = 0x2255; // COLON EQUALS
+         m_aMirrorMap[ 0x2255 ] = 0x2254; // EQUALS COLON
+         m_aMirrorMap[ 0x2264 ] = 0x2265; // LESS-THAN OR EQUAL TO
+         m_aMirrorMap[ 0x2265 ] = 0x2264; // GREATER-THAN OR EQUAL TO
+         m_aMirrorMap[ 0x2266 ] = 0x2267; // LESS-THAN OVER EQUAL TO
+         m_aMirrorMap[ 0x2267 ] = 0x2266; // GREATER-THAN OVER EQUAL TO
+         m_aMirrorMap[ 0x2268 ] = 0x2269; // [BEST FIT] LESS-THAN BUT NOT EQUAL TO
+         m_aMirrorMap[ 0x2269 ] = 0x2268; // [BEST FIT] GREATER-THAN BUT NOT EQUAL TO
+         m_aMirrorMap[ 0x226A ] = 0x226B; // MUCH LESS-THAN
+         m_aMirrorMap[ 0x226B ] = 0x226A; // MUCH GREATER-THAN
+         m_aMirrorMap[ 0x226E ] = 0x226F; // [BEST FIT] NOT LESS-THAN
+         m_aMirrorMap[ 0x226F ] = 0x226E; // [BEST FIT] NOT GREATER-THAN
+         m_aMirrorMap[ 0x2270 ] = 0x2271; // [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO
+         m_aMirrorMap[ 0x2271 ] = 0x2270; // [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO
+         m_aMirrorMap[ 0x2272 ] = 0x2273; // [BEST FIT] LESS-THAN OR EQUIVALENT TO
+         m_aMirrorMap[ 0x2273 ] = 0x2272; // [BEST FIT] GREATER-THAN OR EQUIVALENT TO
+         m_aMirrorMap[ 0x2274 ] = 0x2275; // [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO
+         m_aMirrorMap[ 0x2275 ] = 0x2274; // [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO
+         m_aMirrorMap[ 0x2276 ] = 0x2277; // LESS-THAN OR GREATER-THAN
+         m_aMirrorMap[ 0x2277 ] = 0x2276; // GREATER-THAN OR LESS-THAN
+         m_aMirrorMap[ 0x2278 ] = 0x2279; // [BEST FIT] NEITHER LESS-THAN NOR GREATER-THAN
+         m_aMirrorMap[ 0x2279 ] = 0x2278; // [BEST FIT] NEITHER GREATER-THAN NOR LESS-THAN
+         m_aMirrorMap[ 0x227A ] = 0x227B; // PRECEDES
+         m_aMirrorMap[ 0x227B ] = 0x227A; // SUCCEEDS
+         m_aMirrorMap[ 0x227C ] = 0x227D; // PRECEDES OR EQUAL TO
+         m_aMirrorMap[ 0x227D ] = 0x227C; // SUCCEEDS OR EQUAL TO
+         m_aMirrorMap[ 0x227E ] = 0x227F; // [BEST FIT] PRECEDES OR EQUIVALENT TO
+         m_aMirrorMap[ 0x227F ] = 0x227E; // [BEST FIT] SUCCEEDS OR EQUIVALENT TO
+         m_aMirrorMap[ 0x2280 ] = 0x2281; // [BEST FIT] DOES NOT PRECEDE
+         m_aMirrorMap[ 0x2281 ] = 0x2280; // [BEST FIT] DOES NOT SUCCEED
+         m_aMirrorMap[ 0x2282 ] = 0x2283; // SUBSET OF
+         m_aMirrorMap[ 0x2283 ] = 0x2282; // SUPERSET OF
+         m_aMirrorMap[ 0x2284 ] = 0x2285; // [BEST FIT] NOT A SUBSET OF
+         m_aMirrorMap[ 0x2285 ] = 0x2284; // [BEST FIT] NOT A SUPERSET OF
+         m_aMirrorMap[ 0x2286 ] = 0x2287; // SUBSET OF OR EQUAL TO
+         m_aMirrorMap[ 0x2287 ] = 0x2286; // SUPERSET OF OR EQUAL TO
+         m_aMirrorMap[ 0x2288 ] = 0x2289; // [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO
+         m_aMirrorMap[ 0x2289 ] = 0x2288; // [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO
+         m_aMirrorMap[ 0x228A ] = 0x228B; // [BEST FIT] SUBSET OF WITH NOT EQUAL TO
+         m_aMirrorMap[ 0x228B ] = 0x228A; // [BEST FIT] SUPERSET OF WITH NOT EQUAL TO
+         m_aMirrorMap[ 0x228F ] = 0x2290; // SQUARE IMAGE OF
+         m_aMirrorMap[ 0x2290 ] = 0x228F; // SQUARE ORIGINAL OF
+         m_aMirrorMap[ 0x2291 ] = 0x2292; // SQUARE IMAGE OF OR EQUAL TO
+         m_aMirrorMap[ 0x2292 ] = 0x2291; // SQUARE ORIGINAL OF OR EQUAL TO
+         m_aMirrorMap[ 0x2298 ] = 0x29B8; // CIRCLED DIVISION SLASH
+         m_aMirrorMap[ 0x22A2 ] = 0x22A3; // RIGHT TACK
+         m_aMirrorMap[ 0x22A3 ] = 0x22A2; // LEFT TACK
+         m_aMirrorMap[ 0x22A6 ] = 0x2ADE; // ASSERTION
+         m_aMirrorMap[ 0x22A8 ] = 0x2AE4; // TRUE
+         m_aMirrorMap[ 0x22A9 ] = 0x2AE3; // FORCES
+         m_aMirrorMap[ 0x22AB ] = 0x2AE5; // DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+         m_aMirrorMap[ 0x22B0 ] = 0x22B1; // PRECEDES UNDER RELATION
+         m_aMirrorMap[ 0x22B1 ] = 0x22B0; // SUCCEEDS UNDER RELATION
+         m_aMirrorMap[ 0x22B2 ] = 0x22B3; // NORMAL SUBGROUP OF
+         m_aMirrorMap[ 0x22B3 ] = 0x22B2; // CONTAINS AS NORMAL SUBGROUP
+         m_aMirrorMap[ 0x22B4 ] = 0x22B5; // NORMAL SUBGROUP OF OR EQUAL TO
+         m_aMirrorMap[ 0x22B5 ] = 0x22B4; // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+         m_aMirrorMap[ 0x22B6 ] = 0x22B7; // ORIGINAL OF
+         m_aMirrorMap[ 0x22B7 ] = 0x22B6; // IMAGE OF
+         m_aMirrorMap[ 0x22C9 ] = 0x22CA; // LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+         m_aMirrorMap[ 0x22CA ] = 0x22C9; // RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+         m_aMirrorMap[ 0x22CB ] = 0x22CC; // LEFT SEMIDIRECT PRODUCT
+         m_aMirrorMap[ 0x22CC ] = 0x22CB; // RIGHT SEMIDIRECT PRODUCT
+         m_aMirrorMap[ 0x22CD ] = 0x2243; // REVERSED TILDE EQUALS
+         m_aMirrorMap[ 0x22D0 ] = 0x22D1; // DOUBLE SUBSET
+         m_aMirrorMap[ 0x22D1 ] = 0x22D0; // DOUBLE SUPERSET
+         m_aMirrorMap[ 0x22D6 ] = 0x22D7; // LESS-THAN WITH DOT
+         m_aMirrorMap[ 0x22D7 ] = 0x22D6; // GREATER-THAN WITH DOT
+         m_aMirrorMap[ 0x22D8 ] = 0x22D9; // VERY MUCH LESS-THAN
+         m_aMirrorMap[ 0x22D9 ] = 0x22D8; // VERY MUCH GREATER-THAN
+         m_aMirrorMap[ 0x22DA ] = 0x22DB; // LESS-THAN EQUAL TO OR GREATER-THAN
+         m_aMirrorMap[ 0x22DB ] = 0x22DA; // GREATER-THAN EQUAL TO OR LESS-THAN
+         m_aMirrorMap[ 0x22DC ] = 0x22DD; // EQUAL TO OR LESS-THAN
+         m_aMirrorMap[ 0x22DD ] = 0x22DC; // EQUAL TO OR GREATER-THAN
+         m_aMirrorMap[ 0x22DE ] = 0x22DF; // EQUAL TO OR PRECEDES
+         m_aMirrorMap[ 0x22DF ] = 0x22DE; // EQUAL TO OR SUCCEEDS
+         m_aMirrorMap[ 0x22E0 ] = 0x22E1; // [BEST FIT] DOES NOT PRECEDE OR EQUAL
+         m_aMirrorMap[ 0x22E1 ] = 0x22E0; // [BEST FIT] DOES NOT SUCCEED OR EQUAL
+         m_aMirrorMap[ 0x22E2 ] = 0x22E3; // [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO
+         m_aMirrorMap[ 0x22E3 ] = 0x22E2; // [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO
+         m_aMirrorMap[ 0x22E4 ] = 0x22E5; // [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO
+         m_aMirrorMap[ 0x22E5 ] = 0x22E4; // [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO
+         m_aMirrorMap[ 0x22E6 ] = 0x22E7; // [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO
+         m_aMirrorMap[ 0x22E7 ] = 0x22E6; // [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO
+         m_aMirrorMap[ 0x22E8 ] = 0x22E9; // [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO
+         m_aMirrorMap[ 0x22E9 ] = 0x22E8; // [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO
+         m_aMirrorMap[ 0x22EA ] = 0x22EB; // [BEST FIT] NOT NORMAL SUBGROUP OF
+         m_aMirrorMap[ 0x22EB ] = 0x22EA; // [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP
+         m_aMirrorMap[ 0x22EC ] = 0x22ED; // [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO
+         m_aMirrorMap[ 0x22ED ] = 0x22EC; // [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+         m_aMirrorMap[ 0x22F0 ] = 0x22F1; // UP RIGHT DIAGONAL ELLIPSIS
+         m_aMirrorMap[ 0x22F1 ] = 0x22F0; // DOWN RIGHT DIAGONAL ELLIPSIS
+         m_aMirrorMap[ 0x22F2 ] = 0x22FA; // ELEMENT OF WITH LONG HORIZONTAL STROKE
+         m_aMirrorMap[ 0x22F3 ] = 0x22FB; // ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+         m_aMirrorMap[ 0x22F4 ] = 0x22FC; // SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+         m_aMirrorMap[ 0x22F6 ] = 0x22FD; // ELEMENT OF WITH OVERBAR
+         m_aMirrorMap[ 0x22F7 ] = 0x22FE; // SMALL ELEMENT OF WITH OVERBAR
+         m_aMirrorMap[ 0x22FA ] = 0x22F2; // CONTAINS WITH LONG HORIZONTAL STROKE
+         m_aMirrorMap[ 0x22FB ] = 0x22F3; // CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+         m_aMirrorMap[ 0x22FC ] = 0x22F4; // SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+         m_aMirrorMap[ 0x22FD ] = 0x22F6; // CONTAINS WITH OVERBAR
+         m_aMirrorMap[ 0x22FE ] = 0x22F7; // SMALL CONTAINS WITH OVERBAR
+         m_aMirrorMap[ 0x2308 ] = 0x2309; // LEFT CEILING
+         m_aMirrorMap[ 0x2309 ] = 0x2308; // RIGHT CEILING
+         m_aMirrorMap[ 0x230A ] = 0x230B; // LEFT FLOOR
+         m_aMirrorMap[ 0x230B ] = 0x230A; // RIGHT FLOOR
+         m_aMirrorMap[ 0x2329 ] = 0x232A; // LEFT-POINTING ANGLE BRACKET
+         m_aMirrorMap[ 0x232A ] = 0x2329; // RIGHT-POINTING ANGLE BRACKET
+         m_aMirrorMap[ 0x2768 ] = 0x2769; // MEDIUM LEFT PARENTHESIS ORNAMENT
+         m_aMirrorMap[ 0x2769 ] = 0x2768; // MEDIUM RIGHT PARENTHESIS ORNAMENT
+         m_aMirrorMap[ 0x276A ] = 0x276B; // MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+         m_aMirrorMap[ 0x276B ] = 0x276A; // MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+         m_aMirrorMap[ 0x276C ] = 0x276D; // MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+         m_aMirrorMap[ 0x276D ] = 0x276C; // MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+         m_aMirrorMap[ 0x276E ] = 0x276F; // HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+         m_aMirrorMap[ 0x276F ] = 0x276E; // HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+         m_aMirrorMap[ 0x2770 ] = 0x2771; // HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+         m_aMirrorMap[ 0x2771 ] = 0x2770; // HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+         m_aMirrorMap[ 0x2772 ] = 0x2773; // LIGHT LEFT TORTOISE SHELL BRACKET
+         m_aMirrorMap[ 0x2773 ] = 0x2772; // LIGHT RIGHT TORTOISE SHELL BRACKET
+         m_aMirrorMap[ 0x2774 ] = 0x2775; // MEDIUM LEFT CURLY BRACKET ORNAMENT
+         m_aMirrorMap[ 0x2775 ] = 0x2774; // MEDIUM RIGHT CURLY BRACKET ORNAMENT
+         m_aMirrorMap[ 0x27C3 ] = 0x27C4; // OPEN SUBSET
+         m_aMirrorMap[ 0x27C4 ] = 0x27C3; // OPEN SUPERSET
+         m_aMirrorMap[ 0x27C5 ] = 0x27C6; // LEFT S-SHAPED BAG DELIMITER
+         m_aMirrorMap[ 0x27C6 ] = 0x27C5; // RIGHT S-SHAPED BAG DELIMITER
+         m_aMirrorMap[ 0x27C8 ] = 0x27C9; // REVERSE SOLIDUS PRECEDING SUBSET
+         m_aMirrorMap[ 0x27C9 ] = 0x27C8; // SUPERSET PRECEDING SOLIDUS
+         m_aMirrorMap[ 0x27D5 ] = 0x27D6; // LEFT OUTER JOIN
+         m_aMirrorMap[ 0x27D6 ] = 0x27D5; // RIGHT OUTER JOIN
+         m_aMirrorMap[ 0x27DD ] = 0x27DE; // LONG RIGHT TACK
+         m_aMirrorMap[ 0x27DE ] = 0x27DD; // LONG LEFT TACK
+         m_aMirrorMap[ 0x27E2 ] = 0x27E3; // WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+         m_aMirrorMap[ 0x27E3 ] = 0x27E2; // WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+         m_aMirrorMap[ 0x27E4 ] = 0x27E5; // WHITE SQUARE WITH LEFTWARDS TICK
+         m_aMirrorMap[ 0x27E5 ] = 0x27E4; // WHITE SQUARE WITH RIGHTWARDS TICK
+         m_aMirrorMap[ 0x27E6 ] = 0x27E7; // MATHEMATICAL LEFT WHITE SQUARE BRACKET
+         m_aMirrorMap[ 0x27E7 ] = 0x27E6; // MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+         m_aMirrorMap[ 0x27E8 ] = 0x27E9; // MATHEMATICAL LEFT ANGLE BRACKET
+         m_aMirrorMap[ 0x27E9 ] = 0x27E8; // MATHEMATICAL RIGHT ANGLE BRACKET
+         m_aMirrorMap[ 0x27EA ] = 0x27EB; // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+         m_aMirrorMap[ 0x27EB ] = 0x27EA; // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+         m_aMirrorMap[ 0x27EC ] = 0x27ED; // MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+         m_aMirrorMap[ 0x27ED ] = 0x27EC; // MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+         m_aMirrorMap[ 0x27EE ] = 0x27EF; // MATHEMATICAL LEFT FLATTENED PARENTHESIS
+         m_aMirrorMap[ 0x27EF ] = 0x27EE; // MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+         m_aMirrorMap[ 0x2983 ] = 0x2984; // LEFT WHITE CURLY BRACKET
+         m_aMirrorMap[ 0x2984 ] = 0x2983; // RIGHT WHITE CURLY BRACKET
+         m_aMirrorMap[ 0x2985 ] = 0x2986; // LEFT WHITE PARENTHESIS
+         m_aMirrorMap[ 0x2986 ] = 0x2985; // RIGHT WHITE PARENTHESIS
+         m_aMirrorMap[ 0x2987 ] = 0x2988; // Z NOTATION LEFT IMAGE BRACKET
+         m_aMirrorMap[ 0x2988 ] = 0x2987; // Z NOTATION RIGHT IMAGE BRACKET
+         m_aMirrorMap[ 0x2989 ] = 0x298A; // Z NOTATION LEFT BINDING BRACKET
+         m_aMirrorMap[ 0x298A ] = 0x2989; // Z NOTATION RIGHT BINDING BRACKET
+         m_aMirrorMap[ 0x298B ] = 0x298C; // LEFT SQUARE BRACKET WITH UNDERBAR
+         m_aMirrorMap[ 0x298C ] = 0x298B; // RIGHT SQUARE BRACKET WITH UNDERBAR
+         m_aMirrorMap[ 0x298D ] = 0x2990; // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+         m_aMirrorMap[ 0x298E ] = 0x298F; // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+         m_aMirrorMap[ 0x298F ] = 0x298E; // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+         m_aMirrorMap[ 0x2990 ] = 0x298D; // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+         m_aMirrorMap[ 0x2991 ] = 0x2992; // LEFT ANGLE BRACKET WITH DOT
+         m_aMirrorMap[ 0x2992 ] = 0x2991; // RIGHT ANGLE BRACKET WITH DOT
+         m_aMirrorMap[ 0x2993 ] = 0x2994; // LEFT ARC LESS-THAN BRACKET
+         m_aMirrorMap[ 0x2994 ] = 0x2993; // RIGHT ARC GREATER-THAN BRACKET
+         m_aMirrorMap[ 0x2995 ] = 0x2996; // DOUBLE LEFT ARC GREATER-THAN BRACKET
+         m_aMirrorMap[ 0x2996 ] = 0x2995; // DOUBLE RIGHT ARC LESS-THAN BRACKET
+         m_aMirrorMap[ 0x2997 ] = 0x2998; // LEFT BLACK TORTOISE SHELL BRACKET
+         m_aMirrorMap[ 0x2998 ] = 0x2997; // RIGHT BLACK TORTOISE SHELL BRACKET
+         m_aMirrorMap[ 0x29B8 ] = 0x2298; // CIRCLED REVERSE SOLIDUS
+         m_aMirrorMap[ 0x29C0 ] = 0x29C1; // CIRCLED LESS-THAN
+         m_aMirrorMap[ 0x29C1 ] = 0x29C0; // CIRCLED GREATER-THAN
+         m_aMirrorMap[ 0x29C4 ] = 0x29C5; // SQUARED RISING DIAGONAL SLASH
+         m_aMirrorMap[ 0x29C5 ] = 0x29C4; // SQUARED FALLING DIAGONAL SLASH
+         m_aMirrorMap[ 0x29CF ] = 0x29D0; // LEFT TRIANGLE BESIDE VERTICAL BAR
+         m_aMirrorMap[ 0x29D0 ] = 0x29CF; // VERTICAL BAR BESIDE RIGHT TRIANGLE
+         m_aMirrorMap[ 0x29D1 ] = 0x29D2; // BOWTIE WITH LEFT HALF BLACK
+         m_aMirrorMap[ 0x29D2 ] = 0x29D1; // BOWTIE WITH RIGHT HALF BLACK
+         m_aMirrorMap[ 0x29D4 ] = 0x29D5; // TIMES WITH LEFT HALF BLACK
+         m_aMirrorMap[ 0x29D5 ] = 0x29D4; // TIMES WITH RIGHT HALF BLACK
+         m_aMirrorMap[ 0x29D8 ] = 0x29D9; // LEFT WIGGLY FENCE
+         m_aMirrorMap[ 0x29D9 ] = 0x29D8; // RIGHT WIGGLY FENCE
+         m_aMirrorMap[ 0x29DA ] = 0x29DB; // LEFT DOUBLE WIGGLY FENCE
+         m_aMirrorMap[ 0x29DB ] = 0x29DA; // RIGHT DOUBLE WIGGLY FENCE
+         m_aMirrorMap[ 0x29F5 ] = 0x2215; // REVERSE SOLIDUS OPERATOR
+         m_aMirrorMap[ 0x29F8 ] = 0x29F9; // BIG SOLIDUS
+         m_aMirrorMap[ 0x29F9 ] = 0x29F8; // BIG REVERSE SOLIDUS
+         m_aMirrorMap[ 0x29FC ] = 0x29FD; // LEFT-POINTING CURVED ANGLE BRACKET
+         m_aMirrorMap[ 0x29FD ] = 0x29FC; // RIGHT-POINTING CURVED ANGLE BRACKET
+         m_aMirrorMap[ 0x2A2B ] = 0x2A2C; // MINUS SIGN WITH FALLING DOTS
+         m_aMirrorMap[ 0x2A2C ] = 0x2A2B; // MINUS SIGN WITH RISING DOTS
+         m_aMirrorMap[ 0x2A2D ] = 0x2A2E; // PLUS SIGN IN LEFT HALF CIRCLE
+         m_aMirrorMap[ 0x2A2E ] = 0x2A2D; // PLUS SIGN IN RIGHT HALF CIRCLE
+         m_aMirrorMap[ 0x2A34 ] = 0x2A35; // MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+         m_aMirrorMap[ 0x2A35 ] = 0x2A34; // MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+         m_aMirrorMap[ 0x2A3C ] = 0x2A3D; // INTERIOR PRODUCT
+         m_aMirrorMap[ 0x2A3D ] = 0x2A3C; // RIGHTHAND INTERIOR PRODUCT
+         m_aMirrorMap[ 0x2A64 ] = 0x2A65; // Z NOTATION DOMAIN ANTIRESTRICTION
+         m_aMirrorMap[ 0x2A65 ] = 0x2A64; // Z NOTATION RANGE ANTIRESTRICTION
+         m_aMirrorMap[ 0x2A79 ] = 0x2A7A; // LESS-THAN WITH CIRCLE INSIDE
+         m_aMirrorMap[ 0x2A7A ] = 0x2A79; // GREATER-THAN WITH CIRCLE INSIDE
+         m_aMirrorMap[ 0x2A7D ] = 0x2A7E; // LESS-THAN OR SLANTED EQUAL TO
+         m_aMirrorMap[ 0x2A7E ] = 0x2A7D; // GREATER-THAN OR SLANTED EQUAL TO
+         m_aMirrorMap[ 0x2A7F ] = 0x2A80; // LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+         m_aMirrorMap[ 0x2A80 ] = 0x2A7F; // GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+         m_aMirrorMap[ 0x2A81 ] = 0x2A82; // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+         m_aMirrorMap[ 0x2A82 ] = 0x2A81; // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+         m_aMirrorMap[ 0x2A83 ] = 0x2A84; // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+         m_aMirrorMap[ 0x2A84 ] = 0x2A83; // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+         m_aMirrorMap[ 0x2A8B ] = 0x2A8C; // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+         m_aMirrorMap[ 0x2A8C ] = 0x2A8B; // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+         m_aMirrorMap[ 0x2A91 ] = 0x2A92; // LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+         m_aMirrorMap[ 0x2A92 ] = 0x2A91; // GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+         m_aMirrorMap[ 0x2A93 ] = 0x2A94; // LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+         m_aMirrorMap[ 0x2A94 ] = 0x2A93; // GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+         m_aMirrorMap[ 0x2A95 ] = 0x2A96; // SLANTED EQUAL TO OR LESS-THAN
+         m_aMirrorMap[ 0x2A96 ] = 0x2A95; // SLANTED EQUAL TO OR GREATER-THAN
+         m_aMirrorMap[ 0x2A97 ] = 0x2A98; // SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+         m_aMirrorMap[ 0x2A98 ] = 0x2A97; // SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+         m_aMirrorMap[ 0x2A99 ] = 0x2A9A; // DOUBLE-LINE EQUAL TO OR LESS-THAN
+         m_aMirrorMap[ 0x2A9A ] = 0x2A99; // DOUBLE-LINE EQUAL TO OR GREATER-THAN
+         m_aMirrorMap[ 0x2A9B ] = 0x2A9C; // DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+         m_aMirrorMap[ 0x2A9C ] = 0x2A9B; // DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+         m_aMirrorMap[ 0x2AA1 ] = 0x2AA2; // DOUBLE NESTED LESS-THAN
+         m_aMirrorMap[ 0x2AA2 ] = 0x2AA1; // DOUBLE NESTED GREATER-THAN
+         m_aMirrorMap[ 0x2AA6 ] = 0x2AA7; // LESS-THAN CLOSED BY CURVE
+         m_aMirrorMap[ 0x2AA7 ] = 0x2AA6; // GREATER-THAN CLOSED BY CURVE
+         m_aMirrorMap[ 0x2AA8 ] = 0x2AA9; // LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+         m_aMirrorMap[ 0x2AA9 ] = 0x2AA8; // GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+         m_aMirrorMap[ 0x2AAA ] = 0x2AAB; // SMALLER THAN
+         m_aMirrorMap[ 0x2AAB ] = 0x2AAA; // LARGER THAN
+         m_aMirrorMap[ 0x2AAC ] = 0x2AAD; // SMALLER THAN OR EQUAL TO
+         m_aMirrorMap[ 0x2AAD ] = 0x2AAC; // LARGER THAN OR EQUAL TO
+         m_aMirrorMap[ 0x2AAF ] = 0x2AB0; // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+         m_aMirrorMap[ 0x2AB0 ] = 0x2AAF; // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+         m_aMirrorMap[ 0x2AB3 ] = 0x2AB4; // PRECEDES ABOVE EQUALS SIGN
+         m_aMirrorMap[ 0x2AB4 ] = 0x2AB3; // SUCCEEDS ABOVE EQUALS SIGN
+         m_aMirrorMap[ 0x2ABB ] = 0x2ABC; // DOUBLE PRECEDES
+         m_aMirrorMap[ 0x2ABC ] = 0x2ABB; // DOUBLE SUCCEEDS
+         m_aMirrorMap[ 0x2ABD ] = 0x2ABE; // SUBSET WITH DOT
+         m_aMirrorMap[ 0x2ABE ] = 0x2ABD; // SUPERSET WITH DOT
+         m_aMirrorMap[ 0x2ABF ] = 0x2AC0; // SUBSET WITH PLUS SIGN BELOW
+         m_aMirrorMap[ 0x2AC0 ] = 0x2ABF; // SUPERSET WITH PLUS SIGN BELOW
+         m_aMirrorMap[ 0x2AC1 ] = 0x2AC2; // SUBSET WITH MULTIPLICATION SIGN BELOW
+         m_aMirrorMap[ 0x2AC2 ] = 0x2AC1; // SUPERSET WITH MULTIPLICATION SIGN BELOW
+         m_aMirrorMap[ 0x2AC3 ] = 0x2AC4; // SUBSET OF OR EQUAL TO WITH DOT ABOVE
+         m_aMirrorMap[ 0x2AC4 ] = 0x2AC3; // SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+         m_aMirrorMap[ 0x2AC5 ] = 0x2AC6; // SUBSET OF ABOVE EQUALS SIGN
+         m_aMirrorMap[ 0x2AC6 ] = 0x2AC5; // SUPERSET OF ABOVE EQUALS SIGN
+         m_aMirrorMap[ 0x2ACD ] = 0x2ACE; // SQUARE LEFT OPEN BOX OPERATOR
+         m_aMirrorMap[ 0x2ACE ] = 0x2ACD; // SQUARE RIGHT OPEN BOX OPERATOR
+         m_aMirrorMap[ 0x2ACF ] = 0x2AD0; // CLOSED SUBSET
+         m_aMirrorMap[ 0x2AD0 ] = 0x2ACF; // CLOSED SUPERSET
+         m_aMirrorMap[ 0x2AD1 ] = 0x2AD2; // CLOSED SUBSET OR EQUAL TO
+         m_aMirrorMap[ 0x2AD2 ] = 0x2AD1; // CLOSED SUPERSET OR EQUAL TO
+         m_aMirrorMap[ 0x2AD3 ] = 0x2AD4; // SUBSET ABOVE SUPERSET
+         m_aMirrorMap[ 0x2AD4 ] = 0x2AD3; // SUPERSET ABOVE SUBSET
+         m_aMirrorMap[ 0x2AD5 ] = 0x2AD6; // SUBSET ABOVE SUBSET
+         m_aMirrorMap[ 0x2AD6 ] = 0x2AD5; // SUPERSET ABOVE SUPERSET
+         m_aMirrorMap[ 0x2ADE ] = 0x22A6; // SHORT LEFT TACK
+         m_aMirrorMap[ 0x2AE3 ] = 0x22A9; // DOUBLE VERTICAL BAR LEFT TURNSTILE
+         m_aMirrorMap[ 0x2AE4 ] = 0x22A8; // VERTICAL BAR DOUBLE LEFT TURNSTILE
+         m_aMirrorMap[ 0x2AE5 ] = 0x22AB; // DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+         m_aMirrorMap[ 0x2AEC ] = 0x2AED; // DOUBLE STROKE NOT SIGN
+         m_aMirrorMap[ 0x2AED ] = 0x2AEC; // REVERSED DOUBLE STROKE NOT SIGN
+         m_aMirrorMap[ 0x2AF7 ] = 0x2AF8; // TRIPLE NESTED LESS-THAN
+         m_aMirrorMap[ 0x2AF8 ] = 0x2AF7; // TRIPLE NESTED GREATER-THAN
+         m_aMirrorMap[ 0x2AF9 ] = 0x2AFA; // DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+         m_aMirrorMap[ 0x2AFA ] = 0x2AF9; // DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+         m_aMirrorMap[ 0x2E02 ] = 0x2E03; // LEFT SUBSTITUTION BRACKET
+         m_aMirrorMap[ 0x2E03 ] = 0x2E02; // RIGHT SUBSTITUTION BRACKET
+         m_aMirrorMap[ 0x2E04 ] = 0x2E05; // LEFT DOTTED SUBSTITUTION BRACKET
+         m_aMirrorMap[ 0x2E05 ] = 0x2E04; // RIGHT DOTTED SUBSTITUTION BRACKET
+         m_aMirrorMap[ 0x2E09 ] = 0x2E0A; // LEFT TRANSPOSITION BRACKET
+         m_aMirrorMap[ 0x2E0A ] = 0x2E09; // RIGHT TRANSPOSITION BRACKET
+         m_aMirrorMap[ 0x2E0C ] = 0x2E0D; // LEFT RAISED OMISSION BRACKET
+         m_aMirrorMap[ 0x2E0D ] = 0x2E0C; // RIGHT RAISED OMISSION BRACKET
+         m_aMirrorMap[ 0x2E1C ] = 0x2E1D; // LEFT LOW PARAPHRASE BRACKET
+         m_aMirrorMap[ 0x2E1D ] = 0x2E1C; // RIGHT LOW PARAPHRASE BRACKET
+         m_aMirrorMap[ 0x2E20 ] = 0x2E21; // LEFT VERTICAL BAR WITH QUILL
+         m_aMirrorMap[ 0x2E21 ] = 0x2E20; // RIGHT VERTICAL BAR WITH QUILL
+         m_aMirrorMap[ 0x2E22 ] = 0x2E23; // TOP LEFT HALF BRACKET
+         m_aMirrorMap[ 0x2E23 ] = 0x2E22; // TOP RIGHT HALF BRACKET
+         m_aMirrorMap[ 0x2E24 ] = 0x2E25; // BOTTOM LEFT HALF BRACKET
+         m_aMirrorMap[ 0x2E25 ] = 0x2E24; // BOTTOM RIGHT HALF BRACKET
+         m_aMirrorMap[ 0x2E26 ] = 0x2E27; // LEFT SIDEWAYS U BRACKET
+         m_aMirrorMap[ 0x2E27 ] = 0x2E26; // RIGHT SIDEWAYS U BRACKET
+         m_aMirrorMap[ 0x2E28 ] = 0x2E29; // LEFT DOUBLE PARENTHESIS
+         m_aMirrorMap[ 0x2E29 ] = 0x2E28; // RIGHT DOUBLE PARENTHESIS
+         m_aMirrorMap[ 0x3008 ] = 0x3009; // LEFT ANGLE BRACKET
+         m_aMirrorMap[ 0x3009 ] = 0x3008; // RIGHT ANGLE BRACKET
+         m_aMirrorMap[ 0x300A ] = 0x300B; // LEFT DOUBLE ANGLE BRACKET
+         m_aMirrorMap[ 0x300B ] = 0x300A; // RIGHT DOUBLE ANGLE BRACKET
+         m_aMirrorMap[ 0x300C ] = 0x300D; // [BEST FIT] LEFT CORNER BRACKET
+         m_aMirrorMap[ 0x300D ] = 0x300C; // [BEST FIT] RIGHT CORNER BRACKET
+         m_aMirrorMap[ 0x300E ] = 0x300F; // [BEST FIT] LEFT WHITE CORNER BRACKET
+         m_aMirrorMap[ 0x300F ] = 0x300E; // [BEST FIT] RIGHT WHITE CORNER BRACKET
+         m_aMirrorMap[ 0x3010 ] = 0x3011; // LEFT BLACK LENTICULAR BRACKET
+         m_aMirrorMap[ 0x3011 ] = 0x3010; // RIGHT BLACK LENTICULAR BRACKET
+         m_aMirrorMap[ 0x3014 ] = 0x3015; // LEFT TORTOISE SHELL BRACKET
+         m_aMirrorMap[ 0x3015 ] = 0x3014; // RIGHT TORTOISE SHELL BRACKET
+         m_aMirrorMap[ 0x3016 ] = 0x3017; // LEFT WHITE LENTICULAR BRACKET
+         m_aMirrorMap[ 0x3017 ] = 0x3016; // RIGHT WHITE LENTICULAR BRACKET
+         m_aMirrorMap[ 0x3018 ] = 0x3019; // LEFT WHITE TORTOISE SHELL BRACKET
+         m_aMirrorMap[ 0x3019 ] = 0x3018; // RIGHT WHITE TORTOISE SHELL BRACKET
+         m_aMirrorMap[ 0x301A ] = 0x301B; // LEFT WHITE SQUARE BRACKET
+         m_aMirrorMap[ 0x301B ] = 0x301A; // RIGHT WHITE SQUARE BRACKET
+         m_aMirrorMap[ 0xFE59 ] = 0xFE5A; // SMALL LEFT PARENTHESIS
+         m_aMirrorMap[ 0xFE5A ] = 0xFE59; // SMALL RIGHT PARENTHESIS
+         m_aMirrorMap[ 0xFE5B ] = 0xFE5C; // SMALL LEFT CURLY BRACKET
+         m_aMirrorMap[ 0xFE5C ] = 0xFE5B; // SMALL RIGHT CURLY BRACKET
+         m_aMirrorMap[ 0xFE5D ] = 0xFE5E; // SMALL LEFT TORTOISE SHELL BRACKET
+         m_aMirrorMap[ 0xFE5E ] = 0xFE5D; // SMALL RIGHT TORTOISE SHELL BRACKET
+         m_aMirrorMap[ 0xFE64 ] = 0xFE65; // SMALL LESS-THAN SIGN
+         m_aMirrorMap[ 0xFE65 ] = 0xFE64; // SMALL GREATER-THAN SIGN
+         m_aMirrorMap[ 0xFF08 ] = 0xFF09; // FULLWIDTH LEFT PARENTHESIS
+         m_aMirrorMap[ 0xFF09 ] = 0xFF08; // FULLWIDTH RIGHT PARENTHESIS
+         m_aMirrorMap[ 0xFF1C ] = 0xFF1E; // FULLWIDTH LESS-THAN SIGN
+         m_aMirrorMap[ 0xFF1E ] = 0xFF1C; // FULLWIDTH GREATER-THAN SIGN
+         m_aMirrorMap[ 0xFF3B ] = 0xFF3D; // FULLWIDTH LEFT SQUARE BRACKET
+         m_aMirrorMap[ 0xFF3D ] = 0xFF3B; // FULLWIDTH RIGHT SQUARE BRACKET
+         m_aMirrorMap[ 0xFF5B ] = 0xFF5D; // FULLWIDTH LEFT CURLY BRACKET
+         m_aMirrorMap[ 0xFF5D ] = 0xFF5B; // FULLWIDTH RIGHT CURLY BRACKET
+         m_aMirrorMap[ 0xFF5F ] = 0xFF60; // FULLWIDTH LEFT WHITE PARENTHESIS
+         m_aMirrorMap[ 0xFF60 ] = 0xFF5F; // FULLWIDTH RIGHT WHITE PARENTHESIS
+         m_aMirrorMap[ 0xFF62 ] = 0xFF63; // [BEST FIT] HALFWIDTH LEFT CORNER BRACKET
+         m_aMirrorMap[ 0xFF63 ] = 0xFF62; // [BEST FIT] HALFWIDTH RIGHT CORNER BRACKET        
+     }
+ }
  
  }
 +
 +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --cc sdext/source/presenter/description.xml
index 85393f7,19fefec..224f1d1
mode 100755,100644..100755
--- a/sdext/source/presenter/description.xml
+++ b/sdext/source/presenter/description.xml
@@@ -25,6 -31,7 +25,7 @@@
  
    <icon>
      <default xlink:href="bitmaps/extension_32.png" />
 -    <high-contrast xlink:href="bitmaps/extension_32_h.png" />
 +  </icon>
+   </icon>
  
  </description>
diff --cc sdext/source/presenter/makefile.mk
index a72df14,e751a6e..25314e3
mode 100755,100644..100755
--- a/sdext/source/presenter/makefile.mk
+++ b/sdext/source/presenter/makefile.mk
@@@ -42,6 -42,9 +42,7 @@@ MAXLINELENGTH:=10000
  
  PACKAGE=com.sun.PresenterScreen-$(PLATFORMID)
  
 -.IF "$(L10N_framework)"==""
 -.INCLUDE :  $(PRJ)$/util$/makefile.pmk
+ 
  .IF "$(ENABLE_PRESENTER_SCREEN)" == "NO"
  @all:
      @echo "Presenter Screen build disabled."
@@@ -239,8 -245,9 +246,9 @@@ COMPONENT_BITMAPS=												
      $(ZIP1DIR)$/bitmaps$/LabelMouseOverRight.png
  
  COMPONENT_IMAGES=\
 -    $(ZIP1DIR)$/bitmaps$/extension_32.png \
 -    $(ZIP1DIR)$/bitmaps$/extension_32_h.png
 +    $(ZIP1DIR)$/bitmaps$/extension_32.png
 +
+ 
  COMPONENT_MANIFEST= 							\
      $(ZIP1DIR)$/META-INF$/manifest.xml
  
@@@ -352,9 -363,19 +363,19 @@@ $(COMPONENT_LIBRARY) : $(DLLDEST)$/$$(@
          .ENDIF
      .ENDIF         # "$(PACKMS)"!=""
   .ENDIF	#"$(COM)"=="GCC"
 -.ENDIF
 +.ENDIF #"$(OS)$(CPU)"=="WNTI" && "$(WITH_EXTENSION_INTEGRATION)"!="YES"
  
  
+ .IF "$(GUI)" == "WIN" || "$(GUI)" == "WNT"
+ $(PACKLICS) : $(SOLARBINDIR)$/osl$/license$$(@:b:s/_/./:e:s/./_/)$$(@:e).txt
+     @@-$(MKDIRHIER) $(@:d)
+     $(GNUCOPY) $< $@
+ .ELSE
+ $(PACKLICS) : $(SOLARBINDIR)$/osl$/LICENSE$$(@:b:s/_/./:e:s/./_/)$$(@:e)
+     @@-$(MKDIRHIER) $(@:d)
+     $(GNUCOPY) $< $@
+ .ENDIF
+ 
  
  $(ZIP1DIR)/%.xcu : %.xcu
      @@-$(MKDIRHIER) $(@:d)
commit 342b98b208f5c661b56a5fb968e190c5d67454d4
Merge: 6bd808e... be040ef...
Author: Daniel Rentz [dr] <daniel.rentz at oracle.com>
Date:   Mon Dec 27 12:33:29 2010 +0100

    dr77: rebase to DEV300m96

commit be040ef17d6915d58d717d356639ac5d13bcf50c
Merge: 2a04560... 4f3cf3c...
Author: Hans-Joachim Lankenau <hjs at openoffice.org>
Date:   Fri Dec 17 17:08:13 2010 +0100

    CWS-TOOLING: integrate CWS fwk160

commit 2a04560ae11493a4113398d98d9d0f64daef5f3b
Merge: b1d71eb... 6117034...
Author: Hans-Joachim Lankenau <hjs at openoffice.org>
Date:   Fri Dec 17 15:06:49 2010 +0100

    CWS-TOOLING: integrate CWS ause128

commit b1d71ebaa223543c7de463a1399b3b9e345df3b0
Merge: 41c2ecd... 0ee1c12...
Author: Ivo Hinkelmann <ihi at openoffice.org>
Date:   Fri Dec 3 13:41:14 2010 +0100

    CWS-TOOLING: integrate CWS srb1

diff --cc reportbuilder/util/makefile.mk
index c52e858,8106868..8106868
mode 100755,100755..100644
--- a/reportbuilder/util/makefile.mk
+++ b/reportbuilder/util/makefile.mk
commit 41c2ecda89e2609bde453759dabe0ad1bc60f243
Merge: 851916a... 2bc486f...
Author: Ivo Hinkelmann <ihi at openoffice.org>
Date:   Tue Nov 30 16:19:53 2010 +0100

    OOO330

diff --cc sdext/source/minimizer/description.xml
index 64a67a0,a4f172d..a4f172d
mode 100755,100755..100644
--- a/sdext/source/minimizer/description.xml
+++ b/sdext/source/minimizer/description.xml
diff --cc sdext/source/presenter/description.xml
index ede52f0,19fefec..19fefec
mode 100755,100755..100644
--- a/sdext/source/presenter/description.xml
+++ b/sdext/source/presenter/description.xml
commit 611703435bc3d106aaf6429de4eb6dd1724ecd10
Author: Hans-Joachim Lankenau <hjs at openoffice.org>
Date:   Mon Nov 29 18:50:33 2010 +0100

    ause128: #i115689# guard additional dependencies of ZIPnTARGETN

diff --git a/sdext/source/presenter/makefile.mk b/sdext/source/presenter/makefile.mk
index 997d430..e751a6e 100644
--- a/sdext/source/presenter/makefile.mk
+++ b/sdext/source/presenter/makefile.mk
@@ -307,8 +307,11 @@ $(ZIP1DIR)/help/%/com.sun.PresenterScreen-$(PLATFORMID)/presenter.xhp : $(COMMON
     @-$(MKDIRHIER) $(@:d)
     $(TYPE) $< | sed "s/PLATFORMID/$(PLATFORMID)/" | sed 's/@PRESENTEREXTENSIONPRODUCTNAME@/Presenter Console/g' > $@
 
+.IF "$(ZIP1TARGETN)"!=""
 $(ZIP1TARGETN) : $(HELPLINKALLTARGETS)
 
+.ENDIF          # "$(ZIP1TARGETN)"!=""
+
 $(COMPONENT_BITMAPS) : bitmaps$/$$(@:f)
     @-$(MKDIRHIER) $(@:d)
     +$(COPY) $< $@
commit 2bc486fa6b57184eaf919dec7d10531ab471ac6d
Author: obo <obo at openoffice.org>
Date:   Thu Nov 18 14:09:19 2010 +0100

    masterfix OOO330: #i114049# Presentation minimizer 1.0.1 does not install on OOO330m15, #i113990# presenter console does not work with multiple screens

diff --git a/sdext/source/minimizer/description.xml b/sdext/source/minimizer/description.xml
index 64a67a0..a4f172d 100755
--- a/sdext/source/minimizer/description.xml
+++ b/sdext/source/minimizer/description.xml
@@ -17,7 +17,7 @@
         </simple-license>
     </registration>
 
-    <version value="1.0.2"/>
+    <version value="1.0.3"/>
 
     <platform value="UPDATED_SUPPORTED_PLATFORM"/>
 
diff --git a/sdext/source/presenter/description.xml b/sdext/source/presenter/description.xml
index ede52f0..19fefec 100755
--- a/sdext/source/presenter/description.xml
+++ b/sdext/source/presenter/description.xml
@@ -8,7 +8,7 @@
   <identifier value="com.sun.PresenterScreen-UPDATED_PLATFORM" />
 
   <dependencies>
-    <OpenOffice.org-minimal-version value="3.2" dep:name="OpenOffice.org 3.2"/>
+    <OpenOffice.org-minimal-version value="3.3" dep:name="OpenOffice.org 3.3"/>
   </dependencies>
 
   <registration>
commit 4f3cf3c323150752f1451cf2b03e89062e34bb62
Merge: bab6874... 851916a...
Author: Carsten Driesner <cd at openoffice.org>
Date:   Mon Nov 15 13:10:36 2010 +0100

    Rebase to DEV300m93

commit 6bd808e4e051940d89073dc8f0de61718ad20209
Merge: d76ce8c... 0459628...
Author: Daniel Rentz [dr] <daniel.rentz at oracle.com>
Date:   Tue Nov 9 15:15:30 2010 +0100

    dr77: rebase to DEV300m92

commit 851916a7aed07c3f02a1adfebd2b426a17205a23
Merge: 0459628... 2a6d8a4...
Author: Vladimir Glazunov <vg at openoffice.org>
Date:   Mon Nov 8 16:01:31 2010 +0100

    CWS-TOOLING: integrate CWS dba34a

commit bab68744dcbae66adc5f9f1d856232dc290aed7f
Author: Carsten Driesner <cd at openoffice.org>
Date:   Thu Nov 4 15:43:13 2010 +0100

    fwk160: #i107568# Jobs service enhancement to instantiate services only on matching application module context

diff --git a/sdext/source/presenter/registry/data/org/openoffice/Office/Jobs.xcu b/sdext/source/presenter/registry/data/org/openoffice/Office/Jobs.xcu
index ba74332..1241a72 100644
--- a/sdext/source/presenter/registry/data/org/openoffice/Office/Jobs.xcu
+++ b/sdext/source/presenter/registry/data/org/openoffice/Office/Jobs.xcu
@@ -5,6 +5,9 @@
             <prop oor:name="Service">
                 <value>com.sun.star.comp.Draw.framework.PresenterScreenJob</value>
             </prop>
+            <prop oor:name="Context">
+                <value>com.sun.star.presentation.PresentationDocument</value>
+            </prop>
         </node>
     </node>
     <node oor:name="Events">
commit 04596284503033d95949cad2a7bc74b3f9dd0c13
Merge: 579a925... ad184b5...
Author: Vladimir Glazunov <vg at openoffice.org>
Date:   Mon Nov 1 17:13:34 2010 +0100

    CWS-TOOLING: integrate CWS pdfextfix04

commit 579a9259f271833838e4fececb650e86799a24be
Merge: e7a3691... 68d58b6...
Author: Mathias Bauer <mba at openoffice.org>
Date:   Thu Oct 21 15:10:42 2010 +0200

    CWS changehid: resync to m90

commit ad184b5655835a5c50cc7af73095756fbd17639a
Author: Philipp Lohmann [pl] <Philipp.Lohmann at Oracle.COM>
Date:   Wed Oct 20 18:55:03 2010 +0200

    pdfextfix04: update version number

diff --git a/sdext/source/pdfimport/config/description.xml b/sdext/source/pdfimport/config/description.xml
old mode 100755
new mode 100644
index 726b104..4810fd6
--- a/sdext/source/pdfimport/config/description.xml
+++ b/sdext/source/pdfimport/config/description.xml
@@ -16,7 +16,7 @@
         </simple-license>
     </registration>
 
-    <version value="1.0.3" />
+    <version value="1.0.4" />
 
     <platform value="UPDATED_SUPPORTED_PLATFORM" />
 
commit e7b6aa0da7fd03a6a55b609f3d7eccd894573b11
Author: Philipp Lohmann [pl] <Philipp.Lohmann at Oracle.COM>
Date:   Wed Oct 20 18:19:48 2010 +0200

    pdfextfix04: #b6993503# fix uninitialized pointer, range check

diff --git a/xpdf/makefile.mk b/xpdf/makefile.mk
index eef2e01..ee0da3c 100644
--- a/xpdf/makefile.mk
+++ b/xpdf/makefile.mk
@@ -48,7 +48,7 @@ dummy:
 
 TARFILE_NAME=xpdf-3.02
 TARFILE_MD5=599dc4cc65a07ee868cf92a667a913d2
-PATCH_FILES=$(TARFILE_NAME).patch
+PATCH_FILES=$(TARFILE_NAME).patch xpdf-3.02-sec.patch
 
 CONFIGURE_DIR=
 BUILD_DIR=$(CONFIGURE_DIR)
diff --git a/xpdf/xpdf-3.02-sec.patch b/xpdf/xpdf-3.02-sec.patch
new file mode 100644
index 0000000..a33b85e
--- /dev/null
+++ b/xpdf/xpdf-3.02-sec.patch
@@ -0,0 +1,29 @@
+--- misc/xpdf-3.02/fofi/FoFiType1.cc	2007-02-27 23:05:51.000000000 +0100
++++ misc/build/xpdf-3.02/fofi/FoFiType1.cc	2010-10-20 18:10:09.000000000 +0200
+@@ -224,7 +224,7 @@
+ 		code = code * 8 + (*p2 - '0');
+ 	      }
+ 	    }
+-	    if (code < 256) {
++	    if (code < 256 && code >= 0) {
+ 	      for (p = p2; *p == ' ' || *p == '\t'; ++p) ;
+ 	      if (*p == '/') {
+ 		++p;
+--- misc/xpdf-3.02/xpdf/Gfx.cc	2007-02-27 23:05:52.000000000 +0100
++++ misc/build/xpdf-3.02/xpdf/Gfx.cc	2010-10-20 18:14:32.000000000 +0200
+@@ -444,6 +444,7 @@
+   xref = xrefA;
+   subPage = gFalse;
+   printCommands = globalParams->getPrintCommands();
++  parser = NULL;
+ 
+   // start the resource stack
+   res = new GfxResources(xref, resDict, NULL);
+@@ -486,6 +487,7 @@
+   xref = xrefA;
+   subPage = gTrue;
+   printCommands = globalParams->getPrintCommands();
++  parser = NULL;
+ 
+   // start the resource stack
+   res = new GfxResources(xref, resDict, NULL);
commit 02cb18160760b37220697780e9f3fe1005a102b4
Author: Philipp Lohmann [pl] <Philipp.Lohmann at Oracle.COM>
Date:   Wed Oct 20 18:04:43 2010 +0200

    pdfextfix04: #i90800# fix RTL import, use mirror string service, use character classification instead of overly broad script type complex

diff --git a/sdext/source/pdfimport/inc/treevisitorfactory.hxx b/sdext/source/pdfimport/inc/treevisitorfactory.hxx
index b805e66..52300ce 100644
--- a/sdext/source/pdfimport/inc/treevisitorfactory.hxx
+++ b/sdext/source/pdfimport/inc/treevisitorfactory.hxx
@@ -53,7 +53,7 @@ namespace pdfi
         virtual boost::shared_ptr<ElementTreeVisitor> createStyleCollectingVisitor(
             StyleContainer&, PDFIProcessor&) const = 0;
         /// Create visitor that emits tree to an output target
-        virtual boost::shared_ptr<ElementTreeVisitor> createEmittingVisitor(EmitContext&) const = 0;
+        virtual boost::shared_ptr<ElementTreeVisitor> createEmittingVisitor(EmitContext&, PDFIProcessor&) const = 0;
     };
 
     typedef boost::shared_ptr<TreeVisitorFactory> TreeVisitorFactorySharedPtr;
diff --git a/sdext/source/pdfimport/tree/drawtreevisiting.cxx b/sdext/source/pdfimport/tree/drawtreevisiting.cxx
index 134ee57..5c8d359 100644
--- a/sdext/source/pdfimport/tree/drawtreevisiting.cxx
+++ b/sdext/source/pdfimport/tree/drawtreevisiting.cxx
@@ -36,13 +36,15 @@
 #include "drawtreevisiting.hxx"
 #include "genericelements.hxx"
 
-#include <basegfx/polygon/b2dpolypolygontools.hxx>
-#include <basegfx/range/b2drange.hxx>
+#include "basegfx/polygon/b2dpolypolygontools.hxx"
+#include "basegfx/range/b2drange.hxx"
 
-#include <com/sun/star/i18n/XBreakIterator.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include "com/sun/star/i18n/XBreakIterator.hpp"
+#include "com/sun/star/lang/XMultiServiceFactory.hpp"
 #include "comphelper/processfactory.hxx"
-#include <com/sun/star/i18n/ScriptType.hpp>
+#include "com/sun/star/i18n/ScriptType.hpp"
+#include "com/sun/star/i18n/DirectionProperty.hpp"
+
 #include <string.h>
 
 using namespace ::com::sun::star;
@@ -79,6 +81,18 @@ const ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XBreakIterator >
     return mxBreakIter;
 }
 
+const ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XCharacterClassification >& DrawXmlEmitter::GetCharacterClassification()
+{
+    if ( !mxCharClass.is() )
+    {
+        Reference< XComponentContext > xContext( m_rEmitContext.m_xContext, uno::UNO_SET_THROW );
+        Reference< XMultiComponentFactory > xMSF(  xContext->getServiceManager(), uno::UNO_SET_THROW );
+    Reference < XInterface > xInterface = xMSF->createInstanceWithContext(::rtl::OUString::createFromAscii("com.sun.star.i18n.CharacterClassification"), xContext);
+        mxCharClass = uno::Reference< i18n::XCharacterClassification >( xInterface, uno::UNO_QUERY );
+    }
+    return mxCharClass;
+}
+
 void DrawXmlEmitter::visit( HyperlinkElement& elem, const std::list< Element* >::const_iterator&   ) 
 { 
     if( elem.Children.empty() )
@@ -119,30 +133,25 @@ void DrawXmlEmitter::visit( TextElement& elem, const std::list< Element* >::cons
 
     rtl::OUString str(elem.Text.getStr());
 
-    // Check for CTL
-    bool isComplex = false;
-    for(int i=0; i< elem.Text.getLength(); i++)
+    // Check for RTL
+    bool isRTL = false;
+    Reference< i18n::XCharacterClassification > xCC( GetCharacterClassification() );
+    if( xCC.is() )
     {
-    sal_Int16 nType = GetBreakIterator()->getScriptType( str, i + 1);
-    if (nType == ::com::sun::star::i18n::ScriptType::COMPLEX)
-        isComplex = true;
-    } 
-
-    #if 0
-    // FIXME: need to have a service to do this mirroring
-    if (isComplex)  // If so, reverse string
-    {
-        rtl::OUString flippedStr(RTL_CONSTASCII_USTRINGPARAM( "" ));
-        for(int i = str.getLength() - 1; i >= 0; i--)
+        for(int i=1; i< elem.Text.getLength(); i++)
         {
-             sal_Unicode cChar = str[ i ];
-             cChar = static_cast<sal_Unicode>(GetMirroredChar( cChar ));
-             rtl::OUString uC(cChar);
-             flippedStr += uC;
-        } 
-        str = flippedStr;
+            sal_Int16 nType = xCC->getCharacterDirection( str, i );
+            if ( nType == ::com::sun::star::i18n::DirectionProperty_RIGHT_TO_LEFT           ||
+                 nType == ::com::sun::star::i18n::DirectionProperty_RIGHT_TO_LEFT_ARABIC    ||
+                 nType == ::com::sun::star::i18n::DirectionProperty_RIGHT_TO_LEFT_EMBEDDING ||
+                 nType == ::com::sun::star::i18n::DirectionProperty_RIGHT_TO_LEFT_OVERRIDE 
+                )
+                isRTL = true;
+        }
     }
-    #endif
+
+    if (isRTL)  // If so, reverse string
+        str = m_rProcessor.mirrorString( str );
 
     m_rEmitContext.rEmitter.beginTag( "text:span", aProps );
 
diff --git a/sdext/source/pdfimport/tree/drawtreevisiting.hxx b/sdext/source/pdfimport/tree/drawtreevisiting.hxx
index 360c156..9931d4b 100644
--- a/sdext/source/pdfimport/tree/drawtreevisiting.hxx
+++ b/sdext/source/pdfimport/tree/drawtreevisiting.hxx
@@ -29,9 +29,11 @@
 #define INCLUDED_PDFI_DRAWTREEVISITING_HXX
 
 #include "treevisiting.hxx"
-#include <com/sun/star/i18n/XBreakIterator.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/uno/XComponentContext.hpp>
+
+#include "com/sun/star/i18n/XBreakIterator.hpp"
+#include "com/sun/star/i18n/XCharacterClassification.hpp"
+#include "com/sun/star/lang/XMultiServiceFactory.hpp"
+#include "com/sun/star/uno/XComponentContext.hpp"
 
 namespace pdfi
 {
@@ -89,6 +91,9 @@ namespace pdfi
     ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xFactory;
     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > xCtx;
     ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XBreakIterator > mxBreakIter;
+    ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XCharacterClassification > mxCharClass;
+
+        PDFIProcessor&  m_rProcessor;
 
         EmitContext& m_rEmitContext ;
         /// writes Impress doc when false
@@ -100,8 +105,10 @@ namespace pdfi
 
     public:
     const ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XBreakIterator >& GetBreakIterator();
+    const ::com::sun::star::uno::Reference< ::com::sun::star::i18n::XCharacterClassification >& GetCharacterClassification();
         enum DocType{ DRAW_DOC, IMPRESS_DOC };
-        explicit DrawXmlEmitter(EmitContext& rEmitContext, DocType eDocType) :
+        explicit DrawXmlEmitter(EmitContext& rEmitContext, DocType eDocType, PDFIProcessor& rProc ) :
+            m_rProcessor( rProc ),
             m_rEmitContext(rEmitContext),
             m_bWriteDrawDocument(eDocType==DRAW_DOC)
         {}
diff --git a/sdext/source/pdfimport/tree/pdfiprocessor.cxx b/sdext/source/pdfimport/tree/pdfiprocessor.cxx
index a1db1e2..6c2e410 100644
--- a/sdext/source/pdfimport/tree/pdfiprocessor.cxx
+++ b/sdext/source/pdfimport/tree/pdfiprocessor.cxx
@@ -87,7 +87,8 @@ namespace pdfi
     m_fWordSpace(0.0),
     m_bIsWhiteSpaceInLine( false ),
     m_xStatusIndicator( xStat ),
-    m_bHaveTextOnDocLevel(false)
+    m_bHaveTextOnDocLevel(false),
+    m_bMirrorMapperTried(false)
 {
     FontAttributes aDefFont;
     aDefFont.familyName = USTR("Helvetica");
@@ -847,7 +848,7 @@ void PDFIProcessor::emit( XmlEmitter&               rEmitter,
    
     EmitContext aContext( rEmitter, aStyles, m_aImages, *this, m_xStatusIndicator, m_xContext );
     ElementTreeVisitorSharedPtr aEmittingVisitor(
-        rVisitorFactory.createEmittingVisitor(aContext));
+        rVisitorFactory.createEmittingVisitor(aContext, *this));
  
     PropertyMap aProps;
     // document prolog
@@ -1045,5 +1046,415 @@ void PDFIProcessor::sortElements( Element* pEle, bool bDeep )
             // over and out.
             return outRect;
         }
+        
+// helper method: get a mirrored string
+rtl::OUString PDFIProcessor::mirrorString( const rtl::OUString& i_rString )
+{
+    if( ! m_xMirrorMapper.is() && ! m_bMirrorMapperTried )
+    {
+        m_bMirrorMapperTried = true;
+        uno::Reference< lang::XMultiComponentFactory > xMSF(  m_xContext->getServiceManager(), uno::UNO_SET_THROW );
+        uno::Reference < uno::XInterface > xInterface = xMSF->createInstanceWithContext(::rtl::OUString::createFromAscii("com.sun.star.awt.StringMirror"), m_xContext);
+        m_xMirrorMapper = uno::Reference< util::XStringMapping >( xInterface, uno::UNO_QUERY );
+        #if OSL_DEBUG_LEVEL > 1
+        if( m_xMirrorMapper.is() )
+            fprintf( stderr, "using mirror mapper service\n" );
+        #endif
+    }
+    if( m_xMirrorMapper.is() )
+    {
+        uno::Sequence< rtl::OUString > aSeq( 1 );
+        aSeq.getArray()[0] = i_rString;
+        m_xMirrorMapper->mapStrings( aSeq );
+        return  aSeq[0];
+    }
+
+    prepareMirrorMap();
+    sal_Int32 nLen = i_rString.getLength();
+    rtl::OUStringBuffer aRet( nLen );
+    for(int i = nLen - 1; i >= 0; i--)
+    {
+        sal_Unicode cChar = i_rString[ i ];
+        aRet.append( m_aMirrorMap[cChar] );
+    }
+    return aRet.makeStringAndClear();
+}
+
+void PDFIProcessor::prepareMirrorMap()
+{
+    if( m_aMirrorMap.empty() )
+    {
+        #if OSL_DEBUG_LEVEL > 1
+        fprintf( stderr, "falling back to static mirror list\n" );
+        #endif
+    
+        m_aMirrorMap.reserve( 0x10000 );
+        for( int i = 0; i < 0x10000; i++ )
+            m_aMirrorMap.push_back( sal_Unicode(i) );
+        
+        m_aMirrorMap[ 0x0028 ] = 0x0029; // LEFT PARENTHESIS
+        m_aMirrorMap[ 0x0029 ] = 0x0028; // RIGHT PARENTHESIS
+        m_aMirrorMap[ 0x003C ] = 0x003E; // LESS-THAN SIGN
+        m_aMirrorMap[ 0x003E ] = 0x003C; // GREATER-THAN SIGN
+        m_aMirrorMap[ 0x005B ] = 0x005D; // LEFT SQUARE BRACKET
+        m_aMirrorMap[ 0x005D ] = 0x005B; // RIGHT SQUARE BRACKET
+        m_aMirrorMap[ 0x007B ] = 0x007D; // LEFT CURLY BRACKET
+        m_aMirrorMap[ 0x007D ] = 0x007B; // RIGHT CURLY BRACKET
+        m_aMirrorMap[ 0x00AB ] = 0x00BB; // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+        m_aMirrorMap[ 0x00BB ] = 0x00AB; // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+        m_aMirrorMap[ 0x0F3A ] = 0x0F3B; // TIBETAN MARK GUG RTAGS GYON
+        m_aMirrorMap[ 0x0F3B ] = 0x0F3A; // TIBETAN MARK GUG RTAGS GYAS
+        m_aMirrorMap[ 0x0F3C ] = 0x0F3D; // TIBETAN MARK ANG KHANG GYON
+        m_aMirrorMap[ 0x0F3D ] = 0x0F3C; // TIBETAN MARK ANG KHANG GYAS
+        m_aMirrorMap[ 0x169B ] = 0x169C; // OGHAM FEATHER MARK
+        m_aMirrorMap[ 0x169C ] = 0x169B; // OGHAM REVERSED FEATHER MARK
+        m_aMirrorMap[ 0x2039 ] = 0x203A; // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+        m_aMirrorMap[ 0x203A ] = 0x2039; // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+        m_aMirrorMap[ 0x2045 ] = 0x2046; // LEFT SQUARE BRACKET WITH QUILL
+        m_aMirrorMap[ 0x2046 ] = 0x2045; // RIGHT SQUARE BRACKET WITH QUILL
+        m_aMirrorMap[ 0x207D ] = 0x207E; // SUPERSCRIPT LEFT PARENTHESIS
+        m_aMirrorMap[ 0x207E ] = 0x207D; // SUPERSCRIPT RIGHT PARENTHESIS
+        m_aMirrorMap[ 0x208D ] = 0x208E; // SUBSCRIPT LEFT PARENTHESIS
+        m_aMirrorMap[ 0x208E ] = 0x208D; // SUBSCRIPT RIGHT PARENTHESIS
+        m_aMirrorMap[ 0x2208 ] = 0x220B; // ELEMENT OF
+        m_aMirrorMap[ 0x2209 ] = 0x220C; // NOT AN ELEMENT OF
+        m_aMirrorMap[ 0x220A ] = 0x220D; // SMALL ELEMENT OF
+        m_aMirrorMap[ 0x220B ] = 0x2208; // CONTAINS AS MEMBER
+        m_aMirrorMap[ 0x220C ] = 0x2209; // DOES NOT CONTAIN AS MEMBER
+        m_aMirrorMap[ 0x220D ] = 0x220A; // SMALL CONTAINS AS MEMBER
+        m_aMirrorMap[ 0x2215 ] = 0x29F5; // DIVISION SLASH
+        m_aMirrorMap[ 0x223C ] = 0x223D; // TILDE OPERATOR
+        m_aMirrorMap[ 0x223D ] = 0x223C; // REVERSED TILDE
+        m_aMirrorMap[ 0x2243 ] = 0x22CD; // ASYMPTOTICALLY EQUAL TO
+        m_aMirrorMap[ 0x2252 ] = 0x2253; // APPROXIMATELY EQUAL TO OR THE IMAGE OF
+        m_aMirrorMap[ 0x2253 ] = 0x2252; // IMAGE OF OR APPROXIMATELY EQUAL TO
+        m_aMirrorMap[ 0x2254 ] = 0x2255; // COLON EQUALS
+        m_aMirrorMap[ 0x2255 ] = 0x2254; // EQUALS COLON
+        m_aMirrorMap[ 0x2264 ] = 0x2265; // LESS-THAN OR EQUAL TO
+        m_aMirrorMap[ 0x2265 ] = 0x2264; // GREATER-THAN OR EQUAL TO
+        m_aMirrorMap[ 0x2266 ] = 0x2267; // LESS-THAN OVER EQUAL TO
+        m_aMirrorMap[ 0x2267 ] = 0x2266; // GREATER-THAN OVER EQUAL TO
+        m_aMirrorMap[ 0x2268 ] = 0x2269; // [BEST FIT] LESS-THAN BUT NOT EQUAL TO
+        m_aMirrorMap[ 0x2269 ] = 0x2268; // [BEST FIT] GREATER-THAN BUT NOT EQUAL TO
+        m_aMirrorMap[ 0x226A ] = 0x226B; // MUCH LESS-THAN
+        m_aMirrorMap[ 0x226B ] = 0x226A; // MUCH GREATER-THAN
+        m_aMirrorMap[ 0x226E ] = 0x226F; // [BEST FIT] NOT LESS-THAN
+        m_aMirrorMap[ 0x226F ] = 0x226E; // [BEST FIT] NOT GREATER-THAN
+        m_aMirrorMap[ 0x2270 ] = 0x2271; // [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO
+        m_aMirrorMap[ 0x2271 ] = 0x2270; // [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO
+        m_aMirrorMap[ 0x2272 ] = 0x2273; // [BEST FIT] LESS-THAN OR EQUIVALENT TO
+        m_aMirrorMap[ 0x2273 ] = 0x2272; // [BEST FIT] GREATER-THAN OR EQUIVALENT TO
+        m_aMirrorMap[ 0x2274 ] = 0x2275; // [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO
+        m_aMirrorMap[ 0x2275 ] = 0x2274; // [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO
+        m_aMirrorMap[ 0x2276 ] = 0x2277; // LESS-THAN OR GREATER-THAN
+        m_aMirrorMap[ 0x2277 ] = 0x2276; // GREATER-THAN OR LESS-THAN
+        m_aMirrorMap[ 0x2278 ] = 0x2279; // [BEST FIT] NEITHER LESS-THAN NOR GREATER-THAN
+        m_aMirrorMap[ 0x2279 ] = 0x2278; // [BEST FIT] NEITHER GREATER-THAN NOR LESS-THAN
+        m_aMirrorMap[ 0x227A ] = 0x227B; // PRECEDES
+        m_aMirrorMap[ 0x227B ] = 0x227A; // SUCCEEDS
+        m_aMirrorMap[ 0x227C ] = 0x227D; // PRECEDES OR EQUAL TO
+        m_aMirrorMap[ 0x227D ] = 0x227C; // SUCCEEDS OR EQUAL TO
+        m_aMirrorMap[ 0x227E ] = 0x227F; // [BEST FIT] PRECEDES OR EQUIVALENT TO
+        m_aMirrorMap[ 0x227F ] = 0x227E; // [BEST FIT] SUCCEEDS OR EQUIVALENT TO
+        m_aMirrorMap[ 0x2280 ] = 0x2281; // [BEST FIT] DOES NOT PRECEDE
+        m_aMirrorMap[ 0x2281 ] = 0x2280; // [BEST FIT] DOES NOT SUCCEED
+        m_aMirrorMap[ 0x2282 ] = 0x2283; // SUBSET OF
+        m_aMirrorMap[ 0x2283 ] = 0x2282; // SUPERSET OF
+        m_aMirrorMap[ 0x2284 ] = 0x2285; // [BEST FIT] NOT A SUBSET OF
+        m_aMirrorMap[ 0x2285 ] = 0x2284; // [BEST FIT] NOT A SUPERSET OF
+        m_aMirrorMap[ 0x2286 ] = 0x2287; // SUBSET OF OR EQUAL TO
+        m_aMirrorMap[ 0x2287 ] = 0x2286; // SUPERSET OF OR EQUAL TO
+        m_aMirrorMap[ 0x2288 ] = 0x2289; // [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO
+        m_aMirrorMap[ 0x2289 ] = 0x2288; // [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO
+        m_aMirrorMap[ 0x228A ] = 0x228B; // [BEST FIT] SUBSET OF WITH NOT EQUAL TO
+        m_aMirrorMap[ 0x228B ] = 0x228A; // [BEST FIT] SUPERSET OF WITH NOT EQUAL TO
+        m_aMirrorMap[ 0x228F ] = 0x2290; // SQUARE IMAGE OF
+        m_aMirrorMap[ 0x2290 ] = 0x228F; // SQUARE ORIGINAL OF
+        m_aMirrorMap[ 0x2291 ] = 0x2292; // SQUARE IMAGE OF OR EQUAL TO
+        m_aMirrorMap[ 0x2292 ] = 0x2291; // SQUARE ORIGINAL OF OR EQUAL TO
+        m_aMirrorMap[ 0x2298 ] = 0x29B8; // CIRCLED DIVISION SLASH
+        m_aMirrorMap[ 0x22A2 ] = 0x22A3; // RIGHT TACK
+        m_aMirrorMap[ 0x22A3 ] = 0x22A2; // LEFT TACK
+        m_aMirrorMap[ 0x22A6 ] = 0x2ADE; // ASSERTION
+        m_aMirrorMap[ 0x22A8 ] = 0x2AE4; // TRUE
+        m_aMirrorMap[ 0x22A9 ] = 0x2AE3; // FORCES
+        m_aMirrorMap[ 0x22AB ] = 0x2AE5; // DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+        m_aMirrorMap[ 0x22B0 ] = 0x22B1; // PRECEDES UNDER RELATION
+        m_aMirrorMap[ 0x22B1 ] = 0x22B0; // SUCCEEDS UNDER RELATION
+        m_aMirrorMap[ 0x22B2 ] = 0x22B3; // NORMAL SUBGROUP OF
+        m_aMirrorMap[ 0x22B3 ] = 0x22B2; // CONTAINS AS NORMAL SUBGROUP
+        m_aMirrorMap[ 0x22B4 ] = 0x22B5; // NORMAL SUBGROUP OF OR EQUAL TO
+        m_aMirrorMap[ 0x22B5 ] = 0x22B4; // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+        m_aMirrorMap[ 0x22B6 ] = 0x22B7; // ORIGINAL OF
+        m_aMirrorMap[ 0x22B7 ] = 0x22B6; // IMAGE OF
+        m_aMirrorMap[ 0x22C9 ] = 0x22CA; // LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+        m_aMirrorMap[ 0x22CA ] = 0x22C9; // RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+        m_aMirrorMap[ 0x22CB ] = 0x22CC; // LEFT SEMIDIRECT PRODUCT
+        m_aMirrorMap[ 0x22CC ] = 0x22CB; // RIGHT SEMIDIRECT PRODUCT
+        m_aMirrorMap[ 0x22CD ] = 0x2243; // REVERSED TILDE EQUALS
+        m_aMirrorMap[ 0x22D0 ] = 0x22D1; // DOUBLE SUBSET
+        m_aMirrorMap[ 0x22D1 ] = 0x22D0; // DOUBLE SUPERSET
+        m_aMirrorMap[ 0x22D6 ] = 0x22D7; // LESS-THAN WITH DOT
+        m_aMirrorMap[ 0x22D7 ] = 0x22D6; // GREATER-THAN WITH DOT
+        m_aMirrorMap[ 0x22D8 ] = 0x22D9; // VERY MUCH LESS-THAN
+        m_aMirrorMap[ 0x22D9 ] = 0x22D8; // VERY MUCH GREATER-THAN
+        m_aMirrorMap[ 0x22DA ] = 0x22DB; // LESS-THAN EQUAL TO OR GREATER-THAN
+        m_aMirrorMap[ 0x22DB ] = 0x22DA; // GREATER-THAN EQUAL TO OR LESS-THAN
+        m_aMirrorMap[ 0x22DC ] = 0x22DD; // EQUAL TO OR LESS-THAN
+        m_aMirrorMap[ 0x22DD ] = 0x22DC; // EQUAL TO OR GREATER-THAN
+        m_aMirrorMap[ 0x22DE ] = 0x22DF; // EQUAL TO OR PRECEDES
+        m_aMirrorMap[ 0x22DF ] = 0x22DE; // EQUAL TO OR SUCCEEDS
+        m_aMirrorMap[ 0x22E0 ] = 0x22E1; // [BEST FIT] DOES NOT PRECEDE OR EQUAL
+        m_aMirrorMap[ 0x22E1 ] = 0x22E0; // [BEST FIT] DOES NOT SUCCEED OR EQUAL
+        m_aMirrorMap[ 0x22E2 ] = 0x22E3; // [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO
+        m_aMirrorMap[ 0x22E3 ] = 0x22E2; // [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO
+        m_aMirrorMap[ 0x22E4 ] = 0x22E5; // [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO
+        m_aMirrorMap[ 0x22E5 ] = 0x22E4; // [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO
+        m_aMirrorMap[ 0x22E6 ] = 0x22E7; // [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO
+        m_aMirrorMap[ 0x22E7 ] = 0x22E6; // [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO
+        m_aMirrorMap[ 0x22E8 ] = 0x22E9; // [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO
+        m_aMirrorMap[ 0x22E9 ] = 0x22E8; // [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO
+        m_aMirrorMap[ 0x22EA ] = 0x22EB; // [BEST FIT] NOT NORMAL SUBGROUP OF
+        m_aMirrorMap[ 0x22EB ] = 0x22EA; // [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP
+        m_aMirrorMap[ 0x22EC ] = 0x22ED; // [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO
+        m_aMirrorMap[ 0x22ED ] = 0x22EC; // [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+        m_aMirrorMap[ 0x22F0 ] = 0x22F1; // UP RIGHT DIAGONAL ELLIPSIS
+        m_aMirrorMap[ 0x22F1 ] = 0x22F0; // DOWN RIGHT DIAGONAL ELLIPSIS
+        m_aMirrorMap[ 0x22F2 ] = 0x22FA; // ELEMENT OF WITH LONG HORIZONTAL STROKE
+        m_aMirrorMap[ 0x22F3 ] = 0x22FB; // ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+        m_aMirrorMap[ 0x22F4 ] = 0x22FC; // SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+        m_aMirrorMap[ 0x22F6 ] = 0x22FD; // ELEMENT OF WITH OVERBAR
+        m_aMirrorMap[ 0x22F7 ] = 0x22FE; // SMALL ELEMENT OF WITH OVERBAR
+        m_aMirrorMap[ 0x22FA ] = 0x22F2; // CONTAINS WITH LONG HORIZONTAL STROKE
+        m_aMirrorMap[ 0x22FB ] = 0x22F3; // CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+        m_aMirrorMap[ 0x22FC ] = 0x22F4; // SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+        m_aMirrorMap[ 0x22FD ] = 0x22F6; // CONTAINS WITH OVERBAR
+        m_aMirrorMap[ 0x22FE ] = 0x22F7; // SMALL CONTAINS WITH OVERBAR
+        m_aMirrorMap[ 0x2308 ] = 0x2309; // LEFT CEILING
+        m_aMirrorMap[ 0x2309 ] = 0x2308; // RIGHT CEILING
+        m_aMirrorMap[ 0x230A ] = 0x230B; // LEFT FLOOR
+        m_aMirrorMap[ 0x230B ] = 0x230A; // RIGHT FLOOR
+        m_aMirrorMap[ 0x2329 ] = 0x232A; // LEFT-POINTING ANGLE BRACKET
+        m_aMirrorMap[ 0x232A ] = 0x2329; // RIGHT-POINTING ANGLE BRACKET
+        m_aMirrorMap[ 0x2768 ] = 0x2769; // MEDIUM LEFT PARENTHESIS ORNAMENT
+        m_aMirrorMap[ 0x2769 ] = 0x2768; // MEDIUM RIGHT PARENTHESIS ORNAMENT
+        m_aMirrorMap[ 0x276A ] = 0x276B; // MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+        m_aMirrorMap[ 0x276B ] = 0x276A; // MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+        m_aMirrorMap[ 0x276C ] = 0x276D; // MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+        m_aMirrorMap[ 0x276D ] = 0x276C; // MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+        m_aMirrorMap[ 0x276E ] = 0x276F; // HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+        m_aMirrorMap[ 0x276F ] = 0x276E; // HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+        m_aMirrorMap[ 0x2770 ] = 0x2771; // HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+        m_aMirrorMap[ 0x2771 ] = 0x2770; // HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+        m_aMirrorMap[ 0x2772 ] = 0x2773; // LIGHT LEFT TORTOISE SHELL BRACKET
+        m_aMirrorMap[ 0x2773 ] = 0x2772; // LIGHT RIGHT TORTOISE SHELL BRACKET
+        m_aMirrorMap[ 0x2774 ] = 0x2775; // MEDIUM LEFT CURLY BRACKET ORNAMENT
+        m_aMirrorMap[ 0x2775 ] = 0x2774; // MEDIUM RIGHT CURLY BRACKET ORNAMENT
+        m_aMirrorMap[ 0x27C3 ] = 0x27C4; // OPEN SUBSET
+        m_aMirrorMap[ 0x27C4 ] = 0x27C3; // OPEN SUPERSET
+        m_aMirrorMap[ 0x27C5 ] = 0x27C6; // LEFT S-SHAPED BAG DELIMITER
+        m_aMirrorMap[ 0x27C6 ] = 0x27C5; // RIGHT S-SHAPED BAG DELIMITER
+        m_aMirrorMap[ 0x27C8 ] = 0x27C9; // REVERSE SOLIDUS PRECEDING SUBSET
+        m_aMirrorMap[ 0x27C9 ] = 0x27C8; // SUPERSET PRECEDING SOLIDUS
+        m_aMirrorMap[ 0x27D5 ] = 0x27D6; // LEFT OUTER JOIN
+        m_aMirrorMap[ 0x27D6 ] = 0x27D5; // RIGHT OUTER JOIN
+        m_aMirrorMap[ 0x27DD ] = 0x27DE; // LONG RIGHT TACK
+        m_aMirrorMap[ 0x27DE ] = 0x27DD; // LONG LEFT TACK
+        m_aMirrorMap[ 0x27E2 ] = 0x27E3; // WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+        m_aMirrorMap[ 0x27E3 ] = 0x27E2; // WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+        m_aMirrorMap[ 0x27E4 ] = 0x27E5; // WHITE SQUARE WITH LEFTWARDS TICK
+        m_aMirrorMap[ 0x27E5 ] = 0x27E4; // WHITE SQUARE WITH RIGHTWARDS TICK
+        m_aMirrorMap[ 0x27E6 ] = 0x27E7; // MATHEMATICAL LEFT WHITE SQUARE BRACKET
+        m_aMirrorMap[ 0x27E7 ] = 0x27E6; // MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+        m_aMirrorMap[ 0x27E8 ] = 0x27E9; // MATHEMATICAL LEFT ANGLE BRACKET
+        m_aMirrorMap[ 0x27E9 ] = 0x27E8; // MATHEMATICAL RIGHT ANGLE BRACKET
+        m_aMirrorMap[ 0x27EA ] = 0x27EB; // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+        m_aMirrorMap[ 0x27EB ] = 0x27EA; // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+        m_aMirrorMap[ 0x27EC ] = 0x27ED; // MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+        m_aMirrorMap[ 0x27ED ] = 0x27EC; // MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+        m_aMirrorMap[ 0x27EE ] = 0x27EF; // MATHEMATICAL LEFT FLATTENED PARENTHESIS
+        m_aMirrorMap[ 0x27EF ] = 0x27EE; // MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+        m_aMirrorMap[ 0x2983 ] = 0x2984; // LEFT WHITE CURLY BRACKET
+        m_aMirrorMap[ 0x2984 ] = 0x2983; // RIGHT WHITE CURLY BRACKET
+        m_aMirrorMap[ 0x2985 ] = 0x2986; // LEFT WHITE PARENTHESIS
+        m_aMirrorMap[ 0x2986 ] = 0x2985; // RIGHT WHITE PARENTHESIS
+        m_aMirrorMap[ 0x2987 ] = 0x2988; // Z NOTATION LEFT IMAGE BRACKET
+        m_aMirrorMap[ 0x2988 ] = 0x2987; // Z NOTATION RIGHT IMAGE BRACKET
+        m_aMirrorMap[ 0x2989 ] = 0x298A; // Z NOTATION LEFT BINDING BRACKET
+        m_aMirrorMap[ 0x298A ] = 0x2989; // Z NOTATION RIGHT BINDING BRACKET
+        m_aMirrorMap[ 0x298B ] = 0x298C; // LEFT SQUARE BRACKET WITH UNDERBAR
+        m_aMirrorMap[ 0x298C ] = 0x298B; // RIGHT SQUARE BRACKET WITH UNDERBAR
+        m_aMirrorMap[ 0x298D ] = 0x2990; // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+        m_aMirrorMap[ 0x298E ] = 0x298F; // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+        m_aMirrorMap[ 0x298F ] = 0x298E; // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+        m_aMirrorMap[ 0x2990 ] = 0x298D; // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+        m_aMirrorMap[ 0x2991 ] = 0x2992; // LEFT ANGLE BRACKET WITH DOT
+        m_aMirrorMap[ 0x2992 ] = 0x2991; // RIGHT ANGLE BRACKET WITH DOT
+        m_aMirrorMap[ 0x2993 ] = 0x2994; // LEFT ARC LESS-THAN BRACKET
+        m_aMirrorMap[ 0x2994 ] = 0x2993; // RIGHT ARC GREATER-THAN BRACKET
+        m_aMirrorMap[ 0x2995 ] = 0x2996; // DOUBLE LEFT ARC GREATER-THAN BRACKET
+        m_aMirrorMap[ 0x2996 ] = 0x2995; // DOUBLE RIGHT ARC LESS-THAN BRACKET
+        m_aMirrorMap[ 0x2997 ] = 0x2998; // LEFT BLACK TORTOISE SHELL BRACKET
+        m_aMirrorMap[ 0x2998 ] = 0x2997; // RIGHT BLACK TORTOISE SHELL BRACKET
+        m_aMirrorMap[ 0x29B8 ] = 0x2298; // CIRCLED REVERSE SOLIDUS
+        m_aMirrorMap[ 0x29C0 ] = 0x29C1; // CIRCLED LESS-THAN
+        m_aMirrorMap[ 0x29C1 ] = 0x29C0; // CIRCLED GREATER-THAN
+        m_aMirrorMap[ 0x29C4 ] = 0x29C5; // SQUARED RISING DIAGONAL SLASH
+        m_aMirrorMap[ 0x29C5 ] = 0x29C4; // SQUARED FALLING DIAGONAL SLASH
+        m_aMirrorMap[ 0x29CF ] = 0x29D0; // LEFT TRIANGLE BESIDE VERTICAL BAR
+        m_aMirrorMap[ 0x29D0 ] = 0x29CF; // VERTICAL BAR BESIDE RIGHT TRIANGLE
+        m_aMirrorMap[ 0x29D1 ] = 0x29D2; // BOWTIE WITH LEFT HALF BLACK
+        m_aMirrorMap[ 0x29D2 ] = 0x29D1; // BOWTIE WITH RIGHT HALF BLACK
+        m_aMirrorMap[ 0x29D4 ] = 0x29D5; // TIMES WITH LEFT HALF BLACK
+        m_aMirrorMap[ 0x29D5 ] = 0x29D4; // TIMES WITH RIGHT HALF BLACK
+        m_aMirrorMap[ 0x29D8 ] = 0x29D9; // LEFT WIGGLY FENCE
+        m_aMirrorMap[ 0x29D9 ] = 0x29D8; // RIGHT WIGGLY FENCE
+        m_aMirrorMap[ 0x29DA ] = 0x29DB; // LEFT DOUBLE WIGGLY FENCE
+        m_aMirrorMap[ 0x29DB ] = 0x29DA; // RIGHT DOUBLE WIGGLY FENCE
+        m_aMirrorMap[ 0x29F5 ] = 0x2215; // REVERSE SOLIDUS OPERATOR
+        m_aMirrorMap[ 0x29F8 ] = 0x29F9; // BIG SOLIDUS
+        m_aMirrorMap[ 0x29F9 ] = 0x29F8; // BIG REVERSE SOLIDUS
+        m_aMirrorMap[ 0x29FC ] = 0x29FD; // LEFT-POINTING CURVED ANGLE BRACKET
+        m_aMirrorMap[ 0x29FD ] = 0x29FC; // RIGHT-POINTING CURVED ANGLE BRACKET
+        m_aMirrorMap[ 0x2A2B ] = 0x2A2C; // MINUS SIGN WITH FALLING DOTS
+        m_aMirrorMap[ 0x2A2C ] = 0x2A2B; // MINUS SIGN WITH RISING DOTS
+        m_aMirrorMap[ 0x2A2D ] = 0x2A2E; // PLUS SIGN IN LEFT HALF CIRCLE
+        m_aMirrorMap[ 0x2A2E ] = 0x2A2D; // PLUS SIGN IN RIGHT HALF CIRCLE
+        m_aMirrorMap[ 0x2A34 ] = 0x2A35; // MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+        m_aMirrorMap[ 0x2A35 ] = 0x2A34; // MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+        m_aMirrorMap[ 0x2A3C ] = 0x2A3D; // INTERIOR PRODUCT
+        m_aMirrorMap[ 0x2A3D ] = 0x2A3C; // RIGHTHAND INTERIOR PRODUCT
+        m_aMirrorMap[ 0x2A64 ] = 0x2A65; // Z NOTATION DOMAIN ANTIRESTRICTION
+        m_aMirrorMap[ 0x2A65 ] = 0x2A64; // Z NOTATION RANGE ANTIRESTRICTION
+        m_aMirrorMap[ 0x2A79 ] = 0x2A7A; // LESS-THAN WITH CIRCLE INSIDE
+        m_aMirrorMap[ 0x2A7A ] = 0x2A79; // GREATER-THAN WITH CIRCLE INSIDE
+        m_aMirrorMap[ 0x2A7D ] = 0x2A7E; // LESS-THAN OR SLANTED EQUAL TO
+        m_aMirrorMap[ 0x2A7E ] = 0x2A7D; // GREATER-THAN OR SLANTED EQUAL TO
+        m_aMirrorMap[ 0x2A7F ] = 0x2A80; // LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+        m_aMirrorMap[ 0x2A80 ] = 0x2A7F; // GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+        m_aMirrorMap[ 0x2A81 ] = 0x2A82; // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+        m_aMirrorMap[ 0x2A82 ] = 0x2A81; // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+        m_aMirrorMap[ 0x2A83 ] = 0x2A84; // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+        m_aMirrorMap[ 0x2A84 ] = 0x2A83; // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+        m_aMirrorMap[ 0x2A8B ] = 0x2A8C; // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+        m_aMirrorMap[ 0x2A8C ] = 0x2A8B; // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+        m_aMirrorMap[ 0x2A91 ] = 0x2A92; // LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+        m_aMirrorMap[ 0x2A92 ] = 0x2A91; // GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+        m_aMirrorMap[ 0x2A93 ] = 0x2A94; // LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+        m_aMirrorMap[ 0x2A94 ] = 0x2A93; // GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+        m_aMirrorMap[ 0x2A95 ] = 0x2A96; // SLANTED EQUAL TO OR LESS-THAN
+        m_aMirrorMap[ 0x2A96 ] = 0x2A95; // SLANTED EQUAL TO OR GREATER-THAN
+        m_aMirrorMap[ 0x2A97 ] = 0x2A98; // SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+        m_aMirrorMap[ 0x2A98 ] = 0x2A97; // SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+        m_aMirrorMap[ 0x2A99 ] = 0x2A9A; // DOUBLE-LINE EQUAL TO OR LESS-THAN
+        m_aMirrorMap[ 0x2A9A ] = 0x2A99; // DOUBLE-LINE EQUAL TO OR GREATER-THAN
+        m_aMirrorMap[ 0x2A9B ] = 0x2A9C; // DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+        m_aMirrorMap[ 0x2A9C ] = 0x2A9B; // DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+        m_aMirrorMap[ 0x2AA1 ] = 0x2AA2; // DOUBLE NESTED LESS-THAN
+        m_aMirrorMap[ 0x2AA2 ] = 0x2AA1; // DOUBLE NESTED GREATER-THAN
+        m_aMirrorMap[ 0x2AA6 ] = 0x2AA7; // LESS-THAN CLOSED BY CURVE
+        m_aMirrorMap[ 0x2AA7 ] = 0x2AA6; // GREATER-THAN CLOSED BY CURVE
+        m_aMirrorMap[ 0x2AA8 ] = 0x2AA9; // LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+        m_aMirrorMap[ 0x2AA9 ] = 0x2AA8; // GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+        m_aMirrorMap[ 0x2AAA ] = 0x2AAB; // SMALLER THAN
+        m_aMirrorMap[ 0x2AAB ] = 0x2AAA; // LARGER THAN
+        m_aMirrorMap[ 0x2AAC ] = 0x2AAD; // SMALLER THAN OR EQUAL TO
+        m_aMirrorMap[ 0x2AAD ] = 0x2AAC; // LARGER THAN OR EQUAL TO
+        m_aMirrorMap[ 0x2AAF ] = 0x2AB0; // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+        m_aMirrorMap[ 0x2AB0 ] = 0x2AAF; // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+        m_aMirrorMap[ 0x2AB3 ] = 0x2AB4; // PRECEDES ABOVE EQUALS SIGN
+        m_aMirrorMap[ 0x2AB4 ] = 0x2AB3; // SUCCEEDS ABOVE EQUALS SIGN
+        m_aMirrorMap[ 0x2ABB ] = 0x2ABC; // DOUBLE PRECEDES
+        m_aMirrorMap[ 0x2ABC ] = 0x2ABB; // DOUBLE SUCCEEDS
+        m_aMirrorMap[ 0x2ABD ] = 0x2ABE; // SUBSET WITH DOT
+        m_aMirrorMap[ 0x2ABE ] = 0x2ABD; // SUPERSET WITH DOT
+        m_aMirrorMap[ 0x2ABF ] = 0x2AC0; // SUBSET WITH PLUS SIGN BELOW
+        m_aMirrorMap[ 0x2AC0 ] = 0x2ABF; // SUPERSET WITH PLUS SIGN BELOW
+        m_aMirrorMap[ 0x2AC1 ] = 0x2AC2; // SUBSET WITH MULTIPLICATION SIGN BELOW
+        m_aMirrorMap[ 0x2AC2 ] = 0x2AC1; // SUPERSET WITH MULTIPLICATION SIGN BELOW
+        m_aMirrorMap[ 0x2AC3 ] = 0x2AC4; // SUBSET OF OR EQUAL TO WITH DOT ABOVE
+        m_aMirrorMap[ 0x2AC4 ] = 0x2AC3; // SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+        m_aMirrorMap[ 0x2AC5 ] = 0x2AC6; // SUBSET OF ABOVE EQUALS SIGN
+        m_aMirrorMap[ 0x2AC6 ] = 0x2AC5; // SUPERSET OF ABOVE EQUALS SIGN
+        m_aMirrorMap[ 0x2ACD ] = 0x2ACE; // SQUARE LEFT OPEN BOX OPERATOR
+        m_aMirrorMap[ 0x2ACE ] = 0x2ACD; // SQUARE RIGHT OPEN BOX OPERATOR
+        m_aMirrorMap[ 0x2ACF ] = 0x2AD0; // CLOSED SUBSET

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list