Simplify some CFX_FloatRect methods.

Also add a comment about the various CFX_FloatRect to FX_RECT conversion
methods.

Change-Id: Ia9984797dc513cdc487fe9972b32c216c9f99ec1
Reviewed-on: https://pdfium-review.googlesource.com/20217
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
diff --git a/core/fxcrt/fx_coordinates.cpp b/core/fxcrt/fx_coordinates.cpp
index 561f25d..733425e 100644
--- a/core/fxcrt/fx_coordinates.cpp
+++ b/core/fxcrt/fx_coordinates.cpp
@@ -17,10 +17,10 @@
   int length = static_cast<int>(ceil(f2 - f1));
   int i1_1 = static_cast<int>(floor(f1));
   int i1_2 = static_cast<int>(ceil(f1));
-  float error1 = f1 - i1_1 + (float)fabs(f2 - i1_1 - length);
-  float error2 = i1_2 - f1 + (float)fabs(f2 - i1_2 - length);
+  float error1 = f1 - i1_1 + fabsf(f2 - i1_1 - length);
+  float error2 = i1_2 - f1 + fabsf(f2 - i1_2 - length);
 
-  *i1 = (error1 > error2) ? i1_2 : i1_1;
+  *i1 = error1 > error2 ? i1_2 : i1_1;
   *i2 = *i1 + length;
 }
 
@@ -108,32 +108,29 @@
 }
 
 FX_RECT CFX_FloatRect::GetOuterRect() const {
-  CFX_FloatRect rect1 = *this;
   FX_RECT rect;
-  rect.left = static_cast<int>(floor(rect1.left));
-  rect.bottom = static_cast<int>(ceil(rect1.top));
-  rect.right = static_cast<int>(ceil(rect1.right));
-  rect.top = static_cast<int>(floor(rect1.bottom));
+  rect.left = static_cast<int>(floor(left));
+  rect.bottom = static_cast<int>(ceil(top));
+  rect.right = static_cast<int>(ceil(right));
+  rect.top = static_cast<int>(floor(bottom));
   rect.Normalize();
   return rect;
 }
 
 FX_RECT CFX_FloatRect::GetInnerRect() const {
-  CFX_FloatRect rect1 = *this;
   FX_RECT rect;
-  rect.left = static_cast<int>(ceil(rect1.left));
-  rect.bottom = static_cast<int>(floor(rect1.top));
-  rect.right = static_cast<int>(floor(rect1.right));
-  rect.top = static_cast<int>(ceil(rect1.bottom));
+  rect.left = static_cast<int>(ceil(left));
+  rect.bottom = static_cast<int>(floor(top));
+  rect.right = static_cast<int>(floor(right));
+  rect.top = static_cast<int>(ceil(bottom));
   rect.Normalize();
   return rect;
 }
 
 FX_RECT CFX_FloatRect::GetClosestRect() const {
-  CFX_FloatRect rect1 = *this;
   FX_RECT rect;
-  MatchFloatRange(rect1.left, rect1.right, &rect.left, &rect.right);
-  MatchFloatRange(rect1.bottom, rect1.top, &rect.top, &rect.bottom);
+  MatchFloatRange(left, right, &rect.left, &rect.right);
+  MatchFloatRange(bottom, top, &rect.top, &rect.bottom);
   rect.Normalize();
   return rect;
 }
diff --git a/core/fxcrt/fx_coordinates.h b/core/fxcrt/fx_coordinates.h
index 1767e33..55d28cd 100644
--- a/core/fxcrt/fx_coordinates.h
+++ b/core/fxcrt/fx_coordinates.h
@@ -247,9 +247,20 @@
   void Intersect(const CFX_FloatRect& other_rect);
   void Union(const CFX_FloatRect& other_rect);
 
+  // These may be better at rounding than ToFxRect() and friends.
+  //
+  // Returned rect has bounds rounded up/down such that it is contained in the
+  // original.
   FX_RECT GetInnerRect() const;
+
+  // Returned rect has bounds rounded up/down such that the original is
+  // contained in it.
   FX_RECT GetOuterRect() const;
+
+  // Returned rect has bounds rounded up/down such that the dimensions are
+  // rounded up and the sum of the error in the bounds is minimized.
   FX_RECT GetClosestRect() const;
+
   CFX_FloatRect GetCenterSquare() const;
 
   void InitRect(const CFX_PointF& point) {
@@ -329,7 +340,15 @@
   void Scale(float fScale);
   void ScaleFromCenterPoint(float fScale);
 
+  // GetInnerRect() and friends may be better at rounding than these methods.
+  // Unlike the methods above, these two blindly floor / round the LBRT values.
+  // Doing so may introduce rounding errors that are visible to users as
+  // off-by-one pixels/lines.
+  //
+  // Floors LBRT values.
   FX_RECT ToFxRect() const;
+
+  // Rounds LBRT values.
   FX_RECT ToRoundedFxRect() const;
 
   float left;