OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 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 "../../../include/fpdfapi/fpdf_module.h" | 7 #include "../../../include/fpdfapi/fpdf_module.h" |
8 #include "../../../include/fpdfapi/fpdf_page.h" | 8 #include "../../../include/fpdfapi/fpdf_page.h" |
9 #include "../../../include/fpdfapi/fpdf_resource.h" | 9 #include "../../../include/fpdfapi/fpdf_resource.h" |
10 #include "../../../include/fxge/fx_freetype.h" | 10 #include "../../../include/fxge/fx_freetype.h" |
(...skipping 1289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1300 void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { | 1300 void CPDF_CIDFont::GetCharBBox(FX_DWORD charcode, FX_RECT& rect, int level) { |
1301 if (charcode < 256 && m_CharBBox[charcode].Right != -1) { | 1301 if (charcode < 256 && m_CharBBox[charcode].Right != -1) { |
1302 rect.bottom = m_CharBBox[charcode].Bottom; | 1302 rect.bottom = m_CharBBox[charcode].Bottom; |
1303 rect.left = m_CharBBox[charcode].Left; | 1303 rect.left = m_CharBBox[charcode].Left; |
1304 rect.right = m_CharBBox[charcode].Right; | 1304 rect.right = m_CharBBox[charcode].Right; |
1305 rect.top = m_CharBBox[charcode].Top; | 1305 rect.top = m_CharBBox[charcode].Top; |
1306 return; | 1306 return; |
1307 } | 1307 } |
1308 FX_BOOL bVert = FALSE; | 1308 FX_BOOL bVert = FALSE; |
1309 int glyph_index = GlyphFromCharCode(charcode, &bVert); | 1309 int glyph_index = GlyphFromCharCode(charcode, &bVert); |
1310 if (m_Font.m_Face == NULL) { | 1310 FXFT_Face face = m_Font.GetFace(); |
1311 rect = FX_RECT(0, 0, 0, 0); | 1311 if (face) { |
1312 } else { | |
1313 rect.left = rect.bottom = rect.right = rect.top = 0; | 1312 rect.left = rect.bottom = rect.right = rect.top = 0; |
1314 FXFT_Face face = m_Font.m_Face; | |
1315 if (FXFT_Is_Face_Tricky(face)) { | 1313 if (FXFT_Is_Face_Tricky(face)) { |
1316 int err = FXFT_Load_Glyph(face, glyph_index, | 1314 int err = FXFT_Load_Glyph(face, glyph_index, |
1317 FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); | 1315 FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); |
1318 if (!err) { | 1316 if (!err) { |
1319 FXFT_BBox cbox; | 1317 FXFT_BBox cbox; |
1320 FXFT_Glyph glyph; | 1318 FXFT_Glyph glyph; |
1321 err = FXFT_Get_Glyph(((FXFT_Face)face)->glyph, &glyph); | 1319 err = FXFT_Get_Glyph(((FXFT_Face)face)->glyph, &glyph); |
1322 if (!err) { | 1320 if (!err) { |
1323 FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox); | 1321 FXFT_Glyph_Get_CBox(glyph, FXFT_GLYPH_BBOX_PIXELS, &cbox); |
1324 int pixel_size_x = ((FXFT_Face)face)->size->metrics.x_ppem; | 1322 int pixel_size_x = ((FXFT_Face)face)->size->metrics.x_ppem; |
(...skipping 25 matching lines...) Expand all Loading... |
1350 rect.right = TT2PDF( | 1348 rect.right = TT2PDF( |
1351 FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), | 1349 FXFT_Get_Glyph_HoriBearingX(face) + FXFT_Get_Glyph_Width(face), |
1352 face); | 1350 face); |
1353 rect.top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face); | 1351 rect.top = TT2PDF(FXFT_Get_Glyph_HoriBearingY(face), face); |
1354 rect.top += rect.top / 64; | 1352 rect.top += rect.top / 64; |
1355 rect.bottom = TT2PDF( | 1353 rect.bottom = TT2PDF( |
1356 FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), | 1354 FXFT_Get_Glyph_HoriBearingY(face) - FXFT_Get_Glyph_Height(face), |
1357 face); | 1355 face); |
1358 } | 1356 } |
1359 } | 1357 } |
| 1358 } else { |
| 1359 rect = FX_RECT(0, 0, 0, 0); |
1360 } | 1360 } |
1361 if (m_pFontFile == NULL && m_Charset == CIDSET_JAPAN1) { | 1361 if (m_pFontFile == NULL && m_Charset == CIDSET_JAPAN1) { |
1362 FX_WORD CID = CIDFromCharCode(charcode); | 1362 FX_WORD CID = CIDFromCharCode(charcode); |
1363 const uint8_t* pTransform = GetCIDTransform(CID); | 1363 const uint8_t* pTransform = GetCIDTransform(CID); |
1364 if (pTransform && !bVert) { | 1364 if (pTransform && !bVert) { |
1365 CFX_AffineMatrix matrix(CIDTransformToFloat(pTransform[0]), | 1365 CFX_AffineMatrix matrix(CIDTransformToFloat(pTransform[0]), |
1366 CIDTransformToFloat(pTransform[1]), | 1366 CIDTransformToFloat(pTransform[1]), |
1367 CIDTransformToFloat(pTransform[2]), | 1367 CIDTransformToFloat(pTransform[2]), |
1368 CIDTransformToFloat(pTransform[3]), | 1368 CIDTransformToFloat(pTransform[3]), |
1369 CIDTransformToFloat(pTransform[4]) * 1000, | 1369 CIDTransformToFloat(pTransform[4]) * 1000, |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1426 break; | 1426 break; |
1427 } | 1427 } |
1428 } | 1428 } |
1429 vx = (short)dwWidth / 2; | 1429 vx = (short)dwWidth / 2; |
1430 vy = (short)m_DefaultVY; | 1430 vy = (short)m_DefaultVY; |
1431 } | 1431 } |
1432 int CPDF_CIDFont::GetGlyphIndex(FX_DWORD unicode, FX_BOOL* pVertGlyph) { | 1432 int CPDF_CIDFont::GetGlyphIndex(FX_DWORD unicode, FX_BOOL* pVertGlyph) { |
1433 if (pVertGlyph) { | 1433 if (pVertGlyph) { |
1434 *pVertGlyph = FALSE; | 1434 *pVertGlyph = FALSE; |
1435 } | 1435 } |
1436 int index = FXFT_Get_Char_Index(m_Font.m_Face, unicode); | 1436 FXFT_Face face = m_Font.GetFace(); |
| 1437 int index = FXFT_Get_Char_Index(face, unicode); |
1437 if (unicode == 0x2502) { | 1438 if (unicode == 0x2502) { |
1438 return index; | 1439 return index; |
1439 } | 1440 } |
1440 if (index && IsVertWriting()) { | 1441 if (index && IsVertWriting()) { |
1441 if (m_pTTGSUBTable) { | 1442 if (m_pTTGSUBTable) { |
1442 TT_uint32_t vindex = 0; | 1443 TT_uint32_t vindex = 0; |
1443 m_pTTGSUBTable->GetVerticalGlyph(index, &vindex); | 1444 m_pTTGSUBTable->GetVerticalGlyph(index, &vindex); |
1444 if (vindex) { | 1445 if (vindex) { |
1445 index = vindex; | 1446 index = vindex; |
1446 if (pVertGlyph) { | 1447 if (pVertGlyph) { |
1447 *pVertGlyph = TRUE; | 1448 *pVertGlyph = TRUE; |
1448 } | 1449 } |
1449 } | 1450 } |
1450 return index; | 1451 return index; |
1451 } | 1452 } |
1452 if (NULL == m_Font.m_pGsubData) { | 1453 if (!m_Font.GetSubData()) { |
1453 unsigned long length = 0; | 1454 unsigned long length = 0; |
1454 int error = FXFT_Load_Sfnt_Table( | 1455 int error = FXFT_Load_Sfnt_Table(face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, |
1455 m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, &length); | 1456 NULL, &length); |
1456 if (!error) { | 1457 if (!error) { |
1457 m_Font.m_pGsubData = FX_Alloc(uint8_t, length); | 1458 m_Font.SetSubData(FX_Alloc(uint8_t, length)); |
1458 } | 1459 } |
1459 } | 1460 } |
1460 int error = | 1461 int error = FXFT_Load_Sfnt_Table(face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, |
1461 FXFT_Load_Sfnt_Table(m_Font.m_Face, FT_MAKE_TAG('G', 'S', 'U', 'B'), 0, | 1462 m_Font.GetSubData(), NULL); |
1462 m_Font.m_pGsubData, NULL); | 1463 if (!error && m_Font.GetSubData()) { |
1463 if (!error && m_Font.m_pGsubData) { | |
1464 m_pTTGSUBTable = new CFX_CTTGSUBTable; | 1464 m_pTTGSUBTable = new CFX_CTTGSUBTable; |
1465 m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.m_pGsubData); | 1465 m_pTTGSUBTable->LoadGSUBTable((FT_Bytes)m_Font.GetSubData()); |
1466 TT_uint32_t vindex = 0; | 1466 TT_uint32_t vindex = 0; |
1467 m_pTTGSUBTable->GetVerticalGlyph(index, &vindex); | 1467 m_pTTGSUBTable->GetVerticalGlyph(index, &vindex); |
1468 if (vindex) { | 1468 if (vindex) { |
1469 index = vindex; | 1469 index = vindex; |
1470 if (pVertGlyph) { | 1470 if (pVertGlyph) { |
1471 *pVertGlyph = TRUE; | 1471 *pVertGlyph = TRUE; |
1472 } | 1472 } |
1473 } | 1473 } |
1474 } | 1474 } |
1475 return index; | 1475 return index; |
(...skipping 27 matching lines...) Expand all Loading... |
1503 if (cid && m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded()) { | 1503 if (cid && m_pCID2UnicodeMap && m_pCID2UnicodeMap->IsLoaded()) { |
1504 unicode = m_pCID2UnicodeMap->UnicodeFromCID(cid); | 1504 unicode = m_pCID2UnicodeMap->UnicodeFromCID(cid); |
1505 } | 1505 } |
1506 if (unicode == 0) { | 1506 if (unicode == 0) { |
1507 unicode = _UnicodeFromCharCode(charcode); | 1507 unicode = _UnicodeFromCharCode(charcode); |
1508 } | 1508 } |
1509 if (unicode == 0 && !(m_Flags & PDFFONT_SYMBOLIC)) { | 1509 if (unicode == 0 && !(m_Flags & PDFFONT_SYMBOLIC)) { |
1510 unicode = UnicodeFromCharCode(charcode).GetAt(0); | 1510 unicode = UnicodeFromCharCode(charcode).GetAt(0); |
1511 } | 1511 } |
1512 } | 1512 } |
| 1513 FXFT_Face face = m_Font.GetFace(); |
1513 if (unicode == 0) { | 1514 if (unicode == 0) { |
1514 if (!m_bAdobeCourierStd) { | 1515 if (!m_bAdobeCourierStd) { |
1515 return charcode == 0 ? -1 : (int)charcode; | 1516 return charcode == 0 ? -1 : (int)charcode; |
1516 } | 1517 } |
1517 charcode += 31; | 1518 charcode += 31; |
1518 int index = 0, iBaseEncoding; | 1519 int index = 0, iBaseEncoding; |
1519 FX_BOOL bMSUnicode = FT_UseTTCharmap(m_Font.m_Face, 3, 1); | 1520 FX_BOOL bMSUnicode = FT_UseTTCharmap(face, 3, 1); |
1520 FX_BOOL bMacRoman = FALSE; | 1521 FX_BOOL bMacRoman = FALSE; |
1521 if (!bMSUnicode) { | 1522 if (!bMSUnicode) { |
1522 bMacRoman = FT_UseTTCharmap(m_Font.m_Face, 1, 0); | 1523 bMacRoman = FT_UseTTCharmap(face, 1, 0); |
1523 } | 1524 } |
1524 iBaseEncoding = PDFFONT_ENCODING_STANDARD; | 1525 iBaseEncoding = PDFFONT_ENCODING_STANDARD; |
1525 if (bMSUnicode) { | 1526 if (bMSUnicode) { |
1526 iBaseEncoding = PDFFONT_ENCODING_WINANSI; | 1527 iBaseEncoding = PDFFONT_ENCODING_WINANSI; |
1527 } else if (bMacRoman) { | 1528 } else if (bMacRoman) { |
1528 iBaseEncoding = PDFFONT_ENCODING_MACROMAN; | 1529 iBaseEncoding = PDFFONT_ENCODING_MACROMAN; |
1529 } | 1530 } |
1530 const FX_CHAR* name = GetAdobeCharName(iBaseEncoding, NULL, charcode); | 1531 const FX_CHAR* name = GetAdobeCharName(iBaseEncoding, NULL, charcode); |
1531 if (name == NULL) { | 1532 if (name == NULL) { |
1532 return charcode == 0 ? -1 : (int)charcode; | 1533 return charcode == 0 ? -1 : (int)charcode; |
1533 } | 1534 } |
1534 FX_WORD unicode = PDF_UnicodeFromAdobeName(name); | 1535 FX_WORD unicode = PDF_UnicodeFromAdobeName(name); |
1535 if (unicode) { | 1536 if (unicode) { |
1536 if (bMSUnicode) { | 1537 if (bMSUnicode) { |
1537 index = FXFT_Get_Char_Index(m_Font.m_Face, unicode); | 1538 index = FXFT_Get_Char_Index(face, unicode); |
1538 } else if (bMacRoman) { | 1539 } else if (bMacRoman) { |
1539 FX_DWORD maccode = | 1540 FX_DWORD maccode = |
1540 FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, unicode); | 1541 FT_CharCodeFromUnicode(FXFT_ENCODING_APPLE_ROMAN, unicode); |
1541 index = !maccode ? FXFT_Get_Name_Index(m_Font.m_Face, (char*)name) | 1542 index = !maccode ? FXFT_Get_Name_Index(face, (char*)name) |
1542 : FXFT_Get_Char_Index(m_Font.m_Face, maccode); | 1543 : FXFT_Get_Char_Index(face, maccode); |
1543 } else { | 1544 } else { |
1544 return FXFT_Get_Char_Index(m_Font.m_Face, unicode); | 1545 return FXFT_Get_Char_Index(face, unicode); |
1545 } | 1546 } |
1546 } else { | 1547 } else { |
1547 return charcode == 0 ? -1 : (int)charcode; | 1548 return charcode == 0 ? -1 : (int)charcode; |
1548 } | 1549 } |
1549 if (index == 0 || index == 0xffff) { | 1550 if (index == 0 || index == 0xffff) { |
1550 return charcode == 0 ? -1 : (int)charcode; | 1551 return charcode == 0 ? -1 : (int)charcode; |
1551 } | 1552 } |
1552 return index; | 1553 return index; |
1553 } | 1554 } |
1554 if (m_Charset == CIDSET_JAPAN1) { | 1555 if (m_Charset == CIDSET_JAPAN1) { |
1555 if (unicode == '\\') { | 1556 if (unicode == '\\') { |
1556 unicode = '/'; | 1557 unicode = '/'; |
1557 } | 1558 } |
1558 #if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ | 1559 #if _FXM_PLATFORM_ != _FXM_PLATFORM_APPLE_ |
1559 else if (unicode == 0xa5) { | 1560 else if (unicode == 0xa5) { |
1560 unicode = 0x5c; | 1561 unicode = 0x5c; |
1561 } | 1562 } |
1562 #endif | 1563 #endif |
1563 } | 1564 } |
1564 if (m_Font.m_Face == NULL) { | 1565 if (!face) |
1565 return unicode; | 1566 return unicode; |
1566 } | 1567 |
1567 int err = FXFT_Select_Charmap(m_Font.m_Face, FXFT_ENCODING_UNICODE); | 1568 int err = FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE); |
1568 if (err != 0) { | 1569 if (err != 0) { |
1569 int i; | 1570 int i; |
1570 for (i = 0; i < FXFT_Get_Face_CharmapCount(m_Font.m_Face); i++) { | 1571 for (i = 0; i < FXFT_Get_Face_CharmapCount(face); i++) { |
1571 FX_DWORD ret = FT_CharCodeFromUnicode( | 1572 FX_DWORD ret = FT_CharCodeFromUnicode( |
1572 FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]), | 1573 FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmaps(face)[i]), |
1573 (FX_WCHAR)charcode); | 1574 (FX_WCHAR)charcode); |
1574 if (ret == 0) { | 1575 if (ret == 0) { |
1575 continue; | 1576 continue; |
1576 } | 1577 } |
1577 FXFT_Set_Charmap(m_Font.m_Face, | 1578 FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[i]); |
1578 FXFT_Get_Face_Charmaps(m_Font.m_Face)[i]); | |
1579 unicode = (FX_WCHAR)ret; | 1579 unicode = (FX_WCHAR)ret; |
1580 break; | 1580 break; |
1581 } | 1581 } |
1582 if (i == FXFT_Get_Face_CharmapCount(m_Font.m_Face) && i) { | 1582 if (i == FXFT_Get_Face_CharmapCount(face) && i) { |
1583 FXFT_Set_Charmap(m_Font.m_Face, | 1583 FXFT_Set_Charmap(face, FXFT_Get_Face_Charmaps(face)[0]); |
1584 FXFT_Get_Face_Charmaps(m_Font.m_Face)[0]); | |
1585 unicode = (FX_WCHAR)charcode; | 1584 unicode = (FX_WCHAR)charcode; |
1586 } | 1585 } |
1587 } | 1586 } |
1588 if (FXFT_Get_Face_Charmap(m_Font.m_Face)) { | 1587 if (FXFT_Get_Face_Charmap(face)) { |
1589 int index = GetGlyphIndex(unicode, pVertGlyph); | 1588 int index = GetGlyphIndex(unicode, pVertGlyph); |
1590 if (index == 0) { | 1589 if (index == 0) |
1591 return -1; | 1590 return -1; |
1592 } | |
1593 return index; | 1591 return index; |
1594 } | 1592 } |
1595 return unicode; | 1593 return unicode; |
1596 } | 1594 } |
1597 if (m_Font.m_Face == NULL) { | 1595 if (!m_Font.GetFace()) |
1598 return -1; | 1596 return -1; |
1599 } | 1597 |
1600 FX_WORD cid = CIDFromCharCode(charcode); | 1598 FX_WORD cid = CIDFromCharCode(charcode); |
1601 if (m_bType1) { | 1599 if (m_bType1) { |
1602 if (NULL == m_pCIDToGIDMap) { | 1600 if (!m_pCIDToGIDMap) { |
1603 return cid; | 1601 return cid; |
1604 } | 1602 } |
1605 } else { | 1603 } else { |
1606 if (m_pCIDToGIDMap == NULL) { | 1604 if (!m_pCIDToGIDMap) { |
1607 if (m_pFontFile && m_pCMap->m_pMapping == NULL) { | 1605 if (m_pFontFile && !m_pCMap->m_pMapping) |
| 1606 return cid; |
| 1607 if (m_pCMap->m_Coding == CIDCODING_UNKNOWN || |
| 1608 !FXFT_Get_Face_Charmap(m_Font.GetFace())) { |
1608 return cid; | 1609 return cid; |
1609 } | 1610 } |
1610 if (m_pCMap->m_Coding == CIDCODING_UNKNOWN || | 1611 if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.GetFace())) == |
1611 FXFT_Get_Face_Charmap(m_Font.m_Face) == NULL) { | |
1612 return cid; | |
1613 } | |
1614 if (FXFT_Get_Charmap_Encoding(FXFT_Get_Face_Charmap(m_Font.m_Face)) == | |
1615 FXFT_ENCODING_UNICODE) { | 1612 FXFT_ENCODING_UNICODE) { |
1616 CFX_WideString unicode_str = UnicodeFromCharCode(charcode); | 1613 CFX_WideString unicode_str = UnicodeFromCharCode(charcode); |
1617 if (unicode_str.IsEmpty()) { | 1614 if (unicode_str.IsEmpty()) { |
1618 return -1; | 1615 return -1; |
1619 } | 1616 } |
1620 charcode = unicode_str.GetAt(0); | 1617 charcode = unicode_str.GetAt(0); |
1621 } | 1618 } |
1622 return GetGlyphIndex(charcode, pVertGlyph); | 1619 return GetGlyphIndex(charcode, pVertGlyph); |
1623 } | 1620 } |
1624 } | 1621 } |
1625 FX_DWORD byte_pos = cid * 2; | 1622 FX_DWORD byte_pos = cid * 2; |
1626 if (byte_pos + 2 > m_pCIDToGIDMap->GetSize()) { | 1623 if (byte_pos + 2 > m_pCIDToGIDMap->GetSize()) |
1627 return -1; | 1624 return -1; |
1628 } | 1625 |
1629 const uint8_t* pdata = m_pCIDToGIDMap->GetData() + byte_pos; | 1626 const uint8_t* pdata = m_pCIDToGIDMap->GetData() + byte_pos; |
1630 return pdata[0] * 256 + pdata[1]; | 1627 return pdata[0] * 256 + pdata[1]; |
1631 } | 1628 } |
1632 FX_DWORD CPDF_CIDFont::GetNextChar(const FX_CHAR* pString, | 1629 FX_DWORD CPDF_CIDFont::GetNextChar(const FX_CHAR* pString, |
1633 int nStrLen, | 1630 int nStrLen, |
1634 int& offset) const { | 1631 int& offset) const { |
1635 return m_pCMap->GetNextChar(pString, nStrLen, offset); | 1632 return m_pCMap->GetNextChar(pString, nStrLen, offset); |
1636 } | 1633 } |
1637 int CPDF_CIDFont::GetCharSize(FX_DWORD charcode) const { | 1634 int CPDF_CIDFont::GetCharSize(FX_DWORD charcode) const { |
1638 return m_pCMap->GetCharSize(charcode); | 1635 return m_pCMap->GetCharSize(charcode); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1744 | 1741 |
1745 const uint8_t* CPDF_CIDFont::GetCIDTransform(FX_WORD CID) const { | 1742 const uint8_t* CPDF_CIDFont::GetCIDTransform(FX_WORD CID) const { |
1746 if (m_Charset != CIDSET_JAPAN1 || m_pFontFile) | 1743 if (m_Charset != CIDSET_JAPAN1 || m_pFontFile) |
1747 return nullptr; | 1744 return nullptr; |
1748 | 1745 |
1749 const struct CIDTransform* found = (const struct CIDTransform*)FXSYS_bsearch( | 1746 const struct CIDTransform* found = (const struct CIDTransform*)FXSYS_bsearch( |
1750 &CID, g_Japan1_VertCIDs, FX_ArraySize(g_Japan1_VertCIDs), | 1747 &CID, g_Japan1_VertCIDs, FX_ArraySize(g_Japan1_VertCIDs), |
1751 sizeof(g_Japan1_VertCIDs[0]), CompareCIDTransform); | 1748 sizeof(g_Japan1_VertCIDs[0]), CompareCIDTransform); |
1752 return found ? &found->a : nullptr; | 1749 return found ? &found->a : nullptr; |
1753 } | 1750 } |
OLD | NEW |