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); }
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; }
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; }