~ruther/CTU-FEE-B0B35APO-Semestral-project

6d5b042656b7853007a45b4ab0c721f1436b34c2 — František Boháček 3 years ago d2ba791
feat: add possibility to write only to part of the display
3 files changed, 18 insertions(+), 16 deletions(-)

M image-viewer/include/image.h
M image-viewer/src/image.c
M image-viewer/src/image_viewer.c
M image-viewer/include/image.h => image-viewer/include/image.h +3 -1
@@ 59,6 59,8 @@ image_region_t image_region_create(uint16_t x, uint16_t y, uint16_t width, uint1
bool image_region_move_within(image_region_t *to_move, direction_t direction,
                              int amount, image_region_t *border);

double image_write_to_display(image_t *image, display_t *display, image_region_t region);
double image_write_to_display(image_t *image, display_t *display,
                              image_region_t region,
                              image_region_t display_region);

#endif // __IMAGE_H__

M image-viewer/src/image.c => image-viewer/src/image.c +14 -14
@@ 66,6 66,7 @@ void image_set_pixel(image_t *image, uint16_t x, uint16_t y,
                       display_pixel_t pixel) {
  image->pixels[y * image->width + x] = pixel;
}

double get_scale_factor(uint16_t w, uint16_t h, image_region_t display_region) {
  double scale_x = (double)display_region.width / (double)w;
  double scale_y = (double)display_region.height / (double)h;


@@ 82,7 83,7 @@ double get_scale_factor(uint16_t w, uint16_t h, image_region_t display_region) {
}

static void image_write_downscale(image_t *image, display_t *display,
                                  image_region_t region, double scale_factor) {
                                  image_region_t region, image_region_t display_region, double scale_factor) {
  float downscale_factor = 1 / scale_factor;
  uint16_t avg_pixels = downscale_factor;
  uint16_t w = region.width, h = region.height;


@@ 96,8 97,8 @@ static void image_write_downscale(image_t *image, display_t *display,
  uint32_t avg_count = avg_pixels * avg_pixels;
  uint32_t downhalf = downscale_factor / 2;

  uint16_t beg_x = (DISPLAY_WIDTH - sw) / 2;
  uint16_t beg_y = (DISPLAY_HEIGHT - sh) / 2;
  uint16_t beg_x = (display_region.width - sw) / 2 + display_region.x;
  uint16_t beg_y = (display_region.height - sh) / 2 + display_region.y;

  for (int y = 0; y < sh; y++) {
    for (int x = 0; x < sw; x++) {


@@ 126,13 127,13 @@ static void image_write_downscale(image_t *image, display_t *display,
}

static void image_write_upscale(image_t *image, display_t *display,
                                image_region_t region, double scale_factor) {
                                image_region_t region, image_region_t display_region, double scale_factor) {
  float downscale_factor = 1 / scale_factor;
  uint16_t w = region.width, h = region.height;
  uint16_t sw = (uint16_t)(scale_factor * w), sh = (uint16_t)(scale_factor * h);

  uint16_t beg_x = (DISPLAY_WIDTH - sw) / 2;
  uint16_t beg_y = (DISPLAY_HEIGHT - sh) / 2;
  uint16_t beg_x = (display_region.width - sw) / 2 + display_region.x;
  uint16_t beg_y = (display_region.height - sh) / 2 + display_region.y;

  for (int y = 0; y < sh; y++) {
    for (int x = 0; x < sw; x++) {


@@ 146,31 147,30 @@ static void image_write_upscale(image_t *image, display_t *display,
}

static void image_write_direct(image_t *image, display_t *display,
                               image_region_t region) {
                               image_region_t region, image_region_t display_region) {
  for (int y = 0; y < region.height; y++) {
    for (int x = 0; x < region.width; x++) {
      display_set_pixel(display, x, y, image_get_pixel(image, x + region.x, y + region.y));
      display_set_pixel(display, x + display_region.x, y + display_region.y, image_get_pixel(image, x + region.x, y + region.y));
    }
  }
}

double image_write_to_display(image_t *image, display_t *display,
                            image_region_t region) {
                              image_region_t region, image_region_t display_region) {
  uint16_t w = region.width, h = region.height;
  if (w == DISPLAY_WIDTH && h == DISPLAY_HEIGHT) {
  if (w == display_region.width && h == display_region.height) {
    // write directly to image
    image_write_direct(image, display, region);
    image_write_direct(image, display, region, display_region);
    return 1;
  }

  image_region_t display_region = image_region_create(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT);
  double scale = get_scale_factor(w, h, display_region);

  // scaling
  if (scale < 1) {
    image_write_downscale(image, display, region, scale);
    image_write_downscale(image, display, region, display_region, scale);
  } else {
    image_write_upscale(image, display, region, scale);
    image_write_upscale(image, display, region, display_region, scale);
  }

  return scale;

M image-viewer/src/image_viewer.c => image-viewer/src/image_viewer.c +1 -1
@@ 156,6 156,6 @@ void image_viewer_start_loop(image_viewer_t *viewer, void *reg_knobs_base) {

void image_viewer_display_image(image_viewer_t *viewer) {
  cursor_hide(&viewer->cursor, viewer->display);
  viewer->scale_factor = image_write_to_display(&viewer->image, viewer->display, viewer->region);
  viewer->scale_factor = image_write_to_display(&viewer->image, viewer->display, viewer->region, viewer->display_region);
  display_render(viewer->display);
}

Do not follow this link