Revert "PDF a11y: kTextDirection attribute support"
This reverts commit 753f8707ad
.
Reason for revert: Test failing on multiple bots.
https://ci.chromium.org/p/chromium/builders/ci/Mac10.10%20Tests/46160
https://ci.chromium.org/p/chromium/builders/ci/Linux%20Tests/81082
Original change's description:
> PDF a11y: kTextDirection attribute support
>
> The text direction attribute is now properly set for text runs in PDF.
> It is inferred by the position of the first and the last characters of
> a text run.
>
> This change includes a pdf-template file (text-direction.in) with RTL
> text representation used to generate our unit test PDF file.
>
> Bug: 985604
> Change-Id: If5d82296463331e95c4ded4e5244d65be3fbadfa
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1737019
> Commit-Queue: Benjamin Beaudry <benjamin.beaudry@microsoft.com>
> Reviewed-by: Lei Zhang <thestig@chromium.org>
> Reviewed-by: Kevin Babbitt <kbabbitt@microsoft.com>
> Cr-Commit-Position: refs/heads/master@{#690163}
TBR=thestig@chromium.org,kbabbitt@microsoft.com,benjamin.beaudry@microsoft.com
# Not skipping CQ checks because original CL landed > 1 day ago.
Bug: 985604
Change-Id: Ic276193fbc4d1d60ae234a653b1decf2094036b7
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1768606
Reviewed-by: Anand Mistry <amistry@chromium.org>
Commit-Queue: Anand Mistry <amistry@chromium.org>
Cr-Commit-Position: refs/heads/master@{#690260}
This commit is contained in:
chrome
browser
test
data
components/pdf/renderer
pdf
@@ -2407,44 +2407,13 @@ class PDFExtensionAccessibilityTreeDumpTest
|
|||||||
private:
|
private:
|
||||||
using PropertyFilter = content::AccessibilityTreeFormatter::PropertyFilter;
|
using PropertyFilter = content::AccessibilityTreeFormatter::PropertyFilter;
|
||||||
|
|
||||||
// See chrome/test/data/pdf/accessibility/readme.md for more info.
|
|
||||||
void ParsePdfForExtraDirectives(
|
|
||||||
const std::string& pdf_contents,
|
|
||||||
content::AccessibilityTreeFormatter* formatter,
|
|
||||||
std::vector<PropertyFilter>* property_filters) {
|
|
||||||
const char kCommentMark = '%';
|
|
||||||
for (const std::string& line : base::SplitString(
|
|
||||||
pdf_contents, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) {
|
|
||||||
if (line.size() > 1 && line[0] == kCommentMark) {
|
|
||||||
// Remove first character since it's the comment mark.
|
|
||||||
std::string trimmed_line = line.substr(1);
|
|
||||||
const std::string& allow_str = formatter->GetAllowString();
|
|
||||||
if (base::StartsWith(trimmed_line, allow_str,
|
|
||||||
base::CompareCase::SENSITIVE)) {
|
|
||||||
property_filters->push_back(PropertyFilter(
|
|
||||||
base::UTF8ToUTF16(trimmed_line.substr(allow_str.size())),
|
|
||||||
PropertyFilter::ALLOW));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void RunTest(const base::FilePath& test_file_path, const char* file_dir) {
|
void RunTest(const base::FilePath& test_file_path, const char* file_dir) {
|
||||||
std::string pdf_contents;
|
// Set up the tree formatter.
|
||||||
{
|
|
||||||
base::ScopedAllowBlockingForTesting allow_blocking;
|
|
||||||
ASSERT_TRUE(base::ReadFileToString(test_file_path, &pdf_contents));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set up the tree formatter. Parse filters and other directives in the test
|
|
||||||
// file.
|
|
||||||
std::unique_ptr<content::AccessibilityTreeFormatter> formatter =
|
std::unique_ptr<content::AccessibilityTreeFormatter> formatter =
|
||||||
test_pass_.create_formatter();
|
test_pass_.create_formatter();
|
||||||
std::vector<PropertyFilter> property_filters;
|
std::vector<PropertyFilter> property_filters;
|
||||||
formatter->AddDefaultFilters(&property_filters);
|
formatter->AddDefaultFilters(&property_filters);
|
||||||
AddDefaultFilters(&property_filters);
|
AddDefaultFilters(&property_filters);
|
||||||
ParsePdfForExtraDirectives(pdf_contents, formatter.get(),
|
|
||||||
&property_filters);
|
|
||||||
formatter->SetPropertyFilters(property_filters);
|
formatter->SetPropertyFilters(property_filters);
|
||||||
|
|
||||||
// Exit without running the test if we can't find an expectation file or if
|
// Exit without running the test if we can't find an expectation file or if
|
||||||
@@ -2563,7 +2532,3 @@ IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTreeDumpTest,
|
|||||||
DirectionalTextRuns) {
|
DirectionalTextRuns) {
|
||||||
RunPDFTest(FILE_PATH_LITERAL("directional-text-runs.pdf"));
|
RunPDFTest(FILE_PATH_LITERAL("directional-text-runs.pdf"));
|
||||||
}
|
}
|
||||||
|
|
||||||
IN_PROC_BROWSER_TEST_P(PDFExtensionAccessibilityTreeDumpTest, TextDirection) {
|
|
||||||
RunPDFTest(FILE_PATH_LITERAL("text-direction.pdf"));
|
|
||||||
}
|
|
@@ -1,23 +0,0 @@
|
|||||||
# PdfExtensionAccessibilityTreeDumpTest
|
|
||||||
|
|
||||||
A `PdfExtensionAccessibilityTreeDumpTest` loads a PDF file, waits for it
|
|
||||||
to load, then dumps the accessibility tree. More about accessibility tree
|
|
||||||
dump tests at `content/test/data/accessibility/readme.md`.
|
|
||||||
|
|
||||||
## Filters and directives
|
|
||||||
|
|
||||||
Please refer to `content/test/data/accessibility/readme.md` to see
|
|
||||||
how to use filters. Supported filters and directives are:
|
|
||||||
* [x] `@<platform>-ALLOW:`
|
|
||||||
* [ ] `@<platform>-ALLOW-EMPTY:`
|
|
||||||
* [ ] `@<platform>-DENY:`
|
|
||||||
* [ ] `@WAIT-FOR:`
|
|
||||||
|
|
||||||
The PdfExtensionAccessibilityTreeDumpTest implementation of extra
|
|
||||||
directives/filters is similar to the DumpAccessibilityTreeTest. If you
|
|
||||||
need to support additional directives/filters, see
|
|
||||||
/src/content/test/data/accessibility/readme.md to respect the same
|
|
||||||
interface as the one used for HTML accessibility tree dump tests.
|
|
||||||
|
|
||||||
Implementation details for parsing extra directives in HTML can be
|
|
||||||
found in `DumpAccessibilityTestBase::ParseHtmlForExtraDirectives()`.
|
|
@@ -1,7 +0,0 @@
|
|||||||
embeddedObject textDirection=ltr
|
|
||||||
++document restriction=readOnly
|
|
||||||
++++region name='Page 1' restriction=readOnly isPageBreakingObject=true
|
|
||||||
++++++paragraph restriction=readOnly
|
|
||||||
++++++++staticText name='abcdef<newline>شممشا' restriction=readOnly
|
|
||||||
++++++++++inlineTextBox name='abcdef<newline>' restriction=readOnly textDirection=ltr
|
|
||||||
++++++++++inlineTextBox name='شممشا' restriction=readOnly textDirection=rtl
|
|
@@ -1,91 +0,0 @@
|
|||||||
{{header}}
|
|
||||||
%@BLINK-ALLOW:textDirection=*
|
|
||||||
{{object 1 0}} <<
|
|
||||||
/Type /Catalog
|
|
||||||
/Pages 2 0 R
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
{{object 2 0}} <<
|
|
||||||
/Type /Pages
|
|
||||||
/MediaBox [0 0 200 200]
|
|
||||||
/Count 1
|
|
||||||
/Kids [3 0 R]
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
{{object 3 0}} <<
|
|
||||||
/Type /Page
|
|
||||||
/Parent 2 0 R
|
|
||||||
/Resources <<
|
|
||||||
/Font <<
|
|
||||||
/F1 4 0 R
|
|
||||||
>>
|
|
||||||
>>
|
|
||||||
/Contents 8 0 R
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
{{object 4 0}} <<
|
|
||||||
/Type /Font
|
|
||||||
/Subtype /Type0
|
|
||||||
/BaseFont /Arial
|
|
||||||
/Encoding /Identity-H
|
|
||||||
/DescendantFonts [6 0 R]
|
|
||||||
/ToUnicode 7 0 R
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
{{object 5 0}} <<
|
|
||||||
/Type /FontDescriptor
|
|
||||||
/FontName /Arial
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
{{object 6 0}} <<
|
|
||||||
/Type /Font
|
|
||||||
/FontDescriptor 5 0 R
|
|
||||||
/BaseFont /Arial
|
|
||||||
/Subtype /CIDFontType2
|
|
||||||
/W [0 [778] 68 [444 500 444 500 444 333] 910 [229] 951 952 531 996 [394]]
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
{{object 7 0}} <<
|
|
||||||
{{streamlen}}
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
/CIDInit /ProcSet findresource begin
|
|
||||||
12 dict begin
|
|
||||||
begincmap
|
|
||||||
1 begincodespacerange
|
|
||||||
<0000> <FFFF>
|
|
||||||
endcodespacerange
|
|
||||||
2 beginbfchar
|
|
||||||
<038E> <FE8E>
|
|
||||||
<03E4> <FEE4>
|
|
||||||
endbfchar
|
|
||||||
2 beginbfrange
|
|
||||||
<0044> <0049> <0061>
|
|
||||||
<03B7> <03B8> <FEB7>
|
|
||||||
endbfrange
|
|
||||||
endcmap
|
|
||||||
CMapName currentdict /CMap defineresource pop
|
|
||||||
end
|
|
||||||
end
|
|
||||||
endstream
|
|
||||||
endobj
|
|
||||||
{{object 8 0}} <<
|
|
||||||
{{streamlen}}
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
BT
|
|
||||||
/F1 16 Tf
|
|
||||||
30 100 Td
|
|
||||||
<004400450046004700480049> Tj
|
|
||||||
ET
|
|
||||||
BT
|
|
||||||
/F1 16 Tf
|
|
||||||
30 50 Td
|
|
||||||
<038E03B803E403E403B7> Tj
|
|
||||||
ET
|
|
||||||
endstream
|
|
||||||
endobj
|
|
||||||
{{xref}}
|
|
||||||
{{trailer}}
|
|
||||||
{{startxref}}
|
|
||||||
%%EOF
|
|
@@ -1,106 +0,0 @@
|
|||||||
%PDF-1.7
|
|
||||||
%<25><><EFBFBD><EFBFBD>
|
|
||||||
%@BLINK-ALLOW:textDirection=*
|
|
||||||
1 0 obj <<
|
|
||||||
/Type /Catalog
|
|
||||||
/Pages 2 0 R
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
2 0 obj <<
|
|
||||||
/Type /Pages
|
|
||||||
/MediaBox [0 0 200 200]
|
|
||||||
/Count 1
|
|
||||||
/Kids [3 0 R]
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
3 0 obj <<
|
|
||||||
/Type /Page
|
|
||||||
/Parent 2 0 R
|
|
||||||
/Resources <<
|
|
||||||
/Font <<
|
|
||||||
/F1 4 0 R
|
|
||||||
>>
|
|
||||||
>>
|
|
||||||
/Contents 8 0 R
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
4 0 obj <<
|
|
||||||
/Type /Font
|
|
||||||
/Subtype /Type0
|
|
||||||
/BaseFont /Arial
|
|
||||||
/Encoding /Identity-H
|
|
||||||
/DescendantFonts [6 0 R]
|
|
||||||
/ToUnicode 7 0 R
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
5 0 obj <<
|
|
||||||
/Type /FontDescriptor
|
|
||||||
/FontName /Arial
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
6 0 obj <<
|
|
||||||
/Type /Font
|
|
||||||
/FontDescriptor 5 0 R
|
|
||||||
/BaseFont /Arial
|
|
||||||
/Subtype /CIDFontType2
|
|
||||||
/W [0 [778] 68 [444 500 444 500 444 333] 910 [229] 951 952 531 996 [394]]
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
7 0 obj <<
|
|
||||||
/Length 297
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
/CIDInit /ProcSet findresource begin
|
|
||||||
12 dict begin
|
|
||||||
begincmap
|
|
||||||
1 begincodespacerange
|
|
||||||
<0000> <FFFF>
|
|
||||||
endcodespacerange
|
|
||||||
2 beginbfchar
|
|
||||||
<038E> <FE8E>
|
|
||||||
<03E4> <FEE4>
|
|
||||||
endbfchar
|
|
||||||
2 beginbfrange
|
|
||||||
<0044> <0049> <0061>
|
|
||||||
<03B7> <03B8> <FEB7>
|
|
||||||
endbfrange
|
|
||||||
endcmap
|
|
||||||
CMapName currentdict /CMap defineresource pop
|
|
||||||
end
|
|
||||||
end
|
|
||||||
endstream
|
|
||||||
endobj
|
|
||||||
8 0 obj <<
|
|
||||||
/Length 107
|
|
||||||
>>
|
|
||||||
stream
|
|
||||||
BT
|
|
||||||
/F1 16 Tf
|
|
||||||
30 100 Td
|
|
||||||
<004400450046004700480049> Tj
|
|
||||||
ET
|
|
||||||
BT
|
|
||||||
/F1 16 Tf
|
|
||||||
30 50 Td
|
|
||||||
<038E03B803E403E403B7> Tj
|
|
||||||
ET
|
|
||||||
endstream
|
|
||||||
endobj
|
|
||||||
xref
|
|
||||||
0 9
|
|
||||||
0000000000 65535 f
|
|
||||||
0000000045 00000 n
|
|
||||||
0000000098 00000 n
|
|
||||||
0000000187 00000 n
|
|
||||||
0000000313 00000 n
|
|
||||||
0000000455 00000 n
|
|
||||||
0000000519 00000 n
|
|
||||||
0000000698 00000 n
|
|
||||||
0000001047 00000 n
|
|
||||||
trailer <<
|
|
||||||
/Root 1 0 R
|
|
||||||
/Size 9
|
|
||||||
>>
|
|
||||||
startxref
|
|
||||||
1206
|
|
||||||
%%EOF
|
|
@@ -574,8 +574,6 @@ ui::AXNodeData* PdfAccessibilityTree::CreateInlineTextBoxNode(
|
|||||||
std::string chars_utf8 = GetTextRunCharsAsUTF8(text_run, chars, char_index);
|
std::string chars_utf8 = GetTextRunCharsAsUTF8(text_run, chars, char_index);
|
||||||
inline_text_box_node->AddStringAttribute(ax::mojom::StringAttribute::kName,
|
inline_text_box_node->AddStringAttribute(ax::mojom::StringAttribute::kName,
|
||||||
chars_utf8);
|
chars_utf8);
|
||||||
inline_text_box_node->AddIntAttribute(ax::mojom::IntAttribute::kTextDirection,
|
|
||||||
text_run.direction);
|
|
||||||
inline_text_box_node->relative_bounds.bounds =
|
inline_text_box_node->relative_bounds.bounds =
|
||||||
ToGfxRectF(text_run.bounds) + page_bounds.OffsetFromOrigin();
|
ToGfxRectF(text_run.bounds) + page_bounds.OffsetFromOrigin();
|
||||||
std::vector<int32_t> char_offsets =
|
std::vector<int32_t> char_offsets =
|
||||||
|
@@ -40,51 +40,33 @@ bool GetAccessibilityInfo(
|
|||||||
int char_index = 0;
|
int char_index = 0;
|
||||||
while (char_index < char_count) {
|
while (char_index < char_count) {
|
||||||
PP_PrivateAccessibilityTextRunInfo text_run_info;
|
PP_PrivateAccessibilityTextRunInfo text_run_info;
|
||||||
engine->GetTextRunInfo(page_index, char_index, &text_run_info);
|
pp::FloatRect bounds;
|
||||||
|
engine->GetTextRunInfo(page_index, char_index, &text_run_info.len,
|
||||||
|
&text_run_info.font_size, &bounds);
|
||||||
DCHECK_LE(char_index + text_run_info.len,
|
DCHECK_LE(char_index + text_run_info.len,
|
||||||
static_cast<uint32_t>(char_count));
|
static_cast<uint32_t>(char_count));
|
||||||
|
text_run_info.direction = PP_PRIVATEDIRECTION_LTR;
|
||||||
|
text_run_info.bounds = bounds;
|
||||||
text_runs->push_back(text_run_info);
|
text_runs->push_back(text_run_info);
|
||||||
|
|
||||||
// We need to provide enough information to draw a bounding box
|
// We need to provide enough information to draw a bounding box
|
||||||
// around any arbitrary text range, but the bounding boxes of characters
|
// around any arbitrary text range, but the bounding boxes of characters
|
||||||
// we get from PDFium don't necessarily "line up".
|
// we get from PDFium don't necessarily "line up". Walk through the
|
||||||
// Example for LTR text direction: walk through the
|
|
||||||
// characters in each text run and let the width of each character be
|
// characters in each text run and let the width of each character be
|
||||||
// the difference between the x coordinate of one character and the
|
// the difference between the x coordinate of one character and the
|
||||||
// x coordinate of the next. The rest of the bounds of each character
|
// x coordinate of the next. The rest of the bounds of each character
|
||||||
// can be computed from the bounds of the text run.
|
// can be computed from the bounds of the text run.
|
||||||
// The same idea is used for RTL, TTB and BTT text direction.
|
|
||||||
pp::FloatRect char_bounds = engine->GetCharBounds(page_index, char_index);
|
pp::FloatRect char_bounds = engine->GetCharBounds(page_index, char_index);
|
||||||
for (uint32_t i = 0; i < text_run_info.len - 1; i++) {
|
for (uint32_t i = 0; i < text_run_info.len - 1; i++) {
|
||||||
DCHECK_LT(char_index + i + 1, static_cast<uint32_t>(char_count));
|
DCHECK_LT(char_index + i + 1, static_cast<uint32_t>(char_count));
|
||||||
pp::FloatRect next_char_bounds =
|
pp::FloatRect next_char_bounds =
|
||||||
engine->GetCharBounds(page_index, char_index + i + 1);
|
engine->GetCharBounds(page_index, char_index + i + 1);
|
||||||
double& char_width = (*chars)[char_index + i].char_width;
|
(*chars)[char_index + i].char_width =
|
||||||
switch (text_run_info.direction) {
|
next_char_bounds.x() - char_bounds.x();
|
||||||
case PP_PRIVATEDIRECTION_NONE:
|
|
||||||
case PP_PRIVATEDIRECTION_LTR:
|
|
||||||
char_width = next_char_bounds.x() - char_bounds.x();
|
|
||||||
break;
|
|
||||||
case PP_PRIVATEDIRECTION_TTB:
|
|
||||||
char_width = next_char_bounds.y() - char_bounds.y();
|
|
||||||
break;
|
|
||||||
case PP_PRIVATEDIRECTION_RTL:
|
|
||||||
char_width = char_bounds.right() - next_char_bounds.right();
|
|
||||||
break;
|
|
||||||
case PP_PRIVATEDIRECTION_BTT:
|
|
||||||
char_width = char_bounds.bottom() - next_char_bounds.bottom();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
char_bounds = next_char_bounds;
|
char_bounds = next_char_bounds;
|
||||||
}
|
}
|
||||||
double& char_width =
|
(*chars)[char_index + text_run_info.len - 1].char_width =
|
||||||
(*chars)[char_index + text_run_info.len - 1].char_width;
|
char_bounds.width();
|
||||||
if (text_run_info.direction == PP_PRIVATEDIRECTION_BTT ||
|
|
||||||
text_run_info.direction == PP_PRIVATEDIRECTION_TTB) {
|
|
||||||
char_width = char_bounds.height();
|
|
||||||
} else {
|
|
||||||
char_width = char_bounds.width();
|
|
||||||
}
|
|
||||||
|
|
||||||
char_index += text_run_info.len;
|
char_index += text_run_info.len;
|
||||||
}
|
}
|
||||||
|
@@ -41,7 +41,6 @@ typedef void (*PDFEnsureTypefaceCharactersAccessible)(const LOGFONT* font,
|
|||||||
|
|
||||||
struct PP_PdfAccessibilityActionData;
|
struct PP_PdfAccessibilityActionData;
|
||||||
struct PP_PdfPrintSettings_Dev;
|
struct PP_PdfPrintSettings_Dev;
|
||||||
struct PP_PrivateAccessibilityTextRunInfo;
|
|
||||||
|
|
||||||
namespace gfx {
|
namespace gfx {
|
||||||
class Rect;
|
class Rect;
|
||||||
@@ -359,13 +358,13 @@ class PDFEngine {
|
|||||||
// Get a given unicode character on a given page.
|
// Get a given unicode character on a given page.
|
||||||
virtual uint32_t GetCharUnicode(int page_index, int char_index) = 0;
|
virtual uint32_t GetCharUnicode(int page_index, int char_index) = 0;
|
||||||
// Given a start char index, find the longest continuous run of text that's
|
// Given a start char index, find the longest continuous run of text that's
|
||||||
// in a single direction and with the same style and font size. Fill the
|
// in a single direction and with the same style and font size. Return the
|
||||||
// |text_run_info| with the length of that sequence, text direction, bounding
|
// length of that sequence and its font size and bounding box.
|
||||||
// box and font size.
|
virtual void GetTextRunInfo(int page_index,
|
||||||
virtual void GetTextRunInfo(
|
int start_char_index,
|
||||||
int page_index,
|
uint32_t* out_len,
|
||||||
int start_char_index,
|
double* out_font_size,
|
||||||
PP_PrivateAccessibilityTextRunInfo* text_run_info) = 0;
|
pp::FloatRect* out_bounds) = 0;
|
||||||
// Gets the PDF document's print scaling preference. True if the document can
|
// Gets the PDF document's print scaling preference. True if the document can
|
||||||
// be scaled to fit.
|
// be scaled to fit.
|
||||||
virtual bool GetPrintScaling() = 0;
|
virtual bool GetPrintScaling() = 0;
|
||||||
|
@@ -2189,12 +2189,14 @@ uint32_t PDFiumEngine::GetCharUnicode(int page_index, int char_index) {
|
|||||||
return pages_[page_index]->GetCharUnicode(char_index);
|
return pages_[page_index]->GetCharUnicode(char_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PDFiumEngine::GetTextRunInfo(
|
void PDFiumEngine::GetTextRunInfo(int page_index,
|
||||||
int page_index,
|
int start_char_index,
|
||||||
int start_char_index,
|
uint32_t* out_len,
|
||||||
PP_PrivateAccessibilityTextRunInfo* text_run_info) {
|
double* out_font_size,
|
||||||
|
pp::FloatRect* out_bounds) {
|
||||||
DCHECK(PageIndexInBounds(page_index));
|
DCHECK(PageIndexInBounds(page_index));
|
||||||
return pages_[page_index]->GetTextRunInfo(start_char_index, text_run_info);
|
return pages_[page_index]->GetTextRunInfo(start_char_index, out_len,
|
||||||
|
out_font_size, out_bounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PDFiumEngine::GetPrintScaling() {
|
bool PDFiumEngine::GetPrintScaling() {
|
||||||
|
@@ -113,10 +113,11 @@ class PDFiumEngine : public PDFEngine,
|
|||||||
int GetCharCount(int page_index) override;
|
int GetCharCount(int page_index) override;
|
||||||
pp::FloatRect GetCharBounds(int page_index, int char_index) override;
|
pp::FloatRect GetCharBounds(int page_index, int char_index) override;
|
||||||
uint32_t GetCharUnicode(int page_index, int char_index) override;
|
uint32_t GetCharUnicode(int page_index, int char_index) override;
|
||||||
void GetTextRunInfo(
|
void GetTextRunInfo(int page_index,
|
||||||
int page_index,
|
int start_char_index,
|
||||||
int start_char_index,
|
uint32_t* out_len,
|
||||||
PP_PrivateAccessibilityTextRunInfo* text_run_info) override;
|
double* out_font_size,
|
||||||
|
pp::FloatRect* out_bounds) override;
|
||||||
bool GetPrintScaling() override;
|
bool GetPrintScaling() override;
|
||||||
int GetCopiesToPrint() override;
|
int GetCopiesToPrint() override;
|
||||||
int GetDuplexType() override;
|
int GetDuplexType() override;
|
||||||
|
@@ -251,30 +251,29 @@ FPDF_TEXTPAGE PDFiumPage::GetTextPage() {
|
|||||||
return text_page();
|
return text_page();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PDFiumPage::GetTextRunInfo(
|
void PDFiumPage::GetTextRunInfo(int start_char_index,
|
||||||
int start_char_index,
|
uint32_t* out_len,
|
||||||
PP_PrivateAccessibilityTextRunInfo* text_run_info) {
|
double* out_font_size,
|
||||||
|
pp::FloatRect* out_bounds) {
|
||||||
if (start_char_index < 0) {
|
if (start_char_index < 0) {
|
||||||
text_run_info->len = 0;
|
*out_len = 0;
|
||||||
text_run_info->font_size = 0;
|
*out_font_size = 0;
|
||||||
text_run_info->bounds = pp::FloatRect();
|
*out_bounds = pp::FloatRect();
|
||||||
text_run_info->direction = PP_PRIVATEDIRECTION_NONE;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
FPDF_PAGE page = GetPage();
|
FPDF_PAGE page = GetPage();
|
||||||
FPDF_TEXTPAGE text_page = GetTextPage();
|
FPDF_TEXTPAGE text_page = GetTextPage();
|
||||||
int chars_count = FPDFText_CountChars(text_page);
|
int chars_count = FPDFText_CountChars(text_page);
|
||||||
|
|
||||||
int actual_start_char_index = GetFirstNonUnicodeWhiteSpaceCharIndex(
|
int char_index = GetFirstNonUnicodeWhiteSpaceCharIndex(
|
||||||
text_page, start_char_index, chars_count);
|
text_page, start_char_index, chars_count);
|
||||||
if (actual_start_char_index >= chars_count) {
|
if (char_index >= chars_count) {
|
||||||
text_run_info->len = 0;
|
*out_len = 0;
|
||||||
text_run_info->font_size = 0;
|
*out_font_size = 0;
|
||||||
text_run_info->bounds = pp::FloatRect();
|
*out_bounds = pp::FloatRect();
|
||||||
text_run_info->direction = PP_PRIVATEDIRECTION_NONE;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int char_index = actual_start_char_index;
|
|
||||||
|
|
||||||
pp::FloatRect start_char_rect =
|
pp::FloatRect start_char_rect =
|
||||||
GetFloatCharRectInPixels(page, text_page, char_index);
|
GetFloatCharRectInPixels(page, text_page, char_index);
|
||||||
@@ -377,16 +376,9 @@ void PDFiumPage::GetTextRunInfo(
|
|||||||
text_run_font_size = estimated_font_size;
|
text_run_font_size = estimated_font_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Infer text direction from first and last character of the text run. We
|
*out_len = char_index - start_char_index;
|
||||||
// can't base our decision on the character direction, since a character of a
|
*out_font_size = text_run_font_size;
|
||||||
// RTL language will have an angle of 0 when not rotated, just like a
|
*out_bounds = text_run_bounds;
|
||||||
// character in a LTR language.
|
|
||||||
text_run_info->direction = char_index - actual_start_char_index > 1
|
|
||||||
? GetDirectionFromAngle(text_run_angle)
|
|
||||||
: PP_PRIVATEDIRECTION_NONE;
|
|
||||||
text_run_info->len = char_index - start_char_index;
|
|
||||||
text_run_info->font_size = text_run_font_size;
|
|
||||||
text_run_info->bounds = text_run_bounds;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t PDFiumPage::GetCharUnicode(int char_index) {
|
uint32_t PDFiumPage::GetCharUnicode(int char_index) {
|
||||||
|
@@ -20,8 +20,6 @@
|
|||||||
#include "third_party/pdfium/public/fpdf_text.h"
|
#include "third_party/pdfium/public/fpdf_text.h"
|
||||||
#include "ui/gfx/geometry/point_f.h"
|
#include "ui/gfx/geometry/point_f.h"
|
||||||
|
|
||||||
struct PP_PrivateAccessibilityTextRunInfo;
|
|
||||||
|
|
||||||
namespace chrome_pdf {
|
namespace chrome_pdf {
|
||||||
|
|
||||||
class PDFiumEngine;
|
class PDFiumEngine;
|
||||||
@@ -45,11 +43,12 @@ class PDFiumPage {
|
|||||||
FPDF_TEXTPAGE GetTextPage();
|
FPDF_TEXTPAGE GetTextPage();
|
||||||
|
|
||||||
// Given a start char index, find the longest continuous run of text that's
|
// Given a start char index, find the longest continuous run of text that's
|
||||||
// in a single direction and with the same style and font size. Fill the
|
// in a single direction and with the same style and font size. Return the
|
||||||
// |text_run_info| with the length of that sequence, text direction, bounding
|
// length of that sequence and its font size and bounding box.
|
||||||
// box and font size.
|
|
||||||
void GetTextRunInfo(int start_char_index,
|
void GetTextRunInfo(int start_char_index,
|
||||||
PP_PrivateAccessibilityTextRunInfo* text_run_info);
|
uint32_t* out_len,
|
||||||
|
double* out_font_size,
|
||||||
|
pp::FloatRect* out_bounds);
|
||||||
// Get a unicode character from the page.
|
// Get a unicode character from the page.
|
||||||
uint32_t GetCharUnicode(int char_index);
|
uint32_t GetCharUnicode(int char_index);
|
||||||
// Get the bounds of a character in page pixels.
|
// Get the bounds of a character in page pixels.
|
||||||
|
Reference in New Issue
Block a user