14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/ctypeset.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <algorithm>
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cline.h"
12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fpdfdoc/cpdf_variabletext.h"
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/cpvt_wordinfo.h"
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "core/fpdfdoc/csection.h"
15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/stl_util.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace {
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannconst uint8_t special_chars[128] = {
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    0x00, 0x0C, 0x08, 0x0C, 0x08, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x00,
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    0x10, 0x00, 0x00, 0x28, 0x0C, 0x08, 0x00, 0x00, 0x28, 0x28, 0x28, 0x28,
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x08, 0x08,
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0C, 0x00, 0x08, 0x00, 0x00,
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    0x01, 0x01, 0x01, 0x0C, 0x00, 0x08, 0x00, 0x00,
314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann};
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsLatin(uint16_t word) {
344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word <= 0x007F)
354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return !!(special_chars[word] & 0x01);
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return ((word >= 0x00C0 && word <= 0x00FF) ||
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (word >= 0x0100 && word <= 0x024F) ||
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (word >= 0x1E00 && word <= 0x1EFF) ||
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (word >= 0x2C60 && word <= 0x2C7F) ||
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (word >= 0xA720 && word <= 0xA7FF) ||
424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (word >= 0xFF21 && word <= 0xFF3A) ||
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (word >= 0xFF41 && word <= 0xFF5A));
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsDigit(uint32_t word) {
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return word >= 0x0030 && word <= 0x0039;
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsCJK(uint32_t word) {
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if ((word >= 0x1100 && word <= 0x11FF) ||
524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (word >= 0x2E80 && word <= 0x2FFF) ||
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (word >= 0x3040 && word <= 0x9FBF) ||
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (word >= 0xAC00 && word <= 0xD7AF) ||
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (word >= 0xF900 && word <= 0xFAFF) ||
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (word >= 0xFE30 && word <= 0xFE4F) ||
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (word >= 0x20000 && word <= 0x2A6DF) ||
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (word >= 0x2F800 && word <= 0x2FA1F)) {
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word >= 0x3000 && word <= 0x303F) {
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return (
634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x3005 || word == 0x3006 || word == 0x3021 || word == 0x3022 ||
644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x3023 || word == 0x3024 || word == 0x3025 || word == 0x3026 ||
654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x3027 || word == 0x3028 || word == 0x3029 || word == 0x3031 ||
664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x3032 || word == 0x3033 || word == 0x3034 || word == 0x3035);
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return word >= 0xFF66 && word <= 0xFF9D;
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsPunctuation(uint32_t word) {
724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word <= 0x007F)
734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return !!(special_chars[word] & 0x08);
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word >= 0x0080 && word <= 0x00FF) {
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return (word == 0x0082 || word == 0x0084 || word == 0x0085 ||
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            word == 0x0091 || word == 0x0092 || word == 0x0093 ||
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            word <= 0x0094 || word == 0x0096 || word == 0x00B4 ||
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            word == 0x00B8);
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word >= 0x2000 && word <= 0x206F) {
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return (
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x2010 || word == 0x2011 || word == 0x2012 || word == 0x2013 ||
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x2018 || word == 0x2019 || word == 0x201A || word == 0x201B ||
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x201C || word == 0x201D || word == 0x201E || word == 0x201F ||
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x2032 || word == 0x2033 || word == 0x2034 || word == 0x2035 ||
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x2036 || word == 0x2037 || word == 0x203C || word == 0x203D ||
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x203E || word == 0x2044);
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word >= 0x3000 && word <= 0x303F) {
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return (
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x3001 || word == 0x3002 || word == 0x3003 || word == 0x3005 ||
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x3009 || word == 0x300A || word == 0x300B || word == 0x300C ||
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x300D || word == 0x300F || word == 0x300E || word == 0x3010 ||
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x3011 || word == 0x3014 || word == 0x3015 || word == 0x3016 ||
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x3017 || word == 0x3018 || word == 0x3019 || word == 0x301A ||
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0x301B || word == 0x301D || word == 0x301E || word == 0x301F);
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word >= 0xFE50 && word <= 0xFE6F)
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return (word >= 0xFE50 && word <= 0xFE5E) || word == 0xFE63;
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word >= 0xFF00 && word <= 0xFFEF) {
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return (
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0xFF01 || word == 0xFF02 || word == 0xFF07 || word == 0xFF08 ||
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0xFF09 || word == 0xFF0C || word == 0xFF0E || word == 0xFF0F ||
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0xFF1A || word == 0xFF1B || word == 0xFF1F || word == 0xFF3B ||
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0xFF3D || word == 0xFF40 || word == 0xFF5B || word == 0xFF5C ||
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0xFF5D || word == 0xFF61 || word == 0xFF62 || word == 0xFF63 ||
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        word == 0xFF64 || word == 0xFF65 || word == 0xFF9E || word == 0xFF9F);
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return false;
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsConnectiveSymbol(uint32_t word) {
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return word <= 0x007F && (special_chars[word] & 0x20);
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsOpenStylePunctuation(uint32_t word) {
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (word <= 0x007F)
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return !!(special_chars[word] & 0x04);
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return (word == 0x300A || word == 0x300C || word == 0x300E ||
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          word == 0x3010 || word == 0x3014 || word == 0x3016 ||
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          word == 0x3018 || word == 0x301A || word == 0xFF08 ||
1294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          word == 0xFF3B || word == 0xFF5B || word == 0xFF62);
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsCurrencySymbol(uint16_t word) {
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return (word == 0x0024 || word == 0x0080 || word == 0x00A2 ||
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          word == 0x00A3 || word == 0x00A4 || word == 0x00A5 ||
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          (word >= 0x20A0 && word <= 0x20CF) || word == 0xFE69 ||
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          word == 0xFF04 || word == 0xFFE0 || word == 0xFFE1 ||
1374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          word == 0xFFE5 || word == 0xFFE6);
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsPrefixSymbol(uint16_t word) {
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return IsCurrencySymbol(word) || word == 0x2116;
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool IsSpace(uint16_t word) {
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return word == 0x0020 || word == 0x3000;
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool NeedDivision(uint16_t prevWord, uint16_t curWord) {
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if ((IsLatin(prevWord) || IsDigit(prevWord)) &&
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (IsLatin(curWord) || IsDigit(curWord))) {
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsSpace(curWord) || IsPunctuation(curWord)) {
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
1554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsConnectiveSymbol(prevWord) || IsConnectiveSymbol(curWord)) {
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsSpace(prevWord) || IsPunctuation(prevWord)) {
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsPrefixSymbol(prevWord)) {
1634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsPrefixSymbol(curWord) || IsCJK(curWord)) {
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
1674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsCJK(prevWord)) {
1694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return true;
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return false;
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}  // namespace
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCTypeset::CTypeset(CSection* pSection)
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_rcRet(0.0f, 0.0f, 0.0f, 0.0f),
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pVT(pSection->m_pVT),
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pSection(pSection) {}
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCTypeset::~CTypeset() {}
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPVT_FloatRect CTypeset::CharArray() {
184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_rcRet = CPVT_FloatRect(0, 0, 0, 0);
185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_pSection->m_LineArray.empty())
186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return m_rcRet;
187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
188d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fNodeWidth = m_pVT->GetPlateWidth() /
189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     (m_pVT->GetCharArray() <= 0 ? 1 : m_pVT->GetCharArray());
190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fLineAscent =
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());
192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fLineDescent =
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), m_pVT->GetFontSize());
194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float x = 0.0f;
195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float y = m_pVT->GetLineLeading() + fLineAscent;
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nStart = 0;
197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CLine* pLine = m_pSection->m_LineArray.front().get();
198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (m_pVT->GetAlignment()) {
199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case 0:
200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pLine->m_LineInfo.fLineX = fNodeWidth * VARIABLETEXT_HALF;
201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case 1:
203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      nStart = (m_pVT->GetCharArray() -
204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                pdfium::CollectionSize<int32_t>(m_pSection->m_WordArray)) /
205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann               2;
206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pLine->m_LineInfo.fLineX =
207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          fNodeWidth * nStart - fNodeWidth * VARIABLETEXT_HALF;
208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case 2:
210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      nStart = m_pVT->GetCharArray() -
211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann               pdfium::CollectionSize<int32_t>(m_pSection->m_WordArray);
212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pLine->m_LineInfo.fLineX =
213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          fNodeWidth * nStart - fNodeWidth * VARIABLETEXT_HALF;
214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (int32_t w = 0,
217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann               sz = pdfium::CollectionSize<int32_t>(m_pSection->m_WordArray);
218d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       w < sz; w++) {
219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (w >= m_pVT->GetCharArray())
220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    float fNextWidth = 0;
223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pdfium::IndexInBounds(m_pSection->m_WordArray, w + 1)) {
224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CPVT_WordInfo* pNextWord = m_pSection->m_WordArray[w + 1].get();
225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pNextWord->fWordTail = 0;
226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      fNextWidth = m_pVT->GetWordWidth(*pNextWord);
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CPVT_WordInfo* pWord = m_pSection->m_WordArray[w].get();
229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pWord->fWordTail = 0;
230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    float fWordWidth = m_pVT->GetWordWidth(*pWord);
231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    float fWordAscent = m_pVT->GetWordAscent(*pWord);
232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    float fWordDescent = m_pVT->GetWordDescent(*pWord);
233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    x = (float)(fNodeWidth * (w + nStart + 0.5) -
234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                fWordWidth * VARIABLETEXT_HALF);
235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pWord->fWordX = x;
236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pWord->fWordY = y;
237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (w == 0) {
238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pLine->m_LineInfo.fLineX = x;
239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (w != pdfium::CollectionSize<int32_t>(m_pSection->m_WordArray) - 1) {
241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pWord->fWordTail =
242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          (fNodeWidth - (fWordWidth + fNextWidth) * VARIABLETEXT_HALF > 0
243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann               ? fNodeWidth - (fWordWidth + fNextWidth) * VARIABLETEXT_HALF
244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann               : 0);
245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else {
246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pWord->fWordTail = 0;
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    x += fWordWidth;
249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    fLineAscent = std::max(fLineAscent, fWordAscent);
250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    fLineDescent = std::min(fLineDescent, fWordDescent);
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pLine->m_LineInfo.nBeginWordIndex = 0;
253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pLine->m_LineInfo.nEndWordIndex =
254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pdfium::CollectionSize<int32_t>(m_pSection->m_WordArray) - 1;
255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pLine->m_LineInfo.fLineY = y;
256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pLine->m_LineInfo.fLineWidth = x - pLine->m_LineInfo.fLineX;
257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pLine->m_LineInfo.fLineAscent = fLineAscent;
258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pLine->m_LineInfo.fLineDescent = fLineDescent;
259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_rcRet = CPVT_FloatRect(0, 0, x, y - fLineDescent);
260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_rcRet;
2614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_SizeF CTypeset::GetEditSize(float fFontSize) {
2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(m_pSection);
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(m_pVT);
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SplitLines(false, fFontSize);
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return CFX_SizeF(m_rcRet.Width(), m_rcRet.Height());
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCPVT_FloatRect CTypeset::Typeset() {
2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(m_pVT);
272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pSection->m_LineArray.clear();
2734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  SplitLines(true, 0.0f);
2744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  OutputLines();
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_rcRet;
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
278d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CTypeset::SplitLines(bool bTypeset, float fFontSize) {
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(m_pVT);
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(m_pSection);
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nLineHead = 0;
2824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nLineTail = 0;
283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fMaxX = 0.0f, fMaxY = 0.0f;
284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fLineWidth = 0.0f, fBackupLineWidth = 0.0f;
285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fLineAscent = 0.0f, fBackupLineAscent = 0.0f;
286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fLineDescent = 0.0f, fBackupLineDescent = 0.0f;
2874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nWordStartPos = 0;
2884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bFullWord = false;
2894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nLineFullWordIndex = 0;
2904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nCharIndex = 0;
2914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CPVT_LineInfo line;
292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fWordWidth = 0;
293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fTypesetWidth =
294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      std::max(m_pVT->GetPlateWidth() - m_pVT->GetLineIndent(), 0.0f);
295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t nTotalWords =
296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pdfium::CollectionSize<int32_t>(m_pSection->m_WordArray);
2974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bOpened = false;
2984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nTotalWords > 0) {
2994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    int32_t i = 0;
3004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (i < nTotalWords) {
301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CPVT_WordInfo* pWord = m_pSection->m_WordArray[i].get();
3024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CPVT_WordInfo* pOldWord = pWord;
3034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (i > 0) {
304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pOldWord = m_pSection->m_WordArray[i - 1].get();
3054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pWord) {
3074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bTypeset) {
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fLineAscent = std::max(fLineAscent, m_pVT->GetWordAscent(*pWord));
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fLineDescent = std::min(fLineDescent, m_pVT->GetWordDescent(*pWord));
3104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fWordWidth = m_pVT->GetWordWidth(*pWord);
3114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        } else {
3124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fLineAscent =
3134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              std::max(fLineAscent, m_pVT->GetWordAscent(*pWord, fFontSize));
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fLineDescent =
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              std::min(fLineDescent, m_pVT->GetWordDescent(*pWord, fFontSize));
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fWordWidth = m_pVT->GetWordWidth(
317d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              pWord->nFontIndex, pWord->Word, m_pVT->GetSubWord(),
318d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              m_pVT->GetCharSpace(), m_pVT->GetHorzScale(), fFontSize,
3194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              pWord->fWordTail);
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (!bOpened) {
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (IsOpenStylePunctuation(pWord->Word)) {
3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            bOpened = true;
3244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            bFullWord = true;
3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          } else if (pOldWord) {
3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            if (NeedDivision(pOldWord->Word, pWord->Word)) {
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              bFullWord = true;
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            }
3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        } else {
3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (!IsSpace(pWord->Word) && !IsOpenStylePunctuation(pWord->Word)) {
3324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            bOpened = false;
3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bFullWord) {
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          bFullWord = false;
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (nCharIndex > 0) {
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            nLineFullWordIndex++;
3394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          nWordStartPos = i;
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fBackupLineWidth = fLineWidth;
3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fBackupLineAscent = fLineAscent;
3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fBackupLineDescent = fLineDescent;
3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nCharIndex++;
3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
347d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (m_pVT->IsAutoReturn() && fTypesetWidth > 0 &&
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fLineWidth + fWordWidth > fTypesetWidth) {
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (nLineFullWordIndex > 0) {
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          i = nWordStartPos;
3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fLineWidth = fBackupLineWidth;
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fLineAscent = fBackupLineAscent;
3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fLineDescent = fBackupLineDescent;
3544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (nCharIndex == 1) {
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          fLineWidth = fWordWidth;
3574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          i++;
3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nLineTail = i - 1;
3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bTypeset) {
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          line.nBeginWordIndex = nLineHead;
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          line.nEndWordIndex = nLineTail;
3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          line.nTotalWord = nLineTail - nLineHead + 1;
3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          line.fLineWidth = fLineWidth;
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          line.fLineAscent = fLineAscent;
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          line.fLineDescent = fLineDescent;
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_pSection->AddLine(line);
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
369d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        fMaxY += (fLineAscent + m_pVT->GetLineLeading());
3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fMaxY -= fLineDescent;
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fMaxX = std::max(fLineWidth, fMaxX);
3724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nLineHead = i;
3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fLineWidth = 0.0f;
3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fLineAscent = 0.0f;
3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fLineDescent = 0.0f;
3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nCharIndex = 0;
3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nLineFullWordIndex = 0;
3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bFullWord = false;
3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        fLineWidth += fWordWidth;
3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        i++;
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (nLineHead <= nTotalWords - 1) {
3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nLineTail = nTotalWords - 1;
3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (bTypeset) {
3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        line.nBeginWordIndex = nLineHead;
3884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        line.nEndWordIndex = nLineTail;
3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        line.nTotalWord = nLineTail - nLineHead + 1;
3904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        line.fLineWidth = fLineWidth;
3914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        line.fLineAscent = fLineAscent;
3924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        line.fLineDescent = fLineDescent;
3934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        m_pSection->AddLine(line);
3944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
395d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      fMaxY += (fLineAscent + m_pVT->GetLineLeading());
3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fMaxY -= fLineDescent;
3974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fMaxX = std::max(fLineWidth, fMaxX);
3984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
4004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bTypeset) {
401d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      fLineAscent = m_pVT->GetLineAscent();
402d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      fLineDescent = m_pVT->GetLineDescent();
4034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
4044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fLineAscent =
4054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_pVT->GetFontAscent(m_pVT->GetDefaultFontIndex(), fFontSize);
4064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fLineDescent =
4074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_pVT->GetFontDescent(m_pVT->GetDefaultFontIndex(), fFontSize);
4084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bTypeset) {
4104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      line.nBeginWordIndex = -1;
4114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      line.nEndWordIndex = -1;
4124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      line.nTotalWord = 0;
4134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      line.fLineWidth = 0;
4144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      line.fLineAscent = fLineAscent;
4154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      line.fLineDescent = fLineDescent;
4164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pSection->AddLine(line);
4174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
418d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    fMaxY += m_pVT->GetLineLeading() + fLineAscent - fLineDescent;
4194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rcRet = CPVT_FloatRect(0, 0, fMaxX, fMaxY);
4214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CTypeset::OutputLines() {
4244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(m_pVT);
4254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(m_pSection);
426d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fMinX = 0.0f, fMinY = 0.0f, fMaxX = 0.0f, fMaxY = 0.0f;
427d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fPosX = 0.0f, fPosY = 0.0f;
428d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fLineIndent = m_pVT->GetLineIndent();
429d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fTypesetWidth = std::max(m_pVT->GetPlateWidth() - fLineIndent, 0.0f);
430d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (m_pVT->GetAlignment()) {
4314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default:
4324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case 0:
4334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fMinX = 0.0f;
4344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case 1:
4364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fMinX = (fTypesetWidth - m_rcRet.Width()) * VARIABLETEXT_HALF;
4374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case 2:
4394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      fMinX = fTypesetWidth - m_rcRet.Width();
4404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
4414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  fMaxX = fMinX + m_rcRet.Width();
4434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  fMinY = 0.0f;
4444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  fMaxY = m_rcRet.Height();
445d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t nTotalLines =
446d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pdfium::CollectionSize<int32_t>(m_pSection->m_LineArray);
4474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (nTotalLines > 0) {
4484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (int32_t l = 0; l < nTotalLines; l++) {
449d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CLine* pLine = m_pSection->m_LineArray[l].get();
450d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      switch (m_pVT->GetAlignment()) {
451d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        default:
452d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        case 0:
453d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          fPosX = 0;
454d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
455d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        case 1:
456d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          fPosX = (fTypesetWidth - pLine->m_LineInfo.fLineWidth) *
457d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                  VARIABLETEXT_HALF;
458d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
459d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        case 2:
460d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          fPosX = fTypesetWidth - pLine->m_LineInfo.fLineWidth;
461d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          break;
462d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
463d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      fPosX += fLineIndent;
464d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      fPosY += m_pVT->GetLineLeading();
465d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      fPosY += pLine->m_LineInfo.fLineAscent;
466d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pLine->m_LineInfo.fLineX = fPosX - fMinX;
467d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pLine->m_LineInfo.fLineY = fPosY - fMinY;
468d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      for (int32_t w = pLine->m_LineInfo.nBeginWordIndex;
469d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann           w <= pLine->m_LineInfo.nEndWordIndex; w++) {
470d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (pdfium::IndexInBounds(m_pSection->m_WordArray, w)) {
471d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          CPVT_WordInfo* pWord = m_pSection->m_WordArray[w].get();
472d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pWord->fWordX = fPosX - fMinX;
473d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pWord->fWordY = fPosY - fMinY;
474d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
475d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          fPosX += m_pVT->GetWordWidth(*pWord);
4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
478d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      fPosY -= pLine->m_LineInfo.fLineDescent;
4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_rcRet = CPVT_FloatRect(fMinX, fMinY, fMaxX, fMaxY);
4824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
483