summaryrefslogtreecommitdiff
path: root/Build/source/libs/freetype2/freetype-src/src/sfnt/ttsvg.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/freetype2/freetype-src/src/sfnt/ttsvg.c')
-rw-r--r--Build/source/libs/freetype2/freetype-src/src/sfnt/ttsvg.c403
1 files changed, 0 insertions, 403 deletions
diff --git a/Build/source/libs/freetype2/freetype-src/src/sfnt/ttsvg.c b/Build/source/libs/freetype2/freetype-src/src/sfnt/ttsvg.c
deleted file mode 100644
index 69277da5777..00000000000
--- a/Build/source/libs/freetype2/freetype-src/src/sfnt/ttsvg.c
+++ /dev/null
@@ -1,403 +0,0 @@
-/****************************************************************************
- *
- * ttsvg.c
- *
- * OpenType SVG Color (specification).
- *
- * Copyright (C) 2022 by
- * David Turner, Robert Wilhelm, Werner Lemberg, and Moazin Khatti.
- *
- * This file is part of the FreeType project, and may only be used,
- * modified, and distributed under the terms of the FreeType project
- * license, LICENSE.TXT. By continuing to use, modify, or distribute
- * this file you indicate that you have read the license and
- * understand and accept it fully.
- *
- */
-
-
- /**************************************************************************
- *
- * 'SVG' table specification:
- *
- * https://docs.microsoft.com/en-us/typography/opentype/spec/svg
- *
- */
-
-#include <ft2build.h>
-#include <freetype/internal/ftstream.h>
-#include <freetype/internal/ftobjs.h>
-#include <freetype/internal/ftdebug.h>
-#include <freetype/tttags.h>
-#include <freetype/ftgzip.h>
-#include <freetype/otsvg.h>
-
-
-#ifdef FT_CONFIG_OPTION_SVG
-
-#include "ttsvg.h"
-
-
- /* NOTE: These table sizes are given by the specification. */
-#define SVG_TABLE_HEADER_SIZE (10U)
-#define SVG_DOCUMENT_RECORD_SIZE (12U)
-#define SVG_DOCUMENT_LIST_MINIMUM_SIZE (2U + SVG_DOCUMENT_RECORD_SIZE)
-#define SVG_MINIMUM_SIZE (SVG_TABLE_HEADER_SIZE + \
- SVG_DOCUMENT_LIST_MINIMUM_SIZE)
-
-
- typedef struct Svg_
- {
- FT_UShort version; /* table version (starting at 0) */
- FT_UShort num_entries; /* number of SVG document records */
-
- FT_Byte* svg_doc_list; /* pointer to the start of SVG Document List */
-
- void* table; /* memory that backs up SVG */
- FT_ULong table_size;
-
- } Svg;
-
-
- /**************************************************************************
- *
- * The macro FT_COMPONENT is used in trace mode. It is an implicit
- * parameter of the FT_TRACE() and FT_ERROR() macros, usued to print/log
- * messages during execution.
- */
-#undef FT_COMPONENT
-#define FT_COMPONENT ttsvg
-
-
- FT_LOCAL_DEF( FT_Error )
- tt_face_load_svg( TT_Face face,
- FT_Stream stream )
- {
- FT_Error error;
- FT_Memory memory = face->root.memory;
-
- FT_ULong table_size;
- FT_Byte* table = NULL;
- FT_Byte* p = NULL;
- Svg* svg = NULL;
- FT_ULong offsetToSVGDocumentList;
-
-
- error = face->goto_table( face, TTAG_SVG, stream, &table_size );
- if ( error )
- goto NoSVG;
-
- if ( table_size < SVG_MINIMUM_SIZE )
- goto InvalidTable;
-
- if ( FT_FRAME_EXTRACT( table_size, table ) )
- goto NoSVG;
-
- /* Allocate memory for the SVG object */
- if ( FT_NEW( svg ) )
- goto NoSVG;
-
- p = table;
- svg->version = FT_NEXT_USHORT( p );
- offsetToSVGDocumentList = FT_NEXT_ULONG( p );
-
- if ( offsetToSVGDocumentList < SVG_TABLE_HEADER_SIZE ||
- offsetToSVGDocumentList > table_size -
- SVG_DOCUMENT_LIST_MINIMUM_SIZE )
- goto InvalidTable;
-
- svg->svg_doc_list = (FT_Byte*)( table + offsetToSVGDocumentList );
-
- p = svg->svg_doc_list;
- svg->num_entries = FT_NEXT_USHORT( p );
-
- FT_TRACE3(( "version: %d\n", svg->version ));
- FT_TRACE3(( "number of entries: %d\n", svg->num_entries ));
-
- if ( offsetToSVGDocumentList +
- svg->num_entries * SVG_DOCUMENT_RECORD_SIZE > table_size )
- goto InvalidTable;
-
- svg->table = table;
- svg->table_size = table_size;
-
- face->svg = svg;
- face->root.face_flags |= FT_FACE_FLAG_SVG;
-
- return FT_Err_Ok;
-
- InvalidTable:
- error = FT_THROW( Invalid_Table );
-
- NoSVG:
- FT_FRAME_RELEASE( table );
- FT_FREE( svg );
- face->svg = NULL;
-
- return error;
- }
-
-
- FT_LOCAL_DEF( void )
- tt_face_free_svg( TT_Face face )
- {
- FT_Memory memory = face->root.memory;
- FT_Stream stream = face->root.stream;
-
- Svg* svg = (Svg*)face->svg;
-
-
- if ( svg )
- {
- FT_FRAME_RELEASE( svg->table );
- FT_FREE( svg );
- }
- }
-
-
- typedef struct Svg_doc_
- {
- FT_UShort start_glyph_id;
- FT_UShort end_glyph_id;
-
- FT_ULong offset;
- FT_ULong length;
-
- } Svg_doc;
-
-
- static Svg_doc
- extract_svg_doc( FT_Byte* stream )
- {
- Svg_doc doc;
-
-
- doc.start_glyph_id = FT_NEXT_USHORT( stream );
- doc.end_glyph_id = FT_NEXT_USHORT( stream );
-
- doc.offset = FT_NEXT_ULONG( stream );
- doc.length = FT_NEXT_ULONG( stream );
-
- return doc;
- }
-
-
- static FT_Int
- compare_svg_doc( Svg_doc doc,
- FT_UInt glyph_index )
- {
- if ( glyph_index < doc.start_glyph_id )
- return -1;
- else if ( glyph_index > doc.end_glyph_id )
- return 1;
- else
- return 0;
- }
-
-
- static FT_Error
- find_doc( FT_Byte* stream,
- FT_UShort num_entries,
- FT_UInt glyph_index,
- FT_ULong *doc_offset,
- FT_ULong *doc_length,
- FT_UShort *start_glyph,
- FT_UShort *end_glyph )
- {
- FT_Error error;
-
- Svg_doc start_doc;
- Svg_doc mid_doc;
- Svg_doc end_doc;
-
- FT_Bool found = FALSE;
- FT_UInt i = 0;
-
- FT_UInt start_index = 0;
- FT_UInt end_index = num_entries - 1;
- FT_Int comp_res;
-
-
- /* search algorithm */
- if ( num_entries == 0 )
- {
- error = FT_THROW( Invalid_Table );
- return error;
- }
-
- start_doc = extract_svg_doc( stream + start_index * 12 );
- end_doc = extract_svg_doc( stream + end_index * 12 );
-
- if ( ( compare_svg_doc( start_doc, glyph_index ) == -1 ) ||
- ( compare_svg_doc( end_doc, glyph_index ) == 1 ) )
- {
- error = FT_THROW( Invalid_Glyph_Index );
- return error;
- }
-
- while ( start_index <= end_index )
- {
- i = ( start_index + end_index ) / 2;
- mid_doc = extract_svg_doc( stream + i * 12 );
- comp_res = compare_svg_doc( mid_doc, glyph_index );
-
- if ( comp_res == 1 )
- {
- start_index = i + 1;
- start_doc = extract_svg_doc( stream + start_index * 4 );
- }
- else if ( comp_res == -1 )
- {
- end_index = i - 1;
- end_doc = extract_svg_doc( stream + end_index * 4 );
- }
- else
- {
- found = TRUE;
- break;
- }
- }
- /* search algorithm end */
-
- if ( found != TRUE )
- {
- FT_TRACE5(( "SVG glyph not found\n" ));
- error = FT_THROW( Invalid_Glyph_Index );
- }
- else
- {
- *doc_offset = mid_doc.offset;
- *doc_length = mid_doc.length;
-
- *start_glyph = mid_doc.start_glyph_id;
- *end_glyph = mid_doc.end_glyph_id;
-
- error = FT_Err_Ok;
- }
-
- return error;
- }
-
-
- FT_LOCAL_DEF( FT_Error )
- tt_face_load_svg_doc( FT_GlyphSlot glyph,
- FT_UInt glyph_index )
- {
- FT_Byte* doc_list; /* pointer to the SVG doc list */
- FT_UShort num_entries; /* total number of entries in doc list */
- FT_ULong doc_offset;
- FT_ULong doc_length;
-
- FT_UShort start_glyph_id;
- FT_UShort end_glyph_id;
-
- FT_Error error = FT_Err_Ok;
- TT_Face face = (TT_Face)glyph->face;
- FT_Memory memory = face->root.memory;
- Svg* svg = (Svg*)face->svg;
-
- FT_SVG_Document svg_document = (FT_SVG_Document)glyph->other;
-
-
- FT_ASSERT( !( svg == NULL ) );
-
- doc_list = svg->svg_doc_list;
- num_entries = FT_NEXT_USHORT( doc_list );
-
- error = find_doc( doc_list, num_entries, glyph_index,
- &doc_offset, &doc_length,
- &start_glyph_id, &end_glyph_id );
- if ( error != FT_Err_Ok )
- goto Exit;
-
- doc_list = svg->svg_doc_list; /* reset, so we can use it again */
- doc_list = (FT_Byte*)( doc_list + doc_offset );
-
- if ( ( doc_list[0] == 0x1F ) && ( doc_list[1] == 0x8B )
- && ( doc_list[2] == 0x08 ) )
- {
-#ifdef FT_CONFIG_OPTION_USE_ZLIB
-
- FT_ULong uncomp_size;
- FT_Byte* uncomp_buffer = NULL;
-
-
- /*
- * Get the size of the original document. This helps in allotting the
- * buffer to accommodate the uncompressed version. The last 4 bytes
- * of the compressed document are equal to the original size modulo
- * 2^32. Since the size of SVG documents is less than 2^32 bytes we
- * can use this accurately. The four bytes are stored in
- * little-endian format.
- */
- FT_TRACE4(( "SVG document is GZIP compressed\n" ));
- uncomp_size = (FT_ULong)doc_list[doc_length - 1] << 24 |
- (FT_ULong)doc_list[doc_length - 2] << 16 |
- (FT_ULong)doc_list[doc_length - 3] << 8 |
- (FT_ULong)doc_list[doc_length - 4];
-
- if ( FT_QALLOC( uncomp_buffer, uncomp_size ) )
- goto Exit;
-
- error = FT_Gzip_Uncompress( memory,
- uncomp_buffer,
- &uncomp_size,
- doc_list,
- doc_length );
- if ( error )
- {
- FT_FREE( uncomp_buffer );
- error = FT_THROW( Invalid_Table );
- goto Exit;
- }
-
- glyph->internal->flags |= FT_GLYPH_OWN_GZIP_SVG;
-
- doc_list = uncomp_buffer;
- doc_length = uncomp_size;
-
-#else /* !FT_CONFIG_OPTION_USE_ZLIB */
-
- error = FT_THROW( Unimplemented_Feature );
- goto Exit;
-
-#endif /* !FT_CONFIG_OPTION_USE_ZLIB */
- }
-
- svg_document->svg_document = doc_list;
- svg_document->svg_document_length = doc_length;
-
- svg_document->metrics = glyph->face->size->metrics;
- svg_document->units_per_EM = glyph->face->units_per_EM;
-
- svg_document->start_glyph_id = start_glyph_id;
- svg_document->end_glyph_id = end_glyph_id;
-
- svg_document->transform.xx = 0x10000;
- svg_document->transform.xy = 0;
- svg_document->transform.yx = 0;
- svg_document->transform.yy = 0x10000;
-
- svg_document->delta.x = 0;
- svg_document->delta.y = 0;
-
- FT_TRACE5(( "start_glyph_id: %d\n", start_glyph_id ));
- FT_TRACE5(( "end_glyph_id: %d\n", end_glyph_id ));
- FT_TRACE5(( "svg_document:\n" ));
- FT_TRACE5(( " %.*s\n", (FT_UInt)doc_length, doc_list ));
-
- glyph->other = svg_document;
-
- Exit:
- return error;
- }
-
-#else /* !FT_CONFIG_OPTION_SVG */
-
- /* ANSI C doesn't like empty source files */
- typedef int _tt_svg_dummy;
-
-#endif /* !FT_CONFIG_OPTION_SVG */
-
-
-/* END */