Suppress per-file warnings in fx_freetype.cpp. Bug: 42271175 Change-Id: I3822f9bc62254e4ef324a2398a78807391943470 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/120212 Reviewed-by: Thomas Sepez <tsepez@google.com> Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxge/freetype/fx_freetype.cpp b/core/fxge/freetype/fx_freetype.cpp index cb281a9..03b1c74 100644 --- a/core/fxge/freetype/fx_freetype.cpp +++ b/core/fxge/freetype/fx_freetype.cpp
@@ -4,15 +4,11 @@ // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com -#if defined(UNSAFE_BUFFERS_BUILD) -// TODO(crbug.com/pdfium/2154): resolve buffer safety issues. -#pragma allow_unsafe_buffers -#endif - #include "core/fxge/freetype/fx_freetype.h" #include <stdint.h> +#include "core/fxcrt/compiler_specific.h" #include "core/fxge/cfx_fontmgr.h" #include "core/fxge/cfx_gemodule.h" @@ -27,41 +23,47 @@ int name_offset, int table_offset, wchar_t unicode) { - // copy letters - while (true) { - glyph_name[name_offset] = ft_adobe_glyph_list[table_offset] & 0x7f; - name_offset++; - table_offset++; - if (!(ft_adobe_glyph_list[table_offset - 1] & 0x80)) - break; - } - glyph_name[name_offset] = 0; + UNSAFE_TODO({ + // copy letters + while (true) { + glyph_name[name_offset] = ft_adobe_glyph_list[table_offset] & 0x7f; + name_offset++; + table_offset++; + if (!(ft_adobe_glyph_list[table_offset - 1] & 0x80)) { + break; + } + } + glyph_name[name_offset] = 0; - // get child count - int count = ft_adobe_glyph_list[table_offset] & 0x7f; + // get child count + int count = ft_adobe_glyph_list[table_offset] & 0x7f; - // check if we have value for this node - if (ft_adobe_glyph_list[table_offset] & 0x80) { - unsigned short thiscode = ft_adobe_glyph_list[table_offset + 1] * 256 + - ft_adobe_glyph_list[table_offset + 2]; - if (thiscode == (unsigned short)unicode) // found it! - return 1; - table_offset += 3; - } else { - table_offset++; - } + // check if we have value for this node + if (ft_adobe_glyph_list[table_offset] & 0x80) { + unsigned short thiscode = ft_adobe_glyph_list[table_offset + 1] * 256 + + ft_adobe_glyph_list[table_offset + 2]; + if (thiscode == (unsigned short)unicode) { // found it! + return 1; + } + table_offset += 3; + } else { + table_offset++; + } - // now search in sub-nodes - if (count == 0) - return 0; + // now search in sub-nodes + if (count == 0) { + return 0; + } - for (int i = 0; i < count; i++) { - int child_offset = ft_adobe_glyph_list[table_offset + i * 2] * 256 + - ft_adobe_glyph_list[table_offset + i * 2 + 1]; - if (xyq_search_node(glyph_name, name_offset, child_offset, unicode)) - // found in child - return 1; - } + for (int i = 0; i < count; i++) { + int child_offset = ft_adobe_glyph_list[table_offset + i * 2] * 256 + + ft_adobe_glyph_list[table_offset + i * 2 + 1]; + if (xyq_search_node(glyph_name, name_offset, child_offset, unicode)) { + // found in child + return 1; + } + } + }); return 0; } @@ -84,119 +86,131 @@ ScopedFXFTMMVar::~ScopedFXFTMMVar() = default; FT_Pos ScopedFXFTMMVar::GetAxisDefault(size_t index) const { - return variation_desc_->axis[index].def; + return UNSAFE_TODO(variation_desc_->axis[index].def); } FT_Long ScopedFXFTMMVar::GetAxisMin(size_t index) const { - return variation_desc_->axis[index].minimum; + return UNSAFE_TODO(variation_desc_->axis[index].minimum); } FT_Long ScopedFXFTMMVar::GetAxisMax(size_t index) const { - return variation_desc_->axis[index].maximum; + return UNSAFE_TODO(variation_desc_->axis[index].maximum); } int FXFT_unicode_from_adobe_name(const char* glyph_name) { /* If the name begins with `uni', then the glyph name may be a */ /* hard-coded unicode character code. */ - if (glyph_name[0] == 'u' && glyph_name[1] == 'n' && glyph_name[2] == 'i') { - /* determine whether the next four characters following are */ - /* hexadecimal. */ + UNSAFE_TODO({ + if (glyph_name[0] == 'u' && glyph_name[1] == 'n' && glyph_name[2] == 'i') { + /* determine whether the next four characters following are */ + /* hexadecimal. */ - /* XXX: Add code to deal with ligatures, i.e. glyph names like */ - /* `uniXXXXYYYYZZZZ'... */ + /* XXX: Add code to deal with ligatures, i.e. glyph names like */ + /* `uniXXXXYYYYZZZZ'... */ - FT_Int count; - FT_UInt32 value = 0; - const char* p = glyph_name + 3; + FT_Int count; + FT_UInt32 value = 0; + const char* p = glyph_name + 3; - for (count = 4; count > 0; count--, p++) { - char c = *p; - unsigned int d = (unsigned char)c - '0'; - if (d >= 10) { - d = (unsigned char)c - 'A'; - if (d >= 6) - d = 16; - else - d += 10; + for (count = 4; count > 0; count--, p++) { + char c = *p; + unsigned int d = (unsigned char)c - '0'; + if (d >= 10) { + d = (unsigned char)c - 'A'; + if (d >= 6) { + d = 16; + } else { + d += 10; + } + } + + /* Exit if a non-uppercase hexadecimal character was found */ + /* -- this also catches character codes below `0' since such */ + /* negative numbers cast to `unsigned int' are far too big. */ + if (d >= 16) { + break; + } + + value = (value << 4) + d; } - /* Exit if a non-uppercase hexadecimal character was found */ - /* -- this also catches character codes below `0' since such */ - /* negative numbers cast to `unsigned int' are far too big. */ - if (d >= 16) - break; - - value = (value << 4) + d; - } - - /* there must be exactly four hex digits */ - if (count == 0) { - if (*p == '\0') - return value; - if (*p == '.') - return (FT_UInt32)(value | kVariantBit); - } - } - - /* If the name begins with `u', followed by four to six uppercase */ - /* hexadecimal digits, it is a hard-coded unicode character code. */ - if (glyph_name[0] == 'u') { - FT_Int count; - FT_UInt32 value = 0; - const char* p = glyph_name + 1; - - for (count = 6; count > 0; count--, p++) { - char c = *p; - unsigned int d = (unsigned char)c - '0'; - if (d >= 10) { - d = (unsigned char)c - 'A'; - if (d >= 6) - d = 16; - else - d += 10; - } - - if (d >= 16) - break; - - value = (value << 4) + d; - } - - if (count <= 2) { - if (*p == '\0') - return value; - if (*p == '.') - return (FT_UInt32)(value | kVariantBit); - } - } - - /* Look for a non-initial dot in the glyph name in order to */ - /* find variants like `A.swash', `e.final', etc. */ - { - const char* p = glyph_name; - const char* dot = nullptr; - - for (; *p; p++) { - if (*p == '.' && p > glyph_name) { - dot = p; - break; + /* there must be exactly four hex digits */ + if (count == 0) { + if (*p == '\0') { + return value; + } + if (*p == '.') { + return (FT_UInt32)(value | kVariantBit); + } } } - /* now look up the glyph in the Adobe Glyph List */ - if (!dot) - return (FT_UInt32)ft_get_adobe_glyph_index(glyph_name, p); + /* If the name begins with `u', followed by four to six uppercase */ + /* hexadecimal digits, it is a hard-coded unicode character code. */ + if (glyph_name[0] == 'u') { + FT_Int count; + FT_UInt32 value = 0; + const char* p = glyph_name + 1; - return (FT_UInt32)(ft_get_adobe_glyph_index(glyph_name, dot) | kVariantBit); - } + for (count = 6; count > 0; count--, p++) { + char c = *p; + unsigned int d = (unsigned char)c - '0'; + if (d >= 10) { + d = (unsigned char)c - 'A'; + if (d >= 6) { + d = 16; + } else { + d += 10; + } + } + + if (d >= 16) { + break; + } + + value = (value << 4) + d; + } + + if (count <= 2) { + if (*p == '\0') { + return value; + } + if (*p == '.') { + return (FT_UInt32)(value | kVariantBit); + } + } + } + + /* Look for a non-initial dot in the glyph name in order to */ + /* find variants like `A.swash', `e.final', etc. */ + { + const char* p = glyph_name; + const char* dot = nullptr; + + for (; *p; p++) { + if (*p == '.' && p > glyph_name) { + dot = p; + break; + } + } + + /* now look up the glyph in the Adobe Glyph List */ + if (!dot) { + return (FT_UInt32)ft_get_adobe_glyph_index(glyph_name, p); + } + + return (FT_UInt32)(ft_get_adobe_glyph_index(glyph_name, dot) | + kVariantBit); + } + }); } void FXFT_adobe_name_from_unicode(char* glyph_name, wchar_t unicode) { // start from top level node int count = ft_adobe_glyph_list[1]; for (int i = 0; i < count; i++) { - int child_offset = - ft_adobe_glyph_list[i * 2 + 2] * 256 + ft_adobe_glyph_list[i * 2 + 3]; + int child_offset = UNSAFE_TODO(ft_adobe_glyph_list[i * 2 + 2] * 256 + + ft_adobe_glyph_list[i * 2 + 3]); if (xyq_search_node(glyph_name, 0, child_offset, unicode)) return; }