Apply maemo2 patch
[opencv] / otherlibs / VlGrFmts / grfmt.cpp
1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //  
3 //                      INTEL CORPORATION PROPRIETARY INFORMATION              
4 //         This software is supplied under the terms of a license agreement or 
5 //         nondisclosure agreement with Intel Corporation and may not be copied
6 //         or disclosed except in accordance with the terms of that agreement. 
7 //               Copyright (c) 1999 Intel Corporation. All Rights Reserved.    
8 //  
9 //    RCS:
10 //       Source:    grfmt.cpp$
11 //       $Revision: 1.2 $
12 //      Purpose: 
13 //      Contents:
14 //      Authors: Vadim Pisarevsky
15 //  
16 //M*/
17
18 #include <assert.h>
19 #include <string.h>
20
21 #include "grfmt.h"
22 #include "bitstrm.h"
23
24 ///////////////////// graphics_format_reader //////////////////////////
25
26 graphics_format_reader::graphics_format_reader()
27 {
28     m_width = m_height = -1;
29     m_sign_len    = 0;
30     m_signature   = 0;
31     m_description = 0;
32     m_filename[0] ='\0';
33 }
34
35
36 void  graphics_format_reader::set_file( const char* filename )
37 {
38     assert( filename != 0 && strlen(filename) < sizeof(m_filename) );
39     strcpy( m_filename, filename );
40 }
41
42
43 bool  graphics_format_reader::check_format( const char* signature )
44 {
45     assert( signature != 0 );
46     return memcmp( m_signature, signature, m_sign_len ) == 0;
47 }
48
49
50 ///////////////////// graphics_format_reader_list //////////////////////////
51
52 graphics_format_readers_list::graphics_format_readers_list()
53 {
54     m_readers = 0;
55     remove_all_readers();
56 }
57
58
59 graphics_format_readers_list::~graphics_format_readers_list()
60 {
61     remove_all_readers();
62 }
63
64
65 void  graphics_format_readers_list::remove_all_readers()
66 {
67     if( m_readers )
68     {
69         for( int i = 0; i < m_cur_readers; i++ ) delete m_readers[i];
70         delete m_readers;
71     }
72     m_readers = 0;
73     m_max_readers = m_cur_readers = 0;
74 }
75
76
77 void  graphics_format_readers_list::add_reader( graphics_format_reader* reader )
78 {
79     assert( reader != 0 );
80     if( m_cur_readers == m_max_readers )
81     {
82         // reallocate the readers pointers storage
83         int new_max_readers = 2*m_max_readers;
84         if( new_max_readers < 16 ) new_max_readers = 16;
85
86         graphics_format_reader** new_readers = 
87             new graphics_format_reader*[new_max_readers];
88
89         for( int i = 0; i < m_cur_readers; i++ ) new_readers[i] = m_readers[i];
90
91         delete m_readers;
92         m_readers = new_readers;
93         m_max_readers = new_max_readers;
94     }
95
96     m_readers[m_cur_readers++] = reader;
97 }
98
99
100 list_position*  graphics_format_readers_list::get_first_reader_pos()
101 {
102     return (list_position*)m_readers;
103 }
104
105
106 graphics_format_reader* graphics_format_readers_list::
107     get_next_reader( list_position*& pos )
108 {
109     graphics_format_reader* reader = 0;
110     graphics_format_reader** temp = (graphics_format_reader**)pos;
111
112     assert( temp == 0 || (m_readers <= temp && temp < m_readers + m_cur_readers));
113     if( temp )
114     {
115         reader = *temp++;
116         pos = (list_position*)(temp < m_readers + m_cur_readers ? temp : 0);
117     }
118     return reader;
119 }
120
121
122 graphics_format_reader* graphics_format_readers_list::
123     find_reader( const char* filename )
124 {
125     int    i;
126     FILE*  f = fopen( filename, "rb" );
127     char   signature[4096];
128     int    sign_len = 0;
129     graphics_format_reader* reader = 0;
130
131     if( f )
132     {
133         for( i = 0; i < m_cur_readers; i++ )
134         {
135             int temp = m_readers[i]->get_signature_length();
136             if( temp > sign_len ) sign_len = temp;
137         }
138
139         assert( sign_len <= sizeof(signature) );
140
141         sign_len = fread( signature, 1, sign_len, f );
142         fclose(f);
143
144         for( i = 0; i < m_cur_readers; i++ )
145         {
146             int temp = m_readers[i]->get_signature_length();
147             if( temp <= sign_len && m_readers[i]->check_format(signature))
148             {
149                 reader = m_readers[i];
150                 break;
151             }
152         }
153     }
154
155     return reader;
156 }
157
158 int  graphics_format_readers_list::get_filters_string( char* buffer, int maxlen )
159 {
160     buffer, maxlen;
161     return 0;
162 }
163
164
165 void cvt_bgr_to_gray( byte* bgr, byte* gray, int len )
166 {
167 #define  SCALE  8
168 #define  cR  (int)(0.299*(1 << SCALE) + 0.5)
169 #define  cG  (int)(0.587*(1 << SCALE) + 0.5)
170 #define  cB  (int)(0.114*(1 << SCALE) + 0.5)
171     int i;
172     for( i = 0; i < len; i++, bgr += 3 )
173     {
174         int t = descale( bgr[0]*cB + bgr[1]*cG + bgr[2]*cR, SCALE );
175         gray[i] = saturate( t );
176     }
177 }
178
179 void cvt_palette_to_gray( palette_entry* palette, byte* gray_palette, int entries )
180 {
181     int i;
182     for( i = 0; i < entries; i++ )
183     {
184         cvt_bgr_to_gray( (byte*)(palette + i), gray_palette + i, 1 );
185     }
186 }
187