Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/LibreOffice/xmloff/source/core/   (Office von Apache Version 25.8.3.2©)  Datei vom 5.10.2025 mit Größe 5 kB image not shown  

Quelle  xmlmultiimagehelper.cxx   Sprache: C

 
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */


#include <rtl/ustring.hxx>
#include <xmlmultiimagehelper.hxx>
#include <o3tl/string_view.hxx>
#include <comphelper/graphicmimetype.hxx>

using namespace ::com::sun::star;

namespace
{
    OUString getMimeTypeForURL(std::u16string_view rString)
    {
        OUString sMimeType;
        if (o3tl::starts_with(rString, u"vnd.sun.star.Package"))
        {
            const std::string_view::size_type nLastDot = rString.rfind('.');
            const auto nAfterDot = (nLastDot != std::string_view::npos) ? (nLastDot + 1) : 0;
            OString aExtension = OUStringToOString(rString.substr(nAfterDot), RTL_TEXTENCODING_ASCII_US);
            sMimeType = comphelper::GraphicMimeTypeHelper::GetMimeTypeForExtension(aExtension);
        }
        return sMimeType;
    }

    sal_uInt32 getQualityIndex(std::u16string_view rMimeType)
    {
        // pixel formats first
        if (rMimeType == u"image/bmp")
        {
            return 10;
        }
        if (rMimeType == u"image/gif")
        {
            return 20;
        }
        if (rMimeType == u"image/jpeg")
        {
            return 30;
        }
        if (rMimeType == u"image/png")
        {
            return 40;
        }

        // vector formats, prefer always
        if (rMimeType == u"image/x-vclgraphic"// MIMETYPE_VCLGRAPHIC
        {
            return 990;
        }
        if (rMimeType == u"image/x-svm")
        {
            return 1000;
        }
        if (rMimeType == u"image/x-wmf")
        {
            return 1010;
        }
        if (rMimeType == u"image/x-emf")
        {
            return 1020;
        }
        if (rMimeType == u"image/x-eps")
        {
            return 1025;
        }
        if (rMimeType == u"application/pdf")
        {
            return 1030;
        }
        if (rMimeType == u"image/svg+xml")
        {
            return 1040;
        }

        return 0;
    }
}

MultiImageImportHelper::MultiImageImportHelper()
:   mbSupportsMultipleContents(false)
{
}

MultiImageImportHelper::~MultiImageImportHelper()
{
}

SvXMLImportContextRef MultiImageImportHelper::solveMultipleImages()
{
    SvXMLImportContextRef pContext;
    if(maImplContextVector.size() > 1)
    {
        // multiple child contexts were imported, decide which is the most valuable one
        // and remove the rest
        std::vector<SvXMLImportContextRef>::size_type nIndexOfPreferred(maImplContextVector.size());
        sal_uInt32 nBestQuality(0);

        for(std::vector<SvXMLImportContextRef>::size_type a = 0; a < maImplContextVector.size(); a++)
        {
            const SvXMLImportContext& rContext = *maImplContextVector[a];

            // First try the mime type provided by the document
            OUString sMimeType = getMimeTypeFromImportContext(rContext);
            if (sMimeType.isEmpty())
            {
                // Try to determine the mime type from the extension
                const OUString aStreamURL(getGraphicPackageURLFromImportContext(rContext));
                if (!aStreamURL.isEmpty())
                {
                    sMimeType = getMimeTypeForURL(aStreamURL);
                }
                else
                {
                    // Try to determine the mime type from the graphic itself
                    uno::Reference<graphic::XGraphic> xGraphic(getGraphicFromImportContext(rContext));
                    if (xGraphic.is())
                        sMimeType = comphelper::GraphicMimeTypeHelper::GetMimeTypeForXGraphic(xGraphic);
                }
            }

            sal_uInt32 nNewQuality = getQualityIndex(sMimeType);
            if (nNewQuality > nBestQuality)
            {
                nBestQuality = nNewQuality;
                nIndexOfPreferred = a;
            }
        }

        // correct if needed, default is to use the last entry
        if(nIndexOfPreferred >= maImplContextVector.size())
        {
            nIndexOfPreferred = maImplContextVector.size() - 1;
        }

        // Take out the most valuable one
        const std::vector< SvXMLImportContextRef >::iterator aRemove(maImplContextVector.begin() + nIndexOfPreferred);
        pContext = *aRemove;
        maImplContextVector.erase(aRemove);

        // remove the rest from parent
        for(std::vector<SvXMLImportContextRef>::size_type a = 0; a < maImplContextVector.size(); a++)
        {
            SvXMLImportContext& rCandidate = *maImplContextVector[a];

            removeGraphicFromImportContext(rCandidate);
        }
        // re-insert it so that solveMultipleImages is idempotent
        maImplContextVector.clear();
        maImplContextVector.push_back(pContext);
    }
    else if (maImplContextVector.size() == 1)
    {
        pContext = maImplContextVector.front();
    }

    return pContext;
}

void MultiImageImportHelper::addContent(const SvXMLImportContext& rSvXMLImportContext)
{
    maImplContextVector.emplace_back(const_cast< SvXMLImportContext* >(&rSvXMLImportContext));
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Messung V0.5
C=94 H=97 G=95

¤ Dauer der Verarbeitung: 0.14 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.