116
112
FIBITMAP * DLL_CALLCONV
117
113
FreeImage_ConvertTo16Bits565(FIBITMAP *dib) {
118
if(!dib) return NULL;
120
int width = FreeImage_GetWidth(dib);
121
int height = FreeImage_GetHeight(dib);
123
switch (FreeImage_GetBPP(dib)) {
114
if(!dib || (FreeImage_GetImageType(dib) != FIT_BITMAP)) return NULL;
116
const int width = FreeImage_GetWidth(dib);
117
const int height = FreeImage_GetHeight(dib);
118
const int bpp = FreeImage_GetBPP(dib);
121
if ((FreeImage_GetRedMask(dib) == FI16_555_RED_MASK) && (FreeImage_GetGreenMask(dib) == FI16_555_GREEN_MASK) && (FreeImage_GetBlueMask(dib) == FI16_555_BLUE_MASK)) {
126
123
FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_565_RED_MASK, FI16_565_GREEN_MASK, FI16_565_BLUE_MASK);
129
for (int rows = 0; rows < height; rows++)
124
if(new_dib == NULL) {
127
for (int rows = 0; rows < height; rows++) {
128
FreeImage_ConvertLine16_555_To16_565(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width);
131
// copy metadata from src to dst
132
FreeImage_CloneMetadata(new_dib, dib);
137
return FreeImage_Clone(dib);
141
// other bpp cases => convert to RGB 565
142
FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_565_RED_MASK, FI16_565_GREEN_MASK, FI16_565_BLUE_MASK);
143
if(new_dib == NULL) {
147
// copy metadata from src to dst
148
FreeImage_CloneMetadata(new_dib, dib);
153
for (int rows = 0; rows < height; rows++) {
130
154
FreeImage_ConvertLine1To16_565(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width, FreeImage_GetPalette(dib));
140
FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_565_RED_MASK, FI16_565_GREEN_MASK, FI16_565_BLUE_MASK);
143
for (int rows = 0; rows < height; rows++)
162
for (int rows = 0; rows < height; rows++) {
144
163
FreeImage_ConvertLine4To16_565(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width, FreeImage_GetPalette(dib));
154
FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_565_RED_MASK, FI16_565_GREEN_MASK, FI16_565_BLUE_MASK);
157
for (int rows = 0; rows < height; rows++)
171
for (int rows = 0; rows < height; rows++) {
158
172
FreeImage_ConvertLine8To16_565(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
break; //jump down to the clone line
172
FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_565_RED_MASK, FI16_565_GREEN_MASK, FI16_565_BLUE_MASK);
175
for (int rows = 0; rows < height; rows++)
176
FreeImage_ConvertLine16_555_To16_565(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width);
186
FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_565_RED_MASK, FI16_565_GREEN_MASK, FI16_565_BLUE_MASK);
189
for (int rows = 0; rows < height; rows++)
180
for (int rows = 0; rows < height; rows++) {
190
181
FreeImage_ConvertLine24To16_565(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width);
200
FIBITMAP *new_dib = FreeImage_Allocate(width, height, 16, FI16_565_RED_MASK, FI16_565_GREEN_MASK, FI16_565_BLUE_MASK);
203
for (int rows = 0; rows < height; rows++)
189
for (int rows = 0; rows < height; rows++) {
204
190
FreeImage_ConvertLine32To16_565(FreeImage_GetScanLine(new_dib, rows), FreeImage_GetScanLine(dib, rows), width);
197
// unreachable code ...
198
FreeImage_Unload(new_dib);
213
return FreeImage_Clone(dib);