| 258 | } |
| 259 | |
| 260 | int DrawBitmapImage(int x, int y, int w, int h, uint8_t *data, surface_t* surface, bool preserveAspectRatio) { |
| 261 | bitmap_file_header_t bmpHeader = *(bitmap_file_header_t*)data; |
| 262 | bitmap_info_header_t bmpInfoHeader = *(bitmap_info_header_t*)(data + sizeof(bitmap_file_header_t)); |
| 263 | data += bmpHeader.offset; |
| 264 | |
| 265 | int originalWidth = bmpInfoHeader.width; |
| 266 | int originalHeight = bmpInfoHeader.height; |
| 267 | |
| 268 | double xScale = ((double)w) / originalWidth; |
| 269 | double yScale = (((double)h) / originalHeight); |
| 270 | double xOffset = 0; |
| 271 | |
| 272 | if(preserveAspectRatio){ |
| 273 | xScale = ((double)h * (((double)originalWidth) / originalHeight)) / originalWidth; |
| 274 | // if((xScale * originalWidth) < originalWidth) xOffset = (originalWidth - (xScale * originalWidth)) / 2; |
| 275 | } |
| 276 | |
| 277 | |
| 278 | uint8_t bmpBpp = 24; |
| 279 | uint32_t rowSize = (int)floor((bmpBpp*bmpInfoHeader.width + 31) / 32) * 4; |
| 280 | uint32_t bmp_offset = rowSize * (originalHeight - 1); |
| 281 | |
| 282 | uint32_t pixelSize = 4; |
| 283 | for (int i = 0; i < h && i + y < surface->height; i++) { |
| 284 | double _yval = ((double)i) / yScale; |
| 285 | if(ceil(_yval) >= originalHeight) break; |
| 286 | for (int j = 0; j < w && j + x < surface->width; j++) { |
| 287 | double _xval = xOffset + ((double) + j) / xScale; |
| 288 | if(ceil(_xval) >= originalWidth) break; |
| 289 | |
| 290 | uint8_t r = Interpolate(data[bmp_offset - ((int)floor(_yval) * rowSize) + (int)floor(_xval) * (bmpBpp / 8) + 0], data[bmp_offset - ((int)floor(_yval) * rowSize) + (int)ceil(_xval) * (bmpBpp / 8) + 0], data[bmp_offset - ((int)ceil(_yval) * rowSize) + (int)floor(_xval) * (bmpBpp / 8) + 0], data[bmp_offset - ((int)ceil(_yval) * rowSize) + (int)ceil(_xval) * (bmpBpp / 8) + 0], _xval, _yval); |
| 291 | uint8_t g = Interpolate(data[bmp_offset - ((int)floor(_yval) * rowSize) + (int)floor(_xval) * (bmpBpp / 8) + 1], data[bmp_offset - ((int)floor(_yval) * rowSize) + (int)ceil(_xval) * (bmpBpp / 8) + 1], data[bmp_offset - ((int)ceil(_yval) * rowSize) + (int)floor(_xval) * (bmpBpp / 8) + 1], data[bmp_offset - ((int)ceil(_yval) * rowSize) + (int)ceil(_xval) * (bmpBpp / 8) + 1], _xval, _yval); |
| 292 | uint8_t b = Interpolate(data[bmp_offset - ((int)floor(_yval) * rowSize) + (int)floor(_xval) * (bmpBpp / 8) + 2], data[bmp_offset - ((int)floor(_yval) * rowSize) + (int)ceil(_xval) * (bmpBpp / 8) + 2], data[bmp_offset - ((int)ceil(_yval) * rowSize) + (int)floor(_xval) * (bmpBpp / 8) + 2], data[bmp_offset - ((int)ceil(_yval) * rowSize) + (int)ceil(_xval) * (bmpBpp / 8) + 2], _xval, _yval); |
| 293 | |
| 294 | uint32_t offset = (y + i)*(surface->width*pixelSize) + (x + j) * pixelSize; |
| 295 | surface->buffer[offset] = r; |
| 296 | surface->buffer[offset + 1] = g; |
| 297 | surface->buffer[offset + 2] = b; |
| 298 | } |
| 299 | } |
| 300 | |
| 301 | return 0; |
| 302 | } |
| 303 | } |
nothing calls this directly
no test coverage detected