| 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/fxge/fx_ge.h" | 7 #include "../../../include/fxge/fx_ge.h" |
| 8 #include "../../../include/fxge/fx_freetype.h" | 8 #include "../../../include/fxge/fx_freetype.h" |
| 9 #include "../../../include/fxcodec/fx_codec.h" | 9 #include "../../../include/fxcodec/fx_codec.h" |
| 10 #include "text_int.h" | 10 #include "text_int.h" |
| (...skipping 1625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1636 } | 1636 } |
| 1637 } else { | 1637 } else { |
| 1638 _ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, | 1638 _ContrastAdjust(pSrcBuf, pDestBuf, bmwidth, bmheight, src_pitch, |
| 1639 dest_pitch); | 1639 dest_pitch); |
| 1640 _GammaAdjust(pDestBuf, bmwidth, bmheight, dest_pitch, | 1640 _GammaAdjust(pDestBuf, bmwidth, bmheight, dest_pitch, |
| 1641 CFX_GEModule::Get()->GetTextGammaTable()); | 1641 CFX_GEModule::Get()->GetTextGammaTable()); |
| 1642 } | 1642 } |
| 1643 } | 1643 } |
| 1644 return pGlyphBitmap; | 1644 return pGlyphBitmap; |
| 1645 } | 1645 } |
| 1646 FX_BOOL _OutputGlyph(void* dib, | |
| 1647 int x, | |
| 1648 int y, | |
| 1649 CFX_Font* pFont, | |
| 1650 int glyph_index, | |
| 1651 FX_ARGB argb) { | |
| 1652 CFX_DIBitmap* pDib = (CFX_DIBitmap*)dib; | |
| 1653 FXFT_Face face = pFont->GetFace(); | |
| 1654 int error = FXFT_Load_Glyph(face, glyph_index, FXFT_LOAD_NO_BITMAP); | |
| 1655 if (error) { | |
| 1656 return FALSE; | |
| 1657 } | |
| 1658 error = FXFT_Render_Glyph(face, FXFT_RENDER_MODE_NORMAL); | |
| 1659 if (error) { | |
| 1660 return FALSE; | |
| 1661 } | |
| 1662 int bmwidth = FXFT_Get_Bitmap_Width(FXFT_Get_Glyph_Bitmap(face)); | |
| 1663 int bmheight = FXFT_Get_Bitmap_Rows(FXFT_Get_Glyph_Bitmap(face)); | |
| 1664 int left = FXFT_Get_Glyph_BitmapLeft(face); | |
| 1665 int top = FXFT_Get_Glyph_BitmapTop(face); | |
| 1666 const uint8_t* src_buf = | |
| 1667 (const uint8_t*)FXFT_Get_Bitmap_Buffer(FXFT_Get_Glyph_Bitmap(face)); | |
| 1668 int src_pitch = FXFT_Get_Bitmap_Pitch(FXFT_Get_Glyph_Bitmap(face)); | |
| 1669 CFX_DIBitmap mask; | |
| 1670 mask.Create(bmwidth, bmheight, FXDIB_8bppMask); | |
| 1671 uint8_t* dest_buf = mask.GetBuffer(); | |
| 1672 int dest_pitch = mask.GetPitch(); | |
| 1673 for (int row = 0; row < bmheight; row++) { | |
| 1674 const uint8_t* src_scan = src_buf + row * src_pitch; | |
| 1675 uint8_t* dest_scan = dest_buf + row * dest_pitch; | |
| 1676 FXSYS_memcpy(dest_scan, src_scan, dest_pitch); | |
| 1677 } | |
| 1678 pDib->CompositeMask(x + left, y - top, bmwidth, bmheight, &mask, argb, 0, 0); | |
| 1679 return TRUE; | |
| 1680 } | |
| 1681 FX_BOOL OutputText(void* dib, | |
| 1682 int x, | |
| 1683 int y, | |
| 1684 CFX_Font* pFont, | |
| 1685 double font_size, | |
| 1686 CFX_AffineMatrix* pText_matrix, | |
| 1687 unsigned short const* text, | |
| 1688 unsigned long argb) { | |
| 1689 if (!pFont) { | |
| 1690 return FALSE; | |
| 1691 } | |
| 1692 FXFT_Face face = pFont->GetFace(); | |
| 1693 FXFT_Select_Charmap(pFont->m_Face, FXFT_ENCODING_UNICODE); | |
| 1694 if (pText_matrix) { | |
| 1695 FXFT_Matrix ft_matrix; | |
| 1696 ft_matrix.xx = (signed long)(pText_matrix->a / 64 * 65536); | |
| 1697 ft_matrix.xy = (signed long)(pText_matrix->c / 64 * 65536); | |
| 1698 ft_matrix.yx = (signed long)(pText_matrix->b / 64 * 65536); | |
| 1699 ft_matrix.yy = (signed long)(pText_matrix->d / 64 * 65536); | |
| 1700 FXFT_Set_Transform(face, &ft_matrix, 0); | |
| 1701 } | |
| 1702 FX_FLOAT x_pos = 0; | |
| 1703 for (; *text != 0; text++) { | |
| 1704 FX_WCHAR unicode = *text; | |
| 1705 int glyph_index = FXFT_Get_Char_Index(pFont->m_Face, unicode); | |
| 1706 if (glyph_index <= 0) { | |
| 1707 continue; | |
| 1708 } | |
| 1709 int err = FXFT_Load_Glyph( | |
| 1710 pFont->m_Face, glyph_index, | |
| 1711 FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); | |
| 1712 if (err) { | |
| 1713 continue; | |
| 1714 } | |
| 1715 int w = FXFT_Get_Glyph_HoriAdvance(pFont->m_Face); | |
| 1716 int em = FXFT_Get_Face_UnitsPerEM(pFont->m_Face); | |
| 1717 FX_FLOAT x1, y1; | |
| 1718 pText_matrix->Transform(x_pos, 0, x1, y1); | |
| 1719 _OutputGlyph(dib, (int)x1 + x, (int)-y1 + y, pFont, glyph_index, argb); | |
| 1720 x_pos += (FX_FLOAT)w / em; | |
| 1721 } | |
| 1722 if (pText_matrix) | |
| 1723 ResetTransform(face); | |
| 1724 return TRUE; | |
| 1725 } | |
| 1726 FX_BOOL OutputGlyph(void* dib, | |
| 1727 int x, | |
| 1728 int y, | |
| 1729 CFX_Font* pFont, | |
| 1730 double font_size, | |
| 1731 CFX_AffineMatrix* pMatrix, | |
| 1732 unsigned long glyph_index, | |
| 1733 unsigned long argb) { | |
| 1734 FXFT_Matrix ft_matrix; | |
| 1735 if (pMatrix) { | |
| 1736 ft_matrix.xx = (signed long)(pMatrix->a * font_size / 64 * 65536); | |
| 1737 ft_matrix.xy = (signed long)(pMatrix->c * font_size / 64 * 65536); | |
| 1738 ft_matrix.yx = (signed long)(pMatrix->b * font_size / 64 * 65536); | |
| 1739 ft_matrix.yy = (signed long)(pMatrix->d * font_size / 64 * 65536); | |
| 1740 } else { | |
| 1741 ft_matrix.xx = (signed long)(font_size / 64 * 65536); | |
| 1742 ft_matrix.xy = ft_matrix.yx = 0; | |
| 1743 ft_matrix.yy = (signed long)(font_size / 64 * 65536); | |
| 1744 } | |
| 1745 ScopedFontTransform scoped_transform(pFont->m_Face, &ft_matrix); | |
| 1746 FX_BOOL ret = _OutputGlyph(dib, x, y, pFont, glyph_index, argb); | |
| 1747 return ret; | |
| 1748 } | |
| 1749 const CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, | 1646 const CFX_PathData* CFX_FaceCache::LoadGlyphPath(CFX_Font* pFont, |
| 1750 FX_DWORD glyph_index, | 1647 FX_DWORD glyph_index, |
| 1751 int dest_width) { | 1648 int dest_width) { |
| 1752 if (m_Face == NULL || glyph_index == (FX_DWORD)-1) { | 1649 if (m_Face == NULL || glyph_index == (FX_DWORD)-1) { |
| 1753 return NULL; | 1650 return NULL; |
| 1754 } | 1651 } |
| 1755 CFX_PathData* pGlyphPath = NULL; | 1652 CFX_PathData* pGlyphPath = NULL; |
| 1756 void* key; | 1653 void* key; |
| 1757 if (pFont->GetSubstFont()) | 1654 if (pFont->GetSubstFont()) |
| 1758 key = (void*)(uintptr_t)( | 1655 key = (void*)(uintptr_t)( |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1969 void _CFX_UniqueKeyGen::Generate(int count, ...) { | 1866 void _CFX_UniqueKeyGen::Generate(int count, ...) { |
| 1970 va_list argList; | 1867 va_list argList; |
| 1971 va_start(argList, count); | 1868 va_start(argList, count); |
| 1972 for (int i = 0; i < count; i++) { | 1869 for (int i = 0; i < count; i++) { |
| 1973 int p = va_arg(argList, int); | 1870 int p = va_arg(argList, int); |
| 1974 ((FX_DWORD*)m_Key)[i] = p; | 1871 ((FX_DWORD*)m_Key)[i] = p; |
| 1975 } | 1872 } |
| 1976 va_end(argList); | 1873 va_end(argList); |
| 1977 m_KeyLen = count * sizeof(FX_DWORD); | 1874 m_KeyLen = count * sizeof(FX_DWORD); |
| 1978 } | 1875 } |
| OLD | NEW |