summaryrefslogtreecommitdiff
path: root/xfa_test/pdf/pdfium/pdfium_range.cc
blob: c77d5906dd28b7e831bd746246d02e37abc5caf0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// Copyright (c) 2010 The Chromium 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 "pdf/pdfium/pdfium_range.h"

#include "base/logging.h"
#include "base/strings/string_util.h"

namespace chrome_pdf {

PDFiumRange::PDFiumRange(PDFiumPage* page, int char_index, int char_count)
    : page_(page),
      char_index_(char_index),
      char_count_(char_count),
      cached_screen_rects_zoom_(0) {
}

PDFiumRange::~PDFiumRange() {
}

void PDFiumRange::SetCharCount(int char_count) {
  char_count_ = char_count;

  cached_screen_rects_offset_ = pp::Point();
  cached_screen_rects_zoom_ = 0;
}

std::vector<pp::Rect> PDFiumRange::GetScreenRects(const pp::Point& offset,
                                                  double zoom,
                                                  int rotation) {
  if (offset == cached_screen_rects_offset_ &&
      zoom == cached_screen_rects_zoom_) {
    return cached_screen_rects_;
  }

  cached_screen_rects_.clear();
  cached_screen_rects_offset_ = offset;
  cached_screen_rects_zoom_ = zoom;

  int char_index = char_index_;
  int char_count = char_count_;
  if (char_count < 0) {
    char_count *= -1;
    char_index -= char_count - 1;
  }

  int count = FPDFText_CountRects(page_->GetTextPage(), char_index, char_count);
  for (int i = 0; i < count; ++i) {
    double left, top, right, bottom;
    FPDFText_GetRect(page_->GetTextPage(), i, &left, &top, &right, &bottom);
    cached_screen_rects_.push_back(
        page_->PageToScreen(offset, zoom, left, top, right, bottom, rotation));
  }

  return cached_screen_rects_;
}

base::string16 PDFiumRange::GetText() {
  int index = char_index_;
  int count = char_count_;
  if (!count)
    return base::string16();
  if (count < 0) {
    count *= -1;
    index -= count - 1;
  }

  base::string16 rv;
  unsigned short* data =
      reinterpret_cast<unsigned short*>(WriteInto(&rv, count + 1));
  if (data) {
    int written = FPDFText_GetText(page_->GetTextPage(), index, count, data);
    rv.reserve(written);
  }
  return rv;
}

}  // namespace chrome_pdf