예제 #1
0
static void src_dst_split_scaling(int src_size, int dst_size,
                                  int scaled_src_size, bool unscaled,
                                  float zoom, float align, float pan,
                                  int *src_start, int *src_end,
                                  int *dst_start, int *dst_end,
                                  int *osd_margin_a, int *osd_margin_b)
{
    if (unscaled) {
        scaled_src_size = src_size;
        zoom = 0.0;
    }

    scaled_src_size *= powf(2, zoom);
    align = (align + 1) / 2;

    *src_start = 0;
    *src_end = src_size;
    *dst_start = (dst_size - scaled_src_size) * align + pan * scaled_src_size;
    *dst_end = *dst_start + scaled_src_size;

    // Distance of screen frame to video
    *osd_margin_a = *dst_start;
    *osd_margin_b = dst_size - *dst_end;

    // Clip to screen
    int s_src = *src_end - *src_start;
    int s_dst = *dst_end - *dst_start;
    if (*dst_start < 0) {
        int border = -(*dst_start) * s_src / s_dst;
        *src_start += border;
        *dst_start = 0;
    }
    if (*dst_end > dst_size) {
        int border = (*dst_end - dst_size) * s_src / s_dst;
        *src_end -= border;
        *dst_end = dst_size;
    }

    if (unscaled) {
        // Force unscaled by reducing the range for src or dst
        int src_s = *src_end - *src_start;
        int dst_s = *dst_end - *dst_start;
        if (src_s > dst_s) {
            *src_end = *src_start + dst_s;
        } else if (src_s < dst_s) {
            *dst_end = *dst_start + src_s;
        }
    }

    // For sanity: avoid bothering VOs with corner cases
    clamp_size(src_size, src_start, src_end);
    clamp_size(dst_size, dst_start, dst_end);
}
예제 #2
0
파일: nvram_file.cpp 프로젝트: char32/24aa
size_t File::read(uint8_t *buf, size_t n) {
  size_t acquired;

  osalDbgAssert(NULL != this->mtd, "File not opened");
  osalDbgCheck(NULL != buf);

  n = clamp_size(n);
  if (0 == n)
    return 0;

  acquired = mtd->read(buf, n, tip + start);
  tip += acquired;
  return acquired;
}
예제 #3
0
파일: nvram_file.cpp 프로젝트: char32/24aa
size_t File::write(const uint8_t *buf, size_t n) {

  size_t written;

  osalDbgAssert(NULL != this->mtd, "File not opened");
  osalDbgCheck(NULL != buf);

  n = clamp_size(n);
  if (0 == n)
    return 0;

  written = mtd->write(buf, n, tip + start);
  tip += written;
  return written;
}