// Given previous and current canvas, picks the optimal rectangle for the // current frame. The initial guess for 'rect' will be the full canvas. static int GetSubRect(const WebPPicture* const prev_canvas, const WebPPicture* const curr_canvas, int is_key_frame, int is_first_frame, int empty_rect_allowed, FrameRect* const rect, WebPPicture* const sub_frame) { rect->x_offset_ = 0; rect->y_offset_ = 0; rect->width_ = curr_canvas->width; rect->height_ = curr_canvas->height; if (!is_key_frame || is_first_frame) { // Optimize frame rectangle. // Note: This behaves as expected for first frame, as 'prev_canvas' is // initialized to a fully transparent canvas in the beginning. MinimizeChangeRectangle(prev_canvas, curr_canvas, rect); } if (IsEmptyRect(rect)) { if (empty_rect_allowed) { // No need to get 'sub_frame'. return 1; } else { // Force a 1x1 rectangle. rect->width_ = 1; rect->height_ = 1; assert(rect->x_offset_ == 0); assert(rect->y_offset_ == 0); } } SnapToEvenOffsets(rect); return WebPPictureView(curr_canvas, rect->x_offset_, rect->y_offset_, rect->width_, rect->height_, sub_frame); }
// Given previous and current canvas, picks the optimal rectangle for the // current frame. The initial guess for 'rect' will be the full canvas. static int GetSubRect(const WebPPicture* const prev_canvas, const WebPPicture* const curr_canvas, int is_key_frame, int is_first_frame, FrameRect* const rect, WebPPicture* const sub_frame) { rect->x_offset_ = 0; rect->y_offset_ = 0; rect->width_ = curr_canvas->width; rect->height_ = curr_canvas->height; if (!is_key_frame || is_first_frame) { // Optimize frame rectangle. // Note: This behaves as expected for first frame, as 'prev_canvas' is // initialized to a fully transparent canvas in the beginning. MinimizeChangeRectangle(prev_canvas, curr_canvas, rect); } SnapToEvenOffsets(rect); return WebPPictureView(curr_canvas, rect->x_offset_, rect->y_offset_, rect->width_, rect->height_, sub_frame); }