1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_canvas.hxx"
26 
27 #include "dx_config.hxx"
28 
29 #include <com/sun/star/uno/Any.hxx>
30 #include <com/sun/star/uno/Sequence.hxx>
31 #include <comphelper/anytostring.hxx>
32 #include <basegfx/vector/b2ivector.hxx>
33 #include <cppuhelper/exc_hlp.hxx>
34 
35 using namespace com::sun::star;
36 
37 namespace dxcanvas
38 {
39     DXCanvasItem::DXCanvasItem() :
40         ConfigItem(
41             ::rtl::OUString(
42                 RTL_CONSTASCII_USTRINGPARAM( "Office.Canvas/DXCanvas" )),
43             CONFIG_MODE_IMMEDIATE_UPDATE ),
44         maValues(),
45         maMaxTextureSize(),
46         mbBlacklistCurrentDevice(false),
47         mbValuesDirty(false)
48     {
49         try
50         {
51             uno::Sequence< ::rtl::OUString > aName(1);
52             aName[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DeviceBlacklist" ));
53 
54             uno::Sequence< uno::Any > aProps( GetProperties( aName ));
55             uno::Sequence< sal_Int32 > aValues;
56 
57             if( aProps.getLength() > 0 &&
58                 (aProps[0] >>= aValues) )
59             {
60                 const sal_Int32* pValues = aValues.getConstArray();
61                 const sal_Int32 nNumEntries( aValues.getLength()*sizeof(sal_Int32)/sizeof(DeviceInfo) );
62                 for( sal_Int32 i=0; i<nNumEntries; ++i )
63                 {
64                     DeviceInfo aInfo;
65                     aInfo.nVendorId         = *pValues++;
66                     aInfo.nDeviceId         = *pValues++;
67                     aInfo.nDeviceSubSysId   = *pValues++;
68                     aInfo.nDeviceRevision   = *pValues++;
69                     aInfo.nDriverId         = *pValues++;
70                     aInfo.nDriverVersion    = *pValues++;
71                     aInfo.nDriverSubVersion = *pValues++;
72                     aInfo.nDriverBuildId    = *pValues++;
73                     maValues.insert(aInfo);
74                 }
75             }
76 
77             aName[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "BlacklistCurrentDevice" ));
78             aProps = GetProperties( aName );
79             if( aProps.getLength() > 0 )
80                 aProps[0] >>= mbBlacklistCurrentDevice;
81 
82             aName[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MaxTextureSize" ));
83             aProps = GetProperties( aName );
84             if( aProps.getLength() > 0 )
85                 maMaxTextureSize.reset( aProps[0].get<sal_Int32>() );
86             else
87                 maMaxTextureSize.reset();
88         }
89         catch( uno::Exception& )
90         {
91             OSL_ENSURE( false,
92                         rtl::OUStringToOString(
93                             comphelper::anyToString( cppu::getCaughtException() ),
94                             RTL_TEXTENCODING_UTF8 ).getStr() );
95         }
96     }
97 
98     DXCanvasItem::~DXCanvasItem()
99     {
100         if( !mbValuesDirty )
101             return;
102 
103         try
104         {
105             uno::Sequence< ::rtl::OUString > aName(1);
106             aName[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DeviceBlacklist" ));
107 
108             uno::Sequence< sal_Int32 > aValues( sizeof(DeviceInfo)/sizeof(sal_Int32)*maValues.size() );
109 
110             sal_Int32* pValues = aValues.getArray();
111             ValueSet::const_iterator aIter( maValues.begin() );
112             const ValueSet::const_iterator aEnd( maValues.end() );
113             while( aIter != aEnd )
114             {
115                 const DeviceInfo& rInfo( *aIter );
116                 *pValues++ = rInfo.nVendorId;
117                 *pValues++ = rInfo.nDeviceId;
118                 *pValues++ = rInfo.nDeviceSubSysId;
119                 *pValues++ = rInfo.nDeviceRevision;
120                 *pValues++ = rInfo.nDriverId;
121                 *pValues++ = rInfo.nDriverVersion;
122                 *pValues++ = rInfo.nDriverSubVersion;
123                 *pValues++ = rInfo.nDriverBuildId;
124                 ++aIter;
125             }
126 
127             uno::Sequence< uno::Any > aValue(1);
128             aValue[0] <<= aValues;
129             PutProperties( aName, aValue );
130         }
131         catch( uno::Exception& )
132         {
133             OSL_ENSURE( false,
134                         rtl::OUStringToOString(
135                             comphelper::anyToString( cppu::getCaughtException() ),
136                             RTL_TEXTENCODING_UTF8 ).getStr() );
137         }
138     }
139 
140 	void DXCanvasItem::Notify( const com::sun::star::uno::Sequence<rtl::OUString>& ) {}
141 	void DXCanvasItem::Commit() {}
142 
143     bool DXCanvasItem::isDeviceUsable( const DeviceInfo& rDeviceInfo ) const
144     {
145         return maValues.find(rDeviceInfo) == maValues.end();
146     }
147 
148     bool DXCanvasItem::isBlacklistCurrentDevice() const
149     {
150         return mbBlacklistCurrentDevice;
151     }
152 
153     void DXCanvasItem::blacklistDevice( const DeviceInfo& rDeviceInfo )
154     {
155         mbValuesDirty = true;
156         maValues.insert(rDeviceInfo);
157     }
158 
159     void DXCanvasItem::adaptMaxTextureSize( basegfx::B2IVector& io_maxTextureSize ) const
160     {
161         if( maMaxTextureSize )
162         {
163             io_maxTextureSize.setX(
164                 std::min( *maMaxTextureSize,
165                           io_maxTextureSize.getX() ));
166             io_maxTextureSize.setY(
167                 std::min( *maMaxTextureSize,
168                           io_maxTextureSize.getY() ));
169         }
170     }
171 
172 }
173