FX Bool considered harmful, part 3
[pdfium.git] / core / src / fpdftext / fpdf_text.cpp
index 6c1e225..7d728a8 100644 (file)
@@ -1,34 +1,38 @@
 // Copyright 2014 PDFium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
+
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
+#include "../../../third_party/base/nonstd_unique_ptr.h"
 #include "../../include/fpdfapi/fpdf_page.h"
 #include "../../include/fpdfapi/fpdf_pageobj.h"
+#include "../../include/fpdfapi/fpdf_resource.h"
 #include "../../include/fpdftext/fpdf_text.h"
-#include "txtproc.h"
+#include "../../include/fxcrt/fx_arb.h"
+#include "../../include/fxcrt/fx_ucd.h"
 #include "text_int.h"
-extern FX_LPCSTR FCS_GetAltStr(FX_WCHAR);
-CFX_ByteString CharFromUnicodeAlt(FX_WCHAR unicode, int destcp, FX_LPCSTR defchar)
+#include "txtproc.h"
+
+CFX_ByteString CharFromUnicodeAlt(FX_WCHAR unicode, int destcp, const FX_CHAR* defchar)
 {
     if (destcp == 0) {
         if (unicode < 0x80) {
             return CFX_ByteString((char)unicode);
         }
-        FX_LPCSTR altstr = FCS_GetAltStr(unicode);
+        const FX_CHAR* altstr = FCS_GetAltStr(unicode);
         if (altstr) {
             return CFX_ByteString(altstr, -1);
         }
         return CFX_ByteString(defchar, -1);
     }
-    FX_BOOL bDef = FALSE;
     char buf[10];
-    int ret = FXSYS_WideCharToMultiByte(destcp, 0, (wchar_t*)&unicode, 1, buf, 10, NULL, &bDef);
-    if (ret && !bDef) {
+    int iDef = 0;
+    int ret = FXSYS_WideCharToMultiByte(destcp, 0, (wchar_t*)&unicode, 1, buf, 10, NULL, &iDef);
+    if (ret && !iDef) {
         return CFX_ByteString(buf, ret);
     }
-    FX_LPCSTR altstr = FCS_GetAltStr(unicode);
+    const FX_CHAR* altstr = FCS_GetAltStr(unicode);
     if (altstr) {
         return CFX_ByteString(altstr, -1);
     }
@@ -57,10 +61,9 @@ void CTextPage::ProcessObject(CPDF_PageObject* pObject)
     CPDF_TextObject* pText = (CPDF_TextObject*)pObject;
     CPDF_Font* pFont = pText->m_TextState.GetFont();
     int count = pText->CountItems();
-    FX_FLOAT* pPosArray = FX_Alloc(FX_FLOAT, count * 2);
-    if (pPosArray) {
-        pText->CalcCharPos(pPosArray);
-    }
+    FX_FLOAT* pPosArray = FX_Alloc2D(FX_FLOAT, count, 2);
+    pText->CalcCharPos(pPosArray);
+
     FX_FLOAT fontsize_h = pText->m_TextState.GetFontSizeH();
     FX_FLOAT fontsize_v = pText->m_TextState.GetFontSizeV();
     FX_DWORD space_charcode = pFont->CharCodeFromUnicode(' ');
@@ -76,7 +79,7 @@ void CTextPage::ProcessObject(CPDF_PageObject* pObject)
         CFX_AffineMatrix matrix;
         pText->GetTextMatrix(&matrix);
         for (int i = 0; i < pText->m_nChars; i ++) {
-            FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pText->m_pCharCodes : pText->m_pCharCodes[i];
+            FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(uintptr_t)pText->m_pCharCodes : pText->m_pCharCodes[i];
             if (charcode == (FX_DWORD) - 1) {
                 continue;
             }
@@ -114,7 +117,7 @@ void CTextPage::ProcessObject(CPDF_PageObject* pObject)
     int space_count = 0;
     FX_FLOAT last_left = 0, last_right = 0, segment_left = 0, segment_right = 0;
     for (int i = 0; i < pText->m_nChars; i ++) {
-        FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(FX_UINTPTR)pText->m_pCharCodes : pText->m_pCharCodes[i];
+        FX_DWORD charcode = pText->m_nChars == 1 ? (FX_DWORD)(uintptr_t)pText->m_pCharCodes : pText->m_pCharCodes[i];
         if (charcode == (FX_DWORD) - 1) {
             continue;
         }
@@ -174,7 +177,7 @@ CTextBaseLine* CTextPage::InsertTextBox(CTextBaseLine* pBaseLine, FX_FLOAT basey
         }
     }
     CFX_WideString text;
-    FX_LPCSTR pStr = str;
+    const FX_CHAR* pStr = str;
     int len = str.GetLength(), offset = 0;
     while (offset < len) {
         FX_DWORD ch = pFont->GetNextChar(pStr, len, offset);
@@ -224,45 +227,43 @@ void CTextPage::WriteOutput(CFX_WideStringArray& lines, int iMinWidth)
     }
     if (m_bAutoWidth) {
         int* widths = FX_Alloc(int, m_BaseLines.GetSize());
-        if (widths) {
-            for (i = 0; i < m_BaseLines.GetSize(); i ++) {
-                widths[i] = 0;
-                CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
-                int TotalChars = 0;
-                FX_FLOAT TotalWidth = 0;
-                int minchars;
-                pBaseLine->CountChars(TotalChars, TotalWidth, minchars);
-                if (TotalChars) {
-                    FX_FLOAT charwidth = TotalWidth / TotalChars;
-                    widths[i] = (int)((MaxRightX - MinLeftX) / charwidth);
-                }
-                if (widths[i] > 1000) {
-                    widths[i] = 1000;
-                }
-                if (widths[i] < minchars) {
-                    widths[i] = minchars;
-                }
+        for (i = 0; i < m_BaseLines.GetSize(); i ++) {
+            widths[i] = 0;
+            CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
+            int TotalChars = 0;
+            FX_FLOAT TotalWidth = 0;
+            int minchars;
+            pBaseLine->CountChars(TotalChars, TotalWidth, minchars);
+            if (TotalChars) {
+                FX_FLOAT charwidth = TotalWidth / TotalChars;
+                widths[i] = (int)((MaxRightX - MinLeftX) / charwidth);
             }
-            int AvgWidth = 0, widthcount = 0;
-            for (i = 0; i < m_BaseLines.GetSize(); i ++)
-                if (widths[i]) {
-                    AvgWidth += widths[i];
-                    widthcount ++;
-                }
-            AvgWidth = int((FX_FLOAT)AvgWidth / widthcount + 0.5);
-            int MaxWidth = 0;
-            for (i = 0; i < m_BaseLines.GetSize(); i ++)
-                if (MaxWidth < widths[i]) {
-                    MaxWidth = widths[i];
-                }
-            if (MaxWidth > AvgWidth * 6 / 5) {
-                MaxWidth = AvgWidth * 6 / 5;
+            if (widths[i] > 1000) {
+                widths[i] = 1000;
             }
-            FX_Free(widths);
-            if (iMinWidth < MaxWidth) {
-                iMinWidth = MaxWidth;
+            if (widths[i] < minchars) {
+                widths[i] = minchars;
             }
         }
+        int AvgWidth = 0, widthcount = 0;
+        for (i = 0; i < m_BaseLines.GetSize(); i ++)
+            if (widths[i]) {
+                AvgWidth += widths[i];
+                widthcount ++;
+            }
+        AvgWidth = int((FX_FLOAT)AvgWidth / widthcount + 0.5);
+        int MaxWidth = 0;
+        for (i = 0; i < m_BaseLines.GetSize(); i ++)
+            if (MaxWidth < widths[i]) {
+                MaxWidth = widths[i];
+            }
+        if (MaxWidth > AvgWidth * 6 / 5) {
+            MaxWidth = AvgWidth * 6 / 5;
+        }
+        FX_Free(widths);
+        if (iMinWidth < MaxWidth) {
+            iMinWidth = MaxWidth;
+        }
     }
     for (i = 0; i < m_BaseLines.GetSize(); i ++) {
         CTextBaseLine* pBaseLine = (CTextBaseLine*)m_BaseLines.GetAt(i);
@@ -288,8 +289,8 @@ void CTextPage::WriteOutput(CFX_WideStringArray& lines, int iMinWidth)
 }
 void NormalizeCompositeChar(FX_WCHAR wChar, CFX_WideString& sDest)
 {
-    wChar = FX_GetMirrorChar(wChar, TRUE, FALSE);
-    FX_LPWSTR pDst = NULL;
+    wChar = FX_GetMirrorChar(wChar, true, false);
+    FX_WCHAR* pDst = NULL;
     FX_STRSIZE nCount = FX_Unicode_GetNormalization(wChar, pDst);
     if (nCount < 1 ) {
         sDest += wChar;
@@ -308,17 +309,14 @@ void NormalizeString(CFX_WideString& str)
         return;
     }
     CFX_WideString sBuffer;
-    IFX_BidiChar* BidiChar = IFX_BidiChar::Create();
-    if (NULL == BidiChar)      {
-        return;
-    }
+    nonstd::unique_ptr<IFX_BidiChar> pBidiChar(IFX_BidiChar::Create());
     CFX_WordArray order;
-    FX_BOOL bR2L = FALSE;
-    FX_INT32 start = 0, count = 0, i = 0;
+    bool bR2L = false;
+    int32_t start = 0, count = 0, i = 0;
     int nR2L = 0, nL2R = 0;
     for (i = 0; i < str.GetLength(); i++) {
-        if(BidiChar->AppendChar(str.GetAt(i))) {
-            FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
+        if(pBidiChar->AppendChar(str.GetAt(i))) {
+            int32_t ret = pBidiChar->GetBidiInfo(start, count);
             order.Add(start);
             order.Add(count);
             order.Add(ret);
@@ -331,8 +329,8 @@ void NormalizeString(CFX_WideString& str)
             }
         }
     }
-    if(BidiChar->EndChar()) {
-        FX_INT32 ret = BidiChar->GetBidiInfo(start, count);
+    if(pBidiChar->EndChar()) {
+        int32_t ret = pBidiChar->GetBidiInfo(start, count);
         order.Add(start);
         order.Add(count);
         order.Add(ret);
@@ -345,7 +343,7 @@ void NormalizeString(CFX_WideString& str)
         }
     }
     if(nR2L > 0 && nR2L >= nL2R) {
-        bR2L = TRUE;
+        bR2L = true;
     }
     if(bR2L) {
         int count = order.GetSize();
@@ -359,7 +357,7 @@ void NormalizeString(CFX_WideString& str)
                 }
             } else {
                 i = j;
-                FX_BOOL bSymbol = FALSE;
+                bool bSymbol = false;
                 while(i > 0 && order.GetAt(i) != 2) {
                     bSymbol = !order.GetAt(i);
                     i -= 3;
@@ -391,7 +389,7 @@ void NormalizeString(CFX_WideString& str)
         }
     } else {
         int count = order.GetSize();
-        FX_BOOL bL2R = FALSE;
+        bool bL2R = false;
         for(int j = 0; j < count; j += 3) {
             int ret = order.GetAt(j + 2);
             int start = order.GetAt(j);
@@ -407,7 +405,7 @@ void NormalizeString(CFX_WideString& str)
                 }
                 if(i == 3) {
                     j = -3;
-                    bL2R = TRUE;
+                    bL2R = true;
                     continue;
                 }
                 int end = str.GetLength() - 1;
@@ -428,17 +426,16 @@ void NormalizeString(CFX_WideString& str)
     }
     str.Empty();
     str += sBuffer;
-    BidiChar->Release();
 }
-static FX_BOOL IsNumber(CFX_WideString& str)
+static bool IsNumber(CFX_WideString& str)
 {
     for (int i = 0; i < str.GetLength(); i ++) {
         FX_WCHAR ch = str[i];
         if ((ch < '0' || ch > '9') && ch != '-' && ch != '+' && ch != '.' && ch != ' ') {
-            return FALSE;
+            return false;
         }
     }
-    return TRUE;
+    return true;
 }
 void CTextPage::FindColumns()
 {
@@ -537,18 +534,18 @@ void CTextBaseLine::InsertTextBox(FX_FLOAT leftx, FX_FLOAT rightx, FX_FLOAT topy
     pText->m_pColumn = NULL;
     m_TextList.InsertAt(i, pText);
 }
-FX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,
+bool GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2,
                         FX_FLOAT& interlow, FX_FLOAT& interhigh);
-FX_BOOL CTextBaseLine::CanMerge(CTextBaseLine* pOther)
+bool CTextBaseLine::CanMerge(CTextBaseLine* pOther)
 {
     FX_FLOAT inter_top, inter_bottom;
     if (!GetIntersection(m_Bottom, m_Top, pOther->m_Bottom, pOther->m_Top,
                          inter_bottom, inter_top)) {
-        return FALSE;
+        return false;
     }
     FX_FLOAT inter_h = inter_top - inter_bottom;
     if (inter_h < (m_Top - m_Bottom) / 2 && inter_h < (pOther->m_Top - pOther->m_Bottom) / 2) {
-        return FALSE;
+        return false;
     }
     FX_FLOAT dy = (FX_FLOAT)FXSYS_fabs(m_BaseLine - pOther->m_BaseLine);
     for (int i = 0; i < m_TextList.GetSize(); i ++) {
@@ -566,11 +563,11 @@ FX_BOOL CTextBaseLine::CanMerge(CTextBaseLine* pOther)
             }
             if (dy >= (pText->m_Bottom - pText->m_Top) / 2 ||
                     dy >= (pOtherText->m_Bottom - pOtherText->m_Top) / 2) {
-                return FALSE;
+                return false;
             }
         }
     }
-    return TRUE;
+    return true;
 }
 void CTextBaseLine::Merge(CTextBaseLine* pOther)
 {
@@ -580,7 +577,7 @@ void CTextBaseLine::Merge(CTextBaseLine* pOther)
                       pText->m_SpaceWidth, pText->m_FontSizeV, pText->m_Text);
     }
 }
-FX_BOOL CTextBaseLine::GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx)
+bool CTextBaseLine::GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx)
 {
     int i;
     for (i = 0; i < m_TextList.GetSize(); i ++) {
@@ -590,7 +587,7 @@ FX_BOOL CTextBaseLine::GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx)
         }
     }
     if (i == m_TextList.GetSize()) {
-        return FALSE;
+        return false;
     }
     CTextBox* pText = (CTextBox*)m_TextList.GetAt(i);
     leftx = pText->m_Left;
