TextPage.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "TextPage.h"
  2. MuPDF::TextOptions::operator fz_stext_options(TextOptions^ options) {
  3. fz_stext_options s{};
  4. if (options) {
  5. s.flags = (int)options->Flags;
  6. s.scale = options->Scale;
  7. }
  8. return s;
  9. }
  10. String^ MuPDF::TextSpan::ToString() {
  11. int l = _length;
  12. auto sb = gcnew StringBuilder(l);
  13. fz_stext_char* c = _ch;
  14. do {
  15. sb->Append((Char)c->c);
  16. } while (--l > 0 && (c = c->next));
  17. return sb->ToString();
  18. }
  19. String^ MuPDF::TextLine::ToString() {
  20. auto sb = gcnew StringBuilder(16);
  21. fz_stext_char* c = _line->first_char;
  22. do {
  23. sb->Append((Char)c->c);
  24. } while (c = c->next);
  25. return sb->ToString();
  26. }
  27. String^ MuPDF::TextBlock::ToString() {
  28. // if (IsImageBlock) {
  29. // return String::Empty;
  30. // }
  31. StringBuilder^ sb = gcnew StringBuilder(16);
  32. fz_stext_line* l = _block->u.t.first_line;
  33. do {
  34. fz_stext_char* c = l->first_char;
  35. do {
  36. sb->Append((Char)c->c);
  37. } while (c = c->next);
  38. sb->AppendLine();
  39. } while (l = l->next);
  40. return sb->ToString();
  41. }
  42. bool MaybeUtf8(const char* text) {
  43. unsigned int b = 0; // byte count
  44. const char* p = text;
  45. char c;
  46. while (c = *p) {
  47. if (b == 0) {
  48. if (c < 0x80) {
  49. goto NEXT;
  50. }
  51. // multibyte
  52. if (c < 0xC0) {
  53. b = 1;
  54. }
  55. else if (c < 0xE0) {
  56. b = 2;
  57. }
  58. else if (c < 0xF0) {
  59. b = 3;
  60. }
  61. else if (c < 0xF8) {
  62. b = 4;
  63. }
  64. else if (c < 0xFE) {
  65. b = 5;
  66. }
  67. else {
  68. return false;
  69. }
  70. }
  71. else {
  72. // multi-byte subsequent char: 10xxxxxx
  73. if ((c & 0xC0) != 0x80) {
  74. return false;
  75. }
  76. b--;
  77. }
  78. NEXT:
  79. ++p;
  80. }
  81. return b == 0;
  82. }
  83. bool MuPDF::TextLine::TextLineSpanContainer::MoveNext() {
  84. if (!_start) {
  85. return false;
  86. }
  87. auto end = _start;
  88. auto p = end->next;
  89. auto font = _start->font;
  90. auto color = _start->argb;
  91. auto size = _start->size;
  92. Quad quad = _start->quad;
  93. int length = 1;
  94. while (p) {
  95. if (p->font != font || p->size != size || p->argb != color) {
  96. _Current = gcnew TextSpan(_start, length, quad.Union(p->quad).ToBox(), _Line->IsVertical);
  97. _start = p;
  98. return true;
  99. }
  100. end = p;
  101. p = p->next;
  102. ++length;
  103. }
  104. _Current = gcnew TextSpan(_start, length, end == _start ? quad.ToBox() : quad.Union(end->quad).ToBox(), _Line->IsVertical);
  105. _start = NULL;
  106. return true;
  107. }
  108. void MuPDF::TextLine::TextLineSpanContainer::Reset() {
  109. _Current = nullptr;
  110. _active = NULL;
  111. _start = _Line->_line->first_char;
  112. }