| OLD | NEW |
| 1 // Copyright 2016 PDFium Authors. All rights reserved. | 1 // Copyright 2016 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "core/fpdfapi/fpdf_page/include/cpdf_textobject.h" | 7 #include "core/fpdfapi/fpdf_page/include/cpdf_textobject.h" |
| 8 | 8 |
| 9 #include "core/fpdfapi/fpdf_font/cpdf_cidfont.h" | 9 #include "core/fpdfapi/fpdf_font/cpdf_cidfont.h" |
| 10 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" | 10 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" |
| 11 | 11 |
| 12 CPDF_TextObject::CPDF_TextObject() | 12 CPDF_TextObject::CPDF_TextObject() |
| 13 : m_PosX(0), | 13 : m_PosX(0), |
| 14 m_PosY(0), | 14 m_PosY(0), |
| 15 m_nChars(0), | 15 m_nChars(0), |
| 16 m_pCharCodes(nullptr), | 16 m_pCharCodes(nullptr), |
| 17 m_pCharPos(nullptr) {} | 17 m_pCharPos(nullptr) {} |
| 18 | 18 |
| 19 CPDF_TextObject::~CPDF_TextObject() { | 19 CPDF_TextObject::~CPDF_TextObject() { |
| 20 if (m_nChars > 1) { | 20 if (m_nChars > 1) { |
| 21 FX_Free(m_pCharCodes); | 21 FX_Free(m_pCharCodes); |
| 22 } | 22 } |
| 23 FX_Free(m_pCharPos); | 23 FX_Free(m_pCharPos); |
| 24 } | 24 } |
| 25 | 25 |
| 26 int CPDF_TextObject::CountItems() const { |
| 27 return m_nChars; |
| 28 } |
| 29 |
| 26 void CPDF_TextObject::GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const { | 30 void CPDF_TextObject::GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const { |
| 27 pInfo->m_CharCode = | 31 pInfo->m_CharCode = |
| 28 m_nChars == 1 ? (uint32_t)(uintptr_t)m_pCharCodes : m_pCharCodes[index]; | 32 m_nChars == 1 ? (uint32_t)(uintptr_t)m_pCharCodes : m_pCharCodes[index]; |
| 29 pInfo->m_OriginX = index ? m_pCharPos[index - 1] : 0; | 33 pInfo->m_OriginX = index ? m_pCharPos[index - 1] : 0; |
| 30 pInfo->m_OriginY = 0; | 34 pInfo->m_OriginY = 0; |
| 31 if (pInfo->m_CharCode == CPDF_Font::kInvalidCharCode) { | 35 if (pInfo->m_CharCode == CPDF_Font::kInvalidCharCode) { |
| 32 return; | 36 return; |
| 33 } | 37 } |
| 34 CPDF_Font* pFont = m_TextState.GetFont(); | 38 CPDF_Font* pFont = m_TextState.GetFont(); |
| 35 if (!pFont->IsCIDFont()) { | 39 if (!pFont->IsCIDFont()) { |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 FXSYS_memcpy(obj->m_pCharPos, m_pCharPos, | 121 FXSYS_memcpy(obj->m_pCharPos, m_pCharPos, |
| 118 (m_nChars - 1) * sizeof(FX_FLOAT)); | 122 (m_nChars - 1) * sizeof(FX_FLOAT)); |
| 119 } else { | 123 } else { |
| 120 obj->m_pCharCodes = m_pCharCodes; | 124 obj->m_pCharCodes = m_pCharCodes; |
| 121 } | 125 } |
| 122 obj->m_PosX = m_PosX; | 126 obj->m_PosX = m_PosX; |
| 123 obj->m_PosY = m_PosY; | 127 obj->m_PosY = m_PosY; |
| 124 return obj; | 128 return obj; |
| 125 } | 129 } |
| 126 | 130 |
| 131 CPDF_PageObject::Type CPDF_TextObject::GetType() const { |
| 132 return TEXT; |
| 133 } |
| 134 |
| 135 void CPDF_TextObject::Transform(const CFX_Matrix& matrix) { |
| 136 m_TextState.GetModify(); |
| 137 CFX_Matrix text_matrix; |
| 138 GetTextMatrix(&text_matrix); |
| 139 text_matrix.Concat(matrix); |
| 140 FX_FLOAT* pTextMatrix = m_TextState.GetMatrix(); |
| 141 pTextMatrix[0] = text_matrix.GetA(); |
| 142 pTextMatrix[1] = text_matrix.GetC(); |
| 143 pTextMatrix[2] = text_matrix.GetB(); |
| 144 pTextMatrix[3] = text_matrix.GetD(); |
| 145 m_PosX = text_matrix.GetE(); |
| 146 m_PosY = text_matrix.GetF(); |
| 147 CalcPositionData(nullptr, nullptr, 0); |
| 148 } |
| 149 |
| 150 bool CPDF_TextObject::IsText() const { |
| 151 return true; |
| 152 } |
| 153 |
| 154 CPDF_TextObject* CPDF_TextObject::AsText() { |
| 155 return this; |
| 156 } |
| 157 |
| 158 const CPDF_TextObject* CPDF_TextObject::AsText() const { |
| 159 return this; |
| 160 } |
| 161 |
| 127 void CPDF_TextObject::GetTextMatrix(CFX_Matrix* pMatrix) const { | 162 void CPDF_TextObject::GetTextMatrix(CFX_Matrix* pMatrix) const { |
| 128 FX_FLOAT* pTextMatrix = m_TextState.GetMatrix(); | 163 FX_FLOAT* pTextMatrix = m_TextState.GetMatrix(); |
| 129 pMatrix->Set(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], pTextMatrix[3], | 164 pMatrix->Set(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], pTextMatrix[3], |
| 130 m_PosX, m_PosY); | 165 m_PosX, m_PosY); |
| 131 } | 166 } |
| 132 | 167 |
| 133 void CPDF_TextObject::SetSegments(const CFX_ByteString* pStrs, | 168 void CPDF_TextObject::SetSegments(const CFX_ByteString* pStrs, |
| 134 FX_FLOAT* pKerning, | 169 FX_FLOAT* pKerning, |
| 135 int nsegs) { | 170 int nsegs) { |
| 136 if (m_nChars > 1) { | 171 if (m_nChars > 1) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 if (pCIDFont) { | 216 if (pCIDFont) { |
| 182 bVertWriting = pCIDFont->IsVertWriting(); | 217 bVertWriting = pCIDFont->IsVertWriting(); |
| 183 } | 218 } |
| 184 if (!bVertWriting) | 219 if (!bVertWriting) |
| 185 return pFont->GetCharWidthF(charcode, 0) * fontsize; | 220 return pFont->GetCharWidthF(charcode, 0) * fontsize; |
| 186 | 221 |
| 187 uint16_t CID = pCIDFont->CIDFromCharCode(charcode); | 222 uint16_t CID = pCIDFont->CIDFromCharCode(charcode); |
| 188 return pCIDFont->GetVertWidth(CID) * fontsize; | 223 return pCIDFont->GetVertWidth(CID) * fontsize; |
| 189 } | 224 } |
| 190 | 225 |
| 226 FX_FLOAT CPDF_TextObject::GetPosX() const { |
| 227 return m_PosX; |
| 228 } |
| 229 |
| 230 FX_FLOAT CPDF_TextObject::GetPosY() const { |
| 231 return m_PosY; |
| 232 } |
| 233 |
| 234 CPDF_Font* CPDF_TextObject::GetFont() const { |
| 235 return m_TextState.GetFont(); |
| 236 } |
| 237 |
| 238 FX_FLOAT CPDF_TextObject::GetFontSize() const { |
| 239 return m_TextState.GetFontSize(); |
| 240 } |
| 241 |
| 191 void CPDF_TextObject::CalcPositionData(FX_FLOAT* pTextAdvanceX, | 242 void CPDF_TextObject::CalcPositionData(FX_FLOAT* pTextAdvanceX, |
| 192 FX_FLOAT* pTextAdvanceY, | 243 FX_FLOAT* pTextAdvanceY, |
| 193 FX_FLOAT horz_scale, | 244 FX_FLOAT horz_scale, |
| 194 int level) { | 245 int level) { |
| 195 FX_FLOAT curpos = 0; | 246 FX_FLOAT curpos = 0; |
| 196 FX_FLOAT min_x = 10000 * 1.0f; | 247 FX_FLOAT min_x = 10000 * 1.0f; |
| 197 FX_FLOAT max_x = -10000 * 1.0f; | 248 FX_FLOAT max_x = -10000 * 1.0f; |
| 198 FX_FLOAT min_y = 10000 * 1.0f; | 249 FX_FLOAT min_y = 10000 * 1.0f; |
| 199 FX_FLOAT max_y = -10000 * 1.0f; | 250 FX_FLOAT max_y = -10000 * 1.0f; |
| 200 CPDF_Font* pFont = m_TextState.GetFont(); | 251 CPDF_Font* pFont = m_TextState.GetFont(); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom); | 366 matrix.TransformRect(m_Left, m_Right, m_Top, m_Bottom); |
| 316 if (TextRenderingModeIsStrokeMode(m_TextState.GetObject()->m_TextMode)) { | 367 if (TextRenderingModeIsStrokeMode(m_TextState.GetObject()->m_TextMode)) { |
| 317 FX_FLOAT half_width = m_GraphState.GetObject()->m_LineWidth / 2; | 368 FX_FLOAT half_width = m_GraphState.GetObject()->m_LineWidth / 2; |
| 318 m_Left -= half_width; | 369 m_Left -= half_width; |
| 319 m_Right += half_width; | 370 m_Right += half_width; |
| 320 m_Top += half_width; | 371 m_Top += half_width; |
| 321 m_Bottom -= half_width; | 372 m_Bottom -= half_width; |
| 322 } | 373 } |
| 323 } | 374 } |
| 324 | 375 |
| 325 void CPDF_TextObject::Transform(const CFX_Matrix& matrix) { | |
| 326 m_TextState.GetModify(); | |
| 327 CFX_Matrix text_matrix; | |
| 328 GetTextMatrix(&text_matrix); | |
| 329 text_matrix.Concat(matrix); | |
| 330 FX_FLOAT* pTextMatrix = m_TextState.GetMatrix(); | |
| 331 pTextMatrix[0] = text_matrix.GetA(); | |
| 332 pTextMatrix[1] = text_matrix.GetC(); | |
| 333 pTextMatrix[2] = text_matrix.GetB(); | |
| 334 pTextMatrix[3] = text_matrix.GetD(); | |
| 335 m_PosX = text_matrix.GetE(); | |
| 336 m_PosY = text_matrix.GetF(); | |
| 337 CalcPositionData(nullptr, nullptr, 0); | |
| 338 } | |
| 339 | |
| 340 void CPDF_TextObject::SetPosition(FX_FLOAT x, FX_FLOAT y) { | 376 void CPDF_TextObject::SetPosition(FX_FLOAT x, FX_FLOAT y) { |
| 341 FX_FLOAT dx = x - m_PosX; | 377 FX_FLOAT dx = x - m_PosX; |
| 342 FX_FLOAT dy = y - m_PosY; | 378 FX_FLOAT dy = y - m_PosY; |
| 343 m_PosX = x; | 379 m_PosX = x; |
| 344 m_PosY = y; | 380 m_PosY = y; |
| 345 m_Left += dx; | 381 m_Left += dx; |
| 346 m_Right += dx; | 382 m_Right += dx; |
| 347 m_Top += dy; | 383 m_Top += dy; |
| 348 m_Bottom += dy; | 384 m_Bottom += dy; |
| 349 } | 385 } |
| 386 |
| 387 void CPDF_TextObject::RecalcPositionData() { |
| 388 CalcPositionData(nullptr, nullptr, 1); |
| 389 } |
| OLD | NEW |