summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BUILD.gn1
-rw-r--r--core/src/fpdfapi/fpdf_font/font_int.h7
-rw-r--r--core/src/fpdfapi/fpdf_font/fpdf_font.cpp28
-rw-r--r--core/src/fpdfapi/fpdf_font/fpdf_font_unittest.cpp31
-rw-r--r--pdfium.gyp1
5 files changed, 57 insertions, 11 deletions
diff --git a/BUILD.gn b/BUILD.gn
index e090bd4673..9424ddf870 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -714,6 +714,7 @@ static_library("formfiller") {
test("pdfium_unittests") {
sources = [
+ "core/src/fpdfapi/fpdf_font/fpdf_font_unittest.cpp",
"core/src/fxcodec/codec/fx_codec_jpx_unittest.cpp",
"core/src/fxcrt/fx_basic_bstring_unittest.cpp",
"core/src/fxcrt/fx_basic_memmgr_unittest.cpp",
diff --git a/core/src/fpdfapi/fpdf_font/font_int.h b/core/src/fpdfapi/fpdf_font/font_int.h
index 48e58d6345..559027b283 100644
--- a/core/src/fpdfapi/fpdf_font/font_int.h
+++ b/core/src/fpdfapi/fpdf_font/font_int.h
@@ -174,6 +174,13 @@ class CPDF_ToUnicodeMap {
std::map<FX_DWORD, FX_DWORD> m_Map;
CPDF_CID2UnicodeMap* m_pBaseMap;
CFX_WideTextBuf m_MultiCharBuf;
+
+ private:
+ friend class fpdf_font_StringToCode_Test;
+ friend class fpdf_font_StringToWideString_Test;
+
+ static FX_DWORD StringToCode(const CFX_ByteStringC& str);
+ static CFX_WideString StringToWideString(const CFX_ByteStringC& str);
};
class CPDF_FontCharMap : public CFX_CharMap {
public:
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
index 543816b03a..0529d3d35b 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
@@ -508,7 +508,9 @@ FX_DWORD CPDF_ToUnicodeMap::ReverseLookup(FX_WCHAR unicode) {
}
return 0;
}
-static FX_DWORD _StringToCode(const CFX_ByteStringC& str) {
+
+// Static.
+FX_DWORD CPDF_ToUnicodeMap::StringToCode(const CFX_ByteStringC& str) {
const FX_CHAR* buf = str.GetCStr();
int len = str.GetLength();
if (len == 0) {
@@ -539,7 +541,7 @@ static FX_DWORD _StringToCode(const CFX_ByteStringC& str) {
}
return result;
}
-static CFX_WideString _StringDataAdd(CFX_WideString str) {
+static CFX_WideString StringDataAdd(CFX_WideString str) {
CFX_WideString ret;
int len = str.GetLength();
FX_WCHAR value = 1;
@@ -557,7 +559,10 @@ static CFX_WideString _StringDataAdd(CFX_WideString str) {
}
return ret;
}
-static CFX_WideString _StringToWideString(const CFX_ByteStringC& str) {
+
+// Static.
+CFX_WideString CPDF_ToUnicodeMap::StringToWideString(
+ const CFX_ByteStringC& str) {
const FX_CHAR* buf = str.GetCStr();
int len = str.GetLength();
if (len == 0) {
@@ -579,6 +584,7 @@ static CFX_WideString _StringToWideString(const CFX_ByteStringC& str) {
break;
}
ch = ch * 16 + digit;
+
byte_pos++;
if (byte_pos == 4) {
result += ch;
@@ -608,9 +614,9 @@ void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) {
if (word.IsEmpty() || word == FX_BSTRC("endbfchar")) {
break;
}
- FX_DWORD srccode = _StringToCode(word);
+ FX_DWORD srccode = StringToCode(word);
word = parser.GetWord();
- CFX_WideString destcode = _StringToWideString(word);
+ CFX_WideString destcode = StringToWideString(word);
int len = destcode.GetLength();
if (len == 0) {
continue;
@@ -631,9 +637,9 @@ void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) {
break;
}
high = parser.GetWord();
- FX_DWORD lowcode = _StringToCode(low);
+ FX_DWORD lowcode = StringToCode(low);
FX_DWORD highcode =
- (lowcode & 0xffffff00) | (_StringToCode(high) & 0xff);
+ (lowcode & 0xffffff00) | (StringToCode(high) & 0xff);
if (highcode == (FX_DWORD)-1) {
break;
}
@@ -641,7 +647,7 @@ void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) {
if (start == FX_BSTRC("[")) {
for (FX_DWORD code = lowcode; code <= highcode; code++) {
CFX_ByteString dest = parser.GetWord();
- CFX_WideString destcode = _StringToWideString(dest);
+ CFX_WideString destcode = StringToWideString(dest);
int len = destcode.GetLength();
if (len == 0) {
continue;
@@ -656,11 +662,11 @@ void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) {
}
parser.GetWord();
} else {
- CFX_WideString destcode = _StringToWideString(start);
+ CFX_WideString destcode = StringToWideString(start);
int len = destcode.GetLength();
FX_DWORD value = 0;
if (len == 1) {
- value = _StringToCode(start);
+ value = StringToCode(start);
for (FX_DWORD code = lowcode; code <= highcode; code++) {
m_Map[code] = value++;
}
@@ -670,7 +676,7 @@ void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) {
if (code == lowcode) {
retcode = destcode;
} else {
- retcode = _StringDataAdd(destcode);
+ retcode = StringDataAdd(destcode);
}
m_Map[code] = m_MultiCharBuf.GetLength() * 0x10000 + 0xffff;
m_MultiCharBuf.AppendChar(retcode.GetLength());
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_unittest.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_unittest.cpp
new file mode 100644
index 0000000000..9cc529c3df
--- /dev/null
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_unittest.cpp
@@ -0,0 +1,31 @@
+// Copyright 2015 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.
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+#include "font_int.h"
+
+TEST(fpdf_font, StringToCode) {
+ EXPECT_EQ(0, CPDF_ToUnicodeMap::StringToCode(""));
+ EXPECT_EQ(194, CPDF_ToUnicodeMap::StringToCode("<c2"));
+ EXPECT_EQ(162, CPDF_ToUnicodeMap::StringToCode("<A2"));
+ EXPECT_EQ(2802, CPDF_ToUnicodeMap::StringToCode("<Af2"));
+ EXPECT_EQ(12, CPDF_ToUnicodeMap::StringToCode("12"));
+ EXPECT_EQ(128, CPDF_ToUnicodeMap::StringToCode("128"));
+}
+
+TEST(fpdf_font, StringToWideString) {
+ EXPECT_EQ(L"", CPDF_ToUnicodeMap::StringToWideString(""));
+ EXPECT_EQ(L"", CPDF_ToUnicodeMap::StringToWideString("1234"));
+
+ EXPECT_EQ(L"", CPDF_ToUnicodeMap::StringToWideString("<c2"));
+
+ CFX_WideString res = L"\xc2ab";
+ EXPECT_EQ(res, CPDF_ToUnicodeMap::StringToWideString("<c2ab"));
+ EXPECT_EQ(res, CPDF_ToUnicodeMap::StringToWideString("<c2abab"));
+ EXPECT_EQ(res, CPDF_ToUnicodeMap::StringToWideString("<c2ab 1234"));
+
+ res += L"\xfaab";
+ EXPECT_EQ(res, CPDF_ToUnicodeMap::StringToWideString("<c2abFaAb"));
+}
diff --git a/pdfium.gyp b/pdfium.gyp
index 0eebb713bc..208a464d87 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -714,6 +714,7 @@
'<(DEPTH)'
],
'sources': [
+ 'core/src/fpdfapi/fpdf_font/fpdf_font_unittest.cpp',
'core/src/fxcodec/codec/fx_codec_jpx_unittest.cpp',
'core/src/fxcrt/fx_basic_bstring_unittest.cpp',
'core/src/fxcrt/fx_basic_memmgr_unittest.cpp',