summaryrefslogtreecommitdiff
path: root/vcl/quartz/salmathutils.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/quartz/salmathutils.cxx')
-rw-r--r--vcl/quartz/salmathutils.cxx154
1 files changed, 154 insertions, 0 deletions
diff --git a/vcl/quartz/salmathutils.cxx b/vcl/quartz/salmathutils.cxx
new file mode 100644
index 000000000000..e1222aa63061
--- /dev/null
+++ b/vcl/quartz/salmathutils.cxx
@@ -0,0 +1,154 @@
+/* -*- 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 "quartz/salmathutils.hxx"
+
+#include <stdlib.h>
+
+// =======================================================================
+
+// =======================================================================
+
+#define Swap( x, y ) { x ^= y; y ^= x; x ^= y; }
+
+// =======================================================================
+
+// =======================================================================
+
+// Storage free swapping using XOR
+
+void CSwap ( char &rX, char &rY )
+{
+ Swap( rX, rY );
+} // CSwap
+
+// -----------------------------------------------------------------------
+
+// Storage free swapping using XOR
+
+void UCSwap ( unsigned char &rX, unsigned char &rY )
+{
+ Swap( rX, rY );
+} // UCSwap
+
+// -----------------------------------------------------------------------
+
+// Storage free swapping using XOR
+
+void SSwap ( short &rX, short &rY )
+{
+ Swap( rX, rY );
+} // SSwap
+
+// -----------------------------------------------------------------------
+
+// Storage free swapping using XOR
+
+void USSwap ( unsigned short &rX, unsigned short &rY )
+{
+ Swap( rX, rY );
+} // USSwap
+
+// -----------------------------------------------------------------------
+
+// Storage free swapping using XOR
+
+void LSwap ( long &rX, long &rY )
+{
+ Swap( rX, rY );
+} // LSwap
+
+// -----------------------------------------------------------------------
+
+// Storage free swapping using XOR
+
+void ULSwap ( unsigned long &rX, unsigned long &rY )
+{
+ Swap( rX, rY );
+} // ULSwap
+
+// =======================================================================
+
+// =======================================================================
+
+// -----------------------------------------------------------------------
+//
+// This way of measuring distance is also called the "Manhattan distance."
+// Manhattan distance takes advantage of the fact that the sum of the
+// lengths of the three components of a 3D vector is a rough approxima-
+// tion of the vector's length.
+//
+// -----------------------------------------------------------------------
+
+unsigned long Euclidian2Norm ( const LRectCoorVector pVec )
+{
+ unsigned long ndist = 0;
+
+ if ( pVec )
+ {
+ long nDX = 0;
+ long nDY = 0;
+ long nDZ = 0;
+ unsigned long nMax = 0;
+ unsigned long nMed = 0;
+ unsigned long nMin = 0;
+
+ // Find |x'-x|, |y'-y|, and |z'-z| from (x,y,z) and (x',y',z')
+
+ nDX = pVec[1].x - pVec[0].x;
+ nDY = pVec[1].y - pVec[0].y;
+ nDZ = pVec[1].z - pVec[0].z;
+
+ nMax = (unsigned long)abs( nDX );
+ nMed = (unsigned long)abs( nDY );
+ nMin = (unsigned long)abs( nDZ );
+
+ // Sort them (3 compares, 0-3 swaps)
+
+ if ( nMax < nMed )
+ {
+ Swap( nMax, nMed );
+ } // if
+
+ if ( nMax < nMin )
+ {
+ Swap( nMax, nMin );
+ } // if
+
+ // Approximate Euclidian distance:
+ //
+ // d = max + (11/32)*med + (1/4)*min
+ //
+ // with +/- 8% error, where the exact formulae for d is
+ //
+ // || (x',y',z') - (x,y,z) || = { |x'-x|^2 + |y'-y|^2 + |z'-z|^2 }^(1/2)
+
+ ndist = nMax + ( nMin >> 2UL )
+ + ( ( ( nMed << 3UL ) + ( nMed << 1UL ) + nMed ) >> 5UL );
+ } // if
+
+ return ndist;
+} // RGBDistance
+
+// =======================================================================
+
+// =======================================================================
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */