| 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" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 } | 28 } |
| 29 | 29 |
| 30 void CPDF_TextObject::GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const { | 30 void CPDF_TextObject::GetItemInfo(int index, CPDF_TextObjectItem* pInfo) const { |
| 31 pInfo->m_CharCode = | 31 pInfo->m_CharCode = |
| 32 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]; |
| 33 pInfo->m_OriginX = index ? m_pCharPos[index - 1] : 0; | 33 pInfo->m_OriginX = index ? m_pCharPos[index - 1] : 0; |
| 34 pInfo->m_OriginY = 0; | 34 pInfo->m_OriginY = 0; |
| 35 if (pInfo->m_CharCode == CPDF_Font::kInvalidCharCode) { | 35 if (pInfo->m_CharCode == CPDF_Font::kInvalidCharCode) { |
| 36 return; | 36 return; |
| 37 } | 37 } |
| 38 CPDF_Font* pFont = m_TextState->GetFont(); | 38 CPDF_Font* pFont = m_TextState.GetFont(); |
| 39 if (!pFont->IsCIDFont()) { | 39 if (!pFont->IsCIDFont()) { |
| 40 return; | 40 return; |
| 41 } | 41 } |
| 42 if (!pFont->AsCIDFont()->IsVertWriting()) { | 42 if (!pFont->AsCIDFont()->IsVertWriting()) { |
| 43 return; | 43 return; |
| 44 } | 44 } |
| 45 uint16_t CID = pFont->AsCIDFont()->CIDFromCharCode(pInfo->m_CharCode); | 45 uint16_t CID = pFont->AsCIDFont()->CIDFromCharCode(pInfo->m_CharCode); |
| 46 pInfo->m_OriginY = pInfo->m_OriginX; | 46 pInfo->m_OriginY = pInfo->m_OriginX; |
| 47 pInfo->m_OriginX = 0; | 47 pInfo->m_OriginX = 0; |
| 48 short vx, vy; | 48 short vx, vy; |
| 49 pFont->AsCIDFont()->GetVertOrigin(CID, vx, vy); | 49 pFont->AsCIDFont()->GetVertOrigin(CID, vx, vy); |
| 50 FX_FLOAT fontsize = m_TextState->GetFontSize(); | 50 FX_FLOAT fontsize = m_TextState.GetFontSize(); |
| 51 pInfo->m_OriginX -= fontsize * vx / 1000; | 51 pInfo->m_OriginX -= fontsize * vx / 1000; |
| 52 pInfo->m_OriginY -= fontsize * vy / 1000; | 52 pInfo->m_OriginY -= fontsize * vy / 1000; |
| 53 } | 53 } |
| 54 | 54 |
| 55 int CPDF_TextObject::CountChars() const { | 55 int CPDF_TextObject::CountChars() const { |
| 56 if (m_nChars == 1) { | 56 if (m_nChars == 1) { |
| 57 return 1; | 57 return 1; |
| 58 } | 58 } |
| 59 int count = 0; | 59 int count = 0; |
| 60 for (int i = 0; i < m_nChars; ++i) | 60 for (int i = 0; i < m_nChars; ++i) |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 | 130 |
| 131 CPDF_PageObject::Type CPDF_TextObject::GetType() const { | 131 CPDF_PageObject::Type CPDF_TextObject::GetType() const { |
| 132 return TEXT; | 132 return TEXT; |
| 133 } | 133 } |
| 134 | 134 |
| 135 void CPDF_TextObject::Transform(const CFX_Matrix& matrix) { | 135 void CPDF_TextObject::Transform(const CFX_Matrix& matrix) { |
| 136 m_TextState.MakePrivateCopy(); | 136 m_TextState.MakePrivateCopy(); |
| 137 CFX_Matrix text_matrix; | 137 CFX_Matrix text_matrix; |
| 138 GetTextMatrix(&text_matrix); | 138 GetTextMatrix(&text_matrix); |
| 139 text_matrix.Concat(matrix); | 139 text_matrix.Concat(matrix); |
| 140 FX_FLOAT* pTextMatrix = m_TextState->GetMatrix(); | 140 FX_FLOAT* pTextMatrix = m_TextState.GetMatrix(); |
| 141 pTextMatrix[0] = text_matrix.GetA(); | 141 pTextMatrix[0] = text_matrix.GetA(); |
| 142 pTextMatrix[1] = text_matrix.GetC(); | 142 pTextMatrix[1] = text_matrix.GetC(); |
| 143 pTextMatrix[2] = text_matrix.GetB(); | 143 pTextMatrix[2] = text_matrix.GetB(); |
| 144 pTextMatrix[3] = text_matrix.GetD(); | 144 pTextMatrix[3] = text_matrix.GetD(); |
| 145 m_PosX = text_matrix.GetE(); | 145 m_PosX = text_matrix.GetE(); |
| 146 m_PosY = text_matrix.GetF(); | 146 m_PosY = text_matrix.GetF(); |
| 147 CalcPositionData(nullptr, nullptr, 0); | 147 CalcPositionData(nullptr, nullptr, 0); |
| 148 } | 148 } |
| 149 | 149 |
| 150 bool CPDF_TextObject::IsText() const { | 150 bool CPDF_TextObject::IsText() const { |
| 151 return true; | 151 return true; |
| 152 } | 152 } |
| 153 | 153 |
| 154 CPDF_TextObject* CPDF_TextObject::AsText() { | 154 CPDF_TextObject* CPDF_TextObject::AsText() { |
| 155 return this; | 155 return this; |
| 156 } | 156 } |
| 157 | 157 |
| 158 const CPDF_TextObject* CPDF_TextObject::AsText() const { | 158 const CPDF_TextObject* CPDF_TextObject::AsText() const { |
| 159 return this; | 159 return this; |
| 160 } | 160 } |
| 161 | 161 |
| 162 void CPDF_TextObject::GetTextMatrix(CFX_Matrix* pMatrix) const { | 162 void CPDF_TextObject::GetTextMatrix(CFX_Matrix* pMatrix) const { |
| 163 const FX_FLOAT* pTextMatrix = m_TextState->GetMatrix(); | 163 const FX_FLOAT* pTextMatrix = m_TextState.GetMatrix(); |
| 164 pMatrix->Set(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], pTextMatrix[3], | 164 pMatrix->Set(pTextMatrix[0], pTextMatrix[2], pTextMatrix[1], pTextMatrix[3], |
| 165 m_PosX, m_PosY); | 165 m_PosX, m_PosY); |
| 166 } | 166 } |
| 167 | 167 |
| 168 void CPDF_TextObject::SetSegments(const CFX_ByteString* pStrs, | 168 void CPDF_TextObject::SetSegments(const CFX_ByteString* pStrs, |
| 169 FX_FLOAT* pKerning, | 169 FX_FLOAT* pKerning, |
| 170 int nsegs) { | 170 int nsegs) { |
| 171 if (m_nChars > 1) { | 171 if (m_nChars > 1) { |
| 172 FX_Free(m_pCharCodes); | 172 FX_Free(m_pCharCodes); |
| 173 m_pCharCodes = nullptr; | 173 m_pCharCodes = nullptr; |
| 174 } | 174 } |
| 175 FX_Free(m_pCharPos); | 175 FX_Free(m_pCharPos); |
| 176 m_pCharPos = nullptr; | 176 m_pCharPos = nullptr; |
| 177 CPDF_Font* pFont = m_TextState->GetFont(); | 177 CPDF_Font* pFont = m_TextState.GetFont(); |
| 178 m_nChars = 0; | 178 m_nChars = 0; |
| 179 for (int i = 0; i < nsegs; ++i) { | 179 for (int i = 0; i < nsegs; ++i) { |
| 180 m_nChars += pFont->CountChar(pStrs[i].c_str(), pStrs[i].GetLength()); | 180 m_nChars += pFont->CountChar(pStrs[i].c_str(), pStrs[i].GetLength()); |
| 181 } | 181 } |
| 182 m_nChars += nsegs - 1; | 182 m_nChars += nsegs - 1; |
| 183 if (m_nChars > 1) { | 183 if (m_nChars > 1) { |
| 184 m_pCharCodes = FX_Alloc(uint32_t, m_nChars); | 184 m_pCharCodes = FX_Alloc(uint32_t, m_nChars); |
| 185 m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1); | 185 m_pCharPos = FX_Alloc(FX_FLOAT, m_nChars - 1); |
| 186 int index = 0; | 186 int index = 0; |
| 187 for (int i = 0; i < nsegs; ++i) { | 187 for (int i = 0; i < nsegs; ++i) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 202 pStrs[0].c_str(), pStrs[0].GetLength(), offset); | 202 pStrs[0].c_str(), pStrs[0].GetLength(), offset); |
| 203 } | 203 } |
| 204 } | 204 } |
| 205 | 205 |
| 206 void CPDF_TextObject::SetText(const CFX_ByteString& str) { | 206 void CPDF_TextObject::SetText(const CFX_ByteString& str) { |
| 207 SetSegments(&str, nullptr, 1); | 207 SetSegments(&str, nullptr, 1); |
| 208 RecalcPositionData(); | 208 RecalcPositionData(); |
| 209 } | 209 } |
| 210 | 210 |
| 211 FX_FLOAT CPDF_TextObject::GetCharWidth(uint32_t charcode) const { | 211 FX_FLOAT CPDF_TextObject::GetCharWidth(uint32_t charcode) const { |
| 212 FX_FLOAT fontsize = m_TextState->GetFontSize() / 1000; | 212 FX_FLOAT fontsize = m_TextState.GetFontSize() / 1000; |
| 213 CPDF_Font* pFont = m_TextState->GetFont(); | 213 CPDF_Font* pFont = m_TextState.GetFont(); |
| 214 FX_BOOL bVertWriting = FALSE; | 214 FX_BOOL bVertWriting = FALSE; |
| 215 CPDF_CIDFont* pCIDFont = pFont->AsCIDFont(); | 215 CPDF_CIDFont* pCIDFont = pFont->AsCIDFont(); |
| 216 if (pCIDFont) { | 216 if (pCIDFont) { |
| 217 bVertWriting = pCIDFont->IsVertWriting(); | 217 bVertWriting = pCIDFont->IsVertWriting(); |
| 218 } | 218 } |
| 219 if (!bVertWriting) | 219 if (!bVertWriting) |
| 220 return pFont->GetCharWidthF(charcode, 0) * fontsize; | 220 return pFont->GetCharWidthF(charcode, 0) * fontsize; |
| 221 | 221 |
| 222 uint16_t CID = pCIDFont->CIDFromCharCode(charcode); | 222 uint16_t CID = pCIDFont->CIDFromCharCode(charcode); |
| 223 return pCIDFont->GetVertWidth(CID) * fontsize; | 223 return pCIDFont->GetVertWidth(CID) * fontsize; |
| 224 } | 224 } |
| 225 | 225 |
| 226 FX_FLOAT CPDF_TextObject::GetPosX() const { | 226 FX_FLOAT CPDF_TextObject::GetPosX() const { |
| 227 return m_PosX; | 227 return m_PosX; |
| 228 } | 228 } |
| 229 | 229 |
| 230 FX_FLOAT CPDF_TextObject::GetPosY() const { | 230 FX_FLOAT CPDF_TextObject::GetPosY() const { |
| 231 return m_PosY; | 231 return m_PosY; |
| 232 } | 232 } |
| 233 | 233 |
| 234 CPDF_Font* CPDF_TextObject::GetFont() const { | 234 CPDF_Font* CPDF_TextObject::GetFont() const { |
| 235 return m_TextState->GetFont(); | 235 return m_TextState.GetFont(); |
| 236 } | 236 } |
| 237 | 237 |
| 238 FX_FLOAT CPDF_TextObject::GetFontSize() const { | 238 FX_FLOAT CPDF_TextObject::GetFontSize() const { |
| 239 return m_TextState->GetFontSize(); | 239 return m_TextState.GetFontSize(); |
| 240 } | 240 } |
| 241 | 241 |
| 242 void CPDF_TextObject::CalcPositionData(FX_FLOAT* pTextAdvanceX, | 242 void CPDF_TextObject::CalcPositionData(FX_FLOAT* pTextAdvanceX, |
| 243 FX_FLOAT* pTextAdvanceY, | 243 FX_FLOAT* pTextAdvanceY, |
| 244 FX_FLOAT horz_scale, | 244 FX_FLOAT horz_scale, |
| 245 int level) { | 245 int level) { |
| 246 FX_FLOAT curpos = 0; | 246 FX_FLOAT curpos = 0; |
| 247 FX_FLOAT min_x = 10000 * 1.0f; | 247 FX_FLOAT min_x = 10000 * 1.0f; |
| 248 FX_FLOAT max_x = -10000 * 1.0f; | 248 FX_FLOAT max_x = -10000 * 1.0f; |
| 249 FX_FLOAT min_y = 10000 * 1.0f; | 249 FX_FLOAT min_y = 10000 * 1.0f; |
| 250 FX_FLOAT max_y = -10000 * 1.0f; | 250 FX_FLOAT max_y = -10000 * 1.0f; |
| 251 CPDF_Font* pFont = m_TextState->GetFont(); | 251 CPDF_Font* pFont = m_TextState.GetFont(); |
| 252 FX_BOOL bVertWriting = FALSE; | 252 FX_BOOL bVertWriting = FALSE; |
| 253 CPDF_CIDFont* pCIDFont = pFont->AsCIDFont(); | 253 CPDF_CIDFont* pCIDFont = pFont->AsCIDFont(); |
| 254 if (pCIDFont) { | 254 if (pCIDFont) { |
| 255 bVertWriting = pCIDFont->IsVertWriting(); | 255 bVertWriting = pCIDFont->IsVertWriting(); |
| 256 } | 256 } |
| 257 FX_FLOAT fontsize = m_TextState->GetFontSize(); | 257 FX_FLOAT fontsize = m_TextState.GetFontSize(); |
| 258 for (int i = 0; i < m_nChars; ++i) { | 258 for (int i = 0; i < m_nChars; ++i) { |
| 259 uint32_t charcode = | 259 uint32_t charcode = |
| 260 m_nChars == 1 ? (uint32_t)(uintptr_t)m_pCharCodes : m_pCharCodes[i]; | 260 m_nChars == 1 ? (uint32_t)(uintptr_t)m_pCharCodes : m_pCharCodes[i]; |
| 261 if (i > 0) { | 261 if (i > 0) { |
| 262 if (charcode == CPDF_Font::kInvalidCharCode) { | 262 if (charcode == CPDF_Font::kInvalidCharCode) { |
| 263 curpos -= (m_pCharPos[i - 1] * fontsize) / 1000; | 263 curpos -= (m_pCharPos[i - 1] * fontsize) / 1000; |
| 264 continue; | 264 continue; |
| 265 } | 265 } |
| 266 m_pCharPos[i - 1] = curpos; | 266 m_pCharPos[i - 1] = curpos; |
| 267 } | 267 } |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 m_PosY = y; | 380 m_PosY = y; |
| 381 m_Left += dx; | 381 m_Left += dx; |
| 382 m_Right += dx; | 382 m_Right += dx; |
| 383 m_Top += dy; | 383 m_Top += dy; |
| 384 m_Bottom += dy; | 384 m_Bottom += dy; |
| 385 } | 385 } |
| 386 | 386 |
| 387 void CPDF_TextObject::RecalcPositionData() { | 387 void CPDF_TextObject::RecalcPositionData() { |
| 388 CalcPositionData(nullptr, nullptr, 1); | 388 CalcPositionData(nullptr, nullptr, 1); |
| 389 } | 389 } |
| OLD | NEW |