Bump version to 6.4-15
[LibreOffice.git] / svx / source / sdr / misc / ImageMapInfo.cxx
blob754e341c811b97e0e44ee55e1b36aa1145dea1b6
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <svx/ImageMapInfo.hxx>
22 #include <svx/svdobj.hxx>
23 #include <svx/svdograf.hxx>
24 #include <svx/svdoole2.hxx>
25 #include <svx/unoshape.hxx>
26 #include <vcl/imapobj.hxx>
27 #include <vcl/svapp.hxx>
28 #include <vcl/window.hxx>
30 SvxIMapInfo* SvxIMapInfo::GetIMapInfo(SdrObject const* pObject)
32 assert(pObject);
34 SvxIMapInfo* pIMapInfo = nullptr;
35 sal_uInt16 nCount = pObject->GetUserDataCount();
37 // Can we find IMap information within the user data?
38 for (sal_uInt16 i = 0; i < nCount; i++)
40 SdrObjUserData* pUserData = pObject->GetUserData(i);
42 if ((pUserData->GetInventor() == SdrInventor::StarDrawUserData)
43 && (pUserData->GetId() == SVX_IMAPINFO_ID))
44 pIMapInfo = static_cast<SvxIMapInfo*>(pUserData);
47 return pIMapInfo;
50 IMapObject* SvxIMapInfo::GetHitIMapObject(const SdrObject* pObj, const Point& rWinPoint,
51 const vcl::Window* rCmpWnd)
53 SvxIMapInfo* pIMapInfo = GetIMapInfo(pObj);
54 IMapObject* pIMapObj = nullptr;
56 if (pIMapInfo)
58 const MapMode aMap100(MapUnit::Map100thMM);
59 Size aGraphSize;
60 Point aRelPoint(rWinPoint);
61 ImageMap& rImageMap = const_cast<ImageMap&>(pIMapInfo->GetImageMap());
62 tools::Rectangle& rRect = const_cast<tools::Rectangle&>(pObj->GetLogicRect());
64 if (rCmpWnd)
66 MapMode aWndMode = rCmpWnd->GetMapMode();
67 aRelPoint = rCmpWnd->LogicToLogic(rWinPoint, &aWndMode, &aMap100);
68 rRect = rCmpWnd->LogicToLogic(pObj->GetLogicRect(), &aWndMode, &aMap100);
71 bool bObjSupported = false;
73 // execute HitTest
74 if (auto pGrafObj = dynamic_cast<const SdrGrafObj*>(pObj)) // simple graphics object
76 const GeoStat& rGeo = pGrafObj->GetGeoStat();
77 std::unique_ptr<SdrGrafObjGeoData> pGeoData(
78 static_cast<SdrGrafObjGeoData*>(pGrafObj->GetGeoData()));
80 // Undo rotation
81 if (rGeo.nRotationAngle)
82 RotatePoint(aRelPoint, rRect.TopLeft(), -rGeo.nSin, rGeo.nCos);
84 // Undo mirroring
85 if (pGeoData->bMirrored)
86 aRelPoint.setX(rRect.Right() + rRect.Left() - aRelPoint.X());
88 // Undo shearing
89 if (rGeo.nShearAngle)
90 ShearPoint(aRelPoint, rRect.TopLeft(), -rGeo.nTan);
92 if (pGrafObj->GetGrafPrefMapMode().GetMapUnit() == MapUnit::MapPixel)
93 aGraphSize = Application::GetDefaultDevice()->PixelToLogic(
94 pGrafObj->GetGrafPrefSize(), aMap100);
95 else
96 aGraphSize = OutputDevice::LogicToLogic(pGrafObj->GetGrafPrefSize(),
97 pGrafObj->GetGrafPrefMapMode(), aMap100);
99 bObjSupported = true;
101 else if (auto pOleObj = dynamic_cast<const SdrOle2Obj*>(pObj)) // OLE object
103 aGraphSize = pOleObj->GetOrigObjSize();
104 bObjSupported = true;
107 // Everything worked out well, thus execute HitTest
108 if (bObjSupported)
110 // Calculate relative position of mouse cursor
111 aRelPoint -= rRect.TopLeft();
112 pIMapObj = rImageMap.GetHitIMapObject(aGraphSize, rRect.GetSize(), aRelPoint);
114 // We don't care about deactivated objects
115 if (pIMapObj && !pIMapObj->IsActive())
116 pIMapObj = nullptr;
120 return pIMapObj;