MCPcopy Create free account
hub / github.com/LemonOSProject/LemonOS / DrawBitmapImage

Function DrawBitmapImage

LibLemon/src/gfx/image.cpp:260–302  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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}

Callers

nothing calls this directly

Calls 2

floorFunction · 0.85
InterpolateFunction · 0.85

Tested by

no test coverage detected