116
116
FIBITMAP * DLL_CALLCONV
117
117
FreeImage_ConvertTo16Bits555(FIBITMAP *dib) {
118
if(!dib) return NULL;
120
int width = FreeImage_GetWidth(dib);
121
int height = FreeImage_GetHeight(dib);
123
switch (FreeImage_GetBPP(dib)) {
118
if(!dib || (FreeImage_GetImageType(dib) != FIT_BITMAP)) return NULL;
120
const int width = FreeImage_GetWidth(dib);
121
const int height = FreeImage_GetHeight(dib);
122
const int bpp = FreeImage_GetBPP(dib);
125
if ((FreeImage_GetRedMask(dib) == FI16_565_RED_MASK) && (FreeImage_GetGreenMask(dib) == FI16_565_GREEN_MASK) && (FreeImage_GetBlueMask(dib) == FI16_565_BLUE_MASK)) {
126
127
FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
129
for (int rows = 0; rows < height; rows++)
128
if(new_dib == NULL) {
131
for (int rows = 0; rows < height; rows++) {
132
FreeImage_ConvertLine16_565_To16_555(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width);
135
// copy metadata from src to dst
136
FreeImage_CloneMetadata(new_dib, dib);
141
return FreeImage_Clone(dib);
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) {
151
// copy metadata from src to dst
152
FreeImage_CloneMetadata(new_dib, dib);
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));
140
FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
143
for (int rows = 0; rows < height; rows++)
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));
154
FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
157
for (int rows = 0; rows < height; rows++)
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));
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);
172
for (int rows = 0; rows < height; rows++)
173
FreeImage_ConvertLine16_565_To16_555(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width);
179
break; //jump down to the clone line
184
FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
187
for (int rows = 0; rows < height; rows++)
184
for (int rows = 0; rows < height; rows++) {
188
185
FreeImage_ConvertLine24To16_555(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width);
198
FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_555_RED_MASK, FI16_555_GREEN_MASK, FI16_555_BLUE_MASK);
201
for (int rows = 0; rows < height; rows++)
193
for (int rows = 0; rows < height; rows++) {
202
194
FreeImage_ConvertLine32To16_555(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width);
201
// unreachable code ...
202
FreeImage_Unload(new_dib);
211
return FreeImage_Clone(dib);