1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef INCLUDED_BASEBMP_INTCONVERSION_HXX
29 #define INCLUDED_BASEBMP_INTCONVERSION_HXX
30 
31 #include <vigra/rgbvalue.hxx>
32 #include <functional>
33 
34 namespace basebmp
35 {
36     // metafunctions to retrieve correct POD from/to basebmp::Color
37     //------------------------------------------------------------------------
38 
39     /// type-safe conversion from RgbValue to packed int32
40     template< class RgbVal > struct UInt32FromRgbValue
41     {
42         sal_uInt32 operator()( RgbVal const& c ) const
43         {
44             return (c[0] << 16) | (c[1] << 8) | c[2];
45         }
46     };
47 
48     /// type-safe conversion from packed int32 to RgbValue
49     template< class RgbVal > struct RgbValueFromUInt32
50     {
51         RgbVal operator()( sal_uInt32 c ) const
52         {
53             return RgbVal((c >> 16) & 0xFF,
54                           (c >> 8) & 0xFF,
55                           c & 0xFF);
56         }
57     };
58 
59     /// Get converter from given data type to sal_uInt32
60     template< typename DataType > struct uInt32Converter
61     {
62         typedef std::identity<DataType> to;
63         typedef std::identity<DataType> from;
64     };
65     template< unsigned int RedIndex,
66               unsigned int GreenIndex,
67               unsigned int BlueIndex > struct uInt32Converter<
68                   vigra::RGBValue< sal_uInt8,
69                                    RedIndex,
70                                    GreenIndex,
71                                    BlueIndex > >
72     {
73         typedef UInt32FromRgbValue<
74             vigra::RGBValue< sal_uInt8,
75                              RedIndex,
76                              GreenIndex,
77                              BlueIndex > >
78             to;
79         typedef RgbValueFromUInt32<
80             vigra::RGBValue< sal_uInt8,
81                              RedIndex,
82                              GreenIndex,
83                              BlueIndex > >
84             from;
85     };
86 }
87 
88 #endif /* INCLUDED_BASEBMP_INTCONVERSION_HXX */
89