@@ -602,7 +599,7 @@ FX_BOOL CTextBaseLine::GetWidth(FX_FLOAT& leftx, FX_FLOAT& rightx)
     }
     pText = (CTextBox*)m_TextList.GetAt(i);
     rightx = pText->m_Right;
-    return TRUE;
+    return true;
 }
 void CTextBaseLine::MergeBoxes()
 {
@@ -727,8 +724,8 @@ void PDF_GetPageText_Unicode(CFX_WideStringArray& lines, CPDF_Document* pDoc, CP
     CPDF_Page page;
     page.Load(pDoc, pPage);
     CPDF_ParseOptions options;
-    options.m_bTextOnly = TRUE;
-    options.m_bSeparateForm = FALSE;
+    options.m_bTextOnly = true;
+    options.m_bSeparateForm = false;
     page.ParseContent(&options);
     CFX_FloatRect page_bbox = page.GetPageBBox();
     if (flags & PDF2TXT_AUTO_ROTATE) {
@@ -737,7 +734,7 @@ void PDF_GetPageText_Unicode(CFX_WideStringArray& lines, CPDF_Document* pDoc, CP
     CTextPage texts;
     texts.m_bAutoWidth = flags & PDF2TXT_AUTO_WIDTH;
     texts.m_bKeepColumn = flags & PDF2TXT_KEEP_COLUMN;
-    texts.m_bBreakSpace = TRUE;
+    texts.m_bBreakSpace = true;
     FX_POSITION pos = page.GetFirstObjectPosition();
     while (pos) {
         CPDF_PageObject* pObject = page.GetNextObject(pos);
@@ -766,7 +763,7 @@ void PDF_GetPageText(CFX_ByteStringArray& lines, CPDF_Document* pDoc, CPDF_Dicti
         lines.Add(str);
     }
 }
-extern void _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, FX_BOOL bUseLF,
+extern void _PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_PageObjects* pPage, bool bUseLF,
                                        CFX_PtrArray* pObjArray);
 void PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_Document* pDoc, CPDF_Dictionary* pPage, FX_DWORD flags)
 {
@@ -774,8 +771,8 @@ void PDF_GetTextStream_Unicode(CFX_WideTextBuf& buffer, CPDF_Document* pDoc, CPD
     CPDF_Page page;
     page.Load(pDoc, pPage);
     CPDF_ParseOptions options;
-    options.m_bTextOnly = TRUE;
-    options.m_bSeparateForm = FALSE;
+    options.m_bTextOnly = true;
+    options.m_bSeparateForm = false;
     page.ParseContent(&options);
-    _PDF_GetTextStream_Unicode(buffer, &page, TRUE, NULL);
+    _PDF_GetTextStream_Unicode(buffer, &page, true, NULL);
 }