Fix CGdiDeviceDriver::DrawLine().

- Do the bounds check before applying the transformation.
- Simplify the bounds check.
- Fix nits.
- Remove some nearby dead code.

BUG=108144

Review-Url: https://codereview.chromium.org/2057423002
diff --git a/core/fxge/win32/fx_win32_device.cpp b/core/fxge/win32/fx_win32_device.cpp
index b791217..a8ad1a3 100644
--- a/core/fxge/win32/fx_win32_device.cpp
+++ b/core/fxge/win32/fx_win32_device.cpp
@@ -779,15 +779,6 @@
     SaveDC(m_hDC);
 }
 
-void* CGdiDeviceDriver::GetClipRgn() {
-  HRGN hClipRgn = CreateRectRgn(0, 0, 1, 1);
-  if (::GetClipRgn(m_hDC, hClipRgn) == 0) {
-    DeleteObject(hClipRgn);
-    hClipRgn = nullptr;
-  }
-  return (void*)hClipRgn;
-}
-
 FX_BOOL CGdiDeviceDriver::GDI_SetDIBits(CFX_DIBitmap* pBitmap1,
                                         const FX_RECT* pSrcRect,
                                         int left,
@@ -946,24 +937,19 @@
   return ::GetClipBox(m_hDC, (RECT*)pRect);
 }
 
-FX_BOOL CGdiDeviceDriver::SetClipRgn(void* hRgn) {
-  ::SelectClipRgn(m_hDC, (HRGN)hRgn);
-  return TRUE;
-}
-
 void CGdiDeviceDriver::DrawLine(FX_FLOAT x1,
                                 FX_FLOAT y1,
                                 FX_FLOAT x2,
-                                FX_FLOAT y2) {
-  int flag1 = (x1 < 0) | ((x1 > m_Width) << 1) | ((y1 < 0) << 2) |
-              ((y1 > m_Height) << 3);
-  int flag2 = (x2 < 0) | ((x2 > m_Width) << 1) | ((y2 < 0) << 2) |
-              ((y2 > m_Height) << 3);
-  if (flag1 & flag2) {
+                                FX_FLOAT y2,
+                                const CFX_Matrix* pMatrix) {
+  bool bStartOutOfBounds = x1 < 0 || x1 > m_Width || y1 < 0 || y1 > m_Height;
+  bool bEndOutOfBounds = x2 < 0 || x2 > m_Width || y2 < 0 || y2 > m_Height;
+  if (bStartOutOfBounds & bEndOutOfBounds)
     return;
-  }
-  if (flag1 || flag2) {
-    FX_FLOAT x[2], y[2];
+
+  if (bStartOutOfBounds || bEndOutOfBounds) {
+    FX_FLOAT x[2];
+    FX_FLOAT y[2];
     int np;
 #ifdef _SKIA_SUPPORT_
     // TODO(caryclark) temporary replacement of antigrain in line function
@@ -975,19 +961,24 @@
                                   (FX_FLOAT)(m_Height));
     np = agg::clip_liang_barsky<FX_FLOAT>(x1, y1, x2, y2, rect, x, y);
 #endif
-    if (np == 0) {
+    if (np == 0)
       return;
-    }
+
     if (np == 1) {
       x2 = x[0];
       y2 = y[0];
     } else {
+      ASSERT(np == 2);
       x1 = x[0];
       y1 = y[0];
-      x2 = x[np - 1];
-      y2 = y[np - 1];
+      x2 = x[1];
+      y2 = y[1];
     }
   }
+  if (pMatrix) {
+    pMatrix->Transform(x1, y1);
+    pMatrix->Transform(x2, y2);
+  }
   MoveToEx(m_hDC, FXSYS_round(x1), FXSYS_round(y1), nullptr);
   LineTo(m_hDC, FXSYS_round(x2), FXSYS_round(y2));
 }
@@ -1067,15 +1058,11 @@
   }
   if (pPathData->GetPointCount() == 2 && pGraphState &&
       pGraphState->m_DashCount) {
-    FX_FLOAT x1 = pPathData->GetPointX(0), y1 = pPathData->GetPointY(0);
-    if (pMatrix) {
-      pMatrix->Transform(x1, y1);
-    }
-    FX_FLOAT x2 = pPathData->GetPointX(1), y2 = pPathData->GetPointY(1);
-    if (pMatrix) {
-      pMatrix->Transform(x2, y2);
-    }
-    DrawLine(x1, y1, x2, y2);
+    FX_FLOAT x1 = pPathData->GetPointX(0);
+    FX_FLOAT y1 = pPathData->GetPointY(0);
+    FX_FLOAT x2 = pPathData->GetPointX(1);
+    FX_FLOAT y2 = pPathData->GetPointY(1);
+    DrawLine(x1, y1, x2, y2, pMatrix);
   } else {
     SetPathToDC(m_hDC, pPathData, pMatrix);
     if (pGraphState && stroke_alpha) {
@@ -1188,11 +1175,6 @@
   return TRUE;
 }
 
-FX_BOOL CGdiDeviceDriver::DeleteDeviceRgn(void* pRgn) {
-  DeleteObject((HGDIOBJ)pRgn);
-  return TRUE;
-}
-
 CGdiDisplayDriver::CGdiDisplayDriver(HDC hDC)
     : CGdiDeviceDriver(hDC, FXDC_DISPLAY) {
   CWin32Platform* pPlatform =
diff --git a/core/fxge/win32/win32_int.h b/core/fxge/win32/win32_int.h
index 2143b76..8a9c124 100644
--- a/core/fxge/win32/win32_int.h
+++ b/core/fxge/win32/win32_int.h
@@ -145,10 +145,11 @@
   FX_BOOL GetClipBox(FX_RECT* pRect) override;
   void* GetPlatformSurface() const override { return (void*)m_hDC; }
 
-  virtual void* GetClipRgn();
-  virtual FX_BOOL SetClipRgn(void* pRgn);
-  virtual FX_BOOL DeleteDeviceRgn(void* pRgn);
-  virtual void DrawLine(FX_FLOAT x1, FX_FLOAT y1, FX_FLOAT x2, FX_FLOAT y2);
+  void DrawLine(FX_FLOAT x1,
+                FX_FLOAT y1,
+                FX_FLOAT x2,
+                FX_FLOAT y2,
+                const CFX_Matrix* pMatrix);
 
   FX_BOOL GDI_SetDIBits(CFX_DIBitmap* pBitmap,
                         const FX_RECT* pSrcRect,