//Crops source buffer against destination and FB boundaries void calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst, const hwc_rect_t& scissor, int orient) { int& crop_l = crop.left; int& crop_t = crop.top; int& crop_r = crop.right; int& crop_b = crop.bottom; int crop_w = crop.right - crop.left; int crop_h = crop.bottom - crop.top; int& dst_l = dst.left; int& dst_t = dst.top; int& dst_r = dst.right; int& dst_b = dst.bottom; int dst_w = abs(dst.right - dst.left); int dst_h = abs(dst.bottom - dst.top); const int& sci_l = scissor.left; const int& sci_t = scissor.top; const int& sci_r = scissor.right; const int& sci_b = scissor.bottom; float leftCutRatio = 0.0f, rightCutRatio = 0.0f, topCutRatio = 0.0f, bottomCutRatio = 0.0f; if(dst_l < sci_l) { leftCutRatio = (float)(sci_l - dst_l) / (float)dst_w; dst_l = sci_l; } if(dst_r > sci_r) { rightCutRatio = (float)(dst_r - sci_r) / (float)dst_w; dst_r = sci_r; } if(dst_t < sci_t) { topCutRatio = (float)(sci_t - dst_t) / (float)dst_h; dst_t = sci_t; } if(dst_b > sci_b) { bottomCutRatio = (float)(dst_b - sci_b) / (float)dst_h; dst_b = sci_b; } calc_cut(leftCutRatio, topCutRatio, rightCutRatio, bottomCutRatio, orient); crop_l += crop_w * leftCutRatio; crop_t += crop_h * topCutRatio; crop_r -= crop_w * rightCutRatio; crop_b -= crop_h * bottomCutRatio; }
//Crops source buffer against destination and FB boundaries void calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst, const int fbWidth, const int fbHeight, int orient) { int& crop_l = crop.left; int& crop_t = crop.top; int& crop_r = crop.right; int& crop_b = crop.bottom; int crop_w = crop.right - crop.left; int crop_h = crop.bottom - crop.top; int& dst_l = dst.left; int& dst_t = dst.top; int& dst_r = dst.right; int& dst_b = dst.bottom; int dst_w = abs(dst.right - dst.left); int dst_h = abs(dst.bottom - dst.top); float leftCutRatio = 0.0f, rightCutRatio = 0.0f, topCutRatio = 0.0f, bottomCutRatio = 0.0f; if(dst_l < 0) { leftCutRatio = (float)(0.0f - dst_l) / (float)dst_w; dst_l = 0; } if(dst_r > fbWidth) { rightCutRatio = (float)(dst_r - fbWidth) / (float)dst_w; dst_r = fbWidth; } if(dst_t < 0) { topCutRatio = (float)(0 - dst_t) / (float)dst_h; dst_t = 0; } if(dst_b > fbHeight) { bottomCutRatio = (float)(dst_b - fbHeight) / (float)dst_h; dst_b = fbHeight; } calc_cut(leftCutRatio, topCutRatio, rightCutRatio, bottomCutRatio, orient); crop_l += crop_w * leftCutRatio; crop_t += crop_h * topCutRatio; crop_r -= crop_w * rightCutRatio; crop_b -= crop_h * bottomCutRatio; }