~cosme/ubuntu/precise/freeimage/freeimage-3.15.1

« back to all changes in this revision

Viewing changes to Source/FreeImage/Conversion16_555.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Cosme Domínguez Díaz
  • Date: 2010-07-20 13:42:15 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20100720134215-xt1454zaedv3b604
Tags: 3.13.1-0ubuntu1
* New upstream release. Closes: (LP: #607800)
 - Updated debian/freeimage-get-orig-source script.
 - Removing no longer necessary debian/patches/* and
   the patch system in debian/rules.
 - Updated debian/rules to work with the new Makefiles.
 - Drop from -O3 to -O2 and use lzma compression saves
   ~10 MB of free space. 
* lintian stuff
 - fixed debhelper-but-no-misc-depends
 - fixed ldconfig-symlink-missing-for-shlib

Show diffs side-by-side

added added

removed removed

Lines of Context:
115
115
 
116
116
FIBITMAP * DLL_CALLCONV
117
117
FreeImage_ConvertTo16Bits555(FIBITMAP *dib) {
118
 
        if(!dib) return NULL;
119
 
 
120
 
        int width = FreeImage_GetWidth(dib);
121
 
        int height = FreeImage_GetHeight(dib);
122
 
 
123
 
        switch (FreeImage_GetBPP(dib)) {
124
 
                case 1 :
125
 
                {
 
118
        if(!dib || (FreeImage_GetImageType(dib) != FIT_BITMAP)) return NULL;
 
119
 
 
120
        const int width = FreeImage_GetWidth(dib);
 
121
        const int height = FreeImage_GetHeight(dib);
 
122
        const int bpp = FreeImage_GetBPP(dib);
 
123
 
 
124
        if(bpp == 16) {
 
125
                if ((FreeImage_GetRedMask(dib) == FI16_565_RED_MASK) && (FreeImage_GetGreenMask(dib) == FI16_565_GREEN_MASK) && (FreeImage_GetBlueMask(dib) == FI16_565_BLUE_MASK)) {
 
126
                        // RGB 565
126
127
                        FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
127
 
 
128
 
                        if (new_dib) {
129
 
                                for (int rows = 0; rows < height; rows++)
 
128
                        if(new_dib == NULL) {
 
129
                                return NULL;
 
130
                        }
 
131
                        for (int rows = 0; rows < height; rows++) {
 
132
                                FreeImage_ConvertLine16_565_To16_555(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width);
 
133
                        }
 
134
 
 
135
                        // copy metadata from src to dst
 
136
                        FreeImage_CloneMetadata(new_dib, dib);
 
137
 
 
138
                        return new_dib;
 
139
                } else {
 
140
                        // RGB 555
 
141
                        return FreeImage_Clone(dib);
 
142
                }
 
143
        }
 
144
        else {
 
145
                // other bpp cases => convert to RGB 555
 
146
                FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
 
147
                if(new_dib == NULL) {
 
148
                        return NULL;
 
149
                }
 
150
 
 
151
                // copy metadata from src to dst
 
152
                FreeImage_CloneMetadata(new_dib, dib);
 
153
 
 
154
                switch (bpp) {
 
155
                        case 1 :
 
156
                        {
 
157
                                for (int rows = 0; rows < height; rows++) {
130
158
                                        FreeImage_ConvertLine1To16_555(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width, FreeImage_GetPalette(dib));
131
 
                                                                        
 
159
                                }
 
160
 
132
161
                                return new_dib;
133
162
                        }
134
163
 
135
 
                        break;
136
 
                }
137
 
 
138
 
                case 4 :
139
 
                {
140
 
                        FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
141
 
 
142
 
                        if (new_dib) {
143
 
                                for (int rows = 0; rows < height; rows++)
 
164
                        case 4 :
 
165
                        {
 
166
                                for (int rows = 0; rows < height; rows++) {
144
167
                                        FreeImage_ConvertLine4To16_555(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width, FreeImage_GetPalette(dib));
145
 
                                
 
168
                                }
 
169
 
146
170
                                return new_dib;
147
171
                        }
148
172
 
149
 
                        break;
150
 
                }
151
 
 
152
 
                case 8 :
153
 
                {
154
 
                        FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
155
 
 
156
 
                        if (new_dib) {
157
 
                                for (int rows = 0; rows < height; rows++)
 
173
                        case 8 :
 
174
                        {
 
175
                                for (int rows = 0; rows < height; rows++) {
158
176
                                        FreeImage_ConvertLine8To16_555(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width, FreeImage_GetPalette(dib));
159
 
                                
 
177
                                }
 
178
 
160
179
                                return new_dib;
161
180
                        }
162
181
 
163
 
                        break;
164
 
                }
165
 
 
166
 
                case 16 :
167
 
                {       
168
 
                        if ((FreeImage_GetRedMask(dib) == FI16_565_RED_MASK) && (FreeImage_GetGreenMask(dib) == FI16_565_GREEN_MASK) && (FreeImage_GetBlueMask(dib) == FI16_565_BLUE_MASK)) {
169
 
                                FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
170
 
 
171
 
                                if (new_dib) {
172
 
                                        for (int rows = 0; rows < height; rows++)
173
 
                                                FreeImage_ConvertLine16_565_To16_555(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width);
174
 
                                        
175
 
                                        return new_dib;
176
 
                                }
177
 
                        }
178
 
 
179
 
                        break; //jump down to the clone line
180
 
                }
181
 
 
182
 
                case 24 :
183
 
                {
184
 
                        FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
185
 
 
186
 
                        if (new_dib) {
187
 
                                for (int rows = 0; rows < height; rows++)
 
182
                        case 24 :
 
183
                        {
 
184
                                for (int rows = 0; rows < height; rows++) {
188
185
                                        FreeImage_ConvertLine24To16_555(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width);
189
 
                                
 
186
                                }
 
187
 
190
188
                                return new_dib;
191
189
                        }
192
190
 
193
 
                        break;
194
 
                }
195
 
 
196
 
                case 32 :
197
 
                {
198
 
                        FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
199
 
 
200
 
                        if (new_dib) {
201
 
                                for (int rows = 0; rows < height; rows++)
 
191
                        case 32 :
 
192
                        {
 
193
                                for (int rows = 0; rows < height; rows++) {
202
194
                                        FreeImage_ConvertLine32To16_555(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width);
203
 
                                
 
195
                                }
 
196
 
204
197
                                return new_dib;
205
198
                        }
206
199
 
207
 
                        break;
 
200
                        default :
 
201
                                // unreachable code ...
 
202
                                FreeImage_Unload(new_dib);
 
203
                                break;
 
204
 
208
205
                }
209
206
        }
210
207
 
211
 
        return FreeImage_Clone(dib);
 
208
        return NULL;
212
209
}