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